package sys import ( "errors" "os" "os/exec" "strconv" "webserver/extend/config" "webserver/extend/util" "fmt" "net" "strings" "time" ) func execRootCommand(cmd string) ([]byte, error) { pwd := config.Server.SudoPassword cmdStr := fmt.Sprintf("echo %s | sudo -S %s", pwd, cmd) return exec.Command("/bin/bash", "-c", cmdStr).Output() } // 检查 root权限 func CheckRootPermissions() bool { showRootCMD := exec.Command("/bin/bash", "-c", "ls /root/") if _, err := showRootCMD.Output(); err != nil { return false } return true } // 获取本机网卡IP func GetLocalIP(networkName string) (ipv4 string, mask string, err error) { interfaces, err := net.Interfaces() if err != nil { return "", "", err } for _, i := range interfaces { byName, err := net.InterfaceByName(i.Name) if err != nil { return "", "", err } addresses, err := byName.Addrs() for _, v := range addresses { if ipnet, ok := v.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { if ipnet.IP.To4() != nil { if byName.Name == networkName { maskStr := ipnet.Mask.String() mask64, _ := strconv.ParseUint(maskStr, 16, 32) return ipnet.IP.String(), util.IpIntToString(int(mask64)), nil } } } } } return "", "", errors.New("ipv4 not found") } // 获取本机网关ip func GetDefaultRoute(networkName string) (route string, err error) { cmdStr := fmt.Sprintf("ip route show | grep -P \"^default.*%s onlink\" | awk '{printf $3}'", networkName) cmd := exec.Command("/bin/sh", "-c", cmdStr) b, err := cmd.Output() if err != nil { return "", err } return string(b), nil } func GetDnsServer() (dns string, err error) { cmd := exec.Command("/bin/sh", "-c", "cat /etc/resolv.conf | grep nameserver | head -1 |awk '{printf $2}'") b, err := cmd.Output() if err != nil { return "", err } return string(b), nil } // 配置服务器网络 func SetNetworkConfig(ipv4, netmask, gateway, dns string) (bool, string) { networkConfigScript := "/opt/vasystem/script/netconfig" ifname := config.Server.NetworkAdapter localIPv4, localNetMask, _ := GetLocalIP(ifname) localGW, _ := GetDefaultRoute(ifname) localDNS, _ := GetDnsServer() if localIPv4 == ipv4 && localNetMask == netmask && localGW == gateway && localDNS == dns { return true, "" } // 检查文件是否存在 if _, err := os.Stat(networkConfigScript); err != nil { return false, "network Config Script not exist" } // # netconfig enp59s0f0 192.168.1.2 255.255.255.0 192.168.1.1 192.168.100.1 cmdStr := fmt.Sprintf("%s %s %s %s %s %s", networkConfigScript, ifname, ipv4, netmask, gateway, dns) stdout, err := execRootCommand(cmdStr) return err == nil, string(stdout) } // 配置时区 func TimeZone() (string, int64) { cmd := exec.Command("/bin/sh", "-c", "echo -n $TZ") tz, _ := cmd.Output() if tzstr := string(tz); tzstr != "" { return tzstr, time.Now().Unix() } zone, _ := time.Now().Zone() return zone, time.Now().Unix() } func NTPConfig() (bool, string, string) { status, server, interval := false, "", "" cron, _ := execRootCommand("crontab -l | grep ntpdate | tr -d '\n'") if task := string(cron); task != "" { status = true slice := strings.Split(task, " ") interval, server = slice[0][2:], slice[len(slice)-1] } return status, server, interval } // 设置时区 func SetTimeZone(tz string) bool { if _, err := time.LoadLocation(tz); err != nil { return false } // set env envCMD := exec.Command("/bin/sh", "-c", "TZ=%s", tz) envCMD.Run() // change permanent to the file '.profile' cleanTZ := exec.Command("/bin/sh", "-c", "sed -i '/^TZ=.*$/d' ~/.profile") cleanTZ.Run() TZ := "TZ='" + tz + "'; export TZ" appendTZCMD := fmt.Sprintf("echo \"%s\" >> ~/.profile;", TZ) appendTZ := exec.Command("/bin/sh", "-c", appendTZCMD) appendTZ.Run() return true } // 配置系统时间 func SetLocalTime(newTime string) bool { const TimeLayout = "2006-01-02 15:04:05" _, err := time.Parse(TimeLayout, newTime) if err != nil { return false } dateCMD := fmt.Sprintf("date -s \"%s\"", newTime) execRootCommand(dateCMD) stopNTPCron() return true } const NTPCRONTABFILE = "/tmp/.webServer.crontab" func EnableNTPCron(server string, interval int) bool { stopNTPCron() if ip := net.ParseIP(server); ip == nil { return false } update := fmt.Sprintf("echo \"*/%d * * * * /usr/sbin/ntpdate %s\" >> %s", interval, server, NTPCRONTABFILE) execRootCommand(update) addNTPTask := fmt.Sprintf("crontab %s", NTPCRONTABFILE) execRootCommand(addNTPTask) return true } func stopNTPCron() { update := fmt.Sprintf("crontab -l | grep -v /usr/sbin/ntpdate > %s", NTPCRONTABFILE) execRootCommand(update) cleanNTPTask := fmt.Sprintf("crontab %s", NTPCRONTABFILE) execRootCommand(cleanNTPTask) } func RunNTPDate(server string) bool { if ip := net.ParseIP(server); ip == nil { return false } ntpdate := fmt.Sprintf("/usr/sbin/ntpdate %s", server) _, err := execRootCommand(ntpdate) return err == nil } func Reboot() (bool, string) { stdout, err := execRootCommand("reboot") return err == nil, string(stdout) } // * * * * * /bin/echo "$(date) Perform basic-reboot-task" >> /tmp/webserver.crontab.log;/sbin/reboot & >> /tmp/webserver.crontab.log func ReadRebootTaskInCrontab() (bool, string) { stdout, err := execRootCommand("crontab -l | grep basic-reboot-task | sed -z -r 's/([^0-9* ]+)(.+)//g'") return err == nil, string(stdout) } func CleanRebootTask() { update := fmt.Sprintf("crontab -l | grep -v basic-reboot-task > %s", NTPCRONTABFILE) execRootCommand(update) crontab := fmt.Sprintf("crontab %s", NTPCRONTABFILE) execRootCommand(crontab) } func UpdateRebootTask(task string) bool { CleanRebootTask() tasks := fmt.Sprintf("%s /bin/echo \"$(date) Perform basic-reboot-task\" >> /tmp/webserver.crontab.log;/sbin/reboot & >> /tmp/webserver.crontab.log", task) update := fmt.Sprintf("echo '%s' >> %s", tasks, NTPCRONTABFILE) execRootCommand(update) addNTPTask := fmt.Sprintf("crontab %s", NTPCRONTABFILE) _, err := execRootCommand(addNTPTask) return err == nil } const ngConfig = "/opt/vasystem/config/system-2.0.conf" func GetNginxListenPort() string { _, err := os.Stat(ngConfig) if err != nil { return "7003" } cmdStr := fmt.Sprintf("cat %s | grep listen | awk '{printf $2}' | sed 's/;//g'", ngConfig) cmd := exec.Command("/bin/sh", "-c", cmdStr) port, err := cmd.Output() if err != nil { return "" } return string(port) } func SetNginxListenPort(port string) bool { _, err := os.Stat(ngConfig) if err != nil { return false } // 修改配置文件端口 cmdStr := fmt.Sprintf("sed -i 's/listen.*/listen %s;/' %s", port, ngConfig) cmd := exec.Command("/bin/sh", "-c", cmdStr) _, err = cmd.Output() if err != nil { return false } // 重启nginx _, err = execRootCommand("service nginx reload") return err == nil }