index 787baff7f130dee2b1c8d91d0d83ad116d53b5e1..4e8705902fa71a76c43613b132a95b8730de400d 100644 (file)
use Net::LDAP;
use Socket;
use Net::hostent;
-use utf8;
my $event_dir = "/usr/lib/gosa-si/server/events";
use lib "/usr/lib/gosa-si/server/events";
BEGIN{}
END {}
-my ($server_ip, $server_mac_address, $server_port, $SIPackages_key, $max_clients, $ldap_uri, $ldap_base, $ldap_admin_dn, $ldap_admin_password, $server_interface);
+my ($server_ip, $server_port, $SIPackages_key, $max_clients, $ldap_uri, $ldap_base, $ldap_admin_dn, $ldap_admin_password, $server_interface);
my ($bus_activ, $bus_key, $bus_ip, $bus_port);
my $server;
my $event_hash;
},
"server" => {
"ip" => [\$server_ip, "0.0.0.0"],
- "mac-address" => [\$server_mac_address, "00:00:00:00:00"],
+ "mac-address" => [\$main::server_mac_address, "00:00:00:00:00"],
"port" => [\$server_port, "20081"],
"ldap-uri" => [\$ldap_uri, ""],
"ldap-base" => [\$ldap_base, ""],
# if server_ip is not an ip address but a name
if( inet_aton($server_ip) ){ $server_ip = inet_ntoa(inet_aton($server_ip)); }
$network_interface= &get_interface_for_ip($server_ip);
-$server_mac_address= &get_mac($network_interface);
+$main::server_mac_address= &get_mac($network_interface);
&import_events();
# Unit tag can be defined in config
if((not defined($main::gosa_unit_tag)) || length($main::gosa_unit_tag) == 0) {
# Read gosaUnitTag from LDAP
- &main::refresh_ldap_handle();
- if( defined($main::ldap_handle) ) {
- &main::daemon_log("INFO: Searching for servers gosaUnitTag with mac address $server_mac_address",5);
+
+ my $ldap_handle = &main::get_ldap_handle();
+ if( defined($ldap_handle) ) {
+ &main::daemon_log("INFO: Searching for servers gosaUnitTag with mac address $main::server_mac_address",5);
# Perform search for Unit Tag
- $mesg = $main::ldap_handle->search(
+ $mesg = $ldap_handle->search(
base => $ldap_base,
scope => 'sub',
attrs => ['gosaUnitTag'],
- filter => "(macaddress=$server_mac_address)"
+ filter => "(macaddress=$main::server_mac_address)"
);
if ($mesg->count == 1) {
my $entry= $mesg->entry(0);
my $unit_tag= $entry->get_value("gosaUnitTag");
+ $main::ldap_server_dn= $mesg->entry(0)->dn;
if(defined($unit_tag) && length($unit_tag) > 0) {
&main::daemon_log("INFO: Detected gosaUnitTag $unit_tag for creating entries", 5);
$main::gosa_unit_tag= $unit_tag;
my $hostname= `hostname -f`;
chomp($hostname);
&main::daemon_log("INFO: Searching for servers gosaUnitTag with hostname $hostname",5);
- $mesg = $main::ldap_handle->search(
+ $mesg = $ldap_handle->search(
base => $ldap_base,
scope => 'sub',
attrs => ['gosaUnitTag'],
if ($mesg->count == 1) {
my $entry= $mesg->entry(0);
my $unit_tag= $entry->get_value("gosaUnitTag");
+ $main::ldap_server_dn= $mesg->entry(0)->dn;
if(defined($unit_tag) && length($unit_tag) > 0) {
&main::daemon_log("INFO: Detected gosaUnitTag $unit_tag for creating entries", 5);
$main::gosa_unit_tag= $unit_tag;
$hostname= `hostname -s`;
chomp($hostname);
&main::daemon_log("INFO: Searching for servers gosaUnitTag with hostname $hostname",5);
- $mesg = $main::ldap_handle->search(
+ $mesg = $ldap_handle->search(
base => $ldap_base,
scope => 'sub',
attrs => ['gosaUnitTag'],
if ($mesg->count == 1) {
my $entry= $mesg->entry(0);
my $unit_tag= $entry->get_value("gosaUnitTag");
+ $main::ldap_server_dn= $mesg->entry(0)->dn;
if(defined($unit_tag) && length($unit_tag) > 0) {
&main::daemon_log("INFO: Detected gosaUnitTag $unit_tag for creating entries", 5);
$main::gosa_unit_tag= $unit_tag;
#===============================================================================
sub read_configfile {
my $cfg;
- if( defined( $main::cfg_file) && ( length($main::cfg_file) > 0 )) {
+ if( defined( $main::cfg_file) && ( (-s $main::cfg_file) > 0 )) {
if( -r $main::cfg_file ) {
$cfg = Config::IniFiles->new( -file => $main::cfg_file );
} else {
my $SIOCGIFHWADDR= 0x8927; # man 2 ioctl_list
# A configured MAC Address should always override a guessed value
- if ($server_mac_address and length($server_mac_address) > 0) {
- $result= $server_mac_address;
+ if ($main::server_mac_address and length($main::server_mac_address) > 0) {
+ $result= $main::server_mac_address;
}
socket SOCKET, PF_INET, SOCK_DGRAM, getprotobyname('ip')
sub import_events {
if (not -e $event_dir) {
- &main::daemon_log("ERROR: cannot find directory or directory is not readable: $event_dir", 1);
+ &main::daemon_log("S ERROR: cannot find directory or directory is not readable: $event_dir", 1);
}
opendir (DIR, $event_dir) or die "ERROR while loading gosa-si-events from directory $event_dir : $!\n";
eval{ require $event; };
if( $@ ) {
- &main::daemon_log("import of event module '$event' failed", 1);
+ &main::daemon_log("S ERROR: import of event module '$event' failed", 1);
&main::daemon_log("$@", 8);
next;
}
$event_hash->{$event_name} = $event_module;
}
my $events_string = join( ", ", @{$events_l});
- &main::daemon_log("INFO: SIPackages imported events $events_string", 5);
+ &main::daemon_log("S DEBUG: SIPackages imported events $events_string", 8);
}
}
my $error = 0;
my $host_name;
my $host_key;
- my @out_msg_l = ();
+ my @out_msg_l = ("nohandler");
# process incoming msg
my $header = @{$msg_hash->{header}}[0];
# skip PREFIX
$header =~ s/^CLMSG_//;
- &main::daemon_log("DEBUG: SIPackages: msg to process: $header", 7);
+ &main::daemon_log("$session_id DEBUG: SIPackages: msg to process: $header", 7);
if( 0 == length @target_l){
- &main::daemon_log("ERROR: no target specified for msg $header", 1);
+ &main::daemon_log("$session_id ERROR: no target specified for msg $header", 1);
$error++;
}
if ($header eq 'new_key') {
@out_msg_l = &new_key($msg_hash)
} elsif ($header eq 'here_i_am') {
- @out_msg_l = &here_i_am($msg_hash)
+ @out_msg_l = &here_i_am($msg, $msg_hash, $session_id)
} else {
if( exists $event_hash->{$header} ) {
# a event exists with the header as name
- &main::daemon_log("INFO: found event '$header' at event-module '".$event_hash->{$header}."'", 5);
+ &main::daemon_log("$session_id INFO: found event '$header' at event-module '".$event_hash->{$header}."'", 5);
no strict 'refs';
@out_msg_l = &{$event_hash->{$header}."::$header"}($msg, $msg_hash, $session_id);
}
}
# if delivery not possible raise error and return
- if( not @out_msg_l ) {
- &main::daemon_log("WARNING: SIPackages got no answer from event handler '$header'", 3);
- } elsif( 0 == @out_msg_l) {
- &main::daemon_log("ERROR: SIPackages: no event handler or core function defined for '$header'", 1);
+ if( not defined $out_msg_l[0] ) {
+ @out_msg_l = ();
+ } elsif( $out_msg_l[0] eq 'nohandler') {
+ &main::daemon_log("$session_id ERROR: SIPackages: no event handler or core function defined for '$header'", 1);
+ @out_msg_l = ();
}
+
}
else {
&main::daemon_log("INFO: msg is not for gosa-si-server '$server_address', deliver it to target '$target'", 5);
# DESCRIPTION: process this incoming message
#===============================================================================
sub here_i_am {
- my ($msg_hash) = @_;
+ my ($msg, $msg_hash, $session_id) = @_;
my @out_msg_l;
my $out_hash;
my $db_res= $main::known_clients_db->select_dbentry( $sql_statement );
if ( 1 == keys %{$db_res} ) {
- &main::daemon_log("WARNING: $source is already known as a client", 1);
- &main::daemon_log("WARNING: values for $source are being overwritten", 1);
+ &main::daemon_log("$session_id WARNING: $source is already known as a client", 1);
+ &main::daemon_log("$session_id WARNING: values for $source are being overwritten", 1);
$nu_clients --;
}
# number of actual activ clients
my $act_nu_clients = $nu_clients;
- &main::daemon_log("INFO: number of actual activ clients: $act_nu_clients", 5);
- &main::daemon_log("INFO: number of maximal allowed clients: $max_clients", 5);
+ &main::daemon_log("$session_id INFO: number of actual activ clients: $act_nu_clients", 5);
+ &main::daemon_log("$session_id INFO: number of maximal allowed clients: $max_clients", 5);
if($max_clients <= $act_nu_clients) {
my $out_hash = &create_xml_hash("denied", $server_address, $source);
} );
if ($res != 0) {
- &main::daemon_log("ERROR: cannot add entry to known_clients: $res");
+ &main::daemon_log("$session_id ERROR: cannot add entry to known_clients: $res");
return;
}
&add_content2xml_hash($out_hash, "timestamp", $act_timestamp);
my $new_client_out = &create_xml_string($out_hash);
push(@out_msg_l, $new_client_out);
- &main::daemon_log("INFO: send bus msg that client '$source' has registered at server '$server_address'", 5);
+ &main::daemon_log("$session_id INFO: send bus msg that client '$source' has registered at server '$server_address'", 5);
}
# give the new client his ldap config
# Workaround: Send within the registration response, if the client will get an ldap config later
- my $new_ldap_config_out = &new_ldap_config($source);
- if( $new_ldap_config_out && (!($new_ldap_config_out =~ /error/ ))) {
+ my $new_ldap_config_out = &new_ldap_config($source, $session_id);
+ if($new_ldap_config_out && (!($new_ldap_config_out =~ /error/))) {
&add_content2xml_hash($out_hash, "ldap_available", "true");
- } elsif ($new_ldap_config_out && $new_ldap_config_out =~ /error/){
+ } elsif($new_ldap_config_out && $new_ldap_config_out =~ /error/){
&add_content2xml_hash($out_hash, "error", $new_ldap_config_out);
+
+ my $sql_statement = "UPDATE $main::job_queue_tn ".
+ "SET status='error', result='$new_ldap_config_out' ".
+ "WHERE status='processing' AND macaddress LIKE '$mac_address'";
+ my $res = $main::job_db->update_dbentry($sql_statement);
+ &main::daemon_log("$session_id DEBUG: $sql_statement RESULT: $res", 7);
}
my $register_out = &create_xml_string($out_hash);
push(@out_msg_l, $register_out);
# Really send the ldap config
- if( $new_ldap_config_out (!($new_ldap_config_out =~ /error/))) {
+ if( $new_ldap_config_out && (!($new_ldap_config_out =~ /error/))) {
push(@out_msg_l, $new_ldap_config_out);
}
- my $hardware_config_out = &hardware_config($source, $gotoHardwareChecksum);
+ my $hardware_config_out = &hardware_config($msg, $msg_hash, $session_id);
if( $hardware_config_out ) {
push(@out_msg_l, $hardware_config_out);
}
# DESCRIPTION: send to address the ldap configuration found for dn gotoLdapServer
#===============================================================================
sub new_ldap_config {
- my ($address) = @_ ;
+ my ($address, $session_id) = @_ ;
my $sql_statement= "SELECT * FROM known_clients WHERE hostname='$address' OR macaddress LIKE '$address'";
my $res = $main::known_clients_db->select_dbentry( $sql_statement );
# check hit
my $hit_counter = keys %{$res};
if( not $hit_counter == 1 ) {
- &main::daemon_log("ERROR: more or no hit found in known_clients_db by query by '$address'", 1);
+ &main::daemon_log("$session_id ERROR: more or no hit found in known_clients_db by query by '$address'", 1);
}
$address = $res->{1}->{hostname};
my $hostkey = $res->{1}->{hostkey};
if (not defined $macaddress) {
- &main::daemon_log("ERROR: no mac address found for client $address", 1);
+ &main::daemon_log("$session_id ERROR: no mac address found for client $address", 1);
return;
}
# Build LDAP connection
- &main::refresh_ldap_handle();
- if( not defined $main::ldap_handle ) {
- &main::daemon_log("ERROR: cannot connect to ldap: $ldap_uri", 1);
+ my $ldap_handle = &main::get_ldap_handle($session_id);
+ if( not defined $ldap_handle ) {
+ &main::daemon_log("$session_id ERROR: cannot connect to ldap: $ldap_uri", 1);
return;
}
# Perform search
- $mesg = $main::ldap_handle->search( base => $ldap_base,
+ $mesg = $ldap_handle->search( base => $ldap_base,
scope => 'sub',
attrs => ['dn', 'gotoLdapServer', 'gosaUnitTag', 'FAIclass'],
filter => "(&(objectClass=GOhard)(macaddress=$macaddress)(gotoLdapServer=*))");
#$mesg->code && die $mesg->error;
if($mesg->code) {
- &main::daemon_log($mesg->error, 1);
+ &main::daemon_log("$session_id ".$mesg->error, 1);
return;
}
# Sanity check
if ($mesg->count != 1) {
- &main::daemon_log("WARNING: client with mac address $macaddress not found/unique/active - not sending ldap config", 1);
- &main::daemon_log("\tbase: $ldap_base", 1);
- &main::daemon_log("\tscope: sub", 1);
- &main::daemon_log("\tattrs: dn, gotoLdapServer", 1);
- &main::daemon_log("\tfilter: (&(objectClass=GOhard)(macaddress=$macaddress)(gotoLdapServer=*))", 1);
+ &main::daemon_log("$session_id WARNING: client with mac address $macaddress not found/unique/active - not sending ldap config".
+ "\n\tbase: $ldap_base".
+ "\n\tscope: sub".
+ "\n\tattrs: dn, gotoLdapServer".
+ "\n\tfilter: (&(objectClass=GOhard)(macaddress=$macaddress)(gotoLdapServer=*))", 1);
return;
}
# Do we need to look at an object class?
if (length(@servers) < 1){
- $mesg = $main::ldap_handle->search( base => $ldap_base,
+ $mesg = $ldap_handle->search( base => $ldap_base,
scope => 'sub',
attrs => ['dn', 'gotoLdapServer', 'FAIclass'],
filter => "(&(objectClass=gosaGroupOfNames)(member=$dn))");
#$mesg->code && die $mesg->error;
if($mesg->code) {
- &main::daemon_log($mesg->error, 1);
+ &main::daemon_log("$session_id ".$mesg->error, 1);
return;
}
# Sanity check
if ($mesg->count != 1) {
- &main::daemon_log("WARNING: no LDAP information found for client mac $macaddress", 1);
+ &main::daemon_log("$session_id WARNING: no LDAP information found for client mac $macaddress", 1);
return;
}
if (defined $unit_tag){
# Find admin base and department name
- $mesg = $main::ldap_handle->search( base => $ldap_base,
+ $mesg = $ldap_handle->search( base => $ldap_base,
scope => 'sub',
attrs => ['dn', 'ou'],
filter => "(&(objectClass=gosaAdministrativeUnit)(gosaUnitTag=$unit_tag))");
# DESCRIPTION:
#===============================================================================
sub hardware_config {
- my ($address, $gotoHardwareChecksum) = @_ ;
+ my ($msg, $msg_hash, $session_id) = @_ ;
+ my $address = @{$msg_hash->{source}}[0];
+ my $header = @{$msg_hash->{header}}[0];
+ my $gotoHardwareChecksum = @{$msg_hash->{gotoHardwareChecksum}}[0];
my $sql_statement= "SELECT * FROM known_clients WHERE hostname='$address'";
my $res = $main::known_clients_db->select_dbentry( $sql_statement );
# check hit
my $hit_counter = keys %{$res};
if( not $hit_counter == 1 ) {
- &main::daemon_log("ERROR: more or no hit found in known_clients_db by query by '$address'", 1);
+ &main::daemon_log("$session_id ERROR: more or no hit found in known_clients_db by query by '$address'", 1);
}
-
my $macaddress = $res->{1}->{macaddress};
my $hostkey = $res->{1}->{hostkey};
if (not defined $macaddress) {
- &main::daemon_log("ERROR: no mac address found for client $address", 1);
+ &main::daemon_log("$session_id ERROR: no mac address found for client $address", 1);
return;
}
# Build LDAP connection
- &main::refresh_ldap_handle();
- if( not defined $main::ldap_handle ) {
- &main::daemon_log("ERROR: cannot connect to ldap: $ldap_uri", 1);
+ my $ldap_handle = &main::get_ldap_handle($session_id);
+ if( not defined $ldap_handle ) {
+ &main::daemon_log("$session_id ERROR: cannot connect to ldap: $ldap_uri", 1);
return;
}
# Perform search
- $mesg = $main::ldap_handle->search(
+ $mesg = $ldap_handle->search(
base => $ldap_base,
scope => 'sub',
filter => "(&(objectClass=GOhard)(|(macAddress=$macaddress)(dhcpHWaddress=ethernet $macaddress)))"
if($mesg->count() == 0) {
&main::daemon_log("Host was not found in LDAP!", 1);
+
+ # set status = hardware_detection at jobqueue if entry exists
+ my $func_dic = {table=>$main::job_queue_tn,
+ primkey=>['id'],
+ timestamp=>&get_time,
+ status=>'processing',
+ result=>'none',
+ progress=>'hardware-detection',
+ headertag=>'trigger_action_reinstall',
+ targettag=>$address,
+ xmlmessage=>'none',
+ macaddress=>$macaddress,
+ };
+ my $hd_res = $main::job_db->add_dbentry($func_dic);
+ &main::daemon_log("$session_id INFO: add '$macaddress' to job queue as an installing job", 5);
+
} else {
my $entry= $mesg->entry(0);
my $dn= $entry->dn;
- if(defined($entry->get_value("gotoHardwareChecksum"))) {
- if(! $entry->get_value("gotoHardwareChecksum") eq $gotoHardwareChecksum) {
+ if (defined($entry->get_value("gotoHardwareChecksum"))) {
+ if (! $entry->get_value("gotoHardwareChecksum") eq $gotoHardwareChecksum) {
$entry->replace(gotoHardwareChecksum => $gotoHardwareChecksum);
- if($entry->update($main::ldap_handle)) {
- &main::daemon_log("Hardware changed! Detection triggered.", 4);
+ if($entry->update($ldap_handle)) {
+ &main::daemon_log("$session_id INFO: Hardware changed! Detection triggered.", 5);
}
} else {
# Nothing to do
return;
}
- }
+ }
}
# Assemble data package
$data{'goto_secret'}= $goto_secret;
}
- &main::daemon_log("Send detect_hardware message to $address", 4);
-
# Send information
return &build_msg("detect_hardware", $server_address, $address, \%data);
}