Lemonldap-NG-Common

 view release on metacpan or  search on metacpan

eg/lokiSender  view on Meta::CPAN

#!/usr/bin/perl

use strict;
use Getopt::Long;
use POSIX;
use Pod::Usage;

our $VERSION = "2.22.0";

# Options
my $opts = {};
my $help;
my $opt_user  = '__APACHEUSER__';
my $opt_group = '__APACHEGROUP__';

my @CMDLINE = @ARGV;

GetOptions(
    'daemon'          => \$opts->{daemon},
    'defer-dir=s'     => \$opts->{deferDir},
    'debug'           => \$opts->{debug},
    'delay=s'         => \$opts->{delay},
    'group|g=s'       => \$opts->{group},
    'help|h'          => \$help,
    'ini-file=s'      => \$opts->{iniFile},
    'syslog-facility' => \$opts->{syslogFacility},
    'user|u=s'        => \$opts->{user},
) or pod2usage( -exitcode => 1, -verbose => 0 );

foreach my $opt ( keys %$opts ) {
    $opts->{$opt} //= $ENV{ 'LLNG_LOKI_' . uc($opt) };
}

pod2usage( -exitcode => 0, -verbose => 2 ) if $help;

$opts->{delay}    ||= 60 if $opts->{daemon};
$opts->{deferDir} ||= &_getDeferDir;
mkdir $opts->{deferDir}                   unless -e $opts->{deferDir};
die "Missing directory $opts->{deferDir}" unless -d $opts->{deferDir};
die "Cannot write into $opts->{deferDir}" unless -w $opts->{deferDir};

die 'Missing --defer-dir' unless $opts->{deferDir};

# Change owner if asked
POSIX::nice(10);
if ( $opts->{group} || $opts->{user} ) {
    eval {
        no warnings;
        my ( $gid, $uid );
        if ( $opts->{group} ) {
            $gid = getgrnam( $opts->{group} );
            POSIX::setgid($gid);
        }
        if ( $opts->{user} ) {
            $uid = getpwnam( $opts->{user} );
            chown( $uid, ( $gid // [ stat( $opts->{deferDir} ) ]->[5] ),
                $opts->{deferDir} )
              and chmod( 0700, $opts->{deferDir} );
            POSIX::setuid( scalar( getpwnam( $opts->{user} ) ) )
              if $opts->{user};
            my (
                undef, undef, undef,    undef, undef,
                undef, undef, $homedir, undef
            ) = getpwnam( $opts->{user} );
            $ENV{HOME} = $homedir if $homedir;
        }
    };
}

&daemonize if $opts->{daemon};

require HTTP::Request;
require JSON;
require LWP::UserAgent;
require Sys::Syslog;

my $j = JSON->new->canonical;

my $syslogOpened;

sub _log {
    my ( $level, $msg ) = @_;
    if ( $opts->{daemon} ) {
        unless ($syslogOpened) {
            Sys::Syslog::openlog( 'LLNG-Loki', 'cons,pid,ndelay',
                $opts->{syslogFacility} || 'daemon' );
            $syslogOpened++;
        }
        Sys::Syslog::syslog( $level, $msg );
    }
    else {
        print STDERR "[$level] $msg\n";
    }
}

sub debug {
    map { _log( 'debug', $_ ) } @_ if $opts->{debug};
}

sub warning {
    map { _log( 'warning', $_ ) } @_;
}

sub error {
    map { _log( 'err', $_ ) } @_;
}

sub _getDeferDir {

    require Lemonldap::NG::Common::Conf;
    my $ca = Lemonldap::NG::Common::Conf->new( { (
                $opts->{iniFile}
                ? ( confFile => $opts->{iniFile} )
                : ()
            )
        }



( run in 0.850 second using v1.01-cache-2.11-cpan-71847e10f99 )