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 }}
+
{{.Smsalarmactive}}
+
{{.Smsnumber}}
+
{{.Emailalarmactive}}
+
{{.Email}}
+
{{.Greenzone}}
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)