diff options
| author | Christine Dodrill <me@christine.website> | 2019-04-05 02:53:44 +0000 |
|---|---|---|
| committer | Christine Dodrill <me@christine.website> | 2019-04-05 02:53:44 +0000 |
| commit | cedc40aee04bb8c4323096c44ff3c7b3157f9990 (patch) | |
| tree | 2f7777a791608ed03f2f945e7c44ffb21bcc4745 /internal/kahless | |
| parent | b08b31ee28f017b01718808340d9217f6c11914b (diff) | |
| download | x-cedc40aee04bb8c4323096c44ff3c7b3157f9990.tar.xz x-cedc40aee04bb8c4323096c44ff3c7b3157f9990.zip | |
greedo -> kahless
Diffstat (limited to 'internal/kahless')
| -rw-r--r-- | internal/kahless/doc.go | 2 | ||||
| -rw-r--r-- | internal/kahless/kahless.go | 85 | ||||
| -rw-r--r-- | internal/kahless/kahless_test.go | 11 |
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() +} |
