index 9d4e95a7cfa63974aada8d443710e7a79c850ef5..884b8f7ffdcab166588d17d6518de15da1a054b2 100644 (file)
use Exporter;
@ISA = ("Exporter");
-# Each module has to have a function 'process_incoming_msg'. This function works as a interface to gosa-sd and recieves the msg hash from gosa-sd. 'process_incoming_function checks, wether it has a function to process the incoming msg and forward the msg to it.
+# Each module has to have a function 'process_incoming_msg'. This function works as a interface to gosa-sd and receives the msg hash from gosa-sd. 'process_incoming_function checks, wether it has a function to process the incoming msg and forward the msg to it.
use strict;
$network_interface= &get_interface_for_ip($server_ip);
$server_mac_address= &get_mac($network_interface);
-&main::daemon_log("server ip address detected: $server_ip", 1);
-&main::daemon_log("server mac address detected: $server_mac_address", 1);
-
# complete addresses
my $server_address = "$server_ip:$server_port";
my $bus_address = "$bus_ip:$bus_port";
# create general settings for this module
my $xml = new XML::Simple();
-# open server socket
-if($server_activ eq "on"){
- &main::daemon_log(" ", 1);
- $server = IO::Socket::INET->new(LocalPort => $server_port,
- Type => SOCK_STREAM,
- Reuse => 1,
- Listen => 20,
- );
- if(not defined $server){
- &main::daemon_log("cannot be a tcp server at $server_port : $@");
- } else {
- &main::daemon_log("start server: $server_address", 1);
- }
-}
-
-# TODO
-# füge den server selbst zu known_server hinzu, msgs können nämlich auch von sich selbst kommen (gosa!!!)
-
-
# register at bus
if ($main::no_bus > 0) {
$bus_activ = "off"
}
if($bus_activ eq "on") {
- &main::daemon_log(" ", 1);
®ister_at_bus();
}
### functions #################################################################
-#sub get_module_tags {
-#
-# # lese config file aus dort gibt es eine section Basic
-# # dort stehen drei packettypen, für die sich das modul anmelden kann, gosa-admin-packages,
-# # server-packages, client-packages
-# my %tag_hash = (gosa_admin_packages => "yes",
-# server_packages => "yes",
-# client_packages => "yes",
-# );
-# return \%tag_hash;
-#}
-
sub get_module_info {
my @info = ($server_address,
if ($ip && length($ip) > 0) {
my @ifs= &get_interfaces();
if($ip eq "0.0.0.0") {
- # TODO
+ $result = "all";
} else {
foreach (@ifs) {
my $if=$_;
my $ifreq= shift;
my $result;
if ($ifreq && length($ifreq) > 0) {
- my $SIOCGIFHWADDR= 0x8927; # man 2 ioctl_list
+ if($ifreq eq "all") {
+ $result = "00:00:00:00:00:00";
+ } 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) {
- return $server_mac_address;
- }
+ # A configured MAC Address should always override a guessed value
+ if ($server_mac_address and length($server_mac_address) > 0) {
+ $result= $server_mac_address;
+ }
- socket SOCKET, PF_INET, SOCK_DGRAM, getprotobyname('ip')
- or die "socket: $!";
+ socket SOCKET, PF_INET, SOCK_DGRAM, getprotobyname('ip')
+ or die "socket: $!";
- if(ioctl SOCKET, $SIOCGIFHWADDR, $ifreq) {
- my ($if, $mac)= unpack 'h36 H12', $ifreq;
+ if(ioctl SOCKET, $SIOCGIFHWADDR, $ifreq) {
+ my ($if, $mac)= unpack 'h36 H12', $ifreq;
- if (length($mac) > 0) {
- $result = $mac
+ if (length($mac) > 0) {
+ $mac=~ m/^([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])$/;
+ $mac= sprintf("%s:%s:%s:%s:%s:%s", $1, $2, $3, $4, $5, $6);
+ $result = $mac;
+ }
}
}
}
return $result;
}
-#=== FUNCTION ================================================================
-# NAME: open_socket
-# PARAMETERS: PeerAddr string something like 192.168.1.1 or 192.168.1.1:10000
-# [PeerPort] string necessary if port not appended by PeerAddr
-# RETURNS: socket IO::Socket::INET
-# DESCRIPTION: open a socket to PeerAddr
-#===============================================================================
-sub open_socket {
- my ($PeerAddr, $PeerPort) = @_ ;
- if(defined($PeerPort)){
- $PeerAddr = $PeerAddr.":".$PeerPort;
- }
- my $socket;
- $socket = new IO::Socket::INET(PeerAddr => $PeerAddr ,
- Porto => "tcp" ,
- Type => SOCK_STREAM,
- Timeout => 5,
- );
- if(not defined $socket) {
- return;
- }
- &main::daemon_log("open_socket to: $PeerAddr", 7);
- return $socket;
-}
#=== FUNCTION ================================================================
# NAME: register_at_bus
hostkey=>$bus_passwd,
timestamp=>&get_time,
} );
-# if ($res == 3) {
-# my $update_hash = { table=>'known_server' };
-# $update_hash->{where} = [ { hostname=>[$bus_address] } ];
-# $update_hash->{update} = [ {
-# hostkey=>[$bus_passwd],
-# timestamp=>[&get_time],
-# } ];
-# $res = $main::known_server_db->update_dbentry( $update_hash );
-# }
-
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);
&main::daemon_log("function 'process_incoming_msg': got no msg", 7);
}
- &main::daemon_log("ServerPackages: incoming msg: \n$crypted_msg", 7);
-
$crypted_msg =~ /^([\s\S]*?)\.(\d{1,3}?)\.(\d{1,3}?)\.(\d{1,3}?)\.(\d{1,3}?)$/;
$crypted_msg = $1;
- my $host = sprintf("%s.%s.%s.%s", $2, $3, $4, $5);
+ my $host="0.0.0.0";
+ if(defined $2 && defined $3 && defined $4 && defined $5) {
+ $host = sprintf("%s.%s.%s.%s", $2, $3, $4, $5);
+ }
my $msg;
my $msg_hash;
&main::daemon_log("ServerPackage: host_key: $host_key", 7);
eval{
my $key_cipher = &create_ciphering($host_key);
- $msg = &decrypt_msg($crypted_msg, $key_cipher);
+ $msg = &decrypt_msg($crypted_msg, $key_cipher);
$msg_hash = &transform_msg2hash($msg);
};
if($@) {
# check wether incoming msg is from a known_server
if( not defined $msg ) {
- my $query_res = $main::known_server_db->select_dbentry( {table=>'known_server'} );
+ my $sql_statement= "SELECT * FROM known_server";
+ my $query_res = $main::known_server_db->select_dbentry( $sql_statement );
+
while( my ($hit_num, $hit) = each %{ $query_res } ) {
$host_name = $hit->{hostname};
+
if( not $host_name =~ "^$host") {
next;
}
# check wether incoming msg is from a known_client
if( not defined $msg ) {
- my $query_res = $main::known_clients_db->select_dbentry( {table=>'known_clients'} );
+ #my $query_res = $main::known_clients_db->select_dbentry( {table=>'known_clients'} );
+ my $sql_statement= "SELECT * FROM known_clients";
+ my $query_res = $main::known_clients_db->select_dbentry( $sql_statement );
while( my ($hit_num, $hit) = each %{ $query_res } ) {
$host_name = $hit->{hostname};
if( not $host_name =~ "^$host") {
if( not defined $msg ) {
&main::daemon_log("WARNING: ServerPackage do not understand the message:", 5);
- &main::daemon_log("$@", 7);
+ &main::daemon_log("$@", 8);
return;
}
my $header = @{$msg_hash->{header}}[0];
my $source = @{$msg_hash->{source}}[0];
- &main::daemon_log("recieve '$header' at ServerPackages from $host", 1);
+ &main::daemon_log("receive '$header' at ServerPackages from $host", 1);
&main::daemon_log("ServerPackages: msg to process: \n$msg", 5);
my @targets = @{$msg_hash->{target}};
my $target = $targets[0];
&main::daemon_log("SeverPackages: msg is for: $target", 7);
- if ($target eq $server_address) {
- # msg is for server
- if ($header eq 'new_passwd'){ &new_passwd($msg_hash)}
- elsif ($header eq 'here_i_am') { &here_i_am($msg_hash)}
- elsif ($header eq 'who_has') { &who_has($msg_hash) }
- elsif ($header eq 'who_has_i_do') { &who_has_i_do($msg_hash)}
- elsif ($header eq 'update_status') { &update_status($msg_hash) }
- elsif ($header eq 'got_ping') { &got_ping($msg_hash)}
- elsif ($header eq 'get_load') { &execute_actions($msg_hash)}
- else { &main::daemon_log("ERROR: ServerPackages: no function assigned to this msg", 5) }
-
- } elsif ($target eq "*") {
- # msg is for all clients
- my $query_res = $main::known_clients_db->select_dbentry( {table=>'known_clients'} );
- while( my ($hit_num, $hit) = each %{ $query_res } ) {
- $host_name = $hit->{hostname};
- $host_key = $hit->{hostkey};
- $msg_hash->{target} = [$host_name];
- &send_msg_hash2address($msg_hash, $host_name, $host_key);
- }
- return;
-
- } else {
- # msg is for one host
- my $query_res;
- $query_res = $main::known_clients_db->select_dbentry( {table=>'known_clients', hostname=>$target} );
- if( 1 == keys %{$query_res} ) {
- $host_key = $query_res->{1}->{host_key};
- &send_msg_hash2address($msg_hash, $target, $host_key);
- return;
- }
+ # msg is for server
+ if ($header eq 'new_passwd'){ &new_passwd($msg_hash)}
+ elsif ($header eq 'here_i_am') { &here_i_am($msg_hash)}
+ elsif ($header eq 'who_has') { &who_has($msg_hash) }
+ elsif ($header eq 'who_has_i_do') { &who_has_i_do($msg_hash)}
+ elsif ($header eq 'update_status') { &update_status($msg_hash) }
+ elsif ($header eq 'got_ping') { &got_ping($msg_hash)}
+ elsif ($header eq 'get_load') { &execute_actions($msg_hash)}
+ else {
+ if ($target eq "*") {
+ # msg is for all clients
+ my $sql_statement = "SELECT * FROM known_clients";
+ my $query_res = $main::known_clients_db->select_dbentry( $sql_statement );
+ while( my ($hit_num, $hit) = each %{ $query_res } ) {
+ $host_name = $hit->{hostname};
+ $host_key = $hit->{hostkey};
+ $msg_hash->{target} = [$host_name];
+ &send_msg_hash2address($msg_hash, $host_name, $host_key);
+ }
- $query_res = $main::known_server_db->select_dbentry( {table=>'known_server', hostname=>$target} );
- if( 1 == keys %{$query_res} ) {
- $host_key = $query_res->{1}->{host_key};
- &send_msg_hash2address($msg_hash, $target, $host_key);
- return;
+ } else {
+ # msg is for one host
+ my $host_key;
+
+
+ if( not defined $host_key ) {
+ my $sql_statement = "SELECT * FROM known_clients WHERE hostname='$target'";
+ my $query_res = $main::known_clients_db->select_dbentry( $sql_statement );
+ if( 1 == keys %{$query_res} ) {
+ $host_key = $query_res->{1}->{host_key};
+ }
+ }
+
+ if( not defined $host_key ) {
+ my $sql_statement = "SELECT * FROM known_server WHERE hostname='$target'";
+ my $query_res = $main::known_server_db->select_dbentry( $sql_statement );
+ if( 1 == keys %{$query_res} ) {
+ $host_key = $query_res->{1}->{host_key};
+ }
+ }
+
+ if( not defined $host_key ) {
+ &main::daemon_log("ERROR: ServerPackages: target '".$target.
+ "' is not known neither in known_clients nor in known_server",1);
+ } else {
+ &send_msg_hash2address($msg_hash, $target, $host_key);
+ }
}
-
- &main::daemon_log("ERROR: ServerPackages: target '$target' is not known neither in known_clients nor in known_server",1);
- return;
}
} elsif ($len_targets > 1 ) {
# we have more than one target
- return;
+ # TODO to be implemented
}
return ;
my $query_res;
# check known_clients_db
- $query_res = $main::known_clients_db->select_dbentry( {table=>'known_clients', hostname=>$source_name} );
+ my $sql_statement = "SELECT * FROM known_clients WHERE hostname='$source_name'";
+ $query_res = $main::known_clients_db->select_dbentry( $sql_statement );
if( 1 == keys %{$query_res} ) {
- my $update_hash = { table=>'known_clients' };
- $update_hash->{where} = [ { hostname=>[$source_name] } ];
- $update_hash->{update} = [ {
- hostkey=>[$source_key],
- timestamp=>[&get_time],
- } ];
- my $res = $main::known_clients_db->update_dbentry( $update_hash );
+ my $act_time = &get_time;
+ my $sql_statement= "UPDATE known_clients ".
+ "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);
&send_msg_hash2address($hash, $source_name, $source_key);
}
# check known_server_db
- $query_res = $main::known_server_db->select_dbentry( {table=>'known_server', hostname=>$source_name } );
+ $sql_statement = "SELECT * FROM known_server WHERE hostname='$source_name'";
+ $query_res = $main::known_server_db->select_dbentry( $sql_statement );
if( 1 == keys %{$query_res} ) {
- my $update_hash = { table=>'known_server' };
- $update_hash->{where} = [ { hostname=>[$source_name] } ];
- $update_hash->{update} = [ {
- hostkey=>[$source_key],
- timestamp=>[&get_time],
- } ];
- my $res = $main::known_server_db->update_dbentry( $update_hash );
+ my $act_time = &get_time;
+ my $sql_statement= "UPDATE known_server ".
+ "SET hostkey='$source_key', timestamp='$act_time' ".
+ "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);
&send_msg_hash2address($hash, $source_name, $source_key);
}
-sub send_msg_hash {
- my ($hash, $host_name, $host_key);
-
-
- my $answer = &send_msg_hash2address($hash, $host_name, $host_key);
-
- return;
-}
-
-
#=== FUNCTION ================================================================
# NAME: here_i_am
# PARAMETERS: msg_hash - hash - hash from function create_xml_hash
my $out_hash;
# number of known clients
- my $nu_clients = keys %{$main::known_clients_db->select_dbentry( {table=>'known_clients'} )};
+ my $nu_clients= $main::known_clients_db->count_dbentries('known_clients');
# check wether client address or mac address is already known
- if (exists $main::known_clients->{$source}) {
+ my $sql_statement= "SELECT * FROM known_clients WHERE hostname='$source'";
+ 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);
$nu_clients --;
# create entry in known_clients
my $events = @{$msg_hash->{events}}[0];
+
# add entry to known_clients_db
my $res = $main::known_clients_db->add_dbentry( {table=>'known_clients',
primkey=>'hostname',
# notify registered client to bus
if( $bus_activ eq "on") {
# fetch actual bus key
- my $query_res = $main::known_server_db->select_dbentry( {table=>'known_server'} );
- my $hostkey = $query_res->{1}->{hostkey};
-
+ my $sql_statement= "SELECT * FROM known_server WHERE status='bus'";
+ my $query_res = $main::known_server_db->select_dbentry( $sql_statement );
+ my $hostkey = $query_res->{1}->{'hostkey'};
+
# send update msg to bus
$out_hash = &create_xml_hash("new_client", $server_address, $bus_address, $source);
&send_msg_hash2address($out_hash, $bus_address, $hostkey);
sub new_ldap_config {
my ($address) = @_ ;
- my $res = $main::known_clients_db->select_dbentry( { table=>'known_clients', hostname=>$address } );
+ 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};