[Asterisk-Users] wake-up call script in wiki

Gonzalo Servat gs at webtastic.com.au
Thu Jul 8 20:58:30 MST 2004


On 9/07/2004 10:21 AM +0700, Isianto Istiadi wrote:

> Dear guys,
> I'm searching the wake-up call script in wiki, found one, but I have no
> idea how to use it. Can you give some direction how to install it?
> Thanks

I presume you're talking about this wake up call script: 
<http://www.voip-info.org/tiki-index.php?page=Asterisk%20tips%20wake-up>

Stick the following in cron:

* * * * * root /path/to/run_wakeups.sh

/path/to/run_wakeups.sh contains:

============= cut ==============
#!/bin/bash

PENDING=/tmp/wakeups
OUTGOING=/var/spool/asterisk/outgoing
SLEEP=5

TIME=$(/bin/date +%H%M)

for fn in $PENDING/$TIME.*.call
do
 if test -r $fn
 then
  /bin/mv -f $fn $OUTGOING/
  sleep $SLEEP
 fi
done
============= cut ==============

The following is my wakeup.agi. Changes to the original version are: some 
debugging functionality (as I was troubleshooting an issue where it would 
read out the wrong time when the script tells you what time the wake up 
call was set to), and it also creates the /tmp/wakeups directory if it 
doesn't already exist. I suggest using the one on the voip-info.org page 
first, and if you decide to use my version then use at your own risk :)

============= cut ==============
#!/usr/bin/perl

use Asterisk::AGI;
use Date::Manip;

use strict;

#########

# Settings:

my $pending_dir = '/tmp/wakeups';

unless (-d '/tmp/wakeups') {
        mkdir('/tmp/wakeups');
}

my $local_context = 'default';

# values for the call file:
my $maxretries = 60;
my $retrytime = 30;
my $waittime =  35;

my $debug = 1;

#my $application = 'MusicOnHold';
my $application = 'Playback';
my $data = 'wake-up';

my $callerid = 'Wakeup Call Service <297>';

#########

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

if ($debug) {
        my $log = '/tmp/wakeup.log';
        unlink($log);
        open (DBG,">>$log") or die "Cannot open debug file: $!";
        print DBG "\n" . "-" x 50 . "\n";
        print DBG "Logging started: " . join('/', $mday, $mon, $year) . " " 
. join(':', $hour, $min, $sec) . "\n";
        print DBG "-" x 50 . "\n";
}

my $agi = new Asterisk::AGI;
my %stuff = $agi->ReadParse;    # MUST DO THIS! -- (add this to 
constructor!)

# this says "1 to create, 2 to confirm, 3 to cancel"
my $func = $agi->get_data('wakeup-menu', 20000, 1);

exit if $func == -1;

my ($caller) = $stuff{callerid} =~ /<(\d+)>/;

if ($func == 1)
{
 my $time = $agi->get_data('time', 15000, 4);
 exit if $func == -1;

 if ($time =~ /^(\d{2})(\d{2})$/)
 {
  my $hour = $1 * 1;
  my $min = $2;

  print DBG 'HOUR entered: ' . $hour . "\n" if $debug;
  print DBG 'MINUTE entered: ' . $min . "\n" if $debug;

  if ($hour > 0 && $hour <= 12 && $min < 60)
  {
   my $time;

#   $agi->stream_file('pls-enter');
#   $agi->stream_file('digits/1');
#   $agi->stream_file('for');
#   $agi->stream_file('digits/a-m');
#   $agi->stream_file('or');
#   $agi->stream_file('digits/2');
#   $agi->stream_file('for');
#   my $ampm = $agi->get_data('digits/p-m', 15000, 1);
   my $ampm = $agi->get_data('am-or-pm', 15000, 1);
   exit if $ampm == -1;

   if ($ampm == 1)
   {
    $time = ParseDate(sprintf("%s:%02s AM", $hour, $min));
    print DBG 'TYPE entered: AM' . "\n" if $debug;
    print DBG '$time is set to: ' . $time . "\n" if $debug;
   }
   elsif ($ampm == 2)
   {
    $time = ParseDate(sprintf("%s:%02s PM", $hour, $min));
    print DBG 'TYPE entered: PM' . "\n" if $debug;
    print DBG '$time is set to: ' . $time . "\n" if $debug;
   }
   else
   {
    $agi->stream_file('vm-sorry');
   }

   if ($time)
   {
    my $h = UnixDate($time, "%I") * 1;
    my $m = UnixDate($time, "%M");
    my $a = UnixDate($time, "%p");

    foreach my $fn (<$pending_dir/*.$caller.call>)
    {
     unlink $fn;
    }

    my $filename = sprintf("%s/%04s.%s.call", $pending_dir, UnixDate($time, 
"%H%M"), $caller);

    open(FILE, ">$filename");


    printf FILE q{#
Channel: Local/%s@%s

MaxRetries: %s
RetryTime: %s
WaitTime: %s

Application: %s
Data: %s

Callerid: %s
},
 $caller, $local_context,
 $maxretries,
 $retrytime,
 $waittime,
 $application,
 $data,
 $callerid,
 ;

    close(FILE);

    # say "Your wakeup call"
    $agi->stream_file('has-been-set-to');
    print DBG 'UnixDate $time translates to ' . UnixDate($time, "%o") . 
"\n" if $debug;
    print DBG 'localtime (UnixDate $time) translates to ' . 
localtime(UnixDate($time, "%o")) . "\n" if $debug;
    $agi->exec('SayUnixTime', sprintf("%s||IMp", UnixDate($time, "%o")));

    $agi->stream_file('for');
    $agi->stream_file('extension');
    $agi->say_digits($caller);

    $agi->stream_file('auth-thankyou');
   }
  }
  else
  {
   $agi->stream_file('vm-sorry');
  }

 }
 else
 {
  $agi->stream_file('vm-sorry');
 }
}
elsif ($func == 2)
{

 my ($fn) = <$pending_dir/*.$caller.call>;

 if ($fn)
 {
  my ($time) = $fn =~ /\/(\d{4})\.\d+\.call/;
  $time =~ s/(\d\d)(\d\d)/$1:$2/;

  $agi->stream_file('is-set-to');

  $agi->exec('SayUnixTime', sprintf("%s||IMp", UnixDate(ParseDate($time),
  "%s")));
 }
 else
 {
  $agi->stream_file('is-not-set');
 }

 $agi->stream_file('auth-thankyou');
}
elsif ($func == 3)
{

 foreach my $fn (<$pending_dir/*.$caller.call>)
 {
  unlink $fn;
 }

 # say "Your wakeup call"
 $agi->stream_file('has-been-cleared');
 $agi->stream_file('auth-thankyou');
}
elsif ($func eq '*')
{
 $agi->stream_file('vm-sorry');
}
else
{
 $agi->stream_file('vm-sorry');
}

$agi->hangup;

if ($debug) {
        print DBG "\n" . "-" x 50 . "\n";
        print DBG "Logging ended: " . join('/', $mday, $mon, $year) . " " . 
join(':', $hour, $min, $sec) . "\n";
        print DBG "-" x 50 . "\n";
        close(DBG);
}
============= cut ==============

Last, but not least, you just need an entry in your extensions.conf similar 
to:

exten => 999,1,AGI(/path/to/wakeup.agi)

Reload asterisk and you should now be able to dial 999 and set a wakeup 
call. Oh, also very important, you need to create the sound files (using 
wavepad or some other software to create gsm files) required in this 
script. These include:

wakeup-menu.gsm (eg. "Welcome to the wakeup call service. Please enter the 
time for your wakeup call... etc")
for.gsm
extension.gsm

If you got any problems, check out the asterisk console for any errors.

Hope this helps.

Regards,
Gonzalo



More information about the asterisk-users mailing list