aboutsummaryrefslogtreecommitdiff
path: root/internal/kahless
diff options
context:
space:
mode:
authorChristine Dodrill <me@christine.website>2019-04-05 02:53:44 +0000
committerChristine Dodrill <me@christine.website>2019-04-05 02:53:44 +0000
commitcedc40aee04bb8c4323096c44ff3c7b3157f9990 (patch)
tree2f7777a791608ed03f2f945e7c44ffb21bcc4745 /internal/kahless
parentb08b31ee28f017b01718808340d9217f6c11914b (diff)
downloadx-cedc40aee04bb8c4323096c44ff3c7b3157f9990.tar.xz
x-cedc40aee04bb8c4323096c44ff3c7b3157f9990.zip
greedo -> kahless
Diffstat (limited to 'internal/kahless')
-rw-r--r--internal/kahless/doc.go2
-rw-r--r--internal/kahless/kahless.go85
-rw-r--r--internal/kahless/kahless_test.go11
3 files changed, 98 insertions, 0 deletions
diff --git a/internal/kahless/doc.go b/internal/kahless/doc.go
new file mode 100644
index 0000000..1fa1134
--- /dev/null
+++ b/internal/kahless/doc.go
@@ -0,0 +1,2 @@
+// Package kahless is a set of functions to copy files to https://xena.greedo.xeserv.us/files.
+package kahless
diff --git a/internal/kahless/kahless.go b/internal/kahless/kahless.go
new file mode 100644
index 0000000..7fc8b0c
--- /dev/null
+++ b/internal/kahless/kahless.go
@@ -0,0 +1,85 @@
+package kahless
+
+import (
+ "bytes"
+ "io"
+ "io/ioutil"
+ "net"
+ "os"
+ "path/filepath"
+
+ "github.com/tmc/scp"
+ "golang.org/x/crypto/ssh"
+ "golang.org/x/crypto/ssh/agent"
+)
+
+func getAgent() (agent.Agent, error) {
+ agentConn, err := net.Dial("unix", os.Getenv("SSH_AUTH_SOCK"))
+ return agent.NewClient(agentConn), err
+}
+
+const (
+ greedoAddr = `kahless.wg.akua:22`
+ greedoUser = `xena`
+)
+
+// Dial opens a SSH client to greedo.
+func Dial() (*ssh.Client, error) {
+ agent, err := getAgent()
+ if err != nil {
+ return nil, err
+ }
+
+ client, err := ssh.Dial("tcp", greedoAddr, &ssh.ClientConfig{
+ User: greedoUser,
+ Auth: []ssh.AuthMethod{
+ ssh.PublicKeysCallback(agent.Signers),
+ },
+ HostKeyCallback: ssh.InsecureIgnoreHostKey(),
+ })
+ if err != nil {
+ return nil, err
+ }
+
+ return client, nil
+}
+
+// Copy copies a local file reader to the remote destination path. This copies the enitre contents of contents into ram. Don't use this function if doing so is a bad idea. Only works on files less than 2 GB.
+func Copy(mode os.FileMode, fileName string, contents io.Reader, destinationPath string) error {
+ data, err := ioutil.ReadAll(contents)
+ if err != nil {
+ return err
+ }
+
+ client, err := Dial()
+ if err != nil {
+ return err
+ }
+
+ session, err := client.NewSession()
+ if err != nil {
+ return err
+ }
+
+ err = scp.Copy(int64(len(data)), mode, fileName, bytes.NewBuffer(data), destinationPath, session)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
+// CopyFile copies a file to Greedo's public files folder and returns its public-facing URL.
+func CopyFile(fileName string, contents io.Reader) (string, error) {
+ err := Copy(0644, fileName, contents, filepath.Join("public_html", "files", "slugs", fileName))
+ if err != nil {
+ return "", err
+ }
+
+ return WebURL(fileName), nil
+}
+
+// WebURL constructs a public-facing URL for a given resource by fragment.
+func WebURL(fragment string) string {
+ return "https://xena.greedo.xeserv.us/files/slugs/" + fragment
+}
diff --git a/internal/kahless/kahless_test.go b/internal/kahless/kahless_test.go
new file mode 100644
index 0000000..ecd675b
--- /dev/null
+++ b/internal/kahless/kahless_test.go
@@ -0,0 +1,11 @@
+package kahless
+
+import "testing"
+
+func TestDial(t *testing.T) {
+ cli, err := Dial()
+ if err != nil {
+ t.Fatal(err)
+ }
+ cli.Close()
+}