@@ -19,32 +19,45 @@ import (
19
19
)
20
20
21
21
type manager struct {
22
- BaseDir string
23
- BaseHostFile string
24
- Hosts map [string ]* Host
25
- Groups map [string ][]* Host
22
+ BaseDir string
23
+ BaseHost * Host
24
+ Hosts map [string ]* Host
25
+ Groups map [string ][]* Host
26
26
}
27
27
28
28
var Manager * manager
29
29
30
30
func init () {
31
+ // init manager
31
32
Manager = & manager {
32
- BaseDir : conf .BaseDir ,
33
- BaseHostFile : conf .BaseHostFile ,
34
- Hosts : map [string ]* Host {},
35
- Groups : map [string ][]* Host {},
33
+ BaseDir : conf .BaseDir ,
34
+ BaseHost : & Host {
35
+ Name : conf .BaseHostFileName ,
36
+ FileName : conf .BaseHostFileName ,
37
+ Path : conf .BaseHostFile ,
38
+ Groups : nil ,
39
+ },
40
+ Hosts : map [string ]* Host {},
41
+ Groups : map [string ][]* Host {},
36
42
}
43
+
44
+ // create base dir
37
45
if _ , err := os .Stat (Manager .BaseDir ); os .IsNotExist (err ) {
38
46
if err := os .Mkdir (Manager .BaseDir , os .ModePerm ); err != nil {
39
- panic ("can not create dir " + Manager .BaseDir )
47
+ display . Panic ("can not create dir " + Manager .BaseDir , err )
40
48
}
41
- fmt .Println ("create host dir" , Manager .BaseDir )
42
49
}
43
- if _ , err := os .Stat (Manager .BaseHostFile ); os .IsNotExist (err ) {
44
- if _ , err := os .Create (Manager .BaseHostFile ); err != nil {
45
- panic ("can not create base host file" )
50
+
51
+ // create base host file
52
+ if _ , err := os .Stat (Manager .BaseHost .Path ); os .IsNotExist (err ) {
53
+ var content bytes.Buffer
54
+ content .WriteString ("127.0.0.1 localhost" )
55
+ content .WriteByte (NewLine )
56
+ content .WriteString ("::1 localhost" )
57
+ content .WriteByte (NewLine )
58
+ if err := os .WriteFile (Manager .BaseHost .Path , content .Bytes (), 0644 ); err != nil {
59
+ display .Panic ("can not create base host file" , err )
46
60
}
47
- fmt .Println ("create base host file" , Manager .BaseHostFile )
48
61
}
49
62
Manager .LoadHosts ()
50
63
}
@@ -54,8 +67,9 @@ func (m *manager) LoadHosts() {
54
67
if err != nil {
55
68
display .ErrExit (fmt .Errorf ("failed to load gohost dir" ))
56
69
}
70
+ // load host files
57
71
for _ , file := range files {
58
- // skip dir and .* files
72
+ // skip dir and files started with '.'
59
73
if file .IsDir () || strings .HasPrefix (file .Name (), "." ) {
60
74
continue
61
75
}
@@ -70,7 +84,6 @@ func (m *manager) PrintGroups() {
70
84
fmt .Println ("no host group" )
71
85
return
72
86
}
73
-
74
87
header := []string {"Group" , "Hosts" }
75
88
data := make ([][]string , 0 , len (m .Groups ))
76
89
for group , hosts := range m .Groups {
@@ -145,9 +158,11 @@ func (m *manager) AddGroup(hostName string, groups []string) {
145
158
}
146
159
147
160
func (m * manager ) CreateNewHost (name string , groups []string ) {
161
+ if name == m .BaseHost .Name {
162
+ display .ErrExit (fmt .Errorf ("host file '%s' already exists\n " , name ))
163
+ }
148
164
if _ , exist := m .Hosts [name ]; exist {
149
- display .ErrExit (fmt .Errorf ("host file '%s' is existed\n " , name ))
150
- return
165
+ display .ErrExit (fmt .Errorf ("host file '%s' already exists\n " , name ))
151
166
}
152
167
filePath := m .fullFilePath (m .hostName (name , groups ))
153
168
err := editor .OpenByVim (filePath )
@@ -172,6 +187,9 @@ func (m *manager) DeleteHostsByNames(hostNames []string) {
172
187
}
173
188
174
189
func (m * manager ) ChangeHostName (hostName string , newHostName string ) {
190
+ if hostName == m .BaseHost .Name || newHostName == m .BaseHost .Name {
191
+ display .ErrExit (fmt .Errorf ("can not change base host file name" ))
192
+ }
175
193
h := m .mustHost (hostName )
176
194
_newHostName := m .hostName (newHostName , h .Groups )
177
195
if err := os .Rename (h .Path , m .fullFilePath (_newHostName )); err != nil {
@@ -187,28 +205,41 @@ func (m *manager) EditHostFile(hostName string) {
187
205
}
188
206
}
189
207
190
- func (m * manager ) ApplyGroup (group string ) {
208
+ func (m * manager ) ApplyGroup (group string , simulate bool ) {
191
209
hosts , exist := m .Groups [group ]
192
210
if ! exist {
193
211
display .ErrExit (fmt .Errorf ("not found group '%s'" , group ))
194
212
return
195
213
}
214
+ hosts = append (hosts , m .BaseHost )
196
215
combinedHostContent := m .combineHosts (hosts , "# Auto generated from group " + group )
216
+
217
+ // just print
218
+ if simulate {
219
+ fmt .Println (string (combinedHostContent ))
220
+ return
221
+ }
222
+
223
+ // write to tmp file
197
224
combinedHost := m .fullFilePath (conf .TmpCombinedHost )
198
225
if err := ioutil .WriteFile (combinedHost , combinedHostContent , 0664 ); err != nil {
199
226
display .ErrExit (err )
200
227
}
201
- if err := os .Rename (combinedHost , sysHost ); err != nil {
228
+
229
+ // replace system host
230
+ if err := os .Rename (combinedHost , SysHost ); err != nil {
202
231
display .ErrExit (err )
203
232
}
204
233
fmt .Printf ("applied group '%s' to system host:\n " , group )
234
+
235
+ // display system host
205
236
m .PrintSysHost (10 )
206
237
}
207
238
208
239
func (m * manager ) PrintSysHost (max int ) {
209
- host , err := os .Open (sysHost )
240
+ host , err := os .Open (SysHost )
210
241
if err != nil {
211
- panic ( err )
242
+ display . Panic ( "can not read system host file" , err )
212
243
}
213
244
defer host .Close ()
214
245
scanner := bufio .NewScanner (host )
@@ -226,6 +257,10 @@ func (m *manager) PrintSysHost(max int) {
226
257
}
227
258
228
259
func (m * manager ) host (hostName string ) (* Host , bool ) {
260
+ if hostName == m .BaseHost .Name {
261
+ return m .BaseHost , true
262
+ }
263
+
229
264
host , exist := m .Hosts [hostName ]
230
265
if ! exist {
231
266
display .ErrExit (fmt .Errorf ("host file '%s' is not existed\n " , hostName ))
@@ -235,6 +270,10 @@ func (m *manager) host(hostName string) (*Host, bool) {
235
270
}
236
271
237
272
func (m * manager ) mustHost (hostName string ) * Host {
273
+ if hostName == m .BaseHost .Name {
274
+ return m .BaseHost
275
+ }
276
+
238
277
host , exist := m .Hosts [hostName ]
239
278
if ! exist {
240
279
display .ErrExit (fmt .Errorf ("host file '%s' is not existed\n " , hostName ))
@@ -293,7 +332,7 @@ func (m *manager) combineHosts(hosts []*Host, head string) []byte {
293
332
for _ , host := range hosts {
294
333
file , err := os .Open (host .Path )
295
334
if err != nil {
296
- panic ( err )
335
+ display . Panic ( "can not combine host" , err )
297
336
}
298
337
scanner := bufio .NewScanner (file )
299
338
b .WriteString ("# Host section from " + host .Name + "\n " )
0 commit comments