index 81ae0671bcd735a066190350e6b2e0f02ea1fac0..fa4d03fd5b948e8200649f76c8ca88446aff6da4 100644 (file)
use Net::LDAP;
use Socket;
use Net::hostent;
+use Net::DNS;
BEGIN{}
END {}
my ($known_clients_file_name);
my ($server_activ, $server_ip, $server_mac_address, $server_port, $SIPackages_key, $max_clients, $ldap_uri, $ldap_base, $ldap_admin_dn, $ldap_admin_password);
-my ($bus_activ, $bus_passwd, $bus_ip, $bus_port);
+my ($bus_activ, $bus_key, $bus_ip, $bus_port);
my $server;
my $network_interface;
my $no_bus;
},
"bus" =>
{"bus_activ" => [\$bus_activ, "on"],
- "bus_passwd" => [\$bus_passwd, ""],
+ "bus_passwd" => [\$bus_key, ""],
"bus_ip" => [\$bus_ip, ""],
"bus_port" => [\$bus_port, "20080"],
},
primkey=>'hostname',
hostname=>$bus_address,
status=>'bus',
- hostkey=>$bus_passwd,
+ hostkey=>$bus_key,
timestamp=>&get_time,
} );
my $msg_hash = &create_xml_hash("here_i_am", $server_address, $bus_address);
my $msg = &create_xml_string($msg_hash);
+
+ &main::send_msg_to_target($msg, $bus_address, $bus_key, "here_i_am");
return $msg;
# my $answer = "";
# $answer = &send_msg_hash2address($msg_hash, $bus_address, $bus_passwd);
# DESCRIPTION: handels the proceeded distribution to the appropriated functions
#===============================================================================
sub process_incoming_msg {
- my ($msg, $msg_hash) = @_ ;
+ my ($msg, $msg_hash, $remote_ip) = @_ ;
my $error = 0;
my $host_name;
my $host_key;
# process incoming msg
my $header = @{$msg_hash->{header}}[0];
- my $source = @{$msg_hash->{source}}[0];
my @target_l = @{$msg_hash->{target}};
&main::daemon_log("SIPackages: msg to process: $header", 3);
if( 1 == length @target_l) {
my $target = $target_l[0];
if( $target eq $server_address ) {
- if ($header eq 'new_passwd') {
- @out_msg_l = &new_passwd($msg_hash)
- } elsif ($header eq 'here_i_am') {
- @out_msg_l = &here_i_am($msg_hash)
- } elsif ($header eq 'who_has') {
- @out_msg_l = &who_has($msg_hash)
- } elsif ($header eq 'who_has_i_do') {
- @out_msg_l = &who_has_i_do($msg_hash)
- } elsif ($header eq 'got_ping') {
- @out_msg_l = &got_ping($msg_hash)
- } elsif ($header eq 'get_load') {
- @out_msg_l = &execute_actions($msg_hash)
+ 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)
+ } elsif ($header eq 'who_has') {
+ @out_msg_l = &who_has($msg_hash)
+ } elsif ($header eq 'who_has_i_do') {
+ @out_msg_l = &who_has_i_do($msg_hash)
+ } elsif ($header eq 'got_ping') {
+ @out_msg_l = &got_ping($msg_hash)
+ } elsif ($header eq 'get_load') {
+ @out_msg_l = &execute_actions($msg_hash)
} elsif ($header eq 'detected_hardware') {
- @out_msg_l = &process_detected_hardware($msg_hash)
- } elsif ($header eq 'trigger_wake') {
- foreach (@{$msg_hash->{macAddress}}){
- &main::daemon_log("SIPackages: trigger wake for $_", 1);
- do_wake($_);
- }
+ @out_msg_l = &process_detected_hardware($msg_hash)
+ } elsif ($header eq 'trigger_wake') {
+ foreach (@{$msg_hash->{macAddress}}){
+ &main::daemon_log("SIPackages: trigger wake for $_", 1);
+ do_wake($_);
+ }
} else {
&main::daemon_log("ERROR: $header is an unknown core function", 1);
}
}
- if( $error == 0) {
- if( 0 == @out_msg_l ) {
- push(@out_msg_l, $msg);
- }
- }
+# if( $error == 0) {
+# if( 0 == @out_msg_l ) {
+# push(@out_msg_l, $msg);
+# }
+# }
return \@out_msg_l;
}
# RETURNS: nothing
# DESCRIPTION: process this incoming message
#===============================================================================
-sub new_passwd {
+sub new_key {
my ($msg_hash) = @_;
my @out_msg_l;
my $header = @{$msg_hash->{header}}[0];
my $source_name = @{$msg_hash->{source}}[0];
- my $source_key = @{$msg_hash->{new_passwd}}[0];
+ my $source_key = @{$msg_hash->{new_key}}[0];
my $query_res;
# check known_clients_db
"SET hostkey='$source_key', timestamp='$act_time' ".
"WHERE hostname='$source_name'";
my $res = $main::known_clients_db->update_dbentry( $sql_statement );
-
my $hash = &create_xml_hash("confirm_new_passwd", $server_address, $source_name);
my $out_msg = &create_xml_string($hash);
push(@out_msg_l, $out_msg);
# add entry to known_clients_db
+ my $act_timestamp = &get_time;
my $res = $main::known_clients_db->add_dbentry( {table=>'known_clients',
primkey=>'hostname',
hostname=>$source,
macaddress=>$mac_address,
status=>'registered',
hostkey=>$new_passwd,
- timestamp=>&get_time,
+ timestamp=>$act_timestamp,
} );
if ($res != 0) {
# send update msg to bus
$out_hash = &create_xml_hash("new_client", $server_address, $bus_address, $source);
+ &add_content2xml_hash($out_hash, "macaddress", $mac_address);
+ &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("send bus msg that client '$source' has registerd at server '$server_address'", 3);
sub process_detected_hardware {
my $msg_hash = shift;
+ my $address = $msg_hash->{source}[0];
+ my $gotoHardwareChecksum= $msg_hash->{detected_hardware}[0]->{gotoHardwareChecksum};
-
- return;
-}
-#=== FUNCTION ================================================================
-# NAME: hardware_config
-# PARAMETERS: address - string - ip address and port of a host
-# RETURNS:
-# DESCRIPTION:
-#===============================================================================
-sub hardware_config {
- my ($address, $gotoHardwareChecksum) = @_ ;
-
my $sql_statement= "SELECT * FROM known_clients WHERE hostname='$address'";
my $res = $main::known_clients_db->select_dbentry( $sql_statement );
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);
+ return;
}
my $macaddress = $res->{1}->{macaddress};
&main::daemon_log("ERROR: no mac address found for client $address", 1);
return;
}
-
# Build LDAP connection
my $ldap = Net::LDAP->new($ldap_uri);
if( not defined $ldap ) {
scope => 'sub',
filter => "(&(objectClass=GOhard)(|(macAddress=$macaddress)(dhcpHWaddress=ethernet $macaddress)))"
);
+
+ # We need to create a base entry first (if not done from ArpHandler)
+ if($mesg->count == 0) {
+ &main::daemon_log("Need to create a new LDAP Entry for client $address", 1);
+ my $resolver=Net::DNS::Resolver->new;
+ my $ipaddress= $1 if $address =~ /^([0-9\.]*?):.*$/;
+ my $dnsresult= $resolver->search($ipaddress);
+ my $dnsname= (defined($dnsresult))?$dnsresult->{answer}[0]->{ptrdname}:$ipaddress;
+ my $cn = (($dnsname =~ /^(\d){1,3}\.(\d){1,3}\.(\d){1,3}\.(\d){1,3}/) ? $dnsname : sprintf "%s", $dnsname =~ /([^\.]+)\.?/);
+ my $dn = "cn=$cn,ou=incoming,$ldap_base";
+ &main::daemon_log("Creating entry for $dn",6);
+ my $entry= Net::LDAP::Entry->new( $dn );
+ $entry->dn($dn);
+ $entry->add("objectClass" => "goHard");
+ $entry->add("cn" => $cn);
+ $entry->add("macAddress" => $macaddress);
+ $entry->add("gotoSysStatus" => "new-system");
+ $entry->add("ipHostNumber" => $ipaddress);
+ if(my $res=$entry->update($ldap)) {
+ # Fill $mesg again
+ $mesg = $ldap->search(
+ base => $ldap_base,
+ scope => 'sub',
+ filter => "(&(objectClass=GOhard)(|(macAddress=$macaddress)(dhcpHWaddress=ethernet $macaddress)))"
+ );
+ } else {
+ &main::daemon_log("There was a problem adding the entry", 1);
+ }
+
+ }
- if($mesg->count() == 0) {
- &main::daemon_log("Host was not found in LDAP!", 1);
+ if($mesg->count == 1) {
+ my $entry= $mesg->entry(0);
+ $entry->changetype("modify");
+ foreach my $attribute (
+ "gotoSndModule", "ghNetNic", "gotoXResolution", "ghSoundAdapter", "ghCpuType", "gotoXkbModel",
+ "ghGfxAdapter", "gotoXMousePort", "ghMemSize", "gotoXMouseType", "ghUsbSupport", "gotoXHsync",
+ "gotoXDriver", "gotoXVsync", "gotoXMonitor", "gotoHardwareChecksum") {
+ if(defined($msg_hash->{detected_hardware}[0]->{$attribute})) {
+ if(defined($entry->get_value($attribute))) {
+ $entry->delete($attribute);
+ }
+ &main::daemon_log("Adding attribute $attribute with value ".$msg_hash->{detected_hardware}[0]->{$attribute},1);
+ $entry->add($attribute => $msg_hash->{detected_hardware}[0]->{$attribute});
+ }
+ }
+ foreach my $attribute (
+ "gotoModules", "ghScsiDev", "ghIdeDev") {
+ if(defined($msg_hash->{detected_hardware}[0]->{$attribute})) {
+ if(defined($entry->get_value($attribute))) {
+ $entry->delete($attribute);
+ }
+ foreach my $array_entry (@{$msg_hash->{detected_hardware}[0]->{$attribute}}) {
+ $entry->add($attribute => $array_entry);
+ }
+ }
+
+ }
+
+ if($entry->update($ldap)) {
+ &main::daemon_log("Added Hardware configuration to LDAP", 4);
+ }
+
+ }
+ return;
+}
+#=== FUNCTION ================================================================
+# NAME: hardware_config
+# PARAMETERS: address - string - ip address and port of a host
+# RETURNS:
+# DESCRIPTION:
+#===============================================================================
+sub hardware_config {
+ my ($address, $gotoHardwareChecksum) = @_ ;
+
+ 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);
+ }
+
+ 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);
return;
}
- my $entry= $mesg->entry(0);
- my $dn= $entry->dn;
- if(defined($entry->get_value("gotoHardwareChecksum"))) {
+ # Build LDAP connection
+ my $ldap = Net::LDAP->new($ldap_uri);
+ if( not defined $ldap ) {
+ &main::daemon_log("ERROR: cannot connect to ldap: $ldap_uri", 1);
return;
+ }
+
+ # Bind to a directory with dn and password
+ my $mesg= $ldap->bind($ldap_admin_dn, password => $ldap_admin_password);
+
+ # Perform search
+ $mesg = $ldap->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);
} else {
- # need to fill it to LDAP
- $entry->add(gotoHardwareChecksum => $gotoHardwareChecksum);
- &main::daemon_log(Dumper($entry->update($ldap)),1);
+ my $entry= $mesg->entry(0);
+ my $dn= $entry->dn;
+ if(defined($entry->get_value("gotoHardwareChecksum"))) {
+ if(! $entry->get_value("gotoHardwareChecksum") eq $gotoHardwareChecksum) {
+ $entry->replace(gotoHardwareChecksum => $gotoHardwareChecksum);
+ if($entry->update($ldap)) {
+ &main::daemon_log("Hardware changed! Detection triggered.", 4);
+ }
+ } else {
+ # Nothing to do
+ return;
+ }
+ }
+ }
+ # need to fill it to LDAP
+ #$entry->add(gotoHardwareChecksum => $gotoHardwareChecksum);
+ #if($entry->update($ldap)) {
+ # &main::daemon_log("gotoHardwareChecksum $gotoHardwareChecksum was added to LDAP", 4);
+ #}
+
+ ## Look if there another host with this checksum to use the hardware config
+ #$mesg = $ldap->search(
+ # base => $ldap_base,
+ # scope => 'sub',
+ # filter => "(&(objectClass=GOhard)(gotoHardwareChecksum=$gotoHardwareChecksum))"
+ #);
+
+ #if($mesg->count>1) {
+ # my $clone_entry= $mesg->entry(0);
+ # $entry->changetype("modify");
+ # foreach my $attribute (
+ # "gotoSndModule", "ghNetNic", "gotoXResolution", "ghSoundAdapter", "ghCpuType", "gotoXkbModel",
+ # "ghGfxAdapter", "gotoXMousePort", "ghMemSize", "gotoXMouseType", "ghUsbSupport", "gotoXHsync",
+ # "gotoXDriver", "gotoXVsync", "gotoXMonitor") {
+ # my $value= $clone_entry->get_value($attribute);
+ # if(defined($value)) {
+ # if(defined($entry->get_value($attribute))) {
+ # $entry->delete($attribute);
+ # }
+ # &main::daemon_log("Adding attribute $attribute with value $value",1);
+ # $entry->add($attribute => $value);
+ # }
+ # }
+ # foreach my $attribute (
+ # "gotoModules", "ghScsiDev", "ghIdeDev") {
+ # my $array= $clone_entry->get_value($attribute, 'as_ref' => 1);
+ # if(defined($array)) {
+ # if(defined($entry->get_value($attribute))) {
+ # $entry->delete($attribute);
+ # }
+ # foreach my $array_entry (@{$array}) {
+ # $entry->add($attribute => $array_entry);
+ # }
+ # }
+
+ # }
+ # if($entry->update($ldap)) {
+ # &main::daemon_log("Added Hardware configuration to LDAP", 4);
+ # }
+
+ #}
- # Look if there another host with this checksum to use the hardware config
- $mesg = $ldap->search(
- base => $ldap_base,
- scope => 'sub',
- filter => "(&(objectClass=GOhard)(gotoHardwareChecksum=$gotoHardwareChecksum))"
- );
- }
- # Assemble data package
- my %data = ();
+ # Assemble data package
+ my %data = ();
- # Need to append GOto settings?
- if (defined $goto_admin and defined $goto_secret){
- $data{'goto_admin'}= $goto_admin;
- $data{'goto_secret'}= $goto_secret;
- }
+ # Need to append GOto settings?
+ if (defined $goto_admin and defined $goto_secret){
+ $data{'goto_admin'}= $goto_admin;
+ $data{'goto_secret'}= $goto_secret;
+ }
- # Unbind
- $mesg = $ldap->unbind;
+ # Unbind
+ $mesg = $ldap->unbind;
&main::daemon_log("Send detect_hardware message to $address", 4);
- # Send information
- return send_msg("detect_hardware", $server_address, $address, \%data);
+
+ # Send information
+ return send_msg("detect_hardware", $server_address, $address, \%data);
}