index 00def48475f2a6e23380df446f3d58e25854fcef..64c72c0a36f0c3a4905a8df6b0ff164159b847b9 100644 (file)
use IO::Socket::INET;
use XML::Simple;
use Data::Dumper;
+use NetAddr::IP;
use Net::LDAP;
use Socket;
use Net::hostent;
+use Net::DNS;
+
+my $event_dir = "/usr/lib/gosa-si/server/events";
+use lib "/usr/lib/gosa-si/server/events";
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 ($server_ip, $server_mac_address, $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;
my $network_interface;
my $no_bus;
my (@ldap_cfg, @pam_cfg, @nss_cfg, $goto_admin, $goto_secret);
-
-my %cfg_defaults =
-(
-"server" =>
- {"server_activ" => [\$server_activ, "on"],
- "server_ip" => [\$server_ip, "0.0.0.0"],
- "server_mac_address" => [\$server_mac_address, ""],
- "server_port" => [\$server_port, "20081"],
- "SIPackages_key" => [\$SIPackages_key, ""],
- "max_clients" => [\$max_clients, 100],
- "ldap_uri" => [\$ldap_uri, ""],
- "ldap_base" => [\$ldap_base, ""],
- "ldap_admin_dn" => [\$ldap_admin_dn, ""],
- "ldap_admin_password" => [\$ldap_admin_password, ""],
+my %cfg_defaults = (
+"bus" => {
+ "activ" => [\$bus_activ, "on"],
+ "key" => [\$bus_key, ""],
+ "ip" => [\$bus_ip, ""],
+ "port" => [\$bus_port, "20080"],
+ },
+"server" => {
+ "ip" => [\$server_ip, "0.0.0.0"],
+ "mac-address" => [\$server_mac_address, "00:00:00:00:00"],
+ "port" => [\$server_port, "20081"],
+ "ldap-uri" => [\$ldap_uri, ""],
+ "ldap-base" => [\$ldap_base, ""],
+ "ldap-admin-dn" => [\$ldap_admin_dn, ""],
+ "ldap-admin-password" => [\$ldap_admin_password, ""],
+ "max-clients" => [\$max_clients, 100],
},
-"bus" =>
- {"bus_activ" => [\$bus_activ, "on"],
- "bus_passwd" => [\$bus_passwd, ""],
- "bus_ip" => [\$bus_ip, ""],
- "bus_port" => [\$bus_port, "20080"],
+"SIPackages" => {
+ "key" => [\$SIPackages_key, ""],
},
);
# read configfile and import variables
&read_configfile();
-# detect interfaces and mac address
-$network_interface= &get_interface_for_ip($server_ip);
-$server_mac_address= &get_mac($network_interface);
-# complete addresses
-if( $server_ip eq "0.0.0.0" ) {
- $server_ip = "127.0.0.1";
+# 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);
+
+&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
+ my $tmp_ldap= Net::LDAP->new($ldap_uri);
+ if( defined($tmp_ldap) ) {
+ &main::daemon_log("INFO: Searching for servers gosaUnitTag with mac address $server_mac_address",5);
+ my $mesg= $tmp_ldap->bind($ldap_admin_dn, password => $ldap_admin_password);
+ # Perform search for Unit Tag
+ $mesg = $tmp_ldap->search(
+ base => $ldap_base,
+ scope => 'sub',
+ attrs => ['gosaUnitTag'],
+ filter => "(macaddress=$server_mac_address)"
+ );
+
+ if ($mesg->count == 1) {
+ my $entry= $mesg->entry(0);
+ my $unit_tag= $entry->get_value("gosaUnitTag");
+ 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;
+ }
+ } else {
+ # Perform another search for Unit Tag
+ my $hostname= `hostname -f`;
+ chomp($hostname);
+ &main::daemon_log("INFO: Searching for servers gosaUnitTag with hostname $hostname",5);
+ $mesg = $tmp_ldap->search(
+ base => $ldap_base,
+ scope => 'sub',
+ attrs => ['gosaUnitTag'],
+ filter => "(&(cn=$hostname)(objectClass=goServer))"
+ );
+ if ($mesg->count == 1) {
+ my $entry= $mesg->entry(0);
+ my $unit_tag= $entry->get_value("gosaUnitTag");
+ 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;
+ }
+ } else {
+ # Perform another search for Unit Tag
+ $hostname= `hostname -s`;
+ chomp($hostname);
+ &main::daemon_log("INFO: Searching for servers gosaUnitTag with hostname $hostname",5);
+ $mesg = $tmp_ldap->search(
+ base => $ldap_base,
+ scope => 'sub',
+ attrs => ['gosaUnitTag'],
+ filter => "(&(cn=$hostname)(objectClass=goServer))"
+ );
+ if ($mesg->count == 1) {
+ my $entry= $mesg->entry(0);
+ my $unit_tag= $entry->get_value("gosaUnitTag");
+ 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;
+ }
+ } else {
+ &main::daemon_log("WARNING: No gosaUnitTag detected. Not using gosaUnitTag", 3);
+ }
+ }
+ }
+ $tmp_ldap->unbind;
+ } else {
+ &main::daemon_log("INFO: Using gosaUnitTag from config-file: $main::gosa_unit_tag",5);
+ }
}
+
+
my $server_address = "$server_ip:$server_port";
+$main::server_address = $server_address;
+
+
+if( inet_aton($bus_ip) ){ $bus_ip = inet_ntoa(inet_aton($bus_ip)); }
+######################################################
+# to change
+if( $bus_ip eq "127.0.1.1" ) { $bus_ip = "127.0.0.1" }
+######################################################
my $bus_address = "$bus_ip:$bus_port";
+$main::bus_address = $bus_address;
# create general settings for this module
my $xml = new XML::Simple();
sub get_module_info {
my @info = ($server_address,
$SIPackages_key,
- $server,
- $server_activ,
- "socket",
);
return \@info;
}
-
-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;
-}
+#sub daemon_log {
+# my ($msg, $level) = @_ ;
+# &main::daemon_log($msg, $level);
+# return;
+#}
+#
+
+#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 ================================================================
return $result;
}
-#=== FUNCTION ================================================================
-# NAME: get_ip
-# PARAMETERS: interface name (i.e. eth0)
-# RETURNS: (ip address)
-# DESCRIPTION: Uses ioctl to get ip address directly from system.
-#===============================================================================
-sub get_ip {
- my $ifreq= shift;
- my $result= "";
- my $SIOCGIFADDR= 0x8915; # man 2 ioctl_list
- my $proto= getprotobyname('ip');
-
- socket SOCKET, PF_INET, SOCK_DGRAM, $proto
- or die "socket: $!";
-
- if(ioctl SOCKET, $SIOCGIFADDR, $ifreq) {
- my ($if, $sin) = unpack 'a16 a16', $ifreq;
- my ($port, $addr) = sockaddr_in $sin;
- my $ip = inet_ntoa $addr;
-
- if ($ip && length($ip) > 0) {
- $result = $ip;
- }
- }
-
- return $result;
-}
-
#=== FUNCTION ================================================================
# NAME: register_at_bus
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);
-# 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;
+}
+
+
+sub import_events {
+ if (not -e $event_dir) {
+ &main::daemon_log("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";
+
+ while (defined (my $event = readdir (DIR))) {
+ if( $event eq "." || $event eq ".." ) { next; }
+ if( $event eq "gosaTriggered.pm" ) { next; } # only GOsa specific events
+
+ eval{ require $event; };
+ if( $@ ) {
+ &main::daemon_log("import of event module '$event' failed", 1);
+ &main::daemon_log("$@", 8);
+ next;
+ }
+
+ $event =~ /(\S*?).pm$/;
+ my $event_module = $1;
+ my $events_l = eval( $1."::get_events()") ;
+ foreach my $event_name (@{$events_l}) {
+ $event_hash->{$event_name} = $event_module;
+ }
+ my $events_string = join( ", ", @{$events_l});
+ &main::daemon_log("INFO: SIPackages imported events $events_string", 5);
+ }
}
# DESCRIPTION: handels the proceeded distribution to the appropriated functions
#===============================================================================
sub process_incoming_msg {
- my ($msg, $msg_hash, $remote_ip) = @_ ;
+ my ($msg, $msg_hash, $session_id) = @_ ;
my $error = 0;
my $host_name;
my $host_key;
- my @out_msg_l;
+ my @out_msg_l = ();
# process incoming msg
my $header = @{$msg_hash->{header}}[0];
my @target_l = @{$msg_hash->{target}};
- &main::daemon_log("SIPackages: msg to process: $header", 3);
+ # skip PREFIX
+ $header =~ s/^CLMSG_//;
+
+ &main::daemon_log("DEBUG: SIPackages: msg to process: $header", 7);
&main::daemon_log("$msg", 8);
if( 0 == length @target_l){
if( 1 == length @target_l) {
my $target = $target_l[0];
- if( $target eq $server_address ) {
+ if(&server_matches($target)) {
+
+
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($_);
- }
-
} else {
- &main::daemon_log("ERROR: $header is an unknown core function", 1);
- $error++;
+ 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);
+ 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 not 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);
+ }
}
else {
- &main::daemon_log("msg is not for gosa-si-server '$server_address', deliver it to target '$target'", 5);
+ &main::daemon_log("INFO: msg is not for gosa-si-server '$server_address', deliver it to target '$target'", 5);
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 got_ping {
- my ($msg_hash) = @_;
-
- my $source = @{$msg_hash->{source}}[0];
- my $target = @{$msg_hash->{target}}[0];
- my $header = @{$msg_hash->{header}}[0];
-
- if(exists $main::known_daemons->{$source}) {
- &main::add_content2known_daemons(hostname=>$source, status=>$header);
- } else {
- &main::add_content2known_clients(hostname=>$source, status=>$header);
- }
-
- return;
-}
-
+#sub got_ping {
+# my ($msg_hash) = @_;
+#
+# my $source = @{$msg_hash->{source}}[0];
+# my $target = @{$msg_hash->{target}}[0];
+# my $header = @{$msg_hash->{header}}[0];
+# my $session_id = @{$msg_hash->{'session_id'}}[0];
+# my $act_time = &get_time;
+# my @out_msg_l;
+# my $out_msg;
+#
+# # check known_clients_db
+# my $sql_statement = "SELECT * FROM known_clients WHERE hostname='$source'";
+# my $query_res = $main::known_clients_db->select_dbentry( $sql_statement );
+# if( 1 == keys %{$query_res} ) {
+# my $sql_statement= "UPDATE known_clients ".
+# "SET status='$header', timestamp='$act_time' ".
+# "WHERE hostname='$source'";
+# my $res = $main::known_clients_db->update_dbentry( $sql_statement );
+# }
+#
+# # check known_server_db
+# $sql_statement = "SELECT * FROM known_server WHERE hostname='$source'";
+# $query_res = $main::known_server_db->select_dbentry( $sql_statement );
+# if( 1 == keys %{$query_res} ) {
+# my $sql_statement= "UPDATE known_server ".
+# "SET status='$header', timestamp='$act_time' ".
+# "WHERE hostname='$source'";
+# my $res = $main::known_server_db->update_dbentry( $sql_statement );
+# }
+#
+# # create out_msg
+# my $out_hash = &create_xml_hash($header, $source, "GOSA");
+# &add_content2xml_hash($out_hash, "session_id", $session_id);
+# $out_msg = &create_xml_string($out_hash);
+# push(@out_msg_l, $out_msg);
+#
+# return @out_msg_l;
+#}
#=== FUNCTION ================================================================
# NAME: new_passwd
"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 $hash = &create_xml_hash("confirm_new_key", $server_address, $source_name);
my $out_msg = &create_xml_string($hash);
push(@out_msg_l, $out_msg);
}
"WHERE hostname='$source_name'";
my $res = $main::known_server_db->update_dbentry( $sql_statement );
- my $hash = &create_xml_hash("confirm_new_passwd", $server_address, $source_name);
+ my $hash = &create_xml_hash("confirm_new_key", $server_address, $source_name);
my $out_msg = &create_xml_string($hash);
push(@out_msg_l, $out_msg);
}
# number of actual activ clients
my $act_nu_clients = $nu_clients;
- &main::daemon_log("number of actual activ clients: $act_nu_clients", 5);
- &main::daemon_log("number of maximal allowed clients: $max_clients", 5);
+ &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);
if($max_clients <= $act_nu_clients) {
my $out_hash = &create_xml_hash("denied", $server_address, $source);
# 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);
+ &main::daemon_log("INFO: send bus msg that client '$source' has registerd at server '$server_address'", 5);
}
# give the new client his ldap config
sub new_ldap_config {
my ($address) = @_ ;
- my $sql_statement= "SELECT * FROM known_clients WHERE hostname='$address'";
+ my $sql_statement= "SELECT * FROM known_clients WHERE hostname='$address' OR macaddress='$address'";
my $res = $main::known_clients_db->select_dbentry( $sql_statement );
# check hit
&main::daemon_log("ERROR: more or no hit found in known_clients_db by query by '$address'", 1);
}
+ $address = $res->{1}->{hostname};
my $macaddress = $res->{1}->{macaddress};
my $hostkey = $res->{1}->{hostkey};
@servers= sort (@servers);
foreach $server (@servers){
+ # Conversation for backward compatibility
+ if (not $server =~ /^ldap[^:]+:\/\// ) {
+ if ($server =~ /^([^:]+):(.*)$/ ) {
+ $server= "1:dummy:ldap://$1/$2";
+ }
+ }
+
$base= $server;
$server =~ s%^[^:]+:[^:]+:(ldap.*://[^/]+)/.*$%$1%;
$base =~ s%^[^:]+:[^:]+:ldap.*://[^/]+/(.*)$%$1%;
# Find admin base and department name
$mesg = $ldap->search( base => $ldap_base,
scope => 'sub',
- attrs => ['dn', 'ou'],
+ attrs => ['dn', 'ou', 'FAIclass'],
filter => "(&(objectClass=gosaAdministrativeUnit)(gosaUnitTag=$unit_tag))");
#$mesg->code && die $mesg->error;
if($mesg->code) {
$data{'unit_tag'}= $unit_tag;
}
+ # Fill release if available
+ my $FAIclass= $entry->get_value("FAIclass");
+ if (defined $FAIclass && $FAIclass =~ /^.* :([A-Za-z0-9\/.]+).*$/) {
+ $data{'release'}= $1;
+ }
+
+
# Unbind
$mesg = $ldap->unbind;
+ if($mesg->code) {
+ &main::daemon_log($mesg->error, 1);
+ return;
+ }
# Send information
- return send_msg("new_ldap_config", $server_address, $address, \%data);
+ return &build_msg("new_ldap_config", $server_address, $address, \%data);
}
-sub process_detected_hardware {
- my $msg_hash = shift;
- my $address = $msg_hash->{source}[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);
- }
-
- 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;
- }
- # 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 == 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") {
- 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
if($mesg->count() == 0) {
&main::daemon_log("Host was not found in LDAP!", 1);
- return;
- }
-
- 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;
- }
} else {
- # need to fill it to LDAP
- $entry->add(gotoHardwareChecksum => $gotoHardwareChecksum);
- if($entry->update($ldap)) {
- &main::daemon_log("gotoHardwareChecksum $gotoHardwareChecksum was added to LDAP", 4);
+ 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))"
- #);
-
- #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);
- # }
-
- #}
-
- }
# Assemble data package
my %data = ();
$mesg = $ldap->unbind;
&main::daemon_log("Send detect_hardware message to $address", 4);
-
+
# Send information
- return send_msg("detect_hardware", $server_address, $address, \%data);
+ return &build_msg("detect_hardware", $server_address, $address, \%data);
}
+sub server_matches {
+ my $target = shift;
+ my $target_ip = sprintf("%s", $target =~ /^([0-9\.]*?):.*$/);
+ my $result = 0;
-#=== FUNCTION ================================================================
-# NAME: execute_actions
-# PARAMETERS: msg_hash - hash - hash from function create_xml_hash
-# RETURNS: nothing
-# DESCRIPTION: invokes the script specified in msg_hash which is located under
-# /etc/gosad/actions
-#===============================================================================
-sub execute_actions {
- my ($msg_hash) = @_ ;
- my $configdir= '/etc/gosad/actions/';
- my $result;
-
- my $header = @{$msg_hash->{header}}[0];
- my $source = @{$msg_hash->{source}}[0];
- my $target = @{$msg_hash->{target}}[0];
-
- if((not defined $source)
- && (not defined $target)
- && (not defined $header)) {
- &main::daemon_log("ERROR: Entries missing in XML msg for gosad actions under /etc/gosad/actions");
- } else {
- my $parameters="";
- my @params = @{$msg_hash->{$header}};
- my $params = join(", ", @params);
- &main::daemon_log("execute_actions: got parameters: $params", 5);
-
- if (@params) {
- foreach my $param (@params) {
- my $param_value = (&get_content_from_xml_hash($msg_hash, $param))[0];
- &main::daemon_log("execute_actions: parameter -> value: $param -> $param_value", 7);
- $parameters.= " ".$param_value;
- }
- }
-
- my $cmd= $configdir.$header."$parameters";
- &main::daemon_log("execute_actions: executing cmd: $cmd", 7);
- $result= "";
- open(PIPE, "$cmd 2>&1 |");
- while(<PIPE>) {
- $result.=$_;
- }
- close(PIPE);
- }
-
- # process the event result
-
+ if($server_ip eq $target_ip) {
+ $result= 1;
+ } elsif ($server_ip eq "0.0.0.0") {
+ if ($target_ip eq "127.0.0.1") {
+ $result= 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($target_ip)->within(new NetAddr::IP($destination, $mask))) {
+ # destination matches route, save mac and exit
+ $result= 1;
+ last;
+ }
+ }
+ }
+ } else {
+ &main::daemon_log("Target ip $target_ip does not match Server ip $server_ip",1);
+ }
- return;
+ return $result;
}
+##=== FUNCTION ================================================================
+## NAME: execute_actions
+## PARAMETERS: msg_hash - hash - hash from function create_xml_hash
+## RETURNS: nothing
+## DESCRIPTION: invokes the script specified in msg_hash which is located under
+## /etc/gosad/actions
+##===============================================================================
+#sub execute_actions {
+# my ($msg_hash) = @_ ;
+# my $configdir= '/etc/gosad/actions/';
+# my $result;
+#
+# my $header = @{$msg_hash->{header}}[0];
+# my $source = @{$msg_hash->{source}}[0];
+# my $target = @{$msg_hash->{target}}[0];
+#
+# if((not defined $source)
+# && (not defined $target)
+# && (not defined $header)) {
+# &main::daemon_log("ERROR: Entries missing in XML msg for gosad actions under /etc/gosad/actions");
+# } else {
+# my $parameters="";
+# my @params = @{$msg_hash->{$header}};
+# my $params = join(", ", @params);
+# &main::daemon_log("execute_actions: got parameters: $params", 5);
+#
+# if (@params) {
+# foreach my $param (@params) {
+# my $param_value = (&get_content_from_xml_hash($msg_hash, $param))[0];
+# &main::daemon_log("execute_actions: parameter -> value: $param -> $param_value", 7);
+# $parameters.= " ".$param_value;
+# }
+# }
+#
+# my $cmd= $configdir.$header."$parameters";
+# &main::daemon_log("execute_actions: executing cmd: $cmd", 7);
+# $result= "";
+# open(PIPE, "$cmd 2>&1 |");
+# while(<PIPE>) {
+# $result.=$_;
+# }
+# close(PIPE);
+# }
+#
+# # process the event result
+#
+#
+# return;
+#}
+#
+
1;