zhangzengfei
2019-10-21 e871758bd82d9a4fbce42e43c9665d869c240dfb
feat: add api for system clock update
1个文件已添加
3个文件已修改
250 ■■■■■ 已修改文件
controllers/syssetcont.go 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
extend/sys/system.go 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
extend/util/util.go 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
router/router.go 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
controllers/syssetcont.go
@@ -1,15 +1,16 @@
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 {
@@ -40,6 +41,14 @@
    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 存储信息查询
@@ -192,7 +201,6 @@
    }
}
// @Summary GB28181设置查询
// @Description GB28181设置信息查询
// @Accept  json
@@ -236,3 +244,93 @@
        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 "时间服务器ip"
// @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, "配置成功")
}
extend/sys/system.go
New file
@@ -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()
}
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"
@@ -93,7 +94,7 @@
}
// 按尺寸去切图
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,7 +136,6 @@
    return
}
// 获取本机网卡IP
func GetLocalIP(networkName string) (ipv4 string,mask string, err error) {
    interfaces, err := net.Interfaces()
@@ -165,14 +165,14 @@
}
func GetDefaultRoute(networkName string)(route string,err error){
    cmdStr := fmt.Sprintf("route | grep -P \"^default.*%s$\" | awk '{print $2}'",networkName)
    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
    return string(b), nil
}
func StringIpToInt(ipstring string) int {
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"
)
@@ -41,7 +42,6 @@
    sysMenuController :=new(controllers.SysMenuController)
    clusterController :=new(controllers.ClusterController)
    sysRoleController :=new(controllers.RoleController)
    sysApi := r.Group(  "/data/api-u/sys")
    {
@@ -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)
    }
    //算法库操作