Bill I know that the several files are played collectively to compose one message or greeting by asterisk. “vm-theperson” is just a piece of it.
My box is going to serve as a Voicemail Server only. My interest is only with voicemail and I not concerned about what happens to the rest of the apps.
I’ve got into the code and now know where is it called. I’m just worried about the recompile thingie. Definitely, I am in no mood to screw my box.
Here is the code and how voicemail routines run within asterisk,
sub version { $VERSION; }
sub new {
my ($class, %args) = @_;
my $self = {};
bless $self, ref $class || $class;
while (my ($key,$value) = each %args) { $self->set($key,$value); }
return $self;
}
sub DESTROY { }
sub spooldirectory {
my ($self, $directory) = @_;
if (defined($directory)) {
$self->{'spooldirectory'} = $directory;
} else {
$self->{'spooldirectory'} = '/var/spool/asterisk/vm' if (!defined($self->{'spooldirectory'}));
}
return $self->{'spooldirectory'};
}
sub sounddirectory {
my ($self, $directory) = @_;
if (defined($directory)) {
$self->{'sounddirectory'} = $directory;
} else {
$self->{'sounddirectory'} = '/var/lib/asterisk/sounds' if (!defined($self->{'sounddirectory'}));
}
return $self->{'sounddirectory'};
}
sub serveremail {
my ($self, $email) = @_;
$self->{'serveremail'} = $email if (defined($email));
return $self->{'serveremail'};
}
sub format {
my ($self, @formats) = @_;
if (@formats) {
$self->{'formats'} = @formats;
}
return $self->{'formats'};
}
sub vmbox {
my ($self, $vmbox, $vmpass, $vmfn, $vmemail) = @_;
if (defined($vmbox) && (defined($vmpass) || defined($vmfn) || defined($vmemail)) ) {
$self->{'vmbox'}{$vmbox}{'pass'} = $vmpass if (defined($vmpass));
$self->{'vmbox'}{$vmbox}{'fn'} = $vmfn if (defined($vmfn));
$self->{'vmbox'}{$vmbox}{'email'} = $vmemail if (defined($vmemail));
} elsif (defined($vmbox)) {
return ($self->{'vmbox'}{$vmbox}{'pass'},
$self->{'vmbox'}{$vmbox}{'fn'},
$self->{'vmbox'}{$vmbox}{'email'} );
}
}
sub getfolders {
my ($self, $vmbox) = @_;
my @folders = ();
my $spool = $self->spooldirectory();
foreach $file (<$spool/$vmbox/*>) {
if ( -d $file ) {
$file =~ s/$spool\/$vmbox\///;
push(@folders, $file);
}
}
return @folders;
}
sub configfile {
my ($self, $configfile) = @_;
if (defined($configfile)) {
$self->{'configfile'} = $configfile;
} else {
$self->{'configfile'} = '/etc/asterisk/voicemail.conf' if (!defined($self->{'configfile'}));
}
return $self->{'configfile'};
}
sub readconfig {
my ($self) = @_;
my $context = '';
my $line = '';
my $configfile = $self->configfile();
open(CF, "<$configfile") || die "Error loading $configfile: $!\n";
while ($line = <CF>) {
chop($line);
$line =~ s/;.*$//;
$line =~ s/\s*$//;
if ($line =~ /^;/) {
next;
} elsif ($line =~ /^\s*$/) {
next;
} elsif ($line =~ /^\[(\w+)\]$/) {
$context = $1;
print STDERR "Context: $context\n" if ($DEBUG>3);
} elsif ($line =~ /^format\s*[=>]+\s*(.*)/) {
my $formats = $1;
$self->format(split(/|/, $formats));
} elsif ($line =~ /^serveremail\s*[=>]+\s*(.*)/) {
$self->serveremail($1);
} elsif ($line =~ /^(\d+)\s*[=>]+\s*(.*)/) {
my $vmbox = $1;
my $vmstr = $2;
my ($vmpass, $vmfn, $vmemail) = split(/,/, $vmstr);
print STDERR "VM BOX ($vmbox)\n" if ($DEBUG>3);
$self->vmbox($vmbox, $vmpass, $vmfn, $vmstr);
} else {
print STDERR "Unknown line: $line\n" if ($DEBUG);
}
}
close(CF);
}
sub appendsoundfile {
my ($self, $source, $dest) = @_;
open(IN, "<$source") || return 0;
open(OUT, ">>$dest") || return 0;
while (<IN>) {
print OUT $_;
}
close(IN);
close(OUT);
return 1;
}
sub validmailbox {
my ($self, $vmbox) = @_;
return 1 if ($self->vmbox($vmbox));
return 0;
}
sub msgcount {
my ($self, $vmbox, $folder) = @_;
my $count = 0;
return $count if (!defined($vmbox) || !defined($folder));
my $spool = $self->spooldirectory() . '/' . $vmbox . '/' . $folder;
if (opendir(DIR, $spool)) {
my @msgs = grep(/^msg.*\.txt$/, readdir(DIR));
$count = $#msgs+1;
closedir(DIR);
}
return $count;
}
sub msgcountstr {
my ($self, $vmbox, $folder) = @_;
my $count = $self->msgcount($vmbox, $folder);
if ($count > 1) {
return "$count messages";
} elsif ($count > 0) {
return "$count message";
} else {
return "no messages";
}
}
sub createdefaultmailbox {
my ($self, $vmbox) = @_;
my $spool = $self->spooldirectory();
my $sounddir = $self->sounddirectory();
my $vmdir = "$spool/$vmbox";
if ( -d $vmdir ) {
print STDERR "Directory already exists: $vmdir\n" if ($DEBUG);
} else {
mkdir($vmdir, 0755) || return 0;
mkdir("$vmdir/INBOX", 0755) || return 0;
}
$self->appendsoundfile("$sounddir/vm-theperson.gsm", "$vmdir/unavail.gsm");
$self->appendsoundfile("$sounddir/vm-theperson.gsm", "$vmdir/busy.gsm");
$self->appendsoundfile("$sounddir/vm-extension.gsm", "$vmdir/greet.gsm");
foreach $chr (split(//, $vmbox)) {
$self->appendsoundfile("$sounddir/digits/$chr.gsm", "$vmdir/unavail.gsm");
$self->appendsoundfile("$sounddir/digits/$chr.gsm", "$vmdir/busy.gsm");
$self->appendsoundfile("$sounddir/digits/$chr.gsm", "$vmdir/greet.gsm");
}
$self->appendsoundfile("$sounddir/vm-isunavail.gsm", "$vmdir/unavail.gsm");
$self->appendsoundfile("$sounddir/vm-isonphone.gsm", "$vmdir/busy.gsm");
return 1;
}
sub messages {
my ($self, $messages, $folder) = @_;
my $path = $self->spooldirectory() . '/' . $mailbox . '/' . $folder;
if (opendir(DIR, $path)) {
my @msgs = sort grep(/^msg....\.txt$/, readdir(DIR));
closedir(DIR);
return map { s/^msg(....)\.txt$/$1/; $_ } @msgs;
}
return ();