aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristine Dodrill <me@christine.website>2018-10-05 15:03:35 +0000
committerChristine Dodrill <me@christine.website>2018-10-05 15:03:35 +0000
commitad9c6f3ebf7c2f112f958cc952965e6173020651 (patch)
tree486e41d2462e68e8e555bcf5042b610f05dea5d9
parentf69b3fb4237344ce861d7271fec6949d4702402e (diff)
downloadx-ad9c6f3ebf7c2f112f958cc952965e6173020651.tar.xz
x-ad9c6f3ebf7c2f112f958cc952965e6173020651.zip
tools: add new tool appsluggr
-rw-r--r--mastodon/sona-pi-toki-pona/.gitignore4
-rw-r--r--mastodon/sona-pi-toki-pona/app/Procfile1
-rwxr-xr-xmastodon/sona-pi-toki-pona/build.sh7
-rw-r--r--tools/appsluggr/main.go141
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()
+}