diff options
| -rw-r--r-- | src/config.go | 14 | ||||
| -rw-r--r-- | src/log.go | 63 | ||||
| -rw-r--r-- | src/state.go | 8 |
3 files changed, 82 insertions, 3 deletions
diff --git a/src/config.go b/src/config.go index 6e085d0..6db3cb2 100644 --- a/src/config.go +++ b/src/config.go @@ -8,15 +8,23 @@ import ( "path" ) +func (eduvpn *VPNState) EnsureConfigDir() error { + mkdirErr := os.MkdirAll(eduvpn.ConfigDirectory, os.ModePerm) + if mkdirErr != nil { + return mkdirErr + } + return nil +} + func (eduvpn *VPNState) GetConfigName() string { pathString := path.Join(eduvpn.ConfigDirectory, eduvpn.Name) return fmt.Sprintf("%s.json", pathString) } func (eduvpn *VPNState) WriteConfig() error { - mkdirErr := os.MkdirAll(eduvpn.ConfigDirectory, os.ModePerm) - if mkdirErr != nil { - return mkdirErr + configDirErr := eduvpn.EnsureConfigDir() + if configDirErr != nil { + return configDirErr } jsonString, marshalErr := json.Marshal(eduvpn) if marshalErr != nil { diff --git a/src/log.go b/src/log.go new file mode 100644 index 0000000..6ee81e3 --- /dev/null +++ b/src/log.go @@ -0,0 +1,63 @@ +package eduvpn + +import ( + "fmt" + "log" + "os" + "path" +) + +type FileLogger struct { + Level LogLevel + File *os.File +} + +type LogLevel int8 + +const ( + LOG_INFO LogLevel = iota + LOG_WARNING + LOG_ERROR +) + +func (e LogLevel) String() string { + switch e { + case LOG_INFO: + return "INFO" + case LOG_WARNING: + return "WARNING" + case LOG_ERROR: + return "ERROR" + default: + return "UNKNOWN" + } +} + +func (eduvpn *VPNState) getLogFilename() string { + pathString := path.Join(eduvpn.ConfigDirectory, eduvpn.Name) + return fmt.Sprintf("%s.log", pathString) +} + +func (eduvpn *VPNState) InitLog(level LogLevel) error { + configDirErr := eduvpn.EnsureConfigDir() + if configDirErr != nil { + return configDirErr + } + logFile, logOpenErr := os.OpenFile(eduvpn.getLogFilename(), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0o666) + if logOpenErr != nil { + return logOpenErr + } + log.SetOutput(logFile) + eduvpn.LogFile = &FileLogger{Level: level, File: logFile} + return nil +} + +func (eduvpn *VPNState) Log(level LogLevel, str string) { + if level >= eduvpn.LogFile.Level { + log.Printf("[%s]: %s", level.String(), str) + } +} + +func (eduvpn *VPNState) CloseLog() { + eduvpn.LogFile.File.Close() +} diff --git a/src/state.go b/src/state.go index 12ad57a..521390e 100644 --- a/src/state.go +++ b/src/state.go @@ -11,6 +11,9 @@ type VPNState struct { // The list of servers and organizations from disco DiscoList *DiscoList `json:"disco"` + + // The file we keep open for logging + LogFile *FileLogger `json:"-"` } func (state *VPNState) Register(name string, directory string, stateCallback func(string, string, string)) error { @@ -18,6 +21,11 @@ func (state *VPNState) Register(name string, directory string, stateCallback fun state.ConfigDirectory = directory state.StateCallback = stateCallback + // Initialize the logger + state.InitLog(LOG_WARNING) + + state.Log(LOG_INFO, "App Registered") + state.StateCallback("Start", "Registered", "app registered") // Try to load the previous configuration |
