#!/usr/bin/perl #@%^&*!eval(' use strict; use LWP::UserAgent; use File::Copy; use Sys::Hostname; use Term::ReadKey; use Term::ReadLine; use File::Path; use Data::Dumper; use Net::Ping; use Term::ANSIColor qw(:constants); $Term::ANSIColor::AUTORESET = 1; our $ipnum = qr{([01]?\d\d?|2[0-4]\d|25[0-5])}; our $ip_rx = qr{^$ipnum\.$ipnum\.$ipnum\.$ipnum$}; our $if_file = '/etc/sysconfig/network-scripts/ifcfg-eth0'; our $network_file = '/etc/sysconfig/network'; our $resolv_file = '/etc/resolv.conf'; our $server_url = 'http://activate.trixbox.com/activatetb.cgi?'; our $test_url = 'http://activate.trixbox.com/gd_test.htm?'; our $code_url = 'http://activate.trixbox.com/activate_code.cgi?'; chomp( my $GVqquVhiAz = `asterisk -V` ); $server_url .= "ast_ver=$GVqquVhiAz&"; $|++; my ($PVOVqKqKJM) = new Term::ReadLine 'Fonality Activation'; my ($EmHDINcXZa) = hostname(); my ($dUmAMyhvCd) = 0; our $tag; OCZveFAbjX(); sub OCZveFAbjX { ZYaqMtxfrv(); system('clear'); VArFVNWbam(); print GREEN "+------------------------+\n"; print GREEN "| "; print BLACK ON_GREEN "trixbox Pro Activation"; print GREEN " |\n"; print GREEN "+------------------------+\n\n"; print CYAN BLINK "--> "; print CYAN "You may press 'r' at any time to restart activation"; print CYAN BLINK " <--\n"; $tag = jnZbUZJApp(); KqLlpipjyn(1); lIDBRbqpeC(); OzekKOuyhw(); } sub sKOyYGxskF { my ( $xKTKQMfbVD, $KgxZXqQGIF, $XbSfEMBcUk, $cTPCMqMfcH ) = @_; my $VXeTfFIUiV; if ( length($XbSfEMBcUk) ) { $KgxZXqQGIF .= " [$XbSfEMBcUk]"; if ($cTPCMqMfcH) { $KgxZXqQGIF .= " " x ( $cTPCMqMfcH - length($XbSfEMBcUk) ); } } { $VXeTfFIUiV = _get_info_from_terminal( $PVOVqKqKJM, $KgxZXqQGIF ); chomp $VXeTfFIUiV; goto &OCZveFAbjX if $VXeTfFIUiV =~ /^r$/i; $VXeTfFIUiV = $XbSfEMBcUk, last if ( !$VXeTfFIUiV ) && ( length($XbSfEMBcUk) > 0 ); last if $VXeTfFIUiV =~ /$xKTKQMfbVD/; redo; } return $VXeTfFIUiV; } sub TJQwGbWFKi { my $AlUiwojqTa = shift; my %tdMiGAqRFq = (); open my $IcDxuREUNE, "<$AlUiwojqTa" or die $!; for my $XmjVzWmCmz ( grep { $_ !~ /^\s*#/ } <$IcDxuREUNE> ) { my ( $k, $v ) = split /=|\s+/, $XmjVzWmCmz; $tdMiGAqRFq{$k} = $v unless $tdMiGAqRFq{$k}; } close $IcDxuREUNE; return \%tdMiGAqRFq; } sub FcbTHfkFxM { my ( $AlUiwojqTa, $tdMiGAqRFq, $oAYUkbbNOm ) = @_; $oAYUkbbNOm ||= '='; my $lmzUStCpcK; $lmzUStCpcK .= "$_$oAYUkbbNOm$$tdMiGAqRFq{$_}\n" for keys %$tdMiGAqRFq; open my $IcDxuREUNE, ">$AlUiwojqTa" or die $!; print $IcDxuREUNE $lmzUStCpcK; close $IcDxuREUNE; } sub gSYwwUupkM { my $nxbNvJzwFY = qx{/sbin/ifconfig}; my $elaMRBWDUG = qr{[\d.]+\s}; my ( $dqGjPvcxQR, $PJeFpfLhEr ) = $nxbNvJzwFY =~ /eth0.+?inet addr:($elaMRBWDUG).+?Mask:($elaMRBWDUG)/s; return $dqGjPvcxQR, $PJeFpfLhEr; } sub network_restart { print "\n>>> Reconfiguring your network settings...\n\n"; system '/etc/init.d/network restart >>/dev/null 2>>/dev/null'; my $msJKpWUmpl = TJQwGbWFKi $network_file; my $vXFXCrQFnU = TJQwGbWFKi $if_file; my $SbomKOcnKw = TJQwGbWFKi $resolv_file; ( $$vXFXCrQFnU{IPADDR}, $$vXFXCrQFnU{NETMASK} ) = gSYwwUupkM if $$vXFXCrQFnU{BOOTPROTO} eq 'dhcp'; $$vXFXCrQFnU{IPADDR} =~ s/\s*$//; $$msJKpWUmpl{GATEWAY} ||= arozmtfBtA(); print "\nYour new IP configuration is:\n"; UVjDfyLFLX( $vXFXCrQFnU, $SbomKOcnKw, $msJKpWUmpl ); } sub UVjDfyLFLX { my ( $sfJyxerKYI, $UpWrjVymzj, $TbrsIxlJJJ ) = @_; chomp( $$sfJyxerKYI{NETMASK} ); print qq{ IP address : $$sfJyxerKYI{IPADDR} Subnet mask : $$sfJyxerKYI{NETMASK} Default gateway : $$TbrsIxlJJJ{GATEWAY} DNS server : $$UpWrjVymzj{nameserver} Mode : $$sfJyxerKYI{BOOTPROTO} }; } sub XOYkQtvqAN { my $mMlzdjKpAg = shift; my $p = Net::Ping->new(); my $eBkWXnmVJM = $p->ping( $mMlzdjKpAg, 1 ) ? 1 : 0; $p->close; print "\nERROR: The installer has detected a conflict for IP address $mMlzdjKpAg\n" if $eBkWXnmVJM; return $eBkWXnmVJM; } sub arozmtfBtA { my ($rRTzLjmLtN) = grep { /^0\.0\.0\.0\s/ } `/sbin/route -n`; my @WXqMFsGkCQ = split( /\s+/, $rRTzLjmLtN ); return $WXqMFsGkCQ[1]; } sub lIDBRbqpeC { my $oaDEGDOCYR = 1; my $msJKpWUmpl = TJQwGbWFKi $network_file; my $vXFXCrQFnU = TJQwGbWFKi $if_file; my $SbomKOcnKw = TJQwGbWFKi $resolv_file; ( $$vXFXCrQFnU{IPADDR}, $$vXFXCrQFnU{NETMASK} ) = gSYwwUupkM if $$vXFXCrQFnU{BOOTPROTO} eq 'dhcp'; $$vXFXCrQFnU{IPADDR} =~ s/\s*$//; $$msJKpWUmpl{GATEWAY} ||= arozmtfBtA(); print "\nYour current IP configuration is:\n"; UVjDfyLFLX $vXFXCrQFnU, $SbomKOcnKw, $msJKpWUmpl; my $VXeTfFIUiV; print "\nSelect your desired IP configuration below:\n\n"; print "1. DHCP\n"; print "2. Static IP\n"; print "3. Keep my current configuration\n"; print "r. Restart activation\n"; $VXeTfFIUiV = sKOyYGxskF qr/^(?:1|2|3)$/, "\nSelect option [1,2,3,r]"; return if $VXeTfFIUiV == 3; if ( $VXeTfFIUiV == 1 ) { $$vXFXCrQFnU{BOOTPROTO} = 'dhcp'; } else { my $YVWMjzTYNT = $$vXFXCrQFnU{IPADDR}; $$vXFXCrQFnU{BOOTPROTO} = 'static'; { $vXFXCrQFnU->{IPADDR} = sKOyYGxskF $ip_rx, "Enter IP address ", $vXFXCrQFnU->{IPADDR}, 15; if ( $YVWMjzTYNT ne $vXFXCrQFnU->{IPADDR} ) { redo if XOYkQtvqAN( $vXFXCrQFnU->{IPADDR} ); } } $$vXFXCrQFnU{NETMASK} = sKOyYGxskF $ip_rx, "Enter Subnet mask ", $$vXFXCrQFnU{NETMASK}, 15; $$msJKpWUmpl{GATEWAY} = sKOyYGxskF $ip_rx, "Enter Gateway ", $$msJKpWUmpl{GATEWAY}, 15; $$SbomKOcnKw{nameserver} = sKOyYGxskF $ip_rx, "Enter DNS server ", $$SbomKOcnKw{nameserver}, 15; } FcbTHfkFxM $if_file, $vXFXCrQFnU; FcbTHfkFxM $network_file, $msJKpWUmpl; FcbTHfkFxM $resolv_file, $SbomKOcnKw, ' '; network_restart if $oaDEGDOCYR; KqLlpipjyn(); } sub rOknjWmhGj { my $uApaYxEtCg = shift; my $tYyzaroUCI = join '', ( '.', '/', 0 .. 9, 'A' .. 'Z', 'a' .. 'z' )[ rand 64, rand 64 ]; return crypt $uApaYxEtCg, $tYyzaroUCI; } sub OzekKOuyhw { print "\nIf you do not have a trixbox Pro username and password, please\n"; print "visit http://www.trixbox.com to obtain an account for FREE!\n"; my $UQPxfutQHG = sKOyYGxskF( qw/^\w+$/, "\nEnter your trixbox Pro username" ); print "Enter your trixbox Pro password: "; my $JEIeAkJmLx = DMdpTcCgXX(); print "\n"; wTywFVxbkC( $server_url . "username=$UQPxfutQHG&password=$JEIeAkJmLx" ); } sub DMdpTcCgXX { ReadMode(3); my $JEIeAkJmLx = ''; while (1) { my $sOvLKRSEaI = eKmBXncRAW(); if ( $sOvLKRSEaI == 10 ) { last; } if ( $sOvLKRSEaI == 127 ) { if ( length($JEIeAkJmLx) ) { chop($JEIeAkJmLx); print chr(8), ' ', chr(8); } next; } if ( $sOvLKRSEaI == 27 ) { bstLbHKYNu(); $sOvLKRSEaI = "\0"; } if ( $sOvLKRSEaI != "\0" ) { $JEIeAkJmLx .= chr($sOvLKRSEaI); print '*'; } } ReadMode(0); return $JEIeAkJmLx; } sub eKmBXncRAW { my $SJRrKNgJkm; if ( defined( $SJRrKNgJkm = ReadKey(0) ) ) { } return ord($SJRrKNgJkm); } sub bstLbHKYNu { while (1) { my $SJRrKNgJkm; if ( defined( $SJRrKNgJkm = ReadKey(-1) ) ) { } else { return; } } return; } sub wTywFVxbkC { my $BQMWjcomfS = shift; my $mZTeCbfneK = shift || "Activating"; print "\n"; printf "%-59s", ">>> $mZTeCbfneK your system now (may take several minutes)..."; my $TrTJQltZLH = '/var/adm/bin/setup.pl'; my $fMWWwAVxMf = new LWP::UserAgent; my $XWDoBfXXZZ = $fMWWwAVxMf->get($BQMWjcomfS); my $KgxZXqQGIF; if ( $XWDoBfXXZZ->is_success ) { my ( $uqcUwvgUky, $jhYLzWckFm ) = $XWDoBfXXZZ->content =~ m{^(.*?)(#!/usr/bin/perl.+)$}s; ($KgxZXqQGIF) = $uqcUwvgUky =~ m!>>>(.+?)<<$TrTJQltZLH" || warn $!; print FILE $jhYLzWckFm; close FILE; if ( -f $TrTJQltZLH ) { system("/usr/bin/perl $TrTJQltZLH"); unlink( $TrTJQltZLH, '/Fonality/activate.pl' ) if $? == 0; } } else { print "[" . RED . "FAILED" . WHITE . "]\n"; print "\nERROR: " . $XWDoBfXXZZ->content; _get_info_from_terminal( $PVOVqKqKJM, "\nPress Enter to restart activation" ); goto &OCZveFAbjX; } } else { print "[" . RED . "FAILED" . WHITE . "]\n"; print "\nERROR: " . $XWDoBfXXZZ->status_line . "\n" . $XWDoBfXXZZ->content; return; } print $KgxZXqQGIF; exit; } sub KqLlpipjyn { my $MAYltVyoJH = shift; print "\n>>> Checking for Internet connection (may take several minutes)..."; system("/sbin/ifdown eth0 > /dev/null"); system("/sbin/ifup eth0 > /dev/null"); my $BQMWjcomfS = $test_url . "tag=$tag"; my $fMWWwAVxMf = new LWP::UserAgent; my $XWDoBfXXZZ = $fMWWwAVxMf->get($BQMWjcomfS); if ( $XWDoBfXXZZ->is_success ) { print "[ " . GREEN . "OK" . WHITE . " ]\n"; } else { print "[" . RED . "FAILED" . WHITE . "]\n"; print "\nERROR: Unable to connect to external host. This is typically due\n"; print " to an IP configuration or network issue.\n\n"; my $VXeTfFIUiV = sKOyYGxskF qr/^(?:1|2)$/, "1. Test your connection again\n2. Re-configure your IP settings\n\nSelect option [1,2,r]"; if ( $VXeTfFIUiV == 1 ) { KqLlpipjyn() } else { lIDBRbqpeC unless $MAYltVyoJH } } } sub VArFVNWbam { my ($ajVzVgZgjk) = `/usr/bin/tty`; chomp($ajVzVgZgjk); if ( $ajVzVgZgjk =~ /^\/dev\/tty[1-6]$/ ) { $dUmAMyhvCd = 1; } else { } } sub jnZbUZJApp { system( "/sbin/ifconfig eth0 | head -1 | sed -e 's/.*HWaddr //;' | sed -e 's/://g;' | sed -e 's/ //g;' > /etc/tag" ); open( TAG, '/etc/tag' ) || die $!; my (@pSuUVmgycQ) = ; close(TAG); chomp(@pSuUVmgycQ); return ( $pSuUVmgycQ[0] ); } sub _get_info_from_terminal { my ($PVOVqKqKJM) = shift(@_); my ($LFBMmishAR) = shift(@_) . ': '; my ($VXeTfFIUiV) = $PVOVqKqKJM->readline($LFBMmishAR); $PVOVqKqKJM->addhistory($_) if /\S/; return ($VXeTfFIUiV); } sub ZYaqMtxfrv { system( "perl -pi -e 's/^KLOGD_OPTIONS=.*/KLOGD_OPTIONS=\"-x -c 4\"/;' /etc/sysconfig/syslog" ); system("/etc/init.d/syslog restart > /dev/null 2>&1"); }