From f15f30366d6765ec00aa73b7fc24c1e2af985b77 Mon Sep 17 00:00:00 2001 From: loerac Date: Mon, 24 Aug 2020 15:44:15 -0500 Subject: [PATCH 01/13] Log if whether it's time to feed the cat or not --- catfeeder-machine/main.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/catfeeder-machine/main.go b/catfeeder-machine/main.go index 5ef6ae7..0e0c352 100644 --- a/catfeeder-machine/main.go +++ b/catfeeder-machine/main.go @@ -2,6 +2,8 @@ package main import ( "fmt" + "log" + "os" "sync" "time" ) @@ -15,6 +17,7 @@ type FeedingTimes struct { var has_been_fed bool = false var feeding_times []FeedingTimes var mut sync.Mutex +var logger *log.Logger /** * @brief: Check if it's time to feed the cat @@ -38,6 +41,15 @@ func TimeToFeedCat() bool { } func main() { + /* Open log file */ + /* TODO: perform log rollover */ + f, err := os.OpenFile("/tmp/cat-feeder.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) + if err != nil { + log.Fatalf("Error opening file: %v", err) + } + defer f.Close() + logger := log.New(f, "cat-feeder - ", log.LstdFlags|log.Lmsgprefix) + /* Run REST API */ go HandleRequests() @@ -45,10 +57,10 @@ func main() { go func() { for { if TimeToFeedCat() && !has_been_fed { - fmt.Println("Time to feed cats") + logger.Println("Time to feed cats") has_been_fed = true } else if !TimeToFeedCat() { - fmt.Println("Not time to feed cats") + logger.Println("Not time to feed cats") has_been_fed = false } time.Sleep(10 * time.Second) From a86b3ab6cb7bd09c5a8986d0c7c2f9321eb41f8e Mon Sep 17 00:00:00 2001 From: loerac Date: Mon, 24 Aug 2020 21:41:36 -0500 Subject: [PATCH 02/13] Updated logger to roll over on existing log files On initialization, it'll check if there exists an existing log file. If so, prepend filename with a timestamp, and then make a new file. On creation of a new logger, give them the File pointer to the file so they can write to the file with their prefix --- catfeeder-machine/logger.go | 74 +++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 catfeeder-machine/logger.go diff --git a/catfeeder-machine/logger.go b/catfeeder-machine/logger.go new file mode 100644 index 0000000..9312f9e --- /dev/null +++ b/catfeeder-machine/logger.go @@ -0,0 +1,74 @@ +package main + +import ( + "os" + "strings" + "sync" + "time" +) + +type Logger struct { + Lock sync.Mutex + Fpath *os.File + Prefix string +} + +const LogFilename string = "/tmp/cat-feeder.log" + +var Fpath *os.File + +/** + * @brief: Checks to see if the log file is present from a previous + * execution. If true, roll over log with timestamp. Then + * open a new log file. + * + * @return: nil on success, else error + **/ +func LoggerInit() (err error) { + finfo, err := os.Stat(LogFilename) + if err == nil { + path := strings.Split(LogFilename, finfo.Name())[0] + err = os.Rename( + LogFilename, + path + time.Now().Format("20060102T150405") + "-" + finfo.Name(), + ) + if err != nil { + return err + } + } + + Fpath, err = os.Create(LogFilename) + return err +} + +/** + * @brief: Create a Logger with prefix and filepath + * + * @arg: prefix - String to prepend to the log message + * + * @return: New logger, nil if error + **/ +func NewLogger(prefix string) *Logger { + return &Logger{ + Prefix: prefix, + Fpath: Fpath, + } +} + +/** + * @brief: Write log message to the log file. Log message contains: + * - Timestamp + * - Prefix + * - Message + * + * @arg: msg - Message to write to log file + * + * @return: int - How many bytes were written + * error - Errors while writing + **/ +func (l *Logger) Println(msg string) (int, error) { + l.Lock.Lock() + defer l.Lock.Unlock() + output := []byte(time.Now().Format("2006/01/02 15:04:05") + " " + l.Prefix + " - " + msg + "\n") + return l.Fpath.Write(output) +} From ee7992034bf70cb946a0a20bafbc46dcc2f6da7d Mon Sep 17 00:00:00 2001 From: loerac Date: Mon, 24 Aug 2020 21:41:59 -0500 Subject: [PATCH 03/13] Use Logger for logging --- catfeeder-machine/main.go | 21 +++++++++------------ catfeeder-machine/rest-api.go | 31 ++++++++++++++++++------------- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/catfeeder-machine/main.go b/catfeeder-machine/main.go index 0e0c352..7629157 100644 --- a/catfeeder-machine/main.go +++ b/catfeeder-machine/main.go @@ -2,8 +2,6 @@ package main import ( "fmt" - "log" - "os" "sync" "time" ) @@ -17,7 +15,6 @@ type FeedingTimes struct { var has_been_fed bool = false var feeding_times []FeedingTimes var mut sync.Mutex -var logger *log.Logger /** * @brief: Check if it's time to feed the cat @@ -40,15 +37,15 @@ func TimeToFeedCat() bool { return false } +func init() { + if err := LoggerInit(); err != nil { + fmt.Println("Failed to initialize log rollover:", err) + } +} + func main() { /* Open log file */ - /* TODO: perform log rollover */ - f, err := os.OpenFile("/tmp/cat-feeder.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) - if err != nil { - log.Fatalf("Error opening file: %v", err) - } - defer f.Close() - logger := log.New(f, "cat-feeder - ", log.LstdFlags|log.Lmsgprefix) + cat_log := NewLogger("cat-manager") /* Run REST API */ go HandleRequests() @@ -57,10 +54,10 @@ func main() { go func() { for { if TimeToFeedCat() && !has_been_fed { - logger.Println("Time to feed cats") + cat_log.Println("Time to feed cats") has_been_fed = true } else if !TimeToFeedCat() { - logger.Println("Not time to feed cats") + cat_log.Println("Not time to feed cats") has_been_fed = false } time.Sleep(10 * time.Second) diff --git a/catfeeder-machine/rest-api.go b/catfeeder-machine/rest-api.go index 1ef96ae..152e1d0 100644 --- a/catfeeder-machine/rest-api.go +++ b/catfeeder-machine/rest-api.go @@ -4,18 +4,23 @@ import ( "fmt" "io/ioutil" "encoding/json" - "log" "net/http" "github.com/gorilla/mux" ) -func PrintFeedingTimes(feeding_times []FeedingTimes) { +var rest_log *Logger + +func FeedingTimeStr(feeding_times []FeedingTimes) string { + ft_str := "" + for _, ft := range feeding_times { - fmt.Printf("{ ID(%s) -- Hour(%d) -- Minute(%d) } ", - ft.ID, ft.Hour, ft.Minute) + ft_str += fmt.Sprintf(" { ID(%s) -- Hour(%d) -- Minute(%d) } ", + ft.ID, ft.Hour, ft.Minute, + ) } - fmt.Println() + + return ft_str } /** @@ -32,8 +37,7 @@ func CreateNewFeedTime(w http.ResponseWriter, r *http.Request) { json.NewEncoder(w).Encode(feeding_times) mut.Unlock() - fmt.Print("Recieved feeding times: ") - PrintFeedingTimes(ft) + rest_log.Println("Recieved feeding times:" + FeedingTimeStr(ft)) } /** @@ -47,9 +51,7 @@ func ReturnSingleFeedingTime(w http.ResponseWriter, r *http.Request) { for _, ft := range feeding_times { if ft.ID == key { json.NewEncoder(w).Encode(ft) - fmt.Print("Sending feeding time: ") - feeding := []FeedingTimes{ft} - PrintFeedingTimes(feeding) + rest_log.Println("Sending feeding time:" + FeedingTimeStr([]FeedingTimes{ft})) break } } @@ -62,8 +64,7 @@ func ReturnSingleFeedingTime(w http.ResponseWriter, r *http.Request) { func ReturnAllFeedingTimes(w http.ResponseWriter, r *http.Request) { mut.Lock() json.NewEncoder(w).Encode(feeding_times) - fmt.Print("Sending feeding times: ") - PrintFeedingTimes(feeding_times) + rest_log.Println("Sending feeding times:" + FeedingTimeStr(feeding_times)) mut.Unlock() } @@ -82,10 +83,14 @@ func HomePage(w http.ResponseWriter, r *http.Request) { * @brief: Handle to monitor all the CRUD methods. **/ func HandleRequests() { + rest_log = NewLogger("rest-api") + myRouter := mux.NewRouter().StrictSlash(true) myRouter.HandleFunc("/", HomePage) myRouter.HandleFunc("/feedingTime", CreateNewFeedTime).Methods("POST") myRouter.HandleFunc("/feedingTimes", ReturnAllFeedingTimes).Methods("GET") myRouter.HandleFunc("/feedingTime/{id}", ReturnSingleFeedingTime).Methods("GET") - log.Fatal(http.ListenAndServe(":6969", myRouter)) + + rest_log.Println("Listening on 127.0.0.1:6969") + rest_log.Println(http.ListenAndServe(":6969", myRouter).Error()) } From a54db14cf9d9a2300227dcbf557fb1310146d662 Mon Sep 17 00:00:00 2001 From: loerac Date: Mon, 24 Aug 2020 15:44:15 -0500 Subject: [PATCH 04/13] Log if whether it's time to feed the cat or not --- catfeeder-machine/main.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/catfeeder-machine/main.go b/catfeeder-machine/main.go index 5ef6ae7..0e0c352 100644 --- a/catfeeder-machine/main.go +++ b/catfeeder-machine/main.go @@ -2,6 +2,8 @@ package main import ( "fmt" + "log" + "os" "sync" "time" ) @@ -15,6 +17,7 @@ type FeedingTimes struct { var has_been_fed bool = false var feeding_times []FeedingTimes var mut sync.Mutex +var logger *log.Logger /** * @brief: Check if it's time to feed the cat @@ -38,6 +41,15 @@ func TimeToFeedCat() bool { } func main() { + /* Open log file */ + /* TODO: perform log rollover */ + f, err := os.OpenFile("/tmp/cat-feeder.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) + if err != nil { + log.Fatalf("Error opening file: %v", err) + } + defer f.Close() + logger := log.New(f, "cat-feeder - ", log.LstdFlags|log.Lmsgprefix) + /* Run REST API */ go HandleRequests() @@ -45,10 +57,10 @@ func main() { go func() { for { if TimeToFeedCat() && !has_been_fed { - fmt.Println("Time to feed cats") + logger.Println("Time to feed cats") has_been_fed = true } else if !TimeToFeedCat() { - fmt.Println("Not time to feed cats") + logger.Println("Not time to feed cats") has_been_fed = false } time.Sleep(10 * time.Second) From ea70deda56deb5e3170510d10798dddb76ef3534 Mon Sep 17 00:00:00 2001 From: loerac Date: Mon, 24 Aug 2020 21:41:36 -0500 Subject: [PATCH 05/13] Updated logger to roll over on existing log files On initialization, it'll check if there exists an existing log file. If so, prepend filename with a timestamp, and then make a new file. On creation of a new logger, give them the File pointer to the file so they can write to the file with their prefix --- catfeeder-machine/logger.go | 74 +++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 catfeeder-machine/logger.go diff --git a/catfeeder-machine/logger.go b/catfeeder-machine/logger.go new file mode 100644 index 0000000..9312f9e --- /dev/null +++ b/catfeeder-machine/logger.go @@ -0,0 +1,74 @@ +package main + +import ( + "os" + "strings" + "sync" + "time" +) + +type Logger struct { + Lock sync.Mutex + Fpath *os.File + Prefix string +} + +const LogFilename string = "/tmp/cat-feeder.log" + +var Fpath *os.File + +/** + * @brief: Checks to see if the log file is present from a previous + * execution. If true, roll over log with timestamp. Then + * open a new log file. + * + * @return: nil on success, else error + **/ +func LoggerInit() (err error) { + finfo, err := os.Stat(LogFilename) + if err == nil { + path := strings.Split(LogFilename, finfo.Name())[0] + err = os.Rename( + LogFilename, + path + time.Now().Format("20060102T150405") + "-" + finfo.Name(), + ) + if err != nil { + return err + } + } + + Fpath, err = os.Create(LogFilename) + return err +} + +/** + * @brief: Create a Logger with prefix and filepath + * + * @arg: prefix - String to prepend to the log message + * + * @return: New logger, nil if error + **/ +func NewLogger(prefix string) *Logger { + return &Logger{ + Prefix: prefix, + Fpath: Fpath, + } +} + +/** + * @brief: Write log message to the log file. Log message contains: + * - Timestamp + * - Prefix + * - Message + * + * @arg: msg - Message to write to log file + * + * @return: int - How many bytes were written + * error - Errors while writing + **/ +func (l *Logger) Println(msg string) (int, error) { + l.Lock.Lock() + defer l.Lock.Unlock() + output := []byte(time.Now().Format("2006/01/02 15:04:05") + " " + l.Prefix + " - " + msg + "\n") + return l.Fpath.Write(output) +} From 8b413011542823c64d8e9efefdb1d4257e1e2371 Mon Sep 17 00:00:00 2001 From: loerac Date: Mon, 24 Aug 2020 21:41:59 -0500 Subject: [PATCH 06/13] Use Logger for logging --- catfeeder-machine/main.go | 21 +++++++++------------ catfeeder-machine/rest-api.go | 31 ++++++++++++++++++------------- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/catfeeder-machine/main.go b/catfeeder-machine/main.go index 0e0c352..7629157 100644 --- a/catfeeder-machine/main.go +++ b/catfeeder-machine/main.go @@ -2,8 +2,6 @@ package main import ( "fmt" - "log" - "os" "sync" "time" ) @@ -17,7 +15,6 @@ type FeedingTimes struct { var has_been_fed bool = false var feeding_times []FeedingTimes var mut sync.Mutex -var logger *log.Logger /** * @brief: Check if it's time to feed the cat @@ -40,15 +37,15 @@ func TimeToFeedCat() bool { return false } +func init() { + if err := LoggerInit(); err != nil { + fmt.Println("Failed to initialize log rollover:", err) + } +} + func main() { /* Open log file */ - /* TODO: perform log rollover */ - f, err := os.OpenFile("/tmp/cat-feeder.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) - if err != nil { - log.Fatalf("Error opening file: %v", err) - } - defer f.Close() - logger := log.New(f, "cat-feeder - ", log.LstdFlags|log.Lmsgprefix) + cat_log := NewLogger("cat-manager") /* Run REST API */ go HandleRequests() @@ -57,10 +54,10 @@ func main() { go func() { for { if TimeToFeedCat() && !has_been_fed { - logger.Println("Time to feed cats") + cat_log.Println("Time to feed cats") has_been_fed = true } else if !TimeToFeedCat() { - logger.Println("Not time to feed cats") + cat_log.Println("Not time to feed cats") has_been_fed = false } time.Sleep(10 * time.Second) diff --git a/catfeeder-machine/rest-api.go b/catfeeder-machine/rest-api.go index 1ef96ae..152e1d0 100644 --- a/catfeeder-machine/rest-api.go +++ b/catfeeder-machine/rest-api.go @@ -4,18 +4,23 @@ import ( "fmt" "io/ioutil" "encoding/json" - "log" "net/http" "github.com/gorilla/mux" ) -func PrintFeedingTimes(feeding_times []FeedingTimes) { +var rest_log *Logger + +func FeedingTimeStr(feeding_times []FeedingTimes) string { + ft_str := "" + for _, ft := range feeding_times { - fmt.Printf("{ ID(%s) -- Hour(%d) -- Minute(%d) } ", - ft.ID, ft.Hour, ft.Minute) + ft_str += fmt.Sprintf(" { ID(%s) -- Hour(%d) -- Minute(%d) } ", + ft.ID, ft.Hour, ft.Minute, + ) } - fmt.Println() + + return ft_str } /** @@ -32,8 +37,7 @@ func CreateNewFeedTime(w http.ResponseWriter, r *http.Request) { json.NewEncoder(w).Encode(feeding_times) mut.Unlock() - fmt.Print("Recieved feeding times: ") - PrintFeedingTimes(ft) + rest_log.Println("Recieved feeding times:" + FeedingTimeStr(ft)) } /** @@ -47,9 +51,7 @@ func ReturnSingleFeedingTime(w http.ResponseWriter, r *http.Request) { for _, ft := range feeding_times { if ft.ID == key { json.NewEncoder(w).Encode(ft) - fmt.Print("Sending feeding time: ") - feeding := []FeedingTimes{ft} - PrintFeedingTimes(feeding) + rest_log.Println("Sending feeding time:" + FeedingTimeStr([]FeedingTimes{ft})) break } } @@ -62,8 +64,7 @@ func ReturnSingleFeedingTime(w http.ResponseWriter, r *http.Request) { func ReturnAllFeedingTimes(w http.ResponseWriter, r *http.Request) { mut.Lock() json.NewEncoder(w).Encode(feeding_times) - fmt.Print("Sending feeding times: ") - PrintFeedingTimes(feeding_times) + rest_log.Println("Sending feeding times:" + FeedingTimeStr(feeding_times)) mut.Unlock() } @@ -82,10 +83,14 @@ func HomePage(w http.ResponseWriter, r *http.Request) { * @brief: Handle to monitor all the CRUD methods. **/ func HandleRequests() { + rest_log = NewLogger("rest-api") + myRouter := mux.NewRouter().StrictSlash(true) myRouter.HandleFunc("/", HomePage) myRouter.HandleFunc("/feedingTime", CreateNewFeedTime).Methods("POST") myRouter.HandleFunc("/feedingTimes", ReturnAllFeedingTimes).Methods("GET") myRouter.HandleFunc("/feedingTime/{id}", ReturnSingleFeedingTime).Methods("GET") - log.Fatal(http.ListenAndServe(":6969", myRouter)) + + rest_log.Println("Listening on 127.0.0.1:6969") + rest_log.Println(http.ListenAndServe(":6969", myRouter).Error()) } From 5c2a96f1a1ae8dff2d215bcc222cc280fae6f1b1 Mon Sep 17 00:00:00 2001 From: loerac Date: Wed, 26 Aug 2020 22:55:58 -0500 Subject: [PATCH 07/13] Added logs for cat-app The logs from cat-app will be in the same file as cat-machine The exception errors will be printed pretty --- catfeeder-app/src/catfeeder/app.py | 35 +++++++++++++++--------------- catfeeder-app/utils.py | 21 ++++++++++++++++++ 2 files changed, 39 insertions(+), 17 deletions(-) create mode 100644 catfeeder-app/utils.py diff --git a/catfeeder-app/src/catfeeder/app.py b/catfeeder-app/src/catfeeder/app.py index 3018bc0..a51ce81 100644 --- a/catfeeder-app/src/catfeeder/app.py +++ b/catfeeder-app/src/catfeeder/app.py @@ -1,9 +1,13 @@ """ An app to feed the cats """ -import toga -import requests +import errno import json +import requests +import os +import toga +import utils +from requests.exceptions import ConnectionError from toga.style import Pack from toga.style.pack import COLUMN, ROW @@ -13,6 +17,7 @@ RECIEVE_ALL_TIMES = BASE_URL + "/feedingTimes" feeding_times = [] +logger = utils.Applogger('cat-app') class CatFeeder(toga.App): # TODO: Come up with better variable names @@ -79,9 +84,9 @@ def addTime(self, widget): self.send_butt.enabled = True feeding_times.append((self.hour_input.value,self.min_input.value)) - time = self.prettyTime(feeding_times[len(feeding_times) - 1][0], feeding_times[len(feeding_times) - 1][1]) + time = utils.PrettyTime(feeding_times[len(feeding_times) - 1]) self.time_table.data.insert(0, time) - print("New Time:", feeding_times[len(feeding_times) - 1]) + logger.error("New Time: " + str(time)) self.error_label.text = "" ### @@ -116,48 +121,44 @@ def sendFeedingTime(self, widget): data = str(json.dumps(send_feeding_times)) ) except OSError as err: - print("OSError: Uh oh! Looks like you are in trouble...", err) + logger.error("OSError: Uh oh! Looks like you are in trouble..." + utils.StrError(err)) self.error_label.text = "Error on communicating with machine" return resp = req.text - print("Sent feeding time:", resp) + logger.error("Sent feeding time:" + str(resp)) self.error_label.text = "" ### # @brief: Get any existing feeding time payload ### def getFeedingTimes(self, widget): - feeding_times = [] - self.time_table.data.clear() - try: req = requests.get(url = RECIEVE_ALL_TIMES) if req == None: - print("Uh oh! Things not looking good") + logger.error("Uh oh! Things not looking good") self.error_label.text = "Received invalid feeding times:", req return if req.status_code != 200: - print("Uh oh! Not success:", req.status_code) + logger.error("Uh oh! Not success:" + str(req.status_code)) self.error_label.text = "Failed to recieve request:" + str(req.status_code) return except OSError as err: - print("OSError: Uh oh! Looks like you are in trouble...", err) + logger.error("OSError: Uh oh! Looks like you are in trouble..." + utils.StrError(err)) self.error_label.text = "Error on communicating with machine" return + feeding_times = [] + self.time_table.data.clear() resp = req.json() for i in range(len(resp)): feeding_times.append((resp[i]['hour'],resp[i]['minute'])) - time = self.prettyTime(feeding_times[len(feeding_times) - 1][0], feeding_times[len(feeding_times) - 1][1]) + time = utils.PrettyTime(feeding_times[len(feeding_times) - 1]) self.time_table.data.insert(i, time) - print("Recieved feeding times:", feeding_times) + logger.error("Recieved feeding times:" + str(feeding_times)) self.send_butt.enabled = True self.error_label.text = "" - def prettyTime(self, hour, minute): - return str(hour) + ":" + (str(minute) if int(minute) > 9 else "0" + str(minute)) - def main(): return CatFeeder() diff --git a/catfeeder-app/utils.py b/catfeeder-app/utils.py new file mode 100644 index 0000000..c652946 --- /dev/null +++ b/catfeeder-app/utils.py @@ -0,0 +1,21 @@ +import logging + +def Applogger(name): + logging.basicConfig(level=logging.WARNING, + filename='/tmp/cat-feeder.log', + format='%(asctime)s %(name)s - %(message)s', + datefmt='%Y/%m/%d %H:%M:%S' + ) + + logger = logging.getLogger(name) + + return logger + +def PrettyTime(feeding_times): + hour = feeding_times[0] + minute = feeding_times[1] + + return str(hour) + ":" + (str(minute) if int(minute) > 9 else "0" + str(minute)) + +def StrError(err): + return str(err.args[0].reason)[str(err.args[0].reason).find(":") + 2:] From 31a12bdac9004034763188d04356f494df6a705d Mon Sep 17 00:00:00 2001 From: loerac Date: Wed, 26 Aug 2020 22:56:41 -0500 Subject: [PATCH 08/13] Don't use pointer A pointer to the open file was causing problems on others to use the file --- catfeeder-machine/logger.go | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/catfeeder-machine/logger.go b/catfeeder-machine/logger.go index 9312f9e..7abc9bb 100644 --- a/catfeeder-machine/logger.go +++ b/catfeeder-machine/logger.go @@ -15,8 +15,6 @@ type Logger struct { const LogFilename string = "/tmp/cat-feeder.log" -var Fpath *os.File - /** * @brief: Checks to see if the log file is present from a previous * execution. If true, roll over log with timestamp. Then @@ -24,7 +22,7 @@ var Fpath *os.File * * @return: nil on success, else error **/ -func LoggerInit() (err error) { +func LoggerInit() error { finfo, err := os.Stat(LogFilename) if err == nil { path := strings.Split(LogFilename, finfo.Name())[0] @@ -37,7 +35,6 @@ func LoggerInit() (err error) { } } - Fpath, err = os.Create(LogFilename) return err } @@ -49,9 +46,15 @@ func LoggerInit() (err error) { * @return: New logger, nil if error **/ func NewLogger(prefix string) *Logger { + fpath, err := os.OpenFile(LogFilename, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666) + + if err != nil { + return nil + } + return &Logger{ Prefix: prefix, - Fpath: Fpath, + Fpath: fpath, } } @@ -69,6 +72,7 @@ func NewLogger(prefix string) *Logger { func (l *Logger) Println(msg string) (int, error) { l.Lock.Lock() defer l.Lock.Unlock() + output := []byte(time.Now().Format("2006/01/02 15:04:05") + " " + l.Prefix + " - " + msg + "\n") return l.Fpath.Write(output) } From 6dfcc8283d8eee8b9a061a1f999d9dd55d0f43c3 Mon Sep 17 00:00:00 2001 From: loerac Date: Thu, 27 Aug 2020 09:02:50 -0500 Subject: [PATCH 09/13] Added comments and changed logs/labels Logging: Instead of having all the logs as 'error', changed some to be 'info' Label: Instead of printing some error messages to the screen, display them on the app --- catfeeder-app/utils.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/catfeeder-app/utils.py b/catfeeder-app/utils.py index c652946..9cb6c4f 100644 --- a/catfeeder-app/utils.py +++ b/catfeeder-app/utils.py @@ -1,7 +1,14 @@ import logging +### +# @brief: Create new logging object with the identity of `name` +# +# @arg: name - The name to give the identity of the log +# +# @return: Logger object +### def Applogger(name): - logging.basicConfig(level=logging.WARNING, + logging.basicConfig(level=logging.INFO, filename='/tmp/cat-feeder.log', format='%(asctime)s %(name)s - %(message)s', datefmt='%Y/%m/%d %H:%M:%S' @@ -11,11 +18,25 @@ def Applogger(name): return logger +### +# @brief: Turn the feeding time input to the time formate +# +# @arg: feeding_time - Array holding the hour and minute +# +# @return: String formated time +### def PrettyTime(feeding_times): hour = feeding_times[0] minute = feeding_times[1] return str(hour) + ":" + (str(minute) if int(minute) > 9 else "0" + str(minute)) -def StrError(err): +### +# @brief: Parse the OS error to return the error message +# +# @arg: err - OSError from try-except +# +# @return: String formated error message +### +def StrOSError(err): return str(err.args[0].reason)[str(err.args[0].reason).find(":") + 2:] From c3a14c74dae9c8428c6b111d3573a3edf843307e Mon Sep 17 00:00:00 2001 From: loerac Date: Thu, 27 Aug 2020 09:03:37 -0500 Subject: [PATCH 10/13] Changed logs/labels Logging: Instead of having all the logs as 'error', changed some to be 'info' Label: Instead of printing some error messages to the screen, display them on the app --- catfeeder-app/src/catfeeder/app.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/catfeeder-app/src/catfeeder/app.py b/catfeeder-app/src/catfeeder/app.py index a51ce81..c42c9c5 100644 --- a/catfeeder-app/src/catfeeder/app.py +++ b/catfeeder-app/src/catfeeder/app.py @@ -76,17 +76,17 @@ def startup(self): ### def addTime(self, widget): if self.hour_input.value == "": - print("Hour time is missing") + self.error_label.text = "Missing time for hour" return if self.min_input.value == "": - print("Minute time is missing") + self.error_label.text = "Missing time for minute" return self.send_butt.enabled = True feeding_times.append((self.hour_input.value,self.min_input.value)) time = utils.PrettyTime(feeding_times[len(feeding_times) - 1]) self.time_table.data.insert(0, time) - logger.error("New Time: " + str(time)) + logger.info("New Time: " + str(time)) self.error_label.text = "" ### @@ -102,7 +102,7 @@ def clearTable(self, widget): ### def sendFeedingTime(self, widget): if len(feeding_times) == 0: - print("No times given") + self.error_label.text = "No feeding times present" return send_feeding_times = [] @@ -121,12 +121,12 @@ def sendFeedingTime(self, widget): data = str(json.dumps(send_feeding_times)) ) except OSError as err: - logger.error("OSError: Uh oh! Looks like you are in trouble..." + utils.StrError(err)) - self.error_label.text = "Error on communicating with machine" + logger.error("Uh oh! Looks like trouble found you: error(" + utils.StrOSError(err) + ")") + self.error_label.text = "Error on communicating with machine: error(" + utils.StrOSError(err) + ")" return resp = req.text - logger.error("Sent feeding time:" + str(resp)) + logger.info("Sent feeding time:" + str(resp)) self.error_label.text = "" ### @@ -136,17 +136,17 @@ def getFeedingTimes(self, widget): try: req = requests.get(url = RECIEVE_ALL_TIMES) if req == None: - logger.error("Uh oh! Things not looking good") + logger.error("Uh oh! Received invalid feeding times: Feeding-Time(" + req + ")") self.error_label.text = "Received invalid feeding times:", req return if req.status_code != 200: - logger.error("Uh oh! Not success:" + str(req.status_code)) - self.error_label.text = "Failed to recieve request:" + str(req.status_code) + logger.error("Uh oh! Request unsuccessful: HTTP(" + str(req.status_code) + ")") + self.error_label.text = "Failed to recieve request: HTTP(" + str(req.status_code) + ")" return except OSError as err: - logger.error("OSError: Uh oh! Looks like you are in trouble..." + utils.StrError(err)) - self.error_label.text = "Error on communicating with machine" + logger.error("Uh oh! Looks like trouble found you: error(" + utils.StrOSError(err) + ")") + self.error_label.text = "Error on communicating with machine: error(" + utils.StrOSError(err) + ")" return feeding_times = [] From bc4e9fdbd5f3be1e1e14cf2c59ddff9df792e64e Mon Sep 17 00:00:00 2001 From: loerac Date: Thu, 27 Aug 2020 09:05:29 -0500 Subject: [PATCH 11/13] Changed the logger to be golog Naming it logger doesn't sound right, I like golog/Golog better --- catfeeder-machine/{logger.go => golog.go} | 20 ++++++++++---------- catfeeder-machine/main.go | 4 ++-- catfeeder-machine/rest-api.go | 4 ++-- 3 files changed, 14 insertions(+), 14 deletions(-) rename catfeeder-machine/{logger.go => golog.go} (81%) diff --git a/catfeeder-machine/logger.go b/catfeeder-machine/golog.go similarity index 81% rename from catfeeder-machine/logger.go rename to catfeeder-machine/golog.go index 7abc9bb..2ec69f4 100644 --- a/catfeeder-machine/logger.go +++ b/catfeeder-machine/golog.go @@ -7,7 +7,7 @@ import ( "time" ) -type Logger struct { +type Golog struct { Lock sync.Mutex Fpath *os.File Prefix string @@ -22,7 +22,7 @@ const LogFilename string = "/tmp/cat-feeder.log" * * @return: nil on success, else error **/ -func LoggerInit() error { +func InitGolog() error { finfo, err := os.Stat(LogFilename) if err == nil { path := strings.Split(LogFilename, finfo.Name())[0] @@ -39,20 +39,20 @@ func LoggerInit() error { } /** - * @brief: Create a Logger with prefix and filepath + * @brief: Create a Golog with prefix and filepath * * @arg: prefix - String to prepend to the log message * * @return: New logger, nil if error **/ -func NewLogger(prefix string) *Logger { +func OpenGolog(prefix string) *Golog { fpath, err := os.OpenFile(LogFilename, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666) if err != nil { return nil } - return &Logger{ + return &Golog{ Prefix: prefix, Fpath: fpath, } @@ -69,10 +69,10 @@ func NewLogger(prefix string) *Logger { * @return: int - How many bytes were written * error - Errors while writing **/ -func (l *Logger) Println(msg string) (int, error) { - l.Lock.Lock() - defer l.Lock.Unlock() +func (gl *Golog) Println(msg string) (int, error) { + gl.Lock.Lock() + defer gl.Lock.Unlock() - output := []byte(time.Now().Format("2006/01/02 15:04:05") + " " + l.Prefix + " - " + msg + "\n") - return l.Fpath.Write(output) + output := []byte(time.Now().Format("2006/01/02 15:04:05") + " " + gl.Prefix + " - " + msg + "\n") + return gl.Fpath.Write(output) } diff --git a/catfeeder-machine/main.go b/catfeeder-machine/main.go index 7629157..3f84eeb 100644 --- a/catfeeder-machine/main.go +++ b/catfeeder-machine/main.go @@ -38,14 +38,14 @@ func TimeToFeedCat() bool { } func init() { - if err := LoggerInit(); err != nil { + if err := InitGolog(); err != nil { fmt.Println("Failed to initialize log rollover:", err) } } func main() { /* Open log file */ - cat_log := NewLogger("cat-manager") + cat_log := OpenGolog("cat-manager") /* Run REST API */ go HandleRequests() diff --git a/catfeeder-machine/rest-api.go b/catfeeder-machine/rest-api.go index 152e1d0..869e503 100644 --- a/catfeeder-machine/rest-api.go +++ b/catfeeder-machine/rest-api.go @@ -9,7 +9,7 @@ import ( "github.com/gorilla/mux" ) -var rest_log *Logger +var rest_log *Golog func FeedingTimeStr(feeding_times []FeedingTimes) string { ft_str := "" @@ -83,7 +83,7 @@ func HomePage(w http.ResponseWriter, r *http.Request) { * @brief: Handle to monitor all the CRUD methods. **/ func HandleRequests() { - rest_log = NewLogger("rest-api") + rest_log = OpenGolog("rest-api") myRouter := mux.NewRouter().StrictSlash(true) myRouter.HandleFunc("/", HomePage) From e953b2e8ae5e7fe3dde11ae531b628545e5bd110 Mon Sep 17 00:00:00 2001 From: loerac Date: Thu, 27 Aug 2020 09:14:01 -0500 Subject: [PATCH 12/13] Remove unneeded imports errno, os, ConnectionError --- catfeeder-app/src/catfeeder/app.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/catfeeder-app/src/catfeeder/app.py b/catfeeder-app/src/catfeeder/app.py index c42c9c5..ffdf2c2 100644 --- a/catfeeder-app/src/catfeeder/app.py +++ b/catfeeder-app/src/catfeeder/app.py @@ -1,13 +1,10 @@ """ An app to feed the cats """ -import errno import json import requests -import os import toga import utils -from requests.exceptions import ConnectionError from toga.style import Pack from toga.style.pack import COLUMN, ROW From 177117e9b656e0f6e27f8f08e0295dd3fbe4ce7f Mon Sep 17 00:00:00 2001 From: loerac Date: Thu, 27 Aug 2020 09:33:37 -0500 Subject: [PATCH 13/13] Updated per comments --- catfeeder-app/src/catfeeder/app.py | 4 ++-- catfeeder-app/utils.py | 4 ++-- catfeeder-machine/golog.go | 6 +++--- catfeeder-machine/rest-api.go | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/catfeeder-app/src/catfeeder/app.py b/catfeeder-app/src/catfeeder/app.py index ffdf2c2..6f52271 100644 --- a/catfeeder-app/src/catfeeder/app.py +++ b/catfeeder-app/src/catfeeder/app.py @@ -138,7 +138,7 @@ def getFeedingTimes(self, widget): return if req.status_code != 200: logger.error("Uh oh! Request unsuccessful: HTTP(" + str(req.status_code) + ")") - self.error_label.text = "Failed to recieve request: HTTP(" + str(req.status_code) + ")" + self.error_label.text = "Failed to receive request: HTTP(" + str(req.status_code) + ")" return except OSError as err: @@ -153,7 +153,7 @@ def getFeedingTimes(self, widget): feeding_times.append((resp[i]['hour'],resp[i]['minute'])) time = utils.PrettyTime(feeding_times[len(feeding_times) - 1]) self.time_table.data.insert(i, time) - logger.error("Recieved feeding times:" + str(feeding_times)) + logger.info("Received feeding times:" + str(feeding_times)) self.send_butt.enabled = True self.error_label.text = "" diff --git a/catfeeder-app/utils.py b/catfeeder-app/utils.py index 9cb6c4f..ff9a8e1 100644 --- a/catfeeder-app/utils.py +++ b/catfeeder-app/utils.py @@ -19,7 +19,7 @@ def Applogger(name): return logger ### -# @brief: Turn the feeding time input to the time formate +# @brief: Turn the feeding time input to the time format # # @arg: feeding_time - Array holding the hour and minute # @@ -36,7 +36,7 @@ def PrettyTime(feeding_times): # # @arg: err - OSError from try-except # -# @return: String formated error message +# @return: String formatted error message ### def StrOSError(err): return str(err.args[0].reason)[str(err.args[0].reason).find(":") + 2:] diff --git a/catfeeder-machine/golog.go b/catfeeder-machine/golog.go index 2ec69f4..1955312 100644 --- a/catfeeder-machine/golog.go +++ b/catfeeder-machine/golog.go @@ -17,8 +17,7 @@ const LogFilename string = "/tmp/cat-feeder.log" /** * @brief: Checks to see if the log file is present from a previous - * execution. If true, roll over log with timestamp. Then - * open a new log file. + * execution. If true, roll over log with timestamp. * * @return: nil on success, else error **/ @@ -39,7 +38,8 @@ func InitGolog() error { } /** - * @brief: Create a Golog with prefix and filepath + * @brief: Opens and creates a log file. If no errors opening/creating, + * then create a Golog with prefix and file pointer * * @arg: prefix - String to prepend to the log message * diff --git a/catfeeder-machine/rest-api.go b/catfeeder-machine/rest-api.go index 869e503..8d6e289 100644 --- a/catfeeder-machine/rest-api.go +++ b/catfeeder-machine/rest-api.go @@ -37,7 +37,7 @@ func CreateNewFeedTime(w http.ResponseWriter, r *http.Request) { json.NewEncoder(w).Encode(feeding_times) mut.Unlock() - rest_log.Println("Recieved feeding times:" + FeedingTimeStr(ft)) + rest_log.Println("Received feeding times:" + FeedingTimeStr(ft)) } /**