diff --git a/gosa-si/gosa-si-client b/gosa-si/gosa-si-client
index 2608e323efb10c8f564845b8b1642928f34fb486..2076b09798e96d0da7df0ea1c3dca0cfa781b557 100755 (executable)
--- a/gosa-si/gosa-si-client
+++ b/gosa-si/gosa-si-client
# DESCRIPTION:
#
# OPTIONS: ---
-# REQUIREMENTS: ---
+# REQUIREMENTS: libnetaddr-ip-perl
# BUGS: ---
# NOTES:
# AUTHOR: (Andreas Rettenberger), <rettenberger@gonicus.de>
use Config::IniFiles;
use POSIX;
use Time::HiRes qw( gettimeofday );
+use File::Basename;
use Fcntl;
use IO::Socket::INET;
my ($cfg_file, %cfg_defaults, $foreground, $verbose, $pid_file, $procid, $pid, $log_file);
my ($server_address, $server_ip, $server_port, $server_domain, $server_passwd, $server_cipher, $server_timeout);
-my ($client_address, $client_ip, $client_port, $client_mac_address, $network_interface, $ldap_config, $pam_config, $nss_config);
+my ($client_address, $client_ip, $client_port, $client_mac_address, $network_interface, $ldap_config, $pam_config, $nss_config, $gotoHardwareChecksum);
my ($input_socket, $rbits, $wbits, $ebits, $xml, $known_hosts, $ldap_enabled);
my (@events);
# default variables
-my $event_dir = "/etc/gosa-si/client/events";
+my $event_dir = "/usr/lib/gosa-si/client/events";
$known_hosts = {};
$foreground = 0 ;
%cfg_defaults =
sub check_cmdline_param () {
my $err_config;
my $err_counter = 0;
- if( not defined( $cfg_file)) {
- #$err_config = "please specify a config file";
- #$err_counter += 1;
- my $cwd = getcwd;
- my $name = "/etc/gosa-si/client.conf";
- $cfg_file = File::Spec->catfile( $cwd, $name );
- print STDERR "no conf file specified\n try to use default: $cfg_file\n";
+ if(not defined($cfg_file)) {
+ $cfg_file = "/etc/gosa-si/client.conf";
+ if(! -r $cfg_file) {
+ $err_config = "please specify a config file";
+ $err_counter += 1;
+ }
}
if( $err_counter > 0 ) {
&usage( "", 1 );
opendir(DIR, $event_dir)
or daemon_log("cannot find directory $event_dir!\ngosa-si-client starts without any accepting events!", 1);
my $file_name;
- @events = ();
+ my @events_list = ();
while(defined($file_name = readdir(DIR))){
if ($file_name eq "." || $file_name eq "..") {
next;
}
- push(@events, $file_name);
+ push(@events_list, $file_name);
}
- my $events = join(",", @events);
+ my $events = join(",", @events_list);
daemon_log("found events: $events", 1);
# fill in all possible servers
my ($rout, $wout, $reg_server);
foreach my $server (@servers) {
-# TODO : server abhängige macadress und ipadresse eintragen
-
# create msg hash
my $register_hash = &create_xml_hash("here_i_am", $client_address, $server);
&add_content2xml_hash($register_hash, "new_passwd", $new_server_passwd);
&add_content2xml_hash($register_hash, "mac_address", $client_mac_address);
&add_content2xml_hash($register_hash, "events", $events);
+ &add_content2xml_hash($register_hash, "gotoHardwareChecksum", $gotoHardwareChecksum);
# send xml hash to server with general server passwd
my $answer = &send_msg_hash2address($register_hash, $server, $server_passwd);
my $header = @{$msg_hash->{header}}[0];
- daemon_log("recieve '$header' from $host", 1);
-# daemon_log("header from msg:", 1);
-# daemon_log("\t$header", 1);
-# daemon_log("msg to process:", 7);
-# daemon_log("\t$msg", 7);
+ daemon_log("receive '$header' from $host", 1);
#check whether msg to process is a event
opendir(DIR, $event_dir)
elsif ($header eq 'ping') { &got_ping($msg_hash) }
elsif ($header eq 'wake_up') { &execute_event($msg_hash)}
elsif ($header eq 'new_passwd') { &new_passwd()}
+ elsif ($header eq 'detect_hardware') { &detect_hardware()}
else { daemon_log("ERROR: no function assigned to msg $header", 5) }
return;
my @nss_options;
my $goto_admin;
my $goto_secret;
+ my $admin_base= "";
+ my $department= "";
+ my $unit_tag;
# Transform input into array
while ( my ($key, $value) = each(%$msg_hash) ) {
push (@nss_options, "$element");
next;
}
+ if ($key =~ /^admin_base$/) {
+ $admin_base= $element;
+ next;
+ }
+ if ($key =~ /^department$/) {
+ $department= $element;
+ next;
+ }
+ if ($key =~ /^unit_tag$/) {
+ $unit_tag= $element;
+ next;
+ }
}
}
+ # Unit tagging enabled?
+ if (defined $unit_tag){
+ push (@pam_options, "pam_filter gosaUnitTag=$unit_tag");
+ push (@nss_options, "nss_base_passwd $admin_base?sub?gosaUnitTag=$unit_tag");
+ push (@nss_options, "nss_base_group $admin_base?sub?gosaUnitTag=$unit_tag");
+ }
+
# Setup ldap.conf
my $file1;
my $file2;
close (file1);
daemon_log("wrote $pam_config", 5);
- # Create goto.secrets if told so
+ # Create goto.secrets if told so - for compatibility reasons
if (defined $goto_admin){
open(file1, "> /etc/goto/secret");
close(file1);
chown(0,0, "/etc/goto/secret");
chmod(0600, "/etc/goto/secret");
open(file1, "> /etc/goto/secret");
- print file1 $goto_admin.":".$goto_secret."\n";
+ print file1 "GOTOADMIN=\"$goto_admin\"\nGOTOSECRET=\"$goto_secret\"\n";
close(file1);
daemon_log("wrote /etc/goto/secret", 5);
}
+
+
+ # Write shell based config
+ my $cfg_name= dirname($ldap_config)."/ldap-shell.conf";
+ open(file1, "> $cfg_name");
+ print file1 "LDAP_BASE=\"$ldap_base\"\n";
+ print file1 "ADMIN_BASE=\"$admin_base\"\n";
+ print file1 "DEPARTMENT=\"$department\"\n";
+ print file1 "UNIT_TAG=\"".(defined $unit_tag ? "$unit_tag" : "")."\"\n";
+ print file1 "UNIT_TAG_FILTER=\"".(defined $unit_tag ? "(gosaUnitTag=$unit_tag)" : "")."\"\n";
+ close(file1);
+ daemon_log("wrote $cfg_name", 5);
+
return;
}
return;
}
+sub generate_hw_digest {
+ my $hw_data;
+ foreach my $line (split /\n/, `cat /proc/bus/pci/devices`) {
+ $hw_data.= sprintf "%s", $line =~ /[^\s]+\s([^\s]+)\s.*/;
+ }
+ return(md5_base64($hw_data));
+}
+
+sub detect_hardware {
+ my $hwinfo= `which hwinfo`;
+ chomp $hwinfo;
+
+ if (!(defined($hwinfo) && length($hwinfo) > 0)) {
+ &main::daemon_log("ERROR: hwinfo was not found in \$PATH! Hardware detection will not work!", 1);
+ return;
+ }
+
+ my $result= {
+ gotoXDriver => "",
+ gotoXMouseType => "",
+ gotoXMouseport => "",
+ gotoXkbModel => "",
+ gotoXHsync => "",
+ gotoXVsync => "",
+ gotoXResolution => "",
+ ghUsbSupport => "",
+ gotoSndModule => "",
+ ghGfxAdapter => "",
+ ghNetNic => "",
+ ghSoundAdapter => "",
+ ghMemSize => "",
+ ghCpuType => "",
+ gotoModules => [],
+ ghIdeDev => [],
+ ghScsiDev => [],
+ };
+
+ &main::daemon_log("Starting hardware detection", 4);
+ my $gfxcard= `$hwinfo --gfxcard`;
+ my $primary_adapter= $1 if $gfxcard =~ /^Primary display adapter:\s#(\d+)\n/m;
+ if(defined($primary_adapter)) {
+ ($result->{ghGfxAdapter}, $result->{gotoXDriver}) = ($1,$2) if
+ $gfxcard =~ /$primary_adapter:.*?Model:\s\"([^\"]*)\".*?Server Module:\s(\w*).*?\n\n/s;
+ }
+ my $monitor= `$hwinfo --monitor`;
+ my $primary_monitor= $1 if $monitor =~ /^(\d*):.*/m;
+ if(defined($primary_monitor)) {
+ ($result->{gotoXResolution}, $result->{gotoXVsync}, $result->{gotoXHsync})= ($1,$2,$3) if
+ $monitor =~ /$primary_monitor:\s.*?Max\.\sResolution:\s([0-9x]*).*?Vert\.\sSync\sRange:\s([\d\-]*)\sHz.*?Hor\.\sSync\sRange:\s([\d\-]*)\skHz.*/s;
+ }
+
+ if(length($result->{gotoXHsync}) == 0) {
+ # set default values
+ $result->{gotoXHsync} = "30+50";
+ $result->{gotoXVsync} = "30+90";
+ }
+
+ my $mouse= `$hwinfo --mouse`;
+ my $primary_mouse= $1 if $mouse =~ /^(\d*):.*/m;
+ if(defined($primary_mouse)) {
+ ($result->{gotoXMouseport}, $result->{gotoXMouseType}) = ($1,$2) if
+ $mouse =~ /$primary_mouse:\s.*?Device\sFile:\s(.*?)\s.*?XFree86\sProtocol:\s(.*?)\n.*?/s;
+ }
+
+ my $sound= `$hwinfo --sound`;
+ my $primary_sound= $1 if $sound =~ /^(\d*):.*/m;
+ if(defined($primary_sound)) {
+ ($result->{ghSoundAdapter}, $result->{gotoSndModule})= ($1,$2) if
+ $sound =~ /$primary_sound:\s.*?Model:\s\"(.*?)\".*?Driver\sModules:\s\"(.*?)\".*/s;
+ }
+
+ my $netcard= `hwinfo --netcard`;
+ my $primary_netcard= $1 if $netcard =~ /^(\d*):.*/m;
+ if(defined($primary_netcard)) {
+ $result->{ghNetNic}= $1 if $netcard =~ /$primary_netcard:\s.*?Model:\s\"(.*?)\".*/s;
+ }
+
+ my $keyboard= `hwinfo --keyboard`;
+ my $primary_keyboard= $1 if $keyboard =~ /^(\d*):.*/m;
+ if(defined($primary_keyboard)) {
+ $result->{gotoXkbModel}= $1 if $keyboard =~ /$primary_keyboard:\s.*?XkbModel:\s(.*?)\n.*/s;
+ }
+
+ $result->{ghCpuType}= sprintf "%s / %s - %s",
+ `cat /proc/cpuinfo` =~ /.*?vendor_id\s+:\s(.*?)\n.*?model\sname\s+:\s(.*?)\n.*?cpu\sMHz\s+:\s(.*?)\n.*/s;
+ $result->{ghMemSize}= $1 if `cat /proc/meminfo` =~ /^MemTotal:\s+(.*?)\skB.*/s;
+
+ my @gotoModules=();
+ for my $line(`lsmod`) {
+ if (($line =~ /^Module.*$/) or ($line =~ /^snd.*$/)) {
+ next;
+ } else {
+ push @gotoModules, $1 if $line =~ /^(\w*).*$/
+ }
+ }
+ my %seen = ();
+
+ # Remove duplicates and save
+ push @{$result->{gotoModules}}, grep { ! $seen{$_} ++ } @gotoModules;
+
+ $result->{ghUsbSupport} = (-d "/proc/bus/usb")?"true":"false";
+
+ #TODO Ide detection
+#$result->{ghIdeDev} = $@ if ``
+#opendir(IDE, "/proc/ide");
+#for my $model(grep /ide\d\/hd\w\/model/, readdir(DIR)) {
+# print "$model\n";
+#}
+#close(IDE);
+ while ( `cat /proc/scsi/scsi` =~ /^.*?Vendor:\s(.*?)\s+Model:\s(.*?)\s+.*$/mg ) {
+ push (@{$result->{ghScsiDev}}, "$1 $2");
+ }
+ &main::daemon_log("Hardware detection done!", 4);
+
+ return &send_msg_hash2address(
+ &create_xml_hash("detected_hardware", $client_address, $server_address, $result),
+ $server_address,
+ $server_passwd
+ );
+}
#==== MAIN = main ==============================================================
&read_configfile;
&check_pid;
-open STDIN, '/dev/null' or die "Can’t read /dev/null: $!";
-open STDOUT, '>>/dev/null' or die "Can't write to /dev/null: $!";
-open STDERR, '>>/dev/null' or die "Can't write to /dev/null: $!";
+if ( ! $foreground ) {
+ open STDIN, '/dev/null' or die "Can’t read /dev/null: $!";
+ open STDOUT, '>>/dev/null' or die "Can't write to /dev/null: $!";
+ open STDERR, '>>/dev/null' or die "Can't write to /dev/null: $!";
+}
# restart daemon log file
if (defined $server_ip && defined $server_port) {
$server_address = $server_ip.":".$server_port;
}
+
+# this is necessary that gosa-si-server knowns to which ip-address he can send msgs
+if( $client_ip eq "0.0.0.0" ) {
+ $client_ip = "127.0.0.1";
+}
$client_address = $client_ip.":".$client_port;
# setup xml parser
$xml = new XML::Simple();
+# compute hardware checksum
+$gotoHardwareChecksum= &generate_hw_digest();
+
# create input socket
daemon_log(" ", 1);
$rbits = $wbits = $ebits = "";