summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/config.go14
-rw-r--r--src/log.go63
-rw-r--r--src/state.go8
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