-
Notifications
You must be signed in to change notification settings - Fork 24
/
push.go
111 lines (95 loc) · 2.21 KB
/
push.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
package main
import (
"bufio"
"fmt"
"os"
"os/exec"
"strings"
"github.com/99designs/iamy/iamy"
"github.com/fatih/color"
)
type PushCommandInput struct {
Dir string
}
func PushCommand(ui Ui, input PushCommandInput) {
yaml := iamy.YamlLoadDumper{
Dir: input.Dir,
}
aws := iamy.AwsFetcher{
SkipFetchingPolicyAndRoleDescriptions: true,
Debug: ui.Debug,
}
allDataFromYaml, err := yaml.Load()
if err != nil {
ui.Fatal(err)
return
}
dataFromAws, err := aws.Fetch()
if err != nil {
ui.Fatal(err)
return
}
// find the yaml account data that matches the aws account
for _, dataFromYaml := range allDataFromYaml {
if dataFromYaml.Account.Id == dataFromAws.Account.Id {
sync(dataFromYaml, dataFromAws, ui)
return
}
}
ui.Println("No files found for AWS Account ID " + dataFromAws.Account.Id)
}
func printCommands(prefix string, awsCmds iamy.CmdList, ui Ui) {
for _, cmd := range awsCmds {
cmdStr := cmd.String()
if cmd.IsDestructive() {
cmdStr = color.RedString(cmdStr)
}
ui.Println(prefix + cmdStr)
}
}
func sync(yamlData iamy.AccountData, awsData *iamy.AccountData, ui Ui) {
ui.Debug.Printf("Generating sync commands for %s", awsData.Account.String())
awsCmds := iamy.AwsCliCmdsForSync(awsData, &yamlData)
if len(awsCmds) == 0 {
ui.Println("Already up to date")
return
}
ui.Println("Commands to push changes to AWS:")
printCommands(" ", awsCmds, ui)
if *dryRun {
ui.Println("Dry-run mode not running aws commands")
return
}
r, err := prompt(fmt.Sprintf("\nRun %d aws commands (%d destructive)? (y/N) ", awsCmds.Count(), awsCmds.CountDestructive()))
if err != nil {
ui.Fatal(err)
return
}
if r == "y" {
for _, c := range awsCmds {
execCmd(c, ui)
}
} else {
ui.Println("Not running aws commands")
}
}
func execCmd(c iamy.Cmd, ui Ui) {
ui.Println("\n>", c)
cmd := exec.Command(c.Name, c.Args...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err := cmd.Run()
if err != nil {
ui.Fatal(err)
return
}
}
func prompt(prompt string) (string, error) {
reader := bufio.NewReader(os.Stdin)
fmt.Print(prompt)
text, err := reader.ReadString('\n')
if err != nil {
return "", err
}
return strings.TrimSpace(text), nil
}