index e7372d8df493647fb517801de24b7374b1084f8f..f346ae26d566b13b025f7dcb572d6c2d7cb9e0ad 100644 (file)
use XML::Simple;
use Data::Dumper;
use Net::LDAP;
-use Socket qw/PF_INET SOCK_DGRAM inet_ntoa sockaddr_in/;
+use Socket;
+use Net::hostent;
BEGIN{}
END {}
my ($known_clients_file_name);
-my ($server_activ, $server_ip, $server_mac_address, $server_port, $server_passwd, $max_clients, $ldap_uri, $ldap_base, $ldap_admin_dn, $ldap_admin_password);
+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 $server;
my $network_interface;
"server_ip" => [\$server_ip, "0.0.0.0"],
"server_mac_address" => [\$server_mac_address, ""],
"server_port" => [\$server_port, "20081"],
- "server_passwd" => [\$server_passwd, ""],
+ "SIPackages_key" => [\$SIPackages_key, ""],
"max_clients" => [\$max_clients, 100],
"ldap_uri" => [\$ldap_uri, ""],
"ldap_base" => [\$ldap_base, ""],
®ister_at_bus();
}
+# add myself to known_server_db
+my $res = $main::known_server_db->add_dbentry( {table=>'known_server',
+ primkey=>'hostname',
+ hostname=>$server_address,
+ status=>'myself',
+ hostkey=>$SIPackages_key,
+ timestamp=>&get_time,
+ } );
+
+
+
### functions #################################################################
sub get_module_info {
my @info = ($server_address,
- $server_passwd,
+ $SIPackages_key,
$server,
$server_activ,
"socket",
}
+
+sub do_wake {
+ my $host = shift;
+ my $ipaddr = shift || '255.255.255.255';
+ my $port = getservbyname('discard', 'udp');
+
+ my ($raddr, $them, $proto);
+ my ($hwaddr, $hwaddr_re, $pkt);
+
+ # get the hardware address (ethernet address)
+
+ $hwaddr_re = join(':', ('[0-9A-Fa-f]{1,2}') x 6);
+ if ($host =~ m/^$hwaddr_re$/) {
+ $hwaddr = $host;
+ } else {
+ # $host is not a hardware address, try to resolve it
+ my $ip_re = join('\.', ('([0-9]|[1-9][0-9]|1[0-9]{2}|2([0-4][0-9]|5[0-5]))') x 4);
+ my $ip_addr;
+ if ($host =~ m/^$ip_re$/) {
+ $ip_addr = $host;
+ } else {
+ my $h;
+ unless ($h = gethost($host)) {
+ return undef;
+ }
+ $ip_addr = inet_ntoa($h->addr);
+ }
+ }
+
+ # Generate magic sequence
+ foreach (split /:/, $hwaddr) {
+ $pkt .= chr(hex($_));
+ }
+ $pkt = chr(0xFF) x 6 . $pkt x 16;
+
+ # Allocate socket and send packet
+
+ $raddr = gethostbyname($ipaddr)->addr;
+ $them = pack_sockaddr_in($port, $raddr);
+ $proto = getprotobyname('udp');
+
+ socket(S, AF_INET, SOCK_DGRAM, $proto) or die "socket : $!";
+ setsockopt(S, SOL_SOCKET, SO_BROADCAST, 1) or die "setsockopt : $!";
+
+ send(S, $pkt, 0, $them) or die "send : $!";
+ close S;
+}
+
+
#=== FUNCTION ================================================================
# NAME: read_configfile
# PARAMETERS: cfg_file - string -
timestamp=>&get_time,
} );
my $msg_hash = &create_xml_hash("here_i_am", $server_address, $bus_address);
- my $answer = "";
- $answer = &send_msg_hash2address($msg_hash, $bus_address, $bus_passwd);
- if ($answer == 0) {
- &main::daemon_log("register at bus: $bus_address", 1);
- } else {
- &main::daemon_log("unable to send 'register'-msg to bus '$bus_address': $answer", 1);
- }
- return;
+ my $msg = &create_xml_string($msg_hash);
+ return $msg;
+# my $answer = "";
+# $answer = &send_msg_hash2address($msg_hash, $bus_address, $bus_passwd);
+# if ($answer == 0) {
+# &main::daemon_log("register at bus: $bus_address", 1);
+# } else {
+# &main::daemon_log("unable to send 'register'-msg to bus '$bus_address': $answer", 1);
+# }
+# return;
}
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)}
- elsif ($header eq 'detected_hardware') { @out_msg_l = &process_detected_hardware($msg_hash)}
- else {
+ 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)
+ } elsif ($header eq 'detected_hardware') {
+ @out_msg_l = &process_detected_hardware($msg_hash)
+ } elsif ($header eq 'trigger_wake') {
+ my $in_hash= &transform_msg2hash($msg);
+ foreach (@{$in_hash->{macAddress}}){
+ &main::daemon_log("SIPackages: trigger wake for $_", 1);
+ do_wake($_);
+ }
+
+ } else {
&main::daemon_log("ERROR: $header is an unknown core function", 1);
$error++;
}
#===============================================================================
sub who_has {
my ($msg_hash) = @_ ;
+ my @out_msg_l;
# what is your search pattern
my $search_pattern = @{$msg_hash->{who_has}}[0];
# search was successful
if (defined $host_address) {
my $source = @{$msg_hash->{source}}[0];
- my $out_msg = &create_xml_hash("who_has_i_do", $server_address, $source, "mac_address");
- &add_content2xml_hash($out_msg, "mac_address", $search_element);
- &send_msg_hash2address($out_msg, $bus_address);
+ my $out_hash = &create_xml_hash("who_has_i_do", $server_address, $source, "mac_address");
+ &add_content2xml_hash($out_hash, "mac_address", $search_element);
+ my $out_msg = &create_xml_string($out_hash);
+ push(@out_msg_l, $out_msg);
}
- return;
+ return @out_msg_l;
}
# Bind to a directory with dn and password
- my $mesg= $ldap->bind($ldap_admin_dn, $ldap_admin_password);
+ my $mesg= $ldap->bind($ldap_admin_dn, password => $ldap_admin_password);
# Perform search
$mesg = $ldap->search( base => $ldap_base,
$mesg = $ldap->unbind;
# Send information
- return send_msg("new_ldap_config", $server_address, $address, \%data, $hostkey);
+ return send_msg("new_ldap_config", $server_address, $address, \%data);
}
sub process_detected_hardware {
# DESCRIPTION:
#===============================================================================
sub hardware_config {
- my ($address, $gotoHardwareChecksum, $detectedHardware) = @_ ;
+ my ($address, $gotoHardwareChecksum) = @_ ;
my $sql_statement= "SELECT * FROM known_clients WHERE hostname='$address'";
my $res = $main::known_clients_db->select_dbentry( $sql_statement );
return;
}
-
# Bind to a directory with dn and password
- my $mesg= $ldap->bind($ldap_admin_dn, $ldap_admin_password);
+ my $mesg= $ldap->bind($ldap_admin_dn, password => $ldap_admin_password);
# Perform search
- $mesg = $ldap->search( base => $ldap_base,
- scope => 'sub',
- attrs => ['dn', 'gotoHardwareChecksum'],
- filter => "(&(objectClass=GOhard)(macaddress=$macaddress))");
- #$mesg->code && die $mesg->error;
+ $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);
+ return;
+ }
- #my $entry= $mesg->entry(0);
- #my $dn= $entry->dn;
- #my @servers= $entry->get_value("gotoHardwareChecksum");
+ my $entry= $mesg->entry(0);
+ my $dn= $entry->dn;
+ if(defined($entry->get_value("gotoHardwareChecksum"))) {
+ return;
+ } else {
+ # need to fill it to LDAP
+ $entry->add(gotoHardwareChecksum => $gotoHardwareChecksum);
+ &main::daemon_log(Dumper($entry->update($ldap)),1);
+
+ # 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 = ();
&main::daemon_log("Send detect_hardware message to $address", 4);
# Send information
- return send_msg("detect_hardware", $server_address, $address, \%data, $hostkey);
+ return send_msg("detect_hardware", $server_address, $address, \%data);
}