summaryrefslogblamecommitdiffstats
path: root/os-plugins/plugins/desktop/OpenSLX/OSPlugin/desktop.pm
blob: a0dc589cb2617dd54c418bba1eb8b7e249a60f96 (plain) (tree)













































































































































































































































































































































































































                                                                                                       
# Copyright (c) 2008 - OpenSLX GmbH
#
# This program is free software distributed under the GPL version 2.
# See http://openslx.org/COPYING
#
# If you have any feedback please consult http://openslx.org/feedback and
# send your suggestions, praise, or complaints to feedback@openslx.org
#
# General information about OpenSLX can be found at http://openslx.org/
# -----------------------------------------------------------------------------
# desktop.pm
#	- implementation of the 'desktop' plugin, which installs  
#     all needed information for a displaymanager and for the desktop. 
# -----------------------------------------------------------------------------
package OpenSLX::OSPlugin::desktop;

use strict;
use warnings;

use base qw(OpenSLX::OSPlugin::Base);

use File::Basename;
use File::Path;

use OpenSLX::Basics;
use OpenSLX::Utils;

sub new
{
	my $class = shift;

	my $self = {
		name => 'desktop',
	};

	return bless $self, $class;
}

sub getInfo
{
	my $self = shift;

	return {
		description => unshiftHereDoc(<<'		End-of-Here'),
			Sets a desktop and creates needed configs, theme can be set as well.
		End-of-Here
		mustRunAfter => [],
	};
}

sub getAttrInfo
{
	my $self = shift;

	return {
		'desktop::active' => {
			applies_to_systems => 1,
			applies_to_clients => 1,
			description => unshiftHereDoc(<<'			End-of-Here'),
				should the 'desktop'-plugin be executed during boot?
			End-of-Here
			content_regex => qr{^(0|1)$},
			content_descr => '1 means active - 0 means inactive',
			default => '1',
		},
		'desktop::precedence' => {
			applies_to_systems => 1,
			applies_to_clients => 1,
			description => unshiftHereDoc(<<'			End-of-Here'),
				the execution precedence of the 'desktop' plugin
			End-of-Here
			content_regex => qr{^\d\d$},
			content_descr => 'allowed range is from 01-99',
			default => 40,
		},
		'desktop::manager' => {
			applies_to_systems => 1,
			applies_to_clients => 1,
			description => unshiftHereDoc(<<'			End-of-Here'),
				which display manager to start: gdm, kdm, xdm?)
			End-of-Here
			content_regex => qr{^(g|k|x)dm$},
			content_descr => 'allowed: gdm, kdm, xdm',
			default => undef,
		},
		'desktop::kind' => {
			applies_to_systems => 1,
			applies_to_clients => 1,
			description => unshiftHereDoc(<<'			End-of-Here'),
				which desktop environment shall be used: gnome, kde, xfce, ...)
			End-of-Here
			content_regex => undef,
			content_descr => 'allowed: gnome, kde, xfce',
			default => undef,
		},
		'desktop::mode' => {
			applies_to_systems => 1,
			applies_to_clients => 1,
			description => unshiftHereDoc(<<'			End-of-Here'),
				which type of operation mode: kiosk, workstation, remote-desktop, ...?)
			End-of-Here
			content_regex => undef,
			content_descr => 'allowed: ...',
			default => 'workstation',
		},
		'desktop::theme' => {
			applies_to_systems => 1,
			description => unshiftHereDoc(<<'			End-of-Here'),
				name of the theme to apply to the desktop (unset for no theme)
			End-of-Here
			content_regex => undef,
			content_descr => undef,
			default => 'openslx',
		},
		'desktop::gdm' => {
			applies_to_vendor_os => 1,
			description => unshiftHereDoc(<<'			End-of-Here'),
				should gdm be available (installed in vendor-OS)?
			End-of-Here
			content_regex => undef,
			content_descr => '1 or 0',
			default => undef,
		},
		'desktop::kdm' => {
			applies_to_vendor_os => 1,
			description => unshiftHereDoc(<<'			End-of-Here'),
				should kdm be available (installed in vendor-OS)?
			End-of-Here
			content_regex => undef,
			content_descr => '1 or 0',
			default => undef,
		},
		'desktop::xdm' => {
			applies_to_vendor_os => 1,
			description => unshiftHereDoc(<<'			End-of-Here'),
				should xdm be available (installed in vendor-OS)?
			End-of-Here
			content_regex => undef,
			content_descr => '1 or 0',
			default => undef,
		},
		'desktop::gnome' => {
			applies_to_vendor_os => 1,
			description => unshiftHereDoc(<<'			End-of-Here'),
				should gnome be available (installed in vendor-OS)?
			End-of-Here
			content_regex => undef,
			content_descr => '1 or 0',
			default => undef,
		},
		'desktop::kde' => {
			applies_to_vendor_os => 1,
			description => unshiftHereDoc(<<'			End-of-Here'),
				should kde be available (installed in vendor-OS)?
			End-of-Here
			content_regex => undef,
			content_descr => '1 or 0',
			default => undef,
		},
		'desktop::xfce' => {
			applies_to_vendor_os => 1,
			description => unshiftHereDoc(<<'			End-of-Here'),
				should xfce be available (installed in vendor-OS)?
			End-of-Here
			content_regex => undef,
			content_descr => '1 or 0',
			default => undef,
		},
	};
}

sub getDefaultAttrsForVendorOS
{
	my $self         = shift;
	my $vendorOSName = shift;

	my $attrs = $self->getAttrInfo();
	
	if ($vendorOSName =~ m{kde$}) {
		$attrs->{'desktop::manager'}->{default} = 'kdm';
		$attrs->{'desktop::kind'}->{default} = 'kde';
	}
	elsif ($vendorOSName =~ m{gnome$}) {
		$attrs->{'desktop::manager'}->{default} = 'gdm';
		$attrs->{'desktop::kind'}->{default} = 'gnome';
	}
	elsif ($vendorOSName =~ m{xfce$}) {
		$attrs->{'desktop::manager'}->{default} = 'xdm';
		$attrs->{'desktop::kind'}->{default} = 'xcfe';
	}
	else {
		# TODO: chroot into vendor-OS and determine the available desktop
	}
	return $attrs;
}

sub installationPhase
{
	my $self = shift;
	
	$self->{pluginRepositoryPath} = shift;
	$self->{pluginTempPath}       = shift;
	$self->{openslxPath}          = shift;
	$self->{attrs}                = shift;
	
	$self->_installRequiredPackages();
	$self->_determineAttrsByInstalledPackages();

use Data::Dumper; print Dumper $self->{attrs};

	if ($self->{attrs}->{'desktop::gdm'}) {
		$self->_setupGDM();
	}
	if ($self->{attrs}->{'desktop::kdm'}) {
		$self->_setupKDM();
	}
	if ($self->{attrs}->{'desktop::xdm'}) {
		$self->_setupXDM();
	}

	return;
}

sub removalPhase
{
	my $self = shift;
	my $pluginRepositoryPath = shift;
	my $pluginTempPath = shift;

	return;
}

sub copyRequiredFilesIntoInitramfs
{
	my $self                = shift;
	my $targetPath          = shift;
	my $attrs               = shift;
	my $makeInitRamFSEngine = shift;
	
	my $themeDir = "$openslxConfig{'base-path'}/share/themes";
        my $desktopXdmcp = $attrs->{'desktop::xdmcp'} || '';
	my $xdmcpConfigDir = "$openslxConfig{'base-path'}/lib/plugins/desktop/files/$desktopXdmcp";
	my $desktopTheme = $attrs->{'desktop::theme'} || '';
	if ($desktopTheme) {
		my $desktopThemeDir 
			= "$themeDir/$desktopTheme/desktop/$desktopXdmcp";
		if (-d $desktopThemeDir) {
                        $makeInitRamFSEngine->addCMD(
                                "mkdir -p $targetPath/usr/share/files"
                        );
			$makeInitRamFSEngine->addCMD(
				"mkdir -p $targetPath/usr/share/themes"
			);
			$makeInitRamFSEngine->addCMD(
				"cp -a $desktopThemeDir $targetPath/usr/share/themes/"
			);
                        $makeInitRamFSEngine->addCMD(
                                "cp -a $xdmcpConfigDir $targetPath/usr/share/files"
                        );
		}
	}
	else {
		$desktopTheme = '<none>';
	}

	vlog(
		1, 
		_tr(
			"desktop-plugin: desktop=%s", 
			$desktopTheme
		)
	);

	return;
}

sub _installRequiredPackages
{
	my $self  = shift;

	my $engine = $self->{'os-plugin-engine'};
	
	for my $desktop (qw( gnome kde xfce )) {
		next if !$self->{attrs}->{"desktop::$desktop"};
		my $packages = $engine->getPackagesForSelection($desktop);
		$engine->installPackages($packages);
	}
	
	for my $dm (qw( gdm kdm xdm )) {
		next if !$self->{attrs}->{"desktop::$dm"};
		$engine->installPackages($dm);
	}

	return 1;
}

sub _determineAttrsByInstalledPackages
{
	my $self  = shift;
	my $attrs = shift;
	
	if (!defined $attrs->{'desktop::gnome'}) {
		$attrs->{'desktop::gnome'} = $self->{distro}->isGNOMEInstalled();
	}
	if (!defined $attrs->{'desktop::gdm'}) {
		$attrs->{'desktop::gdm'} = $self->{distro}->isGDMInstalled();
	}
	if (!defined $attrs->{'desktop::kde'}) {
		$attrs->{'desktop::kde'} = $self->{distro}->isKDEInstalled();
	}
	if (!defined $attrs->{'desktop::kdm'}) {
		$attrs->{'desktop::kdm'} = $self->{distro}->isKDMInstalled();
	}
	if (!defined $attrs->{'desktop::xfce'}) {
		$attrs->{'desktop::xfde'} = $self->{distro}->isXFCEInstalled();
	}
	if (!defined $attrs->{'desktop::xdm'}) {
		$attrs->{'desktop::xdm'} = $self->{distro}->isXDMInstalled();
	}

	return 1;
}

sub _setupGDM
{
	my $self = shift;
	my $attrs = shift;
	
	my $repoPath = $self->{pluginRepositoryPath};
	mkpath([ "$repoPath/gdm" ]);
	
	my $pathInfo   = $self->{distro}->GDMPathInfo();
	$self->_setupGDMScript($pathInfo);

	my $configHash = $self->{distro}->GDMConfigHashForWorkstation();
	$self->_writeConfigHash($configHash, "$repoPath/gdm/workstation/gdm.conf");
	
	$configHash = $self->{distro}->GDMConfigHashForKiosk();
	$self->_writeConfigHash($configHash, "$repoPath/gdm/kiosk/gdm.conf");

	$configHash = $self->{distro}->GDMConfigHashForChooser();
	$self->_writeConfigHash($configHash, "$repoPath/gdm/chooser/gdm.conf");

	return;	
}

sub _setupGDMScript
{
	my $self = shift;
	my $pathInfo = shift;
	
	my $repoPath = $self->{pluginRepositoryPath};
	my $configFile = $pathInfo->{config};
	my $paths = join(' ', ( dirname($configFile), @{$pathInfo->{paths}} ));
	my $script = unshiftHereDoc(<<"	End-of-Here");
		#!/bin/ash
		# written by OpenSLX-plugin 'desktop'
		mkdir -p $paths
		ln -sf /mnt$repoPath/gdm/\$desktop_kind/gdm.conf $configFile
	End-of-Here
	spitFile("$repoPath/gdm/desktop.sh", $script);
	return;
}

sub _setupKDM
{
	my $self = shift;
	my $attrs = shift;
	
}

sub _setupXDM
{
	my $self = shift;
	my $attrs = shift;
}

sub _writeConfigHash
{
	my $self = shift;
	my $hash = shift || {};
	my $file = shift;
	
	my $content = '';
	for my $domain (sort keys %$hash) {
		$content .= "[$domain]\n";
		for my $key (sort keys %{$hash->{$domain}}) {
			my $value 
				= defined $hash->{$domain}->{$key} 
					? $hash->{$domain}->{$key}
					: '';
			$content .= "$key=$value\n";
		}
	}
	spitFile($file, $content);
}

1;