Difference between revisions of "Managing Power Distribution Unit via SMS"
From MikroTik Wiki
Line 41: | Line 41: | ||
:local PASSWORD | :local PASSWORD | ||
:local ONOFF [:toarray ("OFF", "ON ")] | :local ONOFF [:toarray ("OFF", "ON ")] | ||
− | :local | + | :local HEXAS [:toarray ("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f")] |
####################################################################################### | ####################################################################################### | ||
Line 162: | Line 162: | ||
} | } | ||
} | } | ||
− | # 9258S | + | # 9258S : <html>p61=0,p62=0,p63=0,p64=0</html> |
+ | # 9258DSv4 : P61=0,P62=... | ||
# Si un numero de prise, noter son etat | # Si un numero de prise, noter son etat | ||
:if (($MODEL = "9258S") || ($MODEL = "9258DSv4")) do={ | :if (($MODEL = "9258S") || ($MODEL = "9258DSv4")) do={ | ||
− | + | :if ($MODEL = "9258S") do={ :set IJ 10; } else={ :set IJ 5; } | |
:if (([:pick $CONTENT 0 6] = "<html>") || ([:pick $CONTENT 0 5] = " P61=")) do={ | :if (([:pick $CONTENT 0 6] = "<html>") || ([:pick $CONTENT 0 5] = " P61=")) do={ | ||
:set MSG ($MSG . " Prise 1 : " . ([:pick $ONOFF [:pick $CONTENT $IJ ]])) | :set MSG ($MSG . " Prise 1 : " . ([:pick $ONOFF [:pick $CONTENT $IJ ]])) | ||
Line 238: | Line 239: | ||
} | } | ||
:set IJ ( $IOSTATE ^ $IK) | :set IJ ( $IOSTATE ^ $IK) | ||
− | :set URL ($URL . [:pick $ | + | :set URL ($URL . [:pick $HEXAS ($IJ / 16)]) |
− | :set URL ($URL . [:pick $ | + | :set URL ($URL . [:pick $HEXAS ($IJ % 16)]) |
:set URL ($URL . "+Delay=1") | :set URL ($URL . "+Delay=1") | ||
} | } | ||
Line 285: | Line 286: | ||
} | } | ||
########### End of SMSIpPower ########### That's All, Folks ########### | ########### End of SMSIpPower ########### That's All, Folks ########### | ||
− | |||
</pre> | </pre> |
Revision as of 23:08, 11 February 2015
Below a script to manage Aviosys 9258S, 9258DS, ... PDU via /tool sms
Original page (in French) [1]
# Script RouterOS SMSIpPower de gestion des prises d'Aviosys 9258S et 9258DS # # Envoi un SMS de l'etat releve, bascule l'etat d'une prise. # # Marc Dilasser, Le Net du Kermeur, Fevrier 2015 # ##################################################################################### :global DV :global PR :global OP :local ADRIP "" :local NETWORK "LNDK" :local DEVNAME "" :local MODEL "" :local PRISE -1 :local NBJOB :local NBSMS :local VER :local NBOPER :local URL :local ERR :local OUTFILE "EtatIpPower" :local IDF :local CONTENT :local MSG :local HHMMSS :local IJ :local IK :local ISTAT :local IOSTATE :local ITEM :local PORT :local NUMTEL :local DEBUG 0 :local ADMIN :local PASSWORD :local ONOFF [:toarray ("OFF", "ON ")] :local HEXAS [:toarray ("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f")] ####################################################################################### # Valeurs a configurer suivant exploitation : # # - user et mot de passe Aviosys # # - adresse ip # # - nom de device # # - modele # # - numero telephone destinataire du SMS, par defaut allowed-number de /tool sms # # - le device par defaut # # La variable DV du SMS, si presente, donne le device # # La variable PR du SMS, si presente, donne la prise a basculer # # La variable OP du SMS, si presente, donne le type d'operation (non implementee) # ####################################################################################### :if ([:len $DV] = 0) do={:set DV "pwr001"; } :set ADMIN "admin" :set PASSWORD "password" :if ($DV = "pwr001") do={ :set ADRIP "10.6.7.8" :set DEVNAME "pwr001" :set MODEL "9258S" } :if ($DV = "pwr009") do={ :set ADRIP "10.6.2.9" :set DEVNAME "pwr009" :set MODEL "9258DSv1" :set PASSWORD "motdepasse" } :if ($DV = "pwr028") do={ :set ADRIP "10.6.7.139" :set DEVNAME "pwr028" :set MODEL "9258DSv4" :set PASSWORD "motdepasse" } :if ($DV = "pwr029") do={ :set ADRIP "10.6.7.194" :set DEVNAME "pwr029" :set MODEL "9258HP" :set PASSWORD "motdepasse" :set DEBUG 1 } ####################################################################################### # FIN CONFIGURATION # ####################################################################################### :set NBJOB [/system script job print count-only where script=SMSIpPower] if ($NBJOB > 1) do={ :log error "Lancement en double" return 240 } :if ([:len $PR] > 0) do={ :set NBOPER 3 :set PRISE ($PR - 1); } else={ :set NBOPER 1 } :if ([:len $OP] = 0) do={ :set OP ""; } :set VER [/system resource get version] :log info "Device $DEVNAME, adresse $ADRIP" ############################################################################################## # Bouclage tant qu'il reste des operations a effectuer while ($NBOPER > 0) do={ :set URL "" :if ($MODEL = "9258S") do={ :set URL ("http://" . $ADMIN . ":" . $PASSWORD . "@" . $ADRIP . "/Set.cmd\?CMD=GetPower") } :if ($MODEL = "9258DSv1") do={ :set URL ("http://" . $ADRIP . "/Set.cmd\?user=" . $ADMIN . "+pass=" . $PASSWORD . "+CMD=GetSysIO") } :if ($MODEL = "9258DSv4") do={ :set URL ("http://" . $ADRIP . "/set.cmd\?user=" . $ADMIN . "+pass=" . $PASSWORD . "+cmd=GetPower") } :if ($MODEL = "9258HP") do={ :set URL ("http://" . $ADRIP . "/GetPower.cgi") } # Pas d'URL definie, on sort :if ([:len $URL] = 0) do={ :return 250 } else={ :if ($DEBUG > 0) do={ :put "Url : $URL"; } } # Passer la commande HTTP d'interrogation de l'etat de l'IpPower # et recuperation du resultat, si RouterOS >= 6.2 l'erreur Http peut etre testee :set ERR 0 :if ($VER >= 6.20) do={ :do { /tool fetch url=$URL dst-path=$OUTFILE; } on-error={ :set ERR 1}; } else={ /tool fetch url=$URL dst-path=$OUTFILE; } :if ($ERR < 1) do={ :set IDF [/file find where name=$OUTFILE] :set CONTENT [ /file get $IDF contents] :if ($DEBUG > 0) do={ :put $CONTENT; } # Message SMS :set HHMMSS [/system clock get time] :set MSG ($NETWORK . " : etat de " . $DEVNAME . " a " . $HHMMSS . "\n") # Pour 9258DS, recuperation de deux octets en hexa :if ($MODEL = "9258DSv1") do={ :set ISTAT [:tonum ("0x" . [:pick $CONTENT 9 11])] :set IOSTATE $ISTAT :set IJ 0 while ($IJ < 8) do={ :set IK ($ISTAT % 2) :set MSG ($MSG . "Prise " . [:tostr ($IJ + 1)] . " : " . [:pick $ONOFF $IK] . " ") :if (($IJ % 2) = 1) do={ :set MSG ($MSG . "\n"); } :set ISTAT ($ISTAT / 2) :set IJ ($IJ + 1) } } # 9258S : <html>p61=0,p62=0,p63=0,p64=0</html> # 9258DSv4 : P61=0,P62=... # Si un numero de prise, noter son etat :if (($MODEL = "9258S") || ($MODEL = "9258DSv4")) do={ :if ($MODEL = "9258S") do={ :set IJ 10; } else={ :set IJ 5; } :if (([:pick $CONTENT 0 6] = "<html>") || ([:pick $CONTENT 0 5] = " P61=")) do={ :set MSG ($MSG . " Prise 1 : " . ([:pick $ONOFF [:pick $CONTENT $IJ ]])) :set MSG ($MSG . ", prise 2 : " . ([:pick $ONOFF [:pick $CONTENT ($IJ + 6) ]]) . "\n") :set MSG ($MSG . " Prise 3 : " . ([:pick $ONOFF [:pick $CONTENT ($IJ + 12) ]])) :set MSG ($MSG . ", prise 4 : " . ([:pick $ONOFF [:pick $CONTENT ($IJ + 18) ]])) :if ($MODEL = "9258DSv4") do={ :set MSG ($MSG . "\n") :set MSG ($MSG . " Prise 5 : " . ([:pick $ONOFF [:pick $CONTENT ($IJ + 24) ]])) :set MSG ($MSG . ", prise 6 : " . ([:pick $ONOFF [:pick $CONTENT ($IJ + 30) ]]) . "\n") :set MSG ($MSG . " Prise 7 : " . ([:pick $ONOFF [:pick $CONTENT ($IJ + 36) ]])) :set MSG ($MSG . ", prise 8 : " . ([:pick $ONOFF [:pick $CONTENT ($IJ + 42) ]])) } :if ( $PRISE > -1 ) do={ :set IOSTATE [:pick $CONTENT ($IJ + (6 * $PRISE))] :log info ("Prise " . ($PRISE + 1) . ", iostate : $IOSTATE") } } } # 9258HP :if ($MODEL = "9258HP") do={ :if ([:pick $CONTENT 38 56 ] = "Power Control = P4") do={ :set MSG ($MSG . " Prise 1 : " . ([:pick $ONOFF [:pick $CONTENT 72 ]])) :set MSG ($MSG . ", prise 2 : " . ([:pick $ONOFF [:pick $CONTENT 67 ]]) . "\n") :set MSG ($MSG . " Prise 3 : " . ([:pick $ONOFF [:pick $CONTENT 62 ]])) :set MSG ($MSG . ", prise 4 : " . ([:pick $ONOFF [:pick $CONTENT 57 ]])) :if ( $PRISE > -1 ) do={ :set IOSTATE [:pick $CONTENT (72 - (5 * $PRISE))] :log info ("Prise " . ($PRISE + 1) . ", iostate : $IOSTATE") } } } ###################################################### Envoi du SMS if ([:len $MSG] > 60) do={ :if ($DEBUG = 0) do={ :set PORT [/tool sms get port] :if ([:len $NUMTEL] = 0) do={ :set NUMTEL [/tool sms get allowed-number] } /tool sms send $PORT $NUMTEL message=$MSG } else={ :put ($MSG) :log info ($MSG) } } /file remove $IDF } else={ # Erreur HTTP, on sort return 220; } :set NBOPER ($NBOPER - 1) # Tester s'il reste une operation de bascule de prise :if (($NBOPER > 1) && ([:len $PR] = 1)) do={ :set URL "" :if ($MODEL = "9258S") do={ :set URL ("http://" . $ADMIN . ":" . $PASSWORD . "@" . $ADRIP . "/Set.cmd\?CMD=SetPower") :set URL ($URL . "+P6" . [:tostr ($PRISE + 1)] . "=" . [:tostr (($IOSTATE + 1) % 2)]) } :if ($MODEL = "9258DSv4") do={ :set URL ("http://" . $ADMIN . ":" . $PASSWORD . "@" . $ADRIP . "/set.cmd\?cmd=setpower") :set URL ($URL . "+p6" . [:tostr ($PRISE + 1)] . "=" . [:tostr (($IOSTATE + 1) % 2)]) } :if ($MODEL = "9258DSv1") do={ :set URL ("http://" . $ADRIP . "/Set.cmd\?user=" . $ADMIN . "+pass=" . $PASSWORD . "+CMD=SetSysIO+IO=") # Construire un MASK pour un XOR :set IJ 8 :set IK 0 while ($IJ > 0) do={ :set IK ($IK * 2) :if ($IJ = ($PRISE + 1)) do={ :set IK ($IK + 1); } :set IJ ($IJ - 1) } :set IJ ( $IOSTATE ^ $IK) :set URL ($URL . [:pick $HEXAS ($IJ / 16)]) :set URL ($URL . [:pick $HEXAS ($IJ % 16)]) :set URL ($URL . "+Delay=1") } :if ($MODEL = "9258HP") do={ :set URL ("http://" . $ADMIN . ":" . $PASSWORD . "@" . $ADRIP . "/SetPower.cgi\?p") :set URL ($URL . [:tostr ($PRISE + 1)] . "=" . [:tostr (($IOSTATE + 1) % 2)]) } # Pas d'URL definie, on sort :if ([:len $URL] = 0) do={ :return 230 } :if ($DEBUG > 1) do={ :put "Url : $URL" :log info "Url : $URL" } else={ :log info "Url : $URL" :set ERR 0 :if ($VER >= 6.20) do={ :do { /tool fetch url=$URL dst-path=$OUTFILE; } on-error={ :set ERR 1}; } else={ /tool fetch url=$URL dst-path=$OUTFILE; } :if ($ERR < 1) do={ :set IDF [/file find where name=$OUTFILE] /file remove $IDF } } :set NBOPER ($NBOPER - 1) } else={ :set NBOPER 0 } } # Nettoyage :foreach ITEM in ("DV", "OP", "PR") do={ /system script environment remove [find where name=$ITEM] } # Nettoyer l'Inbox des SMS :set NBSMS [/tool sms inbox print count-only] :if ($NBSMS >= 30) do={ /tool sms inbox remove 0,1,2,3,4,5,6,7,8,9 } ########### End of SMSIpPower ########### That's All, Folks ###########