package main
import (
"bytes"
"database/sql"
"flag"
"fmt"
_ "github.com/go-sql-driver/mysql"
"log"
"os/exec"
"errors"
"strings"
"time"
)
var interval int64
func init() {
flag.Int64Var(&interval, "interval", 900, "检查更新间隔")
flag.Parse()
fmt.Println("检查更新间隔为", interval, "秒")
}
func SetCommandStd(cmd *exec.Cmd) (stdout, stderr *bytes.Buffer) {
stdout = &bytes.Buffer{}
stderr = &bytes.Buffer{}
cmd.Stdout = stdout
cmd.Stderr = stderr
return
}
func CoordIP() {
//cmd := exec.Command("ip a |grep -E '10.8.0.'|awk '{print $2}'")
db, err := sql.Open("mysql", "user:password@tcp(ip:port)/database?charset=utf8&parseTime=true")
if err != nil {
log.Fatalln("无法连接到mysql", err)
}
defer db.Close()
var status string
err = db.QueryRow("select status from monitor where app_code=?", "api").Scan(&status)
if err != nil {
log.Fatalln("执行查询语句出错", err)
}
fmt.Println("from mysql", status)
psCmd := exec.Command("ip", "a")
psStdout, psStderr := SetCommandStd(psCmd)
err = psCmd.Run()
if err != nil {
err = errors.New(err.Error() + psStderr.String())
log.Println("ip命令出错", err)
return
}
// 筛选
grepCmd := exec.Command("grep", "-E", "10.8.0.")
grepCmd.Stdin = psStdout
grepStdout, grepStderr := SetCommandStd(grepCmd)
err = grepCmd.Run()
if err != nil {
err = errors.New(err.Error() + grepStderr.String())
log.Println("grep命令出错", err)
return
}
// awk
awkCmd := exec.Command("awk", "{print $2}")
awkCmd.Stdin = grepStdout
awkStdout, awkStderr := SetCommandStd(awkCmd)
err = awkCmd.Run()
if err != nil {
err = errors.New(err.Error() + awkStderr.String())
log.Println("awk命令出错", err)
return
}
fmt.Println("from command", awkStdout.String())
localIP := awkStdout.String()
if localIP != status {
log.Println("不一致,将更新")
ret, err := db.Exec("update monitor set status=? where app_code=?", localIP, "api")
if err != nil {
log.Println("更新失败", err)
}else{
_, err = ret.RowsAffected()
if err != nil {
log.Println("无任何影响", err)
}else{
fmt.Println("完成更新")
}
}
}else{
log.Println("mysql和本地一致")
}
fmt.Println(strings.Repeat("#", 60))
}
func main() {
t := time.Tick(time.Second * time.Duration(interval))
CoordIP()
for {
<- t
CoordIP()
fmt.Println("检查更新间隔为", interval, "秒")
}
}