home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / root / usr / share / YaST2 / clients / hwinfo.ycp < prev    next >
Text File  |  2006-11-29  |  7KB  |  299 lines

  1. /**
  2.  * File:    clients/hwinfo.ycp
  3.  * Module:    Hardware information
  4.  * Summary:    Main file
  5.  * Authors:    Dan Meszaros <dmeszar@suse.cz>
  6.  *        Ladislav Slezak <lslezak@suse.cz>
  7.  *        Michal Svec <msvec@suse.cz>
  8.  *
  9.  * $Id: hwinfo.ycp 24252 2005-07-22 10:06:54Z lslezak $
  10.  */
  11.  
  12. {
  13.  
  14. textdomain "tune";
  15. import "Wizard";
  16. import "Label";
  17. import "Arch";
  18.  
  19. //include "hwinfo/classnames.ycp";
  20. include "hwinfo/routines.ycp";
  21.  
  22. /**
  23.  * this global variable is needed for skipping out from recursed function
  24.  */
  25. boolean abortPressed = false;
  26.  
  27. /*
  28.  * open progress bar window
  29.  */
  30. UI::OpenDialog(
  31.     `HBox(
  32.     `VSpacing(7),
  33.     `VBox(
  34.         `HSpacing(40),
  35.         // popup dialog header
  36.         `Label(_("Probing")),
  37.         `HBox(
  38.         `HWeight(1, `Label(`id(`initLab), ""))
  39.         ),
  40.         // progress bar label
  41.         `ProgressBar(`id(`initProg), _("Progress"), 1000, 0),
  42.         `VSpacing(0.5),
  43.         `PushButton(`id(`abort), `opt(`key_F9), Label::AbortButton())
  44.     )
  45.     )
  46. );
  47.  
  48. /*
  49.  * these paths will be excluded from probing.
  50.  * .probe.mouse doesn't like running X
  51.  * other paths are not user-interesting
  52.  */
  53. list exclude_list = [.probe.byclass, .probe.bybus, .probe.ihw_data, .probe.system, .probe.status, .probe.cdb_isdn, .probe.boot_disk];
  54.  
  55. if (Arch::is_uml())
  56. {
  57.     // exclude more path in UML system, UML supports/emulates only few devices
  58.     exclude_list = union(exclude_list, [ .probe.scsi, .probe.camera, .probe.pppoe, .probe.isapnp, .probe.tape, .probe.joystick,
  59.     .probe.usb, .probe.ieee1394ctrl, .probe.usbctrl, .probe.cdrom, .probe.floppy, .probe.chipcard, .probe.mouse
  60.     ]);
  61. }
  62.  
  63. /*
  64.  * if xserver is running, don't probe for mouse and chipcard
  65.  * because it has bad side effect (moving cursor)
  66.  */
  67. if (SCR::Execute(.target.bash, "/bin/ps -C X") == 0)
  68. {
  69.     y2warning("X server is running - mouse and chipcard will not be probed");
  70.     exclude_list = add(exclude_list, .probe.mouse);
  71.  
  72.     // .probe.chipcard has same effect as .probe.mouse
  73.     exclude_list = add(exclude_list, .probe.chipcard);
  74. }
  75.  
  76.  
  77. /**
  78.  * Add extra CPU info from .proc.cpuinfo to data read from .probe agent
  79.  * @param cpuinfo CPU information returned by .probe agent
  80.  * @return list input with additional CPU information
  81.  */
  82.  
  83. define list add_cpu_info(list<map> cpuinfo) ``{
  84.     // add information from /proc/cpuinfo for each CPU
  85.     integer cpu_index = 0;
  86.  
  87.     list ret = maplist(map probe_cpuinfo, cpuinfo, ``{
  88.         // get all keys for selected processor
  89.         list<string> keys = (list<string>) SCR::Dir(add(.proc.cpuinfo.value, sformat("%1", cpu_index)));
  90.  
  91.         if (keys != nil)
  92.         {
  93.         // read values
  94.         foreach(string key, keys, ``{
  95.             probe_cpuinfo = add(probe_cpuinfo, key, SCR::Read(add(add(.proc.cpuinfo.value, sformat("%1", cpu_index)), key)));
  96.             }
  97.         );
  98.  
  99.         // add processor index
  100.         probe_cpuinfo = add(probe_cpuinfo, "Processor", cpu_index);
  101.         }
  102.  
  103.         cpu_index = cpu_index + 1;
  104.  
  105.         return probe_cpuinfo;
  106.     }
  107.     );
  108.  
  109.     return ret;
  110. }
  111.  
  112. /**
  113.  * returns string that is behind the last dot of given string (extract last part of path)
  114.  * @param str path in string form
  115.  * @return string last path element
  116.  */
  117.  
  118. define string afterLast(string str) ``{
  119.     list strs = splitstring(str, ".");
  120.     return strs[size(strs) - 1]:"";
  121. }
  122.  
  123. /**
  124.  * Returns list of values read from path p
  125.  * @param progMin minimum value used in progressbar
  126.  * @param progMax maximum value used in progressbar
  127.  * @param p read path p
  128.  * @return term tree widget content
  129.  */
  130.  
  131. define term buildHwTree(string p, integer progMin, integer progMax) ``{
  132.  
  133.     y2debug("buildHwTree path: %1", p);
  134.  
  135.     any a = UI::PollInput();
  136.     if (a == `cancel || a == `abort)
  137.     {
  138.     abortPressed = true;
  139.     return nil;
  140.     }
  141.  
  142.     string node = afterLast(p);
  143.     string node_translated = trans_str(node);
  144.  
  145.     UI::ChangeWidget(`id(`initLab), `Value, node_translated);
  146.     y2milestone("Probing %1 (%2)...", node, node_translated);
  147.     path pat = topath(p);
  148.  
  149.     y2debug("Reading path: %1", p);
  150.  
  151.     if (contains(exclude_list, pat))
  152.     {
  153.     return nil;
  154.     }
  155.  
  156.     list<string> dir = (list<string>) SCR::Dir(pat);
  157.  
  158.     if (dir == nil)
  159.     {
  160.     any val = SCR::Read(pat);
  161.  
  162.     if (scalar(val))
  163.     {
  164.         return `item(sformat("%1: %2", trans_str(afterLast(p)), trans_bool(val)));
  165.     }
  166.     else if (val == nil ||  val == [] || val == $[])
  167.     {
  168.         return nil;
  169.     }
  170.     else
  171.     {
  172.         if (afterLast(p) == "cpu")
  173.         {
  174.         val = add_cpu_info((list<map>) val);
  175.         }
  176.         return `item(trans_str(afterLast(p)), expandTree(val));
  177.     }
  178.     }
  179.     else
  180.     {
  181.  
  182.     // remove duplicates from the list
  183.     list<string> uniq = [];
  184.  
  185.     foreach(string d, dir, ``{
  186.         if (!contains(uniq, d))
  187.         {
  188.             uniq = add(uniq, d);
  189.         }
  190.         }
  191.     );
  192.  
  193.     dir = uniq;
  194.  
  195.     integer step=1000;
  196.     if (size(dir)!=0)
  197.     {
  198.         step = (progMax - progMin) / size(dir);
  199.     }
  200.     integer prog = progMin;
  201.  
  202.     integer pos = size(dir)-1;
  203.     list    lout = [];
  204.     term    itm = nil;
  205.     while(pos >= 0)
  206.     {
  207.         itm = buildHwTree(p + "." + dir[pos]:nil, prog, prog + step);
  208.         if (abortPressed)
  209.         {
  210.         return nil;
  211.         }
  212.         if (itm != nil)
  213.         {
  214.         lout = add(lout, itm);
  215.         }
  216.         pos = pos - 1;
  217.         prog = prog + step;
  218.         UI::ChangeWidget(`id(`initProg), `Value, prog);
  219.     }
  220.     return `item(afterLast(p), sort(lout));
  221.     }
  222.     return nil;
  223. }
  224.  
  225.  
  226. // Main
  227.  
  228. // tree item list
  229. term items = nil;
  230. // default initial path
  231. path pat = .probe;
  232. if (size(WFM::Args()) > 0)
  233. {
  234.     // initial path overriden by module argument
  235.     pat = topath(WFM::Args(0));
  236. }
  237.  
  238. // build the tree
  239. items = buildHwTree(sformat("%1", pat), 0, 1000);
  240.  
  241. // interrupted
  242. if (abortPressed)
  243. {
  244.     UI::CloseDialog();
  245.     return `abort;
  246. }
  247.  
  248. // title label
  249. string title = _("&All Entries"); //this wasn't marked for translation in 8.0
  250. if(pat != .probe)
  251. {
  252.     title = trans_str(afterLast(sformat("%1", pat)));
  253. }
  254.  
  255. UI::CloseDialog();
  256.  
  257. term con = `Tree(`id(`idTree), `opt(`vstretch, `hstretch), title, items[1]:nil);
  258.  
  259. Wizard::CreateDialog();
  260. Wizard::SetDesktopIcon("hwinfo");
  261.  
  262.  
  263. Wizard::SetBackButton(`save, _("&Save to File...") );
  264. Wizard::SetNextButton(`next, Label::CloseButton() );
  265.  
  266. // abort is not needed, module is read-only
  267. Wizard::HideAbortButton();
  268.  
  269.  
  270. // dialog header
  271. Wizard::SetContents (_("Hardware Information"), con,
  272.  
  273. // help text
  274.  _("<P>The <B>Hardware Information</B> module displays the hardware
  275. details of your computer. Click any node for more information.</p>\n")
  276. + _("<P>You can save hardware information to a file. Click <B>Save to File</B> and enter the filename.</P>"),
  277. true, true);
  278.  
  279. UI::SetFocus(`id(`idTree));
  280.  
  281. any event = nil;
  282.  
  283. // wait for finish
  284. while(event != `abort && event !=`next && event != `cancel)
  285. {
  286.     event = UI::UserInput();
  287.  
  288.     if (event == `save)
  289.     {
  290.     // store hwinfo output to the file
  291.     save_hwinfo_to_file("/");
  292.     }
  293. }
  294. Wizard::CloseDialog();
  295. return `next;
  296.  
  297. /* EOF */
  298. }
  299.