-
Notifications
You must be signed in to change notification settings - Fork 4
/
main.go
123 lines (110 loc) · 2.95 KB
/
main.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
package fsextender
import (
"bytes"
"fmt"
"github.com/rekby/fsextender/Godeps/_workspace/src/github.com/ogier/pflag"
"log"
"os"
"os/exec"
"path/filepath"
"strings"
)
const DEBUG = false
//go:generate go-bindata README.md usage.txt
func Main() int {
showHelp := pflag.BoolP("help", "h", false, "Show long usage manual")
showReadme := pflag.Bool("readme", false, "Show readme")
do := pflag.Bool("do", false, "Execute plan instead of print it")
filter := pflag.StringP("filter", "f", FILTER_LVM_ALREADY_PLACED, "filter of disks, which use for partition extends")
pflag.Parse()
if *showHelp {
txt, err := usageTxtBytes()
if err != nil {
log.Println(err)
return 11
}
fmt.Println(string(txt))
return 0
}
if *showReadme {
txt, err := readmeMdBytes()
if err != nil {
log.Println(err)
return 11
}
fmt.Println(string(txt))
return 0
}
if pflag.NArg() != 1 || !filepath.IsAbs(pflag.Arg(0)) {
printShortUsage()
return 11
}
startPoint := pflag.Arg(0)
storage, err := extendScanWays(startPoint)
// fmt.Println("SCAN PLAN:")
// extendPrint(storage)
// fmt.Println()
// fmt.Println()
// fmt.Println()
if err != nil {
panic(err)
}
plan, err := extendPlan(storage, *filter)
if err != nil {
log.Println("Error while make extend plan:", err)
return 11
}
if *do {
if extendDo(plan) {
fmt.Println("NEED REBOOT AND START ME ONCE AGAIN.")
return 128
} else {
fmt.Println("OK")
return 0
}
} else {
extendPrint(plan)
return 0
}
}
func printShortUsage() {
fmt.Printf(`Short usage: %v [options] <start_point>
Detect result:
OK - if extended compele. Return code 0.
NEED REBOOT AND START ME ONCE AGAIN. - if need reboot and run command with same parameters. Return code 128.
0 < Code < 128 mean error exit. (Now it print usages and panic only).
Options:
`, os.Args[0])
pflag.PrintDefaults()
}
func cmd(cmd string, args ...string) (stdout, errout string, err error) {
bufStd := &bytes.Buffer{}
bufErr := &bytes.Buffer{}
command := exec.Command(cmd, args...)
command.Stdout = bufStd
command.Stderr = bufErr
err = command.Run()
if DEBUG {
log.Printf("CMD: '%v' '%v'\n", cmd, strings.Join(args, "' '"))
log.Printf("RES:\n%v\nERR:\n%v\nERROR:\n%v\n\n", bufStd.String(), bufErr.String(), err)
}
return bufStd.String(), bufErr.String(), err
}
/*
execute command with args and return slice of strings.TrimSpace(line). Empty lines removed.
Возвращает stdout команды, разделенный на строки. У каждой строки пустые символы в начале/конце обрезаны, пустые строки
удалены. stderr и код ответа не учитываются
*/
func cmdTrimLines(command string, args ...string) []string {
res, _, _ := cmd(command, args...)
lines := make([]string, 0)
for _, line := range strings.Split(res, "\n") {
line = strings.TrimSpace(line)
if line == "" {
continue
} else {
lines = append(lines, line)
}
}
return lines
}