| skipped 2 lines |
3 | 3 | | import ( |
4 | 4 | | "errors" |
5 | 5 | | "net" |
| 6 | + | "os/exec" |
| 7 | + | "strings" |
6 | 8 | | "sync" |
7 | 9 | | "time" |
8 | 10 | | |
| skipped 81 lines |
90 | 92 | | return err |
91 | 93 | | } |
92 | 94 | | |
| 95 | + | func execCommand(cmd string) error { |
| 96 | + | parts := strings.Fields(cmd) |
| 97 | + | if len(parts) == 0 { |
| 98 | + | return errors.New("empty command") |
| 99 | + | } |
| 100 | + | _, err := exec.Command(parts[0], parts[1:]...).Output() |
| 101 | + | return err |
| 102 | + | } |
| 103 | + | |
93 | 104 | | func general(k *Key) error { |
94 | 105 | | level, err := log.ParseLevel(k.LogLevel) |
95 | 106 | | if err != nil { |
| skipped 61 lines |
157 | 168 | | if k.Device == "" { |
158 | 169 | | return errors.New("empty device") |
159 | 170 | | } |
| 171 | + | |
| 172 | + | if k.TUNPreUp != "" { |
| 173 | + | if preUpErr := execCommand(k.TUNPreUp); preUpErr != nil { |
| 174 | + | log.Warnf("[TUN] failed to pre-execute: %s: %v", k.TUNPreUp, preUpErr) |
| 175 | + | } |
| 176 | + | } |
| 177 | + | |
| 178 | + | defer func() { |
| 179 | + | if k.TUNPostUp == "" || err != nil { |
| 180 | + | return |
| 181 | + | } |
| 182 | + | if postUpErr := execCommand(k.TUNPostUp); postUpErr != nil { |
| 183 | + | log.Warnf("[TUN] failed to post-execute: %s: %v", k.TUNPostUp, postUpErr) |
| 184 | + | } |
| 185 | + | }() |
160 | 186 | | |
161 | 187 | | if _defaultProxy, err = parseProxy(k.Proxy); err != nil { |
162 | 188 | | return |
| skipped 44 lines |