feat: add api for system clock update
| | |
| | | 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 { |
| | |
| | | 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 存储信息查询 |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | // @Summary GB28181设置查询 |
| | | // @Description GB28181设置信息查询 |
| | | // @Accept json |
| | |
| | | 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, "配置成功") |
| | | } |
New file |
| | |
| | | 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() |
| | | } |
| | |
| | | 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" |
| | |
| | | "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" |
| | |
| | | } |
| | | |
| | | // 按尺寸去切图 |
| | | 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) |
| | |
| | | return |
| | | } |
| | | |
| | | |
| | | // 获取本机网卡IP |
| | | func GetLocalIP(networkName string) (ipv4 string,mask string, err error) { |
| | | interfaces, err := net.Interfaces() |
| | |
| | | } |
| | | |
| | | 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 { |
| | |
| | | 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" |
| | | ) |
| | |
| | | sysMenuController :=new(controllers.SysMenuController) |
| | | clusterController :=new(controllers.ClusterController) |
| | | sysRoleController :=new(controllers.RoleController) |
| | | |
| | | |
| | | sysApi := r.Group( "/data/api-u/sys") |
| | | { |
| | |
| | | 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) |
| | | } |
| | | |
| | | //算法库操作 |