⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eventsdaemon.pl

📁 voip开源项目
💻 PL
字号:
#!/usr/bin/perl# last update by solo 2008-1-8# add debug modeuse strict;use Socket;use DBI;use POSIX 'setsid';use FindBin qw($Bin);my $asterisk = '127.0.0.1';my $asteriskport = 5038;my $asteriskuser = '';my $asterisksecret = '';my $dbhost = '127.0.0.1';my $dbname = '';my $dbport = 3306;my $dbuser = '';my $dbpasswd = '';my %astInfo = (        asterisk => $asterisk,        asteriskport => $asteriskport,        asteriskuser => $asteriskuser,		asterisksecret  => $asterisksecret,   );my %dbInfo = (        dbtype => 'mysql',        dbhost => $dbhost,        dbname => $dbname,		dbport  => $dbport, 		dbuser  => $dbuser, 		dbpasswd  => $dbpasswd   );my $log_life = 180;$SIG{__DIE__}=\&log_die;$SIG{__WARN__}=\&log_warn;$|=1;################my $pid_file="/tmp/$asterisk.pid";my $pid=$$;my $daemon=0;if (!&connection_test){	print("Connection failed, please check the log file for detail.\n");	exit;}if ($ARGV[0] eq '-d'){	  $daemon=1;      $pid=&become_daemon;}open (HDW,">",$pid_file) or die "[EMERG] $!\n";print HDW $pid;close HDW;#CONNECTmy $SOCK = &connect_ami(host=>$asterisk,			port=>$asteriskport,			user=>$asteriskuser,		      secret=>$asterisksecret);my $dbh = &connect_mysql(dbname=>$dbname,			dbhost=>$dbhost,    			dbport=>$dbport,                        dbuser=>$dbuser,    			dbpasswd=>$dbpasswd);#&auto_create_table();#Get messagemy	$response;while (my $line = <$SOCK>) {	#LAST LINE	if ($line eq "\r\n") {		print "RECEIVE : $response-----------\n" if ($ARGV[0] ne '-d');		&putdb($response);		undef($response);	} else {		$line =~ s/\r/ /g;		$line =~ s/\n/ /g;		$response .= $line if $line;	}}close($SOCK);########################################sub connect_ami{my	%info = @_;#CONNECTmy     ($SOCK,$host,$addr,$msg);	$host = inet_aton($info{'host'});	socket($SOCK, AF_INET, SOCK_STREAM, getprotobyname('tcp'));	$addr = sockaddr_in($info{'port'},$host);	warn '[warn] Connect to Asterisk now';        foreach my $failed (0..3)                {                    if($failed >= 3){die '[Sorry] I try my best Connect to Asterisk Manager Port ,But I am tired!';}                    elsif(connect($SOCK,$addr)){last;}                    else                    {                    warn "[Sorry] Can not Connect to Asterisk Manager Port $!";                    #sleep 180;                    }                }	warn '[warn] Connect successful, Waiting for the message!';        $msg = <$SOCK>;       	if ($msg !~ /Asterisk Call Manager/) {die "[Sorry] Connect failed! Message is $msg";}	#LOGIN IN        warn '[warn] Login in Asterisk Manager';	send($SOCK, "ACTION: LOGIN\r\nUSERNAME: $info{'user'}\r\nSECRET: $info{'secret'}\r\nEVENTS: ON\r\n\r\n", 0);        $msg = <$SOCK>;        if ($msg =~ /Error/) {die '[Sorry] Login in failed! Maybe your name or password is error!';}return($SOCK);}##############################################sub connect_mysql{	my	%info = @_;	my	$dbh = DBI->connect("DBI:mysql:database=$info{'dbname'};host=$info{'dbhost'};port=$info{'dbport'}",$info{'dbuser'},$info{'dbpasswd'}) or die "Can't Connect Database Server: $!";	return($dbh);}###############################################sub auto_create_table{my	$sth = $dbh->prepare("show tables like 'events'");	$sth->execute or die $dbh->errstr;my	$row = $sth->fetchrow_arrayref();	$sth->finish;	#if to create table	if ($row->[0] eq '') {                warn "Auto Created table";		$dbh->do(qq~CREATE TABLE events(                        `id` INT(16) PRIMARY KEY AUTO_INCREMENT NOT NULL,                        `timestamp` DATETIME,                        `event` TEXT,                        INDEX `timestamp` (`timestamp`)) ENGINE = MyISAM;~) or die $dbh->errstr;			}return();}#######################################}sub putdb{my	$response = shift;	return if ($response eq '');	#if try to reconnect database	if (!$dbh->ping) {	     warn "Reconnect database";	     $dbh = &connect_mysql(dbname=>$dbname,                                   dbhost=>$dbhost,                                   dbport=>$dbport,                                   dbuser=>$dbuser,                                   dbpasswd=>$dbpasswd);	}	# Delete old    if($log_life>0){        my $timestamp = time();	$timestamp -= $log_life;        my @datetime = localtime($timestamp);	$datetime[5] += 1900;	$datetime[4]++;	$dbh->do("DELETE FROM events WHERE timestamp <= '$datetime[5]-$datetime[4]-$datetime[3] $datetime[2]:$datetime[1]:$datetime[0]'") or die $dbh->errstr;        }	#Insert new	$dbh->do("INSERT INTO events(timestamp,event) VALUES(now(),".$dbh->quote($response).")") or die $dbh->errstr;return();}##########################################sub become_daemon {    die "Can't fork" unless defined (my $child = fork);    exit 0 if $child;    setsid();    open( STDIN, "</dev/null" );    open( STDOUT, ">/dev/null" );    open( STDERR, ">&STDOUT" );    chdir '/';    umask(0);   $ENV{PATH} = '/bin:/sbin:/usr/bin:/usr/sbin';    return $$;}#############################################sub log_die{	my $message =shift;	my $time=scalar localtime;	open (HDW,">>$Bin/eventsdaemonlog.txt");	print HDW $time," ",$message;	close HDW;	exit;#die @_;}###############################################sub log_warn{	my $message =shift;	print $message;	my $time=scalar localtime;	open (HDW,">>$Bin/eventsdaemonlog.txt");	print HDW $time," ",$message;	close HDW;}###############################################sub connection_test{	my $result = 1;	&debug("Connecting to $dbInfo{'dbtype'} database on $dbInfo{'dbhost'}:");	my $dbh = &connect_mysql(%dbInfo);	if( !$dbh ){		&debug("Database connection unsuccessful. Please check your login detials. ".$DBI::errstr);		$result = 0;	}else{		&debug("Database connection successful.");	}	&debug("Connecting to asterisk on $astInfo{'asterisk'} port $astInfo{'asteriskport'}:");	$SOCK = &connect_sock(%astInfo);	if( !$SOCK ){		&debug("Asterisk connection failed. Please check your connect parameter.");		$result = 0;	}else{		my $msg = <$SOCK>;		if ($msg !~ /Asterisk Call Manager/) {			&debug("Asterisk connection failed!");			$result = 0;		}else{			&debug("Asterisk socket connection successful.");			# check username and password			&debug("Check asterisk username & secret:");			send($SOCK, "ACTION: LOGIN\r\nUSERNAME: $astInfo{'asteriskuser'}\r\nSECRET: $astInfo{'asterisksecret'}\r\n\r\n", 0);			my $msg = <$SOCK>;			if ($msg =~ /Response: Success/) {				&debug("Success");			}else{				&debug("Failed");				$result = 0;			}		}	}	return $result;}############################sub debug{	my $message = shift;	my $time=scalar localtime;	if ($ARGV[0] eq '-d'){		# output to file		open (HDW,">>$Bin/eventsdaemonlog.txt");		print HDW $time," ",$message,"\n";		close HDW;	}else{		print $time," ",$message,"\n";	}}############################sub connect_sock{	my	%info = @_;	#CONNECT	my	($SOCK,$host,$addr,$msg);	$host = inet_aton($info{'asterisk'});	socket($SOCK, AF_INET, SOCK_STREAM, getprotobyname('tcp'));	$addr = sockaddr_in(@info{'asteriskport'},$host);	my $test = connect($SOCK,$addr);	if ($test) {		return $SOCK;	}	return 0;}############################END{	if($daemon)		{		warn('eventsdaemon will in daemon start!');		}	else{		print "Thanks for using, eventsdaemon stopped!\n";		}	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -