summaryrefslogblamecommitdiffstats
path: root/src/os-plugins/plugins/syslog/OpenSLX/OSPlugin/syslog.pm
blob: c011bf664e6e15c470e4aa0f10a5ea456668e178 (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/
# -----------------------------------------------------------------------------
# syslog.pm
#    - implementation of the 'syslog' plugin, which installs  
#     all needed information for a displaymanager and for the syslog. 
# -----------------------------------------------------------------------------
package OpenSLX::OSPlugin::syslog;

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 => 'syslog',
    };

    return bless $self, $class;
}

sub getInfo
{
    my $self = shift;

    return {
        description => unshiftHereDoc(<<'        End-of-Here'),
            Sets up system log service for SLX-clients.
        End-of-Here
        precedence => 50,
    };
}

sub getAttrInfo
{
    my $self = shift;

    return {
        'syslog::active' => {
            applies_to_systems => 1,
            applies_to_clients => 1,
            description => unshiftHereDoc(<<'            End-of-Here'),
                should the 'syslog'-plugin be executed during boot?
            End-of-Here
            content_regex => qr{^(0|1)$},
            content_descr => '1 means active - 0 means inactive',
            default => '1',
        },
        'syslog::kind' => {
            applies_to_vendor_os => 1,
            description => unshiftHereDoc(<<'            End-of-Here'),
                kind of syslog to use \(syslogd-ng or old-style syslog\)
            End-of-Here
            content_regex => qr{^(syslog-ng|syslogd|rsyslog)$},
            content_descr => 'allowed: syslog-ng, syslogd, rsyslog',
            default => 'rsyslog',
        },
        'syslog::host' => {
            applies_to_systems => 1,
            applies_to_clients => 1,
            description => unshiftHereDoc(<<'            End-of-Here'),
                name or IP-address of host where syslog shall be sent to
            End-of-Here
            content_regex => undef,
            content_descr => 'a hostname or an IP address',
            default => undef,
        },
        'syslog::port' => {
            applies_to_systems => 1,
            applies_to_clients => 1,
            description => unshiftHereDoc(<<'            End-of-Here'),
                port number (UDP) where syslog shall be sent to
            End-of-Here
            content_regex => undef,
            content_descr => 'a port number',
            default => 514,
        },
        'syslog::file' => {
            applies_to_systems => 1,
            applies_to_clients => 1,
            description => unshiftHereDoc(<<'            End-of-Here'),
                name of file where all log messages shall be written
            End-of-Here
            content_regex => undef,
            content_descr => 'a complete file path',
            default => '/var/log/messages',
        },
    };
}

sub installationPhase
{
    my $self = shift;
    my $info = shift;
    
    $self->{pluginRepositoryPath} = $info->{'plugin-repo-path'};
    $self->{pluginTempPath}       = $info->{'plugin-temp-path'};
    $self->{openslxBasePath}      = $info->{'openslx-base-path'};
    $self->{openslxConfigPath}    = $info->{'openslx-config-path'};
    $self->{attrs}                = $info->{'plugin-attrs'};

    # We are going to change some of the stage1 attributes during installation
    # (basically we are filling the ones that are not defined). Since the result
    # of these changes might change between invocations, we do not want to store
    # the resulting values, but we want to store the original (undef).
    # In order to do so, we copy all stage1 attributes directly into the
    # object hash and change them there.
    $self->{kind}  = lc($self->{attrs}->{'syslog::kind'});
    
    my $engine = $self->{'os-plugin-engine'};
    
    if ($self->{kind} eq 'rsyslog' && !isInPath($self->{distro}->getBinaryName('rsyslog'))) {
        $engine->installPackages($self->{distro}->getPackageName('rsyslog'));
    }
    
    if ($self->{kind} eq 'syslog-ng' && !isInPath('syslog-ng')) {
        $engine->installPackages($self->{distro}->getPackageName($self->{distro}->getBinaryName('syslog-ng')));
    }

    # not sure if we ever should setup this service
    if ($self->{kind} eq 'syslogd' && !isInPath($self->{distro}->getBinaryName('syslogd'))) {
        $engine->installPackages($self->{distro}->getPackageName('syslogd'));
    }

    if (!$self->{kind}) {
        if (qx{which $self->{distro}->getBinaryName('rsyslog')}) {
            $self->{kind} = 'rsyslog';
        }
        elsif (qx{which $self->{distro}->getBinaryName('syslog-ng')}) {
            $self->{kind} = 'syslog-ng';
        }
        elsif (qx{which $self->{distro}->getBinaryName('syslogd')}) {
            $self->{kind} = 'syslogd';
        }
        else {
            die _tr(
                "no syslog daemon available, plugin 'syslog' wouldn't work!"
            );
        }
        print _tr("selecting %s as syslog kind\n", $self->{kind});
    }

    # start to actually do something - according to current stage1 attributes
    if ($self->{kind} eq 'rsyslog') {
        $self->_setupRsyslog($self->{attrs});
    }
    elsif ($self->{kind} eq 'syslog-ng') {
        $self->_setupSyslogNG($self->{attrs});
    }
    elsif ($self->{kind} eq 'syslogd') {
        $self->_setupSyslogd($self->{attrs});
    }
    else {
        die _tr(
            'unknown kind "%s" given, only "rsyslog", "syslog-ng" and "syslogd" are supported!',
            $self->{kind}
        );
    }

    return;
}

sub removalPhase
{
    my $self = shift;
    my $info = shift;
    
    return;
}

sub _setupRsyslog
{
    my $self  = shift;
    my $attrs = shift;

    my $repoPath = $self->{pluginRepositoryPath};

    my $kind = lc($attrs->{'syslog::kind'});
    my $rlInfo = $self->{distro}->runlevelInfo($kind);

    my $conf = unshiftHereDoc(<<"    End-of-Here");
        #!/bin/sh
        # written by OpenSLX-plugin 'syslog'

        testmkd /mnt/var/run/rsyslog
        rllinker $rlInfo->{scriptName} $rlInfo->{startAt} $rlInfo->{stopAt}

    End-of-Here
    spitFile("$repoPath/syslog.sh", $conf);
    
    return;    
}

sub _setupSyslogNG
{
    my $self  = shift;
    my $attrs = shift;
    
    my $repoPath = $self->{pluginRepositoryPath};

    my $kind = lc($attrs->{'syslog::kind'});
    my $rlInfo = $self->{distro}->runlevelInfo($kind);

    my $conf = unshiftHereDoc(<<"    End-of-Here");
        #!/bin/sh
        # written by OpenSLX-plugin 'syslog'

        cat >/mnt/etc/syslog-ng/syslog-ng.conf <<END
        # written by OpenSLX-plugin 'syslog'
        source all {
            file("/proc/kmsg");
            unix-dgram("/dev/log");
            internal();
        };
        destination console_all {
            file("/dev/tty10");
        };
        log {
            source(all);
            destination(console_all);
        };
        END
        
        if [ -n "\${syslog_host}" ]; then
        [ -z \${syslog_port} ] && syslog_port=514
        cat >>/mnt/etc/syslog-ng/syslog-ng.conf <<END
        destination loghost {
            udp( "\${syslog_host}" port(\${syslog_port}) );
        };
        log {
            source(all);
            destination(loghost);
        };
        END
        fi

        if [ -n "\${syslog_file}" ]; then
        cat >>/mnt/etc/syslog-ng/syslog-ng.conf <<END
        destination allmessages {
            file("\${syslog_file}");
        };
        log {
            source(all);
            destination(allmessages);
        };
        END
        fi

        rllinker $rlInfo->{scriptName} $rlInfo->{startAt} $rlInfo->{stopAt}

    End-of-Here
    spitFile("$repoPath/syslog.sh", $conf);
    
    return;    
}

sub _setupSyslogd
{
    my $self  = shift;
    my $attrs = shift;
    
    my $repoPath = $self->{pluginRepositoryPath};

    my $kind = lc($attrs->{'syslog::kind'});
    my $rlInfo = $self->{distro}->runlevelInfo($kind);

    my $conf = unshiftHereDoc(<<'    End-of-Here');
        #!/bin/sh
        # written by OpenSLX-plugin 'syslog'

        cat >/mnt/etc/syslog.conf <<END
        # written by OpenSLX-plugin 'syslog'
         *.=debug;\
            auth,authpriv.none;\
            news.none;mail.none     -/var/log/debug
         *.=info;*.=notice;*.=warn;\
            auth,authpriv.none;\
            cron,daemon.none;\
            mail,news.none          -/var/log/messages

        END
        
        if [ -n "\${syslog_host}" ]; then
        [ -z \${syslog_port} ] && syslog_port=514
        cat >/mnt/etc/syslog.conf <<END
         *.*                        @${syslog_host}
        END
        fi

        if [ -n "\${syslog_file}" ]; then
        cat >/mnt/etc/syslog.conf <<END
         *.*                        ${syslog_file}
        };
        END
        fi

        rllinker $rlInfo->{scriptName} $rlInfo->{startAt} $rlInfo->{stopAt}

    End-of-Here
    spitFile("$repoPath/syslog.sh", $conf);
    
    return;    
}

1;