File vicibox-install.pl of Package vicibox-install
#!/usr/bin/perl
# vicibox-install.pl version 11.0
#
# Copyright (C) 2023 James Pearson <jamesp@vicidial.com> LICENSE: AGPLv2
#
#
# CHANGES
# 230609-0007 - changed to be just 'vicibox installer'
# 210713-1143 - RC1 build v.10.0
# 190726-1806 - RC1 Build v.9.0
# 180921-1540 - GB Build v.8.1.0
# 180920-1914 - RC2 Build v.8.1
# 180327-1818 - RC1 Build v.8.1
#
# This script looks for a table called 'vicibox' in the ViciDial Database server to pull in settings
# If you don't have one you can create one. The schema is as follows as well as the field definitions.
# If the script doesn't find one, or not one with correctly matching info, it will enable the proper
# modes depending on what it doesn't like. Finding no table = legacy mode. Not finding the database
# entry will enable expert mode. Try not to get this internal tracking database too far out of whack :)
#Vicibox table schema:
#CREATE TABLE IF NOT EXISTS `vicibox` (
# `server_id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
# `server` varchar(32) NOT NULL,
# `server_ip` varchar(32) NOT NULL,
# `server_type` enum('Database','Web','Telephony','Archive') NOT NULL DEFAULT 'Telephony',
# `field1` varchar(64) DEFAULT NULL,
# `field2` varchar(64) DEFAULT NULL,
# `field3` varchar(64) DEFAULT NULL,
# `field4` varchar(64) DEFAULT NULL,
# `field5` varchar(64) DEFAULT NULL,
# `field6` varchar(64) DEFAULT NULL,
# `field7` varchar(64) DEFAULT NULL,
# `field8` varchar(64) DEFAULT NULL,
# `field9` varchar(64) NOT NULL
# PRIMARY KEY (`server_id`)
#) ENGINE=MyISAM DEFAULT CHARSET=latin1;
#DB field types:
#field1 = mysql server ID, use 0 for Master, 1 for first slave, 2 for 2nd slave, etc, up to 9
#field2 = DB name, default is asterisk
#field3 = svn revision of DB
#field4 = regular user
#field5 = regular pass
#field6 = custom user
#field7 = custom pass
#field8 = slave user, only relevant to primary DB
#field9 = slave pass, same as above
#Web field types:
#field1 = external IP
#field2 = audiostore directory
#Telephony field type:
#field1 = external IP
#Archive field type: Auto-Configuration only works on a single archive server, other things have to be done manually
#field1 = FTP user
#field2 = FTP pass
#field3 = FTP Port
#field4 = FTP directory
#field5 = URL Path
# All my lovely little modules
# I HATE STRICT! Suggesting I use strict will result in me
# tracking you down and hitting you in the face with a hammer!
# Feel free to submit a strict-friendly patch and/or other code
# clean-up and optimization efforts you may have. If I test them
# and they work I will put them in.
use warnings;
use LWP::Simple;
use Sys::Hostname;
use DBI;
# A handy IPv4 validator for user input
sub checkipv4 {
my $ipaddr = $_[0];
# Make sure we like the format
if( $ipaddr =~ m/^(\d\d?\d?)\.(\d\d?\d?)\.(\d\d?\d?)\.(\d\d?\d?)$/ ) {
# Make sure we like the octets too
if($1 <= 255 && $2 <= 255 && $3 <= 255 && $4 <= 255) {
if ($debug==1) { print("IP Address checks good: $ipaddr\n"); }
return 0;
} else {
if ($debug==1) { print("IP address octet(s) out of range: $ipaddr \n"); }
return 1;
}
} else {
if ($debug==1) { print("IP address not in valid format: $ipaddr\n"); }
return 1;
}
}
# Get the local IP of the machine by parsing ip command output
sub getlocalip {
my $ip;
my @ipaddr = `/usr/sbin/ip addr show`;
my $line;
my $i=0;
foreach(@ipaddr) {
$line = $ipaddr[$i];
if ( $line =~ /inet (\d+\.\d+\.\d+\.\d+)\//) {
$ip = $1;
if ( $ip =~ /(^192\.168\.)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)/ && $ip !~ /^127\./) {
$ip = trim($ip);
return $ip;
}
}
$i++;
}
return "X";
}
# Get the External IP from the internets! Will also serv as a connectivity checker for feedback
sub getextip {
my $extip=get("http://www.vicidial.org/yourip.php");
return "X" unless defined $extip;
$extip = trim($extip);
return $extip;
}
# Perl trim function to remove whitespace from the start and end of the string, stolen from google cause i'm lazy
sub trim($) {
my $string = shift;
$string =~ s/^\s+//;
$string =~ s/\s+$//;
return $string;
}
# Get the admin.php build and admin version. Threw it in a sub since it's ugly code :)
sub adminphp {
my $srce = "/usr/src/astguiclient/trunk/www/vicidial/admin.php";
my $string1 = 'build = ';
my $string2 = 'admin_version = ';
my $adminver;
my $buildver;
my $line;
open(FH, $srce);
while(my $line = <FH>) {
if($line =~ m/$string1/) {
$buildver = $line;
}
if($line =~ m/$string2/) {
$adminver = $line;
}
}
close FH;
$buildver = substr $buildver, 10;
$buildver = substr $buildver, 0, -3;
if ($debug==1) { print "Build Version : $buildver\n"; }
$adminver = substr $adminver, 18;
$adminver = substr $adminver, 0, -3;
if ($debug==1) { print "Admin Version : $adminver\n"; }
return ($buildver, $adminver);
}
# Look for user to press a Y in the first character, return 1 if they do, 0 otherwise
sub yesprompt {
my $manual = <STDIN>;
if ( ($manual =~ /^[Y]$/i) ) {
return 1;
} else {
return 0;
}
}
# Look for user to press a N in the first character, return 1 if they do, 0 otherwise
sub noprompt {
my $manual = <STDIN>;
if ( ($manual =~ /^[N]$/i) ) {
return 1;
} else {
return 0;
}
}
# This nasty little thing below here does all the install work. We merely flip a bunch of flags and call this.
# In theory, it should make maintaining things easier. I hope...
sub dothedeed {
# And now we begin the installation madness! Whoot! Or something...
print "\n\nBeginning installation, expect lots of output...\n\n";
# Mangle the firewall appropriately
if ($disablefirewall!=0) {
print "Disabling firewall...\n";
system("/usr/bin/systemctl stop firewalld");
system("/usr/bin/systemctl disable firewalld");
}
# First we check our SVN and update as necessary
if ($localsvn != $DBsvnrev) {
print "\nUpdating to SVN revision $DBsvnrev...\n";
system("/usr/bin/svn", "-r", "$DBsvnrev", "up", "/usr/src/astguiclient/trunk/", ">> /var/log/vicibox.log 2>> /var/log/vicibox.log");
# Get the SVN version of our local copy
@svninfo = `/usr/bin/svn info /usr/src/astguiclient/trunk | grep Revision | sed -e 's/Revision: //'`;
$localsvn = trim($svninfo[0]);
if ($debug==1) { print "Local SVN Revision after update : $localsvn\n"; }
if ($localsvn != $DBsvnrev) { die "Could not update SVN to $DBsvnrev! Check your connectivity!\n"; }
} else {
print "Local SVN revision matches DB revision: $DBsvnrev\n";
}
# If we are a database, then we start mysql and create our database
if ($DB==1) {
print "Doing general DataBase requirements...\n";
if (system("/usr/bin/systemctl enable mariadb >> /var/log/vicibox.log 2>> /var/log/vicibox.log")!=0) { die "Failed to enable MariaDB: $?"; }
if (system("/usr/bin/systemctl start mariadb >> /var/log/vicibox.log 2>> /var/log/vicibox.log")!=0) { die "Failed to start MariaDB: $?"; }
$dbhVDnew = DBI->connect("DBI:mysql::localhost:$VICIport", "root", "") or die "Couldn't connect to MySQL to create database: " . DBI->errstr;
if ($DBS==0) {
# See if there is already a database here. If so, bomb out, something is whacky. But only if it's a master DB, slaves can get wiped out
$stmtCHECKDB = "show databases like '$VICIdatabase';";
$sthCHECKDB = $dbhVDnew->prepare($stmtCHECKDB) or die "Preparing stmtCHECKDB: ",$dbhVDnew->errstr;
$sthCHECKDB->execute or die "Executing sthCHECKDB: ",$dbhVDnew->errstr;
$sthCHECKDBrows=$sthCHECKDB->rows;
if ($sthCHECKDBrows > 0) { die "Database already exists! Server was previously installed.\n"; }
$sthCHECKDB->finish;
}
# Create the new database
$stmtCREATE = "create database IF NOT EXISTS $VICIdatabase default character set utf8 collate utf8_unicode_ci;";
$sthCREATE = $dbhVDnew->prepare($stmtCREATE) or die "Preparing stmtCREATE: ",$dbhVDnew->errstr;
$sthCREATE->execute or die "Executing sthCREATE: ",$dbhVDnew->errstr;
$sthCREATE->finish;
# Reconnect to the new database
$dbhVDnew->disconnect;
$dbhVDnew = DBI->connect("DBI:mysql:$VICIdatabase:localhost:$VICIport", "root", "") or die "Couldn't reconnect to MySQL to create database tables: " . DBI->errstr;
# Grant permissions to our database standard user
$stmtGRANT = "GRANT SELECT,INSERT,UPDATE,DELETE,LOCK TABLES on $VICIdatabase.* TO $VICIuser\@'%' IDENTIFIED BY '$VICIpass';";
$sthGRANT = $dbhVDnew->prepare($stmtGRANT) or die "Preparing stmtGRANT: ",$dbhVDnew->errstr;
$sthGRANT->execute or die "Executing sthGRANT: ",$dbhVDnew->errstr;
# Grant permissions to our database standard user
$stmtGRANT = "GRANT SELECT,INSERT,UPDATE,DELETE,LOCK TABLES on $VICIdatabase.* TO $VICIuser\@'localhost' IDENTIFIED BY '$VICIpass';";
$sthGRANT = $dbhVDnew->prepare($stmtGRANT) or die "Preparing stmtGRANT: ",$dbhVDnew->errstr;
$sthGRANT->execute or die "Executing sthGRANT: ",$dbhVDnew->errstr;
# Grant permissions to our database custom user
$stmtGRANT = "GRANT CREATE,ALTER on $VICIdatabase.* TO $VICIcustomuser\@'localhost' IDENTIFIED BY '$VICIcustompass';";
$sthGRANT = $dbhVDnew->prepare($stmtGRANT) or die "Preparing stmtGRANT: ",$dbhVDnew->errstr;
$sthGRANT->execute or die "Executing sthGRANT: ",$dbhVDnew->errstr;
# Grant permissions to our database custom user
$stmtGRANT = "GRANT CREATE,ALTER on $VICIdatabase.* TO $VICIcustomuser\@'%' IDENTIFIED BY '$VICIcustompass';";
$sthGRANT = $dbhVDnew->prepare($stmtGRANT) or die "Preparing stmtGRANT: ",$dbhVDnew->errstr;
$sthGRANT->execute or die "Executing sthGRANT: ",$dbhVDnew->errstr;
if ($DBS==1) {
# We are a slave, so we do slave-type things
print "Doing Slave-specific MySQL setup...\n";
if (system("/usr/bin/sed -i 's+server-id = 1+server-id = $DBmysqlid+g' /etc/my.cnf")!=0) { die "Could not modify my.cnf for slave: $?"; }
system("/sbin/service mariadb stop >> /var/log/vicibox.log 2>> /var/log/vicibox.log");
if (system("/sbin/service mariadb start >> /var/log/vicibox.log 2>> /var/log/vicibox.log")!=0) { die "Failed to restart MySQL: $?"; }
# release and reconnect since we restarted the server
$dbhVDnew->disconnect;
$dbhVDnew = DBI->connect("DBI:mysql::localhost:$VICIport", "root", "") or die "Couldn't connect to MySQL to create database: " . DBI->errstr;
# Reset the slave so it can take fresh configs.
$stmtSQL="stop slave;";
$sthSQL = $dbhVDnew->prepare($stmtSQL) or die "Preparing stmtSQL: ",$dbhVDnew->errstr;
$sthSQL->execute;
$stmtSQL="reset slave;";
$sthSQL = $dbhVDnew->prepare($stmtSQL) or die "Preparing stmtSQL: ",$dbhVDnew->errstr;
$sthSQL->execute;
$stmtSQL="CHANGE MASTER TO MASTER_HOST='$VICIDBIP', MASTER_USER='$VICIslaveuser', MASTER_PASSWORD='$VICIslavepass', MASTER_PORT=$VICIport;";
$sthSQL = $dbhVDnew->prepare($stmtSQL) or die "Preparing stmtSQL: ",$dbhVDnew->errstr;
$sthSQL->execute;
print "\nBeginning database dump from master, this may take a while...\n\n";
if (system("/usr/bin/mariadb --all-database --master-data -u $VICIslaveuser -p$VICIslavepass -h $VICIDBIP -P $VICIport > /tmp/vicimaster.sql")!=0) { die "Could not get database dump from master: $?"; }
# Load in our master data
print "Beginning database load into slave, this may take a while...\n";
if (system("/usr/bin/mariadb -u root -h localhost -f < /tmp/vicimaster.sql")!=0) { die "Could not load data into slave.\n"; }
# Just for fun, run the upgrade incase this SQL info came from an older version
system("/usr/bin/maraidb-upgrade -u root -h localhost -s");
# Insert ourselves into vicibox
if ($legacy==0) {
$stmtSQL="INSERT INTO `vicibox` (`server`, `server_ip`, `server_type`, `field1`, `field2`, `field3`, `field4`, `field5`, `field6`, `field7`, `field8`, `field9`) VALUES ('$myname', '$VICIDBIP', 'Database', '$DBmysqlid', '$VICIdatabase', '$DBsvnrev', '$VICIuser', '$VICIpass', '$VICIcustomuser', '$VICIcustompass', '$VICIslaveuser', '$VICIslavepass');";
$sthSQL = $dbhVD->prepare($stmtSQL) or die "Preparing stmtSQL: ",$dbhVDnew->errstr;
$sthSQL->execute;
}
# Now start the slave
$stmtSQL="start slave;";
$sthSQL = $dbhVDnew->prepare($stmtSQL) or die "Preparing stmtSQL: ",$dbhVDnew->errstr;
$sthSQL->execute;
print "Slave loaded and started. Verify by connecting to MySQL and running 'slave show status'\n";
} else {
print "Doing Master-specific MySQL setup...\n";
# Create our schema in the database
if (system("/usr/bin/mariadb $VICIdatabase -f < /usr/src/astguiclient/trunk/extras/MySQL_AST_CREATE_tables.sql")!=0) { die "Could not create database schema\n"; }
# Insert ourselves into the server table if we aren't also a dialer
if ($TEL==0) {
my $stmtSQL="insert into servers (server_id, server_description, server_ip, active, max_vicidial_trunks, active_asterisk_server, active_agent_login_server) values ('$myname', 'DataBase Only - DO NOT DELETE', '$VICIDBIP', 'Y', '0', 'N', 'N');";
my $sthSQL = $dbhVDnew->prepare($stmtSQL) or die "Preparing stmtSQL: ",$dbhVDnew->errstr;
$sthSQL->execute;
}
# Give ourselves some more secure passwords then test!! Silly developer and users
my $randomstring1=trim(`/usr/bin/pwgen -cns 15 1`);
my $randomstring2=trim(`/usr/bin/pwgen -cns 15 1`);
my $stmtSQL="update system_settings set default_phone_registration_password='$randomstring1', default_server_password='$randomstring2';";
my $sthSQL = $dbhVDnew->prepare($stmtSQL) or die "Preparing stmtSQL: ",$dbhVDnew->errstr;
$sthSQL->execute;
# Now we create out vicibox table...
$stmtSQL="CREATE TABLE IF NOT EXISTS `vicibox` (`server_id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT, `server` varchar(32) NOT NULL, `server_ip` varchar(32) NOT NULL, `server_type` enum('Database','Web','Telephony','Archive') NOT NULL DEFAULT 'Telephony',`field1` varchar(64) DEFAULT NULL,`field2` varchar(64) DEFAULT NULL,`field3` varchar(64) DEFAULT NULL,`field4` varchar(64) DEFAULT NULL,`field5` varchar(64) DEFAULT NULL,`field6` varchar(64) DEFAULT NULL,`field7` varchar(64) DEFAULT NULL,`field8` varchar(64) DEFAULT NULL,`field9` varchar(64) DEFAULT NULL, PRIMARY KEY (`server_id`)) ENGINE=MyISAM DEFAULT CHARSET=latin1;";
$sthSQL = $dbhVDnew->prepare($stmtSQL) or die "Preparing stmtSQL: ",$dbhVDnew->errstr;
$sthSQL->execute;
# and populate it if not legacy
if ($legacy==0) {
$stmtSQL="INSERT INTO `vicibox` (`server`, `server_ip`, `server_type`, `field1`, `field2`, `field3`, `field4`, `field5`, `field6`, `field7`, `field8`, `field9`) VALUES ('$myname', '$VICIDBIP', 'Database', '0', '$VICIdatabase', '$DBsvnrev', '$VICIuser', '$VICIpass', '$VICIcustomuser', '$VICIcustompass', '$VICIslaveuser', '$VICIslavepass');";
$sthSQL = $dbhVDnew->prepare($stmtSQL) or die "Preparing stmtSQL: ",$dbhVDnew->errstr;
$sthSQL->execute;
}
# Now insert the extra ViciBox stuff
$stmtSQL="INSERT INTO `vicidial_ip_lists` VALUES ('ViciWhite','White List for ViciBox firewall ACL','N','---ALL---'), ('ViciBlack','Black List for ViciBox firewall ACL','N','---ALL---');";
$dbhVDnew->do($stmtSQL);
$stmtSQL = "INSERT INTO `vicidial_conf_templates` (`template_id`, `template_name`, `template_contents`, `user_group`) VALUES ('VICIphoneSIP', 'VICIphoneSIP WebRTC', 'type=friend\r\nhost=dynamic\r\nencryption=yes\r\navpf=yes\r\nicesupport=yes\r\ndirectmedia=no\r\ntransport=wss\r\nforce_avp=yes\r\ndtlsenable=yes\r\ndtlsverify=no\r\ndtlscertfile=/etc/apache2/ssl.crt/vicibox.crt\r\ndtlsprivatekey=/etc/apache2/ssl.key/vicibox.key\r\ndtlssetup=actpass\r\nrtcp_mux=yes\r\n', '---ALL---');";
$dbhVDnew->do($stmtSQL);
$stmtSQL = "INSERT INTO `vicidial_conf_templates` (`template_id`, `template_name`, `template_contents`, `user_group`) VALUES ('VICIphonePJSIP', 'VICIphonePJSIP WebRTC', 'inbound_auth/nonce_lifetime = 32\r\naor/max_contacts = 1\r\naor/maximum_expiration = 3600\r\naor/minimum_expiration = 60\r\naor/default_expiration = 120\r\n\r\nendpoint/context = default\r\nendpoint/dtmf_mode = rfc4733\r\nendpoint/rtp_symmetric = yes\r\nendpoint/rewrite_contact = yes\r\nendpoint/rtp_timeout = 60\r\nendpoint/use_ptime = yes\r\nendpoint/moh_suggest = default\r\nendpoint/direct_media = no\r\nendpoint/trust_id_inbound = no\r\nendpoint/send_rpid = yes\r\nendpoint/inband_progress = no\r\nendpoint/tos_audio = ef\r\nendpoint/language = en\r\n\r\nendpoint/ice_support = yes\r\nendpoint/media_encryption = dtls\r\nendpoint/media_use_received_transport=yes\r\nendpoint/dtls_verify = no\r\nendpoint/dtls_cert_file = /etc/apache2/ssl.crt/vicibox.crt\r\nendpoint/dtls_private_key = /etc/apache2/ssl.key/vicibox.key\r\nendpoint/dtls_setup = actpass\r\nendpoint/transport=transport-wss\r\nendpoint/rtcp_mux=yes', '---ALL---');";
$dbhVDnew->do($stmtSQL);
$stmtSQL = "UPDATE system_settings set allowed_sip_stacks='SIP_and_PJSIP';";
$dbhVDnew->do($stmtSQL);
$stmtSQL = "UPDATE system_settings set webphone_url='https://phone.viciphone.com/v3.0/viciphone.php';";
$dbhVDnew->do($stmtSQL);
# Set-up the slave user stuff
$stmtGRANT = "GRANT REPLICATION SLAVE,REPLICATION CLIENT,SELECT,RELOAD,SHOW VIEW on *.* TO '$VICIslaveuser'\@'%' IDENTIFIED BY '$VICIslavepass';";
$sthGRANT = $dbhVDnew->prepare($stmtGRANT) or die "Preparing stmtGRANT: ",$dbhVDnew->errstr;
$sthGRANT->execute or die "Executing sthGRANT: ",$dbhVDnew->errstr;
# At this point the primary should be up and good, so we set-up our normal DBI connection for later processes
# Also a good double-check procedure that stuff works
$dbhVD = DBI->connect("DBI:mysql:$VICIdatabase:localhost:$VICIport", "$VICIuser", "$VICIpass") or die "Couldn't connect to ViciDial database: " . DBI->errstr;
}
}
# Do web-type things
if ($WEB==1) {
print "Configuring Web Server...\n";
# See if we are the first webserver, left incase a restore is done it will auto-enable the audio store
$stmtFIRSTWEB="select * from system_settings where sounds_web_server='127.0.0.1';";
$sthFIRSTWEB = $dbhVD->prepare($stmtFIRSTWEB) or die "Preparing stmtFIRSTWEB: ",$dbhVD->errstr;
$sthFIRSTWEB->execute or die "Executing sthFIRSTWEB: ",$dbhVD->errstr;
$sthFIRSTWEBrows=$sthFIRSTWEB->rows;
if ($sthFIRSTWEBrows > 0) {
if ($debug==1) { print "First web server found, enabling audio store...\n"; }
# enable the audio store
$randomstring=trim(`pwgen -cns 32 1`);
$stmtWEB="update system_settings set sounds_web_server='$localip', sounds_web_directory='$randomstring', sounds_central_control_active='1';";
$sthWEB = $dbhVD->prepare($stmtWEB) or die "Preparing stmtWEB: ",$dbhVD->errstr;
$sthWEB->execute or die "Executing sthWEB: ",$dbhVD->errstr;
# Modify the apache configuration file for the audio store and create the directory
system("/usr/bin/sed -i 's/WEBDIR/$randomstring/g' /etc/apache2/conf.d/audiostore.conf");
system("/bin/mkdir /srv/www/htdocs/$randomstring");
system("chown -R wwwrun:www /srv/www/htdocs/$randomstring");
$audiostore=1;
} else {
$audiostore=0;
}
# If we are dedicated, enable bigger apache settings
if ($DB==0 && $TEL==0) {
if ($debug==1) { print "Dedicated Web Server Found, enabling large apache settings...\n"; }
system("cp /usr/share/vicibox/server-tuning.conf /etc/apache2/server-tuning.conf");
}
# Do the general stuff for apache from bash where life is easier
system("/usr/share/vicibox/vicibox-web.sh $redirect $phpmyadmin $VICIDBIP >> /var/log/vicibox.log 2>> /var/log/vicibox.log");
# And finally, insert ourselves into the vicibox table if not legacy and not a restore operation
if ($legacy==0 and $restore==0) {
$stmtSQL="INSERT INTO `vicibox` (`server`, `server_ip`, `server_type`, `field1`, `field2`) VALUES ('$myname', '$localip', 'Web', '$extip', '$randomstring');";
$sthSQL = $dbhVD->prepare($stmtSQL) or die "Preparing stmtSQL: ",$dbhVD->errstr;
$sthSQL->execute;
}
system("/usr/bin/systemctl enable apache2 >> /var/log/vicibox.log 2>> /var/log/vicibox.log");
system("/usr/bin/systemctl restart apache2 >> /var/log/vicibox.log 2>> /var/log/vicibox.log");
}
# Telephony server stuff
if ($TEL==1) {
print "Configuring Telephony Server...\n";
if ($restore==0) {
# Check to make sure we aren't doing something silly like installing the same server twice, exception being a restore
$stmtCHECKTEL = "select * from servers where server_ip='$localip' or server_ip='$extip';";
$sthCHECKTEL = $dbhVD->prepare($stmtCHECKTEL) or die "Preparing stmtCHECKTEL: ",$dbhVD->errstr;
$sthCHECKTEL->execute or die "Executing sthCHECKTEL: ",$dbhVD->errstr;
$sthCHECKTELrows=$sthCHECKTEL->rows;
if ($sthCHECKTELrows > 0) { die "Telephony server already exists! Server was previously installed.\n"; }
}
# Do the general stuff for a telephony server from bash where life is easier
system("/usr/share/vicibox/vicibox-tel.sh $PJSIP >> /var/log/vicibox.log 2>> /var/log/vicibox.log");
# We only run the below, which inserts us into vicidial and the vicihost table, if we aren't in restore mode
if ($restore==0) {
# Modify the SQL files for dialer insertion
if ($primarydialer==1) {
system("/usr/bin/sed 's/10.10.10.15/$localip/g' /usr/src/astguiclient/trunk/extras/first_server_install.sql > /tmp/viciserver.sql");
system("/bin/echo \"update system_settings set active_voicemail_server='$localip';\" >> /tmp/viciserver.sql");
} else {
system("/usr/bin/sed 's/10.10.10.16/$localip/g' /usr/src/astguiclient/trunk/extras/second_server_install.sql > /tmp/viciserver.sql");
}
# Modify the SQL files for hostname
system("/usr/bin/sed -i 's/TESTast/$myname/g' /tmp/viciserver.sql");
## Inject the SQL file into MySQL
if (system("/usr/bin/mariadb -u $VICIuser -p$VICIpass -P $VICIport -h $VICIDBIP $VICIdatabase -f < /tmp/viciserver.sql")!=0) { die "Could not load telephony data into master database.\n"; }
# Do some clean-up to make things prettier on the user side
$randomstring=trim(`/usr/bin/pwgen -cns 15 1`);
$stmtSQL="update servers set server_description='Server $myname', asterisk_version='$astverstring', conf_secret='$randomstring', vicidial_balance_active='Y', auto_restart_asterisk='Y' where server_ip='$localip';";
$sthSQL = $dbhVD->prepare($stmtSQL) or die "Preparing stmtSQL: ",$dbhVD->errstr;
$sthSQL->execute;
# If we have an external IP, throw that in there too
if ($extip ne "X") {
$stmtSQL="update servers set external_server_ip='$extip' where server_ip='$localip';";
$sthSQL = $dbhVD->prepare($stmtSQL) or die "Preparing stmtSQL: ",$dbhVD->errstr;
$sthSQL->execute;
}
# And finally, insert ourselves into the vicibox table if not legacy
if ($legacy==0) {
$stmtSQL="INSERT INTO `vicibox` (`server`, `server_ip`, `server_type`, `field1`) VALUES ('$myname', '$localip', 'Telephony', '$extip');";
$sthSQL = $dbhVD->prepare($stmtSQL) or die "Preparing stmtSQL: ",$dbhVD->errstr;
$sthSQL->execute;
}
} elsif ($restore==1 && $legacy==0) {
# Update the server record with the new asterisk version in case it's different from the restore
$stmtSQL="update servers set asterisk_version='$astverstring' where server_ip='$localip';";
$sthSQL = $dbhVD->prepare($stmtSQL) or die "Preparing stmtSQL: ",$dbhVD->errstr;
$sthSQL->execute;
}
# Make sure we start on boot
system("/usr/bin/systemctl enable vicidial >> /var/log/vicibox.log 2>> /var/log/vicibox.log");
system("/usr/bin/systemctl enable apache2 >> /var/log/vicibox.log 2>> /var/log/vicibox.log");
system("/usr/bin/systemctl restart apache2");
}
# Archive server
if ($ARC==1) {
print "Configuring Archive Server...\n";
# Do our system set-up
system("/bin/mkdir -p /home/archive/$TELarchivedir");
system("/usr/sbin/useradd -d /home/archive -s /bin/false $TELarchiveuser");
system("/bin/chown -R $TELarchiveuser:users /home/archive");
system("/bin/echo -e '$TELarchivepass\n$TELarchivepass' | /usr/bin/passwd $TELarchiveuser");
system("/usr/bin/systemctl enable vsftpd >> /var/log/vicibox.log 2>> /var/log/vicibox.log");
system("/usr/bin/systemctl restart vsftpd");
system("/usr/bin/systemctl enable apache2 >> /var/log/vicibox.log 2>> /var/log/vicibox.log");
system("/usr/bin/systemctl restart apache2");
# And finally, insert ourselves into the vicibox table if not legacy and not a restore
if ($legacy==0 and $restore==0) {
$stmtSQL="INSERT INTO `vicibox` (`server`, `server_ip`, `server_type`, `field1`, `field2`, `field3`, `field4`, `field5`) VALUES ('$myname', '$TELarchiveip', 'Archive', '$TELarchiveuser', '$TELarchivepass', '$TELarchiveport', '$TELarchivedir', '$TELarchiveurl');";
$sthSQL = $dbhVD->prepare($stmtSQL) or die "Preparing stmtSQL: ",$dbhVD->errstr;
$sthSQL->execute;
}
}
# All the easy stuff is over, now the big mess of stuff that is trying to figure out how to ACTUALLY install vicidial :(
# First we build up our generic install.pl options for use later on
$installPLstring = "--web=/srv/www/htdocs --asterisk_version=$asterisk --copy_sample_conf_files --no-prompt --server_ip=$localip --DB_database=$VICIdatabase --DB_user=$VICIuser --DB_pass=$VICIpass --DB_custom_user=$VICIcustomuser --DB_custom_pass=$VICIcustompass --DB_port=$VICIport";
if ($debug==1) { print "Install PL String: $installPLstring\n"; }
if ($havearchive==1) {
# We have an archive, so Add that info to the string
$installPLstring = $installPLstring . " --FTP_host=$TELarchiveip --FTP_user=$TELarchiveuser --FTP_pass=$TELarchivepass --FTP_port=$TELarchiveport --FTP_dir=$TELarchivedir --HTTP_path=$TELarchiveurl";
if ($debug==1) { print "Archive found, adding info: $installPLstring\n"; }
}
if ($DB==1 && $DBS==0) {
# We are primary DB, so connect through localhost
$installPLstring = $installPLstring . " --DB_server=localhost";
if ($debug==1) { print "We are Primary DB, adding info: $installPLstring\n"; }
} else {
# We are not the primary DB, so we use an IP address for database connectivity
$installPLstring = $installPLstring . " --DB_server=$VICIDBIP";
if ($debug==1) { print "We aren't Primary DB, adding info: $installPLstring\n"; }
}
# Now that our base string is built, all we are adding are the keepalives which depend on how the server's roles were selected
if ($DB==1 && $DBS==0) {
# We at least get the allcron and database stuff
$needdbcron=1;
}
if ($TEL==1) {
# We need at least the allcron and telephony stuff
$needtelcron=1;
}
# If we have no crons, then use X for keepalives
if ($needdbcron==0 && $needtelcron==0) {
$installPLstring = $installPLstring . " --active_keepalives=X";
if ($debug==1) { print "Not Database or Telephony, no cron, adding info: $installPLstring\n"; }
} elsif ($needdbcron==1 && $needtelcron==0) {
# We are a DB only, adding that info
$installPLstring = $installPLstring . " --active_keepalives=579E";
if ($debug==1) { print "Database only, adding info: $installPLstring\n"; }
system("/bin/cat /usr/share/vicibox/allcron > /tmp/rootcron");
system("/bin/cat /usr/share/vicibox/dbcron >> /tmp/rootcron");
if ($debug==1) { print "rootcron generated, allcron and dbcron\n"; }
} elsif ($needdbcron==0 && $needtelcron==1) {
# We are a telephony server only, adding that info
$installPLstring = $installPLstring . " --active_keepalives=123468S";
if ($debug==1) { print "Telephony only, adding info: $installPLstring\n"; }
system("/bin/cat /usr/share/vicibox/allcron > /tmp/rootcron");
system("/bin/cat /usr/share/vicibox/dialcron >> /tmp/rootcron");
if ($debug==1) { print "rootcron generated, allcron and dialcron\n"; }
} elsif ($needdbcron==1 && $needtelcron==1) {
# At this point we must be both, so we set-up for both.
$installPLstring = $installPLstring . " --active_keepalives=123456789ES";
if ($debug==1) { print "Telephony only, adding info: $installPLstring\n"; }
system("/bin/cat /usr/share/vicibox/allcron > /tmp/rootcron");
system("/bin/cat /usr/share/vicibox/dbcron >> /tmp/rootcron");
system("/bin/cat /usr/share/vicibox/dialcron >> /tmp/rootcron");
if ($debug==1) { print "rootcron generated, allcron and dbcron and dialcron\n"; }
}
if ($havearchive==1 && $TEL==1) {
# We have an archive and are a telephony server, so we enable that in the crontab
system("/usr/bin/sed -i 's/#2,5,8,11/2,5,8,11/' /tmp/rootcron");
}
# Ok, and away we go, installing the actual ViciDial software. Hope it works :)
if ($debug==1) { print "Final install.pl string: $installPLstring\n"; }
system("cd /usr/src/astguiclient/trunk && /usr/bin/perl install.pl $installPLstring >> /var/log/vicibox.log 2>> /var/log/vicibox.log");
if ($DB==1 && $DBS==0) { system("/usr/bin/crontab /tmp/rootcron"); }
if ($WEB==1 || $TEL==1) { system("/usr/bin/crontab /tmp/rootcron"); }
# Populate the GMT tables and what-not
if ($DB==1 && $DBS==0) {
if ($extip ne "X") {
print "Loading GMT and Phone Codes...\n";
$gmtload=system("/usr/share/astguiclient/ADMIN_area_code_populate.pl >> /var/log/vicibox.log 2>> /var/log/vicibox.log");
if ($gmtload!=0) {
# Looks like we couldn't obtain the area code lists, use local copies
print "GMT and Phone Codes failed to update from internet, using local copies...\n";
system("cp /usr/src/astguiclient/conf/phone_codes_GMT-latest-24.txt /usr/share/astguiclient");
system("cp /usr/src/astguiclient/conf/GMT_USA_zip-latest.txt /usr/share/astguiclient");
system("cp /usr/src/astguiclient/conf/country_ISO_TLD-latest.txt /usr/share/astguiclient");
system("/usr/share/astguiclient/ADMIN_area_code_populate.pl --use-local-files >> /var/log/vicibox.log 2>> /var/log/vicibox.log");
}
} else {
print "Loading GMT and phone codes using local copies...\n";
system("cp /usr/src/astguiclient/conf/phone_codes_GMT-latest-24.txt /usr/share/astguiclient");
system("cp /usr/src/astguiclient/conf/GMT_USA_zip-latest.txt /usr/share/astguiclient");
system("/usr/share/astguiclient/ADMIN_area_code_populate.pl --use-local-copies >> /var/log/vicibox.log 2>> /var/log/vicibox.log");
}
}
# Fix-up for Zoiper
if ($WEB==1) {
system("/usr/bin/sed -i 's/Version=1,17,0,6802/Version=2,8,0,15810/' /srv/www/htdocs/agc/webphone/zoiperweb.php");
}
# Modify sip.conf for our external IP
if ($TEL==1 && $extip ne 'X') {
system("/usr/bin/sed -i 's/^;externip.*=.*/externip = $extip/' /etc/asterisk/sip.conf");
system("/usr/bin/sed -i 's/^external_media_address.*=.*/external_media_address = $extip/' /etc/asterisk/pjsip.conf");
system("/usr/bin/sed -i 's/^external_signaling_address.*=.*/external_signaling_address = $extip/' /etc/asterisk/pjsip.conf");
}
# Populate audio store if we are primary and not in restore mode
if ($TEL==1 && $primarydialer==1 && $restore==0) {
print "\nSeeding the audio store, this may take a while...\n";
system("/usr/bin/perl /usr/share/astguiclient/ADMIN_audio_store_sync.pl --upload >> /var/log/vicibox.log 2>> /var/log/vicibox.log");
}
# Give some helpful output for the uninitiated
$randomstring=trim(`/usr/bin/pwgen -cns 15 1`);
print "\n\nPLEASE use secure passwords inside vicidial. It prevents hackers\n";
print "and other undesirables from compromising your system and costing\n";
print "you thousands in toll fraud and long distance. A secure password\n";
print "Contains at least one capital letter and one number. A good example\n";
print "of a secure password would be $randomstring.\n\n";
print "Don't feed the black market, secure your systems properly!\n\n";
print "System should be installed. Please type 'reboot' to cleanly load everything.\n";
}
# Set-up some default variables so we have known values to work with
$myname=hostname;
$myname =~ s/\..*$//; # Yes, someone managed to put in srv.dmn.com for the HOSTNAME, so just get the leftmost part before the .
$myname=~s/[^a-zA-Z0-9_\-]//go; # and sanitize to something sane
$debug=0; # Gives extra output while cluttering up the screen
$restore=0; # Whether we a restoring as a server in a cluster
$expert=0; # Hides some options that require more knowledge then the average sysadmin
$legacy=0; # prompts for cluster info instead of using auto-configuration table
$redirect=1; # We want to enable the HTML redirect by default, it's handy
$phpmyadmin=0; # phpMyAdmin is evil to the uninitiated, so it's installed through the expert mode
$DB=0;
$DBS=0;
$WEB=0;
$TEL=0;
$ARC=0;
$viciboxexpress=0;
$skipexternalip=0; # Skip the check for an External IP
$VICIDBIP = "127.0.0.1";
$VICIdatabase = "asterisk";
$VICIport = 3306;
$VICIuser = "cron";
$VICIpass = "1234";
$VICIcustomuser = "custom";
$VICIcustompass = "custom1234";
$VICIslaveuser = "slave";
$VICIslavepass = "slave1234";
$TELarchiveip = "X";
$TELarchiveuser = "cronarchive";
$TELarchivepass = "archive1234";
$TELarchiveport = "21";
$TELarchivedir = '';
$TELarchiveurl = 'http://'; # We fill it in later, but we define it now for consistencys sake
$astverstring = "1.4.44-vici";
$asterisk = "1.4";
$DBmysqlid=0; # 0 is the master, and slaves are numbered up from there
$primarydialer=1; # By default assume we are the primary dialer until proven otherwise
$havearchive=0; # We have no archive server until told differently
$disablefirewall=0;
$needdbcron=0; # Whether we should install the DB settings
$needtelcron=0; # Whether we should install the telephony settings
my $someinput; # Keep this specific to main since it's my little trash variable
my $myprompt; # Another trash variable used for user input
# Show who we are and that we mean business
print "\n\nViciBox Installer\n\n";
# Parse our run-times, cleaned up from matt-matt code so the rest of us can read it
$args = "";
if (defined $ARGV[0]) {
$i=0;
while ($#ARGV >= $i) {
$args = "$args $ARGV[$i]";
$i++;
}
if ($args =~ /--help/i) {
print "allowed run time options:\n";
print " [--restore] = Restore server from a ViciBox DB entry or user-provided input\n";
print " [--legacy] = Force legacy mode on, usually auto-detected by the installer\n";
print " [--vicibox-express] = Install an all-in-one ViciBox Express server\n";
print " [--debug] = debug mode, shows more output, asks a few more questions\n";
exit;
} else {
# Check for debug flag
if ($args =~ /--debug/i) {
$debug=1;
print "\n----- DEBUG Enabled -----\n\n";
}
# Check for restore flag
if ($args =~ /--restore/i) {
$restore=1;
print "Restore mode activated\n";
}
# Check for vicibox-express flag
if ($args =~ /--vicibox-express/i) {
$viciboxexpress=1;
print "Vicibox Express mode activated\n";
}
# Check for legacy flag
if ($args =~ /--legacy/i) {
$legacy=1;
print "Legacy mode activated\n";
}
# Don't check for the external IP
if ($args =~ /--skipexternal/i) {
$skipexternalip=1;
$extip='X';
debugoutput(" CLI Check External IP : No",0);
}
}
}
# Some output for debug
if ($debug==1) {
print "Hostname : $myname\n";
print "Default Database : $VICIdatabase\n";
print "Default DB User : $VICIuser\n";
print "Default DB Pass : $VICIpass\n";
print "Default DB Custom User : $VICIcustomuser\n";
print "Default DB Custom Pass : $VICIcustompass\n";
print "Default DB Port : $VICIport\n";
}
# Get our local IP info
$localip = &getlocalip;
if ($localip eq 'X') {
print "Local IP address not found! Please enter the IP address to use for ViciDial on this machine\n";
print "Local IP Address : ";
$localip = trim(<STDIN>);
if (&checkipv4($localip)==1) {
die "Local IP entered is not valid: $localip\n";
}
} elsif ($debug==1) { print "Local IP Address : $localip\n";
}
# Get external IP while simultaneously checking for internet connection
if ($skipexternalip==0) {
$extip = &getextip;
if ($extip eq 'X' || &checkipv4($extip)==1) {
if ($debug==1) { print "No external IP found! Probably not on the internet\n"; };
$extip='X';
} elsif ($debug==1) {
print "External IP Address : $extip\n";
}
} else {
debugoutput("External IP Check disabled",0);
}
# Find the number of CPU cores for later decisions, hyper-threading skews this but ohh well
$numcpucores = trim(`grep '^processor' /proc/cpuinfo | sort -u | wc -l`);
if ($debug==1) { print "Number of CPU Cores: $numcpucores\n" };
# Find out how much memory we got
$ram = (`cat /proc/meminfo | grep "MemTotal" | awk '{print \$2}'`);
if ($debug==1) { print "System Ram in kBytes: $ram\n" };
# Get the admin.php version even though the SVN version is MUCH more important
($buildver, $adminver) = &adminphp;
# Grab our local asterisk version and dynamically use that info
my @astverARY=split(' ', trim(`/usr/sbin/asterisk -V`));
$astverstring = &trim($astverARY[1]);
if ( $astverstring =~ m/^1.4/ ) { if ($debug==1) { print "Asterisk v.1.4 found!\n"; } $asterisk='1.4'; }
if ( $astverstring =~ m/^1.8/ ) { if ($debug==1) { print "Asterisk v.1.8 found!\n"; } $asterisk='1.8'; }
if ( $astverstring =~ m/^11./ ) { if ($debug==1) { print "Asterisk v.11 found!\n"; } $asterisk='11'; }
if ( $astverstring =~ m/^13./ ) { if ($debug==1) { print "Asterisk v.13 found!\n"; } $asterisk='13'; }
if ( $astverstring =~ m/^16./ ) { if ($debug==1) { print "Asterisk v.16 found!\n"; } $asterisk='16'; }
if ( $astverstring =~ m/^18./ ) { if ($debug==1) { print "Asterisk v.18 found!\n"; } $asterisk='18'; }
# Get the SVN version of our local copy
@svninfo = `/usr/bin/svn info /usr/src/astguiclient/trunk | grep Revision | sed -e 's/Revision: //'`;
$localsvn = trim($svninfo[0]);
if ($debug==1) { print "Local SVN Revision : $localsvn\n"; }
# See if we have external connectivity and get more info
if ( $extip ne "X") {
@svninfo = `/usr/bin/svn info svn://svn.eflo.net:3690/agc_2-X/trunk | grep Revision | sed -e 's/Revision: //'`;
$svnhead = trim($svninfo[0]);
if ($debug==1) { print "Head SVN Revision : $svnhead\n"; }
} else {
$svnhead="X";
if ($debug==1) { print "Not connected to internet, SVN head unavailable\n"; }
}
if ($restore==1) {
# We are restoring a server from a cluster, so we do that here.
print "\nThis will attempt to restore a missing server in a cluster using the\n";
print "information found in the primary database or as supplied by the user.\n";
print "What this will NOT restore is a database or a ViciBox express install.\n";
print "The restore option is primarily designed to allow for a more graceful\n";
print "replacement of web servers, telephony servers, and archive servers. It\n";
print "is NOT a substitute for having a proper back-up method and emergency\n";
print "procedures in place. It is mean't merely as a time-saving tool to use.\n";
print "\nThis server should be attached in it's production network environment\n";
print "prior to attempting a restore. Otherwise the restore will fail. This means\n";
print "that the server has the SAME IP address as it's entry in the vicibox table\n";
print "and/or the ViciBox cluster.\n";
print "\n\nDo you want to continue with the ViciBox restore? [y/N] :";
$myprompt = &yesprompt;
if ($myprompt==0) { exit; }
# Prompt for IP address to use if we don't have one
if ( $localip eq "X") {
print "\nAn internal IP address could not be found on the system.\n";
print "Please enter the IP address to use for this server : ";
$someinput = trim(<STDIN>);
if ( &checkipv4($someinput)==1 ) {
die "That is not a valid IP address : $someinput\n";
} else {
$localip = $someinput;
}
} else {
print "\nThe Internal IP address found was $localip.\n";
print "Do you want to use this IP address for ViciDial? [Y/n] : ";
$myprompt = &noprompt;
if ($myprompt==1) {
print "Please enter the IP address to use for this server : ";
$someinput = trim(<STDIN>);
if ( &checkipv4($someinput)==1 ) {
die "That is not a valid IP address : $someinput\n";
} else {
$localip = $someinput;
}
}
}
print "\nPlease input the master database IP address (127.0.0.1) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $VICIDBIP = $someinput; }
if (&checkipv4($VICIDBIP)!=0) {
exit 1;
}
print "Do you want to connect using the default ViciDial DB settings? [Y/n] : ";
$myprompt=&noprompt;
if ($myprompt==0) {
# Try connecting with default user cron and password 1234
$dbhVD = DBI->connect("DBI:mysql:$VICIdatabase:$VICIDBIP:$VICIport", "$VICIuser", "$VICIpass") or die "Couldn't connect to ViciDial database: " . DBI->errstr;
$dbhVDC = DBI->connect("DBI:mysql:$VICIdatabase:$VICIDBIP:$VICIport", "$VICIcustomuser", "$VICIcustompass") or die "Couldn't connect as custom user to ViciDial database. Check permissions: " . DBI->errstr;
if ($debug==1) { print "Database Connectivity checks good\n"; }
} else {
# Ask what user info to use for the DB and try to connect
print "Please enter the database information below\n";
print "DB Username ($VICIuser) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>=3) { $VICIuser = $someinput; }
print "DB Password ($VICIpass) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>=3) { $VICIpass = $someinput; }
print "DB Name ($VICIdatabase) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>=3) { $VICIdatabase = $someinput; }
print "DB Custom Username ($VICIcustomuser) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>=3) { $VICIcustomuser = $someinput; }
print "DB Custom Password ($VICIcustompass) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>=3) { $VICIcustompass = $someinput; }
print "DB Port ($VICIport) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $VICIport = $someinput; }
$dbhVD = DBI->connect("DBI:mysql:$VICIdatabase:$VICIDBIP:$VICIport", "$VICIuser", "$VICIpass") or die "Couldn't connect to ViciDial database: " . DBI->errstr;
$dbhVDC = DBI->connect("DBI:mysql:$VICIdatabase:$VICIDBIP:$VICIport", "$VICIcustomuser", "$VICIcustompass") or die "Couldn't connect as custom user to ViciDial database. Check permissions: " . DBI->errstr;
if ($debug==1) { print "Database Connectivity checks good\n"; }
}
# Now we check to see if we are a vicibox v.4.0+ install so we can suck in settings or enable legacy mode (yay?)
$stmtVBOXcheck = "show tables like 'vicibox';";
$sthVBOXcheck = $dbhVD->prepare($stmtVBOXcheck) or die "Preparing stmtVBOXcheck: ",$dbhVD->errstr;
$sthVBOXcheck->execute or die "Executing sthVBOXcheck: ",$dbhVD->errstr;
$sthVBOXcheckrows = $sthVBOXcheck->rows;
if ($sthVBOXcheckrows > 0) {
if ($debug==1) { print "ViciBox table found\n"; }
# We found a vicibox table, so now lets make sure there's good info in it!
# If the info doesn't match, then we enable expert mode and all bets are off
$stmtVBOXverify = "select field1,field3,field8,field9 from vicibox where server_type='Database' and server_ip IN ('$VICIDBIP', '127.0.0.1') and field1='0';";
$sthVBOXverify = $dbhVD->prepare($stmtVBOXverify) or die "Preparing stmtVBOXverify: ",$dbhVD->errstr;
$sthVBOXverify->execute or die "Executing sthVBOXverify: ",$dbhVD->errstr;
$sthVBOXverifyrows = $sthVBOXverify->rows;
if ($sthVBOXverifyrows < 1) {
print "Database entry does not match settings supplied! Enabling legacy mode!\n";
print "Please verify all data before continuing! Installing on a cluster that\n";
print "is already set-up can cause irreparable damage! You have been warned.\n";
$legacy=1;
} else {
# Looks like we got results, so load our settings from the primary DB
@aryVBOXverify = $sthVBOXverify->fetchrow_array;
$DBsvnrev = $aryVBOXverify[1];
if ($debug==1) {
print "DB SVN rev : $DBsvnrev\n";
}
}
} elsif ($legacy==0) {
print "ViciBox table not found, legacy mode enabled!\n";
$legacy=1;
}
if ($legacy==0) {
# Look up this server's IP from the vicihost tables
$stmtVBOXlookup = "select server_type,field1,field2,field3,field4,field5,field6,field7,field8,field9 from vicibox where server_ip='$localip';";
$sthVBOXlookup = $dbhVD->prepare($stmtVBOXlookup) or die "Preparing stmtVBOXlookup: ",$dbhVD->errstr;
$sthVBOXlookup->execute or die "Executing sthVBOXlookup: ",$dbhVD->errstr;
$sthVBOXlookuprows=$sthVBOXlookup->rows;
if ($sthVBOXlookuprows>0) {
# Found something, suck in the first result and process
while (@aryVBOXlookup=$sthVBOXlookup->fetchrow_array()) {
$server_type=$aryVBOXlookup[0];
$field1=$aryVBOXlookup[1];
$field2=$aryVBOXlookup[2];
$field4=$aryVBOXlookup[4];
$field5=$aryVBOXlookup[5];
if ($server_type eq 'Database') { die "The restore option cannot be used for databases at this time"; }
if ($server_type eq 'Web') {
$WEB=1;
print "Web server entry found\n";
print "---> Install Redirect Page? [y/N] : ";
$redirect = &yesprompt;
# PhpMyAdmin should never be installed haphazardly, so remove from the installer.
#print "---> Install phpMyAdmin ? [y/N] : ";
#$phpmyadmin = &yesprompt;
}
if ($server_type eq 'Telephony') {
$TEL=1;
print "Telephony server entry found\n";
$primarydialer=0;
# See if we have an archive server listed and suck in those settings
$stmtVBOXtelarc = "select server_ip,field1,field2,field3,field4,field5 from vicibox where server_type='Archive';";
$sthVBOXtelarc = $dbhVD->prepare($stmtVBOXtelarc) or die "Preparing stmtVBOXtelarc: ",$dbhVD->errstr;
$sthVBOXtelarc->execute or die "Executing sthVBOXtelarc: ",$dbhVD->errstr;
$sthVBOXtelarcrows = $sthVBOXtelarc->rows;
if ($sthVBOXtelarcrows > 0) {
# We found an archive server! Suck in those settings too
@aryVBOXtelarc = $sthVBOXtelarc->fetchrow_array;
$TELarchiveip = $aryVBOXtelarc[0];
$TELarchiveuser = $aryVBOXtelarc[1];
$TELarchivepass = $aryVBOXtelarc[2];
$TELarchiveport = $aryVBOXtelarc[3];
$TELarchivedir = $aryVBOXtelarc[4];
$TELarchiveurl = $aryVBOXtelarc[5];
if ($debug==1) {
print "Archive IP : $TELarchiveip\n";
print "Archive user : $TELarchiveuser\n";
print "Archive pass : $TELarchivepass\n";
print "Archive port : $TELarchiveport\n";
print "Archive directory : $TELarchivedir\n";
print "Archive URL : $TELarchiveurl\n";
}
$havearchive=1;
} else {
print "No Archive server found in provisioning table\n";
}
}
if ($server_type eq 'Archive') {
$ARC=1;
print "Archive server entry found\n";
$TELarchivedir=$field4;
$TELarchiveuser=$field1;
$TELarchivepass=$field2;
$TELarchiveurl=$field5;
}
}
} else {
# Ask our legacy questions
die "\n\nA server with IP $localip could not be located in the vicibox table!\nPerhaps the server has the wrong IP, try again.";
}
} else {
# ask our legacy question
print "\nLegacy mode has been enable with a restore. Extra care must be taken to\n";
print "make sure that the server being restored exists. If you are trying to add a\n";
print "new server then you should not be using the restore option at all.\n";
print "\nWill this server be used as a Web server? [y/N] : ";
$WEB = &yesprompt;
# If we are a web server and an expert, we get more questions!
if ($WEB==1) {
print "---> Install Redirect Page? [y/N] : ";
$redirect = &yesprompt;
#print "---> Install phpMyAdmin ? [y/N] : ";
#$phpmyadmin = &yesprompt;
}
print "\nWill this server be used as a Telephony server? [y/N] : ";
$TEL = &yesprompt;
if ($TEL==1) {
# If asterisk 18 or higher, ask for PJSIP
if ($asterisk >= 18) {
print "---> Enable PJSIP? [Y/n] : ";
$PJSIP = &noprompt;
}
print "---> Do you have an archive server? [y/N] : ";
$havearchive = &yesprompt;
if ($havearchive==1) {
# Ask for user input for archive server
print "Archive server IP : ";
$TELarchiveip = trim(<STDIN>);
if ( &checkipv4($TELarchiveip)==1) { die "Not a valid archive IP\n"; }
print "Archive FTP User ($TELarchiveuser) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $TELarchiveuser = $someinput; }
print "Archive FTP Password ($TELarchivepass) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $TELarchivepass = $someinput; }
print "Archive FTP Port : ";
$TELarchiveport = trim(<STDIN>);
print "Archive FTP Directory : ";
$TELarchivedir = trim(<STDIN>);
print "Archive URL : ";
$TELarchiveurl = trim(<STDIN>);
}
}
print "\nWill this server be used as an Archive server? [y/N] : ";
$ARC = &yesprompt;
if ($ARC==1) {
print "Archive FTP User ($TELarchiveuser) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $TELarchiveuser = $someinput; }
print "Archive FTP Password ($TELarchivepass) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $TELarchivepass = $someinput; }
}
}
print "\nDo you want to disable the built-in firewall? [y/N] : ";
$myprompt=&yesprompt;
if ($myprompt==1) { $disablefirewall=1; }
# Determine the SVN version assuming that we are in legacy mode
if ($legacy==1) {
print "\nThe local SVN is build $buildver version $adminver from SVN $localsvn\n";
if ( $extip ne "X") {
print "Do you want to use the ViciDial version listed above? [Y/n] : ";
$uselocalsvn = &yesprompt;
if ($uselocalsvn==0) {
print "Do you want to use the latest SVN version $svnhead? [Y/n] : ";
$usesvnhead = &yesprompt;
if ($usesvnhead==0) {
print "Please enter the SVN revision to use : ";
$usersvnrev = trim(<STDIN>);
if ($usersvnrev > $svnhead) {
die "The is not a valid SVN revision\n";
} else {
$DBsvnrev = $usersvnrev;
}
} else {
$DBsvnrev = $svnhead;
}
} else {
$DBsvnrev = $localsvn;
}
} else {
print "Internet connectivity was not detected. If the above version of ViciDial\n";
print "is not correct then you will need to transfer the correct version to the\n";
print "directory /usr/share/astguiclient/trunk. If this is an all-in-one ViciBox\n";
print "Express installation then you can disregard this message\n\n";
}
} elsif ($legacy==0 && $DB==0 && $DBsvnrev != $localsvn && $extip eq "X") {
print "The SVN revision installed on the database is $DBsvnrev. The local SVN version\n";
print "is $localsvn. Unfortunately no internet connection was detected so the install\n";
print "can not continue. Please copy the SVN version of ViciDial from the database to\n";
print "this machine to complete the installation or connect this machine to the internet.\n";
die "Local SVN revision does not match database SVN revision and cannot update to it\n";
} elsif ($legacy==0 && $DB==0 && $DBsvnrev != $localsvn && $extip ne "X") {
if ($debug==1) { print "The database SVN revision is $DBsvnrev. This system will be updated to that revision\n"; }
} elsif ($DB==1 && $DBS==0 && $extip eq "X") {
# We are a database, that is not slave, without internets, we use the local SVN copy
if ($debug==1) { print "Internet connectivity not found, using local SVN revision $localsvn.\n"; }
$DBsvnrev = $localsvn;
} elsif ($DB==1 && $DBS==0 && $extip ne "X") {
# We are a database, that is not slave, with internets, we use the head SVN copy
if ($debug==1) { print "Internet connectivity found, using head SVN revision $svnhead.\n"; }
$DBsvnrev = $svnhead;
} else {
# At this point all hell has broken loose, cats and dogs sleeping together, mass hysteria
# So we just give generic output and hope for the best
if ($debug==1) { print "The database SVN revision is $DBsvnrev. This system will be updated to that revision\n"; }
}
# Summary output
print "\n\n--- ViciBox Restore Summary ---\n\n";
if ($legacy==1) { print "Legacy : Yes\n"; } else { print "Legacy : No\n"; }
if ($WEB==1) { print "Web : Yes\n"; } else { print "Web : No\n"; }
if ($WEB==1 && $expert==1) {
if ($redirect==1) { print "Redirect : Yes\n"; } else { print "Redirect : No\n"; }
#if ($phpmyadmin==1) { print "PMA : Yes\n"; } else { print "PMA : No\n"; }
}
if ($TEL==1) { print "Telephony: Yes\n"; } else { print "Telephony: No\n"; }
if ($TEL==1 && $legacy==1) {
if ($havearchive==1) { print "Have Arch: Yes\n"; } else { print "Have Arch: No\n"; }
}
if ($ARC==1) { print "Archive : Yes\n"; } else { print "Archive : No\n"; }
if ($disablefirewall==0) {
print "Firewall : Enabled\n";
} else {
print "Firewall : Disabled\n";
}
print "\n--- Configuration Information ---\n";
print "- Database -\n";
print "SVN Rev : $DBsvnrev\n";
print "IP Addr : $VICIDBIP\n";
print "Name : $VICIdatabase\n";
print "User : $VICIuser\n";
print "Password : $VICIpass\n";
print "Cust User: $VICIcustomuser\n";
print "Cust Pass: $VICIcustompass\n";
print "Port : $VICIport\n";
if ($TEL==1 && $havearchive==1) {
print "\n- Archive -\n";
print "IP Addr : $TELarchiveip\n";
print "User : $TELarchiveuser\n";
print "Password : $TELarchivepass\n";
print "Port : $TELarchiveport\n";
print "Directory: $TELarchivedir\n";
print "URL : $TELarchiveurl\n";
}
print "\n\nPlease verify the above information before continuing!\n";
print "Do you want to continue the restoration? [y/N] : ";
$myprompt = &yesprompt;
# Now either do the restore, or just exit out
if ($myprompt==1) { dothedeed; exit; } else { exit; }
}
# Vicibox Express stuff
if ($viciboxexpress==1) {
# Disclaimer and BS goes here
print "\nThis will install ViciBox in \"Express\" mode. This will result in a\n";
print "single server installation performing all roles of the ViciDial Call\n";
print "Center Suite. This is the simplest method of installation and generally\n";
print "suitable for use with 20 agents or less. Minimum server specifications\n";
print "are Quad-Core CPU, 8GB of ram or more, and two 500-GB SSDs in RAID1. A\n";
print "software RAID can be setup by using the MD or MultiDevice install media\n";
print "for ViciBox.\n";
print "\nTo continue beyond this point will be destructive to the installed system.\n";
print "\n\nDo you want to continue with the ViciBox Express install? [y/N] :";
$myprompt = &yesprompt;
if ($myprompt==0) { exit; }
# Set a bunch of variables and install, most of which are defaults except for server roles
$TEL=1;
$DB=1;
$WEB=1;
$PJSIP=1; # Use SIP by default
if ($asterisk >= 18) {
$PJSIP=0; # Use PJSIP if it's asterisk 18
}
# If we detect internet connectivity, update from SVN, otherwise use local copy
if ($extip ne "X") {
$DBsvnrev = $svnhead;
} else {
$DBsvnrev = $localsvn;
}
dothedeed;
} else {
# Disclaimer and BS goes here
print "\nThe installer will ask questions based upon the role that this server is\n";
print "to provide for the ViciBox Call Center Suite. You should have the database\n";
print "and optionally archive servers setup prior to installing any other servers.\n";
print "The installer will not run without there being a configured database! If this\n";
print "server is to be the database then it must be installed before the archive server\n";
print "Verify that all servers are connected to the same network and have connectivity\n";
print "to each other before continuing. This installer will be destructive to the the\n";
print "server if it is run.\n";
# So we get the nitty gritty out of the way and ask if they want to continue installing
print "\n\nDo you want to continue with the ViciBox install? [y/N] : ";
$myprompt = &yesprompt;
if ($myprompt==0) { exit; }
print "\nDo you want to enable expert installation? [y/N] : ";
$expert = &yesprompt;
if ($debug==1) {
print "\nDo you want to enable legacy install support? [y/N] : ";
$legacy = &yesprompt;
}
# Prompt for IP address to use if we don't have one
if ( $localip eq "X") {
print "\nAn internal IP address could not be found on the system.\n";
print "Please enter the IP address to use for this server : ";
$someinput = trim(<STDIN>);
if ( &checkipv4($someinput)==1 ) {
die "That is not a valid IP address : $someinput\n";
} else {
$localip = $someinput;
}
} else {
print "\nThe Internal IP address found was $localip.\n";
print "Do you want to use this IP address for ViciDial? [Y/n] : ";
$myprompt = &noprompt;
if ($myprompt==1) {
print "Please enter the IP address to use for this server : ";
$someinput = trim(<STDIN>);
if ( &checkipv4($someinput)==1 ) {
die "That is not a valid IP address : $someinput\n";
} else {
$localip = $someinput;
}
}
}
print "\nWill this server be used as the Database? [y/N] : ";
$DB = &yesprompt;
# If we are an expert and a database, see if we are a slave server
if ($DB==1 && $expert==1) {
print "---> Will this be a Slave Databse? [y/N] : ";
$DBS = &yesprompt;
}
# Get the DB info and set-up our mysql connections for further fun
# This is all the DB related things to do when we are NOT the primary database
if ($DB==0 || ($DB==1 && $DBS==1)) {
print "\nPlease input the master database IP address ($localip) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $VICIDBIP = $someinput; } else { $VICIDBIP=$localip; }
if (&checkipv4($VICIDBIP)!=0) {
die "Not a valid database IP\n";
}
print "Do you want to connect using the default ViciDial DB settings? [Y/n] : ";
$myprompt=&noprompt;
if ($myprompt==0) {
# Try connecting with default user cron and password 1234
$dbhVD = DBI->connect("DBI:mysql:$VICIdatabase:$VICIDBIP:$VICIport", "$VICIuser", "$VICIpass") or die "Couldn't connect to ViciDial database: " . DBI->errstr;
$dbhVDC = DBI->connect("DBI:mysql:$VICIdatabase:$VICIDBIP:$VICIport", "$VICIcustomuser", "$VICIcustompass") or die "Couldn't connect as custom user to ViciDial database. Check permissions: " . DBI->errstr;
if ($debug==1) { print "Database Connectivity checks good\n"; }
} else {
# Ask what user info to use for the DB and try to connect
print "Please enter the database information below\n";
print "DB Username ($VICIuser) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $VICIuser = $someinput; }
print "DB Password ($VICIpass) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $VICIpass = $someinput; }
print "DB Name ($VICIdatabase) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $VICIdatabase = $someinput; }
print "DB Custom Username ($VICIcustomuser) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $VICIcustomuser = $someinput; }
print "DB Custom Password ($VICIcustompass) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $VICIcustompass = $someinput; }
print "DB Port ($VICIport) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $VICIport = $someinput; }
$dbhVD = DBI->connect("DBI:mysql:$VICIdatabase:$VICIDBIP:$VICIport", "$VICIuser", "$VICIpass") or die "Couldn't connect to ViciDial database: " . DBI->errstr;
$dbhVDC = DBI->connect("DBI:mysql:$VICIdatabase:$VICIDBIP:$VICIport", "$VICIcustomuser", "$VICIcustompass") or die "Couldn't connect as custom user to ViciDial database. Check permissions: " . DBI->errstr;
if ($debug==1) { print "Database Connectivity checks good\n"; }
}
# Now we check to see if we are a vicibox v.4.0+ install so we can suck in settings or enable legacy mode (yay?)
$stmtVBOXcheck = "show tables like 'vicibox';";
$sthVBOXcheck = $dbhVD->prepare($stmtVBOXcheck) or die "Preparing stmtVBOXcheck: ",$dbhVD->errstr;
$sthVBOXcheck->execute or die "Executing sthVBOXcheck: ",$dbhVD->errstr;
$sthVBOXcheckrows = $sthVBOXcheck->rows;
if ($sthVBOXcheckrows > 0) {
if ($debug==1) { print "ViciBox table found\n"; }
# We found a vicibox table, so now lets make sure there's good info in it!
# If the info doesn't match, then we enable expert mode and all bets are off
$stmtVBOXverify = "select field1,field3,field8,field9 from vicibox where server_type='Database' and server_ip IN ('$VICIDBIP', '127.0.0.1') and field1='0';";
$sthVBOXverify = $dbhVD->prepare($stmtVBOXverify) or die "Preparing stmtVBOXverify: ",$dbhVD->errstr;
$sthVBOXverify->execute or die "Executing sthVBOXverify: ",$dbhVD->errstr;
$sthVBOXverifyrows = $sthVBOXverify->rows;
if ($sthVBOXverifyrows < 1) {
print "Database entry does not match settings supplied! Enabling legacy mode!\n";
print "Please verify all data before continuing! Installing on a cluster that\n";
print "is already set-up can cause irreparable damage! You have been warned.\n";
$legacy=1;
} else {
# Looks like we got results, so load our settings from the primary DB
@aryVBOXverify = $sthVBOXverify->fetchrow_array;
$DBmysqlid = $aryVBOXverify[0];
$DBsvnrev = $aryVBOXverify[1];
$VICIslaveuser = $aryVBOXverify[2];
$VICIslavepass = $aryVBOXverify[3];
if ($debug==1) {
print "DB SVN rev : $DBsvnrev\n";
print "DB Slave user : $VICIslaveuser\n";
print "DB Slave pass : $VICIslavepass\n";
}
if ($legacy==1) {
print "ViciBox v.4.0+ cluster info found! Recommend disabling legacy mode.\n";
print "If you do not have a strong reason for enabling legacy mode, disable it.\n";
print "Would you like to disable legacy mode? [Y/n] : ";
$menuprompt = &noprompt;
if ($menuprompt==0) { $legacy=0; }
}
}
} elsif ($legacy==0) {
print "ViciBox table not found, legacy mode enabled!\n";
$legacy=1;
}
# Since we are a slave, and we are working with a legacy vicibox cluster, we need more options
if ($DBS==1 && $legacy==1) {
print "Please enter the MySQL Slave ID to use : ";
$DBmysqlid = trim(<STDIN>);
if ($DBmysqlid<2 or $DBmysqlid>10) {
print "\n\nPlease enter a valid slave id that is 2 through 10.\n";
exit;
}
print "Please make sure that the 'replication' priviledge is granted to\n";
print "the DB user before continuing. If not then the replication will fail.\n";
} elsif ($DBS==1) {
# We are a slave, but we have vicibox info, so figure out what server ID to use
$stmtVBOXmysqlid = "select field1 from vicibox where server_type='Database' order by field1 desc limit 1;";
$sthVBOXmysqlid = $dbhVD->prepare($stmtVBOXmysqlid) or die "Preparing stmtVBOXmysqlid: ",$dbhVD->errstr;
$sthVBOXmysqlid->execute or die "Executing sthVBOXmysqlid: ",$dbhVD->errstr;
$sthVBOXmysqlidrows = $sthVBOXmysqlid->rows;
if ($sthVBOXmysqlidrows > 0) {
# We have records, so get it and set our ID
@aryVBOXmysqlid = $sthVBOXmysqlid->fetchrow_array;
$oldvalue = $aryVBOXmysqlid[0];
if ($debug==1) { print "MySQL old ID : $oldvalue\n"; }
if ($oldvalue==0) { $DBmysqlid = $oldvalue+2; } else { $DBmysqlid = $oldvalue+1; } #
if ($debug==1) { print "MySQL ID : $DBmysqlid\n"; }
}
}
} elsif ($DB==1 && $DBS==0) {
# Since we are a primary DB, use the user-selected IP for the DB IP
$VICIDBIP=$localip;
# Since we are a primary DB, see if we want to use the default ViciDial DB credentials
print "Do you want to use the default ViciDial DB settings? [Y/n] : ";
$myprompt=&noprompt;
if ($myprompt==1) {
print "Please enter the database information below\n";
print "DB Username ($VICIuser) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $VICIuser = $someinput; }
print "DB Password ($VICIpass) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $VICIpass = $someinput; }
print "DB Name ($VICIdatabase) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $VICIdatabase = $someinput; }
print "DB Custom Username ($VICIcustomuser) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $VICIcustomuser = $someinput; }
print "DB Custom Password ($VICIcustompass) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $VICIcustompass = $someinput; }
print "DB Port ($VICIport) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $VICIport = $someinput; }
print "DB Slave User ($VICIslaveuser) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $VICIslaveuser = $someinput; }
print "DB Slave Pass ($VICIslavepass) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $VICIslavepass = $someinput; }
}
}
print "\nWill this server be used as a Web server? [y/N] : ";
$WEB = &yesprompt;
# If we are a web server and an expert, we get more questions!
if ($WEB==1 && $expert==1) {
print "---> Install Redirect Page? [y/N] : ";
$redirect = &yesprompt;
#print "---> Install phpMyAdmin ? [y/N] : ";
#$phpmyadmin = &yesprompt;
}
print "\nWill this server be used as a Telephony server? [y/N] : ";
$TEL = &yesprompt;
if ($TEL==1 and $asterisk >= 18) {
print "---> Enable PJSIP? [Y/n] : ";
$PJSIP = &noprompt;
}
# If we are legacy and telephony then ask more questions
if ($TEL==1 && $legacy==1 && $DB==0) {
print "---> Is this the first server in a cluster? [y/N] : ";
$primarydialer = &yesprompt;
print "---> Do you have an archive server? [y/N] : ";
$havearchive = &yesprompt;
if ($havearchive==1) {
# Ask for user input for archive server
print "Archive server IP : ";
$TELarchiveip = trim(<STDIN>);
if ( &checkipv4($TELarchiveip)==1) { die "Not a valid archive IP\n"; }
print "Archive FTP User : ";
$TELarchiveuser = trim(<STDIN>);
print "Archive FTP Password : ";
$TELarchivepass = trim(<STDIN>);
print "Archive FTP Port : ";
$TELarchiveport = trim(<STDIN>);
print "Archive FTP Directory : ";
$TELarchivedir = trim(<STDIN>);
print "Archive URL : ";
$TELarchiveurl = trim(<STDIN>);
}
} elsif ($TEL==1 && $legacy==0 && $DB==0) {
# We are a telephony server, and not in legacy mode, so we suck in our settings from vicibox
$stmtVBOXtelct = "select server from vicibox where server_type='Telephony';";
$sthVBOXtelct = $dbhVD->prepare($stmtVBOXtelct) or die "Preparing stmtVBOXtelct: ",$dbhVD->errstr;
$sthVBOXtelct->execute or die "Executing sthVBOXtelct: ",$dbhVD->errstr;
$sthVBOXtelctrows = $sthVBOXtelct->rows;
if ($sthVBOXtelctrows > 0 ) {
$primarydialer=0;
if ($debug==1) { print "We are not the first dialer, there are $sthVBOXtelctrows others\n"; }
} else {
if ($debug==1) { print "We are the first dialer\n"; }
}
# See if we have an archive server listed and suck in those settings
$stmtVBOXtelarc = "select server_ip,field1,field2,field3,field4,field5 from vicibox where server_type='Archive';";
$sthVBOXtelarc = $dbhVD->prepare($stmtVBOXtelarc) or die "Preparing stmtVBOXtelarc: ",$dbhVD->errstr;
$sthVBOXtelarc->execute or die "Executing sthVBOXtelarc: ",$dbhVD->errstr;
$sthVBOXtelarcrows = $sthVBOXtelarc->rows;
if ($sthVBOXtelarcrows > 0) {
# We found an archive server! Suck in those settings too
@aryVBOXtelarc = $sthVBOXtelarc->fetchrow_array;
$TELarchiveip = $aryVBOXtelarc[0];
$TELarchiveuser = $aryVBOXtelarc[1];
$TELarchivepass = $aryVBOXtelarc[2];
$TELarchiveport = $aryVBOXtelarc[3];
$TELarchivedir = $aryVBOXtelarc[4];
$TELarchiveurl = $aryVBOXtelarc[5];
if ($debug==1) {
print "Archive IP : $TELarchiveip\n";
print "Archive user : $TELarchiveuser\n";
print "Archive pass : $TELarchivepass\n";
print "Archive port : $TELarchiveport\n";
print "Archive directory : $TELarchivedir\n";
print "Archive URL : $TELarchiveurl\n";
}
$havearchive=1;
} else {
print "No Archive server found in provisioning table\n";
}
}
print "\nWill this server be used as an Archive server? [y/N] : ";
$ARC = &yesprompt;
# And now we do some archive server set-up
if ($ARC==1) {
if ($havearchive==1) { die "Archive server already found! Can't set-up two.\n"; }
# Some defaults generated from the above messes
$TELarchiveurl = "http://" . $localip . "/archive/";
$TELarchiveip = $localip;
if ($legacy==0 && $DB==0) {
# Check to see if we already have an archive server defined in non-legacy mode and we aren't the DB
$stmtVBOXtelarc = "select server_ip,field1,field2,field3,field4,field5 from vicibox where server_type='Archive';";
$sthVBOXtelarc = $dbhVD->prepare($stmtVBOXtelarc) or die "Preparing stmtVBOXtelarc: ",$dbhVD->errstr;
$sthVBOXtelarc->execute or die "Executing sthVBOXtelarc: ",$dbhVD->errstr;
$sthVBOXtelarcrows = $sthVBOXtelarc->rows;
if ($sthVBOXtelarcrows > 0) { die "Archive server found! Can't set-up two.\n"; }
}
if ($legacy==1 || $expert==1) {
# Ask for user input for archive server
print "Archive server IP ($TELarchiveip) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $TELarchiveip = $someinput; }
if ( &checkipv4($TELarchiveip)==1) { die "Not a valid archive IP\n"; }
print "Archive FTP User ($TELarchiveuser) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $TELarchiveuser = $someinput; }
print "Archive FTP Password ($TELarchivepass) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $TELarchivepass = $someinput; }
print "Archive FTP Port ($TELarchiveport) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $TELarchiveport = $someinput; }
print "Archive FTP Directory ($TELarchivedir) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $TELarchivedir = $someinput; }
print "Archive URL ($TELarchiveurl) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $TELarchiveurl = $someinput; }
} else {
# We will use defaults, but verify that the internal vicidial IP and external URL are correct
print "Archive server IP ($TELarchiveip) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $TELarchiveip = $someinput; }
if ( &checkipv4($TELarchiveip)==1) { die "Not a valid archive IP\n"; }
print "Archive URL ($TELarchiveurl) : ";
$someinput = trim(<STDIN>);
if (length($someinput)>3) { $TELarchiveurl = $someinput; }
}
}
# Determine the SVN version assuming that we are in legacy mode
if ($legacy==1) {
print "\nThe local SVN is build $buildver version $adminver from SVN $localsvn\n";
if ( $extip ne "X") {
print "Do you want to use the ViciDial version listed above? [Y/n] : ";
$uselocalsvn = &yesprompt;
if ($uselocalsvn==0) {
print "Do you want to use the latest SVN version $svnhead? [Y/n] : ";
$usesvnhead = &yesprompt;
if ($usesvnhead==0) {
print "Please enter the SVN revision to use : ";
$usersvnrev = trim(<STDIN>);
if ($usersvnrev > $svnhead) {
die "The is not a valid SVN revision\n";
} else {
$DBsvnrev = $usersvnrev;
}
} else {
$DBsvnrev = $svnhead;
}
} else {
$DBsvnrev = $localsvn;
}
} else {
print "Internet connectivity was not detected. If the above version of ViciDial\n";
print "is not correct then you will need to transfer the correct version to the\n";
print "directory /usr/share/astguiclient/trunk. If this is an all-in-one ViciBox\n";
print "Express installation then you can disregard this message\n\n";
}
} elsif ($legacy==0 && $DB==0 && $DBsvnrev != $localsvn && $extip eq "X") {
print "The SVN revision installed on the database is $DBsvnrev. The local SVN version\n";
print "is $localsvn. Unfortunately no internet connection was detected so the install\n";
print "can not continue. Please copy the SVN version of ViciDial from the database to\n";
print "this machine to complete the installation or connect this machine to the internet.\n";
die "Local SVN revision does not match database SVN revision and cannot update to it\n";
} elsif ($legacy==0 && $DB==0 && $DBsvnrev != $localsvn && $extip ne "X") {
if ($debug==1) { print "The database SVN revision is $DBsvnrev. This system will be updated to that revision\n"; }
} elsif ($DB==1 && $DBS==0 && $extip eq "X") {
# We are a database, that is not slave, without internets, we use the local SVN copy
if ($debug==1) { print "Internet connectivity not found, using local SVN revision $localsvn.\n"; }
$DBsvnrev = $localsvn;
} elsif ($DB==1 && $DBS==0 && $extip ne "X") {
# We are a database, that is not slave, with internets, we use the head SVN copy
if ($debug==1) { print "Internet connectivity found, using head SVN revision $svnhead.\n"; }
$DBsvnrev = $svnhead;
} else {
# At this point all hell has broken loose, cats and dogs sleeping together, mass hysteria
# So we just give generic output and hope for the best
if ($debug==1) { print "The database SVN revision is $DBsvnrev. This system will be updated to that revision\n"; }
}
# Sanity check
if ($TEL==0 && $DB==0 && $WEB==0 && $ARC==0) { die "Did not select any server roles, exiting.\n"; }
# See if we want to disable the firewall or not
if ($DB==1 && $TEL==0 && $WEB==0 && $ARC==0) {
# Since we seem to be a dedicated DB, we shouldn't need firewall, default to disabled
$disablefirewall=1;
print "\nDo you want to enable the built-in firewall? [y/N] : ";
$myprompt=&yesprompt;
if ($myprompt==1) { $disablefirewall=0; }
} else {
# Since we aren't dedicated, we are probably on the real internet, so default to enabled
print "\nDo you want to disable the built-in firewall? [y/N] : ";
$myprompt=&yesprompt;
if ($myprompt==1) { $disablefirewall=1; }
}
# Summary output
print "\n\n--- ViciBox Install Summary ---\n\n";
if ($expert==1) { print "Expert : Yes\n"; } else { print "Expert : No\n"; }
if ($legacy==1) { print "Legacy : Yes\n"; } else { print "Legacy : No\n"; }
if ($DB==1) { print "Database : Yes\n"; } else { print "Database : No\n"; }
if ($DBS==1) { print "Slave ID : $DBmysqlid\n"; }
if ($WEB==1) { print "Web : Yes\n"; } else { print "Web : No\n"; }
if ($WEB==1 && $expert==1) {
if ($redirect==1) { print "Redirect : Yes\n"; } else { print "Redirect : No\n"; }
#if ($phpmyadmin==1) { print "PMA : Yes\n"; } else { print "PMA : No\n"; }
}
if ($TEL==1) { print "Telephony: Yes\n"; } else { print "Telephony: No\n"; }
if ($TEL==1 && $legacy==1) {
if ($primarydialer==1) { print "First Srv: Yes\n"; } else { print "First Srv: No\n"; }
if ($havearchive==1) { print "Have Arch: Yes\n"; } else { print "Have Arch: No\n"; }
}
if ($ARC==1) { print "Archive : Yes\n"; } else { print "Archive : No\n"; }
if ($disablefirewall==0) {
print "Firewall : Enabled\n";
} else {
print "Firewall : Disabled\n";
}
print "\n--- Configuration Information ---\n";
print "- Database -\n";
print "SVN Rev : $DBsvnrev\n";
print "IP Addr : $VICIDBIP\n";
print "Name : $VICIdatabase\n";
print "User : $VICIuser\n";
print "Password : $VICIpass\n";
print "Cust User: $VICIcustomuser\n";
print "Cust Pass: $VICIcustompass\n";
if ($DBS==1) {
print "Slave Usr: $VICIslaveuser\n";
print "Slave Pw : $VICIslavepass\n";
}
print "Port : $VICIport\n";
if ($TEL==1 && $havearchive==1) {
print "\n- Archive -\n";
print "IP Addr : $TELarchiveip\n";
print "User : $TELarchiveuser\n";
print "Password : $TELarchivepass\n";
print "Port : $TELarchiveport\n";
print "Directory: $TELarchivedir\n";
print "URL : $TELarchiveurl\n";
}
print "\n\nPlease verify the above information before continuing!\n";
print "Do you want to continue the installation? [y/N] : ";
$myprompt = &yesprompt;
if ($myprompt==1) { dothedeed; }
}