From 81e84baa35399d58eb52dff8efd16b7347b8891c Mon Sep 17 00:00:00 2001 From: Joerg Lehmann Date: Wed, 2 Jun 2021 17:48:46 +0200 Subject: [PATCH] add additional config settings to modify --- metrics.go | 10 ++++ persistence.go | 129 ++++++++++++++++++++++++++++++++++++++++-- snippets/tracker.html | 47 +++++++++++++++ static/js/tracker.js | 98 +++++++++++++++++++++++++++++++- tracker.go | 83 +++++++++++++++++++++++++++ 5 files changed, 361 insertions(+), 6 deletions(-) diff --git a/metrics.go b/metrics.go index 90d3e92..c73e88d 100644 --- a/metrics.go +++ b/metrics.go @@ -19,6 +19,11 @@ type OneMetric struct { DeveuiJS template.JS Alias string Readonly bool + Smsalarmactive string + Smsnumber string + Emailalarmactive string + Email string + Greenzone string Timestamp string PosTimestamp string Lat string @@ -458,6 +463,11 @@ func getLastMetrics(deveui string) OneMetric { res.LonJS = template.JS(res.Lon) res.Alias = getDevAlias(deveui) + res.Smsalarmactive = getDevSmsalarmactive(deveui) + res.Smsnumber = getDevSmsnumber(deveui) + res.Emailalarmactive = getDevEmailalarmactive(deveui) + res.Email = getDevEmail(deveui) + res.Greenzone = getDevGreenzone(deveui) res.Readonly = false res.ActiveUntil = getActiveUntil(deveui) res.DaysUntilDeactivated = CalcDaysUntil(res.ActiveUntil) diff --git a/persistence.go b/persistence.go index 9ff0014..a4cd43b 100644 --- a/persistence.go +++ b/persistence.go @@ -52,9 +52,14 @@ func ping(c redis.Conn) error { } type Dev struct { - Deveui string - Alias string - ActiveUntil string // Abo bezahlt bis TT.MM.YYYY + Deveui string + Alias string + SmsAlarmactive string + Smsnumber string + EmailAlarmactive string + Email string + Greenzone string + ActiveUntil string // Abo bezahlt bis TT.MM.YYYY } func initDB() { @@ -104,7 +109,13 @@ func updateTrackerSettings(trackerSettings Dev) error { defer conn.Close() // SET object - _, err := conn.Do("HMSET", devPrefix+trackerSettings.Deveui, "alias", trackerSettings.Alias) + _, err := conn.Do("HMSET", devPrefix+trackerSettings.Deveui, "alias", trackerSettings.Alias, + "smsalarmactive", trackerSettings.SmsAlarmactive, + "smsnumber", trackerSettings.Smsnumber, + "emailalarmactive", trackerSettings.EmailAlarmactive, + "email", trackerSettings.Email, + "greenzone", trackerSettings.Greenzone) + if err != nil { return err } @@ -171,6 +182,116 @@ func getDevAlias(deveui string) string { return res } +func getDevSmsalarmactive(deveui string) string { + res := "0" + + if deveui == "" { + return res + } + + conn := globalPool.Get() + defer conn.Close() + + logit("getDevSmslarmactive: Deveui: " + deveui) + smsalarmactive, err := redis.String(conn.Do("HGET", devPrefix+deveui, "smsalarmactive")) + if err == nil { + logit("getDevSmsalarmactive: smsalarmactive: " + smsalarmactive) + res = smsalarmactive + } else { + log.Print(err) + } + + return res +} + +func getDevSmsnumber(deveui string) string { + res := "+4179XXXXXXX" + + if deveui == "" { + return res + } + + conn := globalPool.Get() + defer conn.Close() + + logit("getDevSmsnumber: Deveui: " + deveui) + smsnumber, err := redis.String(conn.Do("HGET", devPrefix+deveui, "smsnumber")) + if err == nil { + logit("getDevSmsnumber: smsnumber: " + smsnumber) + res = smsnumber + } else { + log.Print(err) + } + + return res +} + +func getDevEmailalarmactive(deveui string) string { + res := "0" + + if deveui == "" { + return res + } + + conn := globalPool.Get() + defer conn.Close() + + logit("getDevEmailarmactive: Deveui: " + deveui) + emailalarmactive, err := redis.String(conn.Do("HGET", devPrefix+deveui, "emailalarmactive")) + if err == nil { + logit("getDevEmailarmactive: emailalarmactive: " + emailalarmactive) + res = emailalarmactive + } else { + log.Print(err) + } + + return res +} + +func getDevEmail(deveui string) string { + res := "" + + if deveui == "" { + return res + } + + conn := globalPool.Get() + defer conn.Close() + + logit("getDevEmail: Deveui: " + deveui) + email, err := redis.String(conn.Do("HGET", devPrefix+deveui, "email")) + if err == nil { + logit("getDevEmail: email: " + email) + res = email + } else { + log.Print(err) + } + + return res +} + +func getDevGreenzone(deveui string) string { + res := "" + + if deveui == "" { + return res + } + + conn := globalPool.Get() + defer conn.Close() + + logit("getDevGreenzone: Deveui: " + deveui) + greenzone, err := redis.String(conn.Do("HGET", devPrefix+deveui, "greenzone")) + if err == nil { + logit("getDevGreenzone: greenzone: " + greenzone) + res = greenzone + } else { + log.Print(err) + } + + return res +} + func getActiveUntil(deveui string) string { res := "" diff --git a/snippets/tracker.html b/snippets/tracker.html index 1539acf..f146a4c 100644 --- a/snippets/tracker.html +++ b/snippets/tracker.html @@ -35,6 +35,48 @@

+
+
+ +
+
+ +
+ +
+ + + +
+

+
+ +
+
+ +
+
+ +
+ +
+ + + +
+

+
+ +
+ +
+ + + +
+

+
+
Device ID:
@@ -102,6 +144,11 @@ Sie erhalten eine E-Mail, sobald die Zahlung erfolgreich abgeschlossen ist. {{range .LastMetrics}}

{{.Alias}}{{ if not .Readonly }}{{ end }}

+ + + + +

letzte übermittelte Messung: {{.Timestamp}}

{{.BatteryPercentHTML}}

diff --git a/static/js/tracker.js b/static/js/tracker.js index e35f009..02f3c28 100644 --- a/static/js/tracker.js +++ b/static/js/tracker.js @@ -5,7 +5,14 @@ var stripe_pk = ""; function validate(what, text) { if (what == 'alias') { var re = /^[a-zA-Z0-9 ]{1,25}$/; + } else if (what == 'smsnumber') { + var re = /^\+[0-9]{11,11}$/; + } else if (what == 'email') { + var re = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + } else if (what == 'greenzone') { + var re = /^$|^[0-9]+\.[0-9]+,[0-9]+\.[0-9],[0-9]+\.[0-9],[0-9]+\.[0-9]$/; } + return re.test(text); } @@ -46,11 +53,37 @@ $(document).ready(function () { abos_to_buy = {}; $(".show-modal").click(function () { $("#alias_exclamation").hide(); + $("#smsnumber_exclamation").hide(); + $("#email_exclamation").hide(); + $("#greenzone_exclamation").hide(); + var alias = $(this).prev().html(); + var deveui = $(this).prev().attr('id').replace("alias_", ""); $('#deveui').html(deveui); + var smsalarmactive = $('#smsalarmactive_'+deveui).html(); + var smsnumber = $('#smsnumber_'+deveui).html(); + var emailalarmactive = $('#emailalarmactive_'+deveui).html(); + var email = $('#email_'+deveui).html(); + var greenzone = $('#greenzone_'+deveui).html(); $("#alias").val(alias); + + if (smsalarmactive == "1") { + $('#smscheckbox').prop('checked', true); + } else { + $('#smscheckbox').prop('checked', false); + } + $("#smsnumber").val(smsnumber); + + if (emailalarmactive == "1") { + $('#emailcheckbox').prop('checked', true); + } else { + $('#emailcheckbox').prop('checked', false); + } + $("#email").val(email); + $("#greenzone").val(greenzone); + $("#modal").addClass("is-active"); }); @@ -140,6 +173,15 @@ $(document).ready(function () { }); $("#modal-save").click(function () { + var smsalarmactive = "0"; + if ($('#smscheckbox').prop('checked')) { + smsalarmactive = "1"; + } + var emailalarmactive = "0"; + if ($('#emailcheckbox').prop('checked')) { + emailalarmactive = "1"; + } + // Validation Code var is_valid = true; if (!validate('alias', $('#alias').val())) { @@ -153,6 +195,39 @@ $(document).ready(function () { $("#alias_exclamation").hide(); } + if (!validate('smsnumber',$('#smsnumber').val())) { + $('#smsnumber_errormsg').html('Beispiel einer gültigen SMS Nummer: +41761234567'); + $("#smsnumber").addClass("is-danger"); + $("#smsnumber_exclamation").show(); + is_valid = false; + } else { + $('#smsnumber_errormsg').html(''); + $("#smsnumber").removeClass("is-danger"); + $("#smsnumber_exclamation").hide(); + } + + if (!validate('email',$('#email').val())) { + $('#email_errormsg').html('Beispiel einer gültigen E-Mail Adresse: max.mustermann@example.com'); + $("#email").addClass("is-danger"); + $("#email_exclamation").show(); + is_valid = false; + } else { + $('#email_errormsg').html(''); + $("#email").removeClass("is-danger"); + $("#email_exclamation").hide(); + } + + if (!validate('greenzone',$('#greenzone').val())) { + $('#greenzone_errormsg').html('Eingabe: lat_min,lon_min,lat_max,lon_max oder aber leeres Feld'); + $("#greenzone").addClass("is-danger"); + $("#greenzone_exclamation").show(); + is_valid = false; + } else { + $('#greenzone_errormsg').html(''); + $("#greenzone").removeClass("is-danger"); + $("#greenzone_exclamation").hide(); + } + if (!(is_valid)) { return; } @@ -163,11 +238,30 @@ $(document).ready(function () { dataType: "json", data: { deveui: $('#deveui').html(), - alias: $('#alias').val() + alias: $('#alias').val(), + smsnumber: $("#smsnumber").val(), + smsalarmactive: smsalarmactive, + email: $("#email").val(), + emailalarmactive: emailalarmactive, + greenzone: $("#greenzone").val() + }, success: function (response) { if (response.rc == 0) { - $('#alias_' + $('#deveui').html()).html($('#alias').val()); + $('#alias_'+$('#deveui').html()).html($('#alias').val()); + var smsalarmactive = "0"; + if ($('#smscheckbox').prop('checked')) { + smsalarmactive = "1"; + } + $('#smsalarmactive_'+$('#deveui').html()).html(smsalarmactive); + $('#smsnumber_'+$('#deveui').html()).html($('#smsnumber').val()); + var emailalarmactive = "0"; + if ($('#emailcheckbox').prop('checked')) { + emailalarmactive = "1"; + } + $('#emailalarmactive_'+$('#deveui').html()).html(emailalarmactive); + $('#email_'+$('#deveui').html()).html($('#email').val()); + $('#greenzone_'+$('#deveui').html()).html($('#greenzone').val()); } }, error: function (xhr) { diff --git a/tracker.go b/tracker.go index 0406d51..57e0186 100644 --- a/tracker.go +++ b/tracker.go @@ -55,9 +55,92 @@ func save_tracker_settingsHandler(response http.ResponseWriter, request *http.Re return } + smsalarmactive, ok3 := request.URL.Query()["smsalarmactive"] + + if !ok3 || len(smsalarmactive[0]) < 1 { + log.Println("Url Param 'smsalarmactive' is missing") + fmt.Fprintf(response, "{ \"rc\": 4, \"msg\": \"smsalarmactive must be specified in URL\" }") + return + } + mysmsalarmactive := smsalarmactive[0] + + if !((mysmsalarmactive == "0") || (mysmsalarmactive == "1")) { + log.Println("Url Param 'smsalarmactive' is not valid") + fmt.Fprintf(response, "{ \"rc\": 10, \"msg\": \"smsalarmactive is not valid\" }") + return + } + + smsnumber, ok4 := request.URL.Query()["smsnumber"] + + if !ok4 || len(smsnumber[0]) < 1 { + log.Println("Url Param 'smsnumber' is missing") + fmt.Fprintf(response, "{ \"rc\": 5, \"msg\": \"smsnumber must be specified in URL\" }") + return + } + mysmsnumber := smsnumber[0] + + match1, _ := regexp.MatchString(`^\+[0-9]{11,11}$`, mysmsnumber) + if !(match1) { + log.Println("Url Param 'smsnumber' is not valid") + fmt.Fprintf(response, "{ \"rc\": 11, \"msg\": \"smsnumber is not valid, must be in in format +41791234567\" }") + return + } + + emailalarmactive, ok5 := request.URL.Query()["emailalarmactive"] + + if !ok5 || len(emailalarmactive[0]) < 1 { + log.Println("Url Param 'emailalarmactive' is missing") + fmt.Fprintf(response, "{ \"rc\": 12, \"msg\": \"emailalarmactive must be specified in URL\" }") + return + } + myemailalarmactive := emailalarmactive[0] + + if !((myemailalarmactive == "0") || (myemailalarmactive == "1")) { + log.Println("Url Param 'emailalarmactive' is not valid") + fmt.Fprintf(response, "{ \"rc\": 13, \"msg\": \"emailalarmactive is not valid\" }") + return + } + + email, ok6 := request.URL.Query()["email"] + + if !ok6 { + log.Println("Url Param 'email' is missing") + fmt.Fprintf(response, "{ \"rc\": 14, \"msg\": \"email must be specified in URL\" }") + return + } + myemail := email[0] + + match2, _ := regexp.MatchString(`^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$`, myemail) + if !(match2) { + log.Println("Url Param 'email' is not valid") + fmt.Fprintf(response, "{ \"rc\": 15, \"msg\": \"email is not valid, must be in in format max.mustermann@example.com\" }") + return + } + + greenzone, ok7 := request.URL.Query()["greenzone"] + + if !ok7 { + log.Println("Url Param 'greenzone' is missing") + fmt.Fprintf(response, "{ \"rc\": 16, \"msg\": \"greenzone must be specified in URL\" }") + return + } + mygreenzone := greenzone[0] + + match3, _ := regexp.MatchString(`^$|^[0-9]+\.[0-9]+,[0-9]+\.[0-9],[0-9]+\.[0-9],[0-9]+\.[0-9]$`, mygreenzone) + if !(match3) { + log.Println("Url Param 'email' is not valid") + fmt.Fprintf(response, "{ \"rc\": 17, \"msg\": \"email is not valid, must be in in format max.mustermann@example.com\" }") + return + } + var mydev Dev mydev.Deveui = mydeveui mydev.Alias = myalias + mydev.SmsAlarmactive = mysmsalarmactive + mydev.Smsnumber = mysmsnumber + mydev.EmailAlarmactive = myemailalarmactive + mydev.Email = myemail + mydev.Greenzone = mygreenzone // now we try to save the settings err := updateTrackerSettings(mydev)