From b50ab8c04f6ae6097701a2a2b0f3cd9226ad77e3 Mon Sep 17 00:00:00 2001
From: zhangzengfei <zhangzengfei@iotlink.com>
Date: 星期三, 30 十月 2019 15:19:23 +0800
Subject: [PATCH] fix: change network settings

---
 extend/sys/system.go |  116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 116 insertions(+), 0 deletions(-)

diff --git a/extend/sys/system.go b/extend/sys/system.go
index 563d85b..526093e 100644
--- a/extend/sys/system.go
+++ b/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")

--
Gitblit v1.8.0