is_master-go/is_master.go
2019-06-27 20:37:47 +02:00

103 lines
1.9 KiB
Go

package main
import (
"fmt"
"flag"
"os"
"syscall"
"strings"
"net"
"regexp"
)
// Option to parse
var (
HELP = flag.Bool("help", false, "print the help message")
IP = flag.String("ip", "", "")
FILE = flag.String("file", "", "")
COMMAND = flag.String("command", "", "command to execute")
)
// Critical print a message and exit with code 2
func Critical(msg string) {
fmt.Println(fmt.Sprintf("CRITICAL - %s", msg))
os.Exit(2)
}
// Warning print a message and exit with code 1
func Warning(msg string) {
fmt.Println(fmt.Sprintf("WARNING - %s", msg))
os.Exit(1)
}
// Ok print a message and exit with code 0
func Ok(msg string) {
fmt.Println(fmt.Sprintf("OK - %s", msg))
os.Exit(0)
}
func init() {
flag.Parse()
if *HELP {
flag.PrintDefaults()
os.Exit(3)
}
if *IP == "" && *FILE == "" {
Critical("Please set file or ip option")
}
if *COMMAND == "" {
Critical("Please set command option")
}
}
// fileExist return true if the file exist
func fileExist(path string) bool {
_, err := os.Stat(*FILE)
if err == nil {
return true
}
return false
}
// ipExist return true if an interface has the ip
func ipExist(ip string) bool {
r := regexp.MustCompile(`^(.*)/\d{1,2}$`)
ifaces, _ := net.Interfaces()
for _, i := range ifaces {
addrs, _ := i.Addrs()
for _, addr := range addrs {
match := r.FindSubmatch([]byte(fmt.Sprintf("%s", addr)))
if len(match) == 0 {
continue
}
if string(match[1]) == ip {
return true
}
}
}
return false
}
func main() {
var isMaster bool
if *FILE != "" {
isMaster = fileExist(*FILE)
} else {
isMaster = ipExist(*IP)
}
if isMaster == false {
Ok("OK - I am slave, i going to sleep")
}
command := strings.Split(*COMMAND, " ")
syscall.Exec(command[0], command, []string{})
}