| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 | package loggerimport (	"fmt"	"os"	"sort"	"sync"	"time")// TimeFormatDay - format of the day for timestampsconst TimeFormatDay = "2006-01-02"// TimeFormat - total time formatconst TimeFormat = "2006-01-02 15:04:05"// == fields ==var currentLogs = make(map[string]string)var mu sync.Mutex// Log - handles adding logsfunc Log(verbosity int, message ...string) {	mu.Lock()	defer mu.Unlock()	var currentTime = time.Now()	var currentMessage = MakeString(" ", message...)	if int32(verbosity) <= getVerbose() && getVerbose() >= 0 {		fmt.Printf("[netmaker] %s %s \n", currentTime.Format(TimeFormat), currentMessage)	}	currentLogs[currentMessage] = currentTime.Format("2006-01-02 15:04:05.999999999")}// Dump - dumps all logs into a formatted stringfunc Dump() string {	var dumpString = ""	type keyVal struct {		Key   string		Value time.Time	}	var mu sync.Mutex	mu.Lock()	defer mu.Unlock()	var dumpLogs = make([]keyVal, 0, len(currentLogs))	for key, value := range currentLogs {		parsedTime, err := time.Parse(TimeFormat, value)		if err == nil {			dumpLogs = append(dumpLogs, keyVal{				Key:   key,				Value: parsedTime,			})		}	}	sort.Slice(dumpLogs, func(i, j int) bool {		return dumpLogs[i].Value.Before(dumpLogs[j].Value)	})	for i := range dumpLogs {		var currLog = dumpLogs[i]		dumpString += MakeString(" ", "[netmaker]", currLog.Value.Format(TimeFormat), currLog.Key, "\n")	}	resetLogs()	return dumpString}// DumpFile - appends log dump log filefunc DumpFile(filePath string) {	f, err := os.OpenFile(filePath, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600)	if err != nil {		fmt.Println(MakeString(" ", "could not open log file", filePath))		return	}	defer f.Close()	if _, err = f.WriteString(Dump()); err != nil {		fmt.Println("could not dump logs")	}}// Retrieve - retrieves logs from given filefunc Retrieve(filePath string) string {	contents, err := os.ReadFile(filePath)	if err != nil {		panic(err)	}	return string(contents)}// FatalLog - exits os after loggingfunc FatalLog(message ...string) {	var mu sync.Mutex	mu.Lock()	defer mu.Unlock()	fmt.Printf("[netmaker] Fatal: %s \n", MakeString(" ", message...))	os.Exit(2)}// == private ==// resetLogs - reallocates logs mapfunc resetLogs() {	currentLogs = make(map[string]string)}
 |