main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package main
import (
"fmt"
"log"
"os"
"os/exec"
"path/filepath"
"j3s.sh/zoa/git"
"j3s.sh/zoa/shell"
"j3s.sh/zoa/utils"
)
func main() {
// git vars
var branch string
// if os.Geteuid() != 0 {
// fmt.Println("! you are running zoa as a non-root user. not ideal tbh. !")
// }
if len(os.Args) < 2 {
printUsage()
}
if len(os.Args) > 2 {
branch = os.Args[2]
}
command := os.Args[1]
if command == "-h" || command == "--help" || command == "help" {
printUsage()
}
if command == "deploy" {
if len(os.Args) < 3 {
fmt.Println("please supply one or more servers to deploy to")
os.Exit(1)
}
hosts := os.Args[2:]
zoaPath, err := exec.LookPath("zoa")
if err != nil {
log.Fatal(err)
}
// TODO: replace remote binary if newer
err = shell.SSH("command -v zoa", hosts)
if err != nil {
// Install Zoa
err = shell.SCP(zoaPath, hosts)
if err != nil {
log.Fatal(err)
}
err = shell.SSH("chmod +x zoa", hosts)
if err != nil {
log.Fatal(err)
}
err = shell.SSH("mv zoa /usr/local/bin/", hosts)
if err != nil {
subErr := shell.SSH("sudo mv zoa /usr/local/bin/", hosts)
if subErr != nil {
log.Fatal(err)
}
}
}
err = shell.SCP("main", hosts)
if err != nil {
log.Fatal(err)
}
err = shell.SCPDir("scripts", hosts)
if err != nil {
log.Fatal(err)
}
err = shell.SCPDir("files", hosts)
if err != nil {
log.Fatal(err)
}
err = shell.SSH("sudo zoa .", hosts)
if err != nil {
log.Fatal(err)
}
os.Exit(0)
}
gitMode := git.GitMode(command)
if gitMode {
utils.SetZoaRoot("/var/lib/zoa/repo")
err := os.MkdirAll(utils.ZoaRoot, 0755)
if err != nil {
log.Fatal(err)
}
// check the path & branch, make sure it's correct
// then clone
git.Clone(command, branch)
} else {
utils.SetZoaRoot(command)
}
// TODO: this writer is responsible for the random stdout
// maybe save the stdout for debug mode somehow
main := filepath.Join(utils.ZoaRoot, "main")
shell.RunScript(main)
}
func printUsage() {
// TODO: -v -h
fmt.Println(`usage: zoa [deploy | run] [remote host | path]
sorry, this shit is a work in progress
details:
zoa run [path] will execute the zoa script in the path
zoa deploy [remote host] will ssh to the given server and:
- install zoa (if not installed)
- copy the local zoa repo to the host
- execute zoa
examples:
zoa run ./my-dir/main
zoa deploy j3s.sh git.j3s.sh`)
os.Exit(1)
}