func main() { carrierLogger = util.NewLogger(cfg.Section("LOG").Key("Path").MustString(util.HomeDir()+"/logs/carrier.log"), util.FilenameSuffixInDay) logger.SetLogger(carrierLogger) var ( clusterServerList []string err error addr *ini.Key ) for _, addr = range cfg.Section("CLUSTER.HOST").Keys() { clusterServerList = append(clusterServerList, addr.Value()) } // 初始化 cluster if err = cluster.InitClusterParameter( clusterServerList, time.Duration(cfg.Section("CLUSTER").Key("RefreshInterval").MustInt(300))*time.Second, cfg.Section("CLUSTER").Key("MaxIdle").MustInt(50), time.Duration(cfg.Section("CLUSTER").Key("TestOnBorrowTimeout").MustInt(150))*time.Second, time.Duration(cfg.Section("CLUSTER").Key("ConnectTimeout").MustInt(3))*time.Second, time.Duration(cfg.Section("CLUSTER").Key("ReadTimeout").MustInt(3))*time.Second, time.Duration(cfg.Section("CLUSTER").Key("WriteTimeout").MustInt(3))*time.Second, ); err != nil { panic(err) } // 服务端口 client ServeForClient(cfg.Section("").Key("ClientAddr").MustString(":6679")) }
// reload считывает данные с ini-файла и загружает в структуру. При необходимости инициализирует данные значениями по умолчанию func reloadSettings() error { var key *ini.Key var err error var value int defUpdSetDelayInt, _ := strconv.Atoi(defUpdSetDelay) defUpdDataDelayInt, _ := strconv.Atoi(defUpdDataDelay) // открыть ini-файл cf, err = ini.Load(nameIniFile) if err != nil { if os.IsNotExist(err) { // файл с настройками не найден? cf = ini.Empty() // создать новый объект с настройками } else { return err } } // обработать секцию "general" с основными настройками section, err := cf.GetSection("general") if err != nil { section, err = cf.NewSection("general") // секции нет в ini-файле? Тогда создать. if err != nil { return err // если не удалось создать, то продолжать бессмысленно } section.Comment = "Основные настройки" } // перечитывать настройки каждые .... сек key, err = section.GetKey("updsetdelay") if err != nil { key, err = section.NewKey("updsetdelay", defUpdSetDelay) if err != nil { return err } key.Comment = "Перечитывать настройки каждые ... сек." } value = key.RangeInt(defUpdSetDelayInt, 5, 1000000) // значение в пределах 5 - 1000000 секунд. При ошибке инициализация значением по умолчанию key.SetValue(strconv.Itoa(value)) cfstruct.updsetdelay = value // обновлять данные плейлиста каждые .... сек key, err = section.GetKey("upddatadelay") if err != nil { key, err = section.NewKey("upddatadelay", defUpdDataDelay) if err != nil { return err } key.Comment = "Обновлять данные плейлиста каждые ... сек." } value = key.RangeInt(defUpdDataDelayInt, 300, 1000000) // значение в пределах 300 - 1000000 секунд. При ошибке инициализация значением по умолчанию key.SetValue(strconv.Itoa(value)) cfstruct.upddatadelay = value // Имя файла плейлиста и путь до него. key, err = section.GetKey("pathplaylist") if err != nil { key, err = section.NewKey("pathplaylist", defPathPlaylist) if err != nil { return err } key.Comment = "Имя файла плейлиста и путь до него." } cfstruct.pathplaylist = key.String() // Количество параллельных потоков для парсинга сайта key, err = section.GetKey("workers") if err != nil { key, err = section.NewKey("workers", strconv.Itoa(defWorkers)) if err != nil { return err } key.Comment = "Количество параллельных потоков для парсинга сайта. По умолчанию равен кол-ву ядер процессора." } value = key.RangeInt(defWorkers, 1, 100) // значение в пределах 1 - 100 отдельных потоков. При ошибке инициализация значением по умолчанию key.SetValue(strconv.Itoa(value)) cfstruct.workers = value // секция "каналы" section, err = cf.GetSection("channels") if err != nil { section, err = cf.NewSection("channels") // секции нет в ini-файле? Создать секцию. if err != nil { return err } } section.Comment = "Список каналов. Пример строки: -:rossija" // секция содержит список каналов ch := section.Keys() // получить массив списка каналов cfstruct.channels = ch err = cf.SaveTo(nameIniFile) // сохранить файл с значениями по умолчанию if err != nil { return err } return nil }