Fri, 03 Aug 2012 15:56:30 +0200
Use upstream man pages to avoid local help2man failures, likely due to
shell capability assumptions or cross platform environment variance.
The upstream man pages are probably better formatted anyway.
michael@202 | 1 | #! @l_prefix@/bin/perl |
michael@202 | 2 | # |
michael@202 | 3 | # wakeup.agi 1.1 |
michael@202 | 4 | # |
michael@202 | 5 | # A wakeup agi script for Asterisk |
michael@202 | 6 | # |
michael@202 | 7 | # Copyright (C) 2007 |
michael@202 | 8 | # |
michael@202 | 9 | # Jonas Arndt <jonas_arndt@comcast.net> |
michael@202 | 10 | # |
michael@202 | 11 | # This program is free software, distributed under the terms of the |
michael@202 | 12 | # GNU General Public License v2. |
michael@202 | 13 | # |
michael@202 | 14 | # |
michael@202 | 15 | # This program is free software: you can redistribute it and/or modify |
michael@202 | 16 | # it under the terms of the GNU General Public License as published by |
michael@202 | 17 | # the Free Software Foundation, either version 3 of the License, or |
michael@202 | 18 | # (at your option) any later version. |
michael@202 | 19 | # |
michael@202 | 20 | # This program is distributed in the hope that it will be useful, |
michael@202 | 21 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
michael@202 | 22 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
michael@202 | 23 | # GNU General Public License for more details. |
michael@202 | 24 | # |
michael@202 | 25 | # You should have received a copy of the GNU General Public License |
michael@202 | 26 | # along with this program. If not, see <http://www.gnu.org/licenses/>. |
michael@202 | 27 | # |
michael@202 | 28 | |
michael@202 | 29 | use strict; |
michael@202 | 30 | use Time::Local; |
michael@202 | 31 | $|=1; |
michael@202 | 32 | # Setup some variables |
michael@202 | 33 | my %AGI; my $DEBUG=0; |
michael@202 | 34 | # Some constants |
michael@202 | 35 | my $OUTDIR="@l_prefix@/var/asterisk/spool/outgoing"; |
michael@202 | 36 | my $WAKEDIR="@l_prefix@/var/asterisk/spool/tmp"; |
michael@202 | 37 | my $debugfile="@l_prefix@/var/asterisk/spool/tmp/wakeup.log"; |
michael@202 | 38 | my $DEBUGOUT = "filehandle"; |
michael@202 | 39 | my $CALL = "filehandle"; |
michael@202 | 40 | my $TOUCH = "/usr/bin/touch"; |
michael@202 | 41 | |
michael@202 | 42 | ############ check_result ########## |
michael@202 | 43 | # Use this to check the result of # |
michael@202 | 44 | # a sent command # |
michael@202 | 45 | # I pretty much stole this from # |
michael@202 | 46 | # the regular agi-test.agi # |
michael@202 | 47 | #################################### |
michael@202 | 48 | sub checkresult { |
michael@202 | 49 | my ($res) = @_; |
michael@202 | 50 | my $retval; |
michael@202 | 51 | chomp $res; |
michael@202 | 52 | if ($res =~ /^200/) { |
michael@202 | 53 | $res =~ /result=(-?\d+)/; |
michael@202 | 54 | if (!length($1)) { |
michael@202 | 55 | print DEBUGOUT "FAIL ($res)\n"; |
michael@202 | 56 | exit(1); |
michael@202 | 57 | } elsif ($DEBUG=1) { |
michael@202 | 58 | print DEBUGOUT "PASS ($1)\n"; |
michael@202 | 59 | } |
michael@202 | 60 | } else { |
michael@202 | 61 | print STDERR "FAIL (unexpected result '$res')\n"; |
michael@202 | 62 | exit(1); |
michael@202 | 63 | } |
michael@202 | 64 | } |
michael@202 | 65 | |
michael@319 | 66 | ############ send_file #### |
michael@319 | 67 | # Use this to send a wave # |
michael@319 | 68 | # file on the channel # |
michael@319 | 69 | ########################### |
michael@202 | 70 | sub send_file { |
michael@202 | 71 | my ($myfile) = @_; |
michael@202 | 72 | chomp($myfile); |
michael@202 | 73 | if ($DEBUG == 1 ) { |
michael@202 | 74 | print DEBUGOUT "Sending stream $myfile \n"; |
michael@202 | 75 | } |
michael@202 | 76 | print "STREAM FILE $myfile \"0123456789\"\n"; |
michael@202 | 77 | my $result = <STDIN>; |
michael@202 | 78 | &checkresult($result); |
michael@202 | 79 | $result =~ /result=(-?\d+)/; |
michael@202 | 80 | return $1; |
michael@202 | 81 | } |
michael@202 | 82 | |
michael@202 | 83 | ############ hangup ############### |
michael@319 | 84 | # Use this to hang up a channel # |
michael@202 | 85 | #################################### |
michael@202 | 86 | sub hangup { |
michael@202 | 87 | if ($DEBUG == 1 ) { |
michael@202 | 88 | print DEBUGOUT "Hanging up \n"; |
michael@202 | 89 | } |
michael@202 | 90 | print "HANGUP \"\" \n"; |
michael@202 | 91 | my $result = <STDIN>; |
michael@202 | 92 | &checkresult($result); |
michael@202 | 93 | } |
michael@202 | 94 | |
michael@202 | 95 | ############ say_number ############ |
michael@202 | 96 | # Use this to say a number # |
michael@202 | 97 | # over the channel # |
michael@202 | 98 | # # |
michael@202 | 99 | #################################### |
michael@202 | 100 | sub say_number { |
michael@202 | 101 | my ($mynumber) = @_; |
michael@202 | 102 | chomp($mynumber); |
michael@202 | 103 | if ($DEBUG == 1 ) { |
michael@202 | 104 | print DEBUGOUT "Saying number $mynumber \n"; |
michael@202 | 105 | } |
michael@202 | 106 | print "SAY NUMBER $mynumber \"0123456789\"\n"; |
michael@202 | 107 | my $result = <STDIN>; |
michael@202 | 108 | &checkresult($result); |
michael@202 | 109 | $result =~ /result=(-?\d+)/; |
michael@202 | 110 | return $1; |
michael@202 | 111 | } |
michael@202 | 112 | |
michael@319 | 113 | ############ say_digits ################### |
michael@319 | 114 | # Use this to say digits over the channel # |
michael@319 | 115 | ########################################### |
michael@202 | 116 | sub say_digits { |
michael@202 | 117 | my ($mynumber) = @_; |
michael@202 | 118 | chomp($mynumber); |
michael@202 | 119 | if ($DEBUG == 1 ) { |
michael@202 | 120 | print DEBUGOUT "Saying digits $mynumber \n"; |
michael@202 | 121 | } |
michael@202 | 122 | print "SAY DIGITS $mynumber \"0123456789\"\n"; |
michael@202 | 123 | my $result = <STDIN>; |
michael@202 | 124 | &checkresult($result); |
michael@202 | 125 | } |
michael@202 | 126 | |
michael@319 | 127 | ######## get_choice ############ |
michael@319 | 128 | # Use this to receive a DTMF # |
michael@319 | 129 | # choice from the channel # |
michael@319 | 130 | ################################ |
michael@202 | 131 | sub get_choice { |
michael@202 | 132 | if ($DEBUG == 1 ) { |
michael@202 | 133 | print DEBUGOUT "Getting choice \n"; |
michael@202 | 134 | } |
michael@202 | 135 | print "WAIT FOR DIGIT 15000\n"; |
michael@202 | 136 | my $result = <STDIN>; |
michael@202 | 137 | &checkresult($result); |
michael@202 | 138 | $result =~ /result=(-?\d+)/; |
michael@202 | 139 | return $1; |
michael@202 | 140 | } |
michael@202 | 141 | |
michael@319 | 142 | ###### answer ###### |
michael@319 | 143 | # Anser the channel # |
michael@319 | 144 | ##################### |
michael@202 | 145 | sub answer { |
michael@202 | 146 | if ($DEBUG == 1 ) { |
michael@202 | 147 | print DEBUGOUT "Answering the channel \n"; |
michael@202 | 148 | } |
michael@202 | 149 | print "ANSWER\n"; |
michael@202 | 150 | my $result = <STDIN>; |
michael@202 | 151 | &checkresult($result); |
michael@202 | 152 | $result =~ /result=(-?\d+)/; |
michael@202 | 153 | return $1; |
michael@202 | 154 | } |
michael@202 | 155 | |
michael@202 | 156 | ######## get_data ################## |
michael@202 | 157 | # Feed with (file, maxnumbers) # |
michael@202 | 158 | # where file is the sound file # |
michael@202 | 159 | # to be played and maxnumbers is # |
michael@202 | 160 | # the maximum amount of digits to # |
michael@202 | 161 | # allow in the answer # |
michael@202 | 162 | #################################### |
michael@202 | 163 | sub get_data { |
michael@202 | 164 | my @mydata = @_; |
michael@202 | 165 | my $myfile = $mydata[0]; |
michael@202 | 166 | my $mymax = $mydata[1]; |
michael@202 | 167 | if ($DEBUG == 1 ) { |
michael@202 | 168 | print DEBUGOUT "Getting data \n"; |
michael@202 | 169 | } |
michael@202 | 170 | print "GET DATA $myfile 15000 $mymax \n"; |
michael@202 | 171 | my $result = <STDIN>; |
michael@202 | 172 | &checkresult($result); |
michael@202 | 173 | $result =~ /result=(-?\d+)/; |
michael@202 | 174 | return $1; |
michael@202 | 175 | } |
michael@202 | 176 | |
michael@202 | 177 | ###### check_outstanding_calls ##### |
michael@202 | 178 | # Are there any outstanding wakeup # |
michael@202 | 179 | # calls for this extensions? # |
michael@202 | 180 | # Pass the extension to the # |
michael@202 | 181 | # function. The function returns # |
michael@202 | 182 | # a list of files # |
michael@202 | 183 | #################################### |
michael@202 | 184 | sub check_outstanding_calls { |
michael@202 | 185 | my $myext = @_; |
michael@202 | 186 | #opendir DIR, $WAKEDIR; |
michael@202 | 187 | opendir DIR, $OUTDIR; |
michael@202 | 188 | my @files = grep {/$myext/} readdir(DIR); |
michael@202 | 189 | closedir DIR; |
michael@202 | 190 | return @files; |
michael@202 | 191 | } |
michael@202 | 192 | |
michael@202 | 193 | ######## get_extension ############# |
michael@202 | 194 | # Receive the AIG variable and # |
michael@202 | 195 | # return the extension # |
michael@202 | 196 | #################################### |
michael@202 | 197 | sub get_extension { |
michael@202 | 198 | my (@aig) = @_; |
michael@202 | 199 | if ($aig[11] == '') { |
michael@202 | 200 | print STDERR "No extension found in function get_exension \n"; |
michael@202 | 201 | return "FAIL"; |
michael@202 | 202 | } |
michael@202 | 203 | my $myext = $aig[11]; |
michael@202 | 204 | return $myext; |
michael@202 | 205 | } |
michael@202 | 206 | |
michael@202 | 207 | ######## get_context ############### |
michael@202 | 208 | # Receive the AIG variable and # |
michael@202 | 209 | # return the context # |
michael@202 | 210 | #################################### |
michael@202 | 211 | sub get_context { |
michael@202 | 212 | my (@aig) = @_; |
michael@202 | 213 | if ($aig[8] == '') { |
michael@202 | 214 | print STDERR "No extension found in function get_exension \n"; |
michael@202 | 215 | return "FAIL"; |
michael@202 | 216 | } |
michael@202 | 217 | my $mycont = $aig[8]; |
michael@202 | 218 | return $mycont; |
michael@202 | 219 | } |
michael@202 | 220 | |
michael@202 | 221 | ########### get_clid ############### |
michael@202 | 222 | # Receive the AIG variable and # |
michael@202 | 223 | # return the clid # |
michael@202 | 224 | #################################### |
michael@202 | 225 | sub get_clid { |
michael@202 | 226 | my (@aig) = @_; |
michael@202 | 227 | if ($aig[1] == '') { |
michael@202 | 228 | print STDERR "No clid found in function get_clid \n"; |
michael@202 | 229 | return "FAIL"; |
michael@202 | 230 | } |
michael@202 | 231 | my $myext = $aig[1]; |
michael@202 | 232 | return $myext; |
michael@202 | 233 | } |
michael@319 | 234 | |
michael@319 | 235 | ############### init_agi ################## |
michael@319 | 236 | # Use this to initialize the AGI variable # |
michael@319 | 237 | ########################################### |
michael@202 | 238 | sub init_agi { |
michael@202 | 239 | while(<STDIN>) { |
michael@202 | 240 | chomp; |
michael@202 | 241 | last unless length($_); |
michael@202 | 242 | if (/^agi_(\w+)\:\s+(.*)$/) { |
michael@202 | 243 | $AGI{$1} = $2; |
michael@202 | 244 | } |
michael@202 | 245 | } |
michael@202 | 246 | } |
michael@202 | 247 | |
michael@319 | 248 | ######### ascii2num ########## |
michael@319 | 249 | # Removes 48 to get a number # |
michael@319 | 250 | # out of the asciss return # |
michael@319 | 251 | ############################## |
michael@202 | 252 | sub ascii2num { |
michael@202 | 253 | my ($asc) = @_; |
michael@202 | 254 | my $ret; |
michael@202 | 255 | $ret = $asc - 48; |
michael@202 | 256 | return $ret; |
michael@202 | 257 | } |
michael@202 | 258 | |
michael@319 | 259 | ############# Welcome ############## |
michael@202 | 260 | # This is the welcome menu # |
michael@202 | 261 | #################################### |
michael@202 | 262 | sub welcome { |
michael@202 | 263 | my $ret = 0; |
michael@202 | 264 | $ret = &send_file("welcome"); |
michael@202 | 265 | if ($ret == 0) { |
michael@202 | 266 | $ret = &send_file("for-wakeup-call"); |
michael@202 | 267 | } |
michael@202 | 268 | if ($ret == 0) { |
michael@202 | 269 | $ret = &send_file("press-1"); |
michael@202 | 270 | } |
michael@202 | 271 | if ($ret == 0) { |
michael@202 | 272 | $ret = &send_file("for-a-list-of"); |
michael@202 | 273 | } |
michael@202 | 274 | if ($ret == 0) { |
michael@202 | 275 | $ret = &send_file("or"); |
michael@202 | 276 | } |
michael@202 | 277 | if ($ret == 0) { |
michael@202 | 278 | $ret = &send_file("to-cancel-wakeup"); |
michael@202 | 279 | } |
michael@202 | 280 | if ($ret != 0) { |
michael@202 | 281 | $ret = &ascii2num($ret); |
michael@202 | 282 | } |
michael@202 | 283 | if ($ret == 0) { |
michael@202 | 284 | $ret = &get_data("press-2",1); |
michael@202 | 285 | } |
michael@202 | 286 | if ($ret == 1) { |
michael@202 | 287 | $ret = &schedule_new(); |
michael@202 | 288 | } elsif ($ret == 2) { |
michael@202 | 289 | &manage_calls(); |
michael@202 | 290 | } else { |
michael@202 | 291 | $ret = &send_file("goodbye"); |
michael@202 | 292 | } |
michael@202 | 293 | } |
michael@202 | 294 | |
michael@202 | 295 | ######### manage_calls ############# |
michael@202 | 296 | # This is what is called if you # |
michael@202 | 297 | # want to manage already scheduled # |
michael@202 | 298 | # wakeup calls # |
michael@202 | 299 | #################################### |
michael@202 | 300 | sub manage_calls { |
michael@202 | 301 | my $checker = "false"; |
michael@202 | 302 | my @calls; |
michael@202 | 303 | my $del; |
michael@202 | 304 | #my $ret; |
michael@202 | 305 | my $hours; |
michael@202 | 306 | my $minutes; |
michael@202 | 307 | # Send out a welcome message and ask for return |
michael@202 | 308 | @calls = &check_outstanding_calls($AGI{callerid}); |
michael@202 | 309 | if ($#calls + 1 == 0) { |
michael@202 | 310 | $del = &send_file("not-rqsted-wakeup"); |
michael@202 | 311 | $del = &send_file("goodbye"); |
michael@202 | 312 | } else { |
michael@202 | 313 | foreach (@calls) { |
michael@202 | 314 | $del = 0; |
michael@202 | 315 | my $wakefile = $_; |
michael@202 | 316 | my @wakeup = split /\./, $_; |
michael@202 | 317 | my $time = $wakeup[0]; |
michael@202 | 318 | $_ = $time; |
michael@202 | 319 | /(^[0-9][0-9])/; |
michael@202 | 320 | my $hours = $1; |
michael@202 | 321 | /^[0-9][0-9]([0-9][0-9])/; |
michael@202 | 322 | my $minutes = $1; |
michael@202 | 323 | $del = &send_file("rqsted-wakeup-for"); |
michael@202 | 324 | if ($del == 0) { |
michael@202 | 325 | $del = &say_number($hours); |
michael@202 | 326 | } |
michael@202 | 327 | if ($del == 0) { |
michael@202 | 328 | if ($minutes >= 10 ) { |
michael@202 | 329 | $del = &say_number($minutes); |
michael@202 | 330 | } elsif ($minutes > 0 && $minutes < 10) { |
michael@202 | 331 | $del = &send_file("digits/oh"); |
michael@202 | 332 | $del = &say_number($minutes); |
michael@202 | 333 | } |
michael@202 | 334 | } |
michael@202 | 335 | if ($del == 0) { |
michael@202 | 336 | $del = &send_file("digits/oclock"); |
michael@202 | 337 | } |
michael@202 | 338 | if ($del == 0) { |
michael@202 | 339 | $del = &send_file("to-cancel-wakeup"); |
michael@202 | 340 | } |
michael@202 | 341 | if ($del == 0) { |
michael@202 | 342 | $del = &send_file("press-1"); |
michael@202 | 343 | } |
michael@202 | 344 | if ($del == 0) { |
michael@202 | 345 | $del = &send_file("otherwise-press"); |
michael@202 | 346 | } |
michael@202 | 347 | if ($del != 0) { |
michael@202 | 348 | $del = &ascii2num($del); |
michael@202 | 349 | } |
michael@202 | 350 | if ($del == 0) { |
michael@202 | 351 | $del = &get_data("digits/2",1); |
michael@202 | 352 | } |
michael@202 | 353 | if ($del == 1) { |
michael@202 | 354 | my @sysargs = ("rm", "-f", "$WAKEDIR/$wakefile", "$OUTDIR/$wakefile"); |
michael@202 | 355 | system(@sysargs) == 0 |
michael@202 | 356 | or die "system @sysargs failed: $?"; |
michael@202 | 357 | $del = &send_file("cancelled"); |
michael@202 | 358 | } |
michael@202 | 359 | } |
michael@202 | 360 | $del = &send_file("goodbye"); |
michael@202 | 361 | } |
michael@202 | 362 | } |
michael@202 | 363 | |
michael@319 | 364 | ######## schedule_new ########## |
michael@319 | 365 | # This is the menu to schedule # |
michael@319 | 366 | # a new wakeup call # |
michael@319 | 367 | ################################ |
michael@202 | 368 | sub schedule_new { |
michael@202 | 369 | my $checker = "false"; |
michael@202 | 370 | my $ret_var; |
michael@202 | 371 | my $ret_dummy = 0; |
michael@202 | 372 | my $time; |
michael@202 | 373 | my $perm; |
michael@202 | 374 | my $file; |
michael@202 | 375 | my $calltype; |
michael@202 | 376 | my $extension; |
michael@202 | 377 | my $context; |
michael@202 | 378 | my $hours; |
michael@202 | 379 | my $minutes; |
michael@202 | 380 | if ($DEBUG == 1 ) { |
michael@202 | 381 | print DEBUGOUT "From schedule_new\n"; |
michael@202 | 382 | } |
michael@202 | 383 | while ( $checker eq "false" ) { |
michael@202 | 384 | $ret_var = &send_file("to-rqst-wakeup-call"); |
michael@202 | 385 | if ($ret_var != 0) { |
michael@202 | 386 | my $tmp = &get_data("silence/1",3); |
michael@202 | 387 | $ret_var = &ascii2num($ret_var); |
michael@202 | 388 | $ret_var = $ret_var . $tmp; |
michael@202 | 389 | } else { |
michael@202 | 390 | $ret_var = &get_data("enter-a-time",4); |
michael@202 | 391 | } |
michael@202 | 392 | # if ($ret_var < 1300 && $ret_var >= 0100) { |
michael@202 | 393 | # my $pm = &get_data("1-for-am-2-for-pm",1); |
michael@202 | 394 | # if ($pm == 2 && $ret_var <= 1159) { |
michael@202 | 395 | # $ret_var = $ret_var + 1200; |
michael@202 | 396 | # $checker = "true"; |
michael@202 | 397 | # } elsif ($pm == 1 && $ret_var > 1159) { |
michael@202 | 398 | # $ret_var = $ret_var - 1200; |
michael@202 | 399 | # # Fix the zero |
michael@202 | 400 | # $ret_var = "00" . $ret_var; |
michael@202 | 401 | # $checker = "true"; |
michael@202 | 402 | # } else { |
michael@202 | 403 | # $checker = "true"; |
michael@202 | 404 | # } |
michael@202 | 405 | # } elsif ($ret_var > 2359) { |
michael@202 | 406 | # $ret_dummy = &send_file("please-try-again"); |
michael@202 | 407 | # } else { |
michael@202 | 408 | # $checker = "true"; |
michael@202 | 409 | # } |
michael@202 | 410 | if ($ret_var > 2359) { |
michael@202 | 411 | $ret_dummy = &send_file("please-try-again"); |
michael@202 | 412 | } else { |
michael@202 | 413 | $checker = "true"; |
michael@202 | 414 | } |
michael@202 | 415 | } |
michael@202 | 416 | $perm = 0; |
michael@202 | 417 | $perm = &send_file("wakeup-for-one-time"); |
michael@202 | 418 | if ($perm == 0) { |
michael@202 | 419 | $perm = &send_file("press-1"); |
michael@202 | 420 | } |
michael@202 | 421 | if ($perm == 0) { |
michael@202 | 422 | $perm = &send_file("for-a-daily-wakeup-call"); |
michael@202 | 423 | } |
michael@202 | 424 | if ($perm != 0) { |
michael@202 | 425 | $perm = &ascii2num($perm); |
michael@202 | 426 | } |
michael@202 | 427 | if ($perm == 0) { |
michael@202 | 428 | $perm = $perm = &get_data("press-2",1); |
michael@202 | 429 | } |
michael@202 | 430 | # Open the file and populate it with data |
michael@202 | 431 | $extension = $AGI{callerid}; |
michael@202 | 432 | $context = $AGI{context}; |
michael@202 | 433 | if ($perm == 2) { |
michael@202 | 434 | $file = "$WAKEDIR/$ret_var.perm.1.$extension.call"; |
michael@202 | 435 | $calltype = "perm"; |
michael@202 | 436 | open (CALL, '>', $file) or die "Cannot open call file for write :$!"; |
michael@202 | 437 | } else { |
michael@202 | 438 | $file = "$WAKEDIR/$ret_var.temp.1.$extension.call"; |
michael@202 | 439 | $calltype = "temp"; |
michael@202 | 440 | open (CALL, '>', $file) or die "Cannot open call file for write :$!"; |
michael@202 | 441 | } |
michael@202 | 442 | my $myprint = "channel: Local" . "/" . $extension . "@" . $context . "\n"; |
michael@202 | 443 | print CALL $myprint; |
michael@202 | 444 | print CALL "maxretries: 3\n"; |
michael@202 | 445 | print CALL "retrytime: 60\n"; |
michael@202 | 446 | print CALL "waittime: 60\n"; |
michael@202 | 447 | print CALL "callerid: \"AsterPBX Weckruf\" <$AGI{extension}>\n"; |
michael@202 | 448 | print CALL "application: AGI\n"; |
michael@202 | 449 | print CALL "data: wakeup|$ret_var.$calltype.1.$extension.call\n"; |
michael@202 | 450 | close ($CALL); |
michael@202 | 451 | # Now touch the file |
michael@202 | 452 | # Get the time variable |
michael@202 | 453 | $time = get_time_string($ret_var); |
michael@202 | 454 | my @command = ("$TOUCH", "-t", "$time", "${file}"); |
michael@202 | 455 | system(@command) == 0 |
michael@202 | 456 | or die "system @command failed: $?"; |
michael@202 | 457 | # Move it to the OUT directory |
michael@202 | 458 | my @command = ("mv", "${file}", "${OUTDIR}/"); |
michael@202 | 459 | system(@command) == 0 |
michael@202 | 460 | or die "system @command failed: $?"; |
michael@202 | 461 | |
michael@202 | 462 | # Stream out the wakeup |
michael@202 | 463 | $_ = $ret_var; |
michael@202 | 464 | /(^[0-9][0-9])/; |
michael@202 | 465 | my $hours = $1; |
michael@202 | 466 | /^[0-9][0-9]([0-9][0-9])/; |
michael@202 | 467 | my $minutes = $1; |
michael@202 | 468 | $ret_dummy = &send_file("rqsted-wakeup-for"); |
michael@202 | 469 | $ret_dummy = &say_number($hours); |
michael@202 | 470 | if ($minutes >= 10 ) { |
michael@202 | 471 | &say_number($minutes); |
michael@202 | 472 | } elsif ($minutes > 0 && $minutes < 10) { |
michael@202 | 473 | &send_file("digits/oh"); |
michael@202 | 474 | &say_number($minutes); |
michael@202 | 475 | } |
michael@202 | 476 | $ret_dummy = &send_file("digits/oclock"); |
michael@202 | 477 | $ret_dummy = &send_file("goodbye"); |
michael@202 | 478 | return $ret_var; |
michael@202 | 479 | } |
michael@202 | 480 | |
michael@202 | 481 | ######## get_time_string ########### |
michael@202 | 482 | # This will return the time string # |
michael@319 | 483 | # when inputing a string like hhmi # |
michael@202 | 484 | #################################### |
michael@202 | 485 | sub get_time_string { |
michael@202 | 486 | my ($intime) = @_; |
michael@202 | 487 | my $minutes = substr($intime, 2, 4); |
michael@202 | 488 | my $hours = substr($intime, 0, 2); |
michael@202 | 489 | my $tmpepoch; |
michael@202 | 490 | my $day; |
michael@202 | 491 | my $month; |
michael@202 | 492 | my $ret_val; |
michael@202 | 493 | my $epoch = time(); |
michael@202 | 494 | my @timedata = localtime($epoch); |
michael@202 | 495 | # Insert the minutes and hours from input |
michael@202 | 496 | $timedata[1] = $minutes; |
michael@202 | 497 | $timedata[2] = $hours; |
michael@202 | 498 | # Get tmpepoch |
michael@202 | 499 | $tmpepoch = timelocal(@timedata); |
michael@202 | 500 | #Now compare them |
michael@202 | 501 | if ($tmpepoch < $epoch) { # Means it is tomorrow |
michael@202 | 502 | $tmpepoch += 86400; # Add 24 hours |
michael@202 | 503 | } |
michael@202 | 504 | # Now get the new timedata |
michael@202 | 505 | my @timedata = localtime($tmpepoch); |
michael@202 | 506 | $minutes = $timedata[1]; |
michael@202 | 507 | $hours = $timedata[2]; |
michael@202 | 508 | $day = $timedata[3]; |
michael@202 | 509 | $month = $timedata[4] + 1; |
michael@202 | 510 | #Correct the "First hour after midnight" problem |
michael@202 | 511 | if ($minutes < 10) { |
michael@202 | 512 | $minutes = "0" . $minutes; |
michael@202 | 513 | } |
michael@202 | 514 | if ($hours < 10) { |
michael@202 | 515 | $hours = "0" . $hours; |
michael@202 | 516 | } |
michael@202 | 517 | if ($day < 10) { |
michael@202 | 518 | $day = "0" . $day; |
michael@202 | 519 | } |
michael@202 | 520 | if ($month < 10) { |
michael@202 | 521 | $month = "0" . $month; |
michael@202 | 522 | } |
michael@202 | 523 | $ret_val = $month . $day . $hours . $minutes; |
michael@202 | 524 | return $ret_val; |
michael@202 | 525 | } |
michael@202 | 526 | |
michael@319 | 527 | ############ new_time ################ |
michael@319 | 528 | # This will return the time string # |
michael@319 | 529 | # with a time set 10 minute into # |
michael@319 | 530 | # the future. The string is MMDDhhmi # |
michael@319 | 531 | ###################################### |
michael@202 | 532 | sub new_time { |
michael@202 | 533 | my ($input) = @_; |
michael@202 | 534 | my @timedata; |
michael@202 | 535 | my $minutes; |
michael@202 | 536 | my $hours; |
michael@202 | 537 | my $day; |
michael@202 | 538 | my $month; |
michael@202 | 539 | my $ret_val; |
michael@202 | 540 | my $epoc = time(); |
michael@202 | 541 | if ($input eq "10m") { |
michael@202 | 542 | # add 10 minutes |
michael@202 | 543 | $epoc += 600; |
michael@202 | 544 | #$epoc += 120; #just for debugs |
michael@202 | 545 | } else { |
michael@202 | 546 | # add 24 hours |
michael@202 | 547 | $epoc += 86400; |
michael@202 | 548 | } |
michael@202 | 549 | @timedata = localtime($epoc); |
michael@202 | 550 | $minutes = $timedata[1]; |
michael@202 | 551 | $hours = $timedata[2]; |
michael@202 | 552 | $day = $timedata[3]; |
michael@202 | 553 | $month = $timedata[4] + 1; |
michael@202 | 554 | #Correct the "First hour after midnight" problem |
michael@202 | 555 | if ($minutes < 10) { |
michael@202 | 556 | $minutes = "0" . $minutes; |
michael@202 | 557 | } |
michael@202 | 558 | if ($hours < 10) { |
michael@202 | 559 | $hours = "0" . $hours; |
michael@202 | 560 | } |
michael@202 | 561 | if ($day < 10) { |
michael@202 | 562 | $day = "0" . $day; |
michael@202 | 563 | } |
michael@202 | 564 | if ($month < 10) { |
michael@202 | 565 | $month = "0" . $month; |
michael@202 | 566 | } |
michael@202 | 567 | $ret_val = $month . $day . $hours . $minutes; |
michael@202 | 568 | return $ret_val; |
michael@202 | 569 | } |
michael@202 | 570 | |
michael@319 | 571 | ########### snooze ########## |
michael@319 | 572 | # This is the menu to snooze # |
michael@319 | 573 | # the wakeup call # |
michael@319 | 574 | ############################## |
michael@202 | 575 | sub snooze { |
michael@202 | 576 | my ($oldfile) = @_; |
michael@202 | 577 | my $newfile; |
michael@202 | 578 | my $extension; |
michael@202 | 579 | my $context; |
michael@202 | 580 | my @filestore = split (/\./, $oldfile); |
michael@202 | 581 | my @permstore = split (/\./, $oldfile); |
michael@202 | 582 | my $time; |
michael@202 | 583 | my $ret_var = 0; |
michael@202 | 584 | my $ret_dummy; |
michael@202 | 585 | my $myprint; |
michael@202 | 586 | # Answer the channel |
michael@202 | 587 | &answer(); |
michael@202 | 588 | # Is this a reoccuring call, then add 24h |
michael@202 | 589 | if ($permstore[1] eq "perm") { |
michael@202 | 590 | $permstore[2] += 1; #Just to get a new file name |
michael@202 | 591 | $newfile = join(".",@permstore); |
michael@202 | 592 | $extension = $AGI{extension}; |
michael@202 | 593 | $context = $AGI{context}; |
michael@202 | 594 | # Open the file |
michael@202 | 595 | open (CALL, '>', "${WAKEDIR}/${newfile}") or die "Cannot open call file for write :$!"; |
michael@202 | 596 | $myprint = "channel: Local" . "/" . $extension . "@" . $context . "\n"; |
michael@202 | 597 | print CALL $myprint; |
michael@202 | 598 | print CALL "maxretries: 3\n"; |
michael@202 | 599 | print CALL "retrytime: 60\n"; |
michael@202 | 600 | print CALL "waittime: 60\n"; |
michael@202 | 601 | print CALL "callerid: \"AsterPBX Weckruf\" <$AGI{callerid}>\n"; |
michael@202 | 602 | print CALL "application: AGI\n"; |
michael@202 | 603 | print CALL "data: wakeup|$newfile\n"; |
michael@202 | 604 | close ($CALL); |
michael@202 | 605 | # Get a time 24h from now |
michael@202 | 606 | $time = &new_time("24h"); |
michael@202 | 607 | # Touch the file with the new time |
michael@202 | 608 | my @command = ("$TOUCH", "-t", "$time", "${WAKEDIR}/${newfile}"); |
michael@202 | 609 | system(@command) == 0 |
michael@202 | 610 | or die "system @command failed: $?"; |
michael@202 | 611 | # Now move it |
michael@202 | 612 | my @command = ("mv", "${WAKEDIR}/${newfile}", "${OUTDIR}/${newfile}"); |
michael@202 | 613 | system(@command) == 0 |
michael@202 | 614 | or die "system @command failed: $?"; |
michael@202 | 615 | } |
michael@202 | 616 | #Replace the file name time with snooze |
michael@202 | 617 | $filestore[1] = "snooze"; |
michael@202 | 618 | # Also add 10 minutes to the name |
michael@202 | 619 | $time = new_time("10m"); |
michael@202 | 620 | $filestore[0] = substr($time, 4, 8); |
michael@202 | 621 | # Get the new file name |
michael@202 | 622 | $newfile = join(".",@filestore); |
michael@202 | 623 | $ret_var = &send_file("this-is-yr-wakeup-call"); |
michael@202 | 624 | if ($ret_var == 0 ) { |
michael@202 | 625 | $ret_var = &send_file("to-confirm-wakeup"); |
michael@202 | 626 | } |
michael@202 | 627 | if ($ret_var == 0 ) { |
michael@202 | 628 | $ret_var = &send_file("press-1"); |
michael@202 | 629 | } |
michael@202 | 630 | if ($ret_var == 0 ) { |
michael@202 | 631 | $ret_var = &send_file("to-snooze-for"); |
michael@202 | 632 | } |
michael@202 | 633 | if ($ret_var == 0 ) { |
michael@202 | 634 | $ret_var = &send_file("digits/10"); |
michael@202 | 635 | } |
michael@202 | 636 | if ($ret_var == 0 ) { |
michael@202 | 637 | $ret_var = &send_file("minutes"); |
michael@202 | 638 | } |
michael@202 | 639 | if ($ret_var != 0 ) { |
michael@202 | 640 | $ret_var = &ascii2num($ret_var); |
michael@202 | 641 | } |
michael@202 | 642 | if ($ret_var == 0 ) { |
michael@202 | 643 | $ret_var = &get_data("press-2",1); |
michael@202 | 644 | } |
michael@202 | 645 | if ($ret_var == 2 ) { |
michael@202 | 646 | # Populate some variables |
michael@202 | 647 | $time = &new_time("10m"); |
michael@202 | 648 | $extension = $AGI{extension}; |
michael@202 | 649 | $context = $AGI{context}; |
michael@202 | 650 | # Open the file |
michael@202 | 651 | open (CALL, '>', "${WAKEDIR}/${newfile}") or die "Cannot open call file for write :$!"; |
michael@202 | 652 | $myprint = "channel: Local" . "/" . $extension . "@" . $context . "\n"; |
michael@202 | 653 | print CALL $myprint; |
michael@202 | 654 | print CALL "maxretries: 3\n"; |
michael@202 | 655 | print CALL "retrytime: 60\n"; |
michael@202 | 656 | print CALL "waittime: 60\n"; |
michael@202 | 657 | print CALL "callerid: \"AsterPBX Weckruf\" <$AGI{callerid}>\n"; |
michael@202 | 658 | print CALL "application: AGI\n"; |
michael@202 | 659 | print CALL "data: wakeup|$newfile\n"; |
michael@202 | 660 | close ($CALL); |
michael@202 | 661 | # Touch the file with the new time |
michael@202 | 662 | my @command = ("$TOUCH", "-t", "$time", "${WAKEDIR}/${newfile}"); |
michael@202 | 663 | system(@command) == 0 |
michael@202 | 664 | or die "system @command failed: $?"; |
michael@202 | 665 | # Now move it |
michael@202 | 666 | my @command = ("mv", "${WAKEDIR}/${newfile}", "${OUTDIR}/${newfile}"); |
michael@202 | 667 | system(@command) == 0 |
michael@202 | 668 | or die "system @command failed: $?"; |
michael@202 | 669 | $ret_dummy = &send_file("goodbye"); |
michael@202 | 670 | |
michael@202 | 671 | } elsif ($ret_var == 1) { |
michael@202 | 672 | $ret_dummy = &send_file("goodbye"); |
michael@202 | 673 | } else { |
michael@202 | 674 | $ret_dummy = &send_file("goodbye"); |
michael@202 | 675 | } |
michael@202 | 676 | |
michael@202 | 677 | # Stream out the wakeup |
michael@202 | 678 | return 0; |
michael@202 | 679 | } |
michael@202 | 680 | |
michael@319 | 681 | ######## main program ######## |
michael@319 | 682 | # Here goes the main program # |
michael@319 | 683 | ############################## |
michael@202 | 684 | my $numargs = $#ARGV + 1; |
michael@202 | 685 | if ($DEBUG == 1) { |
michael@202 | 686 | open (DEBUGOUT, '>', $debugfile) or die "Cannot open $debugfile for write :$!"; |
michael@202 | 687 | } |
michael@202 | 688 | |
michael@202 | 689 | # Start by reading in the stuff Asterisk is sending |
michael@202 | 690 | &init_agi(); # Comment out in case of debug outside Asterisk |
michael@202 | 691 | |
michael@202 | 692 | # If DEBUG is set, dump the AGI variable |
michael@202 | 693 | if ($DEBUG == 1) { |
michael@202 | 694 | foreach my $i (sort keys %AGI) { |
michael@202 | 695 | print DEBUGOUT " -- $i = $AGI{$i}\n"; |
michael@202 | 696 | } |
michael@202 | 697 | } |
michael@202 | 698 | |
michael@202 | 699 | if ( $numargs == 0 ) { |
michael@202 | 700 | &welcome(); |
michael@202 | 701 | &hangup(); |
michael@202 | 702 | exit(0); |
michael@202 | 703 | } elsif ( $ARGV[0] eq "move" ) { |
michael@202 | 704 | &move(); |
michael@202 | 705 | &hangup(); |
michael@202 | 706 | exit(0); |
michael@202 | 707 | } else { |
michael@202 | 708 | &snooze($ARGV[0]); |
michael@202 | 709 | &hangup(); |
michael@202 | 710 | exit(0); |
michael@202 | 711 | } |
michael@202 | 712 | |
michael@202 | 713 | if ($DEBUG ==1) { |
michael@202 | 714 | close $DEBUGOUT; |
michael@202 | 715 | } |