package icssvc import ( "fmt" "os" "sync" "time" "gitlab.com/ics_cinnamon/voicegateway/icsconf" "gitlab.com/ics_cinnamon/voicegateway/icserror" "gitlab.com/ics_cinnamon/voicegateway/icslog" "gitlab.com/ics_cinnamon/voicegateway/icsutil" ) const ( COMPANY_NAME = "iComsys" VERSION = "1.0.0" BUILD_DATE = "" ) const ( ONEMB = 1048576 ) type IcsService struct { isExit bool //exit service isStop bool //pause service log *icslog.IcsLog config *icsconf.IcsConfig //homeDir string } var ServiceStatus *IcsService var once sync.Once func GetServiceStatus() *IcsService { once.Do(func() { ServiceStatus = &IcsService{isExit: false, isStop: false} }) return ServiceStatus } func NewService() *IcsService { return GetServiceStatus() } func (s *IcsService) Exit(start bool) { i := GetServiceStatus() i.isExit = start } func (s IcsService) GetExit() bool { return s.isExit } func (s *IcsService) Stop(stop bool) { i := GetServiceStatus() i.isStop = stop } func (s IcsService) GetStop() bool { return s.isStop } func (s *IcsService) SetIcsConfig(conf *icsconf.IcsConfig) *icserror.IcsError { if conf == nil { return icserror.ICSERRInvalidParam } s.config = conf return nil } func (s IcsService) GetIcsConfig() *icsconf.IcsConfig { //fmt.Println(s.config) return s.config } func (s *IcsService) SetIcsLog(log *icslog.IcsLog) { s.log = log } func (s IcsService) GetIcsLog() (log *icslog.IcsLog) { return s.log } func (s IcsService) ShowServiceInfo() (info string) { info = fmt.Sprintf("%s Voice Gateway version %s\nCopyright (C) 2022 %s\n\n", COMPANY_NAME, VERSION, COMPANY_NAME) // fmt.Printf("%s Voice Gateway version %s\nCopyright (C) 2022 %s\n\n", COMPANY_NAME, VERSION, COMPANY_NAME) return info } func (s IcsService) getMonth2Int(mon time.Month) int { switch mon { case time.January: return 1 case time.February: return 2 case time.March: return 3 case time.April: return 4 case time.May: return 5 case time.June: return 6 case time.July: return 7 case time.August: return 8 case time.September: return 9 case time.October: return 10 case time.November: return 11 case time.December: return 12 } return -1 } func (s IcsService) GetRemainExpire() (int, *icserror.IcsError) { if s.config == nil { return -1, icserror.ICSERRInvalidParam } var rem int currentTime := time.Now() yy := currentTime.Year() mm := currentTime.Month() intmm := s.getMonth2Int(mm) if intmm != -1 { expire := s.config.GetExpire() //since 2018.01 rem = expire - (((yy - 2018) * 12) + intmm) } else { return -1, icserror.ICSERRSVCTime } return rem, nil } ///////////////////////////// func (s IcsService) LogWatcher() *icserror.IcsError { l := icslog.GetIcsLog() l.Print(icslog.LOG_LEVEL_INFO, -1, "Log Watcher Start") for !s.GetExit() { for s.GetStop() { time.Sleep(time.Millisecond) } //check log file date y1, m1, d1 := s.log.CurrentDate.Date() y2, m2, d2 := time.Now().Date() h2, mi2, ss2 := time.Now().Hour(), time.Now().Minute(), time.Now().Second() if h2 == l.DelHour && mi2 == 0 && ss2 == 0 { go l.DelLog() time.Sleep(time.Second) } if d1 != d2 || y1 != y2 || m1 != m2 { s.config = icsconf.GetIcsConfig() logpath := fmt.Sprintf("%s", s.config.LogConfig.Path) aSpace := icsutil.GetDiskAvailableSpace(logpath) if aSpace < uint64(s.config.LogConfig.Disklimit*ONEMB) { return icserror.ICSERRUTILDiskFull } s.log.M.Lock() //save and close old log file s.log.LogFile.Sync() s.log.LogFile.Close() //create new log file s.log.CurrentDate = time.Now() /* fmt.Println(s.log) fmt.Println(s.log.LogFileName) fmt.Println(s.config) fmt.Println(s.config.GetHomeDir()) fmt.Println(s.log.Path) fmt.Println(y2) fmt.Println(m2) fmt.Println(d2) */ s.log.LogFileName = fmt.Sprintf("%s/icsvg.log-%d%02d%02d", s.log.Path, y2, m2, d2) var oerr error s.log.LogFile, oerr = os.OpenFile(s.log.LogFileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if oerr != nil { icserror.ICSERRFileOpen.SetError(oerr) //icserror.ICSERRFileOpen.PrintWithCaller(1) s.log.M.Unlock() return icserror.ICSERRFileOpen } s.log.M.Unlock() l.Printf(icslog.LOG_LEVEL_INFO, -1, "Log Watcher: Updated Log File - %s", s.log.LogFileName) } //l.Printf(icslog.LOG_LEVEL_INFO, -1, "Log Watcher") time.Sleep(time.Millisecond) } return nil }