zhangzengfei
2019-10-29 b50ab8c04f6ae6097701a2a2b0f3cd9226ad77e3
extend/sys/system.go
@@ -1,14 +1,58 @@
package sys
import (
   "encoding/json"
   "errors"
   "io/ioutil"
   "net/http"
   "net/url"
   "os"
   "os/exec"
   "strconv"
   "webserver/extend/config"
   "webserver/extend/util"
   "fmt"
   "net"
   "strings"
   "time"
)
func execRootCommand(cmd string) (bool, string) {
   serverPort := config.Server.SysServerPort
   if serverPort == "" {
      serverPort = "18081"
   }
   sysConfigServer := fmt.Sprintf("http://127.0.0.1:%s/api/v1/command/exec", serverPort)
   resp, err := http.PostForm(sysConfigServer, url.Values{"command": {cmd}})
   if err != nil {
      return false, err.Error()
   }
   defer resp.Body.Close()
   body, err := ioutil.ReadAll(resp.Body)
   if err != nil {
      return false, err.Error()
   }
   type response struct {
      Code    int    `json:"code"`
      Success bool   `json:"success"`
      Msg     string `json:"msg"`
      CMD     string `json:"cmd"`
      Data    string `json:"data"`
   }
   var rsp response
   if err := json.Unmarshal(body, &rsp); err != nil {
      return false, err.Error()
   }
   fmt.Println(body)
   fmt.Println(rsp)
   return rsp.Success, rsp.Data
}
// 检查 root权限
func CheckRootPermissions() bool {
@@ -20,6 +64,78 @@
   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\" | 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/bin/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)
   // return exec.Command("/bin/sh", "-c", cmdStr).Run() == nil
   return execRootCommand(cmdStr)
}
// 配置时区
func TimeZone() (string, int64) {
   cmd := exec.Command("/bin/sh", "-c", "echo -n $TZ")