This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revision | |||
| sdk:scripts:sms-control [2022/08/26 10:52] – removed dodenhoeft | sdk:scripts:sms-control [2022/08/26 11:04] (current) – created dodenhoeft | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== SMS-Control ====== | ||
| + | |||
| + | <code c sms-control.are> | ||
| + | |||
| + | /* DESC: This script will execute commands received by SMS. | ||
| + | * Copyright (C) 2012 NetModule AG, Switzerland | ||
| + | | ||
| + | * sms-commands: | ||
| + | * < | ||
| + | * < | ||
| + | * < | ||
| + | * < | ||
| + | * <output [1|2] [on|off]> | ||
| + | */ | ||
| + | |||
| + | INTERVAL | ||
| + | MAXMSG | ||
| + | MAXAGE | ||
| + | MAXLINES | ||
| + | AUTH = 1; /* perform authentication | ||
| + | ADMPWD | ||
| + | IGNORECASE | ||
| + | SENDERS | ||
| + | |||
| + | /* check if we should perform authentication */ | ||
| + | if (argc == 2 && argv[1] == " | ||
| + | AUTH = 0; | ||
| + | } | ||
| + | |||
| + | /* retrieve password */ | ||
| + | if (AUTH) { | ||
| + | if (strlen(ADMPWD) == 0) { | ||
| + | /* use configured admin password */ | ||
| + | ADMPWD = nb_config_get(" | ||
| + | if (strlen(ADMPWD) > 0) { | ||
| + | nb_syslog(" | ||
| + | } else { | ||
| + | /* not there -> use a default password instead */ | ||
| + | nb_syslog(" | ||
| + | ADMPWD = " | ||
| + | } | ||
| + | } | ||
| + | if (IGNORECASE) ADMPWD = tolower(ADMPWD); | ||
| + | } | ||
| + | |||
| + | /* split a message into an array */ | ||
| + | array split(string msg) { | ||
| + | args=mkarray(); | ||
| + | pos=strchr(msg, | ||
| + | if(pos==0) msg=""; | ||
| + | if(pos> | ||
| + | pos=strchr(msg, | ||
| + | if(pos==0) msg=""; | ||
| + | if(pos> | ||
| + | for(n=0;;) { | ||
| + | pos=strchr(msg, | ||
| + | if(is_void(pos)) pos=strchr(msg, | ||
| + | if(is_void(pos)) pos=strchr(msg, | ||
| + | if(pos==0) { | ||
| + | msg=trim(msg); | ||
| + | } else if(pos> | ||
| + | args[n++]=trim(left(msg, | ||
| + | msg=trim(substr(msg, | ||
| + | } else { | ||
| + | if(msg!="" | ||
| + | break; | ||
| + | } | ||
| + | } | ||
| + | return args; | ||
| + | } | ||
| + | |||
| + | /* parse message */ | ||
| + | array parse (string msg) | ||
| + | { | ||
| + | /* read by line */ | ||
| + | lnr = 0; | ||
| + | ishdr = 1; | ||
| + | tlnr = 0; | ||
| + | allowed = (length(SENDERS) == 0) ? 1 : 0; | ||
| + | | ||
| + | lp = msg; | ||
| + | for (lnr = 0; lnr < MAXLINES && strlen(lp) > 0; lnr++) { | ||
| + | pos = strchr(lp, " | ||
| + | if (is_void(pos)) pos = strlen(lp); | ||
| + | |||
| + | line = left(lp, pos); | ||
| + | lp = substr(lp, pos + 1); | ||
| + | | ||
| + | if (strlen(line) == 0) { | ||
| + | /* saw header separator */ | ||
| + | ishdr = 0; | ||
| + | continue; | ||
| + | } | ||
| + | if (ishdr) { | ||
| + | /* saw header line */ | ||
| + | if (left(line, 5) == " | ||
| + | /* check age of message */ | ||
| + | sentdate = trim(substr(line, | ||
| + | sent = strptime(sentdate, | ||
| + | | ||
| + | if (!is_void(sent)) { | ||
| + | /* got a valid sent date */ | ||
| + | now = localtime(time()); | ||
| + | age = mktime(now) - mktime(sent); | ||
| + | nb_syslog(" | ||
| + | if (age > MAXAGE) { | ||
| + | nb_syslog(" | ||
| + | return mkarray(); | ||
| + | } | ||
| + | } else { | ||
| + | nb_syslog(" | ||
| + | } | ||
| + | } else if (left(line, 5) == " | ||
| + | from = substr(line, | ||
| + | if (length(SENDERS) > 0) { | ||
| + | for (s = 0; s < length(SENDERS); | ||
| + | sender = SENDERS[s]; | ||
| + | if (left(from, strlen(sender)) == sender) { | ||
| + | allowed = 1; | ||
| + | break; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | if (allowed == 0) { | ||
| + | nb_syslog(" | ||
| + | return mkarray(); | ||
| + | } else { | ||
| + | nb_syslog(" | ||
| + | } | ||
| + | } | ||
| + | } else { | ||
| + | /* saw text line */ | ||
| + | if (IGNORECASE) line = tolower(line); | ||
| + | |||
| + | if (AUTH && tlnr == 0) { | ||
| + | /* first line of message must contain the password */ | ||
| + | if (left(line, strlen(ADMPWD)) != ADMPWD) { | ||
| + | nb_syslog(" | ||
| + | return mkarray(); | ||
| + | } else { | ||
| + | nb_syslog(" | ||
| + | } | ||
| + | } else if ((AUTH && tlnr == 1) || (!AUTH && tlnr == 0)) { | ||
| + | /* this line must contain the command */ | ||
| + | return split(line); | ||
| + | } else { | ||
| + | break; | ||
| + | } | ||
| + | tlnr++; | ||
| + | } | ||
| + | } | ||
| + | | ||
| + | nb_syslog(" | ||
| + | |||
| + | return mkarray(); | ||
| + | } | ||
| + | |||
| + | int setdio (string port, string newstate) | ||
| + | { | ||
| + | if (port != " | ||
| + | nb_syslog(" | ||
| + | return -1; | ||
| + | } | ||
| + | if (newstate == " | ||
| + | st = 1; | ||
| + | } else if (newstate == " | ||
| + | st = 0; | ||
| + | } else { | ||
| + | nb_syslog(" | ||
| + | return -1; | ||
| + | } | ||
| + | | ||
| + | rc = nb_dio_set(sprintf(" | ||
| + | if (rc) { | ||
| + | nb_syslog(" | ||
| + | return -1; | ||
| + | } else { | ||
| + | nb_syslog(" | ||
| + | return 0; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | /* check if we got stressed */ | ||
| + | LASTFILE = "/ | ||
| + | last = 0; | ||
| + | |||
| + | fp = fopen(LASTFILE, | ||
| + | if (fp) { | ||
| + | /* we have been run at least one time */ | ||
| + | str = fread(fp, 32); | ||
| + | if (str) last = (int) str; | ||
| + | fclose(fp); | ||
| + | } | ||
| + | |||
| + | now = mktime(localtime(time())); | ||
| + | elapsed = now - last; | ||
| + | if (elapsed > 0 && elapsed < INTERVAL) { | ||
| + | nb_syslog(" | ||
| + | exit(0); | ||
| + | } | ||
| + | |||
| + | /* record timestamp */ | ||
| + | fp = fopen(LASTFILE, | ||
| + | if (fp) { | ||
| + | str = sprintf(" | ||
| + | fwrite(fp, str); | ||
| + | fclose(fp); | ||
| + | } | ||
| + | |||
| + | /* read inbox */ | ||
| + | msgs = nb_sms_list(); | ||
| + | nr_msgs = length(msgs); | ||
| + | |||
| + | if (nr_msgs == 0) { | ||
| + | nb_syslog(" | ||
| + | exit(0); | ||
| + | } | ||
| + | |||
| + | nb_syslog(" | ||
| + | |||
| + | /* track states */ | ||
| + | reboot = 0; | ||
| + | |||
| + | /* only process latest messages */ | ||
| + | start = nr_msgs - MAXMSG; | ||
| + | if (start < 0) start = 0; | ||
| + | |||
| + | for (i=start; i< | ||
| + | msg = nb_sms_retrieve(msgs[i]); | ||
| + | if (!msg) continue; | ||
| + | |||
| + | nb_syslog(" | ||
| + | i, nr_msgs, msgs[i]); | ||
| + | |||
| + | args = parse(msg); | ||
| + | if ((is_array(args)) && (length(args) > 0)) { | ||
| + | if (args[0] == "" | ||
| + | nb_syslog(" | ||
| + | } else if ((args[0] == " | ||
| + | nb_syslog(" | ||
| + | reboot = 1; | ||
| + | } else if ((args[0] == " | ||
| + | nb_syslog(" | ||
| + | if (nb_config_get(" | ||
| + | nb_syslog(" | ||
| + | } else { | ||
| + | /* enable first wanlink */ | ||
| + | nb_config_set(" | ||
| + | } | ||
| + | } else if ((args[0] == " | ||
| + | nb_syslog(" | ||
| + | if (nb_config_get(" | ||
| + | nb_syslog(" | ||
| + | } else { | ||
| + | /* disable first wanlink */ | ||
| + | nb_config_set(" | ||
| + | } | ||
| + | } else if ((args[0] == " | ||
| + | nb_syslog(" | ||
| + | rcpt = nb_sms_header(msgs[i], | ||
| + | if (rcpt) { | ||
| + | id = nb_sms_send(rcpt, | ||
| + | if (!id) { | ||
| + | nb_syslog(" | ||
| + | } else { | ||
| + | nb_syslog(" | ||
| + | } | ||
| + | } | ||
| + | } else if ((args[0] == " | ||
| + | nb_syslog(" | ||
| + | setdio(args[1], | ||
| + | } else { | ||
| + | nb_syslog(" | ||
| + | } | ||
| + | } else { | ||
| + | nb_syslog(" | ||
| + | } | ||
| + | |||
| + | /* delete message */ | ||
| + | ret = nb_sms_delete(msgs[i]); | ||
| + | if (ret == 0) nb_syslog(" | ||
| + | } | ||
| + | |||
| + | if (reboot == 1) { | ||
| + | /* trigger reboot */ | ||
| + | nb_syslog(" | ||
| + | nb_reboot(); | ||
| + | } | ||
| + | |||
| + | exit(0); | ||
| + | </ | ||