diff options
| author | Christine Dodrill <me@christine.website> | 2018-10-05 15:03:35 +0000 |
|---|---|---|
| committer | Christine Dodrill <me@christine.website> | 2018-10-05 15:03:35 +0000 |
| commit | ad9c6f3ebf7c2f112f958cc952965e6173020651 (patch) | |
| tree | 486e41d2462e68e8e555bcf5042b610f05dea5d9 | |
| parent | f69b3fb4237344ce861d7271fec6949d4702402e (diff) | |
| download | x-ad9c6f3ebf7c2f112f958cc952965e6173020651.tar.xz x-ad9c6f3ebf7c2f112f958cc952965e6173020651.zip | |
tools: add new tool appsluggr
| -rw-r--r-- | mastodon/sona-pi-toki-pona/.gitignore | 4 | ||||
| -rw-r--r-- | mastodon/sona-pi-toki-pona/app/Procfile | 1 | ||||
| -rwxr-xr-x | mastodon/sona-pi-toki-pona/build.sh | 7 | ||||
| -rw-r--r-- | tools/appsluggr/main.go | 141 |
4 files changed, 151 insertions, 2 deletions
diff --git a/mastodon/sona-pi-toki-pona/.gitignore b/mastodon/sona-pi-toki-pona/.gitignore index cca091f..754dd56 100644 --- a/mastodon/sona-pi-toki-pona/.gitignore +++ b/mastodon/sona-pi-toki-pona/.gitignore @@ -1 +1,3 @@ -sona-pi-toki-pona
\ No newline at end of file +sona-pi-toki-pona +*.tar.gz + diff --git a/mastodon/sona-pi-toki-pona/app/Procfile b/mastodon/sona-pi-toki-pona/app/Procfile deleted file mode 100644 index 03dd662..0000000 --- a/mastodon/sona-pi-toki-pona/app/Procfile +++ /dev/null @@ -1 +0,0 @@ -worker: /app/bin/sona-pi-toki-pona diff --git a/mastodon/sona-pi-toki-pona/build.sh b/mastodon/sona-pi-toki-pona/build.sh new file mode 100755 index 0000000..a92b6f8 --- /dev/null +++ b/mastodon/sona-pi-toki-pona/build.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +CGO_ENABLED=0 GOOS=linux go build -o sona-pi-toki-pona +appsluggr -fname sona-pi-toki-pona.tar.gz -worker sona-pi-toki-pona +scp sona-pi-toki-pona.tar.gz xena@greedo.xeserv.us:public_html/files +ssh dokku@minipaas.xeserv.us tar:from sona-pi-toki-pona https://xena.greedo.xeserv.us/files/sona-pi-toki-pona.tar.gz + diff --git a/tools/appsluggr/main.go b/tools/appsluggr/main.go new file mode 100644 index 0000000..7b30ab1 --- /dev/null +++ b/tools/appsluggr/main.go @@ -0,0 +1,141 @@ +package main + +import ( + "archive/tar" + "compress/gzip" + "flag" + "fmt" + "io" + "io/ioutil" + "log" + "os" + "path/filepath" + "strings" + + "github.com/Xe/x/internal" +) + +var ( + web = flag.String("web", "", "path to binary for web process") + webScale = flag.Int("web-scale", 1, "default scale for web process if defined") + worker = flag.String("worker", "", "path to binary for worker process") + workerScale = flag.Int("worker-scale", 1, "default scale for worker process if defined") + fname = flag.String("fname", "slug.tar.gz", "slug name") +) + +func main() { + flag.Parse() + internal.HandleLicense() + + fout, err := os.Create(*fname) + if err != nil { + log.Fatal(err) + } + defer fout.Close() + + gzw := gzip.NewWriter(fout) + defer gzw.Close() + + tw := tar.NewWriter(gzw) + defer tw.Close() + + dir, err := ioutil.TempDir("", "appsluggr") + if err != nil { + log.Fatal(err) + } + + defer os.RemoveAll(dir) // clean up + + os.MkdirAll(filepath.Join(dir, "bin"), 0777) + var procfile, scalefile string + + if *web != "" { + procfile += "web: /app/bin/web\n" + scalefile += fmt.Sprintf("web=%d", *webScale) + Copy(*web, filepath.Join(dir, "bin", "web")) + + } + if *worker != "" { + procfile += "worker: /app/bin/worker\n" + scalefile += fmt.Sprintf("worker=%d", *workerScale) + Copy(*worker, filepath.Join(dir, "bin", "worker")) + } + + err = ioutil.WriteFile(filepath.Join(dir, "DOKKU_SCALE"), []byte(scalefile), 0666) + if err != nil { + log.Fatal(err) + } + err = ioutil.WriteFile(filepath.Join(dir, "Procfile"), []byte(procfile), 0666) + if err != nil { + log.Fatal(err) + } + + filepath.Walk(dir, func(file string, fi os.FileInfo, err error) error { + // return on any error + if err != nil { + return err + } + + // create a new dir/file header + header, err := tar.FileInfoHeader(fi, fi.Name()) + if err != nil { + return err + } + + // update the name to correctly reflect the desired destination when untaring + header.Name = strings.TrimPrefix(strings.Replace(file, dir, "", -1), string(filepath.Separator)) + + // write the header + if err := tw.WriteHeader(header); err != nil { + return err + } + + // return on non-regular files (thanks to [kumo](https://medium.com/@komuw/just-like-you-did-fbdd7df829d3) for this suggested update) + if !fi.Mode().IsRegular() { + return nil + } + + // open files for taring + f, err := os.Open(file) + if err != nil { + return err + } + + // copy file data into tar writer + if _, err := io.Copy(tw, f); err != nil { + return err + } + + // manually close here after each file operation; defering would cause each file close + // to wait until all operations have completed. + f.Close() + + return nil + }) +} + +// Copy the src file to dst. Any existing file will be overwritten and will not +// copy file attributes. +func Copy(src, dst string) error { + in, err := os.Open(src) + if err != nil { + return err + } + defer in.Close() + st, err := in.Stat() + if err != nil { + return err + } + + out, err := os.OpenFile(dst, os.O_CREATE|os.O_WRONLY, st.Mode()) + if err != nil { + return err + } + defer out.Close() + + _, err = io.Copy(out, in) + if err != nil { + return err + } + return out.Close() +} |
