# Copyright (c) 2007..2010 - 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/ # ----------------------------------------------------------------------------- # bootsplash.pm # - implementation of the 'bootsplash' plugin, which installs splashy # into the ramfs, including changeing theme # ----------------------------------------------------------------------------- package OpenSLX::OSPlugin::bootsplash; use strict; use warnings; use base qw(OpenSLX::OSPlugin::Base); use File::Path; use OpenSLX::Basics; use OpenSLX::Utils; use OpenSLX::DistroUtils; sub new { my $class = shift; my $self = { name => 'bootsplash', }; mkpath("$openslxConfig{'config-path'}/plugins/bootsplash/themes"); return bless $self, $class; } sub getInfo { my $self = shift; return { description => unshiftHereDoc(<<' End-of-Here'), Installs Splashy as bootsplash into ramfs and sets a Theme. End-of-Here precedence => 30, }; } sub getAttrInfo { my $self = shift; return { 'bootsplash::active' => { applies_to_systems => 1, applies_to_clients => 1, description => unshiftHereDoc(<<' End-of-Here'), should the 'bootsplash'-plugin be executed during boot? End-of-Here content_regex => qr{^(0|1)$}, content_descr => '1 means active - 0 means inactive', default => '1', }, 'bootsplash::theme' => { applies_to_systems => 1, applies_to_clients => 1, description => unshiftHereDoc(<<' End-of-Here'), name of the theme to apply to bootsplash (unset for no theme) End-of-Here content_regex => undef, content_descr => undef, default => 'openslx', }, }; } sub suggestAdditionalKernelParams { my $self = shift; my $makeInitRamFSEngine = shift; my @suggestedParams; # add vga=0x317 unless explicit vga-mode is already set if (!$makeInitRamFSEngine->haveKernelParam(qr{\bvga=})) { push @suggestedParams, 'vga=0x317'; } # add quiet, if not already set if (!$makeInitRamFSEngine->haveKernelParam('quiet')) { push @suggestedParams, 'quiet'; } return @suggestedParams; } sub suggestAdditionalKernelModules { my $self = shift; my $makeInitRamFSEngine = shift; my @suggestedModules; # Ubuntu needs vesafb and fbcon (which drags along some others) #if ($makeInitRamFSEngine->{'distro-name'} =~ m{^ubuntu}i) { push @suggestedModules, qw( i810 i830 i915 mga nouveau r128 radeon savage sis tdfx ttm via drm fbcon vesafb ); #} return @suggestedModules; } sub installationPhase { my $self = shift; my $info = shift; $self->{pluginRepositoryPath} = $info->{'plugin-repo-path'}; $self->{openslxBasePath} = $info->{'openslx-base-path'}; my $splashyPath = "$self->{openslxBasePath}/lib/plugins/bootsplash/files"; my $pluginRepoPath = "$self->{pluginRepositoryPath}"; my $initFile = newInitFile(); my $do_stop = unshiftHereDoc(<<' End-of-Here'); /opt/openslx/plugin-repo/bootsplash/bin/splashy shutdown sleep 1 /opt/openslx/plugin-repo/bootsplash/bin/splashy_update \ "progress 100" 2>/dev/null End-of-Here # add helper functions to initfile # first parameter name of the function # second parameter content of the function $initFile->addFunction('do_start', " : # do nothing here"); $initFile->addFunction('do_stop', $do_stop); $initFile->addFunction('do_restart', " : # do nothing here"); # place a call of the helper function in the stop block # of the init file # first parameter name of the function # second parameter name of the block $initFile->addFunctionCall('do_start', 'start'); $initFile->addFunctionCall('do_stop', 'stop'); $initFile->addFunctionCall('do_restart', 'restart'); my $distro = (split('-',$self->{'os-plugin-engine'}->distroName()))[0]; # write initfile to filesystem spitFile( "$pluginRepoPath/bootsplash.halt", getInitFileForDistro($initFile, ucfirst($distro)) ); # copy splashy(_update) into plugin-repo folder mkpath("$pluginRepoPath/sbin"); mkpath("$pluginRepoPath/lib"); mkpath("$pluginRepoPath/usr/lib"); slxsystem("cp -a $splashyPath/sbin/* $pluginRepoPath/sbin/; cp -p $splashyPath/lib/* $pluginRepoPath/lib/; cp -p $splashyPath/usr/lib/* $pluginRepoPath/usr/lib/") == 0 or die _tr( "unable to copy splashy to $pluginRepoPath" ); # create a proper (distro specific) runlevel script for halt #my $initfile = newInitFile(); #$initfile->addDaemon(""); # #my $runlevelscript = getInitFileForDistro($initfile, "ubuntu"); return; } sub removalPhase { my $self = shift; my $info = shift; return; } sub copyRequiredFilesIntoInitramfs { my $self = shift; my $targetPath = shift; my $attrs = shift; my $makeInitRamFSEngine = shift; my $bootsplashDir = "$openslxConfig{'base-path'}/lib/plugins/bootsplash"; my $bootsplashConfigDir = "$openslxConfig{'config-path'}/plugins/bootsplash"; my $bootsplashTheme = $attrs->{'bootsplash::theme'} || ''; my $splashyThemeDir = ''; if ($bootsplashTheme) { my $bootsplashThemeDir = "$bootsplashDir/files/themes/$bootsplashTheme"; my $altThemeDir = "$bootsplashConfigDir/themes/$bootsplashTheme"; if (-d $bootsplashThemeDir) { $splashyThemeDir = "$bootsplashThemeDir"; } elsif (-d $altThemeDir) { $splashyThemeDir = "$altThemeDir"; } if (-d $splashyThemeDir) { my $splashyPath = "$bootsplashDir/files"; $makeInitRamFSEngine->addCMD( "cp -p $splashyPath/sbin/splashy* $targetPath/sbin/; cp -p $splashyPath/lib/lib* $targetPath/lib/; cp -p $splashyPath/usr/lib/lib* $targetPath/usr/lib/" ); $makeInitRamFSEngine->addCMD( "mkdir -p $targetPath/etc/splashy/themes" ); $makeInitRamFSEngine->addCMD( "cp -a $splashyThemeDir $targetPath/etc/splashy/themes/" ); my $defSplashyTheme = "/etc/splashy/themes/$bootsplashTheme"; my $splashyConfig = unshiftHereDoc(<<" End-of-Here"); /etc/splashy/themes $bootsplashTheme $defSplashyTheme /etc/splashy/splashy.pid /dev/.initramfs/splashy.fifo End-of-Here $makeInitRamFSEngine->addCMD( { file => "$targetPath/etc/splashy/config.xml", content => $splashyConfig, } ); } } else { $bootsplashTheme = ''; } vlog(1, _tr("bootsplash-plugin: bootsplash=%s", $bootsplashTheme)); return; } 1;