server.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "path/filepath"
  6. "gopkg.in/ini.v1"
  7. "hnyfkj.com.cn/rtu/linux/baseapp"
  8. "hnyfkj.com.cn/rtu/linux/sshd"
  9. )
  10. const MODULE_NAME = sshd.MODULE_NAME
  11. type MQTTBroker struct {
  12. Address string `ini:"BrokerAddress"` // 地址端口
  13. Username string `ini:"Username"` // 用户名称
  14. Password string `ini:"Password"` // 接入密码
  15. }
  16. type Config struct {
  17. MQTTSrv MQTTBroker `ini:"MQTTSrv"`
  18. }
  19. var (
  20. CfgServers = &Config{
  21. MQTTSrv: MQTTBroker{
  22. Address: "tcp://8.136.98.49:61883",
  23. Username: "user",
  24. Password: "f335bf402c655ee5fd2b5300905124e",
  25. },
  26. }
  27. Version = "1.0.0.2"
  28. )
  29. func loadCfgServers() error {
  30. cfgFile := filepath.Join(baseapp.CFG_DIR, "sshd_cfg.ini")
  31. cfgIni, err := ini.Load(cfgFile)
  32. if err != nil {
  33. return err
  34. }
  35. if cfgIni.HasSection("MQTTSrv") {
  36. if err := cfgIni.Section("MQTTSrv").MapTo(&CfgServers.MQTTSrv); err != nil {
  37. return err
  38. }
  39. } else {
  40. return fmt.Errorf("配置文件\"%s\"缺少\"[MQTTSrv]\"节", cfgFile)
  41. }
  42. return nil
  43. }
  44. func main() {
  45. baseapp.SetOptDirs(true, true, false, false)
  46. baseapp.InitPath()
  47. sshdCfgFile, err := ensureSSHDConfig()
  48. if err != nil {
  49. fmt.Printf("[YFKJ_SSHD] ensure config failed: %v\n", err)
  50. os.Exit(1)
  51. }
  52. baseapp.WriteVersionFile(baseapp.EXEC_DIR, Version) //-> for 升级
  53. baseapp.InitLogger(sshdCfgFile)
  54. baseapp.SingleInstanceRun() // 异步非阻塞
  55. baseapp.Logger.Infof("程序版本: %s 构建时间: %s\n程序开始运行...",
  56. Version, baseapp.BuildTime)
  57. if err := loadCfgServers(); err != nil {
  58. baseapp.Logger.Warnf("[%s] 加载服务器配置项失败: %v!", MODULE_NAME, err)
  59. }
  60. devIMEI := baseapp.GetArgsParamStr("-devIMEI", "")
  61. success := sshd.ModuleInit(CfgServers.MQTTSrv.Address, CfgServers.MQTTSrv.Username, CfgServers.MQTTSrv.Password, devIMEI)
  62. if !success {
  63. return
  64. }
  65. <-baseapp.IsExit2()
  66. sshd.ModuleExit()
  67. baseapp.Logger.Info("程序退出")
  68. baseapp.ExitLogger() // 安全的关闭日志模块
  69. baseapp.SafeExit() // 安全的关闭退出程序
  70. }
  71. const defaultSSHDCfg = `[Log]
  72. ; 日志级别: trace、debug、info、warn、error、fatal、panic
  73. Level = info
  74. ; 输出目标: console(控制台)、file(文件)、all(控制台+文件)
  75. Target = all
  76. ; 每个日志文件的最大大下, 以"MB"为单位
  77. MaxFileSize = 5
  78. ; 保留的最大备份文件数量
  79. MaxBackupFileCnts = 1
  80. [MQTTSrv]
  81. ; 地址端口
  82. BrokerAddress = tcp://8.136.98.49:61883
  83. ; 用户名称
  84. Username = user
  85. ; 接入密码
  86. Password = f335bf402c655ee5fd2b5300905124e
  87. `
  88. func ensureSSHDConfig() (string, error) {
  89. cfgFile := filepath.Join(
  90. baseapp.CFG_DIR,
  91. "sshd_cfg.ini",
  92. )
  93. if err := os.MkdirAll(
  94. baseapp.CFG_DIR,
  95. 0755,
  96. ); err != nil {
  97. return "", err
  98. }
  99. f, err := os.OpenFile(
  100. cfgFile,
  101. os.O_CREATE|os.O_EXCL|os.O_WRONLY,
  102. 0644,
  103. )
  104. if err != nil {
  105. if os.IsExist(err) {
  106. return cfgFile, nil
  107. }
  108. return "", err
  109. }
  110. if _, err = f.WriteString(defaultSSHDCfg); err != nil {
  111. _ = f.Close()
  112. _ = os.Remove(cfgFile)
  113. return "", err
  114. }
  115. if err = f.Sync(); err != nil {
  116. _ = f.Close()
  117. _ = os.Remove(cfgFile)
  118. return "", err
  119. }
  120. if err = f.Close(); err != nil {
  121. _ = os.Remove(cfgFile)
  122. return "", err
  123. }
  124. return cfgFile, nil
  125. }