From a1ef2d42d320f075c75e8cef52a879114441c103 Mon Sep 17 00:00:00 2001
From: sunty <1172534965@qq.com>
Date: 星期三, 30 十月 2019 15:54:07 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 controllers/panTilt.go    |   32 ++++
 controllers/syssetcont.go |   46 +++++-
 config/test.yaml          |   15 ++
 scripts/netconfig         |  122 +++++++++++++++++
 extend/sys/system.go      |   96 +++++++++++++
 extend/util/util.go       |   42 ------
 extend/config/config.go   |   56 ++++---
 router/router.go          |    6 
 8 files changed, 340 insertions(+), 75 deletions(-)

diff --git a/config/test.yaml b/config/test.yaml
index b75ad1b..4c84f61 100644
--- a/config/test.yaml
+++ b/config/test.yaml
@@ -19,6 +19,21 @@
   channelCount: 0
   #纭洏涓暟
   diskCount: 2
+  #Exec root command
+  sudoPassword: 123
+  sysThresholds:
+  -
+    value: 60
+    color: #13ce66
+  -
+    value: 80
+    color: #FF9C4A
+  -
+    value: 95
+    color: #f53d3d
+  -
+    value: 100
+    color: #5d0000
 database:
   driver: sqlite
   name: sqlite3
diff --git a/controllers/panTilt.go b/controllers/panTilt.go
new file mode 100644
index 0000000..5dd318c
--- /dev/null
+++ b/controllers/panTilt.go
@@ -0,0 +1,32 @@
+package controllers
+
+import (
+	"webserver/extend/code"
+	"webserver/extend/util"
+
+	"github.com/gin-gonic/gin"
+)
+
+type PanTiltController struct {
+}
+
+type PTInstruct struct {
+	ChannelId string `json:"channelId"` //鏈嶅姟鍣╥d
+	PTZType   string `json:"ptzType"`   //杞鍛ㄦ湡
+	PTZParam  int32  `json:"ptzParam"`  //寤舵椂鏃堕棿
+}
+
+func (controller PanTiltController) Controlling(c *gin.Context) {
+	var param PTInstruct
+	if err := c.BindJSON(&param); err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎")
+		return
+	}
+
+	b := true
+	if b {
+		util.ResponseFormat(c, code.Success, "")
+	} else {
+		util.ResponseFormat(c, code.ComError, "淇濆瓨澶辫触")
+	}
+}
diff --git a/controllers/syssetcont.go b/controllers/syssetcont.go
index afab0db..8034844 100644
--- a/controllers/syssetcont.go
+++ b/controllers/syssetcont.go
@@ -159,11 +159,13 @@
 	} else {
 		resData["server_id"] = sysconf.GetServerId()
 		resData["server_name"] = sysconf.GetServerName()
-		ipv4, mask, _ := util.GetLocalIP(config.Server.NetworkAdapter)
-		gateway, _ := util.GetDefaultRoute(config.Server.NetworkAdapter)
+		ipv4, mask, _ := sys.GetLocalIP(config.Server.NetworkAdapter)
+		gateway, _ := sys.GetDefaultRoute(config.Server.NetworkAdapter)
+		dns, _ := sys.GetDnsServer()
 		resData["ip"] = ipv4
 		resData["subMask"] = mask
 		resData["gateway"] = gateway
+		resData["dns"] = dns
 
 		resData["deviceNum"] = config.Server.DeviceNum
 		resData["deviceType"] = config.Server.DeviceType
@@ -193,6 +195,14 @@
 	var api dbapi.SysSetApi
 	paramBody := make(map[string]interface{}, 0)
 	paramBody["serverName"] = dev_name
+
+	// 璁剧疆ip
+	isOk, msg := sys.SetNetworkConfig(c.PostForm("ip"), c.PostForm("subMask"), c.PostForm("gateway"), c.PostForm("dns"))
+	if !isOk {
+		util.ResponseFormat(c, code.ComError, msg)
+		return
+	}
+
 	b, data := api.SaveServerInfo(paramBody)
 	if b { // 鏌ヨ鏄惁瀛樺湪
 		util.ResponseFormat(c, code.Success, data)
@@ -308,11 +318,6 @@
 		return
 	}
 
-	if root := sys.CheckRootPermissions(); !root {
-		util.ResponseFormat(c, code.ServiceInsideError, "鏈嶅姟鍣ㄦ病鏈変慨鏀规椂闂寸殑鏉冮檺")
-		return
-	}
-
 	if args.TimeZone != "CST" && args.TimeZone != "UTC" {
 		if r := sys.SetTimeZone(args.TimeZone); !r {
 			util.ResponseFormat(c, code.RequestParamError, "鏃跺尯鍙傛暟閿欒")
@@ -346,3 +351,30 @@
 	info := sys.GetSysInfo()
 	util.ResponseFormat(c, code.UpdateSuccess, info)
 }
+
+// @Summary 鏌ヨ绯荤粺鐘舵�侀槇鍊艰缃�
+// @Description 鑾峰彇褰撳墠绯荤粺鐨勮繍琛岀姸鎬侊紝CPU, GPU, 鍐呭瓨鐨勯槇鍊奸厤缃�
+// @Produce json
+// @Tags sysset
+// @Success 200 {string} json "{"code":200, msg:"鐩綍缁撴瀯鏁版嵁", success:true}"
+// @Failure 500 {string} json "{"code":500,  msg:"杩斿洖閿欒淇℃伅", success:false}"
+// @Router /data/api-v/sysset/sysThresholds [GET]
+func (sset SysSetController) GetSysThresholds(c *gin.Context) {
+	util.ResponseFormat(c, code.UpdateSuccess, config.Server.SysThresholds)
+}
+
+// @Summary 閲嶅惎绯荤粺
+// @Description 閲嶅惎鎿嶄綔绯荤粺
+// @Produce json
+// @Tags sysset
+// @Success 200 {string} json "{"code":200, msg:"鐩綍缁撴瀯鏁版嵁", success:true}"
+// @Failure 500 {string} json "{"code":500,  msg:"杩斿洖閿欒淇℃伅", success:false}"
+// @Router /data/api-v/sysset/reboot [GET]
+func (sset SysSetController) RebootOS(c *gin.Context) {
+	if isOk, msg := sys.Reboot(); !isOk {
+		util.ResponseFormat(c, code.UpdateFail, msg)
+		return
+	}
+
+	util.ResponseFormat(c, code.Success, "姝e湪閲嶅惎")
+}
diff --git a/extend/config/config.go b/extend/config/config.go
index 0a7b6b0..c775712 100644
--- a/extend/config/config.go
+++ b/extend/config/config.go
@@ -1,33 +1,41 @@
 package config
 
 import (
-	"github.com/spf13/viper"
 	"log"
+
+	"github.com/spf13/viper"
 )
 
+type threshold struct {
+	Value int    `mapstructure: "value"`
+	Color string `mapstructure: "color"`
+}
 type server struct {
-	Runmode   string `mapstructure: "runmode"`
-	JwtSecret string `mapstructure: "jwtSecret"`
-	JwtExpire string `mapstructure: "jwtExpire"`
-	Url       string `mapstructure: "url"`
-	AnalyServerId string `mapstructure: "analyServerId"`
+	Runmode        string `mapstructure: "runmode"`
+	JwtSecret      string `mapstructure: "jwtSecret"`
+	JwtExpire      string `mapstructure: "jwtExpire"`
+	Url            string `mapstructure: "url"`
+	AnalyServerId  string `mapstructure: "analyServerId"`
 	NetworkAdapter string `mapstructure: "networkAdapter"`
 
-	DeviceNum string `mapstructure: "deviceNum"` //璁惧缂栧彿
-	DeviceType string `mapstructure: "deviceType"`  //璁惧鍨嬪彿
-	DeviceSerialNum string `mapstructure: "deviceSerialNum"`  //璁惧搴忓垪鍙�
-	MasterVersion string `mapstructure: "masterVersion"` //涓绘帶鐗堟湰
-	WebVersion string `mapstructure: "webVersion"`  //web鐗堟湰
-	ChannelCount string `mapstructure: "channelCount"`  //閫氶亾涓暟
-	DiskCount string `mapstructure: "diskCount"`  //纭洏涓暟
+	DeviceNum       string `mapstructure: "deviceNum"`       //璁惧缂栧彿
+	DeviceType      string `mapstructure: "deviceType"`      //璁惧鍨嬪彿
+	DeviceSerialNum string `mapstructure: "deviceSerialNum"` //璁惧搴忓垪鍙�
+	MasterVersion   string `mapstructure: "masterVersion"`   //涓绘帶鐗堟湰
+	WebVersion      string `mapstructure: "webVersion"`      //web鐗堟湰
+	ChannelCount    string `mapstructure: "channelCount"`    //閫氶亾涓暟
+	DiskCount       string `mapstructure: "diskCount"`       //纭洏涓暟
+
+	SudoPassword  string      `mapstructure: "sudoPassword"`
+	SysThresholds []threshold `mapstructure: "sysThresholds"`
 }
 
 var Server = &server{}
 
 // wp add es 绱㈠紩 浠ュ強 IP port
 type esinfo struct {
-	Shards string		 `mapstructure:"shards"`
-	EsIndex  esindexlist `mapstructure:"index"`
+	Shards  string      `mapstructure:"shards"`
+	EsIndex esindexlist `mapstructure:"index"`
 }
 
 type esindexlist struct {
@@ -42,7 +50,7 @@
 }
 
 type sopath struct {
-	Ip string `mapstructure:"ip"`
+	Ip   string `mapstructure:"ip"`
 	Port string `mapstructure:"port"`
 }
 
@@ -51,18 +59,18 @@
 var EsInfo = &esinfo{}
 
 type facedetect struct {
-	Ip string `mapstructure:"Ip"`
-	Port int `mapstructure:"port"`
+	Ip   string `mapstructure:"Ip"`
+	Port int    `mapstructure:"port"`
 }
 
 type dbpersoncompare struct {
-	Ip string `mapstructure:"ip"`
-	Port int `mapstructure:"port"`
+	Ip   string `mapstructure:"ip"`
+	Port int    `mapstructure:"port"`
 }
 
 type espersoncompare struct {
-	Port int `mapstructure:"port"`
-	Ips []string `mapstructure:"ips"`
+	Port int      `mapstructure:"port"`
+	Ips  []string `mapstructure:"ips"`
 }
 
 var DbPersonCompInfo = &dbpersoncompare{}
@@ -84,8 +92,8 @@
 	}
 	viper.UnmarshalKey("es", EsInfo)
 	viper.UnmarshalKey("server", Server)
-	viper.UnmarshalKey("sopath",SoPath)
+	viper.UnmarshalKey("sopath", SoPath)
 	viper.UnmarshalKey("facedetect", FaceDetectSet)
-	viper.UnmarshalKey("dbpersoncompare",DbPersonCompInfo)
+	viper.UnmarshalKey("dbpersoncompare", DbPersonCompInfo)
 	viper.UnmarshalKey("espersoncompare", EsCompServerInfo)
 }
diff --git a/extend/sys/system.go b/extend/sys/system.go
index 563d85b..cccba7e 100644
--- a/extend/sys/system.go
+++ b/extend/sys/system.go
@@ -2,13 +2,24 @@
 
 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/sh", "-c", cmdStr).Output()
+}
 
 // 妫�鏌� root鏉冮檺
 func CheckRootPermissions() bool {
@@ -18,6 +29,79 @@
 	}
 
 	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)
+	stdout, err := execRootCommand(cmdStr)
+
+	return err == nil, string(stdout)
 }
 
 // 閰嶇疆鏃跺尯
@@ -76,8 +160,10 @@
 		return false
 	}
 
-	args := []string{"-s", newTime}
-	exec.Command("date", args...).Run()
+	// args := []string{"-s", newTime}
+	// exec.Command("date", args...).Run()
+	dateCMD := fmt.Sprintf("date -s \"%s\"", newTime)
+	execRootCommand(dateCMD)
 	stopNTPCron()
 
 	return true
@@ -111,3 +197,9 @@
 	ntpdate := fmt.Sprintf("/usr/sbin/ntpdate %s", server)
 	return true, exec.Command("/bin/sh", "-c", ntpdate).Run()
 }
+
+func Reboot() (bool, string) {
+	stdout, err := execRootCommand("reboot")
+
+	return err == nil, string(stdout)
+}
diff --git a/extend/util/util.go b/extend/util/util.go
index e680ee6..542dd2c 100644
--- a/extend/util/util.go
+++ b/extend/util/util.go
@@ -3,12 +3,9 @@
 import (
 	"bytes"
 	"encoding/json"
-	"errors"
 	"image"
 	"io/ioutil"
-	"net"
 	"net/http"
-	"os/exec"
 	"strconv"
 	"webserver/extend/code"
 
@@ -134,45 +131,6 @@
 		y1_new = int(i.Height)
 	}
 	return
-}
-
-// 鑾峰彇鏈満缃戝崱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(), IpIntToString(int(mask64)), nil
-					}
-				}
-			}
-		}
-	}
-	return "", "", errors.New("ipv4 not found")
-}
-
-func GetDefaultRoute(networkName string) (route string, err error) {
-	cmdStr := fmt.Sprintf("ip route show | grep -P \"^default.*%s\" | awk '{print $3}'", networkName)
-	cmd := exec.Command("/bin/sh", "-c", cmdStr)
-	b, err := cmd.Output()
-	if err != nil {
-		return "", err
-	}
-
-	return string(b), nil
 }
 
 func StringIpToInt(ipstring string) int {
diff --git a/router/router.go b/router/router.go
index 440edef..abc6ffe 100644
--- a/router/router.go
+++ b/router/router.go
@@ -42,6 +42,7 @@
 	sysMenuController := new(controllers.SysMenuController)
 	clusterController := new(controllers.ClusterController)
 	sysRoleController := new(controllers.RoleController)
+	ptController := new(controllers.PanTiltController)
 
 	sysApi := r.Group("/data/api-u/sys")
 	{
@@ -99,6 +100,8 @@
 		camera.POST("/updateRunEnable", cameraController.UpdateRunEnable)
 		camera.POST("/changeRunType", cameraController.ChangeRunType)
 		camera.GET("/getAllCamerasByServer", cameraController.GetAllCamerasByServer)
+
+		camera.POST("/ptControl", ptController.Controlling)
 	}
 
 	cameraTaskArgsApi := r.Group(urlPrefix + "/cameraTaskArgs")
@@ -203,6 +206,9 @@
 		vsset.POST("/updateClock", ssController.SetSysClock)
 		vsset.GET("/ntpTest", ssController.TestNTPServer)
 		vsset.GET("/sysinfo", ssController.GetSysInfo)
+		vsset.GET("/sysThresholds", ssController.GetSysThresholds)
+
+		vsset.GET("/reboot", ssController.RebootOS)
 	}
 
 	//绠楁硶搴撴搷浣�
diff --git a/scripts/netconfig b/scripts/netconfig
new file mode 100644
index 0000000..6b9fae0
--- /dev/null
+++ b/scripts/netconfig
@@ -0,0 +1,122 @@
+#!/bin/bash
+
+# 绯荤粺缃戠粶閰嶇疆鏂囦欢
+NETWORK_CONFIG_FILE="/etc/network/interfaces"
+LOG_FILE="/opt/vasystem/logs/netconfig.log"
+
+# basic绯荤粺鏈嶅姟鍏抽棴鑴氭湰
+SERVICE_STOP_CMD=""
+# basic绯荤粺鏈嶅姟鍚姩鑴氭湰
+SERVICE_START_CMD=""
+
+INTERFACE="$1"
+IPADDR="$2"
+NETMASK="$3"
+GATEWAY="$4"
+DNSSERVER="$5"
+
+Usage(){
+    cat <<EOF
+$0 : missing operand
+Usage:
+    $0 <ifname> <ipaddr> <netmask> <gateway> [dns-server]
+EOF
+    exit 1
+}
+
+n_log() {
+    v_time=$(date "+%Y-%m-%d %H:%M:%S")
+    echo "$v_time $*" >>$LOG_FILE
+}
+
+write_interfaces()
+{
+echo "auto lo
+iface lo inet loopback
+
+auto $INTERFACE
+iface $INTERFACE inet static
+address $IPADDR
+netmask $NETMASK
+gateway $GATEWAY
+dns-nameserver $DNSSERVER
+" > $NETWORK_CONFIG_FILE
+
+ret=$?
+n_log "write_interfaces. ret: $ret"
+
+return $ret
+}
+
+validate_ip()
+{
+    if [[ $1 =~ ^([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$ ]]; then
+        return 0
+    fi
+
+    return 1
+}
+
+network_restart()
+{
+    # 閲嶅惎缃戠粶
+    /etc/init.d/networking restart
+    ip addr flush dev $INTERFACE
+    ifdown $INTERFACE
+    ifup $INTERFACE
+
+    n_log "network restart."
+
+    sleep 3
+}
+
+service_restart()
+{
+    n_log "service restart." >>$LOG_FILE
+
+    # 閲嶅惎basic鏈嶅姟
+    su basic -c "sh /opt/startAllServices.sh &"
+}
+
+# Start Execution
+
+n_log "Start NetConfig Execution, CMD: $*"
+# 鏍¢獙鍙傛暟涓暟
+if [ $# -lt 4 ]; then
+    Usage
+fi
+
+# 楠岃瘉鎺ュ彛鏄惁瀛樺湪
+ifconfig | grep -q $INTERFACE || exit 1
+
+# 鏍¢獙IP鍚堟硶鎬�
+i=0
+while [ $# -ne 0 ]
+do
+    if [ $i -gt 0 -a $i -lt 4 ]; then
+        validate_ip $1 || exit 1
+    fi
+    shift
+    let i+=1
+done
+
+if [ "$DNSSERVER" == "" ]; then
+    DNSSERVER=$GATEWAY
+fi
+
+# 閰嶇疆鎺ュ彛
+write_interfaces || {
+    echo -n "write interfaces failure"
+    exit 1
+}
+
+# 閲嶅惎缃戠粶
+network_restart
+
+# 閲嶅惎鐩稿叧鏈嶅姟, 涓嶆洿鏀筰p鐨勬儏鍐典笅, 閲嶅惎缃戠粶鍗冲彲
+localip=$(/sbin/ifconfig $INTERFACE | grep inet | grep -v inet6 | awk '{printf $2}' | tr -d "addr:")
+if [ "$localip" != "$IPADDR" ]; then
+    service_restart
+fi
+
+exit 0
\ No newline at end of file

--
Gitblit v1.8.0