better logging management

This commit is contained in:
Paul Wilde 2021-08-18 15:18:14 +01:00
parent ab63a14df7
commit c5ce0c1902
8 changed files with 111 additions and 60 deletions

View file

@ -1,7 +1,7 @@
version: '3.3'
services:
mailautoconf:
container_name: mailautoconf
container_name: mailautoconf-pod
ports:
- '8010:8010'
volumes:

View file

@ -1,5 +1,5 @@
---
Version : "0.1.3"
Version : "0.1.4"
# Sample config.yaml file.
# Copy this file to "config/config.yaml" and adjust the
# settings to your requirements

View file

@ -1,10 +1,11 @@
package global
import (
. "mailautoconf/structs"
. "mailautoconf/global/structs"
"mailautoconf/global/logger"
"fmt"
"gopkg.in/yaml.v2"
"io/ioutil"
"os"
// "os"
"encoding/json"
"text/template"
"path"
@ -39,16 +40,16 @@ func NewConfig() Config {
}
func loadConfig() Config {
cfg := Config{}
fmt.Println("Loading Default Config…")
logger.Log("Loading Default Config…")
cfgfile := defaultConfigDir + "config.default.yaml"
unmarshalConfig(cfgfile, &cfg)
fmt.Println("Loading Custom Config…")
logger.Log("Loading Custom Config…")
customcfgfile := configDir + "config.yaml"
unmarshalConfig(customcfgfile, &cfg)
fmt.Println("Loading Default Services…")
logger.Log("Loading Default Services…")
svcfile := defaultConfigDir + "services.default.yaml"
unmarshalConfig(svcfile, &cfg)
fmt.Println("Loading Custom Services…")
logger.Log("Loading Custom Services…")
customsvcfile := configDir + "services.yaml"
unmarshalConfig(customsvcfile, &cfg)
removeDisabledItems(&cfg)
@ -64,21 +65,19 @@ func loadXMLTemplates(){
"onoff": chooseOnOff,
}
t, err := template.New(name).Funcs(fmap).ParseFiles(tmpl)
if err != nil {
panic (err)
}
logger.CheckError(err)
Templates[name] = t
}
}
func unmarshalConfig(file string, cfg *Config) {
if FileExists(file) {
if logger.FileExists(file) {
content, err := ioutil.ReadFile(file)
if err != nil {
fmt.Println("Error reading config :", file, " : ", err)
if !logger.ErrorOK(err){
logger.Log("Error reading config :", file, " : ", fmt.Sprintf("%v",err))
}
err2 := yaml.Unmarshal(content, &cfg)
if err2 != nil {
fmt.Println("Error unmarshaling config :", file, " : ", err2)
if !logger.ErrorOK(err2){
logger.Log("Error unmarshaling config :", file, " : ", fmt.Sprintf("%v",err2))
}
}
}
@ -108,22 +107,11 @@ func removeDisabledItems(cfg *Config) {
}
cfg.OtherServices = new_svcs
}
func FileExists(file string) bool {
exists := false
if _, err := os.Stat(file); err == nil {
exists = true
} else {
fmt.Println(err)
fmt.Printf("File %s does not exist\n", file);
}
return exists
}
func JSONify(content interface{}) string {
data, err := json.Marshal(content)
if err != nil {
fmt.Println(err)
}
logger.CheckError(err)
return string(data)
}
func parseUsername(svc Service, email string) string {
@ -160,6 +148,6 @@ func GetSessionIP() string {
if forwarded != "" {
ip = forwarded
}
fmt.Printf("Session %s Connect From : %s\r\f",ThisSession.ID, ip)
logger.Log("Session ", ThisSession.ID, " Connect From : ", ip)
return ip
}

View file

@ -0,0 +1,73 @@
package logger
import (
"log"
"fmt"
"io/ioutil"
"os"
"time"
)
const logDir = "config/logs"
func Log(str ...string) {
makeLogDir()
line := ""
for _, s := range str {
line = line + s
}
line = line + "\r\n"
log.Print(line)
t := time.Now()
logname := fmt.Sprintf("%s_log.log",t.Format("200601"))
logfile := fmt.Sprintf("%s/%s",logDir, logname)
line = fmt.Sprintf("%s %s",t.Format("2006/01/02 15:04:05"), line)
if !FileExists(logfile) {
err := ioutil.WriteFile(logfile, []byte(line), 0755)
CheckError(err)
} else {
file, err := os.OpenFile(logfile, os.O_APPEND|os.O_WRONLY, 0755)
CheckError(err)
defer file.Close()
if _, err := file.WriteString(line); err != nil {
CheckError(err)
}
}
}
func CheckError(err error) (ok bool) {
// here for obsolescence
return ErrorOK(err)
}
func ErrorOK(err error) (ok bool) {
ok = true // All is OK, err == nil
if err != nil {
ok = false // There's an error, print it
e := fmt.Sprintf("%v",err)
Log(e)
}
return
}
func Fatal(err error) {
e := fmt.Sprintf("%v",err)
Log(e)
log.Fatal(err)
}
func makeLogDir(){
_, err := os.Stat(logDir)
if os.IsNotExist(err) {
os.Mkdir(logDir, 0755)
}
}
func FileExists(file string) bool {
exists := false
_, err := os.Stat(file);
if os.IsNotExist(err) {
log.Print("File does not exist : ", file);
} else if err == nil {
exists = true
} else {
log.Fatal(err)
log.Print("File %s does not exist\n", file);
}
return exists
}

View file

@ -1,16 +1,17 @@
package main
import (
"fmt"
// "fmt"
"net/http"
"log"
// "log"
"mailautoconf/web/handler"
"mailautoconf/global"
"mailautoconf/global/logger"
)
func main() {
global.NewConfig()
http.HandleFunc("/", handler.WebHandler)
fmt.Println("Starting up Web Listener on port 8010")
log.Fatal(http.ListenAndServe(":8010", nil))
logger.Log("Starting up Web Listener on port 8010")
logger.Fatal(http.ListenAndServe(":8010", nil))
}

View file

@ -1,21 +1,22 @@
package handler
import (
. "mailautoconf/structs"
. "mailautoconf/global"
. "mailautoconf/global/structs"
"mailautoconf/global/logger"
"mailautoconf/web/responses"
"strings"
"net/http"
"fmt"
)
func WebHandler(w http.ResponseWriter, r *http.Request) {
ThisSession = Session{}
ThisSession.ResponseWriter = w
ThisSession.Request = r
ThisSession.ID = NewSessionID()
fmt.Printf("Session %s Request For : %s\r\f",ThisSession.ID, r.URL)
url := fmt.Sprintf("%s", r.URL)
logger.Log("Session ", ThisSession.ID, " Request For : ", url )
ThisSession.IP = GetSessionIP()
ThisSession.Path = strings.ToLower(r.URL.Path[1:])
@ -35,11 +36,9 @@ func WebHandler(w http.ResponseWriter, r *http.Request) {
default:
ThisSession.WebContent = responses.DefaultResponse()
}
writeWebOutput()
webOutput()
}
func writeWebOutput () {
func webOutput(){
ThisSession.ResponseWriter.Header().Set("Content-Type", ThisSession.ContentType)
fmt.Fprintf(ThisSession.ResponseWriter, ThisSession.WebContent)
}

View file

@ -1,7 +1,8 @@
package responses
import (
"mailautoconf/global"
. "mailautoconf/structs"
"mailautoconf/global/logger"
. "mailautoconf/global/structs"
// "text/template"
"fmt"
// "path"
@ -16,9 +17,7 @@ func MozAutoconfig() string {
// https://wiki.mozilla.org/Thunderbird:Autoconfiguration:ConfigFileFormat
// parse the querystring
if err := global.ThisSession.Request.ParseForm(); err != nil {
fmt.Println(err)
}
logger.CheckError(global.ThisSession.Request.ParseForm())
// build the response
response := Response{}
@ -33,9 +32,7 @@ func MozAutoconfig() string {
var result bytes.Buffer
template := global.Templates["autoconfig.xml"]
err := template.Execute(&result, response)
if err != nil {
fmt.Println(err)
}
logger.CheckError(err)
// return our string of xml
return result.String()
@ -53,9 +50,7 @@ func MsAutoDiscoverXML() string {
// </Autodiscover>
// Parse the form to get the values
if err := global.ThisSession.Request.ParseForm(); err != nil {
fmt.Println(err)
}
logger.CheckError(global.ThisSession.Request.ParseForm())
// convert the input to a string so we can extract the email address
form := fmt.Sprintf("%s",global.ThisSession.Request.Form)
@ -68,7 +63,7 @@ func MsAutoDiscoverXML() string {
replace := regexp.MustCompile(`\<[\/]?EMailAddress\>`)
email = replace.ReplaceAllString(email,``)
fmt.Printf("Session %s Request for email : %s\r\f",global.ThisSession.ID,email)
logger.Log("Session ",global.ThisSession.ID ," Request for email : ",email)
// build the reponse
response := Response{}
response.Email = email
@ -79,9 +74,7 @@ func MsAutoDiscoverXML() string {
global.ThisSession.ContentType = "application/xml"
var result bytes.Buffer
err := template.Execute(&result, response)
if err != nil {
fmt.Println(err)
}
logger.CheckError(err)
// return our string of xml
return result.String()
@ -93,7 +86,6 @@ func MsAutoDiscoverJSON() string {
// /autodiscover/autodiscover.json?Email=you@your.domain&Protocol=Autodiscoverv1&RedirectCount=1
email = global.ThisSession.Request.FormValue("Email")
protocol := global.ThisSession.Request.FormValue("Protocol")
fmt.Println(protocol)
global.ThisSession.ContentType = "application/json"
switch strings.ToLower(protocol) {
case "autodiscoverv1":
@ -102,13 +94,11 @@ func MsAutoDiscoverJSON() string {
response.Url = fmt.Sprintf("%s/Autodiscover/Autodiscover.xml", global.MainConfig.BaseURL)
return global.JSONify(response)
default:
response := MSAutodiscoverJSONError{}
response.ErrorCode = "InvalidProtocol";
response.ErrorMessage = fmt.Sprintf("The given protocol value '%s' is invalid. Supported values are 'AutodiscoverV1'", protocol)
return global.JSONify(response)
}
}
func DefaultResponse() string {
response := Response{}