2011-10-25 19:49:39 +04:00
#!/bin/sh
# HardwareChecker.sh for Haiku
#
2014-03-05 05:04:33 +04:00
# Copyright 2011-2014, François Revol <revol@free.fr>.
2011-10-25 19:49:39 +04:00
#
# Distributed under the MIT License
#
# Created: 2011-10-25
#
netcat = netcat
2011-10-29 05:34:08 +04:00
report_site = fake.haikuware.com
2011-10-25 19:49:39 +04:00
report_cgi = http://haikuware.com/hwreport.php
2014-03-05 05:04:33 +04:00
packages = "dmidecode"
2011-10-25 19:49:39 +04:00
2011-10-25 20:06:51 +04:00
do_notify ( )
{
p = " $1 "
m = " $2 "
shift
shift
notify --type progress \
--messageID hwck_$$ \
--icon /system/apps/Devices \
2014-03-05 05:04:33 +04:00
--group HardwareChecker \
2011-10-25 20:06:51 +04:00
--title "progress:" --progress " $p " " $m " " $@ "
}
2014-03-05 05:04:33 +04:00
try_install_packages ( )
{
which pkgman >/dev/null 2>& 1 || return
for p in $packages ; do
pkgman install " $p " || alert " Unable to install package ' $p ' " "Ok"
done
}
2011-10-25 19:49:39 +04:00
start_fake_httpd ( )
{
report_port = 8989
report_file = " $( finddir B_DESKTOP_DIRECTORY) /hwchecker_report_ $$ .txt "
2011-10-25 20:25:57 +04:00
report_ack = "<html><head></head><body><h1>Done! You can close this window now.</h1></body></html>"
2011-10-25 19:49:39 +04:00
report_cgi = http://127.0.0.1:$report_port /hwreport
(
2014-03-05 05:04:33 +04:00
# force a previous instance to close
2011-10-25 20:14:49 +04:00
$netcat 127.0.0.1 8989 < /dev/null > /dev/null
2011-10-25 19:49:39 +04:00
echo " listening on port $report_port "
#
( echo -e "HTTP/1.1 100 Continue\r\n\r\n" ; echo -e " HTTP/1.1 200 OK\r\nDate: $( date) \r\nContent-Type: text/html\r\nContent-Length: ${# report_ack } \r\n\r\n $report_ack " ) | $netcat -q 1 -l -p $report_port > " $report_file "
2011-10-25 20:14:49 +04:00
# make sure we have something
if [ -s " $report_file " ] ; then
open " $report_file "
sleep 1
alert " A file named $( basename $report_file ) has been created on your desktop. You can copy this file to an external drive to submit it with another operating system. " "Ok"
else
rm " $report_file "
fi
2011-10-25 19:49:39 +04:00
) &
}
detect_network ( )
{
ping -c 1 " $report_site "
if [ " $? " -gt 0 ] ; then
alert --stop " Cannot contact the hardware report site ( $report_site ).
You can continue anyway and generate a local file to submit later on, or try to configure networking." " Cancel" " Configure Network" " Continue"
case " $? " in
0)
exit 0
; ;
1)
/system/preferences/Network
detect_network
; ;
2)
start_fake_httpd
; ;
*)
exit 1
; ;
esac
fi
}
check_pci ( )
{
echo "<h2>PCI devices</h2><dl>"
2011-10-26 06:32:59 +04:00
echo "<div><i>List of detected PCI devices. This does not indicate that every probed device is supported by a driver.</i></div><br />"
2011-10-25 19:49:39 +04:00
devn = 0
bus = "pci"
vendor = ''
device = ''
true;
listdev | while read line; do
case " $line " in
device*)
case " $vendor " in
"" )
desc = " ${ line /device / } "
echo " <dt><b> $desc </b></dt> "
; ;
*)
devicestr = ${ line #* : }
device = " ${ line % : * } "
device = " ${ device #device } "
echo "<dd>"
echo " <div> $vendor : $device <i> $vendorstr : $devicestr </i></div> "
descline = " $vendor : $device \" $vendorstr \" \" $devicestr \" $desc "
2011-10-25 21:16:44 +04:00
echo " <div>Identification: <input type='text' id=' $bus ${ devn } _desc' name=' $bus ${ devn } _desc' value=' $descline ' readonly='readonly' size='80' /></div> "
2011-10-25 19:49:39 +04:00
echo "<div>"
2011-10-25 21:16:44 +04:00
echo "<table border='0'>"
echo "<tr><td>"
2011-10-25 19:49:39 +04:00
echo "Status: "
2011-10-25 21:16:44 +04:00
echo "</td><td>"
2011-10-25 20:43:26 +04:00
echo " <input type='radio' name=' $bus ${ devn } _status' id=' $bus ${ devn } _status_ok' value='ok' /><label for=' $bus ${ devn } _status_ok' class='status_ok'>Working</label> "
2011-10-25 21:16:44 +04:00
echo "</td></tr><tr><td></td><td>"
#echo "<br />"
2011-10-25 20:43:26 +04:00
echo " <input type='radio' name=' $bus ${ devn } _status' id=' $bus ${ devn } _status_ko' value='ko' /><label for=' $bus ${ devn } _status_ko' class='status_ko'>Not working</label> "
2011-10-25 21:16:44 +04:00
echo "</td></tr><tr><td></td><td>"
#echo "<br />"
2011-10-25 20:43:26 +04:00
echo " <input type='radio' name=' $bus ${ devn } _status' id=' $bus ${ devn } _status_unkn' value='unkn' checked='checked' /><label for=' $bus ${ devn } _status_unkn' class='status_unkn'>Unknown</label> "
2011-10-25 21:16:44 +04:00
echo "</td></tr>"
echo "</table>"
2011-10-25 19:49:39 +04:00
echo "</div>"
echo "<div>"
echo "Is it an add-in card (not part of the motherboard) ? "
echo " <input type='checkbox' name=' $bus ${ devn } _addin' id=' $bus ${ devn } _addin' /><label for=' $bus ${ devn } _addin'>Yes</label> "
echo "</div>"
echo "<div>"
echo "Comment: "
echo " <input type='text' name=' $bus ${ devn } _comment' id=' $bus ${ devn } _comment' placeholder='bug, missing feature...' size='30' /> "
echo "</div>"
2011-10-25 20:43:26 +04:00
echo "<br />"
2011-10-25 19:49:39 +04:00
echo "</dd>"
vendor = ''
devn = $(( $devn + 1 ))
; ;
esac
; ;
vendor*)
vendorstr = ${ line #* : }
vendor = " ${ line % : * } "
vendor = " ${ vendor #vendor } "
; ;
*)
; ;
esac
done
}
check_usb ( )
{
echo "<h2>USB devices</h2><dl>"
echo "<div><i>List ot detected USB devices. This does not indicate that every probed device is supported by a driver.</i></div><br />"
devn = 0
bus = "usb"
listusb | while read vpid dev desc; do
echo " <dt><b> $desc </b></dt> "
echo "<dd>"
2011-10-25 21:16:44 +04:00
echo " <div>Identification: <input type='text' id=' $bus ${ devn } _desc' name=' $bus ${ devn } _desc' value=' $vpid $dev $desc ' readonly='readonly' size='80' /></div> "
2011-10-25 19:49:39 +04:00
if [ " $vpid " != "0000:0000" ] ; then
enabled = 1
id = ""
2011-10-25 21:16:44 +04:00
2011-10-25 19:49:39 +04:00
echo "<div>"
2011-10-25 21:16:44 +04:00
echo "<table border='0'>"
echo "<tr><td>"
2011-10-25 19:49:39 +04:00
echo "Status: "
2011-10-25 21:16:44 +04:00
echo "</td><td>"
2011-10-25 20:43:26 +04:00
echo " <input type='radio' name=' $bus ${ devn } _status' id=' $bus ${ devn } _status_ok' value='ok' /><label for=' $bus ${ devn } _status_ok' class='status_ok'>Working</label> "
2011-10-25 21:16:44 +04:00
echo "</td></tr><tr><td></td><td>"
#echo "<br />"
2011-10-25 20:43:26 +04:00
echo " <input type='radio' name=' $bus ${ devn } _status' id=' $bus ${ devn } _status_ko' value='ko' /><label for=' $bus ${ devn } _status_ko' class='status_ko'>Not working</label> "
2011-10-25 21:16:44 +04:00
echo "</td></tr><tr><td></td><td>"
#echo "<br />"
2011-10-25 20:43:26 +04:00
echo " <input type='radio' name=' $bus ${ devn } _status' id=' $bus ${ devn } _status_unkn' value='unkn' checked='checked' /><label for=' $bus ${ devn } _status_unkn' class='status_unkn'>Unknown</label> "
2011-10-25 21:16:44 +04:00
echo "</td></tr>"
echo "</table>"
2011-10-25 19:49:39 +04:00
echo "</div>"
echo "<div>"
echo "Is it an external device (not part of the motherboard) ? "
echo " <input type='checkbox' name=' $bus ${ devn } _addin' id=' $bus ${ devn } _addin' name=' $bus ${ devn } _addin' /><label for=' $bus ${ devn } _addin'>Yes</label> "
echo "</div>"
echo "<div>"
echo "Comment: "
echo " <input type='text' name=' $bus ${ devn } _comment' id=' $bus ${ devn } _comment' placeholder='bug, missing feature...' size='30' /> "
echo "</div>"
else
2011-10-25 20:43:26 +04:00
echo "<div><i>(virtual device)</i></div>"
2011-10-25 19:49:39 +04:00
fi
2011-10-25 20:43:26 +04:00
echo "<br />"
2011-10-25 19:49:39 +04:00
echo "</dd>"
devn = $(( $devn + 1 ))
done
echo "</dl>"
}
2011-11-01 19:02:06 +04:00
check_dmidecode ( ) {
which dmidecode >/dev/null 2>& 1 || return
2011-11-02 17:13:08 +04:00
# make sure /dev/mem is published
ls -l /dev/misc/mem > /dev/null
2011-11-01 19:02:06 +04:00
echo "<h2>DMIdecode output</h2>"
echo "<i>The output of dmidecode gives exact vendor and device identification.</i>"
echo "<h3><tt>dmidecode</tt></h3>"
echo "<i>(full output, stripped from the machine UUID)</i><br />"
echo "<textarea style='font-family: monospace' rows='10' cols='80' name='dmidecode_output' id='dmidecode_output' readonly='readonly'>"
dmidecode | grep -v 'UUID:'
echo "</textarea>"
dmidecode_bios_vendor = " $( dmidecode -s bios-vendor) "
dmidecode_bios_version = " $( dmidecode -s bios-version) "
dmidecode_bios_release_date = " $( dmidecode -s bios-release-date) "
dmidecode_system_manufacturer = " $( dmidecode -s system-manufacturer) "
dmidecode_system_product_name = " $( dmidecode -s system-product-name) "
dmidecode_system_version = " $( dmidecode -s system-version) "
}
2011-10-25 19:49:39 +04:00
check_machine ( )
{
echo "<h2>Machine</h2>"
2011-11-01 19:02:06 +04:00
echo " Vendor: <input type='text' name='machine_vendor' id='machine_vendor' placeholder='Lenovo,HP,Asus...' value=' $dmidecode_system_manufacturer '/> "
2011-10-25 19:49:39 +04:00
echo "<br />"
2011-11-01 19:02:06 +04:00
echo " Model: <input type='text' name='machine_model' id='machine_model' placeholder='T510,l4500r...' value=' $dmidecode_system_product_name ' /> "
2011-10-25 19:49:39 +04:00
echo "<br />"
echo "Specification page: <input type='url' name='machine_url' id='machine_url' placeholder='url of the model page on the vendor website' />"
echo "<br />"
echo "Comments: <br />"
echo "<textarea style='font-family: monospace' rows='10' cols='40' name='machine_comments' id='machine_comments' placeholder='specific options...'></textarea>"
echo "<br />"
}
check_haiku ( )
{
echo "<h2>Haiku</h2>"
uname_r = " $( uname -r) "
uname_v = " $( uname -v) "
echo " Release: <input type='text' name='uname_r' id='uname_r' value=' $uname_r ' readonly='readonly' size='6' /> "
echo "<br />"
echo " Version: <input type='text' name='uname_v' id='uname_v' value=' $uname_v ' readonly='readonly' size='30' /> "
echo "<br />"
echo "Comments: <br />"
echo "<textarea style='font-family: monospace' rows='4' cols='40' name='haiku_comments' id='haiku_comments' placeholder='Custom build, gcc4...' ></textarea>"
echo "<br />"
}
check_utils ( )
{
echo "<h2>Utilities output</h2>"
echo "<i>The output of some system utilities gives precious informations on the processor model and other stuff...</i>"
echo "<h3><tt>sysinfo</tt></h3>"
echo "<i>(system info)</i><br />"
echo "<textarea style='font-family: monospace' rows='10' cols='80' name='sysinfo_output' id='sysinfo_output' readonly='readonly'>"
sysinfo
echo "</textarea>"
echo "<h3><tt>listimage 1</tt></h3>"
echo "<i>(list of loaded kernel drivers)</i><br />"
echo "<textarea style='font-family: monospace' rows='10' cols='80' name='listimage_1_output' id='listimage_1_output' readonly='readonly'>"
listimage 1
echo "</textarea>"
echo "<h3><tt>ifconfig</tt></h3>"
echo "<i>(list of network interfaces)</i><br />"
echo "<textarea style='font-family: monospace' rows='10' cols='80' name='ifconfig_output' id='ifconfig_output' readonly='readonly'>"
ifconfig
echo "</textarea>"
2014-03-05 05:04:33 +04:00
echo "<h3><tt>pkgman list-repos</tt></h3>"
echo "<i>(list of configured package repositories)</i><br />"
echo "<textarea style='font-family: monospace' rows='10' cols='80' name='pkgman_list_repos_output' id='pkgman_list_repos_output' readonly='readonly'>"
pkgman list-repos
echo "</textarea>"
echo "<h3><tt>pkgman search -a</tt></h3>"
2011-10-25 19:49:39 +04:00
echo "<i>(list of installed packaged)</i><br />"
2014-03-05 05:04:33 +04:00
echo "<textarea style='font-family: monospace' rows='10' cols='80' name='pkgman_search_a_output' id='pkgman_search_a_output' readonly='readonly'>"
pkgman search -a
2011-10-25 19:49:39 +04:00
echo "</textarea>"
echo "<br />"
}
check_syslog ( )
{
echo "<h2>System log</h2>"
echo "<div><i>Part of the system boot log that could help developer understand why some devices are not recognized...</i></div>"
echo "<textarea style='font-family: monospace' rows='10' cols='80' name='syslog' id='syslog' readonly='readonly'>"
cat /var/log/syslog
echo "</textarea>"
}
check_sender ( )
{
echo "<h2>Sender info (optional)</h2>"
echo "Name: <input type='text' name='sender_name' id='sender_name' placeholder='Your name' />"
echo "<br />"
echo "Mail: <input type='email' name='sender_name' id='sender_name' placeholder='contact email' />"
echo "<br />"
echo "Other comments: <br />"
echo "<textarea style='font-family: monospace' rows='4' cols='40' name='sender_comments' id='sender_comments' placeholder='IRC nickname on freenode...' ></textarea>"
echo "<br />"
}
check_all ( )
{
echo "<html>"
2011-10-25 20:43:26 +04:00
echo "<head>"
2011-10-25 21:16:44 +04:00
echo '<meta http-equiv="content-type" content="text/html; charset=utf-8">'
2011-10-25 20:43:26 +04:00
echo "<title>Hardware report</title>"
2011-10-25 21:16:44 +04:00
#echo '<link rel="stylesheet" type="text/css" href="http://svn.haiku-os.org/haiku/haiku/trunk/docs/welcome/Haiku-doc.css">'
2011-10-25 20:43:26 +04:00
echo "<style type='text/css'>"
echo ".status_ok { color: #008000 }"
echo ".status_ko { color: #800000 }"
echo ".status_unkn { color: #000080 }"
echo "</style>"
echo "</head>"
2011-10-25 19:49:39 +04:00
echo "<body>"
2011-10-25 21:16:44 +04:00
echo "<div id='content'>"
2011-10-25 19:49:39 +04:00
echo " <form method='POST' action=' $report_cgi '> "
2011-10-25 20:06:51 +04:00
do_notify 0.1 "Checking for PCI hardware..."
2011-10-25 19:49:39 +04:00
check_pci
2011-10-25 20:06:51 +04:00
2011-11-01 19:02:06 +04:00
do_notify 0.2 "Checking for USB hardware..."
2011-10-25 19:49:39 +04:00
check_usb
2011-10-25 20:06:51 +04:00
2011-11-01 19:02:06 +04:00
do_notify 0.3 "Checking for utility outputs..."
2011-10-25 19:49:39 +04:00
check_utils
2011-10-25 20:06:51 +04:00
2011-11-01 19:02:06 +04:00
do_notify 0.7 "Dumping syslog output..."
2011-10-25 19:49:39 +04:00
check_syslog
2011-10-25 21:43:33 +04:00
2011-11-01 19:02:06 +04:00
do_notify 0.8 "Checking machine infos..."
check_dmidecode
2011-10-25 21:43:33 +04:00
check_machine
2011-11-01 19:02:06 +04:00
do_notify 0.9 "Checking for Haiku version..."
check_haiku
2011-10-25 19:49:39 +04:00
check_sender
2011-10-25 20:06:51 +04:00
2011-10-25 20:14:49 +04:00
do_notify 1.0 "Done!" --timeout 3
2011-10-25 19:49:39 +04:00
echo "<div><i>Note: this form will only send data that is visible on this page.</i></div>"
echo "<input type='submit' name='submit' value='submit'>"
echo "</form>"
2011-10-25 21:16:44 +04:00
echo "</div>"
2011-10-25 19:49:39 +04:00
echo "</body>"
echo "</html>"
}
tf = /tmp/hw_checker_$$ .html
2011-10-25 20:06:51 +04:00
do_notify 0.0 "Checking for network..."
2011-10-25 19:49:39 +04:00
detect_network
2014-03-05 05:04:33 +04:00
do_notify 0.0 "Checking for needed packages..."
try_install_packages
2011-10-25 19:49:39 +04:00
check_all > " $tf "
open " $tf "