summaryrefslogblamecommitdiffstats
path: root/src/os-plugins/plugins/desktop/OpenSLX/Distro/Base.pm
blob: 316448bb7e1dc7de50503458d66d9e7683dbb076 (plain) (tree)
1
2
3
4
5
6
7
8
9
10









                                                                               

                                                                             
                                                                               
                                       



             
                                                                  
 
                   
                              
 







                                                                                


                               



              

                            

                                                                

             

 
                            
 
                     
    


                                                              
                                                  
 
 




                                                                 









                                                    

 
                
 
                     
 


                                                                    
 
             

 






                           
              
 
                     
 
                                            
 
             



               








                                      
 
                     

 
                  
 




                                          
    





                                                                                
                                             



                           
 
                                                                    



                                                                    
                                                           
                               
                                                   

                                                                          





                                                                              
                                           


               
                                                         
                                                            
                                

                
                                                         
                                                             
                                

            
                                               
                                                                
               
    
                   

 

                               






                                            

                           
                                                




                              
                                     



                                      
                                      
                                                  



                       
                                 









                                       



                         


                                                          

                                                           
 
                       



                           



                                                          
 
                       

 






                                

              
                     
 


                                                                  
 
             

 






                           

              
                     
 
                                            
 
             

 
               
 
                     



                                       


                           
 
                     

 













                                                                                
                 

                                             


                           
 
                                                                 



                                                                    
                               

                                                                   

                                                                                  
                                                                            




                                                                            

                                           
                                                          


                                
                                                          


                                
                                                         




                                                                          









                               





                                                            

                                       

                                      

                          
                                                      
                                








                                         
                                    







                              
 
                     

                                                          

                                                           
 












                                                          






                                  

               
                     
 


                                                                   
 
             

 






                           

              
                     
 
                                            
 
             

 
  
# 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/OpenSLX/Distro/Base.pm
#    - provides base implementation of the Distro API for the desktop plugin.
# -----------------------------------------------------------------------------
package desktop::OpenSLX::Distro::Base;

use strict;
use warnings;

our $VERSION = 1.01;        # API-version . implementation-version

use File::Basename;
use Scalar::Util qw( weaken );

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

################################################################################
### interface methods
################################################################################
sub new
{
    my $class = shift;
    my $self = {};
    return bless $self, $class;
}

sub initialize
{
    my $self        = shift;
    $self->{engine} = shift;
    weaken($self->{'engine'});
        # avoid circular reference between distro and its engine
    
    return 1;
}

sub getDefaultDesktopManager
{
    my $self = shift;
    
    # the default implementation prefers KDM over GDM over XDM
    return $self->isKDMInstalled() ? 'kdm' 
        : $self->isGDMInstalled() ? 'gdm' 
        : $self->isXDMInstalled() ? 'xdm' : undef;
}

sub getDefaultDesktopKind
{
    my $self = shift;
    
    # the default implementation prefers GNOME over KDE over XFCE
    return $self->isGNOMEInstalled() ? 'gnome' 
        : $self->isKDEInstalled() ? 'kde' 
        : $self->isXFCEInstalled() ? 'xfce' : undef;
}

sub isGNOMEInstalled
{
    my $self = shift;

    return isInPath('gnome-session');
}

sub installGNOME
{
    my $self = shift;

    $self->{engine}->installPackages(
        $self->{engine}->getInstallablePackagesForSelection('gnome')
    );

    return 1;
}

sub isGDMInstalled
{
    my $self = shift;

    return isInPath('gdm');
}

sub installGDM
{
    my $self = shift;

    $self->{engine}->installPackages('gdm');

    return 1;
}

sub GDMPathInfo
{
    my $self = shift;
    
    my $pathInfo = {
        config => '/etc/gdm/gdm.conf',
        paths => [
            '/var/lib/gdm',
            '/var/log/gdm',
        ],
    };

    return $pathInfo;
}

sub setupGDMScript
{
    my $self     = shift;
    my $repoPath = shift;

    my $pathInfo   = $self->GDMPathInfo();
    my $configFile = $pathInfo->{config};
    
    my $paths 
        = join(
            ' ', 
            map  { '/mnt' . $_ } ( dirname($configFile), @{$pathInfo->{paths}} )
        );
    my $script = unshiftHereDoc(<<"    End-of-Here");
        # written by OpenSLX-plugin 'desktop'
        
        for i in $paths; do
          testmkd \$i
        done

        cp /mnt$repoPath/gdm/\$desktop_mode/gdm.conf /mnt$configFile

        # activate theme only if the corresponding xml file is found
        # (otherwise fall back to default theme of vendor-OS)
        if [ -n "\$desktop_theme" ]; then
          thdir=/opt/openslx/plugin-repo/desktop/themes/gdm
          theme=\$desktop_theme
          if [ -e /mnt\$thdir/\$theme/*.xml ]; then
            sed -i "s,\\[greeter\\],[greeter]\\nGraphicalThemedColor=," \\
              /mnt$configFile
            sed -i "s,\\[greeter\\],[greeter]\\nGraphicalThemeDir=\$thdir," \\
              /mnt$configFile
            sed -i "s,\\[greeter\\],[greeter]\\nGraphicalTheme=\$theme," \\
              /mnt$configFile
          fi
        fi
        case "\${desktop_allowshutdown}" in
          none)
          ;;
          root)
            sed "s|AllowShutdown.*|AllowShutdown=true|;\\
                 s|SecureShutdown.*|SecureShutdown=true|" \\
              -i /mnt$configFile
          ;;
          users)
            sed "s|AllowShutdown.*|AllowShutdown=true|;\\
                 s|SecureShutdown.*|SecureShutdown=false|" \\
              -i /mnt$configFile
          ;;
        esac
        [ "\${desktop_rootlogin}" -ne 0 ] && \\
          sed "s|AllowRoot.*|AllowRoot=true|" -i /mnt$configFile
    End-of-Here
    
    return $script;
}

sub GDMConfigHashForWorkstation
{
    my $self = shift;
    
    return {
        'chooser' => {
        },
        'daemon' => {
            AutomaticLoginEnable => 'false',
            Group => 'gdm',
            User => 'gdm',
            DefaultSession => 'default.desktop',
        },
        'debug' => {
            Enable => 'false',
        },
        'greeter' => {
            AllowShutdown => 'false',
            Browser => 'false',
            MinimalUID => '500',
            SecureShutdown => 'false',
            ShowDomain => 'false',
            DefaultWelcome => 'false',
            Welcome => 'OpenSLX Workstation (%n)',
        },
        'gui' => {
        },
        'security' => {
            AllowRoot => 'false',
            AllowRemoteRoot => 'false',
            DisallowTCP => 'true',
            SupportAutomount => 'true',
        },
        'server' => {
        },
        'xdmcp' => {
            Enable => 'false',
        },
    };
}

sub GDMConfigHashForKiosk
{
    my $self = shift;
    
    my $configHash = $self->GDMConfigHashForWorkstation();
    $configHash->{daemon}->{AutomaticLoginEnable} = 'true';
    $configHash->{daemon}->{AutomaticLogin} = 'nobody';

    return $configHash;
}

sub GDMConfigHashForChooser
{
    my $self = shift;
    
    my $configHash = $self->GDMConfigHashForWorkstation();
    $configHash->{xdmcp}->{Enable} = 'true';

    return $configHash;
}

sub isKDEInstalled
{
    my $self = shift;
    
    return isInPath('startkde');
}

sub installKDE
{
    my $self = shift;

    $self->{engine}->installPackages(
        $self->{engine}->getInstallablePackagesForSelection('kde')
    );

    return 1;
}

sub isKDMInstalled
{
    my $self = shift;

    return isInPath('kdm');
}

sub installKDM
{
    my $self = shift;

    $self->{engine}->installPackages('kdm');

    return 1;
}

sub KDMPathInfo
{
    my $self = shift;
    
    my $pathInfo = {
        config => '/etc/opt/kdm/kdmrc',
        paths => [
            '/var/lib/kdm',
        ],
    };

    return $pathInfo;
}

sub setupKDMScript
{
    my $self     = shift;
    my $repoPath = shift;

    my $pathInfo   = $self->KDMPathInfo();
    my $configFile = $pathInfo->{config};
    
    my $paths 
        = join(
            ' ', 
            map  { '/mnt' . $_ } ( dirname($configFile), @{$pathInfo->{paths}} )
        );
    my $script = unshiftHereDoc(<<"    End-of-Here");
        #!/bin/sh
        # written by OpenSLX-plugin 'desktop'

        for i in $paths; do
          testmkd \$i
        done

        cp /mnt$repoPath/kdm/\$desktop_mode/kdmrc /mnt$configFile

        # activate theme only if the corresponding xml file is found
        # (otherwise fall back to default theme of vendor-OS)
        if [ -n "\$desktop_theme" ]; then
          theme=\$desktop_theme
          thdir=/opt/openslx/plugin-repo/desktop/themes/kdm/\$theme
          if [ -e /mnt\$thdir/*.xml ]; then
            sed -i "s,\\[X-\\*-Greeter\\],[X-*-Greeter]\\nUseBackground=false," \\
              /mnt$configFile
            sed -i "s,\\[X-\\*-Greeter\\],[X-*-Greeter]\\nTheme=\$thdir," \\
              /mnt$configFile
            sed -i "s,\\[X-\\*-Greeter\\],[X-*-Greeter]\\nUseTheme=true," \\
              /mnt$configFile
          fi
        fi
        case "\${desktop_allowshutdown}" in
          none)
            sed "s|AllowShutdown.*|AllowShutdown=None|" \\
              -i /mnt$configFile
          ;;
          root)
            sed "s|AllowShutdown.*|AllowShutdown=Root|" \\
              -i /mnt$configFile
          ;;
          users)
            sed "s|AllowShutdown.*|AllowShutdown=All|" \\
              -i /mnt$configFile
          ;;
        esac
        [ "\${desktop_rootlogin}" -ne 0 ] && \\
          sed "s|AllowRootLogin.*|AllowRootLogin=true|" -i /mnt$configFile
    End-of-Here
    
    return $script;
}

sub KDMConfigHashForWorkstation
{
    my $self = shift;
    
    return {
#        'General' => {
#            StaticServers => ':0',
#            ReserveServers => ':1,:2,:3',
#            ServerVTs => '-7',
#            ConsoleTTYs => 'tty1,tty2,tty3,tty4,tty5,tty6',
#        },
        'X-:0-Core' => {
            AutoLoginEnable => 'false',
            AllowRootLogin => 'false',
            AllowShutdown => 'All',
        },
        'X-*-Greeter' => {
            GreetString => 'OpenSLX Workstation (%h)',
            SelectedUsers => '',
            UserList => 'false',
        },
        'X-:*-Greeter' => {
            AllowClose => 'false',
            UseAdminSession => 'true',
        },
        'X-:0-Greeter' => {
            LogSource => '/dev/xconsole',
            UseAdminSession => 'false',
            PreselectUser => 'None',
        },
        'xdmcp' => {
            Enable => 'false',
        },
    };
}

sub KDMConfigHashForKiosk
{
    my $self = shift;
    
    my $configHash = $self->KDMConfigHashForWorkstation();
    $configHash->{'X-:0-Core'}->{AutoLoginEnable} = 'true';
    $configHash->{'X-:0-Core'}->{AutoLoginUser} = 'nobody';

    return $configHash;
}

sub KDMConfigHashForChooser
{
    my $self = shift;
    
    my $configHash = $self->KDMConfigHashForWorkstation();
    $configHash->{xdmcp}->{Enable} = 'true';

    return $configHash;
}

sub isXFCEInstalled
{
    my $self = shift;

    return isInPath('startxfce4');
}

sub installXFCE
{
    my $self = shift;

    $self->{engine}->installPackages(
        $self->{engine}->getInstallablePackagesForSelection('xfce')
    );

    return 1;
}

sub isXDMInstalled
{
    my $self = shift;

    return isInPath('xdm');
}

sub installXDM
{
    my $self = shift;

    $self->{engine}->installPackages('xdm');

    return 1;
}

1;