-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
124 lines (103 loc) · 2.02 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
124
package main
import (
"context"
"flag"
"log"
"os"
"os/exec"
"path/filepath"
"runtime"
"time"
"github.com/go-ping/ping"
)
const (
defaultpingUrl = "www.baidu.com"
defaultRunDir = "startup"
defaultTimeout = 60
)
var (
pingUrl string
timeout int
rundir string
)
func main() {
flag.StringVar(&pingUrl, "u", defaultpingUrl, "ping url")
flag.IntVar(&timeout, "t", defaultTimeout, "timeout")
flag.StringVar(&rundir, "d", "", "run dir")
flag.Parse()
if rundir == "" {
home, err := os.UserHomeDir()
if err != nil {
panic(err)
}
rundir = filepath.Join(home, defaultRunDir)
}
ctx, cancel := context.WithTimeout(context.Background(), time.Second*time.Duration(timeout))
isOK := make(chan struct{}, 1)
pinger := ping.New(pingUrl)
if runtime.GOOS == "windows" {
pinger.SetPrivileged(true)
}
pinger.OnRecv = func(pkt *ping.Packet) {
isOK <- struct{}{}
}
pinger.Interval = time.Second / 3
go func() {
for {
select {
case <-ctx.Done():
return
default:
if err := pinger.Run(); err != nil {
log.Println("ping failed, retry")
}
}
time.Sleep(time.Second)
}
}()
select {
case <-isOK:
log.Println("network is available")
pinger.Stop()
close(isOK)
cancel()
case <-ctx.Done():
log.Println("timeout")
return
}
_, err := os.Stat(rundir)
if err != nil {
err := os.Mkdir(rundir, os.ModePerm)
if err != nil {
panic(err)
}
}
filepaths := []string{}
filepath.Walk(rundir, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if !info.IsDir() {
filepaths = append(filepaths, path)
}
return nil
})
cmds := []*exec.Cmd{}
for _, path := range filepaths {
cmd := exec.Command("cmd.exe", "/C", path)
if err := cmd.Start(); err != nil {
log.Println(path + " run failed")
}
cmds = append(cmds, cmd)
log.Println(path + " run success")
}
if len(cmds) == 0 {
log.Println("no run file")
return
}
time.Sleep(time.Second * 1)
for _, cmd := range cmds {
cmd.Process.Kill()
}
log.Println("all done")
}