Move scripts to contrib/scripts

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1963 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Mark Spencer
2004-01-12 03:07:46 +00:00
parent 071ea96fbd
commit f582495d75
9 changed files with 2 additions and 1311 deletions

View File

@@ -401,7 +401,7 @@ webvmail:
@[ -d $(DESTDIR)$(HTTPDIR) ] || ( echo "No HTTP directory" && exit 1 )
@[ -d $(DESTDIR)$(HTTPDIR)/html ] || ( echo "No http directory" && exit 1 )
@[ -d $(DESTDIR)$(HTTPDIR)/cgi-bin ] || ( echo "No cgi-bin directory" && exit 1 )
install -m 4755 -o root -g root vmail.cgi $(DESTDIR)$(HTTPDIR)/cgi-bin/vmail.cgi
install -m 4755 -o root -g root contrib/scripts/vmail.cgi $(DESTDIR)$(HTTPDIR)/cgi-bin/vmail.cgi
mkdir -p $(DESTDIR)$(HTTPDIR)/html/_asterisk
for x in images/*.gif; do \
install -m 644 $$x $(DESTDIR)$(HTTPDIR)/html/_asterisk/; \
@@ -416,7 +416,7 @@ webvmail:
@echo " +-------------------------------------------+"
mailbox:
./addmailbox
./contrib/scripts/addmailbox
rpm: __rpm

View File

@@ -1,20 +0,0 @@
expire-messages.pl
expire-messages finds messages more than X days old and deletes them.
Because the older messages will be the lower numbers in the folder (msg0000
will be older than msg0005), just deleting msg0000 will not work.
expire-messages then runs a routine that goes into every folder in every
mailbox to reorganize. If the folder contains msg0000, no action is taken.
If the folder does not, the rename routine takes the oldest message and
names it msg0000, the next oldest message and names it msg0001 and so on.
The file deletion is done by the -exec parameter to 'find'. It would be far
more efficient to take the output from 'find' and just reorganize the
directories from which we deleted a file. Something for the future...
Keep in mind that messages are deleted at the beginning of the script you
will have mailbox trouble if you check messages before the script
reorganizes your mailbox.
To use it, make sure the paths are right. Adjust $age (originally set to
31) if necessary.

View File

@@ -1,45 +0,0 @@
#!/bin/sh
clear
VMHOME=/var/spool/asterisk/voicemail
SNDHOME=/var/lib/asterisk/sounds
echo
echo "Enter Voicemail Context of the mailbox you are creating."
echo "The context is the value between the square brackets in"
echo "the voicemail.conf file."
echo "(DEFAULT: default)"
echo -n "Voicemail Context: "
read context
echo
echo "Enter the Mailbox number of the voicemail box you are creating."
echo -n "Mailbox Number: "
read mailbox
context=${context:-default}
if [ ! -e "${VMHOME}/${context}" ]
then
echo
echo "New Voicemail context.."
echo "Creating Voicemail context directory..."
mkdir -p ${VMHOME}/${context}
fi
echo
echo "Creating Voicemail directory..."
mkdir -p ${VMHOME}/${context}/${mailbox}
echo "Creating INBOX..."
mkdir -p ${VMHOME}/${context}/${mailbox}/INBOX
echo "Creating Default greetings..."
cat ${SNDHOME}/vm-theperson.gsm > ${VMHOME}/${context}/${mailbox}/unavail.gsm
cat ${SNDHOME}/vm-theperson.gsm > ${VMHOME}/${context}/${mailbox}/busy.gsm
cat ${SNDHOME}/vm-extension.gsm > ${VMHOME}/${context}/${mailbox}/greet.gsm
nums=`echo $mailbox | sed 's/./ \0/g'`
for x in $nums; do
cat ${SNDHOME}/digits/${x}.gsm >> ${VMHOME}/${context}/${mailbox}/unavail.gsm
cat ${SNDHOME}/digits/${x}.gsm >> ${VMHOME}/${context}/${mailbox}/busy.gsm
cat ${SNDHOME}/digits/${x}.gsm >> ${VMHOME}/${context}/${mailbox}/greet.gsm
done
cat ${SNDHOME}/vm-isunavail.gsm >> ${VMHOME}/${context}/${mailbox}/unavail.gsm
cat ${SNDHOME}/vm-isonphone.gsm >> ${VMHOME}/${context}/${mailbox}/busy.gsm
echo "Complete."

View File

@@ -1,73 +0,0 @@
#!/usr/bin/perl
#
# Script to expire voicemail after a specified number of days
# by Steve Creel <screel@turbs.com>
#
# Directory housing the voicemail spool for asterisk
$dir = "/var/spool/asterisk/voicemail";
# Context for which the script should be running
$context = "default";
# Age (Delete files older than $age days old)
$age = 31;
# Delete all files older than $age (but named msg????.??? to be sure
# we don't delete greetings or the user's name)
system('find '.$dir.'/'.$context.' -name msg????.??? -mtime +'.$age.' -exec rm {} \; -exec echo Deleted {} \;');
# For testing - what number to we start when we renumber?
$start = "0";
# Rename to msg and a 4 digit number, 0 padded.
$fnbase = sprintf "msg%04d", $start;
# Make $dir include the context too
$dir.="/".$context;
( -d $dir ) || die "Can't read list of mailboxes ($dir): $!\n";
@mailboxes = `ls -A1 $dir`;
chomp(@mailboxes);
$save_fnbase = $fnbase;
foreach $mailbox (@mailboxes) {
( -d $dir."/".$mailbox) || die "Can't read list of folders (".$dir."/".$mailbox."): $!\n";
@folders = `ls -A1 $dir/$mailbox`;
chomp(@folders);
foreach $folder (@folders) {
if (-d $dir."/".$mailbox."/".$folder) {
( -d $dir."/".$mailbox."/".$folder) || die "Can't read list of messages (".$dir."/".$mailbox."/".$folder.") $!\n";
@files = `ls -A1 $dir/$mailbox/$folder/`;
# Sort so everything is in proper order.
@files = sort @files;
chomp(@files);
# If there is still (after deleting old files earlier in the
# script) a msg0000.txt, we don't need to shuffle anything
# in this folder.
if (-f $dir."/".$mailbox."/".$folder."/msg0000.txt") { next; }
foreach $ext (("WAV", "wav", "gsm", "txt")) {
# Reset the fnbase for each file type
$fnbase = $save_fnbase;
foreach $file (@files) {
if ( $file =~ /$ext/ ) {
chdir($dir."/".$mailbox."/".$folder."/") || die "Can't change folder: $!";
print "Renaming: ".$dir."/".$mailbox."/".$folder."/".$file." to ".$fnbase.".".$ext."\n";
rename($file, $fnbase.".".$ext) || die "Cannot rename: $!";
$fnbase++;
}
}
}
}
}
}
__END__

View File

@@ -1,32 +0,0 @@
/*
* Id: postgres_cdr.sql,v 1.8.2.11 2003/10/10 11:15:43 pnixon Exp $
*
* --- Peter Nixon [ codemonkey@peternixon.net ]
*
* This is a PostgreSQL schema for doing CDR accounting with Asterisk
*
* The calls will automatically be logged as long as the module is loaded.
*
*/
CREATE TABLE cdr (
AcctId BIGSERIAL PRIMARY KEY,
calldate TIMESTAMP with time zone NOT NULL DEFAULT now(),
clid VARCHAR(80) NOT NULL default '',
src VARCHAR(80) NOT NULL default '',
dst VARCHAR(80) NOT NULL default '',
dcontext VARCHAR(80) NOT NULL default '',
channel VARCHAR(80) NOT NULL default '',
dstchannel VARCHAR(80) NOT NULL default '',
lastapp VARCHAR(80) NOT NULL default '',
lastdata VARCHAR(80) NOT NULL default '',
duration INTEGER NOT NULL default '0',
billsec INTEGER NOT NULL default '0',
disposition VARCHAR(45) NOT NULL default '',
amaflags INTEGER NOT NULL default '0',
accountcode VARCHAR(20) NOT NULL default '',
uniqueid VARCHAR(32) NOT NULL default ''
);

View File

@@ -1,113 +0,0 @@
#!/usr/bin/perl -Tw
# Use these commands to create the appropriate tables in MySQL
# If flags is 1 then this record is not included in the output extensions file
#
#CREATE TABLE extensions (
# context CHAR(20) DEFAULT 'default' NOT NULL,
# extension CHAR(20) NOT NULL,
# priority INT(2) DEFAULT '1' NOT NULL,
# application CHAR(20) NOT NULL,
# args CHAR(50),
# descr TEXT,
# flags INT(1) DEFAULT '0' NOT NULL,
# PRIMARY KEY(context, extension, priority)
#);
#
#CREATE TABLE globals (
# variable CHAR(20) NOT NULL,
# value CHAR(50) NOT NULL,
# PRIMARY KEY(variable, value)
#);
use DBI;
################### BEGIN OF CONFIGURATION ####################
# the name of the extensions table
$table_name = "extensions";
# the name of the globals table
$global_table_name = "globals";
# the path to the extensions.conf file
# WARNING: this file will be substituted by the output of this program
$extensions_conf = "/etc/asterisk/extensions.conf";
# the name of the box the MySQL database is running on
$hostname = "localhost";
# the name of the database our tables are kept
$database = "user";
# username to connect to the database
$username = "";
# password to connect to the database
$password = "";
################### END OF CONFIGURATION #######################
open EXTEN, ">$extensions_conf" || die "Cannot create/overwrite extensions file: $extensions_conf\n";
$dbh = DBI->connect("dbi:mysql:dbname=$database;host=$hostname", "$username", "$password");
$statement = "SELECT * from $global_table_name order by variable";
my $result = $dbh->selectall_arrayref($statement);
unless ($result) {
# check for errors after every single database call
print "dbh->selectall_arrayref($statement) failed!\n";
print "DBI::err=[$DBI::err]\n";
print "DBI::errstr=[$DBI::errstr]\n";
exit;
}
my @resultSet = @{$result};
if ( $#resultSet > -1 ) {
print EXTEN "[globals]\n";
foreach $row (@{ $result }) {
my @result = @{ $row };
print EXTEN "$result[0] = $result[1]\n";
}
print EXTEN "\n";
}
$statement = "SELECT context from $table_name group by context";
$result = $dbh->selectall_arrayref($statement);
unless ($result) {
# check for errors after every single database call
print "dbh->selectall_arrayref($statement) failed!\n";
print "DBI::err=[$DBI::err]\n";
print "DBI::errstr=[$DBI::errstr]\n";
}
@resultSet = @{$result};
if ( $#resultSet == -1 ) {
print "No extensions defined in $table_name\n";
exit;
}
foreach my $row ( @{ $result } ) {
my $context = @{ $row }[0];
print EXTEN "[$context]\n";
$statement = "SELECT * from $table_name where context='$context' order by extension, priority";
my $result = $dbh->selectall_arrayref($statement);
unless ($result) {
# check for errors after every single database call
print "dbh->selectall_arrayref($statement) failed!\n";
print "DBI::err=[$DBI::err]\n";
print "DBI::errstr=[$DBI::errstr]\n";
exit;
}
my @resSet = @{$result};
if ( $#resSet == -1 ) {
print "no results\n";
exit;
}
foreach my $row ( @{ $result } ) {
my @result = @{ $row };
if ($result[6] == 0) {
print EXTEN "exten => $result[1],$result[2],$result[3]";
print EXTEN "($result[4])" if defined $result[4];
print EXTEN "\t" if not defined $result[4];
print EXTEN "\t; $result[5]" if defined $result[5];
print EXTEN "\n";
}
}
print EXTEN "\n";
}
exit 0;

View File

@@ -1,93 +0,0 @@
#!/usr/bin/perl -Tw
# Retrieves the sip user/peer entries from the database
# Use these commands to create the appropriate tables in MySQL
#
#CREATE TABLE sip (id INT(11) DEFAULT -1 NOT NULL,keyword VARCHAR(20) NOT NULL,data VARCHAR(50) NOT NULL, flags INT(1) DEFAULT 0 NOT NULL,PRIMARY KEY (id,keyword));
#
# if flags = 1 then the records are not included in the output file
use DBI;
################### BEGIN OF CONFIGURATION ####################
# the name of the extensions table
$table_name = "sip";
# the path to the extensions.conf file
# WARNING: this file will be substituted by the output of this program
$sip_conf = "/etc/asterisk/sip_additional.conf";
# the name of the box the MySQL database is running on
$hostname = "localhost";
# the name of the database our tables are kept
$database = "sip";
# username to connect to the database
$username = "root";
# password to connect to the database
$password = "";
################### END OF CONFIGURATION #######################
$additional = "";
open EXTEN, ">$sip_conf" || die "Cannot create/overwrite extensions file: $sip_conf\n";
$dbh = DBI->connect("dbi:mysql:dbname=$database;host=$hostname", "$username", "$password");
$statement = "SELECT keyword,data from $table_name where id=0 and keyword <> 'account' and flags <> 1";
my $result = $dbh->selectall_arrayref($statement);
unless ($result) {
# check for errors after every single database call
print "dbh->selectall_arrayref($statement) failed!\n";
print "DBI::err=[$DBI::err]\n";
print "DBI::errstr=[$DBI::errstr]\n";
exit;
}
my @resultSet = @{$result};
if ( $#resultSet > -1 ) {
foreach $row (@{ $result }) {
my @result = @{ $row };
$additional .= $result[0]."=".$result[1]."\n";
}
}
$statement = "SELECT data,id from $table_name where keyword='account' and flags <> 1 group by data";
$result = $dbh->selectall_arrayref($statement);
unless ($result) {
# check for errors after every single database call
print "dbh->selectall_arrayref($statement) failed!\n";
print "DBI::err=[$DBI::err]\n";
print "DBI::errstr=[$DBI::errstr]\n";
}
@resultSet = @{$result};
if ( $#resultSet == -1 ) {
print "No sip accounts defined in $table_name\n";
exit;
}
foreach my $row ( @{ $result } ) {
my $account = @{ $row }[0];
my $id = @{ $row }[1];
print EXTEN "[$account]\n";
$statement = "SELECT keyword,data from $table_name where id=$id and keyword <> 'account' and flags <> 1 order by keyword";
my $result = $dbh->selectall_arrayref($statement);
unless ($result) {
# check for errors after every single database call
print "dbh->selectall_arrayref($statement) failed!\n";
print "DBI::err=[$DBI::err]\n";
print "DBI::errstr=[$DBI::errstr]\n";
exit;
}
my @resSet = @{$result};
if ( $#resSet == -1 ) {
print "no results\n";
exit;
}
foreach my $row ( @{ $result } ) {
my @result = @{ $row };
print EXTEN "$result[0]=$result[1]\n";
}
print EXTEN "$additional\n";
}
exit 0;

931
vmail.cgi
View File

@@ -1,931 +0,0 @@
#!/usr/bin/perl
#
# Web based Voicemail for Asterisk
#
# Copyright (C) 2002, Linux Support Services, Inc.
#
# Distributed under the terms of the GNU General Public License
#
# Written by Mark Spencer <markster@linux-support.net>
#
# (icky, I know.... if you know better perl please help!)
#
#
use CGI qw/:standard/;
use Carp::Heavy;
use CGI::Carp qw(fatalsToBrowser);
@validfolders = ( "INBOX", "Old", "Work", "Family", "Friends", "Cust1", "Cust2", "Cust3", "Cust4", "Cust5" );
%formats = (
"wav" => {
name => "Uncompressed WAV",
mime => "audio/x-wav",
pref => 1
},
"WAV" => {
name => "GSM Compressed WAV",
mime => "audio/x-wav",
pref => 2
},
"gsm" => {
name => "Raw GSM Audio",
mime => "audio/x-gsm",
pref => 3
}
);
$astpath = "/_asterisk";
$stdcontainerstart = "<table align=center width=600><tr><td>\n";
$footer = "<hr><font size=-1><a href=\"http://www.asterisk.org\">The Asterisk Open Source PBX</a> Copyright 2002, <a href=\"http://www.digium.com\">Digium, Inc.</a></a>";
$stdcontainerend = "</td></tr><tr><td align=right>$footer</td></tr></table>\n";
sub login_screen() {
print header;
my ($message) = @_;
print <<_EOH;
<TITLE>Asterisk Web-Voicemail</TITLE>
<BODY BGCOLOR="white">
$stdcontainerstart
<FORM METHOD="post">
<input type=hidden name="action" value="login">
<table align=center>
<tr><td valign=top align=center rowspan=6><img align=center src="$astpath/animlogo.gif"></td></tr>
<tr><td align=center colspan=2><font size=+2>Comedian Mail Login</font></td></tr>
<tr><td align=center colspan=2><font size=+1>$message</font></td></tr>
<tr><td>Mailbox:</td><td><input type=text name="mailbox"></td></tr>
<tr><td>Password:</td><td><input type=password name="password"></td></tr>
<tr><td align=right colspan=2><input value="Login" type=submit></td></tr>
</table>
</FORM>
$stdcontainerend
</BODY>\n
_EOH
}
sub check_login()
{
local ($filename, $startcat) = @_;
local ($mbox, $context) = split(/\@/, param('mailbox'));
local $pass = param('password');
local $category = $startcat;
local @fields;
local $tmp;
local (*VMAIL);
if (!$category) {
$category = "general";
}
if (!$context) {
$context = param('context');
}
if (!$context) {
$context = "default";
}
if (!$filename) {
$filename = "/etc/asterisk/voicemail.conf";
}
# print header;
# print "Including <h2>$filename</h2> while in <h2>$category</h2>...\n";
open(VMAIL, "<$filename") || die("Bleh, no $filename");
while(<VMAIL>) {
chomp;
if (/include\s\"([^\"]+)\"$/) {
($tmp, $category) = &check_login("/etc/asterisk/$1", $category);
if (length($tmp)) {
# print "Got '$tmp'\n";
return ($tmp, $category);
}
} elsif (/\[(.*)\]/) {
$category = $1;
} elsif ($category ne "general") {
if (/([^\s]+)\s*\=\>?\s*(.*)/) {
@fields = split(/\,\s*/, $2);
# print "<p>Mailbox is $1\n";
if (($mbox eq $1) && ($pass eq $fields[0]) && ($context eq $category)) {
return ($fields[1] ? $fields[1] : "Extension $mbox in $context", $category);
}
}
}
}
close(VMAIL);
return ("", $category);
}
sub validmailbox()
{
local ($context, $mbox, $filename, $startcat) = @_;
local $category = $startcat;
local @fields;
local (*VMAIL);
if (!$context) {
$context = param('context');
}
if (!$context) {
$context = "default";
}
if (!$filename) {
$filename = "/etc/asterisk/voicemail.conf";
}
if (!$category) {
$category = "general";
}
open(VMAIL, "<$filename") || die("Bleh, no $filename");
while(<VMAIL>) {
chomp;
if (/include\s\"([^\"]+)\"$/) {
($tmp, $category) = &validmailbox($mbox, $context, "/etc/asterisk/$1");
if ($tmp) {
return ($tmp, $category);
}
} elsif (/\[(.*)\]/) {
$category = $1;
} elsif (($category ne "general") && ($category eq $context)) {
if (/([^\s]+)\s*\=\>?\s*(.*)/) {
@fields = split(/\,\s*/, $2);
if (($mbox eq $1) && ($context eq $category)) {
return ($fields[2] ? $fields[2] : "unknown", $category);
}
}
}
}
return ("", $category);
}
sub mailbox_options()
{
local($context, $current, $filename, $category) = @_;
local (*VMAIL);
local $tmp2;
local $tmp;
if (!$filename) {
$filename = "/etc/asterisk/voicemail.conf";
}
if (!$category) {
$category = "general";
}
# print header;
# print "Including <h2>$filename</h2> while in <h2>$category</h2>...\n";
open(VMAIL, "<$filename") || die("Bleh, no voicemail.conf");
while(<VMAIL>) {
chomp;
s/\;.*$//;
if (/include\s\"([^\"]+)\"$/) {
($tmp2, $category) = &mailbox_options($context, $current, "/etc/asterisk/$1", $category);
# print "Got '$tmp2'...\n";
$tmp .= $tmp2;
} elsif (/\[(.*)\]/) {
$category = $1;
} elsif ($category ne "general") {
if (/([^\s]+)\s*\=\>?\s*(.*)/) {
@fields = split(/\,\s*/, $2);
$text = "$1";
if ($fields[2]) {
$text .= " ($fields[1])";
}
if ($1 eq $current) {
$tmp .= "<OPTION SELECTED>$text</OPTION>\n";
} else {
$tmp .= "<OPTION>$text</OPTION>\n";
}
}
}
}
close(VMAIL);
return ($tmp, $category);
}
sub mailbox_list()
{
local ($name, $context, $current) = @_;
local $tmp;
local $text;
local $tmp;
local $opts;
if (!$context) {
$context = "default";
}
$tmp = "<SELECT name=\"$name\">\n";
($opts) = &mailbox_options($context, $current);
$tmp .= $opts;
$tmp .= "</SELECT>\n";
}
sub msgcount()
{
my ($context, $mailbox, $folder) = @_;
my $path = "/var/spool/asterisk/voicemail/$context/$mailbox/$folder";
if (opendir(DIR, $path)) {
my @msgs = grep(/^msg....\.txt$/, readdir(DIR));
closedir(DIR);
return sprintf "%d", $#msgs + 1;
}
return "0";
}
sub msgcountstr()
{
my ($context, $mailbox, $folder) = @_;
my $count = &msgcount($context, $mailbox, $folder);
if ($count > 1) {
"$count messages";
} elsif ($count > 0) {
"$count message";
} else {
"no messages";
}
}
sub messages()
{
my ($context, $mailbox, $folder) = @_;
my $path = "/var/spool/asterisk/voicemail/$context/$mailbox/$folder";
if (opendir(DIR, $path)) {
my @msgs = sort grep(/^msg....\.txt$/, readdir(DIR));
closedir(DIR);
return map { s/^msg(....)\.txt$/$1/; $_ } @msgs;
}
return ();
}
sub getcookie()
{
my ($var) = @_;
return cookie($var);
}
sub makecookie()
{
my ($format) = @_;
cookie(-name => "format", -value =>["$format"], -expires=>"+1y");
}
sub getfields()
{
my ($context, $mailbox, $folder, $msg) = @_;
my $fields;
if (open(MSG, "</var/spool/asterisk/voicemail/$context/$mailbox/$folder/msg${msg}.txt")) {
while(<MSG>) {
s/\#.*$//g;
if (/^(\w+)\s*\=\s*(.*)$/) {
$fields->{$1} = $2;
}
}
close(MSG);
$fields->{'msgid'} = $msg;
} else { print "<BR>Unable to open '$msg' in '$mailbox', '$folder'\n<B>"; }
$fields;
}
sub message_prefs()
{
my ($nextaction, $msgid) = @_;
my $folder = param('folder');
my $mbox = param('mailbox');
my $passwd = param('password');
my $format = param('format');
if (!$format) {
$format = &getcookie('format');
}
print header;
print <<_EOH;
<TITLE>Asterisk Web-Voicemail: Preferences</TITLE>
<BODY BGCOLOR="white">
$stdcontainerstart
<FORM METHOD="post">
<table width=100% align=center>
<tr><td align=right colspan=3><font size=+2>Web Voicemail Preferences</font></td></tr>
<tr><td align=left><font size=+1>Preferred&nbsp;Audio&nbsp;Format:</font></td><td colspan=2></td></tr>
_EOH
foreach $fmt (sort { $formats{$a}->{'pref'} <=> $formats{$b}->{'pref'} } keys %formats) {
my $clicked = "checked" if $fmt eq $format;
print "<tr><td></td><td align=left><input type=radio name=\"format\" $clicked value=\"$fmt\"></td><td width=100%>&nbsp;$formats{$fmt}->{name}</td></tr>\n";
}
print <<_EOH;
<tr><td align=right colspan=3><input type=submit value="save settings..."></td></tr>
</table>
<input type=hidden name="action" value="$nextaction">
<input type=hidden name="folder" value="$folder">
<input type=hidden name="mailbox" value="$mbox">
<input type=hidden name="context" value="$context">
<input type=hidden name="password" value="$passwd">
<input type=hidden name="msgid" value="$msgid">
$stdcontainerend
</BODY>\n
_EOH
}
sub message_play()
{
my ($message, $msgid) = @_;
my $folder = param('folder');
my ($mbox, $context) = split(/\@/, param('mailbox'));
my $passwd = param('password');
my $format = param('format');
my $fields;
if (!$context) {
$context = param('context');
}
if (!$context) {
$context = "default";
}
my $folders = &folder_list('newfolder', $context, $mbox, $folder);
my $mailboxes = &mailbox_list('forwardto', $context, $mbox);
if (!$format) {
$format = &getcookie('format');
}
if (!$format) {
&message_prefs("play", $msgid);
} else {
print header(-cookie => &makecookie($format));
$fields = &getfields($context, $mbox, $folder, $msgid);
if (!$fields) {
print "<BR>Bah!\n";
return;
}
my $duration = $fields->{'duration'};
if ($duration) {
$duration = sprintf "%d:%02d", $duration/60, $duration % 60;
} else {
$duration = "<i>Unknown</i>";
}
print <<_EOH;
<TITLE>Asterisk Web-Voicemail: $folder Message $msgid</TITLE>
<BODY BGCOLOR="white">
$stdcontainerstart
<FORM METHOD="post">
<table width=100% align=center>
<tr><td align=right colspan=3><font size=+1>$folder Message $msgid</font></td></tr>
_EOH
print <<_EOH;
<tr><td align=center colspan=3>
<table>
<tr><td colspan=2 align=center><font size=+1>$folder <b>$msgid</b></font></td></tr>
<tr><td><b>Message:</b></td><td>$msgid</td></tr>\n
<tr><td><b>Mailbox:</b></td><td>$mbox</td></tr>\n
<tr><td><b>Folder:</b></td><td>$folder</td></tr>\n
<tr><td><b>From:</b></td><td>$fields->{callerid}</td></tr>\n
<tr><td><b>Duration:</b></td><td>$duration</td></tr>\n
<tr><td><b>Original Date:</b></td><td>$fields->{origdate}</td></tr>\n
<tr><td><b>Original Mailbox:</b></td><td>$fields->{origmailbox}</td></tr>\n
<tr><td><b>Caller Channel:</b></td><td>$fields->{callerchan}</td></tr>\n
<tr><td align=center colspan=2>
<input name="action" type=submit value="index">&nbsp;
<input name="action" type=submit value="delete ">&nbsp;
<input name="action" type=submit value="forward to -> ">&nbsp;
$mailboxes&nbsp;
<input name="action" type=submit value="save to ->">
$folders&nbsp;
<input name="action" type=submit value="play ">
<input name="action" type=submit value="download">
</td></tr>
<tr><td colspan=2 align=center>
<embed width=400 height=40 src="vmail.cgi?action=audio&folder=$folder&mailbox=$mbox&password=$passwd&msgid=$msgid&format=$format&dontcasheme=$$.$format" autostart=yes loop=false></embed>
</td></tr></table>
</td></tr>
</table>
<input type=hidden name="folder" value="$folder">
<input type=hidden name="mailbox" value="$mbox">
<input type=hidden name="context" value="$context">
<input type=hidden name="password" value="$passwd">
<input type=hidden name="msgid" value="$msgid">
$stdcontainerend
</BODY>\n
_EOH
}
}
sub message_audio()
{
my ($forcedownload) = @_;
my $folder = param('folder');
my $msgid = param('msgid');
my $mailbox = param('mailbox');
my $format = param('format');
if (!$format) {
$format = &getcookie('format');
}
my $path = "/var/spool/asterisk/vm/$mailbox/$folder/msg${msgid}.$format";
$msgid =~ /^\d\d\d\d$/ || die("Msgid Liar ($msgid)!");
grep(/^${format}$/, keys %formats) || die("Format Liar ($format)!");
# Mailbox and folder are already verified
if (open(AUDIO, "<$path")) {
$size = -s $path;
$|=1;
if ($forcedownload) {
print header(-type=>$formats{$format}->{'mime'}, -Content_length => $size, -attachment => "msg${msgid}.$format");
} else {
print header(-type=>$formats{$format}->{'mime'}, -Content_length => $size);
}
while(($amt = sysread(AUDIO, $data, 4096)) > 0) {
syswrite(STDOUT, $data, $amt);
}
close(AUDIO);
} else {
die("Hrm, can't seem to open $path\n");
}
}
sub message_index()
{
my ($folder, $message) = @_;
my ($mbox, $context) = split(/\@/, param('mailbox'));
my $passwd = param('password');
my $message2;
my $msgcount;
my $hasmsg;
my $newmessages, $oldmessages;
my $format = param('format');
if (!$format) {
$format = &getcookie('format');
}
if (!$context) {
$context = param('context');
}
if (!$context) {
$context = "default";
}
if ($folder) {
$msgcount = &msgcountstr($context, $mbox, $folder);
$message2 = "&nbsp;&nbsp;&nbsp;Folder '$folder' has " . &msgcountstr($context, $mbox, $folder);
} else {
$newmessages = &msgcount($context, $mbox, "INBOX");
$oldmessages = &msgcount($context, $mbox, "Old");
if (($newmessages > 0) || ($oldmessages < 1)) {
$folder = "INBOX";
} else {
$folder = "Old";
}
$message2 = "You have";
if ($newmessages > 0) {
$message2 .= " <b>$newmessages</b> NEW";
if ($oldmessages > 0) {
$message2 .= "and <b>$oldmessages</b> OLD";
if ($oldmessages != 1) {
$message2 .= " messages.";
} else {
$message2 .= "message.";
}
} else {
if ($newmessages != 1) {
$message2 .= " messages.";
} else {
$message2 .= " message.";
}
}
} else {
if ($oldmessages > 0) {
$message2 .= " <b>$oldmessages</b> OLD";
if ($oldmessages != 1) {
$message2 .= " messages.";
} else {
$message2 .= " message.";
}
} else {
$message2 .= " <b>no</b> messages.";
}
}
}
my $folders = &folder_list('newfolder', $context, $mbox, $folder);
my $cfolders = &folder_list('changefolder', $context, $mbox, $folder);
my $mailboxes = &mailbox_list('forwardto', $context, $mbox);
print header(-cookie => &makecookie($format));
print <<_EOH;
<TITLE>Asterisk Web-Voicemail: $mbox $folder</TITLE>
<BODY BGCOLOR="white">
$stdcontainerstart
<FORM METHOD="post">
<table width=100% align=center>
<tr><td align=center colspan=2><font size=+2><I>$message</I></font></td></tr>
<tr><td align=right colspan=2><font size=+1><b>$folder</b> Messages</font> <input type=submit name="action" value="change to ->">$cfolders</td></tr>
<tr><td align=left colspan=2><font size=+1>$message2</font></td></tr>
</table>
<table width=100% align=center cellpadding=0 cellspacing=0>
_EOH
print "<tr><td>&nbsp;Msg</td><td>&nbsp;From</td><td>&nbsp;Duration</td><td>&nbsp;Date</td><td>&nbsp;</td></tr>\n";
print "<tr><td><hr></td><td><hr></td><td><hr></td><td><hr></td><td></td></tr>\n";
foreach $msg (&messages($context, $mbox, $folder)) {
$fields = &getfields($context, $mbox, $folder, $msg);
$duration = $fields->{'duration'};
if ($duration) {
$duration = sprintf "%d:%02d", $duration / 60, $duration % 60;
} else {
$duration = "<i>Unknown</i>";
}
$hasmsg++;
print "<tr><td><input type=checkbox name=\"msgselect\" value=\"$msg\">&nbsp;<b>$msg</b></td><td>$fields->{'callerid'}</td><td>$duration</td><td>$fields->{'origdate'}</td><td><input name='play$msg' alt=\"Play message $msg\" border=0 type=image align=left src=\"$astpath/play.gif\"></td></tr>\n";
}
if (!$hasmsg) {
print "<tr><td colspan=4 align=center><P><b><i>No messages</i></b><P></td></tr>";
}
print <<_EOH;
</table>
<table width=100% align=center>
<tr><td align=right colspan=2>
<input type="submit" name="action" value="refresh">&nbsp;
_EOH
if ($hasmsg) {
print <<_EOH;
<input type="submit" name="action" value="delete">&nbsp;
<input type="submit" name="action" value="save to ->">
$folders&nbsp;
<input type="submit" name="action" value="forward to ->">
$mailboxes
_EOH
}
print <<_EOH;
</td></tr>
<tr><td align=right colspan=2>
<input type="submit" name="action" value="preferences">
<input type="submit" name="action" value="logout">
</td></tr>
</table>
<input type=hidden name="folder" value="$folder">
<input type=hidden name="mailbox" value="$mbox">
<input type=hidden name="context" value="$context">
<input type=hidden name="password" value="$passwd">
</FORM>
$stdcontainerend
</BODY>\n
_EOH
}
sub validfolder()
{
my ($folder) = @_;
return grep(/^$folder$/, @validfolders);
}
sub folder_list()
{
my ($name, $context, $mbox, $selected) = @_;
my $f;
my $count;
my $tmp = "<SELECT name=\"$name\">\n";
foreach $f (@validfolders) {
$count = &msgcount($context, $mbox, $f);
if ($f eq $selected) {
$tmp .= "<OPTION SELECTED>$f ($count)</OPTION>\n";
} else {
$tmp .= "<OPTION>$f ($count)</OPTION>\n";
}
}
$tmp .= "</SELECT>";
}
sub message_rename()
{
my ($context, $mbox, $oldfolder, $old, $newfolder, $new) = @_;
my $oldfile, $newfile;
return if ($old eq $new) && ($oldfolder eq $newfolder);
if ($context =~ /^(\w+)$/) {
$context = $1;
} else {
die("Invalid Context<BR>\n");
}
if ($mbox =~ /^(\w+)$/) {
$mbox = $1;
} else {
die ("Invalid mailbox<BR>\n");
}
if ($oldfolder =~ /^(\w+)$/) {
$oldfolder = $1;
} else {
die("Invalid old folder<BR>\n");
}
if ($newfolder =~ /^(\w+)$/) {
$newfolder = $1;
} else {
die("Invalid new folder ($newfolder)<BR>\n");
}
if ($old =~ /^(\d\d\d\d)$/) {
$old = $1;
} else {
die("Invalid old Message<BR>\n");
}
if ($new =~ /^(\d\d\d\d)$/) {
$new = $1;
} else {
die("Invalid old Message<BR>\n");
}
my $path = "/var/spool/asterisk/voicemail/$context/$mbox/$newfolder";
mkdir $path, 0755;
my $path = "/var/spool/asterisk/voicemail/$context/$mbox/$oldfolder";
opendir(DIR, $path) || die("Unable to open directory\n");
my @files = grep /^msg${old}\.\w+$/, readdir(DIR);
closedir(DIR);
foreach $oldfile (@files) {
my $tmp = $oldfile;
if ($tmp =~ /^(msg${old}.\w+)$/) {
$tmp = $1;
$oldfile = $path . "/$tmp";
$tmp =~ s/msg${old}/msg${new}/;
$newfile = "/var/spool/asterisk/voicemail/$context/$mbox/$newfolder/$tmp";
# print "Renaming $oldfile to $newfile<BR>\n";
rename($oldfile, $newfile);
}
}
}
sub file_copy()
{
my ($orig, $new) = @_;
my $res;
my $data;
open(IN, "<$orig") || die("Unable to open '$orig'\n");
open(OUT, ">$new") || DIE("Unable to open '$new'\n");
while(($res = sysread(IN, $data, 4096)) > 0) {
syswrite(OUT, $data, $res);
}
close(OUT);
close(IN);
}
sub message_copy()
{
my ($mbox, $newmbox, $oldfolder, $old, $new) = @_;
my $oldfile, $newfile;
return if ($mbox eq $newmbox);
if ($mbox =~ /^(\w+)$/) {
$mbox = $1;
} else {
die ("Invalid mailbox<BR>\n");
}
if ($newmbox =~ /^(\w+)$/) {
$newmbox = $1;
} else {
die ("Invalid new mailbox<BR>\n");
}
if ($oldfolder =~ /^(\w+)$/) {
$oldfolder = $1;
} else {
die("Invalid old folder<BR>\n");
}
if ($old =~ /^(\d\d\d\d)$/) {
$old = $1;
} else {
die("Invalid old Message<BR>\n");
}
if ($new =~ /^(\d\d\d\d)$/) {
$new = $1;
} else {
die("Invalid old Message<BR>\n");
}
my $path = "/var/spool/asterisk/vm/$newmbox";
mkdir $path, 0755;
my $path = "/var/spool/asterisk/vm/$newmbox/INBOX";
mkdir $path, 0755;
my $path = "/var/spool/asterisk/vm/$mbox/$oldfolder";
opendir(DIR, $path) || die("Unable to open directory\n");
my @files = grep /^msg${old}\.\w+$/, readdir(DIR);
closedir(DIR);
foreach $oldfile (@files) {
my $tmp = $oldfile;
if ($tmp =~ /^(msg${old}.\w+)$/) {
$tmp = $1;
$oldfile = $path . "/$tmp";
$tmp =~ s/msg${old}/msg${new}/;
$newfile = "/var/spool/asterisk/vm/$newmbox/INBOX/$tmp";
# print "Copying $oldfile to $newfile<BR>\n";
&file_copy($oldfile, $newfile);
}
}
}
sub message_delete()
{
my ($context, $mbox, $folder, $msg) = @_;
if ($mbox =~ /^(\w+)$/) {
$mbox = $1;
} else {
die ("Invalid mailbox<BR>\n");
}
if ($context =~ /^(\w+)$/) {
$context = $1;
} else {
die ("Invalid context<BR>\n");
}
if ($folder =~ /^(\w+)$/) {
$folder = $1;
} else {
die("Invalid folder<BR>\n");
}
if ($msg =~ /^(\d\d\d\d)$/) {
$msg = $1;
} else {
die("Invalid Message<BR>\n");
}
my $path = "/var/spool/asterisk/voicemail/$context/$mbox/$folder";
opendir(DIR, $path) || die("Unable to open directory\n");
my @files = grep /^msg${msg}\.\w+$/, readdir(DIR);
closedir(DIR);
foreach $oldfile (@files) {
if ($oldfile =~ /^(msg${msg}.\w+)$/) {
$oldfile = $path . "/$1";
# print "Deleting $oldfile<BR>\n";
unlink($oldfile);
}
}
}
sub message_forward()
{
my ($toindex, @msgs) = @_;
my $folder = param('folder');
my ($mbox, $context) = split(/\@/, param('mailbox'));
my $newmbox = param('forwardto');
my $msg;
my $msgcount;
if (!$context) {
$context = param('context');
}
if (!$context) {
$context = "default";
}
$newmbox =~ s/(\w+)(\s+.*)?$/$1/;
if (!&validmailbox($context, $newmbox)) {
die("Bah! Not a valid mailbox '$newmbox'\n");
return "";
}
$msgcount = &msgcount($context, $newmbox, "INBOX");
my $txt;
if ($newmbox ne $mbox) {
# print header;
foreach $msg (@msgs) {
# print "Forwarding $msg from $mbox to $newmbox<BR>\n";
&message_copy($mbox, $newmbox, $folder, $msg, sprintf "%04d", $msgcount);
$msgcount++;
}
$txt = "Forwarded messages " . join(', ', @msgs) . "to $newmbox";
} else {
$txt = "Can't forward messages to yourself!\n";
}
if ($toindex) {
&message_index($folder, $txt);
} else {
&message_play($txt, $msgs[0]);
}
}
sub message_delete_or_move()
{
my ($toindex, $del, @msgs) = @_;
my $txt;
my $path;
my $y, $x;
my $folder = param('folder');
my $newfolder = param('newfolder') unless $del;
$newfolder =~ s/^(\w+)\s+.*$/$1/;
my ($mbox, $context) = split(/\@/, param('mailbox'));
if (!$context) {
$context = param('context');
}
if (!$context) {
$context = "default";
}
my $passwd = param('password');
my $msgcount = &msgcount($context, $mbox, $folder);
my $omsgcount = &msgcount($context, $mbox, $newfolder) if $newfolder;
# print header;
if ($newfolder ne $folder) {
$y = 0;
for ($x=0;$x<$msgcount;$x++) {
my $msg = sprintf "%04d", $x;
my $newmsg = sprintf "%04d", $y;
if (grep(/^$msg$/, @msgs)) {
if ($newfolder) {
&message_rename($context, $mbox, $folder, $msg, $newfolder, sprintf "%04d", $omsgcount);
$omsgcount++;
} else {
&message_delete($context, $mbox, $folder, $msg);
}
} else {
&message_rename($context, $mbox, $folder, $msg, $folder, $newmsg);
$y++;
}
}
if ($del) {
$txt = "Deleted messages " . join (', ', @msgs);
} else {
$txt = "Moved messages " . join (', ', @msgs) . " to $newfolder";
}
} else {
$txt = "Can't move a message to the same folder they're in already";
}
# Not as many messages now
$msgcount--;
if ($toindex || ($msgs[0] >= $msgcount)) {
&message_index($folder, $txt);
} else {
&message_play($txt, $msgs[0]);
}
}
if (param()) {
my $folder = param('folder');
my $changefolder = param('changefolder');
$changefolder =~ s/(\w+)\s+.*$/$1/;
my $newfolder = param('newfolder');
$newfolder =~ s/^(\w+)\s+.*$/$1/;
if ($newfolder && !&validfolder($newfolder)) {
print header;
die("Bah! new folder '$newfolder' isn't a folder.");
}
$action = param('action');
$msgid = param('msgid');
if (!$action) {
my ($tmp) = grep /^play\d\d\d\d\.x$/, param;
if ($tmp =~ /^play(\d\d\d\d)/) {
$msgid = $1;
$action = "play";
} else {
print header;
print "No message?<BR>\n";
return;
}
}
@msgs = param('msgselect');
@msgs = ($msgid) unless @msgs;
{
($mailbox) = &check_login();
if (length($mailbox)) {
if ($action eq 'login') {
&message_index($folder, "Welcome, $mailbox");
} elsif (($action eq 'refresh') || ($action eq 'index')) {
&message_index($folder, "Welcome, $mailbox");
} elsif ($action eq 'change to ->') {
if (&validfolder($changefolder)) {
$folder = $changefolder;
&message_index($folder, "Welcome, $mailbox");
} else {
die("Bah! Not a valid change to folder '$changefolder'\n");
}
} elsif ($action eq 'play') {
&message_play("$mailbox $folder $msgid", $msgid);
} elsif ($action eq 'preferences') {
&message_prefs("refresh", $msgid);
} elsif ($action eq 'download') {
&message_audio(1);
} elsif ($action eq 'play ') {
&message_audio(0);
} elsif ($action eq 'audio') {
&message_audio(0);
} elsif ($action eq 'delete') {
&message_delete_or_move(1, 1, @msgs);
} elsif ($action eq 'delete ') {
&message_delete_or_move(0, 1, @msgs);
} elsif ($action eq 'forward to ->') {
&message_forward(1, @msgs);
} elsif ($action eq 'forward to -> ') {
&message_forward(0, @msgs);
} elsif ($action eq 'save to ->') {
&message_delete_or_move(1, 0, @msgs);
} elsif ($action eq 'save to -> ') {
&message_delete_or_move(0, 0, @msgs);
} elsif ($action eq 'logout') {
&login_screen("Logged out!\n");
}
} else {
sleep(1);
&login_screen("Login Incorrect!\n");
}
}
} else {
&login_screen("\&nbsp;");
}

View File

@@ -1,2 +0,0 @@
drop table if exists users;
create table users (mailbox VARCHAR(80) NOT NULL PRIMARY KEY, context VARCHAR(80), password VARCHAR(80), fullname VARCHAR(80), email VARCHAR(80), pager VARCHAR(80), options VARCHAR(160));