ACC SHELL

Path : /usr/share/YaST2/clients/
File Upload :
Current File : //usr/share/YaST2/clients/desktop_finish.ycp

/**
 * 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