#!/usr/bin/perl -CSD # Purpose: template toolkit helper script ################################################################################ use strict; use warnings; use YAML qw/LoadFile/; use Template; use Hash::Merge qw(merge); use DBI; sub sync_extra_sockets; sub db_connect; my $dbh; my $tt = Template->new({ ABSOLUTE => 1, RELATIVE => 1 }); my $config = {}; foreach my $file (@ARGV) { $config = merge($config, LoadFile($file) || die $!); } # rw connection to central node my $dbhost = $config->{database}->{central}->{dbhost}; my $dbport = $config->{database}->{central}->{dbport}; open my $SWFH, '<', '/etc/mysql/sipwise.cnf'; my $dbpass = join ' ', <$SWFH>; close $SWFH; $dbpass =~ s/^.*SIPWISE_DB_PASSWORD=\'([^\']+)\'.*$/$1/; chomp $dbpass; my $dbuser = 'sipwise'; my $dbname = $config->{ossbss}->{provisioning}->{database}->{name}; unless(defined $dbhost) { print "Could not determine provisioning db hostname\n"; exit 1; } unless(defined $dbport) { print "Could not determine provisioning db port\n"; exit 1; } unless(defined $dbname) { print "Could not determine provisioning db name\n"; exit 1; } unless(defined $dbuser) { print "Could not determine provisioning db user\n"; exit 1; } unless(defined $dbpass) { print "Could not determine provisioning db password\n"; exit 1; } $dbh = db_connect(); exit 1 unless(sync_extra_sockets($dbh, $config->{kamailio}->{lb}->{extra_sockets})); $dbh->disconnect; # this part sync with kamailio db $dbuser = $config->{kamailio}->{proxy}->{dbrwuser}; $dbname = $config->{kamailio}->{proxy}->{dbname}; $dbpass = $config->{kamailio}->{proxy}->{dbrwpw}; unless(defined $dbname) { print "Could not determine kamailio db name\n"; exit 1; } unless(defined $dbuser) { print "Could not determine kamailio db user\n"; exit 1; } unless(defined $dbpass) { print "Could not determine kamailio db password\n"; exit 1; } $dbh = db_connect(); exit 1 unless(sync_faxserver_uris($dbh, $config->{faxserver}->{fax_gateways})); $dbh->disconnect; exit 0; sub db_connect { my $dbh = DBI->connect("DBI:mysql:database=${dbname};host=${dbhost};port=${dbport}", $dbuser, $dbpass, { PrintError => 1 }); unless(defined $dbh) { print "Could not connect to database '$dbname' at '$dbhost:$dbport' as '${dbuser}': $DBI::errstr\n"; exit 1; } return $dbh; } ## kamailio.lb.extra_sockets handling: ############################## sub sync_extra_sockets { my $dbh = shift; my $sockets = shift; my $pref_name = 'outbound_socket'; my $sth = $dbh->prepare("select id from voip_preferences where attribute=?"); $sth->execute($pref_name); my $res = $sth->fetchrow_hashref(); unless(defined $res) { print "Could not find preference '$pref_name' in db\n"; return; } my $pref_id = $res->{id}; $sth->finish; my $enum_insert_sth = $dbh->prepare("insert into voip_preferences_enum (preference_id, label, value, usr_pref, dom_pref, peer_pref) values(?, ?, ?, 1, 1, 1)"); my $enum_update_sth = $dbh->prepare("update voip_preferences_enum set value=? where id=?"); my $enum_delete_sth = $dbh->prepare("delete from voip_preferences_enum where id=?"); $sth = $dbh->prepare("select id, label, value from voip_preferences_enum where preference_id=?"); $sth->execute($pref_id); my $dbsockets = $sth->fetchall_hashref('label'); $sth->finish; foreach my $row (keys %{$dbsockets}) { $row = $dbsockets->{$row}; next if($row->{label} eq 'default'); if(!exists $sockets->{$row->{label}}) { print "socket $row->{label} does not exist anymore in config, delete from db\n"; $enum_delete_sth->execute($row->{id}); } elsif($sockets->{$row->{label}} ne $row->{value}) { print "update $row->{label}=$row->{value} to $row->{label}=$sockets->{$row->{label}} in db\n"; $enum_update_sth->execute($sockets->{$row->{label}}, $row->{id}); delete $sockets->{$row->{label}}; } else { print "socket $row->{label}=$row->{value} is sync between config and db\n"; delete $sockets->{$row->{label}}; } } foreach my $sock(keys %{$sockets}) { print "insert new socket $sock=$sockets->{$sock} from config into db\n"; $enum_insert_sth->execute($pref_id, $sock, $sockets->{$sock}); } $enum_insert_sth->finish; $enum_update_sth->finish; $enum_delete_sth->finish; return 1; } ## faxserver.hw_fax_gateways handling: ############################## sub sync_faxserver_uris { my $dbh = shift; my $yaml_fax_gateways = shift; my $fax_set_id = 4; my $reload_dispatcher = 0; my $dispatcher_insert_sth = $dbh->prepare("insert into dispatcher (setid, destination, flags, priority, description) values(4, ?, 0, 0, 'Fax2Mail Servers')"); my $dispatcher_delete_sth = $dbh->prepare("delete from dispatcher where id=?"); my $sth = $dbh->prepare("select id,destination from dispatcher where setid=?"); $sth->execute($fax_set_id); my $db_fax_gateways = $sth->fetchall_hashref('destination'); $sth->finish; # array reference unless(defined $yaml_fax_gateways) { return 1; } my @tmp_array = @{$yaml_fax_gateways}; # turn the array into hash reference my $fax_gateways = {}; foreach my $gw (@tmp_array) { # e.g: sip:127.0.0.1:5070/255.255.255.0, remove /255.255.255.0 my @new_gw_parts = split('/', $gw); my $gw_sip_parts = $new_gw_parts[0]; $fax_gateways->{$gw_sip_parts} = 1 ; } foreach my $row (keys %{$db_fax_gateways}) { $row = $db_fax_gateways->{$row}; if(!exists $fax_gateways->{$row->{destination}}) { print "fax gateway $row->{destination} does not exist anymore in config, delete from db\n"; $dispatcher_delete_sth->execute($row->{id}); $reload_dispatcher ||= 1; } else { print "fax gateway $row->{destination} sync between config and db\n"; delete $fax_gateways->{$row->{destination}}; } } foreach my $fax_gw(keys %{$fax_gateways}) { print "insert new fax gateway $fax_gw from config into db\n"; $dispatcher_insert_sth->execute($fax_gw); $reload_dispatcher ||= 1; } $dispatcher_insert_sth->finish; $dispatcher_delete_sth->finish; if($reload_dispatcher){ print "fax gateway changes, need to reload kamailio dispatcher ... \n"; my $result = `ngcp-kamctl proxy dispatcher reload`; print "reload kamailio dispatcher done, status was: $? \n"; } return 1; } ## END OF FILE #################################################################