diff --git a/gosa-si/gosa-si-server b/gosa-si/gosa-si-server
index f815130f14495db8883fdad8d6842b4f21d0973b..f5191fbda5267e9ee31781f42579c5f970ea45df 100755 (executable)
--- a/gosa-si/gosa-si-server
+++ b/gosa-si/gosa-si-server
use File::Find;
use File::Copy;
use File::Path;
-use GOSA::DBsqlite;
use GOSA::GosaSupportDaemon;
use POE qw(Component::Server::TCP Wheel::Run Filter::Reference);
use Net::LDAP;
use Net::LDAP::Util qw(:escape);
use Time::HiRes qw( usleep);
-use DateTime;
+
+my $db_module = "DBsqlite";
+{
+no strict "refs";
+require ("GOSA/".$db_module.".pm");
+("GOSA/".$db_module)->import;
+daemon_log("0 INFO: importing database module '$db_module'", 1);
+}
my $modules_path = "/usr/lib/gosa-si/modules";
use lib "/usr/lib/gosa-si/modules";
my ($server);
my ($gosa_server, $job_queue_timeout, $job_queue_loop_delay);
my ($messaging_db_loop_delay);
-my ($known_modules);
my ($procid, $pid);
my ($arp_fifo);
my ($xml);
my %repo_files=();
my $repo_path;
my %repo_dirs=();
-# variables declared in config file are always set to 'our'
+
+# Variables declared in config file are always set to 'our'
our (%cfg_defaults, $log_file, $pid_file,
- $server_ip, $server_port, $ClientPackages_key,
+ $server_ip, $server_port, $ClientPackages_key, $dns_lookup,
$arp_activ, $gosa_unit_tag,
$GosaPackages_key, $gosa_timeout,
$foreign_server_string, $server_domain, $ServerPackages_key, $foreign_servers_register_delay,
$wake_on_lan_passwd, $job_synchronization, $modified_jobs_loop_delay,
$arp_enabled, $arp_interface,
$opsi_enabled, $opsi_server, $opsi_admin, $opsi_password,
+ $new_systems_ou,
);
# additional variable which should be globaly accessable
our $forground;
our $cfg_file;
our ($ldap_uri, $ldap_base, $ldap_admin_dn, $ldap_admin_password, $ldap_server_dn);
+our ($mysql_username, $mysql_password, $mysql_database, $mysql_host);
+our $known_modules;
+our $root_uid;
+our $adm_gid;
+
# specifies the verbosity of the daemon_log
$verbose = 0 ;
our $incoming_db;
our $incoming_tn = 'incoming';
my $incoming_file_name;
-my @incoming_col_names = ("id INTEGER PRIMARY KEY",
- "timestamp DEFAULT 'none'",
- "headertag DEFAULT 'none'",
- "targettag DEFAULT 'none'",
- "xmlmessage DEFAULT 'none'",
- "module DEFAULT 'none'",
- "sessionid DEFAULT '0'",
- );
+my @incoming_col_names = ("id INTEGER PRIMARY KEY auto_increment",
+ "timestamp VARCHAR(14) DEFAULT 'none'",
+ "headertag VARCHAR(255) DEFAULT 'none'",
+ "targettag VARCHAR(255) DEFAULT 'none'",
+ "xmlmessage TEXT",
+ "module VARCHAR(255) DEFAULT 'none'",
+ "sessionid VARCHAR(255) DEFAULT '0'",
+);
# holds all gosa jobs
our $job_db;
our $job_queue_tn = 'jobs';
my $job_queue_file_name;
-my @job_queue_col_names = ("id INTEGER PRIMARY KEY",
- "timestamp DEFAULT 'none'",
- "status DEFAULT 'none'",
- "result DEFAULT 'none'",
- "progress DEFAULT 'none'",
- "headertag DEFAULT 'none'",
- "targettag DEFAULT 'none'",
- "xmlmessage DEFAULT 'none'",
- "macaddress DEFAULT 'none'",
- "plainname DEFAULT 'none'",
- "siserver DEFAULT 'none'",
- "modified DEFAULT '0'",
- );
+my @job_queue_col_names = ("id INTEGER PRIMARY KEY auto_increment",
+ "timestamp VARCHAR(14) DEFAULT 'none'",
+ "status VARCHAR(255) DEFAULT 'none'",
+ "result TEXT",
+ "progress VARCHAR(255) DEFAULT 'none'",
+ "headertag VARCHAR(255) DEFAULT 'none'",
+ "targettag VARCHAR(255) DEFAULT 'none'",
+ "xmlmessage TEXT",
+ "macaddress VARCHAR(17) DEFAULT 'none'",
+ "plainname VARCHAR(255) DEFAULT 'none'",
+ "siserver VARCHAR(255) DEFAULT 'none'",
+ "modified INTEGER DEFAULT '0'",
+);
# holds all other gosa-si-server
our $known_server_db;
our $known_server_tn = "known_server";
my $known_server_file_name;
-my @known_server_col_names = ("hostname", "status", "hostkey", "timestamp");
+my @known_server_col_names = ("hostname VARCHAR(255)", "macaddress VARCHAR(17)", "status VARCHAR(255)", "hostkey VARCHAR(255)", "loaded_modules TEXT", "timestamp VARCHAR(14)");
# holds all registrated clients
our $known_clients_db;
our $known_clients_tn = "known_clients";
my $known_clients_file_name;
-my @known_clients_col_names = ("hostname", "status", "hostkey", "timestamp", "macaddress", "events", "keylifetime");
+my @known_clients_col_names = ("hostname VARCHAR(255)", "status VARCHAR(255)", "hostkey VARCHAR(255)", "timestamp VARCHAR(14)", "macaddress VARCHAR(17)", "events TEXT", "keylifetime VARCHAR(255)");
# holds all registered clients at a foreign server
our $foreign_clients_db;
our $foreign_clients_tn = "foreign_clients";
my $foreign_clients_file_name;
-my @foreign_clients_col_names = ("hostname", "macaddress", "regserver", "timestamp");
+my @foreign_clients_col_names = ("hostname VARCHAR(255)", "macaddress VARCHAR(17)", "regserver VARCHAR(255)", "timestamp VARCHAR(14)");
# holds all logged in user at each client
our $login_users_db;
our $login_users_tn = "login_users";
my $login_users_file_name;
-my @login_users_col_names = ("client", "user", "timestamp");
+my @login_users_col_names = ("client VARCHAR(255)", "user VARCHAR(255)", "timestamp VARCHAR(14)");
# holds all fai server, the debian release and tag
our $fai_server_db;
our $fai_server_tn = "fai_server";
my $fai_server_file_name;
-our @fai_server_col_names = ("timestamp", "server", "release", "sections", "tag");
+our @fai_server_col_names = ("timestamp VARCHAR(14)", "server VARCHAR(255)", "fai_release VARCHAR(255)", "sections VARCHAR(255)", "tag VARCHAR(255)");
our $fai_release_db;
our $fai_release_tn = "fai_release";
my $fai_release_file_name;
-our @fai_release_col_names = ("timestamp", "release", "class", "type", "state");
+our @fai_release_col_names = ("timestamp VARCHAR(14)", "fai_release VARCHAR(255)", "class VARCHAR(255)", "type VARCHAR(255)", "state VARCHAR(255)");
# holds all packages available from different repositories
our $packages_list_db;
our $packages_list_tn = "packages_list";
my $packages_list_file_name;
-our @packages_list_col_names = ("distribution", "package", "version", "section", "description", "template", "timestamp");
+our @packages_list_col_names = ("distribution VARCHAR(255)", "package VARCHAR(255)", "version VARCHAR(255)", "section VARCHAR(255)", "description TEXT", "template LONGBLOB", "timestamp VARCHAR(14)");
my $outdir = "/tmp/packages_list_db";
my $arch = "i386";
# holds all messages which should be delivered to a user
our $messaging_db;
our $messaging_tn = "messaging";
-our @messaging_col_names = ("id INTEGER", "subject", "message_from", "message_to",
- "flag", "direction", "delivery_time", "message", "timestamp" );
+our @messaging_col_names = ("id INTEGER", "subject TEXT", "message_from VARCHAR(255)", "message_to VARCHAR(255)",
+ "flag VARCHAR(255)", "direction VARCHAR(255)", "delivery_time VARCHAR(255)", "message TEXT", "timestamp VARCHAR(14)" );
my $messaging_file_name;
# path to directory to store client install log files
our $client_fai_log_dir = "/var/log/fai";
# queue which stores taskes until one of the $max_children children are ready to process the task
-my @tasks = qw();
+#my @tasks = qw();
my @msgs_to_decrypt = qw();
my $max_children = 2;
our $opsi_client;
our $opsi_url;
+# Lifetime of logged in user information. If no update information comes after n seconds,
+# the user is expeceted to be no longer logged in or the host is no longer running. Because
+# of this, the user is deleted from login_users_db
+our $logged_in_user_date_of_expiry = 600;
%cfg_defaults = (
"pid-file" => [\$pid_file, "/var/run/".$prg.".pid"],
},
"server" => {
- "ip" => [\$server_ip, "0.0.0.0"],
- "port" => [\$server_port, "20081"],
- "known-clients" => [\$known_clients_file_name, '/var/lib/gosa-si/clients.db' ],
- "known-servers" => [\$known_server_file_name, '/var/lib/gosa-si/servers.db'],
- "incoming" => [\$incoming_file_name, '/var/lib/gosa-si/incoming.db'],
- "login-users" => [\$login_users_file_name, '/var/lib/gosa-si/users.db'],
- "fai-server" => [\$fai_server_file_name, '/var/lib/gosa-si/fai_server.db'],
- "fai-release" => [\$fai_release_file_name, '/var/lib/gosa-si/fai_release.db'],
- "packages-list" => [\$packages_list_file_name, '/var/lib/gosa-si/packages.db'],
- "messaging" => [\$messaging_file_name, '/var/lib/gosa-si/messaging.db'],
- "foreign-clients" => [\$foreign_clients_file_name, '/var/lib/gosa-si/foreign_clients.db'],
- "source-list" => [\$sources_list, '/etc/apt/sources.list'],
- "repo-path" => [\$repo_path, '/srv/www/repository'],
- "ldap-uri" => [\$ldap_uri, ""],
- "ldap-base" => [\$ldap_base, ""],
- "ldap-admin-dn" => [\$ldap_admin_dn, ""],
- "ldap-admin-password" => [\$ldap_admin_password, ""],
- "gosa-unit-tag" => [\$gosa_unit_tag, ""],
- "max-clients" => [\$max_clients, 10],
- "wol-password" => [\$wake_on_lan_passwd, ""],
+ "ip" => [\$server_ip, "0.0.0.0"],
+ "port" => [\$server_port, "20081"],
+ "known-clients" => [\$known_clients_file_name, '/var/lib/gosa-si/clients.db' ],
+ "known-servers" => [\$known_server_file_name, '/var/lib/gosa-si/servers.db'],
+ "incoming" => [\$incoming_file_name, '/var/lib/gosa-si/incoming.db'],
+ "login-users" => [\$login_users_file_name, '/var/lib/gosa-si/users.db'],
+ "fai-server" => [\$fai_server_file_name, '/var/lib/gosa-si/fai_server.db'],
+ "fai-release" => [\$fai_release_file_name, '/var/lib/gosa-si/fai_release.db'],
+ "packages-list" => [\$packages_list_file_name, '/var/lib/gosa-si/packages.db'],
+ "messaging" => [\$messaging_file_name, '/var/lib/gosa-si/messaging.db'],
+ "foreign-clients" => [\$foreign_clients_file_name, '/var/lib/gosa-si/foreign_clients.db'],
+ "source-list" => [\$sources_list, '/etc/apt/sources.list'],
+ "repo-path" => [\$repo_path, '/srv/www/repository'],
+ "ldap-uri" => [\$ldap_uri, ""],
+ "ldap-base" => [\$ldap_base, ""],
+ "ldap-admin-dn" => [\$ldap_admin_dn, ""],
+ "ldap-admin-password" => [\$ldap_admin_password, ""],
+ "gosa-unit-tag" => [\$gosa_unit_tag, ""],
+ "max-clients" => [\$max_clients, 10],
+ "wol-password" => [\$wake_on_lan_passwd, ""],
+ "mysql-username" => [\$mysql_username, "gosa_si"],
+ "mysql-password" => [\$mysql_password, ""],
+ "mysql-database" => [\$mysql_database, "gosa_si"],
+ "mysql-host" => [\$mysql_host, "127.0.0.1"],
},
"GOsaPackages" => {
"job-queue" => [\$job_queue_file_name, '/var/lib/gosa-si/jobs.db'],
"job-queue-loop-delay" => [\$job_queue_loop_delay, 3],
"messaging-db-loop-delay" => [\$messaging_db_loop_delay, 3],
"key" => [\$GosaPackages_key, "none"],
+ "new-systems-ou" => [\$new_systems_ou, 'ou=workstations,ou=systems'],
},
"ClientPackages" => {
"key" => [\$ClientPackages_key, "none"],
+ "user-date-of-expiry" => [\$logged_in_user_date_of_expiry, 600],
},
"ServerPackages"=> {
"address" => [\$foreign_server_string, ""],
+ "dns-lookup" => [\$dns_lookup, "true"],
"domain" => [\$server_domain, ""],
"key" => [\$ServerPackages_key, "none"],
"key-lifetime" => [\$foreign_servers_register_delay, 120],
if(not defined $level) { $level = 1 }
if(defined $log_file){
open(LOG_HANDLE, ">>$log_file");
- chmod 0600, $log_file;
if(not defined open( LOG_HANDLE, ">>$log_file" )) {
print STDERR "cannot open $log_file: $!";
return
eval { require $file; };
if ($@) {
daemon_log("0 ERROR: gosa-si-server could not load module $file", 1);
- daemon_log("$@", 5);
+ daemon_log("$@", 1);
+ exit;
} else {
my $info = eval($mod_name.'::get_module_info()');
# Only load module if get_module_info() returns a non-null object
if( $info ) {
- my ($input_address, $input_key, $input, $input_active, $input_type) = @{$info};
+ my ($input_address, $input_key, $event_hash) = @{$info};
$known_modules->{$mod_name} = $info;
daemon_log("0 INFO: module $mod_name loaded", 5);
}
if ($msg =~ /<xml>/i){
$msg =~ s/\s+/ /g; # just for better daemon_log
- daemon_log("$session_id DEBUG: decrypted_msg: \n$msg", 8);
+ daemon_log("$session_id DEBUG: decrypted_msg: \n$msg", 9);
$msg_hash = $xml->XMLin($msg, ForceArray=>1);
##############
# check header
if( not exists $msg_hash->{'header'} ) { die "no header specified"; }
my $header_l = $msg_hash->{'header'};
- if( 1 > @{$header_l} ) { die 'empty header tag'; }
+ if( (1 > @{$header_l}) || ( ( 'HASH' eq ref @{$header_l}[0]) && (1 > keys %{@{$header_l}[0]}) ) ) { die 'empty header tag'; }
if( 1 < @{$header_l} ) { die 'more than one header specified'; }
my $header = @{$header_l}[0];
if( 0 == length $header) { die 'empty string in header tag'; }
# check source
if( not exists $msg_hash->{'source'} ) { die "no source specified"; }
my $source_l = $msg_hash->{'source'};
- if( 1 > @{$source_l} ) { die 'empty source tag'; }
+ if( (1 > @{$source_l}) || ( ( 'HASH' eq ref @{$source_l}[0]) && (1 > keys %{@{$source_l}[0]}) ) ) { die 'empty source tag'; }
if( 1 < @{$source_l} ) { die 'more than one source specified'; }
my $source = @{$source_l}[0];
if( 0 == length $source) { die 'source error'; }
# check target
if( not exists $msg_hash->{'target'} ) { die "no target specified"; }
my $target_l = $msg_hash->{'target'};
- if( 1 > @{$target_l} ) { die 'empty target tag'; }
+ if( (1 > @{$target_l}) || ( ('HASH' eq ref @{$target_l}[0]) && (1 > keys %{@{$target_l}[0]}) ) ) { die 'empty target tag'; }
}
};
if($@) {
if( 0 == length $source) {
die 'source has length 0';
}
+
+ # Check if source contains hostname instead of ip address
+ if(not $source =~ /^[a-z0-9\.]+:\d+$/i) {
+ my ($hostname,$port) = split(/:/, $source);
+ my $ip_address = inet_ntoa(scalar gethostbyname($hostname));
+ if(defined($ip_address) && $ip_address =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/ && $port =~ /^\d+$/) {
+ # Write ip address to $source variable
+ $source = "$ip_address:$port";
+ }
+ }
unless( $source =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d+$/ ||
- $source =~ /^GOSA$/i ) {
+ $source =~ /^GOSA$/i) {
die "source '$source' is neither a complete ip-address with port nor 'GOSA'";
}
$msg = $tmp_msg;
$msg_hash = $tmp_msg_hash;
$module = "ServerPackages";
+ daemon_log("$session_id DEBUG: check_key_and_xml_validity... ok", 7);
last;
}
}
}
else {
$module = "ClientPackages";
+ daemon_log("$session_id DEBUG: check_key_and_xml_validity... ok", 7);
last;
}
}
sub input_from_unknown_host {
- no strict "refs";
- my ($input, $session_id) = @_ ;
- my ($msg, $msg_hash, $module);
- my $error_string;
-
+ no strict "refs";
+ my ($input, $session_id) = @_ ;
+ my ($msg, $msg_hash, $module);
+ my $error_string;
+
my %act_modules = %$known_modules;
-
- while( my ($mod, $info) = each(%act_modules)) {
- # check a key exists for this module
- my $module_key = ${$mod."_key"};
- if( not defined $module_key ) {
- if( $mod eq 'ArpHandler' ) {
- next;
- }
- daemon_log("$session_id ERROR: no key specified in config file for $mod", 1);
- next;
- }
- daemon_log("$session_id DEBUG: $mod: $module_key", 7);
+ while( my ($mod, $info) = each(%act_modules)) {
- # check if module can open msg envelope with module key
- ($msg, $msg_hash) = &check_key_and_xml_validity($input, $module_key, $session_id);
- if( (not defined $msg) || (not defined $msg_hash) ) {
- next;
- }
- else {
- $module = $mod;
- last;
- }
- }
+ # check a key exists for this module
+ my $module_key = ${$mod."_key"};
+ if( not defined $module_key ) {
+ if( $mod eq 'ArpHandler' ) {
+ next;
+ }
+ daemon_log("$session_id ERROR: no key specified in config file for $mod", 1);
+ next;
+ }
+ daemon_log("$session_id DEBUG: $mod: $module_key", 7);
- if( (!$msg) || (!$msg_hash) || (!$module)) {
- daemon_log("$session_id DEBUG: Incoming message is not from an unknown host", 7);
- }
+ # check if module can open msg envelope with module key
+ ($msg, $msg_hash) = &check_key_and_xml_validity($input, $module_key, $session_id);
+ if( (not defined $msg) || (not defined $msg_hash) ) {
+ next;
+ } else {
+ $module = $mod;
+ daemon_log("$session_id DEBUG: check_key_and_xml_validity... ok", 7);
+ last;
+ }
+ }
- return ($msg, $msg_hash, $module);
+ if( (!$msg) || (!$msg_hash) || (!$module)) {
+ daemon_log("$session_id DEBUG: Incoming message is not from an unknown host", 7);
+ }
+
+ return ($msg, $msg_hash, $module);
}
}
-sub get_local_ip_for_remote_ip {
- my $remote_ip= shift;
- my $result="0.0.0.0";
-
- if($remote_ip =~ /^(\d\d?\d?\.){3}\d\d?\d?$/) {
- if($remote_ip eq "127.0.0.1") {
- $result = "127.0.0.1";
- } else {
- my $PROC_NET_ROUTE= ('/proc/net/route');
-
- open(PROC_NET_ROUTE, "<$PROC_NET_ROUTE")
- or die "Could not open $PROC_NET_ROUTE";
-
- my @ifs = <PROC_NET_ROUTE>;
-
- close(PROC_NET_ROUTE);
-
- # Eat header line
- shift @ifs;
- chomp @ifs;
- foreach my $line(@ifs) {
- my ($Iface,$Destination,$Gateway,$Flags,$RefCnt,$Use,$Metric,$Mask,$MTU,$Window,$IRTT)=split(/\s/, $line);
- my $destination;
- my $mask;
- my ($d,$c,$b,$a)=unpack('a2 a2 a2 a2', $Destination);
- $destination= sprintf("%d.%d.%d.%d", hex($a), hex($b), hex($c), hex($d));
- ($d,$c,$b,$a)=unpack('a2 a2 a2 a2', $Mask);
- $mask= sprintf("%d.%d.%d.%d", hex($a), hex($b), hex($c), hex($d));
- if(new NetAddr::IP($remote_ip)->within(new NetAddr::IP($destination, $mask))) {
- # destination matches route, save mac and exit
- $result= &get_ip($Iface);
- last;
- }
- }
- }
- } else {
- daemon_log("0 WARNING: get_local_ip_for_remote_ip() was called with a non-ip parameter: '$remote_ip'", 1);
- }
- return $result;
-}
+#sub get_local_ip_for_remote_ip {
+# my $remote_ip= shift;
+# my $result="0.0.0.0";
+#
+# if($remote_ip =~ /^(\d\d?\d?\.){3}\d\d?\d?$/) {
+# if($remote_ip eq "127.0.0.1") {
+# $result = "127.0.0.1";
+# } else {
+# my $PROC_NET_ROUTE= ('/proc/net/route');
+#
+# open(PROC_NET_ROUTE, "<$PROC_NET_ROUTE")
+# or die "Could not open $PROC_NET_ROUTE";
+#
+# my @ifs = <PROC_NET_ROUTE>;
+#
+# close(PROC_NET_ROUTE);
+#
+# # Eat header line
+# shift @ifs;
+# chomp @ifs;
+# foreach my $line(@ifs) {
+# my ($Iface,$Destination,$Gateway,$Flags,$RefCnt,$Use,$Metric,$Mask,$MTU,$Window,$IRTT)=split(/\s/, $line);
+# my $destination;
+# my $mask;
+# my ($d,$c,$b,$a)=unpack('a2 a2 a2 a2', $Destination);
+# $destination= sprintf("%d.%d.%d.%d", hex($a), hex($b), hex($c), hex($d));
+# ($d,$c,$b,$a)=unpack('a2 a2 a2 a2', $Mask);
+# $mask= sprintf("%d.%d.%d.%d", hex($a), hex($b), hex($c), hex($d));
+# if(new NetAddr::IP($remote_ip)->within(new NetAddr::IP($destination, $mask))) {
+# # destination matches route, save mac and exit
+# $result= &get_ip($Iface);
+# last;
+# }
+# }
+# }
+# } else {
+# daemon_log("0 WARNING: get_local_ip_for_remote_ip() was called with a non-ip parameter: '$remote_ip'", 1);
+# }
+# return $result;
+#}
sub send_msg_to_target {
sub update_jobdb_status_for_send_msgs {
- my ($answer, $error) = @_;
+ my ($session_id, $answer, $error) = @_;
if( $answer =~ /<jobdb_id>(\d+)<\/jobdb_id>/ ) {
my $jobdb_id = $1;
+
+ $answer =~ /<header>(.*)<\/header>/;
+ my $job_header = $1;
+
+ $answer =~ /<target>(.*)<\/target>/;
+ my $job_target = $1;
- # sending msg faild
+ # sending msg failed
if( $error ) {
- if (not $answer =~ /<header>trigger_action_reinstall<\/header>/) {
+
+ # JUST FOR TESTING
+ daemon_log("D \n$error\n$answer");
+
+ # set jobs to done, jobs do not need to deliver their message in any case
+ if (($job_header eq "trigger_action_localboot")
+ ||($job_header eq "trigger_action_lock")
+ ||($job_header eq "trigger_action_halt")
+ ) {
+ my $sql_statement = "UPDATE $job_queue_tn SET status='done' WHERE id=$jobdb_id";
+ my $res = $job_db->update_dbentry($sql_statement);
+
+ # reactivate jobs, jobs need to deliver their message
+ } elsif (($job_header eq "trigger_action_activate")
+ ||($job_header eq "trigger_action_update")
+ ||($job_header eq "trigger_action_reinstall")
+ ) {
+ &reactivate_job_with_delay($session_id, $job_target, $job_header, 30 );
+
+ # for all other messages
+ } else {
my $sql_statement = "UPDATE $job_queue_tn ".
"SET status='error', result='can not deliver msg, please consult log file' ".
"WHERE id=$jobdb_id";
my $res = $job_db->update_dbentry($sql_statement);
+
}
# sending msg was successful
} else {
- my $sql_statement = "UPDATE $job_queue_tn ".
- "SET status='done' ".
- "WHERE id=$jobdb_id AND status='processed'";
- my $res = $job_db->update_dbentry($sql_statement);
+ # set jobs localboot, lock, activate, halt, reboot and wake to done
+ # jobs reinstall, update, inst_update do themself setting to done
+ if (($job_header eq "trigger_action_localboot")
+ ||($job_header eq "trigger_action_lock")
+ ||($job_header eq "trigger_action_activate")
+ ||($job_header eq "trigger_action_halt")
+ ||($job_header eq "trigger_action_reboot")
+ ||($job_header eq "trigger_action_wake")
+ ) {
+
+ my $sql_statement = "UPDATE $job_queue_tn ".
+ "SET status='done' ".
+ "WHERE id=$jobdb_id AND status='processed'";
+ my $res = $job_db->update_dbentry($sql_statement);
+ }
}
}
}
+sub reactivate_job_with_delay {
+ my ($session_id, $target, $header, $delay) = @_ ;
+ # Sometimes the client is still booting or does not wake up, in this case reactivate the job (if it exists) with a delay of n sec
+
+ if (not defined $delay) { $delay = 30 } ;
+ my $delay_timestamp = &calc_timestamp(&get_time(), "plus", $delay);
+
+ my $sql = "UPDATE $job_queue_tn Set timestamp='$delay_timestamp', status='waiting' WHERE (macaddress='$target' AND headertag='$header')";
+ my $res = $job_db->update_dbentry($sql);
+ daemon_log("$session_id INFO: '$header'-job will be reactivated at '$delay_timestamp' ".
+ "cause client '$target' is currently not available", 5);
+ daemon_log("$session_id $sql", 7);
+ return;
+}
+
sub sig_handler {
my ($kernel, $signal) = @_[KERNEL, ARG0] ;
sub msg_to_decrypt {
- my ($kernel, $session, $heap) = @_[KERNEL, SESSION, HEAP];
- my $session_id = $session->ID;
- my ($msg, $msg_hash, $module);
- my $error = 0;
+ my ($kernel, $session, $heap) = @_[KERNEL, SESSION, HEAP];
+ my $session_id = $session->ID;
+ my ($msg, $msg_hash, $module);
+ my $error = 0;
- # hole neue msg aus @msgs_to_decrypt
- my $next_msg = shift @msgs_to_decrypt;
-
- # entschlüssle sie
+ # hole neue msg aus @msgs_to_decrypt
+ my $next_msg = shift @msgs_to_decrypt;
- # msg is from a new client or gosa
- ($msg, $msg_hash, $module) = &input_from_unknown_host($next_msg, $session_id);
- # msg is from a gosa-si-server
- if(( !$msg ) || ( !$msg_hash ) || ( !$module )){
- ($msg, $msg_hash, $module) = &input_from_known_server($next_msg, $heap->{'remote_ip'}, $session_id);
- }
- # msg is from a gosa-si-client
- if(( !$msg ) || ( !$msg_hash ) || ( !$module )){
- ($msg, $msg_hash, $module) = &input_from_known_client($next_msg, $heap->{'remote_ip'}, $session_id);
- }
- # an error occurred
- if(( !$msg ) || ( !$msg_hash ) || ( !$module )){
- # if an incoming msg could not be decrypted (maybe a wrong key), send client a ping. If the client
- # could not understand a msg from its server the client cause a re-registering process
- daemon_log("$session_id WARNING cannot understand incoming msg, send 'ping'-msg to all host with ip '".$heap->{remote_ip}.
- "' to cause a re-registering of the client if necessary", 3);
- my $sql_statement = "SELECT * FROM $main::known_clients_tn WHERE (hostname LIKE '".$heap->{'remote_ip'}."%')";
- my $query_res = $known_clients_db->select_dbentry( $sql_statement );
- while( my ($hit_num, $hit) = each %{ $query_res } ) {
- my $host_name = $hit->{'hostname'};
- my $host_key = $hit->{'hostkey'};
- my $ping_msg = "<xml> <header>gosa_ping</header> <source>$server_address</source> <target>$host_name</target></xml>";
- my $error = &send_msg_to_target($ping_msg, $host_name, $host_key, "gosa_ping", $session_id);
- &update_jobdb_status_for_send_msgs($ping_msg, $error);
- }
- $error++;
- }
+ # msg is from a new client or gosa
+ ($msg, $msg_hash, $module) = &input_from_unknown_host($next_msg, $session_id);
+ # msg is from a gosa-si-server
+ if(( !$msg ) || ( !$msg_hash ) || ( !$module )){
+ ($msg, $msg_hash, $module) = &input_from_known_server($next_msg, $heap->{'remote_ip'}, $session_id);
+ }
+ # msg is from a gosa-si-client
+ if(( !$msg ) || ( !$msg_hash ) || ( !$module )){
+ ($msg, $msg_hash, $module) = &input_from_known_client($next_msg, $heap->{'remote_ip'}, $session_id);
+ }
+ # an error occurred
+ if(( !$msg ) || ( !$msg_hash ) || ( !$module )){
+ # if an incoming msg could not be decrypted (maybe a wrong key), send client a ping. If the client
+ # could not understand a msg from its server the client cause a re-registering process
+ daemon_log("$session_id WARNING cannot understand incoming msg, send 'ping'-msg to all host with ip '".$heap->{remote_ip}.
+ "' to cause a re-registering of the client if necessary", 3);
+ my $sql_statement = "SELECT * FROM $main::known_clients_tn WHERE (hostname LIKE '".$heap->{'remote_ip'}."%')";
+ my $query_res = $known_clients_db->select_dbentry( $sql_statement );
+ while( my ($hit_num, $hit) = each %{ $query_res } ) {
+ my $host_name = $hit->{'hostname'};
+ my $host_key = $hit->{'hostkey'};
+ my $ping_msg = "<xml> <header>gosa_ping</header> <source>$server_address</source> <target>$host_name</target></xml>";
+ my $error = &send_msg_to_target($ping_msg, $host_name, $host_key, "gosa_ping", $session_id);
+ &update_jobdb_status_for_send_msgs($ping_msg, $error);
+ }
+ $error++;
+ }
- my $header;
- my $target;
- my $source;
- my $done = 0;
- my $sql;
- my $res;
-
- # check whether this message should be processed here
- if ($error == 0) {
- $header = @{$msg_hash->{'header'}}[0];
- $target = @{$msg_hash->{'target'}}[0];
- $source = @{$msg_hash->{'source'}}[0];
+
+ my $header;
+ my $target;
+ my $source;
+ my $done = 0;
+ my $sql;
+ my $res;
+
+ # check whether this message should be processed here
+ if ($error == 0) {
+ $header = @{$msg_hash->{'header'}}[0];
+ $target = @{$msg_hash->{'target'}}[0];
+ $source = @{$msg_hash->{'source'}}[0];
my $not_found_in_known_clients_db = 0;
my $not_found_in_known_server_db = 0;
my $not_found_in_foreign_clients_db = 0;
- my $local_address;
- my ($target_ip, $target_port) = split(':', $target);
+ my $local_address;
+ my $local_mac;
+ my ($target_ip, $target_port) = split(':', $target);
+
+ # Determine the local ip address if target is an ip address
if ($target =~ /^\d+\.\d+\.\d+\.\d+:\d+$/) {
$local_address = &get_local_ip_for_remote_ip($target_ip).":$server_port";
} else {
- $local_address = $server_address;
- }
+ $local_address = $server_address;
+ }
- # target and source is equal to GOSA -> process here
- if (not $done) {
- if ($target eq "GOSA" && $source eq "GOSA") {
- $done = 1;
- }
- }
+ # Determine the local mac address if target is a mac address
+ if ($target =~ /^([0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2})$/i) {
+ my $loc_ip = &get_local_ip_for_remote_ip($heap->{'remote_ip'});
+ my $network_interface= &get_interface_for_ip($loc_ip);
+ $local_mac = &get_mac_for_interface($network_interface);
+ } else {
+ $local_mac = $server_mac_address;
+ }
- # target is own address without forward_to_gosa-tag -> process here
- if (not $done) {
- if (($target eq $local_address) && (not exists $msg_hash->{'forward_to_gosa'})) {
- $done = 1;
- if ($source eq "GOSA") {
- $msg =~ s/<\/xml>/<forward_to_gosa>$local_address,$session_id<\/forward_to_gosa><\/xml>/;
- }
- #print STDERR "target is own address without forward_to_gosa-tag -> process here\n";
- }
- }
+ # target and source is equal to GOSA -> process here
+ if (not $done) {
+ if ($target eq "GOSA" && $source eq "GOSA") {
+ $done = 1;
+ &daemon_log("$session_id DEBUG: target and source is 'GOSA' -> process here", 7);
+ }
+ }
- # target is a client address in known_clients -> process here
+ # target is own address without forward_to_gosa-tag -> process here
if (not $done) {
- $sql = "SELECT * FROM $known_clients_tn WHERE (hostname='$target' OR macaddress LIKE '$target')";
- $res = $known_clients_db->select_dbentry($sql);
- if (keys(%$res) > 0) {
- $done = 1;
- my $hostname = $res->{1}->{'hostname'};
- $msg =~ s/<target>$target<\/target>/<target>$hostname<\/target>/;
- #print STDERR "target is a client address in known_clients -> process here\n";
- my $local_address = &get_local_ip_for_remote_ip($target_ip).":$server_port";
- if ($source eq "GOSA") {
- $msg =~ s/<\/xml>/<forward_to_gosa>$local_address,$session_id<\/forward_to_gosa><\/xml>/;
- }
+ #if ((($target eq $local_address) || ($target eq $local_mac) ) && (not exists $msg_hash->{'forward_to_gosa'})) {
+ if (($target eq $local_address) && (not exists $msg_hash->{'forward_to_gosa'})) {
+ $done = 1;
+ if ($source eq "GOSA") {
+ $msg =~ s/<\/xml>/<forward_to_gosa>$local_address,$session_id<\/forward_to_gosa><\/xml>/;
+ }
+ &daemon_log("$session_id DEBUG: target is own address without forward_to_gosa-tag -> process here", 7);
+ }
+ }
- } else {
- $not_found_in_known_clients_db = 1;
+ # target is a client address in known_clients -> process here
+ if (not $done) {
+ $sql = "SELECT * FROM $known_clients_tn WHERE (hostname='$target' OR macaddress LIKE '$target')";
+ $res = $known_clients_db->select_dbentry($sql);
+ if (keys(%$res) > 0) {
+ $done = 1;
+ my $hostname = $res->{1}->{'hostname'};
+ $msg =~ s/<target>$target<\/target>/<target>$hostname<\/target>/;
+ my $local_address = &get_local_ip_for_remote_ip($target_ip).":$server_port";
+ if ($source eq "GOSA") {
+ $msg =~ s/<\/xml>/<forward_to_gosa>$local_address,$session_id<\/forward_to_gosa><\/xml>/;
}
+ &daemon_log("$session_id DEBUG: target is a client address in known_clients -> process here", 7);
+
+ } else {
+ $not_found_in_known_clients_db = 1;
+ }
}
-
- # target ist own address with forward_to_gosa-tag not pointing to myself -> process here
- if (not $done) {
- my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0];
- my $gosa_at;
- my $gosa_session_id;
- if (($target eq $local_address) && (defined $forward_to_gosa)){
- my ($gosa_at, $gosa_session_id) = split(/,/, $forward_to_gosa);
- if ($gosa_at ne $local_address) {
- $done = 1;
- #print STDERR "target is own address with forward_to_gosa-tag not pointing to myself -> process here\n";
- }
- }
- }
- # if message should be processed here -> add message to incoming_db
- if ($done) {
- # if a job or a gosa message comes from a foreign server, fake module to GosaPackages
- # so gosa-si-server knows how to process this kind of messages
- if ($header =~ /^gosa_/ || $header =~ /^job_/) {
- $module = "GosaPackages";
+ # target ist own address with forward_to_gosa-tag not pointing to myself -> process here
+ if (not $done) {
+ my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0];
+ my $gosa_at;
+ my $gosa_session_id;
+ if (($target eq $local_address) && (defined $forward_to_gosa)){
+ my ($gosa_at, $gosa_session_id) = split(/,/, $forward_to_gosa);
+ if ($gosa_at ne $local_address) {
+ $done = 1;
+ &daemon_log("$session_id DEBUG: target is own address with forward_to_gosa-tag not pointing to myself -> process here", 7);
}
+ }
+ }
+
+ # if message should be processed here -> add message to incoming_db
+ if ($done) {
+ # if a job or a gosa message comes from a foreign server, fake module to GosaPackages
+ # so gosa-si-server knows how to process this kind of messages
+ if ($header =~ /^gosa_/ || $header =~ /^job_/) {
+ $module = "GosaPackages";
+ }
+
+ my $res = $incoming_db->add_dbentry( {table=>$incoming_tn,
+ primkey=>[],
+ headertag=>$header,
+ targettag=>$target,
+ xmlmessage=>&encode_base64($msg),
+ timestamp=>&get_time,
+ module=>$module,
+ sessionid=>$session_id,
+ } );
- my $res = $incoming_db->add_dbentry( {table=>$incoming_tn,
- primkey=>[],
- headertag=>$header,
- targettag=>$target,
- xmlmessage=>&encode_base64($msg),
- timestamp=>&get_time,
- module=>$module,
- sessionid=>$session_id,
- } );
}
- # target is own address with forward_to_gosa-tag pointing at myself -> forward to gosa
- if (not $done) {
- my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0];
- my $gosa_at;
- my $gosa_session_id;
- if (($target eq $local_address) && (defined $forward_to_gosa)){
- my ($gosa_at, $gosa_session_id) = split(/,/, $forward_to_gosa);
- if ($gosa_at eq $local_address) {
- my $session_reference = $kernel->ID_id_to_session($gosa_session_id);
- if( defined $session_reference ) {
- $heap = $session_reference->get_heap();
- }
- if(exists $heap->{'client'}) {
- $msg = &encrypt_msg($msg, $GosaPackages_key);
- $heap->{'client'}->put($msg);
- &daemon_log("$session_id INFO: incoming '$header' message forwarded to GOsa", 5);
- }
- $done = 1;
- #print STDERR "target is own address with forward_to_gosa-tag pointing at myself -> forward to gosa\n";
- }
- }
+ # target is own address with forward_to_gosa-tag pointing at myself -> forward to gosa
+ if (not $done) {
+ my $forward_to_gosa = @{$msg_hash->{'forward_to_gosa'}}[0];
+ my $gosa_at;
+ my $gosa_session_id;
+ if (($target eq $local_address) && (defined $forward_to_gosa)){
+ my ($gosa_at, $gosa_session_id) = split(/,/, $forward_to_gosa);
+ if ($gosa_at eq $local_address) {
+ my $session_reference = $kernel->ID_id_to_session($gosa_session_id);
+ if( defined $session_reference ) {
+ $heap = $session_reference->get_heap();
+ }
+ if(exists $heap->{'client'}) {
+ $msg = &encrypt_msg($msg, $GosaPackages_key);
+ $heap->{'client'}->put($msg);
+ &daemon_log("$session_id INFO: incoming '$header' message forwarded to GOsa", 5);
+ }
+ $done = 1;
+ &daemon_log("$session_id DEBUG: target is own address with forward_to_gosa-tag pointing at myself -> forward to gosa", 7);
+ }
+ }
- }
+ }
- # target is a client address in foreign_clients -> forward to registration server
- if (not $done) {
- $sql = "SELECT * FROM $foreign_clients_tn WHERE (hostname='$target' OR macaddress LIKE '$target')";
- $res = $foreign_clients_db->select_dbentry($sql);
- if (keys(%$res) > 0) {
- my $hostname = $res->{1}->{'hostname'};
- my ($host_ip, $host_port) = split(/:/, $hostname);
- my $local_address = &get_local_ip_for_remote_ip($host_ip).":$server_port";
- my $regserver = $res->{1}->{'regserver'};
- my $sql = "SELECT * FROM $known_server_tn WHERE hostname='$regserver'";
- my $res = $known_server_db->select_dbentry($sql);
- if (keys(%$res) > 0) {
- my $regserver_key = $res->{1}->{'hostkey'};
- $msg =~ s/<source>GOSA<\/source>/<source>$local_address<\/source>/;
- $msg =~ s/<target>$target<\/target>/<target>$hostname<\/target>/;
- if ($source eq "GOSA") {
- $msg =~ s/<\/xml>/<forward_to_gosa>$local_address,$session_id<\/forward_to_gosa><\/xml>/;
- }
- &send_msg_to_target($msg, $regserver, $regserver_key, $header, $session_id);
- }
- $done = 1;
- #print STDERR "target is a client address in foreign_clients -> forward to registration server\n";
- } else {
+ # target is a client address in foreign_clients -> forward to registration server
+ if (not $done) {
+ $sql = "SELECT * FROM $foreign_clients_tn WHERE (hostname='$target' OR macaddress LIKE '$target')";
+ $res = $foreign_clients_db->select_dbentry($sql);
+ if (keys(%$res) > 0) {
+ my $hostname = $res->{1}->{'hostname'};
+ my ($host_ip, $host_port) = split(/:/, $hostname);
+ my $local_address = &get_local_ip_for_remote_ip($host_ip).":$server_port";
+ my $regserver = $res->{1}->{'regserver'};
+ my $sql = "SELECT * FROM $known_server_tn WHERE hostname='$regserver'";
+ my $res = $known_server_db->select_dbentry($sql);
+ if (keys(%$res) > 0) {
+ my $regserver_key = $res->{1}->{'hostkey'};
+ $msg =~ s/<source>GOSA<\/source>/<source>$local_address<\/source>/;
+ $msg =~ s/<target>$target<\/target>/<target>$hostname<\/target>/;
+ if ($source eq "GOSA") {
+ $msg =~ s/<\/xml>/<forward_to_gosa>$local_address,$session_id<\/forward_to_gosa><\/xml>/;
+ }
+ &send_msg_to_target($msg, $regserver, $regserver_key, $header, $session_id);
+ }
+ $done = 1;
+ &daemon_log("$session_id DEBUG: target is a client address in foreign_clients -> forward to registration server", 7);
+ } else {
$not_found_in_foreign_clients_db = 1;
}
- }
+ }
- # target is a server address -> forward to server
- if (not $done) {
- $sql = "SELECT * FROM $known_server_tn WHERE hostname='$target'";
- $res = $known_server_db->select_dbentry($sql);
- if (keys(%$res) > 0) {
- my $hostkey = $res->{1}->{'hostkey'};
+ # target is a server address -> forward to server
+ if (not $done) {
+ $sql = "SELECT * FROM $known_server_tn WHERE (hostname='$target' OR macaddress LIKE '$target')";
+ $res = $known_server_db->select_dbentry($sql);
+ if (keys(%$res) > 0) {
+ my $hostkey = $res->{1}->{'hostkey'};
- if ($source eq "GOSA") {
- $msg =~ s/<source>GOSA<\/source>/<source>$local_address<\/source>/;
- $msg =~ s/<\/xml>/<forward_to_gosa>$local_address,$session_id<\/forward_to_gosa><\/xml>/;
+ if ($source eq "GOSA") {
+ $msg =~ s/<source>GOSA<\/source>/<source>$local_address<\/source>/;
+ $msg =~ s/<\/xml>/<forward_to_gosa>$local_address,$session_id<\/forward_to_gosa><\/xml>/;
- }
+ }
- &send_msg_to_target($msg, $target, $hostkey, $header, $session_id);
- $done = 1;
- #print STDERR "target is a server address -> forward to server\n";
- } else {
+ &send_msg_to_target($msg, $target, $hostkey, $header, $session_id);
+ $done = 1;
+ &daemon_log("$session_id DEBUG: target is a server address -> forward to server", 7);
+ } else {
$not_found_in_known_server_db = 1;
}
- }
+ }
+
-
# target is not in foreign_clients_db, known_server_db or known_clients_db, maybe it is a complete new one -> process here
if ( $not_found_in_foreign_clients_db
- && $not_found_in_known_server_db
- && $not_found_in_known_clients_db) {
- my $res = $incoming_db->add_dbentry( {table=>$incoming_tn,
- primkey=>[],
- headertag=>$header,
- targettag=>$target,
- xmlmessage=>&encode_base64($msg),
- timestamp=>&get_time,
- module=>$module,
- sessionid=>$session_id,
- } );
- $done = 1;
+ && $not_found_in_known_server_db
+ && $not_found_in_known_clients_db) {
+ &daemon_log("$session_id DEBUG: target is not in foreign_clients_db, known_server_db or known_clients_db, maybe it is a complete new one -> process here", 7);
+ if ($header =~ /^gosa_/ || $header =~ /^job_/) {
+ $module = "GosaPackages";
+ }
+ my $res = $incoming_db->add_dbentry( {table=>$incoming_tn,
+ primkey=>[],
+ headertag=>$header,
+ targettag=>$target,
+ xmlmessage=>&encode_base64($msg),
+ timestamp=>&get_time,
+ module=>$module,
+ sessionid=>$session_id,
+ } );
+ $done = 1;
}
- if (not $done) {
- daemon_log("$session_id ERROR: do not know what to do with this message: $msg", 1);
- if ($source eq "GOSA") {
- my %data = ('error_msg' => &encode_base64($msg), 'error_string' => "Do not know what to do with this message!");
- my $error_msg = &build_msg("error", $local_address, "GOSA", \%data );
-
- my $session_reference = $kernel->ID_id_to_session($session_id);
- if( defined $session_reference ) {
- $heap = $session_reference->get_heap();
- }
- if(exists $heap->{'client'}) {
- $error_msg = &encrypt_msg($error_msg, $GosaPackages_key);
- $heap->{'client'}->put($error_msg);
- }
- }
- }
+ if (not $done) {
+ daemon_log("$session_id ERROR: do not know what to do with this message: $msg", 1);
+ if ($source eq "GOSA") {
+ my %data = ('error_msg' => &encode_base64($msg), 'error_string' => "Do not know what to do with this message!");
+ my $error_msg = &build_msg("error", $local_address, "GOSA", \%data );
+
+ my $session_reference = $kernel->ID_id_to_session($session_id);
+ if( defined $session_reference ) {
+ $heap = $session_reference->get_heap();
+ }
+ if(exists $heap->{'client'}) {
+ $error_msg = &encrypt_msg($error_msg, $GosaPackages_key);
+ $heap->{'client'}->put($error_msg);
+ }
+ }
+ }
- }
+ }
- return;
+ return;
}
my $module = $task->{'module'};
my $header = $task->{'headertag'};
my $session_id = $task->{'sessionid'};
- my $msg_hash = $xml->XMLin($msg, ForceArray=>1);
+ my $msg_hash;
+ eval {
+ $msg_hash = $xml->XMLin($msg, ForceArray=>1);
+ };
+ daemon_log("ERROR: XML failure '$@'") if ($@);
my $source = @{$msg_hash->{'source'}}[0];
# set timestamp of incoming client uptodate, so client will not
while ($answer_str =~ /<header>(\w+)<\/header>/g) {
daemon_log("$session_id INFO: got answer message with header '$1'", 5);
}
- daemon_log("$session_id DEBUG: $module: got answer from module: \n".$answer_str,8);
+ daemon_log("$session_id DEBUG: $module: got answer from module: \n".$answer_str,9);
} else {
- daemon_log("$session_id DEBUG: $module: got no answer from module!" ,8);
+ daemon_log("$session_id DEBUG: $module: got no answer from module!" ,7);
}
}
&update_jobdb_status_for_send_msgs($answer, $error);
}
- # target of msg is a mac address
+ # Target of msg is a mac address
elsif( $answer_target =~ /^([0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2})$/i ) {
- daemon_log("$session_id INFO: target is mac address '$answer_target', looking for host in known_clients", 5);
+ daemon_log("$session_id INFO: target is mac address '$answer_target', looking for host in known_clients and foreign_clients", 5);
+
+ # Looking for macaddress in known_clients
my $sql_statement = "SELECT * FROM known_clients WHERE macaddress LIKE '$answer_target'";
my $query_res = $known_clients_db->select_dbentry( $sql_statement );
my $found_ip_flag = 0;
&update_jobdb_status_for_send_msgs($answer, $error);
$found_ip_flag++ ;
}
+
+ # Looking for macaddress in foreign_clients
+ if ($found_ip_flag == 0) {
+ my $sql = "SELECT * FROM $foreign_clients_tn WHERE macaddress LIKE '$answer_target'";
+ my $res = $foreign_clients_db->select_dbentry($sql);
+ while( my ($hit_num, $hit) = each %{ $res } ) {
+ my $host_name = $hit->{hostname};
+ my $reg_server = $hit->{regserver};
+ daemon_log("$session_id INFO: found host '$host_name' with mac '$answer_target', registered at '$reg_server'", 5);
+
+ # Fetch key for reg_server
+ my $reg_server_key;
+ my $sql = "SELECT * FROM $known_server_tn WHERE hostname='$reg_server'";
+ my $res = $known_server_db->select_dbentry($sql);
+ if (exists $res->{1}) {
+ $reg_server_key = $res->{1}->{'hostkey'};
+ } else {
+ daemon_log("$session_id ERROR: cannot find hostkey for '$host_name' in '$known_server_tn'", 1);
+ daemon_log("$session_id ERROR: unable to forward answer to correct registration server, processing is aborted!", 1);
+ $reg_server_key = undef;
+ }
+
+ # Send answer to server where client is registered
+ if (defined $reg_server_key) {
+ $answer =~ s/$answer_target/$host_name/g;
+ my $error = &send_msg_to_target($answer, $reg_server, $reg_server_key, $answer_header, $session_id);
+ &update_jobdb_status_for_send_msgs($answer, $error);
+ $found_ip_flag++ ;
+ }
+ }
+ }
+
+ # No mac to ip matching found
if( $found_ip_flag == 0) {
- daemon_log("$session_id WARNING: no host found in known_clients with mac address '$answer_target'", 3);
+ daemon_log("$session_id WARNING: no host found in known_clients or foreign_clients with mac address '$answer_target'", 3);
+ &reactivate_job_with_delay($session_id, $answer_target, $answer_header, 30);
}
- # answer is for one specific host
+ # Answer is for one specific host
} else {
# get encrypt_key
my $encrypt_key = &get_encrypt_key($answer_target);
}
}
- # Estimate "rough" progress
- $result->{'progress'}= int($installed * 100 / $products);
+ # Estimate "rough" progress, avoid division by zero
+ if ($products == 0) {
+ $result->{'progress'}= 0;
+ } else {
+ $result->{'progress'}= int($installed * 100 / $products);
+ }
# Set updates in job queue
if ((not $error) && (not $installing) && ($installed)) {
sub watch_for_modified_jobs {
my ($kernel,$heap) = @_[KERNEL, HEAP];
- my $sql_statement = "SELECT * FROM $job_queue_tn WHERE ((siserver='localhost') AND (modified='1'))";
+ my $sql_statement = "SELECT * FROM $job_queue_tn WHERE (modified='1')";
my $res = $job_db->select_dbentry( $sql_statement );
# if db contains no jobs which should be update, do nothing
# check gosa job quaeue for jobs with executable timestamp
my $timestamp = &get_time();
- my $sql_statement = "SELECT * FROM $job_queue_tn WHERE status='waiting' AND (CAST (timestamp AS INTEGER)) < $timestamp ORDER BY timestamp";
+ my $sql_statement = "SELECT * FROM $job_queue_tn WHERE status='waiting' AND (CAST(timestamp AS UNSIGNED)) < $timestamp ORDER BY timestamp";
my $res = $job_db->exec_statement( $sql_statement );
# Merge all new jobs that would do the same actions
# Skip new jobs for host if there is a processing job
if(defined($res) and defined @{$res}[0]) {
+ # Prevent race condition if there is a trigger_activate job waiting and a goto-activation job processing
+ my $row = @{$res}[0] if (ref $res eq 'ARRAY');
+ if(@{$row}[5] eq 'trigger_action_reinstall') {
+ my $sql_statement_2 = "SELECT * FROM $job_queue_tn WHERE macaddress LIKE '$macaddress' AND status='waiting' AND headertag = 'trigger_activate_new'";
+ my $res_2 = $job_db->exec_statement( $sql_statement_2 );
+ if(defined($res_2) and defined @{$res_2}[0]) {
+ # Set status from goto-activation to 'waiting' and update timestamp
+ $job_db->exec_statement("UPDATE $job_queue_tn SET status='waiting' WHERE macaddress LIKE '$macaddress' AND headertag = 'trigger_action_reinstall'");
+ $job_db->exec_statement("UPDATE $job_queue_tn SET timestamp='".&get_time(30)."' WHERE macaddress LIKE '$macaddress' AND headertag = 'trigger_action_reinstall'");
+ }
+ }
next;
}
$job_msg =~ /<header>(\S+)<\/header>/;
my $header = $1 ;
- my $func_error = &send_msg_to_target($job_msg, $server_address, $GosaPackages_key, $header, "J");
+ my $func_error = &send_msg_to_target($job_msg, $server_address, $GosaPackages_key, $header, "J");
+
+ # update status in job queue to ...
+ # ... 'processing', for jobs: 'reinstall', 'update'
+ if (($header =~ /gosa_trigger_action_reinstall/) || ($header =~ /gosa_trigger_action_update/)) {
+ my $sql_statement = "UPDATE $job_queue_tn SET status='processing' WHERE id=$jobdb_id";
+ my $dbres = $job_db->update_dbentry($sql_statement);
+ }
- # update status in job queue to 'processing'
- $sql_statement = "UPDATE $job_queue_tn SET status='processing' WHERE id=$jobdb_id";
- my $res = $job_db->update_dbentry($sql_statement);
-# TODO: abfangen ob alles in ordnung ist oder nicht, wenn nicht error schmeißen
+ # ... 'done', for all other jobs, they are no longer needed in the jobqueue
+ else {
+ my $sql_statement = "UPDATE $job_queue_tn SET status='done' WHERE id=$jobdb_id";
+ my $dbres = $job_db->update_dbentry($sql_statement);
+ }
+
# We don't want parallel processing
last;
# check messaging_db for new incoming messages with executable timestamp
my $timestamp = &get_time();
- my $sql_statement = "SELECT * FROM $messaging_tn WHERE ( (CAST(timestamp AS INTEGER))<$timestamp AND flag='n' AND direction='in' )";
+ my $sql_statement = "SELECT * FROM $messaging_tn WHERE ( (CAST(timestamp AS UNSIGNED))<$timestamp AND flag='n' AND direction='in' )";
my $res = $messaging_db->exec_statement( $sql_statement );
foreach my $hit (@{$res}) {
my %receiver_h;
foreach my $receiver (@message_to_l) {
if ($receiver =~ /^u_([\s\S]*)$/) {
- $receiver_h{$1} = 0;
+ $receiver_h{$receiver} = 0;
} elsif ($receiver =~ /^g_([\s\S]*)$/) {
my $group_name = $1;
# fetch all group members from ldap and add them to receiver hash
foreach my $entry (@entries) {
my @receivers= $entry->get_value("memberUid");
foreach my $receiver (@receivers) {
- $receiver_h{$1} = 0;
+ $receiver_h{$receiver} = 0;
}
}
}
#&daemon_log("0 DEBUG: $sql", 7);
my $res = $login_users_db->exec_statement($sql);
- # reciver is logged in nowhere
+ # receiver is logged in nowhere
if (not ref(@$res[0]) eq "ARRAY") { next; }
+ # receiver ist logged in at a client registered at local server
my $send_succeed = 0;
foreach my $hit (@$res) {
my $receiver_host = @$hit[0];
+ my $delivered2host = 0;
&daemon_log("M DEBUG: user '$receiver' is logged in at host '$receiver_host'", 7);
- # fetch key to encrypt msg propperly for usr/host
+ # Looking for host in know_clients_db
my $sql = "SELECT * FROM $known_clients_tn WHERE (hostname='$receiver_host')";
- &daemon_log("0 DEBUG: $sql", 7);
my $res = $known_clients_db->exec_statement($sql);
- # host is already down
- if (not ref(@$res[0]) eq "ARRAY") { next; }
+ # Host is known in known_clients_db
+ if (ref(@$res[0]) eq "ARRAY") {
+ my $receiver_key = @{@{$res}[0]}[2];
+ my %data = ('subject' => $subject, 'message' => $message, 'usr' => $receiver);
+ my $out_msg = &build_msg("usr_msg", $server_address, $receiver_host, \%data );
+ my $error = &send_msg_to_target($out_msg, $receiver_host, $receiver_key, "usr_msg", 0);
+ if ($error == 0 ) {
+ $send_succeed++ ;
+ $delivered2host++ ;
+ &daemon_log("M DEBUG: send message for user '$receiver' to host '$receiver_host'", 7);
+ } else {
+ &daemon_log("M DEBUG: cannot send message for user '$receiver' to host '$receiver_host'", 7);
+ }
+ }
+
+ # Message already send, do not need to do anything more, otherwise ...
+ if ($delivered2host) { next;}
+
+ # ...looking for host in foreign_clients_db
+ $sql = "SELECT * FROM $foreign_clients_tn WHERE (hostname='$receiver_host')";
+ $res = $foreign_clients_db->exec_statement($sql);
+
+ # Host is known in foreign_clients_db
+ if (ref(@$res[0]) eq "ARRAY") {
+ my $registration_server = @{@{$res}[0]}[2];
+
+ # Fetch encryption key for registration server
+ my $sql = "SELECT * FROM $known_server_tn WHERE (hostname='$registration_server')";
+ my $res = $known_server_db->exec_statement($sql);
+ if (ref(@$res[0]) eq "ARRAY") {
+ my $registration_server_key = @{@{$res}[0]}[3];
+ my %data = ('subject' => $subject, 'message' => $message, 'usr' => $receiver);
+ my $out_msg = &build_msg("usr_msg", $server_address, $receiver_host, \%data );
+ my $error = &send_msg_to_target($out_msg, $registration_server, $registration_server_key, "usr_msg", 0);
+ if ($error == 0 ) {
+ $send_succeed++ ;
+ $delivered2host++ ;
+ &daemon_log("M DEBUG: send message for user '$receiver' to server '$registration_server'", 7);
+ } else {
+ &daemon_log("M ERROR: cannot send message for user '$receiver' to server '$registration_server'", 1);
+ }
- # host is on
- my $receiver_key = @{@{$res}[0]}[2];
- my %data = ('subject' => $subject, 'message' => $message, 'usr' => $receiver);
- my $out_msg = &build_msg("usr_msg", $server_address, $receiver_host, \%data );
- my $error = &send_msg_to_target($out_msg, $receiver_host, $receiver_key, "usr_msg", 0);
- if ($error == 0 ) {
- $send_succeed++ ;
- }
+ } else {
+ &daemon_log("M ERROR: host '$receiver_host' is reported to be ".
+ "registrated at server '$registration_server', ".
+ "but no data available in known_server_db ", 1);
+ }
+ }
+
+ if (not $delivered2host) {
+ &daemon_log("M ERROR: unable to send user message to host '$receiver_host'", 1);
+ }
}
if ($send_succeed) {
# set outgoing msg at db to deliverd
my $sql = "UPDATE $messaging_tn SET flag='d' WHERE (id='$msg_id' AND direction='out' AND message_to='$receiver')";
- &daemon_log("0 DEBUG: $sql", 7);
my $res = $messaging_db->exec_statement($sql);
- }
+ &daemon_log("M INFO: send message for user '$receiver' to logged in hosts", 5);
+ } else {
+ &daemon_log("M WARNING: failed to deliver message for user '$receiver'", 3);
+ }
}
$kernel->delay_set('watch_for_delivery_messages', $messaging_db_loop_delay);
my $sql = "SELECT * FROM $incoming_tn";
my $res = $incoming_db->select_dbentry($sql);
-
+
while ( my ($hit_num, $hit) = each %$res) {
my $headertag = $hit->{'headertag'};
if ($headertag =~ /^answer_(\d+)/) {
next;
}
my $message_id = $hit->{'id'};
+ my $session_id = $hit->{'sessionid'};
+ &daemon_log("$session_id DEBUG: start processing for message with incoming id: '$message_id'", 7);
$kernel->yield('next_task', $hit);
my $sql = "DELETE FROM $incoming_tn WHERE id=$message_id";
my $res = $incoming_db->exec_statement($sql);
}
- $kernel->delay_set('watch_for_next_tasks', 0.1);
+ $kernel->delay_set('watch_for_next_tasks', 1);
}
if ($session_id == 0) {
daemon_log("$session_id DEBUG: get_ldap_handle invoked without a session_id, create a new ldap_handle", 7);
$ldap_handle = Net::LDAP->new( $ldap_uri );
- $ldap_handle->bind($ldap_admin_dn, password => $ldap_admin_password) or daemon_log("$session_id ERROR: Bind to LDAP $ldap_uri as $ldap_admin_dn failed!");
+ if (defined $ldap_handle) {
+ $ldap_handle->bind($ldap_admin_dn, password => $ldap_admin_password) or daemon_log("$session_id ERROR: Bind to LDAP $ldap_uri as $ldap_admin_dn failed!");
+ } else {
+ daemon_log("$session_id ERROR: creation of a new LDAP handle failed (ldap_uri '$ldap_uri')");
+ }
} else {
my $session_reference = $global_kernel->ID_id_to_session($session_id);
my %tmp = map { $_ => 1 } $entry->get_value("objectClass");
if (exists $tmp{'FAIobject'}){
if ($state eq ''){
- $result= $ldap_handle->modify($entry->dn, changes => [
- delete => [ FAIstate => [] ] ]);
+ $result= $ldap_handle->modify($entry->dn, changes => [ delete => [ FAIstate => [] ] ]);
} else {
- $result= $ldap_handle->modify($entry->dn, changes => [
- replace => [ FAIstate => $state ] ]);
+ $result= $ldap_handle->modify($entry->dn, changes => [ replace => [ FAIstate => $state ] ]);
}
} elsif ($state ne ''){
- $result= $ldap_handle->modify($entry->dn, changes => [
- add => [ objectClass => 'FAIobject' ],
- add => [ FAIstate => $state ] ]);
+ $result= $ldap_handle->modify($entry->dn, changes => [ add => [ objectClass => 'FAIobject' ], add => [ FAIstate => $state ] ]);
}
# Errors?
daemon_log("$session_id INFO: Setting gotoMode to '$state' for ".$entry->dn, 5);
my $result;
- $result= $ldap_handle->modify($entry->dn, changes => [
- replace => [ gotoMode => $state ] ]);
+ $result= $ldap_handle->modify($entry->dn, changes => [replace => [ gotoMode => $state ] ]);
# Errors?
if ($result->code){
sub create_fai_server_db {
- my ($table_name, $kernel, $dont_create_packages_list, $session_id) = @_;
+ my ($table_name, $kernel, $dont_create_packages_list, $session_id) = @_;
my $result;
if (not defined $session_id) { $session_id = 0; }
- my $ldap_handle = &get_ldap_handle();
+ my $ldap_handle = &get_ldap_handle();
if(defined($ldap_handle)) {
daemon_log("$session_id INFO: create_fai_server_db: start", 5);
my $mesg= $ldap_handle->search(
filter => "(&(FAIrepository=*)(objectClass=FAIrepositoryServer))",
);
if($mesg->{'resultCode'} == 0 &&
- $mesg->count != 0) {
- foreach my $entry (@{$mesg->{entries}}) {
- if($entry->exists('FAIrepository')) {
- # Add an entry for each Repository configured for server
- foreach my $repo(@{$entry->get_value('FAIrepository', asref => 1)}) {
- my($tmp_url,$tmp_server,$tmp_release,$tmp_sections) = split(/\|/, $repo);
- my $tmp_tag= $entry->get_value('gosaUnitTag') || "";
- $result= $fai_server_db->add_dbentry( {
- table => $table_name,
- primkey => ['server', 'release', 'tag'],
- server => $tmp_url,
- release => $tmp_release,
- sections => $tmp_sections,
- tag => (length($tmp_tag)>0)?$tmp_tag:"",
- } );
- }
- }
- }
- }
+ $mesg->count != 0) {
+ foreach my $entry (@{$mesg->{entries}}) {
+ if($entry->exists('FAIrepository')) {
+ # Add an entry for each Repository configured for server
+ foreach my $repo(@{$entry->get_value('FAIrepository', asref => 1)}) {
+ my($tmp_url,$tmp_server,$tmp_release,$tmp_sections) = split(/\|/, $repo);
+ my $tmp_tag= $entry->get_value('gosaUnitTag') || "";
+ $result= $fai_server_db->add_dbentry( {
+ table => $table_name,
+ primkey => ['server', 'fai_release', 'tag'],
+ server => $tmp_url,
+ fai_release => $tmp_release,
+ sections => $tmp_sections,
+ tag => (length($tmp_tag)>0)?$tmp_tag:"",
+ } );
+ }
+ }
+ }
+ }
daemon_log("$session_id INFO: create_fai_server_db: finished", 5);
# TODO: Find a way to post the 'create_packages_list_db' event
&create_packages_list_db(undef, undef, $session_id);
}
}
-
- $ldap_handle->disconnect;
- return $result;
+
+ $ldap_handle->disconnect;
+ return $result;
}
sub run_create_fai_release_db {
- my ($session, $heap, $table_name) = @_[SESSION, HEAP, ARG0];
+ my ($session, $heap, $table_name) = @_[SESSION, HEAP, ARG0];
my $session_id = $session->ID;
- my $task = POE::Wheel::Run->new(
- Program => sub { &create_fai_release_db($table_name, $session_id) },
- StdoutEvent => "session_run_result",
- StderrEvent => "session_run_debug",
- CloseEvent => "session_run_done",
- );
+ my $task = POE::Wheel::Run->new(
+ Program => sub { &create_fai_release_db($table_name, $session_id) },
+ StdoutEvent => "session_run_result",
+ StderrEvent => "session_run_debug",
+ CloseEvent => "session_run_done",
+ );
- $heap->{task}->{ $task->ID } = $task;
- return;
+ $heap->{task}->{ $task->ID } = $task;
+ return;
}
my ($table_name, $session_id) = @_;
my $result;
- # used for logging
- if (not defined $session_id) { $session_id = 0; }
+ # used for logging
+ if (not defined $session_id) { $session_id = 0; }
- my $ldap_handle = &get_ldap_handle();
+ my $ldap_handle = &get_ldap_handle();
if(defined($ldap_handle)) {
daemon_log("$session_id INFO: create_fai_release_db: start",5);
my $mesg= $ldap_handle->search(
if(defined($entry) && ref($entry) eq 'HASH') {
my $sql=
"INSERT INTO $table_name "
- ."(timestamp, release, class, type, state) VALUES ("
+ ."(timestamp, fai_release, class, type, state) VALUES ("
.$timestamp.","
."'".$entry->{'release'}."',"
."'".$entry->{'class'}."',"
daemon_log("$session_id DEBUG: Inserting ".scalar @sql_list." entries to DB",8);
if(@sql_list) {
- unshift @sql_list, "VACUUM";
unshift @sql_list, "DELETE FROM $table_name";
$fai_release_db->exec_statementlist(\@sql_list);
}
}
daemon_log("$session_id INFO: create_fai_release_db: finished",5);
}
- $ldap_handle->disconnect;
+ $ldap_handle->disconnect;
return $result;
}
close (CONFIG);
-
- find(\&cleanup_and_extract, keys( %repo_dirs ));
- &main::strip_packages_list_statements();
- unshift @packages_list_statements, "VACUUM";
- $packages_list_db->exec_statementlist(\@packages_list_statements);
+ if(keys(%repo_dirs)) {
+ find(\&cleanup_and_extract, keys( %repo_dirs ));
+ &main::strip_packages_list_statements();
+ $packages_list_db->exec_statementlist(\@packages_list_statements);
+ }
unlink($packages_list_under_construction);
daemon_log("$session_id INFO: create_packages_list_db: finished", 5);
return;
# This function should do some intensive task to minimize the db-traffic
sub strip_packages_list_statements {
- my @existing_entries= @{$packages_list_db->exec_statement("SELECT * FROM $main::packages_list_tn")};
+ my @existing_entries= @{$packages_list_db->exec_statement("SELECT * FROM $main::packages_list_tn")};
my @new_statement_list=();
my $hash;
my $insert_hash;
my $update_hash;
my $delete_hash;
+ my $known_packages_hash;
my $local_timestamp=get_time();
foreach my $existing_entry (@existing_entries) {
(! (@{$hash->{$distribution}->{$package}->{$version}}[4] eq $description))
) {
@{$update_hash->{$distribution}->{$package}->{$version}} = ($distribution,$package,$version,$section,$description,undef);
+ } else {
+ # package is already present in database. cache this knowledge for later use
+ @{$known_packages_hash->{$distribution}->{$package}->{$version}} = ($distribution,$package,$version,$section,$description,$template);
}
} else {
# Insert a non-existing entry to db
}
}
- # TODO: Check for orphaned entries
+ # Check for orphaned entries
+ foreach my $existing_entry (@existing_entries) {
+ my $distribution= @{$existing_entry}[0];
+ my $package= @{$existing_entry}[1];
+ my $version= @{$existing_entry}[2];
+ my $section= @{$existing_entry}[3];
+
+ if(
+ exists($insert_hash->{$distribution}->{$package}->{$version}) ||
+ exists($update_hash->{$distribution}->{$package}->{$version}) ||
+ exists($known_packages_hash->{$distribution}->{$package}->{$version})
+ ) {
+ next;
+ } else {
+ # Insert entry to delete hash
+ @{$delete_hash->{$distribution}->{$package}->{$version}} = ($distribution,$package,$version,$section);
+ }
+ }
- # unroll the insert_hash
+ # unroll the insert hash
foreach my $distribution (keys %{$insert_hash}) {
foreach my $package (keys %{$insert_hash->{$distribution}}) {
foreach my $version (keys %{$insert_hash->{$distribution}->{$package}}) {
next;
}
push @new_statement_list,
- "UPDATE $main::packages_list_tn SET $set WHERE"
- ." distribution = '$distribution'"
- ." AND package = '$package'"
- ." AND version = '$version'";
+ "UPDATE $main::packages_list_tn SET $set WHERE"
+ ." distribution = '$distribution'"
+ ." AND package = '$package'"
+ ." AND version = '$version'";
+ }
+ }
+ }
+
+ # unroll the delete hash
+ foreach my $distribution (keys %{$delete_hash}) {
+ foreach my $package (keys %{$delete_hash->{$distribution}}) {
+ foreach my $version (keys %{$delete_hash->{$distribution}->{$package}}) {
+ my $section = @{$delete_hash->{$distribution}->{$package}->{$version}}[3];
+ push @new_statement_list, "DELETE FROM $main::packages_list_tn WHERE distribution='$distribution' AND package='$package' AND version='$version' AND section='$section'";
}
}
}
sub cleanup_and_extract {
- my $fileinfo = $repo_files{ $File::Find::name };
+ my $fileinfo = $repo_files{ $File::Find::name };
- if( defined $fileinfo ) {
+ if( defined $fileinfo ) {
+ my $dir = "$outdir/$fileinfo->{ 'dist' }/debconf.d";
+ my $sql;
+ my $package = $fileinfo->{ 'package' };
+ my $newver = $fileinfo->{ 'version' };
- my $dir = "$outdir/$fileinfo->{ 'dist' }/debconf.d";
- my $sql;
- my $package = $fileinfo->{ 'package' };
- my $newver = $fileinfo->{ 'version' };
-
- mkpath($dir);
- system( "dpkg -e '$File::Find::name' '$dir/DEBIAN'" );
+ mkpath($dir);
+ system( "dpkg -e '$File::Find::name' '$dir/DEBIAN'" );
if( -f "$dir/DEBIAN/templates" ) {
- daemon_log("DEBUG: Found debconf templates in '$package' - $newver", 7);
+ daemon_log("0 DEBUG: Found debconf templates in '$package' - $newver", 7);
- my $tmpl= "";
- {
+ my $tmpl= ""; {
local $/=undef;
open FILE, "$dir/DEBIAN/templates";
$tmpl = &encode_base64(<FILE>);
rmtree("$dir/DEBIAN/templates");
$sql= "update $main::packages_list_tn set template = '$tmpl' where package = '$package' and version = '$newver';";
- push @packages_list_statements, $sql;
+ push @packages_list_statements, $sql;
}
- }
+ }
- return;
+ return;
}
my $myhash = &create_xml_hash('new_server', $server_address, $hostname);
&add_content2xml_hash($myhash, 'key', $hostkey);
map(&add_content2xml_hash($myhash, 'client', @{$_}[0].",".@{$_}[4]), @$client_res);
+
+ # add locally loaded gosa-si modules to registration message
+ my $loaded_modules = {};
+ while (my ($package, $pck_info) = each %$known_modules) {
+ next if ((!defined(@$pck_info[2])) || (!(ref (@$pck_info[2]) eq 'HASH')));
+ foreach my $act_module (keys(%{@$pck_info[2]})) {
+ $loaded_modules->{$act_module} = "";
+ }
+ }
+
+ map(&add_content2xml_hash($myhash, "loaded_modules", $_), keys(%$loaded_modules));
+
+ # add macaddress to registration message
+ my ($host_ip, $host_port) = split(/:/, $hostname);
+ my $local_ip = &get_local_ip_for_remote_ip($host_ip);
+ my $network_interface= &get_interface_for_ip($local_ip);
+ my $host_mac = &get_mac_for_interface($network_interface);
+ &add_content2xml_hash($myhash, 'macaddress', $host_mac);
# build registration message and send it
my $foreign_server_msg = &create_xml_string($myhash);
$server_status = "developmental" ;
}
+# Prepare log file
+$root_uid = getpwnam('root');
+$adm_gid = getgrnam('adm');
+chmod(0640, $log_file);
+chown($root_uid, $adm_gid, $log_file);
+chown($root_uid, $adm_gid, "/var/lib/gosa-si");
daemon_log(" ", 1);
daemon_log("$0 started!", 1);
daemon_log("status: $server_status", 1);
daemon_log($server_status_hash->{$server_status}.": $server_revision", 1);
-# connect to incoming_db
-unlink($incoming_file_name);
-$incoming_db = GOSA::DBsqlite->new($incoming_file_name);
-$incoming_db->create_table($incoming_tn, \@incoming_col_names);
+{
+ no strict "refs";
-# connect to gosa-si job queue
-$job_db = GOSA::DBsqlite->new($job_queue_file_name);
-$job_db->create_table($job_queue_tn, \@job_queue_col_names);
+ if ($db_module eq "DBmysql") {
+ # connect to incoming_db
+ $incoming_db = ("GOSA::".$db_module)->new($main::mysql_database, $main::mysql_host, $main::mysql_username, $main::mysql_password);
-# connect to known_clients_db
-$known_clients_db = GOSA::DBsqlite->new($known_clients_file_name);
-$known_clients_db->create_table($known_clients_tn, \@known_clients_col_names);
+ # connect to gosa-si job queue
+ $job_db = ("GOSA::".$db_module)->new($main::mysql_database, $main::mysql_host, $main::mysql_username, $main::mysql_password);
-# connect to foreign_clients_db
-$foreign_clients_db = GOSA::DBsqlite->new($foreign_clients_file_name);
-$foreign_clients_db->create_table($foreign_clients_tn, \@foreign_clients_col_names);
+ # connect to known_clients_db
+ $known_clients_db = ("GOSA::".$db_module)->new($main::mysql_database, $main::mysql_host, $main::mysql_username, $main::mysql_password);
-# connect to known_server_db
-unlink($known_server_file_name);
-$known_server_db = GOSA::DBsqlite->new($known_server_file_name);
-$known_server_db->create_table($known_server_tn, \@known_server_col_names);
+ # connect to foreign_clients_db
+ $foreign_clients_db = ("GOSA::".$db_module)->new($main::mysql_database, $main::mysql_host, $main::mysql_username, $main::mysql_password);
-# connect to login_usr_db
-$login_users_db = GOSA::DBsqlite->new($login_users_file_name);
-$login_users_db->create_table($login_users_tn, \@login_users_col_names);
+ # connect to known_server_db
+ $known_server_db = ("GOSA::".$db_module)->new($main::mysql_database, $main::mysql_host, $main::mysql_username, $main::mysql_password);
-# connect to fai_server_db and fai_release_db
-unlink($fai_server_file_name);
-$fai_server_db = GOSA::DBsqlite->new($fai_server_file_name);
-$fai_server_db->create_table($fai_server_tn, \@fai_server_col_names);
+ # connect to login_usr_db
+ $login_users_db = ("GOSA::".$db_module)->new($main::mysql_database, $main::mysql_host, $main::mysql_username, $main::mysql_password);
-unlink($fai_release_file_name);
-$fai_release_db = GOSA::DBsqlite->new($fai_release_file_name);
-$fai_release_db->create_table($fai_release_tn, \@fai_release_col_names);
+ # connect to fai_server_db
+ $fai_server_db = ("GOSA::".$db_module)->new($main::mysql_database, $main::mysql_host, $main::mysql_username, $main::mysql_password);
-# connect to packages_list_db
-#unlink($packages_list_file_name);
-unlink($packages_list_under_construction);
-$packages_list_db = GOSA::DBsqlite->new($packages_list_file_name);
-$packages_list_db->create_table($packages_list_tn, \@packages_list_col_names);
+ # connect to fai_release_db
+ $fai_release_db = ("GOSA::".$db_module)->new($main::mysql_database, $main::mysql_host, $main::mysql_username, $main::mysql_password);
+
+ # connect to packages_list_db
+ $packages_list_db = ("GOSA::".$db_module)->new($main::mysql_database, $main::mysql_host, $main::mysql_username, $main::mysql_password);
-# connect to messaging_db
-$messaging_db = GOSA::DBsqlite->new($messaging_file_name);
+ # connect to messaging_db
+ $messaging_db = ("GOSA::".$db_module)->new($main::mysql_database, $main::mysql_host, $main::mysql_username, $main::mysql_password);
+
+ } elsif ($db_module eq "DBsqlite") {
+ # connect to incoming_db
+ unlink($incoming_file_name);
+ $incoming_db = GOSA::DBsqlite->new($incoming_file_name);
+
+ # connect to gosa-si job queue
+ unlink($job_queue_file_name); ## just for debugging
+ $job_db = GOSA::DBsqlite->new($job_queue_file_name);
+ chmod(0660, $job_queue_file_name);
+ chown($root_uid, $adm_gid, $job_queue_file_name);
+
+ # connect to known_clients_db
+ unlink($known_clients_file_name); ## just for debugging
+ $known_clients_db = GOSA::DBsqlite->new($known_clients_file_name);
+ chmod(0660, $known_clients_file_name);
+ chown($root_uid, $adm_gid, $known_clients_file_name);
+
+ # connect to foreign_clients_db
+ unlink($foreign_clients_file_name);
+ $foreign_clients_db = GOSA::DBsqlite->new($foreign_clients_file_name);
+ chmod(0660, $foreign_clients_file_name);
+ chown($root_uid, $adm_gid, $foreign_clients_file_name);
+
+ # connect to known_server_db
+ unlink($known_server_file_name);
+ $known_server_db = GOSA::DBsqlite->new($known_server_file_name);
+ chmod(0660, $known_server_file_name);
+ chown($root_uid, $adm_gid, $known_server_file_name);
+
+ # connect to login_usr_db
+ unlink($login_users_file_name);
+ $login_users_db = GOSA::DBsqlite->new($login_users_file_name);
+ chmod(0660, $login_users_file_name);
+ chown($root_uid, $adm_gid, $login_users_file_name);
+
+ # connect to fai_server_db
+ unlink($fai_server_file_name);
+ $fai_server_db = GOSA::DBsqlite->new($fai_server_file_name);
+ chmod(0660, $fai_server_file_name);
+ chown($root_uid, $adm_gid, $fai_server_file_name);
+
+ # connect to fai_release_db
+ unlink($fai_release_file_name);
+ $fai_release_db = GOSA::DBsqlite->new($fai_release_file_name);
+ chmod(0660, $fai_release_file_name);
+ chown($root_uid, $adm_gid, $fai_release_file_name);
+
+ # connect to packages_list_db
+ #unlink($packages_list_file_name);
+ unlink($packages_list_under_construction);
+ $packages_list_db = GOSA::DBsqlite->new($packages_list_file_name);
+ chmod(0660, $packages_list_file_name);
+ chown($root_uid, $adm_gid, $packages_list_file_name);
+
+ # connect to messaging_db
+ unlink($messaging_file_name);
+ $messaging_db = GOSA::DBsqlite->new($messaging_file_name);
+ chmod(0660, $messaging_file_name);
+ chown($root_uid, $adm_gid, $messaging_file_name);
+ }
+}
+
+# Creating tables
$messaging_db->create_table($messaging_tn, \@messaging_col_names);
+$packages_list_db->create_table($packages_list_tn, \@packages_list_col_names);
+$fai_release_db->create_table($fai_release_tn, \@fai_release_col_names);
+$fai_server_db->create_table($fai_server_tn, \@fai_server_col_names);
+$login_users_db->create_table($login_users_tn, \@login_users_col_names);
+$known_server_db->create_table($known_server_tn, \@known_server_col_names);
+$foreign_clients_db->create_table($foreign_clients_tn, \@foreign_clients_col_names);
+$known_clients_db->create_table($known_clients_tn, \@known_clients_col_names);
+$incoming_db->create_table($incoming_tn, \@incoming_col_names);
+$job_db->create_table($job_queue_tn, \@job_queue_col_names);
# create xml object used for en/decrypting
foreach my $foreign_server (@cfg_foreign_server_list) {
push(@foreign_server_list, $foreign_server);
}
-}
-# add foreign server from dns
-my @tmp_servers;
-if ( !$server_domain) {
- # Try our DNS Searchlist
- for my $domain(get_dns_domains()) {
- chomp($domain);
- my @tmp_domains= &get_server_addresses($domain);
- if(@tmp_domains) {
- for my $tmp_server(@tmp_domains) {
- push @tmp_servers, $tmp_server;
+ daemon_log("0 INFO: found foreign server in config file: ".join(", ", @foreign_server_list), 5);
+}
+
+# Perform a DNS lookup for server registration if flag is true
+if ($dns_lookup eq "true") {
+ # Add foreign server from dns
+ my @tmp_servers;
+ if (not $server_domain) {
+ # Try our DNS Searchlist
+ for my $domain(get_dns_domains()) {
+ chomp($domain);
+ my ($tmp_domains, $error_string) = &get_server_addresses($domain);
+ if(@$tmp_domains) {
+ for my $tmp_server(@$tmp_domains) {
+ push @tmp_servers, $tmp_server;
+ }
}
}
+ if(@tmp_servers && length(@tmp_servers)==0) {
+ daemon_log("0 WARNING: no foreign gosa-si-server found in DNS for domain '$server_domain'", 3);
+ }
+ } else {
+ @tmp_servers = &get_server_addresses($server_domain);
+ if( 0 == @tmp_servers ) {
+ daemon_log("0 WARNING: no foreign gosa-si-server found in DNS for domain '$server_domain'", 3);
+ }
}
- if(@tmp_servers && length(@tmp_servers)==0) {
- daemon_log("0 WARNING: no foreign gosa-si-server found in DNS for domain '$server_domain'", 3);
+
+ daemon_log("0 INFO: found foreign server via DNS ".join(", ", @tmp_servers), 5);
+
+ foreach my $server (@tmp_servers) {
+ unshift(@foreign_server_list, $server);
}
} else {
- @tmp_servers = &get_server_addresses($server_domain);
- if( 0 == @tmp_servers ) {
- daemon_log("0 WARNING: no foreign gosa-si-server found in DNS for domain '$server_domain'", 3);
- }
-}
-foreach my $server (@tmp_servers) {
- unshift(@foreign_server_list, $server);
+ daemon_log("0 INFO: DNS lookup for server registration is disabled", 5);
}
+
+
# eliminate duplicate entries
@foreign_server_list = &del_doubles(@foreign_server_list);
my $all_foreign_server = join(", ", @foreign_server_list);
-daemon_log("0 INFO: found foreign server in config file and DNS: $all_foreign_server", 5);
+daemon_log("0 INFO: found foreign server in config file and DNS: '$all_foreign_server'", 5);
# add all found foreign servers to known_server
my $act_timestamp = &get_time();
my $res = $known_server_db->add_dbentry( {table=>$known_server_tn,
primkey=>['hostname'],
hostname=>$foreign_server,
+ macaddress=>"",
status=>'not_jet_registered',
hostkey=>"none",
+ loaded_modules => "none",
timestamp=>$act_timestamp,
} );
}
POE::Component::Server::TCP->new(
- Alias => "TCP_SERVER",
+ Alias => "TCP_SERVER",
Port => $server_port,
ClientInput => sub {
- my ($kernel, $input) = @_[KERNEL, ARG0];
- push(@tasks, $input);
- push(@msgs_to_decrypt, $input);
- $kernel->yield("msg_to_decrypt");
- },
- InlineStates => {
- msg_to_decrypt => \&msg_to_decrypt,
- next_task => \&next_task,
- task_result => \&handle_task_result,
- task_done => \&handle_task_done,
- task_debug => \&handle_task_debug,
- child_reap => sub { "Do nothing special. I'm just a comment, but i'm necessary!" },
- }
+ my ($kernel, $input, $heap, $session) = @_[KERNEL, ARG0, HEAP, SESSION];
+ my $session_id = $session->ID;
+ my $remote_ip = $heap->{'remote_ip'};
+ push(@msgs_to_decrypt, $input);
+ &daemon_log("$session_id DEBUG: incoming message from '$remote_ip'", 7);
+ $kernel->yield("msg_to_decrypt");
+ },
+ InlineStates => {
+ msg_to_decrypt => \&msg_to_decrypt,
+ next_task => \&next_task,
+ task_result => \&handle_task_result,
+ task_done => \&handle_task_done,
+ task_debug => \&handle_task_debug,
+ child_reap => sub { "Do nothing special. I'm just a comment, but i'm necessary!" },
+ }
);
-daemon_log("start socket for incoming xml messages at port '$server_port' ", 1);
+daemon_log("0 INFO: start socket for incoming xml messages at port '$server_port' ", 1);
# create session for repeatedly checking the job queue for jobs
POE::Session->create(