package service import ( "encoding/json" "fmt" "io/ioutil" "os" "path" "reflect" cda "git.loafle.net/commons/di-go/annotation" cdr "git.loafle.net/commons/di-go/registry" occp "git.loafle.net/overflow/commons-go/config/probe" ocmsc "git.loafle.net/overflow/commons-go/model/sensorconfig" ocsp "git.loafle.net/overflow/commons-go/service/probe" "git.loafle.net/overflow/probe/config" // For annotation _ "git.loafle.net/overflow/commons-go/core/annotation" ) var SensorConfigServiceType = reflect.TypeOf((*SensorConfigService)(nil)) func init() { cdr.RegisterType(SensorConfigServiceType) } type SensorConfigService struct { ocsp.SensorConfigService cda.TypeAnnotation `annotation:"@overflow:RPCService()"` ContainerService *ContainerService `annotation:"@Inject()"` sensorConfigs map[string]*ocmsc.SensorConfig } func (s *SensorConfigService) InitService() error { s.sensorConfigs = make(map[string]*ocmsc.SensorConfig) return nil } func (s *SensorConfigService) StartService() error { if err := s.loadConfigAll(); nil != err { return err } if nil != s.sensorConfigs || 0 < len(s.sensorConfigs) { sortedMap := sortSensorConfigPerContainer(s.sensorConfigs) for containerName, configs := range sortedMap { if err := s.ContainerService.Send(occp.ToContainerType(containerName), "SensorConfigService.InitConfig", configs); nil != err { return err } } } return nil } func (s *SensorConfigService) StopService() { } func (s *SensorConfigService) DestroyService() { } func (s *SensorConfigService) AddConfig(tempFilePath string) error { sc, buf, err := s.loadConfigFile(tempFilePath) if nil != err { return err } targetPath := config.SensorConfigFilePath(sc) ioutil.WriteFile(targetPath, buf, 0644) // tempfile remove err = os.Remove(tempFilePath) if nil != err { return err } s.sensorConfigs[sc.ID.String()] = sc return nil } func (s *SensorConfigService) RemoveConfig(sensorConfigID string) error { sc, ok := s.sensorConfigs[sensorConfigID] if !ok { return fmt.Errorf("SensorConfig[%s] is not exist", sensorConfigID) } targetPath := config.SensorConfigFilePath(sc) err := os.Remove(targetPath) if nil != err { return err } delete(s.sensorConfigs, sensorConfigID) return nil } func (s *SensorConfigService) loadConfigAll() error { configDirPath := config.ConfigDir() files, err := ioutil.ReadDir(configDirPath) if nil != err { return err } for _, file := range files { if file.IsDir() == true { if err := s.loadConfigDir(path.Join(configDirPath, file.Name())); nil != err { return err } } } return nil } func (s *SensorConfigService) loadConfigDir(dirPath string) error { files, err := ioutil.ReadDir(dirPath) if nil != err { return err } for _, file := range files { filePath := path.Join(dirPath, file.Name()) if file.IsDir() == true { if err := s.loadConfigDir(filePath); nil != err { return err } } else { sc, _, err := s.loadConfigFile(filePath) if nil != err { return err } s.sensorConfigs[file.Name()] = sc } } return nil } func (s *SensorConfigService) loadConfigFile(filePath string) (*ocmsc.SensorConfig, []byte, error) { buf, err := ioutil.ReadFile(filePath) if nil != err { return nil, nil, err } var m = &ocmsc.SensorConfig{} if err := json.Unmarshal(buf, m); nil != err { return nil, nil, err } return m, buf, nil } func sortSensorConfigPerContainer(sensorConfigMap map[string]*ocmsc.SensorConfig) map[string][]*ocmsc.SensorConfig { if nil == sensorConfigMap || 0 == len(sensorConfigMap) { return nil } m := make(map[string][]*ocmsc.SensorConfig) for _, sensorConfig := range sensorConfigMap { containerName := sensorConfig.Crawler.Container m[containerName] = append(m[containerName], sensorConfig) } return m }