plc4go/tools/plc4xbrowser/ui/config.go (154 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package ui import ( "os" "path" "sync" "time" "github.com/pkg/errors" "github.com/rs/zerolog" "github.com/rs/zerolog/log" "gopkg.in/yaml.v3" ) var plc4xBrowserConfigDir string var configFile string var config = Config{ MaxConsoleLines: 500, MaxOutputLines: 500, } type Config struct { History struct { Last10Hosts []string `yaml:"last_hosts"` Last10Commands []string `yaml:"last_commands"` } AutoRegisterDrivers []string `yaml:"auto_register_driver"` LastUpdated time.Time `yaml:"last_updated"` LogLevel string `yaml:"log_level"` MaxConsoleLines int `yaml:"max_console_lines"` MaxOutputLines int `yaml:"max_output_lines"` } func init() { userConfigDir, err := os.UserConfigDir() if err != nil { panic(err) } plc4xBrowserConfigDir = path.Join(userConfigDir, "plc4xbrowser") if _, err := os.Stat(plc4xBrowserConfigDir); os.IsNotExist(err) { err := os.Mkdir(plc4xBrowserConfigDir, os.ModeDir|os.ModePerm) if err != nil { panic(err) } } configFile = path.Join(plc4xBrowserConfigDir, "config.yml") } func LoadConfig() { f, err := os.Open(configFile) if err != nil { log.Info().Err(err).Msg("No config file found") return } defer func(f *os.File) { err := f.Close() if err != nil { log.Error().Err(err).Msg("Error closing config file") } }(f) decoder := yaml.NewDecoder(f) if err = decoder.Decode(&config); err != nil { log.Warn().Err(err).Msg("Can't decode config file") return } } var saveMutex sync.Mutex func saveConfig() { saveMutex.Lock() defer saveMutex.Unlock() config.LastUpdated = time.Now() f, err := os.OpenFile(configFile, os.O_RDWR|os.O_CREATE, 0755) if err != nil { log.Warn().Err(err).Msg("Can't save config file") return } encoder := yaml.NewEncoder(f) defer func(encoder *yaml.Encoder) { err := encoder.Close() if err != nil { log.Error().Err(err).Msg("Error closing config file") } }(encoder) if err := encoder.Encode(config); err != nil { log.Warn().Err(err).Msg("Can't encode config file") panic(err) } } func addHostHistoryEntry(host string) { existingIndex := -1 for i, lastHost := range config.History.Last10Hosts { if lastHost == host { existingIndex = i break } } if existingIndex >= 0 { config.History.Last10Hosts = append(config.History.Last10Hosts[:existingIndex], config.History.Last10Hosts[existingIndex+1:]...) } if len(config.History.Last10Hosts) >= 10 { config.History.Last10Hosts = config.History.Last10Hosts[1:] } config.History.Last10Hosts = append(config.History.Last10Hosts, host) } func addCommandHistoryEntry(command string) { switch command { case "clear": return case "history": return } existingIndex := -1 for i, lastCommand := range config.History.Last10Commands { if lastCommand == command { existingIndex = i break } } if existingIndex >= 0 { config.History.Last10Commands = append(config.History.Last10Commands[:existingIndex], config.History.Last10Commands[existingIndex+1:]...) } if len(config.History.Last10Commands) >= 10 { config.History.Last10Commands = config.History.Last10Commands[1:] } config.History.Last10Commands = append(config.History.Last10Commands, command) } func setLevel(level zerolog.Level) { config.LogLevel = level.String() } func enableAutoRegister(driver string) error { if err := validateDriverParam(driver); err != nil { return err } for _, autoRegisterDriver := range config.AutoRegisterDrivers { if autoRegisterDriver == driver { return errors.Errorf("%s already registered for auto register", driver) } } config.AutoRegisterDrivers = append(config.AutoRegisterDrivers, driver) log.Info().Str("driver", driver).Msg("Auto register enabled") return nil } func disableAutoRegister(driver string) error { if err := validateDriverParam(driver); err != nil { return err } index := -1 for i, autoRegisterDriver := range config.AutoRegisterDrivers { if autoRegisterDriver == driver { index = i break } } if index < 0 { return errors.Errorf("%s not registered for auto register", driver) } config.AutoRegisterDrivers = append(config.AutoRegisterDrivers[:index], config.AutoRegisterDrivers[index+1:]...) log.Info().Str("driver", driver).Msg("Auto register disabled") return nil }