Difference between revisions of "Managing Power Distribution Unit via SMS"

From MikroTik Wiki
Jump to: navigation, search
Line 6: Line 6:
  
 
<pre>
 
<pre>
# 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.                       #
+
# Script RouterOS LndkSmsPower                                                        #
# Marc Dilasser, Le Net du Kermeur, Fevrier 2015                                   #
+
# Managing outlets of  Aviosys PDU 9258S, 9258HP and 9258DS via SMS                  #
#####################################################################################
+
# Send state of outlets of the device, switch or reinit outlet                        #
 +
# Web page : http://blog.lekermeur.net/?p=2531                                        #
 +
# Marc Dilasser, Le Net du Kermeur, Fevrier 2015                                     #
 +
#######################################################################################
  
 
:global DV
 
:global DV
Line 25: Line 28:
 
:local  URL
 
:local  URL
 
:local  ERR
 
:local  ERR
:local  OUTFILE  "EtatIpPower"
+
:local  OUTFILE  "LndkPowerState"
 
:local  IDF
 
:local  IDF
 
:local  CONTENT
 
:local  CONTENT
Line 32: Line 35:
 
:local  IJ
 
:local  IJ
 
:local  IK
 
:local  IK
 +
:local  IL
 
:local  ISTAT
 
:local  ISTAT
 
:local  IOSTATE
 
:local  IOSTATE
Line 40: Line 44:
 
:local  ADMIN
 
:local  ADMIN
 
:local  PASSWORD
 
:local  PASSWORD
 +
:local  OPER
 +
:local  AROPERS
 
:local  ONOFF [:toarray ("OFF,ON ")]
 
:local  ONOFF [:toarray ("OFF,ON ")]
:local  HEXAS [:toarray ("0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f")]
+
:local  HEXA [:toarray ("0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f")]
 +
:local  AAR  {
 +
              "address"={ en="address";    fr="adresse"  };
 +
              "outlet"={  en="outlet";    fr="prise"    };
 +
              "device"={  en="device";    fr="equipement"};
 +
              "model"={  en="model";      fr="modele"    };
 +
              "state"={  en=" state of "; fr=" etat de " };
 +
              "at"={      en=" at ";      fr=" a "      };
 +
              "err220"={  en="http error";            fr="erreur acces http"    };
 +
              "err230"={  en="Url non defined";        fr="Url non definie"      };
 +
              "err240"={  en="script already running"; fr="script deja en cours" };
 +
            }
  
 
#######################################################################################
 
#######################################################################################
Line 48: Line 65:
 
#    - adresse ip                                                                    #
 
#    - adresse ip                                                                    #
 
#    - nom de device                                                                  #
 
#    - nom de device                                                                  #
#    - modele (9258S, 9258HP, 9258DSv1, 9258v4)                                      #
+
#    - modele                                                                         #
 
#    - numero telephone destinataire du SMS, par defaut allowed-number de /tool sms  #
 
#    - numero telephone destinataire du SMS, par defaut allowed-number de /tool sms  #
 
#    - le device par defaut                                                          #
 
#    - le device par defaut                                                          #
Line 55: Line 72:
 
# La variable OP du SMS, si presente, donne le type d'operation (non implementee)    #
 
# 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  ADMIN    "admin"
Line 61: Line 77:
  
 
:if ($DV = "pwr001") do={
 
:if ($DV = "pwr001") do={
   :set ADRIP   "10.6.7.8"
+
   :set ADRIP "10.6.7.8";
   :set DEVNAME "pwr001"
+
   :set DEVNAME "pwr001";
   :set MODEL   "9258S"  
+
   :set MODEL "9258S";
 
}
 
}
  
 
:if ($DV = "pwr009") do={
 
:if ($DV = "pwr009") do={
   :set ADRIP   "10.6.2.9"  
+
   :set ADRIP "10.6.2.9";
   :set DEVNAME "pwr009"
+
   :set DEVNAME "pwr009";
   :set MODEL   "9258DSv1"  
+
   :set MODEL "9258DSv1";
   :set PASSWORD "motdepasse"
+
   :set PASSWORD "motdepasse"
 
}
 
}
  
 
:if ($DV = "pwr028") do={
 
:if ($DV = "pwr028") do={
   :set ADRIP   "192.168.1.100"
+
   :set ADRIP     "192.168.1.100";
   :set DEVNAME "pwr028"
+
   :set DEVNAME   "pwr028";
   :set MODEL   "9258DSv4"
+
   :set MODEL     "9258DSv4";
   :set PASSWORD "motdepasse"
+
   :set PASSWORD "motdepasse";
   :set DEBUG   1
+
   :set DEBUG     1;
 
}
 
}
  
 
:if ($DV = "pwr029") do={
 
:if ($DV = "pwr029") do={
   :set ADRIP   "192.168.1.100"  
+
   :set ADRIP "192.168.1.100";
   :set DEVNAME "pwr029"
+
   :set DEVNAME "pwr029";
   :set MODEL   "9258HP"  
+
   :set MODEL "9258HP";
   :set PASSWORD "motdepasse"
+
   :set PASSWORD "motdepasse"
   :set DEBUG   1
+
   :set DEBUG 1
 
}
 
}
 
 
#######################################################################################
 
#######################################################################################
 
# END OF CONFIG                                                                      #
 
# END OF CONFIG                                                                      #
Line 108: Line 123:
 
#  < <TITLE>Set Power Control</TITLE><BODY>Power Control = P4:1,P3:0,P2:1,P1:1;<p><b>[0->OFF... #
 
#  < <TITLE>Set Power Control</TITLE><BODY>Power Control = P4:1,P3:0,P2:1,P1:1;<p><b>[0->OFF... #
 
#################################################################################################
 
#################################################################################################
 
 
:set NBJOB [/system script job print count-only where script=SMSIpPower]
 
:set NBJOB [/system script job print count-only where script=SMSIpPower]
 
if ($NBJOB > 1) do={
 
if ($NBJOB > 1) do={
   :log error "Lancement en double"
+
   :log error ($AAR->"err240"->$LANG)
 
   return 240
 
   return 240
 
}
 
}
  
 +
#######################################################################################
 +
# List of operations                                                                  #
 +
# Default operation is ST, only send STATE                                            #
 +
# If PR (outlet) is set, defaut OP is SW, to switch this outlet                      #
 +
# If OP is RE (reinit) and PR is set, operations are STATE,SWITCH,DELAY,SWITCH,STATE  #
 +
# If OP is LI (list names of outlets), operation is LIST (not implemented yet)        #
 +
#######################################################################################
 +
 +
:if ([:len $LANG] < 2) do={ :set LANG "en"; }
 +
 +
:if ([:len $OP] = 0) do={
 +
  :set OP "ST";
 +
  :if ([:len $PR] = 1) do={ :set OP "SW"; }
 +
}
 +
:set AROPERS [:toarray ("STATE")]
 +
:if ($OP = "SW") do={
 +
  :if ([:len $PR] = 1) do={
 +
      :set AROPERS [:toarray ("STATE,SWITCH,STATE")]
 +
  }
 +
}
 +
:if ($OP = "RE") do={
 +
  :if ([:len $PR] = 1) do={
 +
      :set AROPERS [:toarray ("STATE,SWITCH,DELAY20,SWITCH,STATE")]
 +
  }
 +
}
 +
:if ($OP = "LI") do={
 +
  :set AROPERS [:toarray ("LIST")]
 +
}
 
:if ([:len $PR] > 0) do={  
 
:if ([:len $PR] > 0) do={  
  :set NBOPER 3
+
   :set PRISE ([:tonum $PR] - 1);  
   :set PRISE ($PR - 1);  
 
} else={
 
  :set NBOPER 1
 
 
}  
 
}  
 
:if ([:len $OP] = 0) do={ :set OP ""; }
 
:if ([:len $OP] = 0) do={ :set OP ""; }
 
:set VER [/system resource get version]
 
:set VER [/system resource get version]
:log info "Device $DEVNAME, adresse $ADRIP"
+
:set MSG (($AAR->"device"->$LANG) . " " . $DEVNAME . ", ")
 +
:set MSG (($AAR->"model"->$LANG) . " " . $MODEL . ", ")
 +
:set MSG ($MSG . ($AAR->"address"->$LANG) . " " . $ADRIP)
 +
:log info $MSG
  
 
#######################################################################################
 
#######################################################################################
# Bouclage tant qu'il reste des operations a effectuer                                #
+
# Do while some operation to do                                                      #
 
#######################################################################################
 
#######################################################################################
while ($NBOPER > 0) do={
+
foreach OPER in ($AROPERS) do={
  :set URL ""     
+
   :if ($OPER = "STATE") do={
   :if ($MODEL = "9258S") do={
+
       :set URL ""      
       :set URL ("http://" . $ADMIN . ":" . $PASSWORD . "@" . $ADRIP . "/Set.cmd\?CMD=GetPower")
+
      :if ($MODEL = "9258S") do={
  }
+
        :set URL ("http://" . $ADMIN . ":" . $PASSWORD . "@" . $ADRIP )
  :if ($MODEL = "9258DSv1") do={
+
        :set URL ($URL . "/Set.cmd\?CMD=GetPower")
      :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={
 
       :if ($MODEL = "9258DSv1") do={
         :set ISTAT [:tonum ("0x" . [:pick $CONTENT 9 11])]
+
         :set URL ("http://" . $ADRIP . "/Set.cmd\?user=" . $ADMIN )
         :set IOSTATE $ISTAT
+
         :set URL ($URL . "+pass=" . $PASSWORD . "+CMD=GetSysIO")
        :set IJ 0
+
      }
        while ($IJ < 8) do={
+
      :if ($MODEL = "9258DSv4") do={
            :set IK ($ISTAT % 2)
+
        :set URL ("http://" . $ADRIP . "/Set.cmd\?user=" . $ADMIN )
            :set MSG ($MSG . "Prise " . [:tostr ($IJ + 1)] . " : " . [:pick $ONOFF $IK] . " ")
+
        :set URL ($URL . "+pass=" . $PASSWORD . "+cmd=GetPower")
            :if (($IJ % 2) = 1) do={ :set MSG ($MSG . "\n"); }
+
      }
            :set ISTAT ($ISTAT / 2)
+
      :if ($MODEL = "9258HP") do={
             :set IJ ($IJ + 1)
+
        :set URL ("http://" . $ADRIP . "/GetPower.cgi")
         }
+
      }
 +
      :if ([:len $URL] = 0) do={
 +
        :return 250
 +
      } else={ 
 +
        :if ($DEBUG > 0) do={ :put "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;
 
       }
 
       }
# 9258S et 9258DSv4, on recupere un ligne du genre <html>p61=0,p62=0,p63=0,p64=0</html>
+
       :if ($ERR < 1) do={
# Si un numero de prise, noter son etat
+
        :set IDF [/file find where name=$OUTFILE]
       :if (($MODEL = "9258S") || ($MODEL = "9258DSv4")) do={
+
        :set CONTENT [ /file get $IDF contents]
          :if ($MODEL = "9258S") do={ :set IJ 10; } else={ :set IJ 5; }
+
         :if ($DEBUG > 0) do={ :put $CONTENT; }
         :if (([:pick $CONTENT 0 6] = "<html>") || ([:pick $CONTENT 0 5] = " P61=")) do={
+
        :set HHMMSS [/system clock get time]
            :set MSG ($MSG . "   Prise 1 : " . ([:pick $ONOFF [:pick $CONTENT $IJ ]]))
+
        :set MSG ($NETWORK . " :" . ($AAR->"state"->$LANG))
            :set MSG ($MSG . ", prise 2 : " . ([:pick $ONOFF [:pick $CONTENT ($IJ + 6) ]]) . "\n")
+
        :set MSG ($MSG . $DEVNAME . ($AAR->"at"->$LANG) . $HHMMSS . "\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 = "9258DSv1") do={
             :if ($MODEL = "9258DSv4") do={
+
             :set ISTAT [:tonum ("0x" . [:pick $CONTENT 9 11])]
               :set MSG ($MSG . "\n")
+
             :set IOSTATE $ISTAT
               :set MSG ($MSG . "   Prise 5 : " . ([:pick $ONOFF [:pick $CONTENT ($IJ + 24) ]]))
+
            :set IJ 0
               :set MSG ($MSG . ", prise 6 : " . ([:pick $ONOFF [:pick $CONTENT ($IJ + 30) ]]) . "\n")
+
            while ($IJ < 8) do={
               :set MSG ($MSG . "  Prise 7 : " . ([:pick $ONOFF [:pick $CONTENT ($IJ + 36) ]]))
+
               :set IK ($ISTAT % 2)
              :set MSG ($MSG . ", prise 8 : " . ([:pick $ONOFF [:pick $CONTENT ($IJ + 42) ]]))
+
               :set MSG ($MSG . ($AAR->"outlet"->$LANG) . " " . [:tostr ($IJ + 1)] )
 +
               :set MSG ($MSG . " : " . [:pick $ONOFF $IK] . " ")
 +
               :if (($IJ % 2) = 1) do={ :set MSG ($MSG . "\n"); }
 +
              :set ISTAT ($ISTAT / 2)
 +
              :set IJ ($IJ + 1)
 
             }
 
             }
             :if ( $PRISE > -1 ) do={
+
        }
              :set IOSTATE [:pick $CONTENT ($IJ + (6 * $PRISE))]
+
        :if (($MODEL = "9258S") || ($MODEL = "9258DSv4")) do={
              :log info ("Prise " . ($PRISE + 1) . ", iostate : $IOSTATE")
+
             :if ($MODEL = "9258S") do={
 +
                :set IJ 10;
 +
                :set IK 4;
 +
            } else={
 +
                :set IJ 5;
 +
                :set IK 8;
 +
            }
 +
            :if (([:pick $CONTENT 0 6] = "<html>") || ([:pick $CONTENT 0 5] = " P61=")) do={
 +
              :for IL from=1 to=$IK do={
 +
                  :set MSG ($MSG . "  " . ($AAR->"outlet"->$LANG) . " " . ([:tostr $IL]) . " : ")
 +
                  :set MSG ($MSG . ([:pick $ONOFF [:pick $CONTENT ($IJ + (($IL - 1) * 6)) ]]))
 +
                  :if ((($IL % 2) = 0) && ($IL < $IK)) do={
 +
                    :set MSG ($MSG . "\n")
 +
                  }
 +
              }
 +
              :if ( $PRISE > -1 ) do={
 +
                  :set IOSTATE [:pick $CONTENT ($IJ + (6 * $PRISE))]
 +
                  :log info (($AAR->"outlet"->$LANG) . " " . ($PRISE + 1) . ", iostate : $IOSTATE")
 +
              }
 
             }
 
             }
 
         }
 
         }
      }
+
        :if ($MODEL = "9258HP") do={
# 9258HP
+
            :set IJ [:find $CONTENT "Control = P4"]
      :if ($MODEL = "9258HP") do={
+
            :if ([:len $IJ] > 0) do={
        :set IJ [:find $CONTENT "Control = P4"]
+
              :set IJ ($IJ + 13)
        :if ([:len $IJ] > 0) do={
+
              :set MSG ($MSG . "  " . ($AAR->"outlet"->$LANG) . " 1 : ")
            :set IJ ($IJ + 13)
+
              :set MSG ($MSG . ([:pick $ONOFF [:pick $CONTENT ($IJ + 15) ]]))
            :set MSG ($MSG . "  Prise 1 : " . ([:pick $ONOFF [:pick $CONTENT ($IJ + 15) ]]))
+
              :set MSG ($MSG . ", " . ($AAR->"outlet"->$LANG) . " 2 : ")
            :set MSG ($MSG . ", prise 2 : " . ([:pick $ONOFF [:pick $CONTENT ($IJ + 10) ]]) . "\n")
+
              :set MSG ($MSG . ([:pick $ONOFF [:pick $CONTENT ($IJ + 10) ]]) . "\n")
            :set MSG ($MSG . "  Prise 3 : " . ([:pick $ONOFF [:pick $CONTENT ($IJ + 5) ]]))
+
              :set MSG ($MSG . "  " . ($AAR->"outlet"->$LANG) . " 3 : ")
            :set MSG ($MSG . ", prise 4 : " . ([:pick $ONOFF [:pick $CONTENT $IJ ]]))
+
              :set MSG ($MSG . ([:pick $ONOFF [:pick $CONTENT ($IJ + 5) ]]))
            :if ( $PRISE > -1 ) do={
+
              :set MSG ($MSG . ", " . ($AAR->"outlet"->$LANG) . " 4 : ")
              :set IOSTATE [:pick $CONTENT ($IJ + (5 * $PRISE))]
+
              :set MSG ($MSG . ([:pick $ONOFF [:pick $CONTENT $IJ ]]))
              :log info ("Prise " . ($PRISE + 1) . ", iostate : $IOSTATE")
+
              :if ( $PRISE > -1 ) do={
 +
                  :set IOSTATE [:pick $CONTENT ($IJ + (5 * $PRISE))]
 +
                  :log info (($AAR->"outlet"->$LANG) . " " . ($PRISE + 1) . ", iostate : $IOSTATE")
 +
              }
 
             }
 
             }
 
         }
 
         }
      }
+
        :if ([:len $MSG] > 60) do={
######################################################  Envoi du SMS
+
            :if ($DEBUG = 0) do={
      if ([:len $MSG] > 60) do={
+
              :set PORT [/tool sms get port]
        :if ($DEBUG = 0) do={
+
              :if ([:len $NUMTEL] = 0) do={
            :set PORT [/tool sms get port]
+
                  :set NUMTEL [/tool sms get allowed-number]
            :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)
 
             }
 
             }
            /tool sms send $PORT $NUMTEL message=$MSG
 
        } else={
 
            :put ($MSG)
 
            :log info ($MSG)
 
 
         }
 
         }
 +
        /file remove $IDF
 +
      } else={
 +
        :log error ($AAR->"err220"->$LANG)
 +
        return 220;
 
       }
 
       }
      /file remove $IDF
 
  } else={
 
# Error on creating MSG, exit
 
      return 220;
 
 
   }
 
   }
   :set NBOPER ($NBOPER - 1)
+
 
# Tester s'il reste une operation de bascule de prise
+
   :if ($OPER = "SWITCH") do={
  :if (($NBOPER > 1) && ([:len $PR] = 1)) do={
+
      :if (([:len $PRISE] = 1) && ([:len $IOSTATE] > 0)) do={
      :set URL ""       
+
        :set URL ""       
      :if ($MODEL = "9258S") do={
+
        :if ($MODEL = "9258S") do={
        :set URL ("http://" . $ADMIN . ":" . $PASSWORD . "@" . $ADRIP . "/Set.cmd\?CMD=SetPower")
+
            :set URL ("http://" . $ADMIN . ":" . $PASSWORD . "@" . $ADRIP . "/Set.cmd\?CMD=SetPower")
        :set URL ($URL . "+P6" . [:tostr ($PRISE + 1)] . "=" . [:tostr (($IOSTATE + 1) % 2)])
+
            :set URL ($URL . "+P6" . [:tostr ($PRISE + 1)] . "=" . [:tostr (($IOSTATE + 1) % 2)])
      }
+
        }
      :if ($MODEL = "9258DSv4") do={
+
        :if ($MODEL = "9258DSv4") do={
        :set URL ("http://" . $ADMIN . ":" . $PASSWORD . "@" . $ADRIP . "/set.cmd\?cmd=setpower")
+
            :set URL ("http://" . $ADMIN . ":" . $PASSWORD . "@" . $ADRIP . "/set.cmd\?cmd=setpower")
        :set URL ($URL . "+p6" . [:tostr ($PRISE + 1)] . "=" . [:tostr (($IOSTATE + 1) % 2)])
+
            :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)
+
         :if ($MODEL = "9258DSv1") do={
        :set URL ($URL . [:pick $HEXAS ($IJ / 16)])
+
            :set URL ("http://" . $ADRIP . "/Set.cmd\?user=" . $ADMIN )
        :set URL ($URL . [:pick $HEXAS ($IJ % 16)])
+
            :set URL ($URL . "+pass=" . $PASSWORD . "+CMD=SetSysIO+IO=")
        :set URL ($URL . "+Delay=1")
+
            :set IJ 8
      }
+
            :set IK 0
      :if ($MODEL = "9258HP") do={
+
            while ($IJ > 0) do={
        :set URL ("http://" . $ADMIN . ":" . $PASSWORD . "@" . $ADRIP . "/SetPower.cgi\?p")
+
              :set IK ($IK * 2)
        :set URL ($URL . [:tostr ($PRISE + 1)] . "=" . [:tostr (($IOSTATE + 1) % 2)])
+
              :if ($IJ = ($PRISE + 1)) do={ :set IK ($IK + 1); }
      }
+
              :set IJ ($IJ - 1)
# Pas d'URL definie, on sort
+
            }
      :if ([:len $URL] = 0) do={
+
            :set IJ ( $IOSTATE ^ $IK)
        :return 230
+
            :set URL ($URL . [:pick $HEXA ($IJ / 16)])
      }
+
             :set URL ($URL . [:pick $HEXA ($IJ % 16)])
      :if ($DEBUG > 1) do={
+
             :set URL ($URL . "+Delay=1")
        :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={
+
         :if ($MODEL = "9258HP") do={
             :set IDF [/file find where name=$OUTFILE]
+
             :set URL ("http://" . $ADMIN . ":" . $PASSWORD . "@" . $ADRIP . "/SetPower.cgi\?p")
             /file remove $IDF
+
             :set URL ($URL . [:tostr ($PRISE + 1)] . "=" . [:tostr (($IOSTATE + 1) % 2)])
 
         }
 
         }
 +
        :if ([:len $URL] = 0) do={
 +
            :log error ($AAR->"err230"->$LANG)
 +
            :return 230
 +
        }
 +
        :if ($DEBUG > 0) 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
 +
            }
 +
        }
 +
      } else={
 +
        :log error ($AAR->"err220"->$LANG)
 +
        :return 220
 
       }
 
       }
      :set NBOPER ($NBOPER - 1)
+
  }
   } else={
+
 
    :set NBOPER 0
+
  :if ($OPER = "DELAY20") do={
 +
      :delay 20
 +
   }
 +
 
 +
  :if ($OPER = "LIST") do={
 +
      :delay 1
 
   }
 
   }
 
}
 
}
  
# Nettoyage
+
#######################################################################################
 +
# Some cleanings                                                                      #
 +
#######################################################################################
 
:foreach ITEM in ("DV", "OP", "PR") do={
 
:foreach ITEM in ("DV", "OP", "PR") do={
 
   /system script environment remove [find where name=$ITEM]
 
   /system script environment remove [find where name=$ITEM]
 
}
 
}
  
# Nettoyer l'Inbox des SMS
 
 
:set NBSMS [/tool sms inbox print count-only]
 
:set NBSMS [/tool sms inbox print count-only]
 
:if ($NBSMS >= 30) do={
 
:if ($NBSMS >= 30) do={
 
   /tool sms inbox remove 0,1,2,3,4,5,6,7,8,9
 
   /tool sms inbox remove 0,1,2,3,4,5,6,7,8,9
 
}
 
}
###########  End of SMSIpPower   ###########  That's All, Folks  ###########
+
###########  End of LndkSmsPower   ###########  That's All, Folks  ###########
 
</pre>
 
</pre>

Revision as of 22:04, 13 February 2015

Below a script to manage Aviosys 9258S, 9258DS, ... PDU via /tool sms

Original page (in French) [1]


#######################################################################################
# Script RouterOS LndkSmsPower                                                        #
# Managing outlets of  Aviosys PDU 9258S, 9258HP and 9258DS via SMS                   #
# Send state of outlets of the device, switch or reinit outlet                        #
# Web page : http://blog.lekermeur.net/?p=2531                                        #
# 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   "LndkPowerState"
:local  IDF
:local  CONTENT
:local  MSG
:local  HHMMSS
:local  IJ
:local  IK
:local  IL
:local  ISTAT
:local  IOSTATE
:local  ITEM
:local  PORT
:local  NUMTEL
:local  DEBUG  0
:local  ADMIN
:local  PASSWORD
:local  OPER
:local  AROPERS
:local  ONOFF [:toarray ("OFF,ON ")]
:local  HEXA [:toarray ("0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f")]
:local  AAR  {
              "address"={ en="address";    fr="adresse"   };
              "outlet"={  en="outlet";     fr="prise"     };
              "device"={  en="device";     fr="equipement"};
              "model"={   en="model";      fr="modele"    };
              "state"={   en=" state of "; fr=" etat de " };
              "at"={      en=" at ";       fr=" a "       };
              "err220"={  en="http error";             fr="erreur acces http"    };
              "err230"={  en="Url non defined";        fr="Url non definie"      };
              "err240"={  en="script already running"; fr="script deja en cours" };
             }

#######################################################################################
# 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)     #
#######################################################################################

: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     "192.168.1.100";
   :set DEVNAME   "pwr028";
   :set MODEL     "9258DSv4";
   :set PASSWORD  "motdepasse";
   :set DEBUG     1;
}

:if ($DV = "pwr029") do={
   :set ADRIP "192.168.1.100";
   :set DEVNAME "pwr029";
   :set MODEL "9258HP";
   :set PASSWORD  "motdepasse"
   :set DEBUG 1
}
#######################################################################################
# END OF CONFIG                                                                       #
#######################################################################################

#################################################################################################
# CGI commands examples on different Aviosys models and responses                               #
# 9258S    :                                                                                    #
#  > /tool fetch url="http://admin:password@192.168.1.100/Set.cmd\?CMD=GetPower"                #
#  < <html>p61=0,p62=1,p63=0,p64=0</html>                                                       #
# 9258DSv1 : (firmware version 1.x)                                                             #
#  > wget -qO- http://192.168.1.100/Set.cmd?user=admin+pass=password+CMD=SetSysIO+IO=fb+Delay=1 #
#  <  IOVALUE:fb                                                                                #
# 9258DSv4 : (firmware version 4.x)                                                             #
#  > wget -qO- http://192.168.8.100/set.cmd?user=admin+pass=password+cmd=setpower+p63=1         #
#  <  P61=0,P62=1,P63=1,P64=0,P65=1,P66=1,P67=1,P68=1                                           #
# 9258HP   :                                                                                    #
#  > wget -qO- http://admin:password@192.168.1.100/SetPower.cgi?p4=1                            #
#  < <TITLE>Set Power Control</TITLE><BODY>Power Control = P4:1,P3:0,P2:1,P1:1;<p><b>[0->OFF... #
#################################################################################################
:set NBJOB [/system script job print count-only where script=SMSIpPower]
if ($NBJOB > 1) do={
   :log error ($AAR->"err240"->$LANG)
   return 240
}

#######################################################################################
# List of operations                                                                  #
# Default operation is ST, only send STATE                                            #
# If PR (outlet) is set, defaut OP is SW, to switch this outlet                       #
# If OP is RE (reinit) and PR is set, operations are STATE,SWITCH,DELAY,SWITCH,STATE  #
# If OP is LI (list names of outlets), operation is LIST (not implemented yet)        #
#######################################################################################

:if ([:len $LANG] < 2) do={ :set LANG "en"; }

:if ([:len $OP] = 0) do={
   :set OP "ST";
   :if ([:len $PR] = 1) do={ :set OP "SW"; }
}
:set AROPERS [:toarray ("STATE")]
:if ($OP = "SW") do={
   :if ([:len $PR] = 1) do={
      :set AROPERS [:toarray ("STATE,SWITCH,STATE")]
   }
}
:if ($OP = "RE") do={
   :if ([:len $PR] = 1) do={
      :set AROPERS [:toarray ("STATE,SWITCH,DELAY20,SWITCH,STATE")]
   } 
}
:if ($OP = "LI") do={
   :set AROPERS [:toarray ("LIST")]
}
:if ([:len $PR] > 0) do={ 
   :set PRISE ([:tonum $PR] - 1); 
} 
:if ([:len $OP] = 0) do={ :set OP ""; }
:set VER [/system resource get version]
:set MSG (($AAR->"device"->$LANG) . " " . $DEVNAME . ", ")
:set MSG (($AAR->"model"->$LANG) . " " . $MODEL . ", ")
:set MSG ($MSG . ($AAR->"address"->$LANG) . " " . $ADRIP)
:log info $MSG

#######################################################################################
# Do while some operation to do                                                       #
#######################################################################################
foreach OPER in ($AROPERS) do={
   :if ($OPER = "STATE") do={
      :set URL ""       
      :if ($MODEL = "9258S") do={
         :set URL ("http://" . $ADMIN . ":" . $PASSWORD . "@" . $ADRIP )
         :set URL ($URL . "/Set.cmd\?CMD=GetPower")
      }
      :if ($MODEL = "9258DSv1") do={
         :set URL ("http://" . $ADRIP . "/Set.cmd\?user=" . $ADMIN )
         :set URL ($URL . "+pass=" . $PASSWORD . "+CMD=GetSysIO")
      }
      :if ($MODEL = "9258DSv4") do={
         :set URL ("http://" . $ADRIP . "/Set.cmd\?user=" . $ADMIN )
         :set URL ($URL . "+pass=" . $PASSWORD . "+cmd=GetPower")
      }
      :if ($MODEL = "9258HP") do={
         :set URL ("http://" . $ADRIP . "/GetPower.cgi")
      }
      :if ([:len $URL] = 0) do={
         :return 250
      } else={  
         :if ($DEBUG > 0) do={ :put "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]
         :set CONTENT [ /file get $IDF contents]
         :if ($DEBUG > 0) do={ :put $CONTENT; }
         :set HHMMSS [/system clock get time]
         :set MSG ($NETWORK . " :" . ($AAR->"state"->$LANG))
         :set MSG ($MSG . $DEVNAME . ($AAR->"at"->$LANG) . $HHMMSS . "\n")

         :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 . ($AAR->"outlet"->$LANG) . " " . [:tostr ($IJ + 1)] )
               :set MSG ($MSG . " : " . [:pick $ONOFF $IK] . " ")
               :if (($IJ % 2) = 1) do={ :set MSG ($MSG . "\n"); }
               :set ISTAT ($ISTAT / 2)
               :set IJ ($IJ + 1)
            }
         }
         :if (($MODEL = "9258S") || ($MODEL = "9258DSv4")) do={
            :if ($MODEL = "9258S") do={ 
                :set IJ 10;
                :set IK 4;
             } else={ 
                :set IJ 5;
                :set IK 8;
             } 
            :if (([:pick $CONTENT 0 6] = "<html>") || ([:pick $CONTENT 0 5] = " P61=")) do={
               :for IL from=1 to=$IK do={
                  :set MSG ($MSG . "   " . ($AAR->"outlet"->$LANG) . " " . ([:tostr $IL]) . " : ")
                  :set MSG ($MSG . ([:pick $ONOFF [:pick $CONTENT ($IJ + (($IL - 1) * 6)) ]]))
                  :if ((($IL % 2) = 0) && ($IL < $IK)) do={
                     :set MSG ($MSG . "\n")
                  }
               }
               :if ( $PRISE > -1 ) do={
                  :set IOSTATE [:pick $CONTENT ($IJ + (6 * $PRISE))]
                  :log info (($AAR->"outlet"->$LANG) . " " . ($PRISE + 1) . ", iostate : $IOSTATE")
               }
            }
         }
         :if ($MODEL = "9258HP") do={
            :set IJ [:find $CONTENT "Control = P4"]
            :if ([:len $IJ] > 0) do={
               :set IJ ($IJ + 13)
               :set MSG ($MSG . "   " . ($AAR->"outlet"->$LANG) . " 1 : ")
               :set MSG ($MSG . ([:pick $ONOFF [:pick $CONTENT ($IJ + 15) ]]))
               :set MSG ($MSG . ", " . ($AAR->"outlet"->$LANG) . " 2 : ")
               :set MSG ($MSG . ([:pick $ONOFF [:pick $CONTENT ($IJ + 10) ]]) . "\n")
               :set MSG ($MSG . "   " . ($AAR->"outlet"->$LANG) . " 3 : ")
               :set MSG ($MSG . ([:pick $ONOFF [:pick $CONTENT ($IJ + 5) ]]))
               :set MSG ($MSG . ", " . ($AAR->"outlet"->$LANG) . " 4 : ")
               :set MSG ($MSG . ([:pick $ONOFF [:pick $CONTENT $IJ ]]))
               :if ( $PRISE > -1 ) do={
                  :set IOSTATE [:pick $CONTENT ($IJ + (5 * $PRISE))]
                  :log info (($AAR->"outlet"->$LANG) . " " . ($PRISE + 1) . ", iostate : $IOSTATE")
               }
            }
         }
         :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={
         :log error ($AAR->"err220"->$LANG) 
         return 220; 
      }
   }

   :if ($OPER = "SWITCH") do={
      :if (([:len $PRISE] = 1) && ([:len $IOSTATE] > 0)) 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 )
            :set URL ($URL . "+pass=" . $PASSWORD . "+CMD=SetSysIO+IO=")
            :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 $HEXA ($IJ / 16)])
            :set URL ($URL . [:pick $HEXA ($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)])
         }
         :if ([:len $URL] = 0) do={
            :log error ($AAR->"err230"->$LANG)
            :return 230
         } 
         :if ($DEBUG > 0) 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
            }
         } 
      } else={
         :log error ($AAR->"err220"->$LANG)
         :return 220
      }
   }

   :if ($OPER = "DELAY20") do={
      :delay 20
   }

   :if ($OPER = "LIST") do={
      :delay 1
   }
}

#######################################################################################
# Some cleanings                                                                      #
#######################################################################################
:foreach ITEM in ("DV", "OP", "PR") do={
   /system script environment remove [find where name=$ITEM]
}

: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 LndkSmsPower   ###########   That's All, Folks   ###########