ACC SHELL
/**
* File:
* desktop_finish.ycp
*
* Module:
* Step of base installation finish
*
* Authors:
* Jiri Srain <jsrain@suse.cz>
*
* $Id: desktop_finish.ycp 54888 2009-01-22 11:47:19Z locilka $
*
*/
{
textdomain "installation";
import "DefaultDesktop";
import "Directory";
import "Mode";
import "ProductFeatures";
import "FileUtils";
import "String";
any ret = nil;
string func = "";
map param = $[];
/* Check arguments */
if(size(WFM::Args()) > 0 && is(WFM::Args(0), string)) {
func = (string)WFM::Args(0);
if(size(WFM::Args()) > 1 && is(WFM::Args(1), map))
param = (map)WFM::Args(1);
}
y2milestone ("starting desktop_finish");
y2debug("func=%1", func);
y2debug("param=%1", param);
if (func == "Info")
{
return (any)$[
"steps" : 1,
// progress step title
"title" : _("Initializing default window manager..."),
"when" : [ `installation, `autoinst ],
];
}
else if (func == "Write")
{
// this detects WM and DM according to selected patterns and
// installed packages
if ( !Mode::update () )
{
map <string, map> dd_map = DefaultDesktop::GetAllDesktopsMap ();
string selected_desktop = DefaultDesktop::Desktop();
y2milestone ("Selected desktop: %1", selected_desktop);
if (selected_desktop == nil || selected_desktop == "")
selected_desktop = "gnome";
string default_dm = "";
string default_wm = "";
string default_cursor = "";
list <string> desktop_order = [];
map <string, integer> dorder_map = $[];
// build a map $[desktop_id -> desktop_order]
foreach (string desktop_id, map desktop_def, dd_map, {
desktop_order = add (desktop_order, desktop_id);
dorder_map[desktop_id] = (desktop_def["order"]:nil != nil ?
desktop_def["order"]:9999
:
9999
);
});
// sort the desktops according to their order
desktop_order = sort (string desktop_x, string desktop_y, desktop_order,
``(dorder_map[desktop_x]:9999 < dorder_map[desktop_y]:9999)
);
// the default one is always the first one
desktop_order = prepend (desktop_order, DefaultDesktop::Desktop());
y2milestone ("Desktop order: %1", desktop_order);
boolean desktop_found = false;
foreach (string d, desktop_order, {
if (desktop_found)
break;
y2milestone ("Checking desktop: %1", d);
foreach (string package, dd_map[d, "packages"]:[], {
if (Pkg::IsProvided (package) && (Pkg::PkgInstalled (package) || Pkg::IsSelected (package))) {
y2milestone ("Package %1 selected or installed, desktop %2 matches", package, d);
desktop_found = true;
default_dm = dd_map[d, "logon"]:"";
y2milestone ("Setting logon manager %1 - package selected", default_dm);
default_wm = dd_map[d, "desktop"]:"";
y2milestone ("Setting window manager %1 - package selected", default_wm);
default_cursor = dd_map[d, "cursor"]:default_cursor;
y2milestone ("Setting cursor theme %1 - package selected", default_cursor);
} else {
y2milestone ("Package %1 for desktop %2 neither selected nor installed, trying next desktop...", package, d);
}
});
});
y2milestone ("Default desktop: %1", default_wm);
y2milestone ("Default logon manager: %1", default_dm);
y2milestone ("Default cursor theme: %1", default_cursor);
SCR::Write (.sysconfig.windowmanager.DEFAULT_WM, default_wm);
SCR::Write (.sysconfig.windowmanager.X_MOUSE_CURSOR, default_cursor);
SCR::Write (.sysconfig.windowmanager, nil);
string dpmng_file = "/etc/sysconfig/displaymanager";
// Creates an empty sysconfig file if it doesn't exist
if (! FileUtils::Exists (dpmng_file) && FileUtils::Exists ("/usr/bin/touch")) {
y2milestone ("Creating file %1: %2",
dpmng_file,
SCR::Execute (.target.bash, sformat ("/usr/bin/touch '%1'",
String::Quote (dpmng_file)))
);
}
// this one should be obsolete nowadays but maybe KDE still uses it
string dm_shutdown = ProductFeatures::GetStringFeature ("globals",
"displaymanager_shutdown");
y2milestone ("Logon manager shutdown: %1", dm_shutdown);
if (dm_shutdown != nil && dm_shutdown != "")
{
SCR::Write (.sysconfig.displaymanager.DISPLAYMANAGER_SHUTDOWN,
dm_shutdown);
}
y2milestone ("sysconfig/displaymanager/DISPLAYMANAGER=%1", default_dm);
SCR::Write (.sysconfig.displaymanager.DISPLAYMANAGER, default_dm);
SCR::Write (.sysconfig.displaymanager, nil);
// bnc #431158, patch done by lnussel
string polkit_default_privs = ProductFeatures::GetStringFeature ("globals",
"polkit_default_privs");
if (polkit_default_privs != nil && polkit_default_privs != "")
{
y2milestone ("Writing %1 to POLKIT_DEFAULT_PRIVS", polkit_default_privs);
SCR::Write (.sysconfig.security.POLKIT_DEFAULT_PRIVS,
polkit_default_privs);
// BNC #440182
// Flush the SCR cache before calling the script
SCR::Write (.sysconfig.security, nil);
map ret = (map) SCR::Execute (
.target.bash_output,
// check whether it exists
"test -x /sbin/set_polkit_default_privs && " +
// give some feedback
"echo /sbin/set_polkit_default_privs && " +
// It's dozens of lines...
"/sbin/set_polkit_default_privs | wc -l && " +
"echo 'Done'"
);
y2milestone ("Command returned: %1", ret);
}
}
}
else
{
y2error ("unknown function: %1", func);
ret = nil;
}
y2debug("ret=%1", ret);
y2milestone("desktop_finish finished");
return ret;
} /* EOF */
ACC SHELL 2018