-
Notifications
You must be signed in to change notification settings - Fork 0
/
bootstrap.go
112 lines (101 loc) · 3.1 KB
/
bootstrap.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
package main
import (
"errors"
"flag"
"fmt"
"log"
"os"
"os/exec"
"path"
"path/filepath"
"runtime"
)
var (
installDebian = flag.Bool("debian", false, "install base debian dependencies")
installDotfiles = flag.Bool("dotfiles", false, "deploy linux dotfiles from repo")
installGolang = flag.Bool("golang", false, "install latest golang")
installLinux = flag.Bool("linux", false, "install base linux dependencies")
installOsx = flag.Bool("osx", false, "install base OSX dependencies")
installPython = flag.Bool("python", false, "install latest python")
installRuby = flag.Bool("ruby", false, "install latest ruby")
installUbuntu = flag.Bool("ubuntu", false, "install base ubuntu dependencies")
installVim = flag.Bool("vim", false, "install latest vim")
installVimFull = flag.Bool("vim_full", false, "install latest vim compiled from source")
taskTypes = map[string]string{
"debian": "os",
"dotfiles": "config",
"golang": "lang",
"linux": "base",
"osx": "base",
"python": "lang",
"ruby": "lang",
"ubuntu": "os",
"vim": "tool",
"vim_full": "tool",
}
installOrder = []string{"base", "os", "lang", "tool", "config"}
installScripts = map[string]string{
"debian": "installers/debian.sh",
"dotfiles": "installers/dotfiles.sh",
"golang": "installers/golang.sh",
"linux": "installers/linux.sh",
"osx": "installers/osx.sh",
"python": "installers/python.sh",
"ruby": "installers/ruby.sh",
"ubuntu": "installers/ubuntu.sh",
"vim": "installers/vim.sh",
"vim_full": "installers/vim_full.sh",
}
_, filePath, _, _ = runtime.Caller(0)
dirPath = filepath.Dir(filePath)
)
func main() {
flag.Parse()
var tasks []string
visitor := func(a *flag.Flag) {
if a.Value.String() == "true" {
tasks = append(tasks, a.Name)
}
}
flag.VisitAll(visitor)
fmt.Printf("-- tasks to run %v\n", tasks)
for i, stage := range installOrder {
stageTasks := tasksForStage(tasks, stage)
fmt.Printf(" - tasks for stage %d %-5s : %-s\n", i, stage, stageTasks)
for _, task := range stageTasks {
runTask(task)
}
}
}
func runTask(task string) {
binary, err := binaryPath(path.Join(dirPath, installScripts[task]))
if err != nil {
fmt.Println("-- Script for task does not exist:", task, installScripts[task], binary)
log.Fatal(err)
} else {
fmt.Println("-- Found script for task:", task, installScripts[task], binary)
}
fmt.Printf("-- executing task %-10s -> %-s\n", task, binary)
cmd := exec.Command("/bin/bash", binary)
cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr
execErr := cmd.Run()
if execErr != nil {
log.Fatal(err)
}
fmt.Println("-- finished executing task", task)
}
func tasksForStage(tasks []string, stage string) []string {
var stageTasks []string
for _, task := range tasks {
if taskTypes[task] == stage {
stageTasks = append(stageTasks, task)
}
}
return stageTasks
}
func binaryPath(localPath string) (string, error) {
if _, err := os.Stat(localPath); os.IsNotExist(err) {
return "", errors.New(fmt.Sprintf("File does not exist: %s", localPath))
}
return filepath.Abs(localPath)
}