server.go 3.0 KB

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