-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathparseini.go
129 lines (123 loc) · 3.25 KB
/
parseini.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
126
127
128
129
package main
import (
"bufio"
"fmt"
"github.com/go-ini/ini"
"io"
"log"
"os"
"strings"
)
func parseini(path string) (playbooks []playbook, err error) {
cfg, err := ini.Load(path)
if err != nil {
log.Fatalf("open ini err: %v", err)
return nil, err
}
var my_playbook playbook
var sshconfigs []sshconfig
secs := cfg.Sections()
hosts := strings.Split(cfg.Section("").Key("hosts").String(), ",")
for j := range hosts {
k, err := stringToSshconfig(hosts[j])
if err != nil {
log.Fatalf("parseini error: %v", err)
}
sshconfigs = append(sshconfigs, k)
}
for i := range secs {
my_playbook.name = secs[i].Name()
// if operate type is ssh
if secs[i].HasKey("command") == true {
my_playbook.command = secs[i].Key("command").String()
my_playbook.playbook_type = "ssh"
my_playbook.dst = ""
my_playbook.src = ""
playbooks = append(playbooks, my_playbook)
continue
// if operate type is scp
} else if secs[i].HasKey("dst") == true && secs[i].HasKey("src") {
my_playbook.dst = secs[i].Key("dst").String()
my_playbook.src = secs[i].Key("src").String()
my_playbook.playbook_type = "scp"
my_playbook.command = ""
playbooks = append(playbooks, my_playbook)
continue
}
}
for i := range playbooks {
playbooks[i].servers = sshconfigs
}
return playbooks, nil
}
func stringToSshconfig(line string) (myconfig sshconfig, err error) {
if strings.Contains(string(line), "@") && strings.Contains(string(line), ":") {
s := strings.Split(string(line), "@")
s1 := strings.Split(s[1], ":")
myconfig = sshconfig{
user: strings.TrimSpace(s[0]),
address: strings.TrimSpace(s1[0]),
port: strings.TrimSpace(s1[1]),
}
} else if !strings.Contains(string(line), ":") && strings.Contains(string(line), "@") {
s := strings.Split(string(line), "@")
myconfig = sshconfig{
user: strings.TrimSpace(s[0]),
address: strings.TrimSpace(s[1]),
port: "22",
}
} else if !strings.Contains(string(line), "@") && strings.Contains(string(line), ":") {
s := strings.Split(string(line), ":")
myconfig = sshconfig{
user: "root",
address: strings.TrimSpace(s[0]),
port: strings.TrimSpace(s[1]),
}
} else {
myconfig = sshconfig{
user: "root",
address: strings.Replace(string(line), "\n", "", -1),
port: "22",
}
if myconfig.address == "" {
log.Fatalf("stringToSshconfig error: line is blank!")
return myconfig, fmt.Errorf("stringToSshconfig error: line is blank!")
}
}
return myconfig, nil
}
func parseHostfile(hostfile string) (result_sshconfig []sshconfig, err error) {
fi, err := os.Open(hostfile)
if err != nil {
log.Fatalf("parseHostfile.Open Error: %v", err)
return nil, err
}
defer fi.Close()
br := bufio.NewReader(fi)
for {
line, err := br.ReadString('\n')
if err != nil || err == io.EOF {
break
}
myconfig, err := stringToSshconfig(line)
if err != nil {
log.Fatalf("parseHostfile.stringToSshconfig error: %v", err)
return nil, err
}
result_sshconfig = append(result_sshconfig, myconfig)
}
return result_sshconfig, nil
}
type sshconfig struct {
user string
address string
port string
}
type playbook struct {
name string
playbook_type string
src string
dst string
command string
servers []sshconfig
}