From e8ae139371e7488dbcc0f2af62f09ea9ec49427b Mon Sep 17 00:00:00 2001 From: Scantlight Date: Wed, 30 Jan 2013 14:15:39 +0100 Subject: [PATCH 1/6] flag parse + log module + configuration file flag parse, application can be started using some basic command line arguments: log - specify amount of output log (text messages) conf - path to a configuration file configuration file, function to load and parse configuration file log module, when log level is to hight application will panic --- admin/admin.go | 23 +++++++++++++++++++++++ log/.log.go.swo | Bin 12288 -> 0 bytes log/log.go | 8 +++++++- mapo.go | 25 +++++++++++++++++++++---- 4 files changed, 51 insertions(+), 5 deletions(-) delete mode 100644 log/.log.go.swo diff --git a/admin/admin.go b/admin/admin.go index feda89c..561f98d 100644 --- a/admin/admin.go +++ b/admin/admin.go @@ -21,3 +21,26 @@ along with Mapo. If not, see . Package admin implements the API for Mapo's administration components. */ package admin + +import ( + "gconf/conf" +) + +/* +GlobalConfiguration, il oggetto globale per l'accesso ai dati contenuti nel +file di configurazione. +*/ +var GlobalConfiguration *conf.ConfigFile + +/* +ReadConfiguration, attiva il GlobalConfiguration. +*/ +func ReadConfiguration(filepath string) error { + + c, err := conf.ReadConfigFile(filepath) + if err == nil { + GlobalConfiguration = c + } + + return err +} diff --git a/log/.log.go.swo b/log/.log.go.swo deleted file mode 100644 index 31bbc0735276017e5aef0f3d0fa4d67ce4a3b674..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2&ubiI7{{M_u&i1uN{ikeS1Oyboo$jsC2f>#nzW1CWV_k5#H#S_>^r-Iv-2+V zzOx~%(X&dyqo4@>0cvTH)`Lec7EuuN;?YAv@us(c-*;xWk-FC6t?~vwnVol@_xbUC zo|zsO?F5%rZeUiPW01|p27 z?09qRu+o*I%0LWN_AQpCq7y$~h*YlvyxzY@of5z;IR%^o(-lZfaOAmtG(R_c)EYcf ze43wlygl94tvUsq0!{&^fK$LJ;1qBQI0c*n|4RkTa1XtO${rY3cW!*#bH{Of>JCl; zr+`zyDc}@v3OEIv0!{&^fK$LJ;1qBQ+=mK?F46CMiP{AukN^Kq{{G+DPjmxZ2OokD zz-!kI?z zlSv?ad1-rwFHxnE+cI8@)GT-)wH7_e!f-KjU*t%RWQ1RdCQ)mvD{E7O*5W|jV@zv0 zEu{7R_lV2Q=2~-V$mJwa$vwu*Y^Mdy-2XM|Hc_Dv42;*XG6$vNAXVLWD^dgx2iTvGu}$plv1|RTv?i(otw92*k%o_^YyHW!8rR# z`(Oj5Gehg27bktdqA#@MtSbw5m}I(5EbPgh26>GWi|ovr=*`gh{k+AP2CR%kGO2Am zI8+FOvBil+j=XFhV4MwFK8X1ew3;;Ot}|yxY2pSBv+>HDtxHq4XQkWz#v?kpz*-v3 zrY~8gW|*3BTA1@}u@|Y1h-`~{G9j|1?4H@6);S|hGFIB$&Ze6B##WC8W$IGFN=SuF zCUhWFMv$*!ZMbCbnCeJ`k?2I3i#!LN?JnAO7pYK0e~T0jhAOdJXej*G?Olb4bhtu| z-BX5JgZG*3y{EAOJ_l)J!XtUEd5RuY4wKy|A{F--J?ryXyx{CH*8+|eWY<#iiM}zz zg-T^}bJOd^sizXW?Hu|t)>2oV_h>_qoQ?Gf(}y$?LA*>omp$QxVpN*=c~;ooNXM>>PP<> z-Hfx0t!^Re*c3@3Vq+^Is}F~oyP=)iOwex9?3*w$s;>~D+v-^SAjuPoT)VK3cI1q68+h==DCTmV-?E~ zf)E)SU}asw_drjq?jo_!JhTnbeH7E#x?N*nQ_kGlrCalYF}|f^rBFd Uxt_nv&y5g2TqNoW{m>5WpVYT|z5oCK diff --git a/log/log.go b/log/log.go index b39a22f..52a0985 100644 --- a/log/log.go +++ b/log/log.go @@ -42,7 +42,13 @@ var l logger // SetLevel sets the output level for the global logger func SetLevel(level int) { - l.level = level + + if level <= DEBUG { + l.level = level + return + } + + panic(fmt.Sprintf("Unknown log level %v", level)) } func print(level int, format string, v ...interface{}) { diff --git a/mapo.go b/mapo.go index 5c2790b..2cc952c 100644 --- a/mapo.go +++ b/mapo.go @@ -21,16 +21,33 @@ package main import ( "mapo/log" + "mapo/admin" + + "flag" ) func main() { + + log.Info("Starting application") + // parse flags + var logLevel = flag.Int("log", 1, "set message level eg: 0 = DEBUG, 1 = INFO, 2 = ERROR") + var confFilePath = flag.String("conf", "./conf.ini", "set path to configuration file") + flag.Parse() - // load config and setup application - log.SetLevel(log.DEBUG) - log.Info("Setting log level to DEBUG") + // set log level + log.SetLevel(*logLevel) + log.Info("Setting log level to %d", *logLevel) - log.Info("Starting application") + // load config and setup application + log.Info("Loading configuration from file") + err := admin.ReadConfiguration(*confFilePath) + if err != nil { + log.Info("%s, no such file or directory", *confFilePath) + return + } + + // setup application // register with supervisor log.Info("Joining supervisor") From 9997d09fd0acff4b6c734e33a0554c4fb36788e1 Mon Sep 17 00:00:00 2001 From: Scantlight Date: Thu, 31 Jan 2013 14:06:29 +0100 Subject: [PATCH 2/6] Formated code with gofmt tool. --- admin/admin.go | 12 ++++++------ log/log.go | 10 +++++----- mapo.go | 23 +++++++++++------------ 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/admin/admin.go b/admin/admin.go index 561f98d..de01598 100644 --- a/admin/admin.go +++ b/admin/admin.go @@ -23,7 +23,7 @@ Package admin implements the API for Mapo's administration components. package admin import ( - "gconf/conf" + "gconf/conf" ) /* @@ -37,10 +37,10 @@ ReadConfiguration, attiva il GlobalConfiguration. */ func ReadConfiguration(filepath string) error { - c, err := conf.ReadConfigFile(filepath) - if err == nil { - GlobalConfiguration = c - } + c, err := conf.ReadConfigFile(filepath) + if err == nil { + GlobalConfiguration = c + } - return err + return err } diff --git a/log/log.go b/log/log.go index 52a0985..c196ed0 100644 --- a/log/log.go +++ b/log/log.go @@ -43,12 +43,12 @@ var l logger // SetLevel sets the output level for the global logger func SetLevel(level int) { - if level <= DEBUG { - l.level = level - return - } + if level <= DEBUG { + l.level = level + return + } - panic(fmt.Sprintf("Unknown log level %v", level)) + panic(fmt.Sprintf("Unknown log level %v", level)) } func print(level int, format string, v ...interface{}) { diff --git a/mapo.go b/mapo.go index 2cc952c..4fe9ca8 100644 --- a/mapo.go +++ b/mapo.go @@ -20,10 +20,10 @@ along with Mapo. If not, see . package main import ( + "mapo/admin" "mapo/log" - "mapo/admin" - "flag" + "flag" ) func main() { @@ -31,21 +31,21 @@ func main() { log.Info("Starting application") // parse flags - var logLevel = flag.Int("log", 1, "set message level eg: 0 = DEBUG, 1 = INFO, 2 = ERROR") - var confFilePath = flag.String("conf", "./conf.ini", "set path to configuration file") - flag.Parse() + var logLevel = flag.Int("log", 1, "set message level eg: 0 = DEBUG, 1 = INFO, 2 = ERROR") + var confFilePath = flag.String("conf", "./conf.ini", "set path to configuration file") + flag.Parse() - // set log level + // set log level log.SetLevel(*logLevel) log.Info("Setting log level to %d", *logLevel) // load config and setup application log.Info("Loading configuration from file") - err := admin.ReadConfiguration(*confFilePath) - if err != nil { - log.Info("%s, no such file or directory", *confFilePath) - return - } + err := admin.ReadConfiguration(*confFilePath) + if err != nil { + log.Info("%s, no such file or directory", *confFilePath) + return + } // setup application @@ -81,7 +81,6 @@ func main() { // return result to user - // close on signal log.Info("Closing application") } From e85bb643f1ed61a01d1b3336e547bc19cfeba273 Mon Sep 17 00:00:00 2001 From: Scantlight Date: Thu, 31 Jan 2013 16:34:01 +0100 Subject: [PATCH 3/6] =?UTF-8?q?Al=20avvio=20dell'applicazione=20tutti=20i?= =?UTF-8?q?=20messaggi=20esistenti=20fino=20a=20quando=20il=20livello=20de?= =?UTF-8?q?l=20log=20viene=20cambiato=20da=20nul=20al=20valore=20passato?= =?UTF-8?q?=20nella=20riga=20di=20caomando,=20non=20vengono=20visualizzati?= =?UTF-8?q?.=20Perch=C3=A9=20il=20logger,=20appunto,=20ha=20un=20valore=20?= =?UTF-8?q?indefinito.=20Per=20risolvere=20questa=20situazione,=20impostia?= =?UTF-8?q?mo=20un=20valore=20di=20default=201=20(INFO)=20nel=20momento=20?= =?UTF-8?q?della=20dichiarazione=20del=20logger=20globale.=20var=20l=20log?= =?UTF-8?q?ger=20=3D=20logger{1}?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La funzione SetLevel non risponde più con un panico nel momento in quale il valore del log richiesto è fuori dalle limiti predefinite. Ma restituisce un errore che permette all'applicazione di chiudere in una maniera meno stressante per l'utente. --- log/log.go | 11 ++++++----- mapo.go | 6 +++++- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/log/log.go b/log/log.go index c196ed0..e15d353 100644 --- a/log/log.go +++ b/log/log.go @@ -23,6 +23,7 @@ Package log contains a simple multi-level logger. package log import ( + "errors" "fmt" "time" ) @@ -38,17 +39,17 @@ type logger struct { level int } -var l logger +var l logger = logger{1} // SetLevel sets the output level for the global logger -func SetLevel(level int) { +func SetLevel(level int) error { - if level <= DEBUG { + if level <= DEBUG && level >= ERROR { l.level = level - return + return nil } - panic(fmt.Sprintf("Unknown log level %v", level)) + return errors.New(fmt.Sprintf("Unknown log level %v", level)) } func print(level int, format string, v ...interface{}) { diff --git a/mapo.go b/mapo.go index 4fe9ca8..3f31667 100644 --- a/mapo.go +++ b/mapo.go @@ -36,8 +36,12 @@ func main() { flag.Parse() // set log level - log.SetLevel(*logLevel) log.Info("Setting log level to %d", *logLevel) + if err := log.SetLevel(*logLevel); err != nil { + log.SetLevel(0) + log.Error("%v", err) + return + } // load config and setup application log.Info("Loading configuration from file") From e193546d5d55a1c31c998206c7c6b25efa07092b Mon Sep 17 00:00:00 2001 From: Scantlight Date: Thu, 31 Jan 2013 19:59:17 +0100 Subject: [PATCH 4/6] Renamed gconf back to it's original name goconf code.google.com/p/goconf --- admin/admin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/admin.go b/admin/admin.go index de01598..18d1716 100644 --- a/admin/admin.go +++ b/admin/admin.go @@ -23,7 +23,7 @@ Package admin implements the API for Mapo's administration components. package admin import ( - "gconf/conf" + "goconf/conf" ) /* From d3b5e77a6192481dd99d817fe9b5cf880b30e1e9 Mon Sep 17 00:00:00 2001 From: Scantlight Date: Thu, 7 Feb 2013 19:48:23 +0100 Subject: [PATCH 5/6] Switched to log and conf module from utils repository. --- admin/admin.go | 23 ------------- log/log.go | 88 -------------------------------------------------- mapo.go | 40 ++++++++++++++--------- 3 files changed, 25 insertions(+), 126 deletions(-) delete mode 100644 log/log.go diff --git a/admin/admin.go b/admin/admin.go index 18d1716..feda89c 100644 --- a/admin/admin.go +++ b/admin/admin.go @@ -21,26 +21,3 @@ along with Mapo. If not, see . Package admin implements the API for Mapo's administration components. */ package admin - -import ( - "goconf/conf" -) - -/* -GlobalConfiguration, il oggetto globale per l'accesso ai dati contenuti nel -file di configurazione. -*/ -var GlobalConfiguration *conf.ConfigFile - -/* -ReadConfiguration, attiva il GlobalConfiguration. -*/ -func ReadConfiguration(filepath string) error { - - c, err := conf.ReadConfigFile(filepath) - if err == nil { - GlobalConfiguration = c - } - - return err -} diff --git a/log/log.go b/log/log.go deleted file mode 100644 index e15d353..0000000 --- a/log/log.go +++ /dev/null @@ -1,88 +0,0 @@ -/* -Copyright 2013 Petru Ciobanu, Francesco Paglia, Lorenzo Pierfederici - -This file is part of Mapo. - -Mapo is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -Mapo is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with Mapo. If not, see . -*/ - -/* -Package log contains a simple multi-level logger. -*/ -package log - -import ( - "errors" - "fmt" - "time" -) - -// Available log levels -const ( - ERROR = iota - INFO - DEBUG -) - -type logger struct { - level int -} - -var l logger = logger{1} - -// SetLevel sets the output level for the global logger -func SetLevel(level int) error { - - if level <= DEBUG && level >= ERROR { - l.level = level - return nil - } - - return errors.New(fmt.Sprintf("Unknown log level %v", level)) -} - -func print(level int, format string, v ...interface{}) { - if level <= l.level { - var msgType string - - switch level { - case ERROR: - msgType = "ERROR" - case INFO: - msgType = "INFO" - case DEBUG: - msgType = "DEBUG" - } - - msg := fmt.Sprintf(format, v...) - t := time.Now().Format(time.RFC1123) - fmt.Printf("%s [%s]: %s\n", t, msgType, msg) - - } -} - -// Error logs a message at "ERROR" level -func Error(format string, v ...interface{}) { - print(ERROR, format, v...) -} - -// Info logs a message at "INFO" level -func Info(format string, v ...interface{}) { - print(INFO, format, v...) -} - -// Debug logs a message at "DEBUG" level -func Debug(format string, v ...interface{}) { - print(DEBUG, format, v...) -} diff --git a/mapo.go b/mapo.go index 3f31667..abee75c 100644 --- a/mapo.go +++ b/mapo.go @@ -20,39 +20,49 @@ along with Mapo. If not, see . package main import ( - "mapo/admin" - "mapo/log" + "github.com/maponet/utils/log" + "github.com/maponet/utils/conf" "flag" ) func main() { - log.Info("Starting application") + /* + parse flags - // parse flags - var logLevel = flag.Int("log", 1, "set message level eg: 0 = DEBUG, 1 = INFO, 2 = ERROR") + In some situation we will pass path to configuration file as a command line + value. This meaning that for first off all we need to define and parse all flags. + The only flag that we required on this step is only conf flag ... But we + can't distribute code with same functionality along file or files. + */ + var logLevel = log.FlagLevel("log") var confFilePath = flag.String("conf", "./conf.ini", "set path to configuration file") flag.Parse() - // set log level - log.Info("Setting log level to %d", *logLevel) - if err := log.SetLevel(*logLevel); err != nil { - log.SetLevel(0) + // load config and setup application + err := conf.ParseConfigFile(*confFilePath) + if err != nil { log.Error("%v", err) return } - // load config and setup application - log.Info("Loading configuration from file") - err := admin.ReadConfiguration(*confFilePath) - if err != nil { - log.Info("%s, no such file or directory", *confFilePath) - return + // setup configuration value passed as command line arguments + if len(*logLevel) > 0 { + conf.GlobalConfiguration.AddOption("default", "loglevel", *logLevel) } // setup application + // set log level + value, _ := conf.GlobalConfiguration.GetString("default", "loglevel") + if err := log.SetLevelString(value); err != nil { + log.Error("%v", err) + return + } + + log.Info("Starting application") + // register with supervisor log.Info("Joining supervisor") From 2cce02e6f31a2bfc6402167eb8eb1b3b23ee30b4 Mon Sep 17 00:00:00 2001 From: Scantlight Date: Thu, 7 Feb 2013 19:58:31 +0100 Subject: [PATCH 6/6] Sample of configuration file. --- conf.ini | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 conf.ini diff --git a/conf.ini b/conf.ini new file mode 100644 index 0000000..1cfd8c7 --- /dev/null +++ b/conf.ini @@ -0,0 +1,7 @@ +[default] +cookiesecret = some secrete phrase +mapohome = /mapo/root/folder + +[googleoauth] +clientid = client_id +clientsecret = client_secret