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 / include / hwinfo / routines.ycp < prev    next >
Text File  |  2006-11-29  |  18KB  |  665 lines

  1. /**
  2.  * File:    routines.ycp
  3.  *
  4.  * Author:    Ladislav Slezak <lslezak@suse.cz>
  5.  * $Id: routines.ycp 33338 2006-10-12 08:32:52Z lslezak $
  6.  *
  7.  * Functions used in hwinfo and in init_hwinfo modules.
  8.  */
  9.  
  10. {
  11.  
  12. textdomain "tune";
  13.  
  14. import "Report";
  15.  
  16. include "hwinfo/classnames.ycp";
  17.  
  18. /*
  19.  * translation table- key is replaced by value on it's way to ui
  20.  * must be done this way, because keys are machine-generated
  21.  */
  22. map<string, string> trans_table = (map<string, string>) eval(
  23. $[
  24.     // tree node string
  25.     "architecture"    :   _("Architecture"),
  26.     // tree node string - means "hardware bus"
  27.     "bus"        :   _("Bus"),
  28.     // tree node string - means "hardware bus ID"
  29.     "bus_id"        : _("Bus ID"),
  30.     // tree node string
  31.     "cache"        :   _("Cache"),
  32.     // tree node string
  33.     "card_type"    :   _("Card Type"),
  34.     // tree node string
  35.     "cardtype"    :   _("Card Type"),
  36.     // tree node string - means "class of hardware"
  37.     "class_id"    :   _("Class"),
  38.     // tree node string
  39.     "cdtype"    :   _("CD Type"),
  40.     // tree node string
  41.     "dev_name"    :   _("Device Name"),
  42.     // tree node string
  43.     "dev_num"    :   _("Device Numbers"),
  44.     // tree node string
  45.     "sysfs_id"    :   _("Sysfs ID"),
  46.     // tree node string
  47.     "device"    :   _("Device"),
  48.     // tree node string
  49.     "device_id"    :   _("Device Identifier"),
  50.     // tree node string - means "hardware drivers"
  51.     "drivers"    :   _("Drivers"),
  52.     // tree node string - means "hardware driver"
  53.     "driver"    :   _("Driver"),
  54.     // tree node string
  55.     "type"    : _("Type"),
  56.     // tree node string
  57.     "major"    : _("Major"),
  58.     // tree node string
  59.     "minor"    : _("Minor"),
  60.     // tree node string
  61.     "range"    : _("Range"),
  62.     // tree node string (System Management BIOS)
  63.     "smbios"    : _("SMBIOS"),
  64.     // tree node string
  65.     "prog_if"    :   _("Interface"),
  66.     // tree node string
  67.     "resource"    :   _("Resources"),
  68.     // tree node string
  69.     "requires"    :   _("Requires"),
  70.     // tree node string
  71.     "rev"        :   _("Revision"),
  72.     // tree node string - location of hardware in the machine
  73.     "slot_id"    :    _("Slot ID"),
  74.     // tree node string
  75.     "old_unique_key"    : _("Old Unique Key"),
  76.     // tree node string
  77.     "sub_class_id"    :   _("Class (spec)"),
  78.     // tree node string
  79.     "sub_device"    :   _("Device (spec)"),
  80.     // tree node string
  81.     "sub_device_id" :   _("Device Identifier (spec)"),
  82.     // tree node string
  83.     "sub_vendor"    :   _("Subvendor"),
  84.     // tree node string
  85.     "sub_vendor_id" :   _("Subvendor Identifier"),
  86.     // tree node string
  87.     "unique_key"    :   _("Unique Key"),
  88.     // tree node string
  89.     "vendor"    :   _("Vendor"),
  90.     // tree node string
  91.     "vendor_id"        :   _("Vendor Identifier"),
  92.     // tree node string
  93.     "bios_video"       :   _("BIOS Video"),
  94.     // tree node string
  95.     "boot_arch"        :   _("Boot Architecture"),
  96.     // tree node string
  97.     "boot_disk"        :   _("Boot Disk"),
  98.     // tree node string
  99.     "block"        : _("Block Devices"),
  100.     // tree node string
  101.     "redasd"        : _("DASD Disks"),
  102.     // tree node string
  103.     "cdrom"            :   _("CD-ROM"),
  104.     // tree node string
  105.     "cpu"              :   _("CPU"),
  106.     // tree node string
  107.     "disk"             :   _("Disk"),
  108.     // tree node string
  109.     "display"  :   _("Display"),
  110.     // tree node string
  111.     "floppy"   :   _("Floppy Disk"),
  112.     // tree node string
  113.     "framebuffer"      :   _("Framebuffer"),
  114.     // tree node string (powermanagement)
  115.     "has_apm"  :   _("Has APM"),
  116.     // tree node string
  117.     "has_pcmcia"       :   _("Has PCMCIA"),
  118.     // tree node string (multiprocessing)
  119.     "has_smp"  :   _("Has SMP"),
  120.     // tree node string - UML = User Mode Linux
  121.     "is_uml"    :    _("UML System"),
  122.     // tree node string
  123.     "ihw_data" :   _("Hardware Data"),
  124.     // tree node string
  125.     "isdn"             :   _("ISDN"),
  126.     // tree node string
  127.     "keyboard" :   _("Keyboard"),
  128.     // tree node string
  129.     "monitor"  :   _("Monitor"),
  130.     // tree node string
  131.     "netdev"   :   _("Network Devices"),
  132.     // tree node string
  133.     "netif"            :   _("Network Interface"),
  134.     // tree node string
  135.     "printer"  :   _("Printer"),
  136.     // tree node string
  137.     "modem"            :   _("Modem"),
  138.     // tree node string
  139.     "sound"            :   _("Sound"),
  140.     // tree node string
  141.     "storage"  :   _("Storage Media"),
  142.     // tree node string
  143.     "system"   :   _("System"),
  144.     // tree node string
  145.     "tv"               :   _("TV Card"),
  146.     // tree node string
  147.     "dvb"              :   _("DVB Card"),
  148.     // tree node string
  149.     "usb_type" :   _("USB Type"),
  150.     // tree node string
  151.     "version"  :   _("Version"),
  152.     // tree node string - memory (RAM) information
  153.     "memory"   :   _("Memory"),
  154.     // tree node string
  155.     "netcard"  :   _("Network Card"),
  156.     // tree node string
  157.     "bios"     :   _("BIOS"),
  158.     // tree node string
  159.     "fbdev"    :   _("Framebuffer Device"),
  160.     // tree node string - bus type
  161.     "ide"      :   _("IDE"),
  162.     // tree node string - bus type
  163.     "pci"      :   _("PCI"),
  164.     // tree node string - bus type
  165.     "usb"      :   _("USB"),
  166.     // tree node string - bus type
  167.     "isapnp"   :   _("ISA PnP"),
  168.     // tree node
  169.     "usbctrl"  :   _("USB Controller"),
  170.     // tree node
  171.     "hub"      :   _("USB Hub"),
  172.     // tree node
  173.     "ieee1394ctrl"     :  _("IEEE1394 Controller"),
  174.     // tree node
  175.     "scsi"     :   _("SCSI"),
  176.     // tree node
  177.     "scanner"  :   _("Scanner"),
  178.     // tree node
  179.     "mouse"    :   _("Mouse"),
  180.     // tree node
  181.     "joystick" :   _("Joystick"),
  182.     // tree node
  183.     "braille"  :   _("Braille Display"),
  184.     // tree node
  185.     "chipcard" :   _("Chipcard Reader"),
  186.     // tree node - Digital camera or WebCam
  187.     "camera"   :   _("Camera"),
  188.     // Point-to-Point Protocol Over Ethernet
  189.     "pppoe"    :   _("PPP over Ethernet"),
  190.  
  191.     // tree node string - CPU information
  192.     "bogomips" :   _("Bogus Millions of Instructions Per Second"),
  193.     // tree node string - CPU information
  194.     "cache"            :   _("Cache"),
  195.     // tree node string - CPU information
  196.     "coma_bug" :   _("Coma Bug"),
  197.     // tree node string - CPU information
  198.     "f00f_bug" :   _("f00f Bug"),
  199.     // tree node string - CPU information
  200.     "cpuid_level"      :   _("CPU ID Level"),
  201.     // tree node string - CPU information
  202.     "mhz"              :   _("Frequency"),
  203.     // tree node string - CPU information
  204.     "fdiv_bug" :   "Floating point division bug",
  205.     // tree node string - CPU information
  206.     "flags"            :   _("Flags"),
  207.     // tree node string - CPU information
  208.     "fpu"              :   _("Floating Point Unit"),
  209.     // tree node string - CPU information
  210.     "fpu_exception"    :   _("Floating Point Unit Exception"),
  211.     // tree node string - CPU information
  212.     "hlt_bug"  :   _("Halt Bug"),
  213.     // tree node string - CPU information
  214.     "processor"        :   _("Processor"),
  215.     // tree node string - CPU information
  216.     "stepping" :   _("Stepping"),
  217.     // tree node string - CPU information
  218.     "vendor_id"        :   _("Vendor Identifier"),
  219.     // tree node string - CPU information
  220.     "family"   :   _("Family"),
  221.     // tree node string - CPU information
  222.     "model"            :   _("Model"),
  223.     // tree node string - CPU information
  224.     "wp"               :   _("WP"),
  225.     // tree node string - wireless network adapters
  226.     "wlan"             :   _("Wireless LAN"),
  227.     // tree node string - tape devices
  228.     "tape"             :   _("Tape"),
  229.     // tree node string - Bluetooth devices
  230.     "bluetooth"        :   _("Bluetooth"),
  231.     // tree node string - DSL devices
  232.     "dsl"              :   _("DSL"),
  233.  
  234.     // tree node string - generic device name
  235.     "Ethernet network interface"    : _("Ethernet Network Interface"),
  236.     // tree node string - generic device name
  237.     "Network Interface"        : _("Network Interface"),
  238.     // tree node string - generic device name
  239.     "Loopback network interface"        : _("Loopback Network Interface"),
  240.     // tree node string - generic device name
  241.     "Partition"        : _("Partition"),
  242.     // tree node string - generic device name
  243.     "Floppy Disk"    : _("Floppy Disk"),
  244.     // tree node string - generic device name
  245.     "Floppy disk controller"    : _("Floppy Disk Controller"),
  246.     // tree node string - generic device name
  247.     "PnP Unclassified device"        : _("PnP Unclassified Device"),
  248.     // tree node string - generic device name
  249.     "Main Memory"    : _("Main Memory"),
  250.     // tree node string - generic device name
  251.     "UHCI Host Controller"        : _("UHCI Host Controller"),
  252.     // tree node string - generic device name
  253.     "EHCI Host Controller"        : _("EHCI Host Controller"),
  254.     // tree node string - generic device name
  255.     "OHCI Host Controller"        : _("OHCI Host Controller"),
  256.  
  257.     // translate "probe" to empty string
  258.     // search starts from .probe node which doesn't
  259.     // contain any hardware information
  260.     "probe"        : ""
  261. ]);
  262.  
  263. /**
  264.  * reads values from map and creates formatted label for monitor resolution data
  265.  * @param a dummy parameter?
  266.  * @param m device info
  267.  * @return string formatted label
  268.  */
  269.  
  270. define string resolution(any a, map m) ``{
  271.     if (haskey(m, "height"))
  272.     {
  273.     return sformat("%1x%2", m["width"]:nil, m["height"]:nil);
  274.     }
  275.     return m["width"]:"";
  276. }
  277.  
  278. define list<string> modules(list<list<string> > val) ``{
  279.     y2warning("calling modules with param: %1", val);
  280.     list<string> outlist = maplist(list<string> e, val,
  281.     ``{
  282.     return "modprobe " + mergestring(e, " ");
  283.     });
  284.     return outlist;
  285. }
  286.  
  287. /**
  288.  * tries to determine hardware name by class_id and sub_class_id
  289.  * and substitues them in given map. returns modified map
  290.  * @param hw device info
  291.  * @return map device info with translated class information
  292.  */
  293.  
  294. define map<string,any> translate_hw_entry(map<string,any> hw) ``{
  295.  
  296.     map<string,any> ret = hw;
  297.  
  298.     if (haskey(hw, "class_id"))
  299.     {
  300.     integer iclassid = hw["class_id"]:0xff;
  301.     string classid = ClassNames[iclassid, "name"]:"";
  302.  
  303.     ret = add(ret, "class_id", classid);
  304.  
  305.     if (haskey(hw, "sub_class_id"))
  306.     {
  307.         integer isubclassid = hw["sub_class_id"]:0;
  308.         string subclassid = ClassNames[iclassid, isubclassid]:"";
  309.         ret = add(ret, "sub_class_id", subclassid);
  310.     }
  311.  
  312.     }
  313.     return ret;
  314. }
  315.  
  316. /**
  317.  * Translate subclass identification of the device
  318.  * @param a dummy parameter?
  319.  * @param m device information
  320.  * @return string translated subclass name
  321.  */
  322. define string classtostring(any a, map<string,any> m) ``{
  323.     map<string,any> trans = translate_hw_entry(m);
  324.     return trans["sub_class_id"]:"";
  325. }
  326.  
  327.  
  328. /**
  329.  * order table: list of lists.
  330.  * first item of nested list is key name
  331.  * second is term that should be used for formating the key- takes key name as first argument
  332.  * if third item is true, the whole map will be passed to term as second argument
  333.  */
  334. list<string> representant_order = [
  335.     "sub_device",
  336.     "device",
  337.     "model name",
  338.     "model",
  339.     "vendor",
  340.     "irq",
  341.     "start",
  342.     "name",
  343.     "xkbmodel",
  344.     "server",
  345.     "size",
  346.     "unit",
  347.     "width",
  348.     "cylinders",
  349.     "dev_name",
  350.     "modules",
  351.     "sub_class_id",
  352.     "modules",
  353.     "type"
  354. ];
  355.  
  356. /**
  357.  * translate string - looks to the translation table and returns value
  358.  * @param str string to translate
  359.  * @return string translated string or original string if translation is unknown
  360.  */
  361. define string trans_str(string str) ``{
  362.     if (!haskey(trans_table, str))
  363.     {
  364.         y2warning("Cannot translate string '%1'", str);
  365.     }
  366.     return (string) (trans_table[str]:str);
  367. }
  368.  
  369. /**
  370.  * translate boolean to Yes/No
  371.  * @param b any value
  372.  * @return string parameter b converted to string, if b is boolean then Yes/No is returned
  373.  */
  374. define string trans_bool(any b) ``{
  375.     if (is(b, boolean))
  376.     {
  377.     // yes/no strings
  378.     return (b == true) ? _("Yes") : _("No");
  379.     }
  380.     return sformat("%1", b);
  381. }
  382.  
  383. /**
  384.  * evals to true if given value is scalar (not map or term or list)
  385.  * @param node any value
  386.  * @return boolean true if parameter node is a scalar value (it isn't a list or a map)
  387.  */
  388.  
  389. define boolean scalar(any node) ``{
  390.     if (
  391.     is(node, string) ||
  392.     is(node, boolean) ||
  393.     is(node, integer) ||
  394.     is(node, float) ||
  395.     is(node, locale) ||
  396.     is(node, path))
  397.     {
  398.     return true;
  399.     }
  400.     return false;
  401. }
  402.  
  403.  
  404. /**
  405.  * if expandTree function tries to explore list, it should use some
  406.  * label for each item. it tree items are maps, this function decides
  407.  * which value from map will be used as label
  408.  * @param m device info
  409.  * @return string name of the selected representant for whole map
  410.  */
  411. define string get_representant(map<string,any> m) ``{
  412.     string out = "";
  413.     integer i = 0;
  414.     // search the 'order' table
  415.     while(i < size(representant_order))
  416.     {
  417.     string key_name = (string)(representant_order[i]:"");
  418.     if (haskey(m, key_name))
  419.     {
  420.         if (key_name == "start")
  421.         {
  422.         out = tohexstring((integer)(m[key_name]:0));
  423.         }
  424.         else if (key_name == "modules")
  425.         {
  426.         // Linux kernel modules (drivers)
  427.         out = _("Modules");
  428.         }
  429.         else if (key_name == "width")
  430.         {
  431.         out = resolution("dummy", m);
  432.         }
  433.         else if (key_name == "sub_class_id")
  434.         {
  435.         out = classtostring("dummy", m);
  436.         }
  437.         else
  438.         {
  439.         out = trans_str(sformat("%1", m[key_name]:nil));
  440.         }
  441.         break;
  442.     }
  443.     i = i + 1;
  444.     }
  445.  
  446.     return out;
  447. }
  448.  
  449. /**
  450.  * Recursively converts (scalar/nested) lists and maps to tree datastructure
  451.  * @param node any value
  452.  * @return list list of items (content of tree widget)
  453.  */
  454.  
  455. define list expandTree(any node) ``{
  456.     if (node == nil)
  457.     {
  458.     return [];
  459.     }
  460.  
  461.     // workaround for bug #31144 - don't visualize list
  462.     // with only one map item
  463.     if (is(node, list) && size((list) node) == 1)
  464.     {
  465.         list node_list = (list) node;
  466.  
  467.         if (is(node_list[0]:nil, map))
  468.     {
  469.         map tmp = (map)eval(node_list[0]:$[]);
  470.  
  471.         // if map has "model" key then don't flatten list,
  472.         // device model name would be removed from the tree
  473.         // when there is only one device in a device category
  474.         if (!haskey(tmp, "model"))
  475.         {
  476.         node = tmp;
  477.         }
  478.     }
  479.     }
  480.  
  481.     // if node is scalar, we just return the new item.
  482.     if (scalar(node))
  483.     {
  484.     return [`item(trans_str(sformat("%1", node)))];
  485.     }
  486.  
  487.  
  488.     if (is(node, list))
  489.     {
  490.     // if node is list ...
  491.     list    lout = [];
  492.     integer q = size((list) node);
  493.     integer pos = 0;
  494.     foreach(any e, (list) node,
  495.     ``{
  496.         if (scalar(e))
  497.         {
  498.         if (e != nil)
  499.         {
  500.             lout = add(lout, `item(sformat("%1", e)));
  501.         }
  502.         }
  503.         else
  504.         {
  505.         string lab = UI::Glyph(`ArrowRight);
  506.         if (is(e, map<string,any>))
  507.         {
  508.             // ... create label for each item ...
  509.             string s = get_representant((map<string,any>) e);
  510.             if(s != "")
  511.             {
  512.             lab = s;
  513.             }
  514.         }
  515.         lout = add(lout, `item(lab, expandTree(e)));
  516.         }
  517.         // ... and add it to item list
  518.         pos = pos + 1;
  519.     }
  520.     );
  521.     return lout;
  522.     }
  523.     if (is(node, map))
  524.     {
  525.     // if node is map ...
  526.     map<string,any> node_map = translate_hw_entry((map<string, any>) node);
  527.     list ltmp = [];
  528.     foreach(string key, any v, node_map,
  529.     ``{
  530.         // haha, hack! we need to translate the 'modules' entry into some more readable form...
  531.         // unfortunatelly 'modules' is used in several places and in different meaings...
  532.         if(key == "modules" && is(v, list))
  533.         {
  534.         v = modules((list<list<string> >) v);
  535.         }
  536.  
  537.         // ... explore all pairs
  538.         if(scalar(v) || v == $[] || v == [])
  539.         {
  540.         ltmp = add(ltmp, `item(sformat("%1: %2", trans_str(key), trans_bool(v))));
  541.         }
  542.         else if (v == [""])
  543.         {
  544.         ltmp = add(ltmp, `item(sformat("%1", trans_str(key))));
  545.         }
  546.         else
  547.         {
  548.         ltmp = add(ltmp, `item(trans_str(sformat("%1", key)), expandTree(v)));
  549.         }
  550.     }
  551.     );
  552.     // ... and finally sort the items alphabetically
  553.     return sort(ltmp);
  554.     }
  555.  
  556.     return [];
  557. }
  558.  
  559. /**
  560.  * Save hwinfo output to the specified file
  561.  * @param file Target file
  562.  * @return boolean True if saving was successful
  563.  */
  564. define boolean save_hwinfo(string file) ``{
  565.     if (file == "" || file == nil)
  566.     {
  567.     return false;
  568.     }
  569.  
  570.     string command = "/usr/sbin/hwinfo > " + file;
  571.     return SCR::Execute(.target.bash, command) == 0;
  572. }
  573.  
  574.  
  575. /**
  576.  * Save hwinfo output to the specified file, progress popup is displayed.
  577.  * Display error message when saving failed.
  578.  * @param target_file_name Target file
  579.  * @return boolean True if saving was successful
  580.  */
  581. define boolean save_hwinfo_to_file(string target_file_name) ``{
  582.     // window title
  583.     string filename = UI::AskForSaveFileName(target_file_name, "*", _("Save hwinfo Output to File"));
  584.     boolean saved = false;
  585.  
  586.     if (filename != nil && size(filename) > 0)
  587.     {
  588.     // progress window content
  589.     UI::OpenDialog(`Label(_("Saving hardware information...")));
  590.     saved = save_hwinfo(filename);
  591.     UI::CloseDialog();
  592.  
  593.     if (saved == false)
  594.     {
  595.         // error popup message
  596.         Report::Error(sformat(_("Saving output to the file '%1' failed."), target_file_name));
  597.     }
  598.     }
  599.  
  600.     return saved;
  601. }
  602.  
  603. /**
  604.  * Mount specified device
  605.  * @param device device name to mount
  606.  * @return string mount point where device was mounted (in /tmp subdirectory)
  607.  *         or nil when mount failed
  608.  */
  609. define string mount_device(string device) ``{
  610.     string tmpdir = (string) SCR::Read(.target.tmpdir);
  611.     string mpoint = tmpdir + "/mount";
  612.  
  613.     // create mount point directory
  614.     SCR::Execute(.target.mkdir, mpoint);
  615.  
  616.     // mount device
  617.     boolean result = (boolean) SCR::Execute(.target.mount, [device, mpoint], "");
  618.  
  619.     return (result == true) ? mpoint : nil;
  620. }
  621.  
  622. /**
  623.  * Unmount device
  624.  * @param mount_point directory where device is mounted
  625.  * @return boolean true on success
  626.  */
  627. define boolean umount_device(string mount_point) ``{
  628.     return (boolean) SCR::Execute(.target.umount, mount_point);
  629. }
  630.  
  631. define boolean has_hex_prefix (string in) {
  632.     if (size(in) < 2)
  633.     {
  634.     return false;
  635.     }
  636.  
  637.     // check whether string has hex prefix (0x or 0X)
  638.     string start = substring(in, 0, 2);
  639.     return (start == "0x" || start == "0X");
  640. }
  641.  
  642. define string remove_hex_prefix(string in) {
  643.     if (!has_hex_prefix(in))
  644.     {
  645.     return in;
  646.     }
  647.  
  648.     return substring(in, 2);
  649. }
  650.  
  651. define string add_hex_prefix(string in)
  652. {
  653.     if (in == nil || in == "")
  654.     {
  655.     return "";
  656.     }
  657.     else
  658.     {
  659.     return (!has_hex_prefix(in)) ? "0x" + in : in;
  660.     }
  661. }
  662.  
  663.  
  664. }
  665.