1646 lines
47 KiB
Perl
1646 lines
47 KiB
Perl
package Lemonldap::NG::Manager::Cli;
|
|
|
|
# Required packages
|
|
|
|
use strict;
|
|
use Lemonldap::NG::Common::Conf;
|
|
|
|
use feature qw (switch);
|
|
|
|
# Constants
|
|
|
|
our $VERSION = "1.3.0";
|
|
|
|
my $ERRORS =
|
|
{
|
|
TOO_FEW_ARGUMENTS => "Too few arguments",
|
|
UNKNOWN_ACTION => "Unknown action",
|
|
CONFIG_WRITE_ERROR => "Error while writting the configuration",
|
|
NOT_IMPLEMENTED => "Not yet implemented",
|
|
};
|
|
|
|
## @cmethod Lemonldap::NG::Manager::Cli new ()
|
|
# Create a new Lemonldap::NG::Manager::Cli object
|
|
#
|
|
# @return New Lemonldap::NG::Manager::Cli object
|
|
sub new
|
|
{
|
|
my ($class) = @_;
|
|
|
|
my $this =
|
|
{
|
|
"confAccess" => Lemonldap::NG::Common::Conf->new ()
|
|
};
|
|
|
|
$this->{conf} = $this->{confAccess}->getConf ();
|
|
|
|
bless ($this, $class);
|
|
return $this;
|
|
}
|
|
|
|
## @method int saveConf ()
|
|
# Save LemonLDAP::NG configuration
|
|
#
|
|
# @return Configuration identifier.
|
|
sub saveConf
|
|
{
|
|
my ($self) = @_;
|
|
my $ret = $self->{confAccess}->saveConf ($self->{conf});
|
|
return $ret;
|
|
}
|
|
|
|
## @method int run (array argv)
|
|
# Run the application
|
|
#
|
|
# @param @argv List of arguments of the command line
|
|
# @return Exit code
|
|
sub run
|
|
{
|
|
my ($self, @argv) = @_;
|
|
|
|
$self->{argv} = \@argv;
|
|
$self->{argc} = @argv;
|
|
|
|
if (!$self->parseCmd ())
|
|
{
|
|
print STDERR $self->getError (), "\n";
|
|
return 1;
|
|
}
|
|
|
|
if (!$self->action ())
|
|
{
|
|
print STDERR $self->getError (), "\n";
|
|
return 1;
|
|
}
|
|
|
|
if ($self->{action}->{save})
|
|
{
|
|
# Save configuration
|
|
my $cfgNb = $self->saveConf ();
|
|
|
|
# If there is no config identifier, then an error occured
|
|
if (!$cfgNb)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{CONFIG_WRITE_ERROR});
|
|
return 0;
|
|
}
|
|
|
|
print "Configuration $cfgNb created!\n";
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
## @method bool parseCmd ()
|
|
# Parse command line
|
|
#
|
|
# @return true on success, false otherwise
|
|
sub parseCmd
|
|
{
|
|
my ($self) = @_;
|
|
|
|
# check if there is at least on action specified
|
|
if ($self->{argc} < 1)
|
|
{
|
|
$self->setError ($ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
given ($self->{argv}[0])
|
|
{
|
|
## Variables
|
|
|
|
when ("set")
|
|
{
|
|
# set takes two parameters
|
|
if ($self->{argc} < 3)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $var = $self->{argv}[1];
|
|
my $val = $self->{argv}[2];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "set",
|
|
save => 1,
|
|
var => $var,
|
|
val => $val,
|
|
};
|
|
}
|
|
|
|
when ("unset")
|
|
{
|
|
# unset takes one parameter
|
|
if ($self->{argc} < 2)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $var = $self->{argv}[1];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "unset",
|
|
save => 1,
|
|
var => $var
|
|
};
|
|
}
|
|
|
|
when ("get")
|
|
{
|
|
# get takes one parameter
|
|
if ($self->{argc} < 2)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $var = $self->{argv}[1];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "get",
|
|
save => 0,
|
|
var => $var,
|
|
};
|
|
}
|
|
|
|
## Macros
|
|
|
|
when ("set-macro")
|
|
{
|
|
# set-macro takes two parameters
|
|
if ($self->{argc} < 3)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $m_name = $self->{argv}[1];
|
|
my $m_expr = $self->{argv}[2];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "set-macro",
|
|
save => 1,
|
|
name => $m_name,
|
|
expr => $m_expr
|
|
};
|
|
}
|
|
|
|
when ("unset-macro")
|
|
{
|
|
# unset-macro takes one parameter
|
|
if ($self->{argc} < 2)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $m_name = $self->{argv}[1];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "unset-macro",
|
|
save => 1,
|
|
var => $m_name
|
|
};
|
|
|
|
}
|
|
|
|
when ("get-macro")
|
|
{
|
|
# get-macro tkaes one parameter
|
|
if ($self->{argc} < 2)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $m_name = $self->{argv}[1];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "get-macro",
|
|
save => 0,
|
|
name => $m_name
|
|
};
|
|
}
|
|
|
|
## Applications
|
|
|
|
when ("apps-set-cat")
|
|
{
|
|
# apps-set-cat takes two parameter
|
|
if ($self->{argc} < 3)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $catid = $self->{argv}[1];
|
|
my $catname = $self->{argv}[2];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "apps-set-cat",
|
|
save => 1,
|
|
id => $catid,
|
|
name => $catname
|
|
};
|
|
}
|
|
|
|
when ("apps-get-cat")
|
|
{
|
|
# apps-get-cat takes one parameter
|
|
if ($self->{argc} < 2)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $catid = $self->{argv}[1];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "apps-get-cat",
|
|
save => 0,
|
|
id => $catid
|
|
};
|
|
}
|
|
|
|
when ("apps-add")
|
|
{
|
|
# apps-add takes two parameters
|
|
if ($self->{argc} < 3)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $appid = $self->{argv}[1];
|
|
my $catid = $self->{argv}[2];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "apps-add",
|
|
save => 1,
|
|
appid => $appid,
|
|
catid => $catid
|
|
};
|
|
}
|
|
|
|
when ("apps-set-uri")
|
|
{
|
|
# apps-set-uri takes two parameters
|
|
if ($self->{argc} < 3)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $appid = $self->{argv}[1];
|
|
my $appuri = $self->{argv}[2];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "apps-set-uri",
|
|
save => 1,
|
|
id => $appid,
|
|
uri => $appuri
|
|
};
|
|
}
|
|
|
|
when ("apps-set-name")
|
|
{
|
|
# apps-set-name takes two parameters
|
|
if ($self->{argc} < 3)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $appid = $self->{argv}[1];
|
|
my $appname = $self->{argv}[2];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "apps-set-name",
|
|
save => 1,
|
|
id => $appid,
|
|
name => $appname
|
|
};
|
|
}
|
|
|
|
when ("apps-set-desc")
|
|
{
|
|
# apps-set-desc takes two parameters
|
|
if ($self->{argc} < 3)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $appid = $self->{argv}[1];
|
|
my $appdesc = $self->{argv}[2];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "apps-set-desc",
|
|
save => 1,
|
|
id => $appid,
|
|
desc => $appdesc
|
|
};
|
|
}
|
|
|
|
when ("apps-set-logo")
|
|
{
|
|
# apps-set-logo takes two parameters
|
|
if ($self->{argc} < 3)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $appid = $self->{argv}[1];
|
|
my $applogo = $self->{argv}[2];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "apps-set-logo",
|
|
save => 1,
|
|
id => $appid,
|
|
logo => $applogo
|
|
};
|
|
}
|
|
|
|
when ("apps-set-display")
|
|
{
|
|
# apps-set-display takes two parameters
|
|
if ($self->{argc} < 3)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $appid = $self->{argv}[1];
|
|
my $appdpy = $self->{argv}[2];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "apps-set-display",
|
|
save => 1,
|
|
id => $appid,
|
|
dpy => $appdpy
|
|
};
|
|
}
|
|
|
|
when ("apps-get")
|
|
{
|
|
# apps-get takes one parameter
|
|
if ($self->{argc} < 2)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $appid = $self->{argv}[1];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "apps-get",
|
|
save => 0,
|
|
id => $appid
|
|
};
|
|
}
|
|
|
|
when ("apps-rm")
|
|
{
|
|
# apps-rm takes one parameter
|
|
if ($self->{argc} < 2)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $appid = $self->{argv}[1];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "apps-rm",
|
|
save => 1,
|
|
id => $appid
|
|
};
|
|
}
|
|
|
|
## Rules
|
|
|
|
when ("rules-set")
|
|
{
|
|
# rules-set takes 3 parameters
|
|
if ($self->{argc} < 4)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $uri = $self->{argv}[1];
|
|
my $expr = $self->{argv}[2];
|
|
my $rule = $self->{argv}[3];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "rules-set",
|
|
save => 1,
|
|
uri => $uri,
|
|
expr => $expr,
|
|
rule => $rule
|
|
};
|
|
}
|
|
|
|
when ("rules-unset")
|
|
{
|
|
# rules-unset takes two parameters
|
|
if ($self->{argc} < 3)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $uri = $self->{argv}[1];
|
|
my $expr = $self->{argv}[2];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "rules-unset",
|
|
save => 1,
|
|
uri => $uri,
|
|
expr => $expr
|
|
};
|
|
}
|
|
|
|
when ("rules-get")
|
|
{
|
|
# rules-get takes one parameter
|
|
if ($self->{argc} < 2)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $uri = $self->{argv}[1];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "rules-get",
|
|
save => 0,
|
|
uri => $uri
|
|
};
|
|
}
|
|
|
|
## exported variables
|
|
|
|
when ("export-var")
|
|
{
|
|
# export-var takes two parameters
|
|
if ($self->{argc} < 3)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $key = $self->{argv}[1];
|
|
my $val = $self->{argv}[2];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "export-var",
|
|
save => 1,
|
|
key => $key,
|
|
val => $val
|
|
};
|
|
}
|
|
|
|
when ("unexport-var")
|
|
{
|
|
# unexport-var takes one parameter
|
|
if ($self->{argc} < 2)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $key = $self->{argv}[1];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "unexport-var",
|
|
save => 1,
|
|
key => $key
|
|
};
|
|
}
|
|
|
|
when ("get-exported-vars")
|
|
{
|
|
# get-exported-varis doesn't take any parameter
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "get-exported-vars",
|
|
save => 0
|
|
};
|
|
}
|
|
|
|
## exported headers
|
|
|
|
when ("export-header")
|
|
{
|
|
# export-header takes 3 parameters
|
|
if ($self->{argc} < 4)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $vhost = $self->{argv}[1];
|
|
my $header = $self->{argv}[2];
|
|
my $expr = $self->{argv}[3];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "export-header",
|
|
save => 1,
|
|
vhost => $vhost,
|
|
header => $header,
|
|
expr => $expr
|
|
};
|
|
}
|
|
|
|
when ("unexport-header")
|
|
{
|
|
# unexport-header takes two parameter
|
|
if ($self->{argc} < 3)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $vhost = $self->{argv}[1];
|
|
my $header = $self->{argv}[2];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "unexport-header",
|
|
save => 1,
|
|
vhost => $vhost,
|
|
header => $header,
|
|
};
|
|
}
|
|
|
|
when ("get-exported-headers")
|
|
{
|
|
# get-exported-header takes one parameter
|
|
if ($self->{argc} < 2)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $vhost = $self->{argv}[1];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "get-exported-headers",
|
|
save => 0,
|
|
vhost => $vhost
|
|
};
|
|
}
|
|
|
|
## virtual host
|
|
|
|
when ("vhost-add")
|
|
{
|
|
# vhost-add takes one parameter
|
|
if ($self->{argc} < 2)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $vhost = $self->{argv}[1];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "vhost-add",
|
|
save => 1,
|
|
vhost => $vhost
|
|
};
|
|
}
|
|
|
|
when ("vhost-del")
|
|
{
|
|
# vhost-del takes one parameter
|
|
if ($self->{argc} < 2)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $vhost = $self->{argv}[1];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "vhost-del",
|
|
save => 1,
|
|
vhost => $vhost
|
|
};
|
|
}
|
|
|
|
when ("vhost-set-port")
|
|
{
|
|
# vhost-set-port takes two parameters
|
|
if ($self->{argc} < 3)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $vhost = $self->{argv}[1];
|
|
my $port = $self->{argv}[2];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "vhost-set-port",
|
|
save => 1,
|
|
vhost => $vhost,
|
|
port => $port
|
|
};
|
|
}
|
|
|
|
when ("vhost-set-https")
|
|
{
|
|
# vhost-set-https takes two parameters
|
|
if ($self->{argc} < 3)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $vhost = $self->{argv}[1];
|
|
my $https = $self->{argv}[2];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "vhost-set-https",
|
|
save => 1,
|
|
vhost => $vhost,
|
|
https => $https
|
|
};
|
|
}
|
|
|
|
|
|
when ("vhost-set-maintenance")
|
|
{
|
|
# vhost-set-maintenance takes two parameters
|
|
if ($self->{argc} < 3)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $vhost = $self->{argv}[1];
|
|
my $off = $self->{argv}[2];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "vhost-set-maintenance",
|
|
save => 1,
|
|
vhost => $vhost,
|
|
off => $off
|
|
};
|
|
}
|
|
|
|
when ("vhost-list")
|
|
{
|
|
# vhost-list doesn't take any parameter
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "vhost-list",
|
|
save => 0
|
|
};
|
|
}
|
|
|
|
## global storage
|
|
|
|
when ("global-storage")
|
|
{
|
|
# global-storage doesn't take any parameter
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "global-storage",
|
|
save => 0
|
|
};
|
|
}
|
|
|
|
when ("global-storage-set-dir")
|
|
{
|
|
# global-storage takes one parameter
|
|
if ($self->{argc} < 2)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $path = $self->{argv}[1];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "global-storage-set-dir",
|
|
save => 1,
|
|
path => $path
|
|
};
|
|
}
|
|
|
|
when ("global-storage-set-lockdir")
|
|
{
|
|
# global-storage takes one parameter
|
|
if ($self->{argc} < 2)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $path = $self->{argv}[1];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "global-storage-set-lockdir",
|
|
save => 1,
|
|
path => $path
|
|
};
|
|
}
|
|
|
|
## reload URLs
|
|
|
|
when ("reload-urls")
|
|
{
|
|
# reload-urls doesn't take any parameter
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "reload-urls",
|
|
save => 0
|
|
};
|
|
}
|
|
|
|
when ("reload-url-add")
|
|
{
|
|
# reload-url-add takes two parameters
|
|
if ($self->{argc} < 3)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $vhost = $self->{argv}[1];
|
|
my $url = $self->{argv}[2];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "reload-url-add",
|
|
save => 0,
|
|
vhost => $vhost,
|
|
url => $url
|
|
};
|
|
}
|
|
|
|
when ("reload-url-del")
|
|
{
|
|
# reload-url-del takes one parameter
|
|
if ($self->{argc} < 2)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{TOO_FEW_ARGUMENTS});
|
|
return 0;
|
|
}
|
|
|
|
my $vhost = $self->{argv}[1];
|
|
|
|
# define action
|
|
$self->{action} =
|
|
{
|
|
type => "reload-url-del",
|
|
save => 0,
|
|
vhost => $vhost
|
|
};
|
|
}
|
|
|
|
# no action found
|
|
default
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{UNKNOWN_ACTION});
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
## @method bool action ()
|
|
# Execute action parsed by parseCmd() method
|
|
#
|
|
# @return true on success, false otherwise
|
|
sub action
|
|
{
|
|
my ($self) = @_;
|
|
|
|
given ($self->{action}->{type})
|
|
{
|
|
## Variables
|
|
|
|
when ("set")
|
|
{
|
|
my $var = $self->{action}->{var};
|
|
my $val = $self->{action}->{val};
|
|
|
|
$self->{conf}->{$var} = $val;
|
|
}
|
|
|
|
when ("unset")
|
|
{
|
|
my $var = $self->{action}->{var};
|
|
|
|
if (not defined ($self->{conf}->{$var}))
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{CONFIG_WRITE_ERROR}.": There is no variables named '$var'");
|
|
return 0;
|
|
}
|
|
|
|
delete $self->{conf}->{$var};
|
|
}
|
|
|
|
when ("get")
|
|
{
|
|
my $var = $self->{action}->{var};
|
|
|
|
if (not defined ($self->{conf}->{$var}))
|
|
{
|
|
$self->setError ("$_: There is no variables named '$var'");
|
|
return 0;
|
|
}
|
|
|
|
print "$var = '", $self->{conf}->{$var}, "'\n";
|
|
}
|
|
|
|
## Macros
|
|
|
|
when ("set-macro")
|
|
{
|
|
my $m_name = $self->{action}->{name};
|
|
my $m_expr = $self->{action}->{expr};
|
|
|
|
$self->{conf}->{macros}->{$m_name} = $m_expr;
|
|
}
|
|
|
|
when ("unset-macro")
|
|
{
|
|
my $m_name = $self->{action}->{name};
|
|
|
|
if (not defined ($self->{conf}->{macros}->{$m_name}))
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{CONFIG_WRITE_ERROR}.": There is no macros named '$m_name'");
|
|
return 0;
|
|
}
|
|
|
|
delete $self->{conf}->{macros}->{$m_name};
|
|
}
|
|
|
|
when ("get-macro")
|
|
{
|
|
my $m_name = $self->{action}->{name};
|
|
|
|
if (not defined ($self->{conf}->{macros}->{$m_name}))
|
|
{
|
|
$self->setError ("$_: There is no macros named '$m_name'");
|
|
return 0;
|
|
}
|
|
|
|
print "$m_name = '", $self->{conf}->{macros}->{$m_name}, "'\n";
|
|
}
|
|
|
|
## Applications
|
|
|
|
when ("apps-set-cat")
|
|
{
|
|
my $catid = $self->{action}->{id};
|
|
my $catname = $self->{action}->{name};
|
|
|
|
if (defined ($self->{conf}->{applicationList}->{$catid}))
|
|
{
|
|
$self->{conf}->{applicationList}->{$catid}->{catname} = $catname;
|
|
}
|
|
else
|
|
{
|
|
$self->{conf}->{applicationList}->{$catid} =
|
|
{
|
|
type => "category",
|
|
catname => $catname
|
|
};
|
|
}
|
|
}
|
|
|
|
when ("apps-get-cat")
|
|
{
|
|
my $catid = $self->{action}->{id};
|
|
|
|
if (not defined ($self->{conf}->{applicationList}->{$catid}))
|
|
{
|
|
$self->setError ("$_: There is no category '$catid'");
|
|
return 0;
|
|
}
|
|
|
|
print "$catid: ", $self->{conf}->{applicationList}->{$catid}->{catname}, "\n";
|
|
}
|
|
|
|
when ("apps-add")
|
|
{
|
|
my $appid = $self->{action}->{appid};
|
|
my $catid = $self->{action}->{catid};
|
|
|
|
if (not defined ($self->{conf}->{applicationList}->{$catid}))
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{CONFIG_WRITE_ERROR}.": Category '$catid' doesn't exist");
|
|
return 0;
|
|
}
|
|
|
|
if (defined ($self->{conf}->{applicationList}->{$catid}->{$appid}))
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{CONFIG_WRITE_ERROR}.": Application '$appid' exists");
|
|
return 0;
|
|
}
|
|
|
|
$self->{conf}->{applicationList}->{$catid}->{$appid} =
|
|
{
|
|
type => "application",
|
|
options =>
|
|
{
|
|
logo => "demo.png",
|
|
name => $appid,
|
|
description => $appid,
|
|
display => "auto",
|
|
uri => "http://test1.example.com"
|
|
}
|
|
};
|
|
}
|
|
|
|
when ("apps-set-uri")
|
|
{
|
|
my $appid = $self->{action}->{id};
|
|
my $appuri = $self->{action}->{uri};
|
|
|
|
my $found = 0;
|
|
while (my ($catid, $applist) = each %{$self->{conf}->{applicationList}} and $found != 1)
|
|
{
|
|
while (my ($_appid, $app) = each %{$applist} and $found != 1)
|
|
{
|
|
if ($appid eq $_appid)
|
|
{
|
|
$app->{options}->{uri} = $appuri;
|
|
$found = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($found == 0)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{CONFIG_WRITE_ERROR}.": Application '$appid' not found");
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
when ("apps-set-name")
|
|
{
|
|
my $appid = $self->{action}->{id};
|
|
my $appname = $self->{action}->{name};
|
|
|
|
my $found = 0;
|
|
while (my ($catid, $applist) = each %{$self->{conf}->{applicationList}} and $found != 1)
|
|
{
|
|
while (my ($_appid, $app) = each %{$applist} and $found != 1)
|
|
{
|
|
if ($appid eq $_appid)
|
|
{
|
|
$app->{options}->{name} = $appname;
|
|
$found = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($found == 0)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{CONFIG_WRITE_ERROR}.": Application '$appid' not found");
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
when ("apps-set-desc")
|
|
{
|
|
my $appid = $self->{action}->{id};
|
|
my $appdesc = $self->{action}->{desc};
|
|
|
|
my $found = 0;
|
|
while (my ($catid, $applist) = each %{$self->{conf}->{applicationList}} and $found != 1)
|
|
{
|
|
while (my ($_appid, $app) = each %{$applist} and $found != 1)
|
|
{
|
|
if ($appid eq $_appid)
|
|
{
|
|
$app->{options}->{description} = $appdesc;
|
|
$found = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($found == 0)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{CONFIG_WRITE_ERROR}.": Application '$appid' not found");
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
when ("apps-set-logo")
|
|
{
|
|
my $appid = $self->{action}->{id};
|
|
my $applogo = $self->{action}->{logo};
|
|
|
|
my $found = 0;
|
|
while (my ($catid, $applist) = each %{$self->{conf}->{applicationList}} and $found != 1)
|
|
{
|
|
while (my ($_appid, $app) = each %{$applist} and $found != 1)
|
|
{
|
|
if ($appid eq $_appid)
|
|
{
|
|
$app->{options}->{logo} = $applogo;
|
|
$found = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($found == 0)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{CONFIG_WRITE_ERROR}.": Application '$appid' not found");
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
when ("apps-set-display")
|
|
{
|
|
my $appid = $self->{action}->{id};
|
|
my $appdpy = $self->{action}->{dpy};
|
|
|
|
my $found = 0;
|
|
while (my ($catid, $applist) = each %{$self->{conf}->{applicationList}} and $found != 1)
|
|
{
|
|
while (my ($_appid, $app) = each %{$applist} and $found != 1)
|
|
{
|
|
if ($appid eq $_appid)
|
|
{
|
|
$app->{options}->{display} = $appdpy;
|
|
$found = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($found == 0)
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{CONFIG_WRITE_ERROR}.": Application '$appid' not found");
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
when ("apps-get")
|
|
{
|
|
my $appid = $self->{action}->{id};
|
|
|
|
my $found = 0;
|
|
while (my ($catid, $applist) = each %{$self->{conf}->{applicationList}} and $found != 1)
|
|
{
|
|
while (my ($_appid, $app) = each %{$applist} and $found != 1)
|
|
{
|
|
if ($appid eq $_appid)
|
|
{
|
|
print "Category '$catid': ".$self->{conf}->{applicationList}->{$catid}->{catname}."\n";
|
|
print "Application '$appid': ".$app->{options}->{name}."\n";
|
|
print "- Description: ".$app->{options}->{description}."\n";
|
|
print "- URI: ".$app->{options}->{uri}."\n";
|
|
print "- Logo: ".$app->{options}->{logo}."\n";
|
|
print "- Display: ".$app->{options}->{display}."\n";
|
|
$found = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($found == 0)
|
|
{
|
|
$self->setError ("$_: Application '$appid' not found");
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
when ("apps-rm")
|
|
{
|
|
my $appid = $self->{action}->{id};
|
|
|
|
my $found = 0;
|
|
while (my ($catid, $applist) = each %{$self->{conf}->{applicationList}} and $found != 1)
|
|
{
|
|
while (my ($_appid, $app) = each %{$applist} and $found != 1)
|
|
{
|
|
if ($appid eq $_appid)
|
|
{
|
|
delete $applist->{$appid};
|
|
$found = 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
## Rules
|
|
|
|
when ("rules-set")
|
|
{
|
|
my $uri = $self->{action}->{uri};
|
|
my $expr = $self->{action}->{expr};
|
|
my $rule = $self->{action}->{rule};
|
|
|
|
if (not defined ($self->{conf}->{locationRules}->{$uri}))
|
|
{
|
|
$self->{conf}->{locationRules}->{$uri} = {};
|
|
}
|
|
|
|
$self->{conf}->{locationRules}->{$uri}->{$expr} = $rule;
|
|
}
|
|
|
|
when ("rules-unset")
|
|
{
|
|
my $uri = $self->{action}->{uri};
|
|
my $expr = $self->{action}->{expr};
|
|
|
|
if (not defined ($self->{conf}->{locationRules}->{$uri}))
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{CONFIG_WRITE_ERROR}.": There is no virtual host '$uri'");
|
|
return 0;
|
|
}
|
|
|
|
if (not defined ($self->{conf}->{locationRules}->{$uri}->{$expr}))
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{CONFIG_WRITE_ERROR}.": There is rule '$expr' for virtual host '$uri'");
|
|
return 0;
|
|
}
|
|
|
|
delete $self->{conf}->{locationRules}->{$uri}->{$expr};
|
|
}
|
|
|
|
when ("rules-get")
|
|
{
|
|
my $uri = $self->{action}->{uri};
|
|
|
|
if (not defined ($self->{conf}->{locationRules}->{$uri}))
|
|
{
|
|
$self->setError ("$_: There is no virtual host '$uri'");
|
|
return 0;
|
|
}
|
|
|
|
print "Virtual Host : $uri\n";
|
|
while (my ($expr, $rule) = each %{$self->{conf}->{locationRules}->{$uri}})
|
|
{
|
|
print "- $expr => '$rule'\n";
|
|
}
|
|
}
|
|
|
|
## exported variables
|
|
|
|
when ("export-var")
|
|
{
|
|
my $key = $self->{action}->{key};
|
|
my $val = $self->{action}->{val};
|
|
|
|
$self->{conf}->{exportedVars}->{$key} = $val;
|
|
}
|
|
|
|
when ("unexport-var")
|
|
{
|
|
my $key = $self->{action}->{key};
|
|
|
|
if (not defined ($self->{conf}->{exportedVars}->{$key}))
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{CONFIG_WRITE_ERROR}.": There is no exported variables named '$key'");
|
|
return 0;
|
|
}
|
|
|
|
delete $self->{conf}->{exportedVars}->{$key};
|
|
}
|
|
|
|
when ("get-exported-vars")
|
|
{
|
|
while (my ($key, $val) = each %{$self->{conf}->{exportedVars}})
|
|
{
|
|
print "$key = $val\n";
|
|
}
|
|
}
|
|
|
|
## exported headers
|
|
|
|
when ("export-header")
|
|
{
|
|
my $vhost = $self->{action}->{vhost};
|
|
my $header = $self->{action}->{header};
|
|
my $expr = $self->{action}->{expr};
|
|
|
|
if (not defined ($self->{conf}->{exportedHeaders}->{$vhost}))
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{CONFIG_WRITE_ERROR}.": There is no virtual host '$vhost'\n");
|
|
return 0;
|
|
}
|
|
|
|
$self->{conf}->{exportedHeaders}->{$vhost}->{$header} = $expr;
|
|
}
|
|
|
|
when ("unexport-header")
|
|
{
|
|
my $vhost = $self->{action}->{vhost};
|
|
my $header = $self->{action}->{header};
|
|
my $expr = $self->{action}->{expr};
|
|
|
|
if (not defined ($self->{conf}->{exportedHeaders}->{$vhost}))
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{CONFIG_WRITE_ERROR}.": There is no virtual host '$vhost'\n");
|
|
return 0;
|
|
}
|
|
|
|
if (not defined ($self->{conf}->{exportedHeaders}->{$vhost}->{$header}))
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{CONFIG_WRITE_ERROR}.": There is no header named '$header' exported for virtual host '$vhost'\n");
|
|
return 0;
|
|
}
|
|
|
|
delete $self->{conf}->{exportedHeaders}->{$vhost}->{$header};
|
|
}
|
|
|
|
when ("get-exported-headers")
|
|
{
|
|
my $vhost = $self->{action}->{vhost};
|
|
|
|
if (not defined ($self->{conf}->{exportedHeaders}->{$vhost}))
|
|
{
|
|
$self->setError ("$_: There is no virtual host '$vhost'\n");
|
|
return 0;
|
|
}
|
|
|
|
while (my ($header, $expr) = each %{$self->{conf}->{exportedHeaders}->{$vhost}})
|
|
{
|
|
print "$header: '$expr'\n";
|
|
}
|
|
}
|
|
|
|
## virtual hosts
|
|
|
|
when ("vhost-add")
|
|
{
|
|
my $vhost = $self->{action}->{vhost};
|
|
|
|
if (defined ($self->{conf}->{vhostOptions}->{$vhost}) or defined ($self->{conf}->{locationRules}->{$vhost}) or defined ($self->{conf}->{exportedHeaders}->{$vhost}))
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{CONFIG_WRITE_ERROR}.": Virtual host '$vhost' already exist");
|
|
return 0;
|
|
}
|
|
|
|
$self->{conf}->{vhostOptions}->{$vhost} =
|
|
{
|
|
vhostMaintenance => '0',
|
|
vhostPort => '-1',
|
|
vhostHttps => '-1'
|
|
};
|
|
$self->{conf}->{locationRules}->{$vhost} =
|
|
{
|
|
default => "deny"
|
|
};
|
|
$self->{conf}->{exportedHeaders}->{$vhost} =
|
|
{
|
|
"Auth-User" => "\$uid"
|
|
};
|
|
}
|
|
|
|
when ("vhost-del")
|
|
{
|
|
my $vhost = $self->{action}->{vhost};
|
|
my $error = "No virtual host in: ";
|
|
my $nerror = 0;
|
|
|
|
if (not defined ($self->{conf}->{vhostOptions}->{$vhost}))
|
|
{
|
|
$nerror++;
|
|
$error .= "vhostOptions ";
|
|
}
|
|
else
|
|
{
|
|
delete $self->{conf}->{vhostOptions}->{$vhost};
|
|
}
|
|
|
|
if (not defined ($self->{conf}->{locationRules}->{$vhost}))
|
|
{
|
|
$nerror++;
|
|
$error .= "locationRules ";
|
|
}
|
|
else
|
|
{
|
|
delete $self->{conf}->{locationRules}->{$vhost};
|
|
}
|
|
|
|
if (not defined ($self->{conf}->{exportedHeaders}->{$vhost}))
|
|
{
|
|
$nerror++;
|
|
$error .= "exportedHeaders";
|
|
}
|
|
else
|
|
{
|
|
delete $self->{conf}->{exportedHeaders}->{$vhost};
|
|
}
|
|
|
|
if ($nerror == 3)
|
|
{
|
|
$error .= ". abortting...";
|
|
$self->setError ("$_: ".$ERRORS->{CONFIG_WRITE_ERROR}.": $error");
|
|
return 0;
|
|
}
|
|
elsif ($nerror != 0)
|
|
{
|
|
$error .= ". ignoring...";
|
|
$self->setError ("$_: ".$ERRORS->{CONFIG_WRITE_ERROR}.": $error");
|
|
}
|
|
}
|
|
|
|
when ("vhost-set-port")
|
|
{
|
|
my $vhost = $self->{action}->{vhost};
|
|
my $port = $self->{action}->{port};
|
|
|
|
if (not defined ($self->{conf}->{vhostOptions}->{$vhost}))
|
|
{
|
|
if (not defined ($self->{conf}->{locationRules}->{$vhost}) and not defined ($self->{conf}->{exportedHeaders}->{$vhost}))
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{CONFIG_WRITE_ERROR}.": There is no virtual host '$vhost'");
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
$self->{conf}->{vhostOptions}->{$vhost} =
|
|
{
|
|
vhostPort => $port,
|
|
vhostHttps => '-1',
|
|
vhostMaintenance => '0'
|
|
};
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$self->{conf}->{vhostOptions}->{$vhost}->{vhostPort} = $port;
|
|
}
|
|
}
|
|
|
|
when ("vhost-set-https")
|
|
{
|
|
my $vhost = $self->{action}->{vhost};
|
|
my $https = $self->{action}->{https};
|
|
|
|
if (not defined ($self->{conf}->{vhostOptions}->{$vhost}))
|
|
{
|
|
if (not defined ($self->{conf}->{locationRules}->{$vhost}) and not defined ($self->{conf}->{exportedHeaders}->{$vhost}))
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{CONFIG_WRITE_ERROR}.": There is no virtual host '$vhost'");
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
$self->{conf}->{vhostOptions}->{$vhost} =
|
|
{
|
|
vhostPort => '-1',
|
|
vhostHttps => $https,
|
|
vhostMaintenance => '0'
|
|
};
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$self->{conf}->{vhostOptions}->{$vhost}->{vhostHttps} = $https;
|
|
}
|
|
}
|
|
|
|
when ("vhost-set-maintenance")
|
|
{
|
|
my $vhost = $self->{action}->{vhost};
|
|
my $off = $self->{action}->{off};
|
|
|
|
if (not defined ($self->{conf}->{vhostOptions}->{$vhost}))
|
|
{
|
|
if (not defined ($self->{conf}->{locationRules}->{$vhost}) and not defined ($self->{conf}->{exportedHeaders}->{$vhost}))
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{CONFIG_WRITE_ERROR}.": There is no virtual host '$vhost'");
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
$self->{conf}->{vhostOptions}->{$vhost} =
|
|
{
|
|
vhostPort => '-1',
|
|
vhostHttps => '-1',
|
|
vhostMaintenance => $off
|
|
};
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$self->{conf}->{vhostOptions}->{$vhost}->{vhostMaintenance} = $off;
|
|
}
|
|
}
|
|
|
|
when ("vhost-list")
|
|
{
|
|
while (my ($vhost, $vhostoptions) = each %{$self->{conf}->{vhostOptions}})
|
|
{
|
|
print "- $vhost => ";
|
|
print "Maintenance: $vhostoptions->{vhostMaintenance} | ";
|
|
print "Port: $vhostoptions->{vhostPort} | ";
|
|
print "HTTPS: $vhostoptions->{vhostHttps}\n";
|
|
}
|
|
}
|
|
|
|
## global storage
|
|
|
|
when ("global-storage")
|
|
{
|
|
print "Global Storage options :\n";
|
|
print "- Directory: $self->{conf}->{globalStorageOptions}->{Directory}\n";
|
|
print "- Lock Directory: $self->{conf}->{globalStorageOptions}->{LockDirectory}\n";
|
|
}
|
|
|
|
when ("global-storage-set-dir")
|
|
{
|
|
my $path = $self->{action}->{path};
|
|
|
|
$self->{conf}->{globalStorageOptions}->{Directory} = $path;
|
|
}
|
|
|
|
when ("global-storage-set-lockdir")
|
|
{
|
|
my $path = $self->{action}->{path};
|
|
|
|
$self->{conf}->{globalStorageOptions}->{LockDirectory} = $path;
|
|
}
|
|
|
|
when ("reload-urls")
|
|
{
|
|
while (my ($vhost, $url) = each %{$self->{conf}->{reloadUrls}})
|
|
{
|
|
print "- $vhost => $url\n";
|
|
}
|
|
}
|
|
|
|
when ("reload-url-add")
|
|
{
|
|
my $vhost = $self->{action}->{vhost};
|
|
my $url = $self->{action}->{url};
|
|
|
|
$self->{conf}->{reloadUrls}->{$vhost} = $url;
|
|
}
|
|
|
|
when ("reload-url-del")
|
|
{
|
|
my $vhost = $self->{action}->{vhost};
|
|
|
|
if (not defined ($self->{conf}->{reloadUrls}->{$vhost}))
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{CONFIG_WRITE_ERROR}.": There is no reload URLs setted for '$vhost'");
|
|
return 1;
|
|
}
|
|
|
|
delete $self->{conf}->{reloadUrls}->{$vhost};
|
|
}
|
|
|
|
# no implementation found
|
|
default
|
|
{
|
|
$self->setError ("$_: ".$ERRORS->{NOT_IMPLEMENTED});
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
## @method void setError (string str)
|
|
# Set error message
|
|
#
|
|
# @param str Text of the error
|
|
sub setError
|
|
{
|
|
my ($self, $msg) = @_;
|
|
|
|
$self->{errormsg} = $msg;
|
|
}
|
|
|
|
## @method string getError ()
|
|
# Get error message
|
|
#
|
|
# @return Text of the error
|
|
sub getError
|
|
{
|
|
my ($self) = @_;
|
|
|
|
my $msg = $self->{errormsg};
|
|
|
|
return $msg;
|
|
}
|
|
|
|
1;
|
|
__END__
|
|
|
|
=head1 NAME
|
|
|
|
=encoding utf8
|
|
|
|
Lemonldap::NG::Manager::Cli - Command Line Interface to edit LemonLDAP::NG configuration.
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
use Lemonldap::NG::Manager::Cli;
|
|
|
|
my $app = Lemonldap::NG::Manager::Cli->new ();
|
|
my $ret = $app->run (\@ARGV);
|
|
exit ($ret);
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
Lemonldap::NG::Manager::Cli allow user to edit the configuration of Lemonldap::NG via the
|
|
command line.
|
|
|
|
=head1 SEE ALSO
|
|
|
|
L<Lemonldap::NG>, L<Lemonldap::NG::Common::Conf>
|
|
|
|
=head1 AUTHOR
|
|
|
|
David Delassus E<lt>david.jose.delassus@gmail.comE<gt>
|
|
|
|
=head1 COPYRIGHT AND LICENSE
|
|
|
|
Copyright (C) 2012, by David Delassus
|
|
Copyright (C) 2013, by Clement Oudot
|
|
|
|
This library is free software; you can redistribute it and/or modify
|
|
it under the same terms as Perl itself, either Perl version 5.10.0 or,
|
|
at your option, any later version of Perl 5 you may have available.
|
|
|
|
=cut
|