From e871758bd82d9a4fbce42e43c9665d869c240dfb Mon Sep 17 00:00:00 2001
From: zhangzengfei <zhangzengfei@iotlink.com>
Date: 星期一, 21 十月 2019 15:12:11 +0800
Subject: [PATCH] feat: add api for system clock update

---
 controllers/syssetcont.go |  214 +++++++++++++++++++-------
 extend/sys/system.go      |  113 ++++++++++++++
 extend/util/util.go       |   66 ++++----
 router/router.go          |   57 +++---
 4 files changed, 332 insertions(+), 118 deletions(-)

diff --git a/controllers/syssetcont.go b/controllers/syssetcont.go
index 977aeb5..6cd0e0a 100644
--- a/controllers/syssetcont.go
+++ b/controllers/syssetcont.go
@@ -1,45 +1,54 @@
 package controllers
 
 import (
-	"basic.com/dbapi.git"
-	"github.com/gin-gonic/gin"
 	"webserver/extend/code"
 	"webserver/extend/config"
+	"webserver/extend/sys"
 	"webserver/extend/util"
+
+	"basic.com/dbapi.git"
+	"github.com/gin-gonic/gin"
 )
 
 type SysSetController struct {
-
 }
 
 type LocalConfigVo struct {
-	Id string  `json:"id"`
-	AlarmIp string `json:"alarm_ip,omitempty" example:"192.168.1.182"`
-	AlarmPort int `json:"alarm_port,omitempty" example:"22122"`
-	AlarmThresholdType int `json:"alarm_threshold_type"`//鎶ヨ闃堝�肩被鍨嬭缃細1:鎸夋渶楂樺垎,2:鎸夐槇鍊间互涓�
-	AlarmThreshold int `json:"alarm_threshold"`//鎶ヨ闃堝��
-	WebPicIp string `json:"web_pic_ip,omitempty" example:""`
-	WebPicPort int `json:"web_pic_port,omitempty" example:"22122"`
-	EsPicIp string `json:"es_pic_ip,omitempty" example:""`
-	EsPicPort  int `json:"es_pic_port,omitempty" example:"22122"`
-	CutMaxDuration int `json:"cut_max_duration,omitempty" example:"20"`
-	CutMinDuration int `json:"cut_min_duration,omitempty" example:"5"`
-	ServerId string `json:"server_id,omitempty" example:"鍒嗘瀽璁惧id"`
-	ServerName string `json:"server_name,omitempty" example:"鍒嗘瀽璁惧鍚嶇О"`
-	ServerType int `json:"server_type,omitempty" example:"1"`
-	Reserved string `json:"reserved,omitempty" example:"1"`
-	RealMax int `json:"real_max"`//瀹炴椂澶勭悊鐨勬渶澶ц矾鏁�
+	Id                 string `json:"id"`
+	AlarmIp            string `json:"alarm_ip,omitempty" example:"192.168.1.182"`
+	AlarmPort          int    `json:"alarm_port,omitempty" example:"22122"`
+	AlarmThresholdType int    `json:"alarm_threshold_type"` //鎶ヨ闃堝�肩被鍨嬭缃細1:鎸夋渶楂樺垎,2:鎸夐槇鍊间互涓�
+	AlarmThreshold     int    `json:"alarm_threshold"`      //鎶ヨ闃堝��
+	WebPicIp           string `json:"web_pic_ip,omitempty" example:""`
+	WebPicPort         int    `json:"web_pic_port,omitempty" example:"22122"`
+	EsPicIp            string `json:"es_pic_ip,omitempty" example:""`
+	EsPicPort          int    `json:"es_pic_port,omitempty" example:"22122"`
+	CutMaxDuration     int    `json:"cut_max_duration,omitempty" example:"20"`
+	CutMinDuration     int    `json:"cut_min_duration,omitempty" example:"5"`
+	ServerId           string `json:"server_id,omitempty" example:"鍒嗘瀽璁惧id"`
+	ServerName         string `json:"server_name,omitempty" example:"鍒嗘瀽璁惧鍚嶇О"`
+	ServerType         int    `json:"server_type,omitempty" example:"1"`
+	Reserved           string `json:"reserved,omitempty" example:"1"`
+	RealMax            int    `json:"real_max"` //瀹炴椂澶勭悊鐨勬渶澶ц矾鏁�
 }
 
 type Gb28181ConfigVo struct {
-	Id string `json:"Id"`
-	ServerIp string `json:"ServerIp" example:"鍥芥爣鏈嶅姟鍣↖P"`
-	ServerPort int `json:"ServerPort" example:"骞冲彴鏈嶅姟绔彛:7060"`
-	PublicId string `json:"PublicId" example:"骞冲彴鏈嶅姟Id"`
-	GbServerPort int `json:"GbServerPort" example:"鍥芥爣鏈嶅姟绔彛:8060"`
-	IsAuth bool `json:"IsAuth" example:"鏄惁寮�鍚壌鏉�:true"`
-	Password string `json:"Password" example:"瀵嗙爜"`
-	UpdateTime string `json:"UpdateTime"`
+	Id           string `json:"Id"`
+	ServerIp     string `json:"ServerIp" example:"鍥芥爣鏈嶅姟鍣↖P"`
+	ServerPort   int    `json:"ServerPort" example:"骞冲彴鏈嶅姟绔彛:7060"`
+	PublicId     string `json:"PublicId" example:"骞冲彴鏈嶅姟Id"`
+	GbServerPort int    `json:"GbServerPort" example:"鍥芥爣鏈嶅姟绔彛:8060"`
+	IsAuth       bool   `json:"IsAuth" example:"鏄惁寮�鍚壌鏉�:true"`
+	Password     string `json:"Password" example:"瀵嗙爜"`
+	UpdateTime   string `json:"UpdateTime"`
+}
+
+type SysClockConfigVo struct {
+	TimeZone  string `json:"timeZone" example:"鏃跺尯"`
+	NTP       bool   `json:"ntp" example:"NTP鏍℃椂"`
+	NTPServer string `json:"ntpServer" example:"NTP鏈嶅姟鍣ㄥ湴鍧�"`
+	Interval  int    `json:"interval" example:"鑷姩鏍℃椂闂撮殧"`
+	NewTime   string `json:"newTime" example:"鎵嬪姩鎸囧畾鏃堕棿"`
 }
 
 // @Summary 瀛樺偍淇℃伅鏌ヨ
@@ -50,13 +59,13 @@
 // @Success 200 {string} json "{"code":200, msg:"鐩綍缁撴瀯鏁版嵁", success:true}"
 // @Failure 500 {string} json "{"code":500,  msg:"杩斿洖閿欒淇℃伅", success:false}"
 // @Router /data/api-v/sysset/alarmServerShow [GET]
-func (sset SysSetController) AlarmServerShow(c *gin.Context){
+func (sset SysSetController) AlarmServerShow(c *gin.Context) {
 	var api dbapi.SysSetApi
 	b, sysconf := api.GetServerInfo()
-	if b{
-		util.ResponseFormat(c,code.Success,sysconf)
+	if b {
+		util.ResponseFormat(c, code.Success, sysconf)
 	} else {
-		util.ResponseFormat(c,code.ComError,"鏌ヨ澶辫触")
+		util.ResponseFormat(c, code.ComError, "鏌ヨ澶辫触")
 	}
 }
 
@@ -72,17 +81,17 @@
 func (sset SysSetController) AlarmEdit(c *gin.Context) {
 	var args LocalConfigVo
 	err := c.BindJSON(&args)
-	if err !=nil {
-		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
+	if err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎")
 		return
 	}
 	var api dbapi.SysSetApi
 	paramBody := util.Struct2Map(args)
-	b,data := api.AlarmEdit(paramBody)
+	b, data := api.AlarmEdit(paramBody)
 	if b {
-		util.ResponseFormat(c,code.Success,data)
-	}else {
-		util.ResponseFormat(c,code.ComError,"淇濆瓨澶辫触")
+		util.ResponseFormat(c, code.Success, data)
+	} else {
+		util.ResponseFormat(c, code.ComError, "淇濆瓨澶辫触")
 	}
 }
 
@@ -94,7 +103,7 @@
 // @Success 200 {string} json "{"code":200, msg:"鐩綍缁撴瀯鏁版嵁", success:true}"
 // @Failure 500 {string} json "{"code":500,  msg:"杩斿洖閿欒淇℃伅", success:false}"
 // @Router /data/api-v/sysset/videoLenShow [GET]
-func (sset SysSetController) VideoLenShow(c *gin.Context){
+func (sset SysSetController) VideoLenShow(c *gin.Context) {
 	var api dbapi.SysSetApi
 	b, sysconf := api.GetServerInfo()
 	if b {
@@ -104,7 +113,7 @@
 		// 瀛樺湪鍒欎慨鏀�
 		util.ResponseFormat(c, code.Success, resData)
 	} else {
-		util.ResponseFormat(c,code.ComError,"鏌ヨ澶辫触")
+		util.ResponseFormat(c, code.ComError, "鏌ヨ澶辫触")
 	}
 }
 
@@ -125,11 +134,11 @@
 	max_video_len := c.Request.FormValue("max_video_len")
 	min_video_len := c.Request.FormValue("min_video_len")
 	var api dbapi.SysSetApi
-	b,data := api.VideoLenEdit(max_video_len,min_video_len)
-	if b{
-		util.ResponseFormat(c,code.UpdateSuccess,data)
+	b, data := api.VideoLenEdit(max_video_len, min_video_len)
+	if b {
+		util.ResponseFormat(c, code.UpdateSuccess, data)
 	} else {
-		util.ResponseFormat(c,code.ComError,"淇濆瓨澶辫触")
+		util.ResponseFormat(c, code.ComError, "淇濆瓨澶辫触")
 	}
 }
 
@@ -146,8 +155,8 @@
 	b, sysconf := api.GetServerInfo()
 	resData := make(map[string]string, 0)
 	if !b { // 鏌ヨ鏄惁瀛樺湪
-		util.ResponseFormat(c, code.ServiceInsideError,"鏌ヨ澶辫触")
-	}else {
+		util.ResponseFormat(c, code.ServiceInsideError, "鏌ヨ澶辫触")
+	} else {
 		resData["server_id"] = sysconf.GetServerId()
 		resData["server_name"] = sysconf.GetServerName()
 		ipv4, mask, _ := util.GetLocalIP(config.Server.NetworkAdapter)
@@ -178,20 +187,19 @@
 // @Success 200 {string} json "{"code":200, msg:"鐩綍缁撴瀯鏁版嵁", success:true}"
 // @Failure 500 {string} json "{"code":500,  msg:"杩斿洖閿欒淇℃伅", success:false}"
 // @Router /data/api-v/sysset/saveDevInfo [POST]
-func (sset SysSetController) SaveDevInfo(c *gin.Context){
+func (sset SysSetController) SaveDevInfo(c *gin.Context) {
 
 	dev_name := c.PostForm("server_name")
 	var api dbapi.SysSetApi
-	paramBody :=make(map[string]interface{},0)
+	paramBody := make(map[string]interface{}, 0)
 	paramBody["serverName"] = dev_name
-	b,data := api.SaveServerInfo(paramBody)
+	b, data := api.SaveServerInfo(paramBody)
 	if b { // 鏌ヨ鏄惁瀛樺湪
-		util.ResponseFormat(c,code.Success,data)
-	} else {  // 瀛樺湪鍙婁慨鏀� 涓嶅瓨鍦� 鍗虫坊鍔�
-		util.ResponseFormat(c,code.ComError,"淇濆瓨澶辫触")
+		util.ResponseFormat(c, code.Success, data)
+	} else { // 瀛樺湪鍙婁慨鏀� 涓嶅瓨鍦� 鍗虫坊鍔�
+		util.ResponseFormat(c, code.ComError, "淇濆瓨澶辫触")
 	}
 }
-
 
 // @Summary GB28181璁剧疆鏌ヨ
 // @Description GB28181璁剧疆淇℃伅鏌ヨ
@@ -205,9 +213,9 @@
 	var api dbapi.SysSetApi
 	b, data := api.Gb28181ConfigShow()
 	if b {
-		util.ResponseFormat(c,code.Success,data)
+		util.ResponseFormat(c, code.Success, data)
 	} else {
-		util.ResponseFormat(c,code.ComError,"鏌ヨ澶辫触")
+		util.ResponseFormat(c, code.ComError, "鏌ヨ澶辫触")
 	}
 }
 
@@ -223,16 +231,106 @@
 func (sset SysSetController) Gb28181ConfigEdit(c *gin.Context) {
 	var args Gb28181ConfigVo
 	err := c.BindJSON(&args)
-	if err !=nil {
-		util.ResponseFormat(c,code.RequestParamError,"鍙傛暟鏈夎")
+	if err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎")
 		return
 	}
 	var api dbapi.SysSetApi
 	paramBody := util.Struct2Map(args)
 	b, data := api.Gb28181ConfigEdit(paramBody)
 	if b {
-		util.ResponseFormat(c,code.UpdateSuccess,data)
+		util.ResponseFormat(c, code.UpdateSuccess, data)
 	} else {
-		util.ResponseFormat(c,code.ComError,"鏇存柊澶辫触")
+		util.ResponseFormat(c, code.ComError, "鏇存柊澶辫触")
 	}
 }
+
+// @Summary 鑾峰彇鏃堕棿閰嶇疆
+// @Description  绯荤粺鏃堕棿閰嶇疆淇℃伅
+// @Accept  json
+// @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/clockInfo [GET]
+func (sset SysSetController) GetClockinfo(c *gin.Context) {
+	resData := make(map[string]interface{}, 0)
+	resData["time_zone"], resData["local_time"] = sys.TimeZone()
+	resData["ntp"], resData["ntp_server"], resData["interval"] = sys.NTPConfig()
+
+	util.ResponseFormat(c, code.Success, resData)
+}
+
+// @Summary 娴嬭瘯鍚屾鏃堕棿
+// @Description 娴嬭瘯鍚屾鏃堕棿鏈嶅姟鍣ㄦ槸鍚﹀彲鐢�
+// @Accept  json
+// @Produce json
+// @Tags sysset
+// @Param server query string true "鏃堕棿鏈嶅姟鍣╥p"
+// @Success 200 {string} json "{"code":200, msg:"鐩綍缁撴瀯鏁版嵁", success:true}"
+// @Failure 500 {string} json "{"code":500,  msg:"杩斿洖閿欒淇℃伅", success:false}"
+// @Router /data/api-v/sysset/ntpTest [GET]
+func (sset SysSetController) TestNTPServer(c *gin.Context) {
+	ntpServer := c.Query("server")
+
+	if root := sys.CheckRootPermissions(); !root {
+		util.ResponseFormat(c, code.ServiceInsideError, "鏈嶅姟鍣ㄦ病鏈変慨鏀规椂闂寸殑鏉冮檺")
+		return
+	}
+
+	isIP, err := sys.RunNTPDate(ntpServer)
+	if !isIP {
+		util.ResponseFormat(c, code.RequestParamError, "鎸囧畾鐨勬湇鍔″櫒鍦板潃閿欒")
+		return
+	}
+
+	if err == nil {
+		util.ResponseFormat(c, code.Success, "")
+	} else {
+		util.ResponseFormat(c, code.TaskStoped, "")
+	}
+}
+
+// @Summary 璁剧疆绯荤粺鏃堕棿
+// @Description 鏍℃绯荤粺鏃堕棿
+// @Accept  json
+// @Produce json
+// @Tags sysset
+// @Param config body controllers.SysClockConfigVo true "鏍℃椂淇℃伅"
+// @Success 200 {string} json "{"code":200, msg:"鐩綍缁撴瀯鏁版嵁", success:true}"
+// @Failure 500 {string} json "{"code":500,  msg:"杩斿洖閿欒淇℃伅", success:false}"
+// @Router /data/api-v/sysset/updateClock [POST]
+func (sset SysSetController) SetSysClock(c *gin.Context) {
+	var args SysClockConfigVo
+	err := c.BindJSON(&args)
+	if err != nil {
+		util.ResponseFormat(c, code.RequestParamError, "鍙傛暟鏈夎")
+		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, "鏃跺尯鍙傛暟閿欒")
+			return
+		}
+	}
+
+	if !args.NTP {
+		if r := sys.SetLocalTime(args.NewTime); !r {
+			util.ResponseFormat(c, code.RequestParamError, "鎸囧畾鐨勬椂闂村弬鏁伴敊璇�")
+			return
+		}
+	} else {
+		if r := sys.EnableNTPCron(args.NTPServer, args.Interval); !r {
+			util.ResponseFormat(c, code.RequestParamError, "鎸囧畾鐨勬湇鍔″櫒鍦板潃閿欒")
+			return
+		}
+	}
+
+	util.ResponseFormat(c, code.UpdateSuccess, "閰嶇疆鎴愬姛")
+}
diff --git a/extend/sys/system.go b/extend/sys/system.go
new file mode 100644
index 0000000..563d85b
--- /dev/null
+++ b/extend/sys/system.go
@@ -0,0 +1,113 @@
+package sys
+
+import (
+	"errors"
+	"os/exec"
+
+	"fmt"
+	"net"
+	"strings"
+	"time"
+)
+
+// 妫�鏌� root鏉冮檺
+func CheckRootPermissions() bool {
+	showRootCMD := exec.Command("/bin/sh", "-c", "ls /root/")
+	if _, err := showRootCMD.Output(); err != nil {
+		return false
+	}
+
+	return true
+}
+
+// 閰嶇疆鏃跺尯
+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, "", ""
+
+	cmd := exec.Command("/bin/sh", "-c", "crontab -l | grep ntpdate | tr -d '\n'")
+	cron, _ := cmd.Output()
+	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
+	}
+
+	args := []string{"-s", newTime}
+	exec.Command("date", args...).Run()
+	stopNTPCron()
+
+	return true
+}
+
+const NTPCRONTABFILE = "~/.webServer.crontab"
+
+func EnableNTPCron(server string, interval int) bool {
+	stopNTPCron()
+
+	if ip := net.ParseIP(server); ip == nil {
+		return false
+	}
+
+	addTask := fmt.Sprintf("echo \"*/%d * * * * /usr/sbin/ntpdate %s\" >> %s; crontab %s", interval, server, NTPCRONTABFILE, NTPCRONTABFILE)
+	exec.Command("/bin/sh", "-c", addTask).Run()
+
+	return true
+}
+
+func stopNTPCron() {
+	cleanTask := fmt.Sprintf("crontab -l | grep -v /usr/sbin/ntpdate > %s; crontab %s", NTPCRONTABFILE, NTPCRONTABFILE)
+	exec.Command("/bin/sh", "-c", cleanTask).Run()
+}
+
+func RunNTPDate(server string) (bool, error) {
+	if ip := net.ParseIP(server); ip == nil {
+		return false, errors.New("鍙傛暟閿欒")
+	}
+
+	ntpdate := fmt.Sprintf("/usr/sbin/ntpdate %s", server)
+	return true, exec.Command("/bin/sh", "-c", ntpdate).Run()
+}
diff --git a/extend/util/util.go b/extend/util/util.go
index 16aecd5..e680ee6 100644
--- a/extend/util/util.go
+++ b/extend/util/util.go
@@ -1,14 +1,9 @@
 package util
 
 import (
-	"basic.com/pubsub/protomsg.git"
 	"bytes"
 	"encoding/json"
 	"errors"
-	"github.com/gin-gonic/gin"
-	"github.com/golang/glog"
-	"github.com/pierrec/lz4"
-	"gocv.io/x/gocv"
 	"image"
 	"io/ioutil"
 	"net"
@@ -16,6 +11,12 @@
 	"os/exec"
 	"strconv"
 	"webserver/extend/code"
+
+	"basic.com/pubsub/protomsg.git"
+	"github.com/gin-gonic/gin"
+	"github.com/golang/glog"
+	"github.com/pierrec/lz4"
+	"gocv.io/x/gocv"
 
 	"crypto/rand"
 	"fmt"
@@ -60,14 +61,14 @@
 
 //struct杞琺ap
 func Struct2Map(obj interface{}) map[string]interface{} {
-	resultMap :=make(map[string]interface{},0)
+	resultMap := make(map[string]interface{}, 0)
 	bytesData, err := json.Marshal(obj)
-	if err !=nil {
+	if err != nil {
 		return resultMap
 	}
 	json.Unmarshal(bytesData, &resultMap)
 	return resultMap
-	
+
 	//
 	//t := reflect.TypeOf(obj)
 	//v := reflect.ValueOf(obj)
@@ -79,21 +80,21 @@
 	//return data
 }
 
-func ReadImgData(url string) ([]byte,error) {
-	resp,err := http.Get(url)
-	if err !=nil {
-		return nil,err
+func ReadImgData(url string) ([]byte, error) {
+	resp, err := http.Get(url)
+	if err != nil {
+		return nil, err
 	}
 	defer resp.Body.Close()
-	pix,err := ioutil.ReadAll(resp.Body)
-	if err !=nil {
-		return nil,err
+	pix, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
 	}
-	return pix,nil
+	return pix, nil
 }
 
 // 鎸夊昂瀵稿幓鍒囧浘
-func SubImg(i protomsg.Image, x0, y0, x1, y1 int, ) []byte {
+func SubImg(i protomsg.Image, x0, y0, x1, y1 int) []byte {
 	img, _ := gocv.NewMatFromBytes(int(i.Height), int(i.Width), gocv.MatTypeCV8UC3, i.Data)
 	rect := image.Rect(EnlargeSize(x0, y0, x1, y1, i))
 	region := img.Region(rect)
@@ -135,44 +136,43 @@
 	return
 }
 
-
 // 鑾峰彇鏈満缃戝崱IP
-func GetLocalIP(networkName string) (ipv4 string,mask string, err error) {
+func GetLocalIP(networkName string) (ipv4 string, mask string, err error) {
 	interfaces, err := net.Interfaces()
 	if err != nil {
-		return "","", err
+		return "", "", err
 	}
 
 	for _, i := range interfaces {
 		byName, err := net.InterfaceByName(i.Name)
 		if err != nil {
-			return "","", err
+			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{
+			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 ipnet.IP.String(), IpIntToString(int(mask64)), nil
 					}
 				}
 			}
 		}
 	}
-	return "","", errors.New("ipv4 not found")
+	return "", "", errors.New("ipv4 not found")
 }
 
-func GetDefaultRoute(networkName string)(route string,err error){
-	cmdStr := fmt.Sprintf("route | grep -P \"^default.*%s$\" | awk '{print $2}'",networkName)
-	cmd := exec.Command("/bin/sh","-c",cmdStr)
+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
+	if err != nil {
+		return "", err
 	}
-	return string(b),nil
 
+	return string(b), nil
 }
 
 func StringIpToInt(ipstring string) int {
@@ -188,7 +188,7 @@
 	return ipInt
 }
 
-func IpIntToString(ipInt int) string{
+func IpIntToString(ipInt int) string {
 	ipSegs := make([]string, 4)
 	var len int = len(ipSegs)
 	buffer := bytes.NewBufferString("")
diff --git a/router/router.go b/router/router.go
index e548e2b..76c7ec2 100644
--- a/router/router.go
+++ b/router/router.go
@@ -1,13 +1,14 @@
 package router
 
 import (
-	"github.com/gin-gonic/gin"
-	"github.com/swaggo/gin-swagger"
-	"github.com/swaggo/gin-swagger/swaggerFiles"
-	"github.com/szuecs/gin-glog"
 	"time"
 	"webserver/controllers"
 	"webserver/middlewares/auth"
+
+	"github.com/gin-gonic/gin"
+	ginSwagger "github.com/swaggo/gin-swagger"
+	"github.com/swaggo/gin-swagger/swaggerFiles"
+	ginglog "github.com/szuecs/gin-glog"
 
 	_ "webserver/docs"
 )
@@ -16,7 +17,7 @@
 	r := gin.Default()
 	r.Use(ginglog.Logger(3 * time.Second))
 
-	r.Use(auth.AuthHandler())//auth杩囨护鍣�
+	r.Use(auth.AuthHandler()) //auth杩囨护鍣�
 
 	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
 
@@ -38,31 +39,30 @@
 	eventPushController := new(controllers.EventPushController)
 	pollConfigController := new(controllers.PollConfigController)
 	fileController := new(controllers.FileController)
-	sysMenuController :=new(controllers.SysMenuController)
-	clusterController :=new(controllers.ClusterController)
-	sysRoleController :=new(controllers.RoleController)
+	sysMenuController := new(controllers.SysMenuController)
+	clusterController := new(controllers.ClusterController)
+	sysRoleController := new(controllers.RoleController)
 
-
-	sysApi := r.Group(  "/data/api-u/sys")
+	sysApi := r.Group("/data/api-u/sys")
 	{
-		sysApi.POST("/login",userController.Login)
-		sysApi.GET("/logout",userController.Logout)
-		sysApi.POST("refresh_token",userController.RefreshToken)
+		sysApi.POST("/login", userController.Login)
+		sysApi.GET("/logout", userController.Logout)
+		sysApi.POST("refresh_token", userController.RefreshToken)
 	}
 	sysMenuApi := r.Group("/data/api-u/sysmenus")
 	{
-		sysMenuApi.GET("/me",sysMenuController.Me)
-		sysMenuApi.GET("/tree",sysMenuController.MenuTree)
+		sysMenuApi.GET("/me", sysMenuController.Me)
+		sysMenuApi.GET("/tree", sysMenuController.MenuTree)
 	}
-	roleApi :=r.Group("/data/api-v/role")
+	roleApi := r.Group("/data/api-v/role")
 	{
-		roleApi.GET("/findAll",sysRoleController.FindAll)
+		roleApi.GET("/findAll", sysRoleController.FindAll)
 	}
 	userApi := r.Group("/data/api-u/users")
 	{
-		userApi.GET("/current",userController.Current)
+		userApi.GET("/current", userController.Current)
 		userApi.GET("/findAllUser", userController.FindAllUser)
-		userApi.POST("/edit",userController.Edit)
+		userApi.POST("/edit", userController.Edit)
 	}
 
 	urlPrefix := "/data/api-v" // wp 娣诲姞 璺緞 鍓嶇紑
@@ -71,7 +71,7 @@
 	area := r.Group(urlPrefix + "/area")
 	{
 		area.GET("/localmenu", areaController.CameraTree)
-		area.GET("/gb28181Tree",areaController.CameraGb28181Tree)
+		area.GET("/gb28181Tree", areaController.CameraGb28181Tree)
 		area.POST("/add", areaController.AreaAdd)
 		area.POST("/del", areaController.AreaDelete)
 		area.POST("/update", areaController.AreaUpdate)
@@ -86,7 +86,7 @@
 		camera.PUT("/update", cameraController.CameraUpdate)
 		camera.DELETE("/del/:cid", cameraController.CameraDel)
 		camera.GET("/show/:cid", cameraController.CameraSel)
-		camera.GET("/updateSnapshotUrl/:cid",cameraController.UpdateSnapshotUrl)
+		camera.GET("/updateSnapshotUrl/:cid", cameraController.UpdateSnapshotUrl)
 
 		camera.POST("/alltask", cameraTaskController.FindTasksByCameraIds)
 		camera.GET("/task/:cameraId", cameraTaskController.CameraTaskAll)
@@ -105,7 +105,7 @@
 		cameraTaskArgsApi.GET("/deleteByGroup", cameraTaskArgsController.DeleteByGroup)
 		cameraTaskArgsApi.POST("/getLinkRulesByCameraIds", cameraTaskArgsController.GetLinkRulesByCameraIds)
 		cameraTaskArgsApi.POST("/saveLinkRulesByGroup", cameraTaskArgsController.SaveLinkRulesByGroup)
-		cameraTaskArgsApi.POST("/updateDefenceStateByGroup",cameraTaskArgsController.UpdateDefenceStateByGroup)
+		cameraTaskArgsApi.POST("/updateDefenceStateByGroup", cameraTaskArgsController.UpdateDefenceStateByGroup)
 	}
 
 	cameraTaskApi := r.Group(urlPrefix + "/cameraTask")
@@ -179,8 +179,8 @@
 		vdbperson.PUT("/addDbPerson", dbPersonCont.AddDbPerson)
 
 		vdbperson.POST("/fileUploadTest", fileController.UploadPersonTest)
-		vdbperson.POST("/faceExtract",fileController.FaceExtract)
-		vdbperson.POST("/searchByPhoto",fileController.SearchByPhoto)
+		vdbperson.POST("/faceExtract", fileController.FaceExtract)
+		vdbperson.POST("/searchByPhoto", fileController.SearchByPhoto)
 		vdbperson.POST("/updateFace", dbPersonCont.UpdateFace)
 	}
 
@@ -195,6 +195,9 @@
 		vsset.POST("/saveDevInfo", ssController.SaveDevInfo)
 		vsset.GET("/gb28181ConfigShow", ssController.Gb28181ConfigShow)
 		vsset.POST("/gb28181ConfigEdit", ssController.Gb28181ConfigEdit)
+		vsset.GET("/clockInfo", ssController.GetClockinfo)
+		vsset.POST("/updateClock", ssController.SetSysClock)
+		vsset.GET("/ntpTest", ssController.TestNTPServer)
 	}
 
 	//绠楁硶搴撴搷浣�
@@ -204,11 +207,11 @@
 		sdkApi.GET("/findAllSdk", sdkController.FindAllSdk)
 		sdkApi.GET("/findByTaskId", sdkController.FindByTaskId)
 		sdkApi.GET("/getById", sdkController.GetById)
-		sdkApi.GET("/sdkDownload",sdkController.SdkDownLoad)
+		sdkApi.GET("/sdkDownload", sdkController.SdkDownLoad)
 	}
 
 	//绠楁硶鍙傛暟
-	sdkArgApi :=r.Group(urlPrefix + "/sdkArg")
+	sdkArgApi := r.Group(urlPrefix + "/sdkArg")
 	{
 		sdkArgApi.GET("/getSdkArgs", sdkController.GetSdkArgs)
 	}
@@ -240,7 +243,7 @@
 		pollCApi.GET("/getPollConfig", pollConfigController.GetPollConfig)
 		pollCApi.POST("/updateEnable", pollConfigController.UpdateEnable)
 	}
-	clusterApi := r.Group(urlPrefix+"/cluster")
+	clusterApi := r.Group(urlPrefix + "/cluster")
 	{
 		clusterApi.GET("/findCluster", clusterController.FindCluster)
 		clusterApi.GET("/randomPwd", clusterController.RandomPwd)

--
Gitblit v1.8.0