diff --git a/gosa-si/gosa-si-client b/gosa-si/gosa-si-client
index fe07d32f42669cbd8ac6b09a7d003e2cde713f3f..2076b09798e96d0da7df0ea1c3dca0cfa781b557 100755 (executable)
--- a/gosa-si/gosa-si-client
+++ b/gosa-si/gosa-si-client
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);
&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);
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;
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 ==============================================================
# setup xml parser
$xml = new XML::Simple();
+# compute hardware checksum
+$gotoHardwareChecksum= &generate_hw_digest();
+
# create input socket
daemon_log(" ", 1);
$rbits = $wbits = $ebits = "";