/
ConfRobber.go
144 lines (113 loc) · 3.48 KB
/
ConfRobber.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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package main
import (
"cf"
"fmt"
"io/ioutil"
"os"
"path"
"strings"
"utils"
)
func main() {
defer func() {
str := recover()
if str == nil {
str = "Ok"
} else if utils.LogIsInit() {
utils.LogInfo.Println(str)
}
fmt.Println(str)
}()
var operationType string
args := os.Args[1:]
countParams := len(args)
if countParams > 0 {
operationType = args[0]
}
errorText := checkArgc(countParams, operationType)
if len(errorText) > 0 {
panic(errorText)
}
if operationType == "-P" {
unpackToDir(args[1], args[2])
} else if operationType == "-B" {
buildCf(args[1], args[2])
} else if operationType == "-help" {
fmt.Println(checkArgc(countParams, operationType))
}
}
// Распаковать конфигурационный файл в каталог
func unpackToDir(pathToCf string, pathToTarget string) {
createTargetDir(pathToTarget)
utils.InitLogger(pathToTarget, utils.LogLevel_INFO)
utils.AddTextToLog(utils.LogLevel_INFO, "Начало")
var err error
var fileData []byte
if fileData, err = ioutil.ReadFile(pathToCf); err != nil {
panic(err.Error())
}
pathToUnpackDir := createTargetDir(path.Join(pathToTarget, "unpack"))
var objectCf cf.ConfCf
if err = objectCf.InitFromFile(fileData); err != nil {
panic(err.Error())
}
objectCf.SaveBlocksToFiles(pathToUnpackDir)
utils.AddTextToLog(utils.LogLevel_INFO, "-Завершение")
}
// Создать новый конфигурационный файл на основании данных файлов содержащихся в каталоге
func buildCf(pathToDirWithSourceData string, pathToCf string) {
pathToTarget := createTargetDir(utils.GetParentDir(pathToCf))
utils.InitLogger(pathToTarget, utils.LogLevel_INFO)
utils.AddTextToLog(utils.LogLevel_INFO, "Начало")
var err error
var objectCf cf.ConfCf
if err = objectCf.InitFromCatalog(pathToDirWithSourceData); err != nil {
panic(err.Error())
}
fileData := objectCf.GetDataForConfigFile()
if err = ioutil.WriteFile(pathToCf, fileData, os.ModeAppend); err != nil {
panic(err.Error())
}
utils.AddTextToLog(utils.LogLevel_INFO, "-Завершение")
}
// Создать каталог в который будут записаны результаты
func createTargetDir(pathToTarget string) string {
err := os.MkdirAll(pathToTarget, os.ModeDir)
checkError(err)
return pathToTarget
}
// Проверить наличие ошибок
func checkError(err error) {
if err != nil {
panic(err.Error())
}
}
// Проверить аргументы вызова
func checkArgc(countParams int, operationType string) (errorText string) {
if operationType == "-P" {
if countParams != 3 {
lines := []string{"Operation type: unpack the configuration file (*.cf)",
"Options:",
" 1. Operation type - '-P'",
" 2. Path to the source file *.cf",
" 3. Path to the target directory"}
errorText = strings.Join(lines, "\n")
}
} else if operationType == "-B" {
if countParams != 3 {
lines := []string{"Operation type: build the configuration file (*.cf)",
"Options:",
" 1. Operation type - '-B'",
" 2. Path to the directory with the source files",
" 3. Path to the configuration file (*.cf)"}
errorText = strings.Join(lines, "\n")
}
} else if operationType == "-help" {
errorText = fmt.Sprintf("%s\n\n%s\n",
checkArgc(0, "-P"), checkArgc(0, "-B"))
} else {
errorText = fmt.Sprintf("Option is not valid. Available options: \n%s\n\n%s\n",
checkArgc(0, "-P"), checkArgc(0, "-B"))
}
return
}