Let's say you wanted to notify all phones that a Lockdown scenario has started or 911 was dialed at this location. We would need to find all registered phones and push out a message.
a) Person dials the predetermined emergency number
b) CME Syslog see this event and runs the Event Manager applet
c) The CME uploads the TXT file to the Windows server and the PowerShell script sees the new file and runs the PHP script.
d) The PHP script then reads each line of the uploaded TXT file and pushes out the XML file to the registered phones.
See the start of the event manager applet on Part 1.
Find all register phones (SCCP and SIP) and add them to an variable
action 002.60.01 cli command "show ephone registered sum | include 192.168"Send the results to a file on a TFTP server. (In our case it's a TFTP server running on Windows Server 2016)
action 002.60.02 foreach line "$_cli_result" "\n"
action 002.60.03 regexp "192\.168\....\...." "$line"
action 002.60.04 if $_regexp_result eq "1"
action 002.60.05 regexp "192\.168\.[0-9]+\.[0-9]+" "$line" temp_IP
action 002.60.06 append array_IP "$temp_IP\n"
action 002.60.07 end
action 002.60.08 end
action 002.61.01 cli command "show voice register pool registered | include IP address"
action 002.61.02 foreach line "$_cli_result" "\n"
action 002.61.03 regexp "192\.168\....\...." "$line"
action 002.61.04 if $_regexp_result eq "1"
action 002.61.05 regexp "192\.168\.[0-9]+\.[0-9]+" "$line" temp_IP
action 002.61.06 append array_IP "$temp_IP\n"
action 002.61.07 end
action 002.61.08 end
action 003.01.01 set result_Final "$result_Site $result_Ext $result_Mac $result_IP $result_Called"Do something with those results.
action 003.01.02 set result_Notify "$result_Final\n$array_IP"
action 003.02.01 if $result_Called eq "911"
action 003.02.02 file open fh flash:911.txt w
action 003.02.03 file write fh $result_Final
action 003.02.04 file close fh
action 003.02.05 else
action 003.02.06 file open fh flash:Notify.txt w
action 003.02.07 file write fh $result_Notify
action 003.02.08 file close fh
action 003.02.09 end
action 003.03 cli command "configure terminal"
action 003.04 cli command "file prompt quiet"
action 003.05 cli command "end"
action 003.06.01 if $result_Called eq "911"
action 003.06.02 cli command "copy flash:911.txt tftp://eventlogger/demo911.txt"
action 003.06.03 else
action 003.06.04 cli command "copy flash:Notify.txt tftp://eventlogger/demoLock.txt"
action 003.06.05 end
action 003.07 cli command "configure terminal"
action 003.08 cli command "no file prompt quiet"
action 003.09 cli command "end"
This is were some searching on the Internet found a PowerShell script that can run commands based on different file actions. Create a new task that runs at computer startup and runs as System account.
Remove-Item c:\oss_snmp\LockDownlog.logInstall PHP for Windows on IIS.
Remove-Item c:\oss_snmp\PHPlog.log
Remove-Item c:\tftp-root\*lock.txt
### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "c:\tftp-root"
$watcher.Filter = "*lock.txt"
$watcher.IncludeSubdirectories = $false
$watcher.EnableRaisingEvents = $true
### DEFINE ACTIONS AFTER AN EVENT IS DETECTED
$LogAction = { $path = $Event.SourceEventArgs.FullPath
$changeType = $Event.SourceEventArgs.ChangeType
$logline = "$(Get-Date), $changeType, $path"
Add-content "c:\oss_snmp\LockDownlog.log" -value $logline
}
$PHPAction = { php -f C:\OSS_SNMP\LockdownCMEPHones.php
$path = $Event.SourceEventArgs.FullPath
$changeType = $Event.SourceEventArgs.ChangeType
$logline = "$(Get-Date), $changeType, $path"
Add-content "c:\oss_snmp\LockDownlog.log" -value $logline
}
### DECIDE WHICH EVENTS SHOULD BE WATCHED
Register-ObjectEvent $watcher "Created" -Action $PHPAction
Register-ObjectEvent $watcher "Changed" -Action $LogAction
Register-ObjectEvent $watcher "Deleted" -Action $LogAction
Register-ObjectEvent $watcher "Renamed" -Action $LogAction
while ($true) {sleep 1}
This will allow us to run the Push2Phone function from the Cisco IP Services development kit.
Save the below text into the PHP file mention in the above PowerShell script.
<?php
//header("refresh: 30;");
$File = 'c:\TFTP-Root\demoLock.txt';
chdir('c:\OSS_SNMP');
$School = "";
$Address = "";
$Site = "Empty";
//echo "Start\n";
if (file_exists($File))
{
//echo "found \n";
$contents = file_get_contents($File);
$lines = explode("\n", $contents);
foreach ($lines as $line)
{
if ($line === ""){
//nothing
//echo 'Nothing';
}
else
{
if (strpos($line," ") !== false){
$Found = explode(" ", $line);
$Site = substr_replace(strTOUpper($Found[0]),"",-1);
$Site = str_replace($Site,"DEMO","DEMO-SITE");
$LookupSchool = SiteLocation($Site);
$School = $LookupSchool[0];
$Address = $LookupSchool[1];
//echo "$Site \n";
$Ext = $Found[1];
$Mac = $Found[2];
$IP = $Found[3];
$Number = $Found[4];
}
else
{
$IP = $line;
$Today = date("F j, Y, g:i a");
$Textdata = "$School \n$Address\nIs in LOCKDOWN\n$Today";
set_time_limit(0); //http://php.net/manual/en/function.set-time-limit.php
$uri = "http://cmephones.emailhost.ca:8080/XML/$IP.xml";
$uid = "icxml";
$pwd = "password";
$filename = "XML/$IP.xml";
$data = "<CiscoIPPhoneText><Title>$Number called from $Ext</Title><Prompt>Sent from $Ext</Prompt><Text>$Textdata</Text></CiscoIPPhoneText>";
//echo $data;
file_put_contents($filename, $data);
push2phone($IP, $uri, $uid, $pwd);
}
}
}
}
else
{
echo "$File not found \n";
}
unlink ($File); //Remove file
function push2phone($IP, $uri, $uid, $pwd)
{
$auth = base64_encode($uid.":".$pwd);
$Chime = "Play:chime.raw";
$xml = "<CiscoIPPhoneExecute><ExecuteItem Priority=\"0\"URL=\"".$Chime."\"/><ExecuteItem Priority=\"0\"URL=\"".$uri."\"/></CiscoIPPhoneExecute>";
//echo $xml;
$xml = "XML=".urlencode($xml);
$post = "POST /CGI/Execute HTTP/1.0\r\n";
$post .= "Host: $IP\r\n";
$post .= "Authorization: Basic $auth\r\n";
$post .= "Connection: close\r\n";
$post .= "Content-Type: application/x-www-form-urlencoded\r\n";
$post .= "Content-Length: ".strlen($xml)."\r\n\r\n";
$fp = fsockopen ( $IP, 80, $errno, $errstr, 30);
$response = "";
if(!$fp){ echo "$errstr ($errno)<br>\n"; }
else
{
fputs($fp, $post.$xml);
flush();
}
//return $response;
}
function SiteLocation($Site)
{
if($Site === "DEMO-SITE"){
return array("IT South","Street Address");
}
}
?>