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 >
Wrap
Text File
|
2006-11-29
|
18KB
|
665 lines
/**
* File: routines.ycp
*
* Author: Ladislav Slezak <lslezak@suse.cz>
* $Id: routines.ycp 33338 2006-10-12 08:32:52Z lslezak $
*
* Functions used in hwinfo and in init_hwinfo modules.
*/
{
textdomain "tune";
import "Report";
include "hwinfo/classnames.ycp";
/*
* translation table- key is replaced by value on it's way to ui
* must be done this way, because keys are machine-generated
*/
map<string, string> trans_table = (map<string, string>) eval(
$[
// tree node string
"architecture" : _("Architecture"),
// tree node string - means "hardware bus"
"bus" : _("Bus"),
// tree node string - means "hardware bus ID"
"bus_id" : _("Bus ID"),
// tree node string
"cache" : _("Cache"),
// tree node string
"card_type" : _("Card Type"),
// tree node string
"cardtype" : _("Card Type"),
// tree node string - means "class of hardware"
"class_id" : _("Class"),
// tree node string
"cdtype" : _("CD Type"),
// tree node string
"dev_name" : _("Device Name"),
// tree node string
"dev_num" : _("Device Numbers"),
// tree node string
"sysfs_id" : _("Sysfs ID"),
// tree node string
"device" : _("Device"),
// tree node string
"device_id" : _("Device Identifier"),
// tree node string - means "hardware drivers"
"drivers" : _("Drivers"),
// tree node string - means "hardware driver"
"driver" : _("Driver"),
// tree node string
"type" : _("Type"),
// tree node string
"major" : _("Major"),
// tree node string
"minor" : _("Minor"),
// tree node string
"range" : _("Range"),
// tree node string (System Management BIOS)
"smbios" : _("SMBIOS"),
// tree node string
"prog_if" : _("Interface"),
// tree node string
"resource" : _("Resources"),
// tree node string
"requires" : _("Requires"),
// tree node string
"rev" : _("Revision"),
// tree node string - location of hardware in the machine
"slot_id" : _("Slot ID"),
// tree node string
"old_unique_key" : _("Old Unique Key"),
// tree node string
"sub_class_id" : _("Class (spec)"),
// tree node string
"sub_device" : _("Device (spec)"),
// tree node string
"sub_device_id" : _("Device Identifier (spec)"),
// tree node string
"sub_vendor" : _("Subvendor"),
// tree node string
"sub_vendor_id" : _("Subvendor Identifier"),
// tree node string
"unique_key" : _("Unique Key"),
// tree node string
"vendor" : _("Vendor"),
// tree node string
"vendor_id" : _("Vendor Identifier"),
// tree node string
"bios_video" : _("BIOS Video"),
// tree node string
"boot_arch" : _("Boot Architecture"),
// tree node string
"boot_disk" : _("Boot Disk"),
// tree node string
"block" : _("Block Devices"),
// tree node string
"redasd" : _("DASD Disks"),
// tree node string
"cdrom" : _("CD-ROM"),
// tree node string
"cpu" : _("CPU"),
// tree node string
"disk" : _("Disk"),
// tree node string
"display" : _("Display"),
// tree node string
"floppy" : _("Floppy Disk"),
// tree node string
"framebuffer" : _("Framebuffer"),
// tree node string (powermanagement)
"has_apm" : _("Has APM"),
// tree node string
"has_pcmcia" : _("Has PCMCIA"),
// tree node string (multiprocessing)
"has_smp" : _("Has SMP"),
// tree node string - UML = User Mode Linux
"is_uml" : _("UML System"),
// tree node string
"ihw_data" : _("Hardware Data"),
// tree node string
"isdn" : _("ISDN"),
// tree node string
"keyboard" : _("Keyboard"),
// tree node string
"monitor" : _("Monitor"),
// tree node string
"netdev" : _("Network Devices"),
// tree node string
"netif" : _("Network Interface"),
// tree node string
"printer" : _("Printer"),
// tree node string
"modem" : _("Modem"),
// tree node string
"sound" : _("Sound"),
// tree node string
"storage" : _("Storage Media"),
// tree node string
"system" : _("System"),
// tree node string
"tv" : _("TV Card"),
// tree node string
"dvb" : _("DVB Card"),
// tree node string
"usb_type" : _("USB Type"),
// tree node string
"version" : _("Version"),
// tree node string - memory (RAM) information
"memory" : _("Memory"),
// tree node string
"netcard" : _("Network Card"),
// tree node string
"bios" : _("BIOS"),
// tree node string
"fbdev" : _("Framebuffer Device"),
// tree node string - bus type
"ide" : _("IDE"),
// tree node string - bus type
"pci" : _("PCI"),
// tree node string - bus type
"usb" : _("USB"),
// tree node string - bus type
"isapnp" : _("ISA PnP"),
// tree node
"usbctrl" : _("USB Controller"),
// tree node
"hub" : _("USB Hub"),
// tree node
"ieee1394ctrl" : _("IEEE1394 Controller"),
// tree node
"scsi" : _("SCSI"),
// tree node
"scanner" : _("Scanner"),
// tree node
"mouse" : _("Mouse"),
// tree node
"joystick" : _("Joystick"),
// tree node
"braille" : _("Braille Display"),
// tree node
"chipcard" : _("Chipcard Reader"),
// tree node - Digital camera or WebCam
"camera" : _("Camera"),
// Point-to-Point Protocol Over Ethernet
"pppoe" : _("PPP over Ethernet"),
// tree node string - CPU information
"bogomips" : _("Bogus Millions of Instructions Per Second"),
// tree node string - CPU information
"cache" : _("Cache"),
// tree node string - CPU information
"coma_bug" : _("Coma Bug"),
// tree node string - CPU information
"f00f_bug" : _("f00f Bug"),
// tree node string - CPU information
"cpuid_level" : _("CPU ID Level"),
// tree node string - CPU information
"mhz" : _("Frequency"),
// tree node string - CPU information
"fdiv_bug" : "Floating point division bug",
// tree node string - CPU information
"flags" : _("Flags"),
// tree node string - CPU information
"fpu" : _("Floating Point Unit"),
// tree node string - CPU information
"fpu_exception" : _("Floating Point Unit Exception"),
// tree node string - CPU information
"hlt_bug" : _("Halt Bug"),
// tree node string - CPU information
"processor" : _("Processor"),
// tree node string - CPU information
"stepping" : _("Stepping"),
// tree node string - CPU information
"vendor_id" : _("Vendor Identifier"),
// tree node string - CPU information
"family" : _("Family"),
// tree node string - CPU information
"model" : _("Model"),
// tree node string - CPU information
"wp" : _("WP"),
// tree node string - wireless network adapters
"wlan" : _("Wireless LAN"),
// tree node string - tape devices
"tape" : _("Tape"),
// tree node string - Bluetooth devices
"bluetooth" : _("Bluetooth"),
// tree node string - DSL devices
"dsl" : _("DSL"),
// tree node string - generic device name
"Ethernet network interface" : _("Ethernet Network Interface"),
// tree node string - generic device name
"Network Interface" : _("Network Interface"),
// tree node string - generic device name
"Loopback network interface" : _("Loopback Network Interface"),
// tree node string - generic device name
"Partition" : _("Partition"),
// tree node string - generic device name
"Floppy Disk" : _("Floppy Disk"),
// tree node string - generic device name
"Floppy disk controller" : _("Floppy Disk Controller"),
// tree node string - generic device name
"PnP Unclassified device" : _("PnP Unclassified Device"),
// tree node string - generic device name
"Main Memory" : _("Main Memory"),
// tree node string - generic device name
"UHCI Host Controller" : _("UHCI Host Controller"),
// tree node string - generic device name
"EHCI Host Controller" : _("EHCI Host Controller"),
// tree node string - generic device name
"OHCI Host Controller" : _("OHCI Host Controller"),
// translate "probe" to empty string
// search starts from .probe node which doesn't
// contain any hardware information
"probe" : ""
]);
/**
* reads values from map and creates formatted label for monitor resolution data
* @param a dummy parameter?
* @param m device info
* @return string formatted label
*/
define string resolution(any a, map m) ``{
if (haskey(m, "height"))
{
return sformat("%1x%2", m["width"]:nil, m["height"]:nil);
}
return m["width"]:"";
}
define list<string> modules(list<list<string> > val) ``{
y2warning("calling modules with param: %1", val);
list<string> outlist = maplist(list<string> e, val,
``{
return "modprobe " + mergestring(e, " ");
});
return outlist;
}
/**
* tries to determine hardware name by class_id and sub_class_id
* and substitues them in given map. returns modified map
* @param hw device info
* @return map device info with translated class information
*/
define map<string,any> translate_hw_entry(map<string,any> hw) ``{
map<string,any> ret = hw;
if (haskey(hw, "class_id"))
{
integer iclassid = hw["class_id"]:0xff;
string classid = ClassNames[iclassid, "name"]:"";
ret = add(ret, "class_id", classid);
if (haskey(hw, "sub_class_id"))
{
integer isubclassid = hw["sub_class_id"]:0;
string subclassid = ClassNames[iclassid, isubclassid]:"";
ret = add(ret, "sub_class_id", subclassid);
}
}
return ret;
}
/**
* Translate subclass identification of the device
* @param a dummy parameter?
* @param m device information
* @return string translated subclass name
*/
define string classtostring(any a, map<string,any> m) ``{
map<string,any> trans = translate_hw_entry(m);
return trans["sub_class_id"]:"";
}
/**
* order table: list of lists.
* first item of nested list is key name
* second is term that should be used for formating the key- takes key name as first argument
* if third item is true, the whole map will be passed to term as second argument
*/
list<string> representant_order = [
"sub_device",
"device",
"model name",
"model",
"vendor",
"irq",
"start",
"name",
"xkbmodel",
"server",
"size",
"unit",
"width",
"cylinders",
"dev_name",
"modules",
"sub_class_id",
"modules",
"type"
];
/**
* translate string - looks to the translation table and returns value
* @param str string to translate
* @return string translated string or original string if translation is unknown
*/
define string trans_str(string str) ``{
if (!haskey(trans_table, str))
{
y2warning("Cannot translate string '%1'", str);
}
return (string) (trans_table[str]:str);
}
/**
* translate boolean to Yes/No
* @param b any value
* @return string parameter b converted to string, if b is boolean then Yes/No is returned
*/
define string trans_bool(any b) ``{
if (is(b, boolean))
{
// yes/no strings
return (b == true) ? _("Yes") : _("No");
}
return sformat("%1", b);
}
/**
* evals to true if given value is scalar (not map or term or list)
* @param node any value
* @return boolean true if parameter node is a scalar value (it isn't a list or a map)
*/
define boolean scalar(any node) ``{
if (
is(node, string) ||
is(node, boolean) ||
is(node, integer) ||
is(node, float) ||
is(node, locale) ||
is(node, path))
{
return true;
}
return false;
}
/**
* if expandTree function tries to explore list, it should use some
* label for each item. it tree items are maps, this function decides
* which value from map will be used as label
* @param m device info
* @return string name of the selected representant for whole map
*/
define string get_representant(map<string,any> m) ``{
string out = "";
integer i = 0;
// search the 'order' table
while(i < size(representant_order))
{
string key_name = (string)(representant_order[i]:"");
if (haskey(m, key_name))
{
if (key_name == "start")
{
out = tohexstring((integer)(m[key_name]:0));
}
else if (key_name == "modules")
{
// Linux kernel modules (drivers)
out = _("Modules");
}
else if (key_name == "width")
{
out = resolution("dummy", m);
}
else if (key_name == "sub_class_id")
{
out = classtostring("dummy", m);
}
else
{
out = trans_str(sformat("%1", m[key_name]:nil));
}
break;
}
i = i + 1;
}
return out;
}
/**
* Recursively converts (scalar/nested) lists and maps to tree datastructure
* @param node any value
* @return list list of items (content of tree widget)
*/
define list expandTree(any node) ``{
if (node == nil)
{
return [];
}
// workaround for bug #31144 - don't visualize list
// with only one map item
if (is(node, list) && size((list) node) == 1)
{
list node_list = (list) node;
if (is(node_list[0]:nil, map))
{
map tmp = (map)eval(node_list[0]:$[]);
// if map has "model" key then don't flatten list,
// device model name would be removed from the tree
// when there is only one device in a device category
if (!haskey(tmp, "model"))
{
node = tmp;
}
}
}
// if node is scalar, we just return the new item.
if (scalar(node))
{
return [`item(trans_str(sformat("%1", node)))];
}
if (is(node, list))
{
// if node is list ...
list lout = [];
integer q = size((list) node);
integer pos = 0;
foreach(any e, (list) node,
``{
if (scalar(e))
{
if (e != nil)
{
lout = add(lout, `item(sformat("%1", e)));
}
}
else
{
string lab = UI::Glyph(`ArrowRight);
if (is(e, map<string,any>))
{
// ... create label for each item ...
string s = get_representant((map<string,any>) e);
if(s != "")
{
lab = s;
}
}
lout = add(lout, `item(lab, expandTree(e)));
}
// ... and add it to item list
pos = pos + 1;
}
);
return lout;
}
if (is(node, map))
{
// if node is map ...
map<string,any> node_map = translate_hw_entry((map<string, any>) node);
list ltmp = [];
foreach(string key, any v, node_map,
``{
// haha, hack! we need to translate the 'modules' entry into some more readable form...
// unfortunatelly 'modules' is used in several places and in different meaings...
if(key == "modules" && is(v, list))
{
v = modules((list<list<string> >) v);
}
// ... explore all pairs
if(scalar(v) || v == $[] || v == [])
{
ltmp = add(ltmp, `item(sformat("%1: %2", trans_str(key), trans_bool(v))));
}
else if (v == [""])
{
ltmp = add(ltmp, `item(sformat("%1", trans_str(key))));
}
else
{
ltmp = add(ltmp, `item(trans_str(sformat("%1", key)), expandTree(v)));
}
}
);
// ... and finally sort the items alphabetically
return sort(ltmp);
}
return [];
}
/**
* Save hwinfo output to the specified file
* @param file Target file
* @return boolean True if saving was successful
*/
define boolean save_hwinfo(string file) ``{
if (file == "" || file == nil)
{
return false;
}
string command = "/usr/sbin/hwinfo > " + file;
return SCR::Execute(.target.bash, command) == 0;
}
/**
* Save hwinfo output to the specified file, progress popup is displayed.
* Display error message when saving failed.
* @param target_file_name Target file
* @return boolean True if saving was successful
*/
define boolean save_hwinfo_to_file(string target_file_name) ``{
// window title
string filename = UI::AskForSaveFileName(target_file_name, "*", _("Save hwinfo Output to File"));
boolean saved = false;
if (filename != nil && size(filename) > 0)
{
// progress window content
UI::OpenDialog(`Label(_("Saving hardware information...")));
saved = save_hwinfo(filename);
UI::CloseDialog();
if (saved == false)
{
// error popup message
Report::Error(sformat(_("Saving output to the file '%1' failed."), target_file_name));
}
}
return saved;
}
/**
* Mount specified device
* @param device device name to mount
* @return string mount point where device was mounted (in /tmp subdirectory)
* or nil when mount failed
*/
define string mount_device(string device) ``{
string tmpdir = (string) SCR::Read(.target.tmpdir);
string mpoint = tmpdir + "/mount";
// create mount point directory
SCR::Execute(.target.mkdir, mpoint);
// mount device
boolean result = (boolean) SCR::Execute(.target.mount, [device, mpoint], "");
return (result == true) ? mpoint : nil;
}
/**
* Unmount device
* @param mount_point directory where device is mounted
* @return boolean true on success
*/
define boolean umount_device(string mount_point) ``{
return (boolean) SCR::Execute(.target.umount, mount_point);
}
define boolean has_hex_prefix (string in) {
if (size(in) < 2)
{
return false;
}
// check whether string has hex prefix (0x or 0X)
string start = substring(in, 0, 2);
return (start == "0x" || start == "0X");
}
define string remove_hex_prefix(string in) {
if (!has_hex_prefix(in))
{
return in;
}
return substring(in, 2);
}
define string add_hex_prefix(string in)
{
if (in == nil || in == "")
{
return "";
}
else
{
return (!has_hex_prefix(in)) ? "0x" + in : in;
}
}
}