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 >
Wrap
Text File
|
2006-11-29
|
7KB
|
299 lines
/**
* File: clients/hwinfo.ycp
* Module: Hardware information
* Summary: Main file
* Authors: Dan Meszaros <dmeszar@suse.cz>
* Ladislav Slezak <lslezak@suse.cz>
* Michal Svec <msvec@suse.cz>
*
* $Id: hwinfo.ycp 24252 2005-07-22 10:06:54Z lslezak $
*/
{
textdomain "tune";
import "Wizard";
import "Label";
import "Arch";
//include "hwinfo/classnames.ycp";
include "hwinfo/routines.ycp";
/**
* this global variable is needed for skipping out from recursed function
*/
boolean abortPressed = false;
/*
* open progress bar window
*/
UI::OpenDialog(
`HBox(
`VSpacing(7),
`VBox(
`HSpacing(40),
// popup dialog header
`Label(_("Probing")),
`HBox(
`HWeight(1, `Label(`id(`initLab), ""))
),
// progress bar label
`ProgressBar(`id(`initProg), _("Progress"), 1000, 0),
`VSpacing(0.5),
`PushButton(`id(`abort), `opt(`key_F9), Label::AbortButton())
)
)
);
/*
* these paths will be excluded from probing.
* .probe.mouse doesn't like running X
* other paths are not user-interesting
*/
list exclude_list = [.probe.byclass, .probe.bybus, .probe.ihw_data, .probe.system, .probe.status, .probe.cdb_isdn, .probe.boot_disk];
if (Arch::is_uml())
{
// exclude more path in UML system, UML supports/emulates only few devices
exclude_list = union(exclude_list, [ .probe.scsi, .probe.camera, .probe.pppoe, .probe.isapnp, .probe.tape, .probe.joystick,
.probe.usb, .probe.ieee1394ctrl, .probe.usbctrl, .probe.cdrom, .probe.floppy, .probe.chipcard, .probe.mouse
]);
}
/*
* if xserver is running, don't probe for mouse and chipcard
* because it has bad side effect (moving cursor)
*/
if (SCR::Execute(.target.bash, "/bin/ps -C X") == 0)
{
y2warning("X server is running - mouse and chipcard will not be probed");
exclude_list = add(exclude_list, .probe.mouse);
// .probe.chipcard has same effect as .probe.mouse
exclude_list = add(exclude_list, .probe.chipcard);
}
/**
* Add extra CPU info from .proc.cpuinfo to data read from .probe agent
* @param cpuinfo CPU information returned by .probe agent
* @return list input with additional CPU information
*/
define list add_cpu_info(list<map> cpuinfo) ``{
// add information from /proc/cpuinfo for each CPU
integer cpu_index = 0;
list ret = maplist(map probe_cpuinfo, cpuinfo, ``{
// get all keys for selected processor
list<string> keys = (list<string>) SCR::Dir(add(.proc.cpuinfo.value, sformat("%1", cpu_index)));
if (keys != nil)
{
// read values
foreach(string key, keys, ``{
probe_cpuinfo = add(probe_cpuinfo, key, SCR::Read(add(add(.proc.cpuinfo.value, sformat("%1", cpu_index)), key)));
}
);
// add processor index
probe_cpuinfo = add(probe_cpuinfo, "Processor", cpu_index);
}
cpu_index = cpu_index + 1;
return probe_cpuinfo;
}
);
return ret;
}
/**
* returns string that is behind the last dot of given string (extract last part of path)
* @param str path in string form
* @return string last path element
*/
define string afterLast(string str) ``{
list strs = splitstring(str, ".");
return strs[size(strs) - 1]:"";
}
/**
* Returns list of values read from path p
* @param progMin minimum value used in progressbar
* @param progMax maximum value used in progressbar
* @param p read path p
* @return term tree widget content
*/
define term buildHwTree(string p, integer progMin, integer progMax) ``{
y2debug("buildHwTree path: %1", p);
any a = UI::PollInput();
if (a == `cancel || a == `abort)
{
abortPressed = true;
return nil;
}
string node = afterLast(p);
string node_translated = trans_str(node);
UI::ChangeWidget(`id(`initLab), `Value, node_translated);
y2milestone("Probing %1 (%2)...", node, node_translated);
path pat = topath(p);
y2debug("Reading path: %1", p);
if (contains(exclude_list, pat))
{
return nil;
}
list<string> dir = (list<string>) SCR::Dir(pat);
if (dir == nil)
{
any val = SCR::Read(pat);
if (scalar(val))
{
return `item(sformat("%1: %2", trans_str(afterLast(p)), trans_bool(val)));
}
else if (val == nil || val == [] || val == $[])
{
return nil;
}
else
{
if (afterLast(p) == "cpu")
{
val = add_cpu_info((list<map>) val);
}
return `item(trans_str(afterLast(p)), expandTree(val));
}
}
else
{
// remove duplicates from the list
list<string> uniq = [];
foreach(string d, dir, ``{
if (!contains(uniq, d))
{
uniq = add(uniq, d);
}
}
);
dir = uniq;
integer step=1000;
if (size(dir)!=0)
{
step = (progMax - progMin) / size(dir);
}
integer prog = progMin;
integer pos = size(dir)-1;
list lout = [];
term itm = nil;
while(pos >= 0)
{
itm = buildHwTree(p + "." + dir[pos]:nil, prog, prog + step);
if (abortPressed)
{
return nil;
}
if (itm != nil)
{
lout = add(lout, itm);
}
pos = pos - 1;
prog = prog + step;
UI::ChangeWidget(`id(`initProg), `Value, prog);
}
return `item(afterLast(p), sort(lout));
}
return nil;
}
// Main
// tree item list
term items = nil;
// default initial path
path pat = .probe;
if (size(WFM::Args()) > 0)
{
// initial path overriden by module argument
pat = topath(WFM::Args(0));
}
// build the tree
items = buildHwTree(sformat("%1", pat), 0, 1000);
// interrupted
if (abortPressed)
{
UI::CloseDialog();
return `abort;
}
// title label
string title = _("&All Entries"); //this wasn't marked for translation in 8.0
if(pat != .probe)
{
title = trans_str(afterLast(sformat("%1", pat)));
}
UI::CloseDialog();
term con = `Tree(`id(`idTree), `opt(`vstretch, `hstretch), title, items[1]:nil);
Wizard::CreateDialog();
Wizard::SetDesktopIcon("hwinfo");
Wizard::SetBackButton(`save, _("&Save to File...") );
Wizard::SetNextButton(`next, Label::CloseButton() );
// abort is not needed, module is read-only
Wizard::HideAbortButton();
// dialog header
Wizard::SetContents (_("Hardware Information"), con,
// help text
_("<P>The <B>Hardware Information</B> module displays the hardware
details of your computer. Click any node for more information.</p>\n")
+ _("<P>You can save hardware information to a file. Click <B>Save to File</B> and enter the filename.</P>"),
true, true);
UI::SetFocus(`id(`idTree));
any event = nil;
// wait for finish
while(event != `abort && event !=`next && event != `cancel)
{
event = UI::UserInput();
if (event == `save)
{
// store hwinfo output to the file
save_hwinfo_to_file("/");
}
}
Wizard::CloseDialog();
return `next;
/* EOF */
}