#!/usr/bin/env perl
$Log::Log4perl::JOIN_MSG_ARRAY_CHAR
=
''
;
if
(AnyEvent->VERSION < 6.01) {
foreach
(
qw(EV Event Glib EventLib POE)
) {
eval
"use $_ ();"
;
unless
($@) {
last
;
}
}
AnyEvent::detect;
}
my
$help
= 0;
my
$conf
;
my
$host
;
my
$port
;
my
$log4perl
;
my
@options
;
Getopt::Long::GetOptions(
'help|?'
=> \
$help
,
'conf:s'
=> \
$conf
,
'host:s'
=> \
$host
,
'port:i'
=> \
$port
,
'log4perl:s'
=> \
$log4perl
,
'option:s'
=> \
@options
) or Pod::Usage::pod2usage(2);
Pod::Usage::pod2usage(1)
if
$help
;
if
(
defined
$log4perl
and -f
$log4perl
) {
Log::Log4perl->init(
$log4perl
);
}
else
{
Log::Log4perl->init( \
q(
log4perl.logger = DEBUG, Screen, LimCLI
log4perl.appender.Screen = Log::Log4perl::Appender::Screen
log4perl.appender.Screen.stderr = 1
log4perl.appender.Screen.layout = Log::Log4perl::Layout::PatternLayout
log4perl.appender.Screen.layout.ConversionPattern = %d %F [%L] %p: %m%n
log4perl.appender.LimCLI = Log::Log4perl::Appender::Lim::CLI
log4perl.appender.LimCLI.stderr = 1
log4perl.appender.LimCLI.layout = Log::Log4perl::Layout::PatternLayout
log4perl.appender.LimCLI.layout.ConversionPattern = %d %F [%L] %p: %m%n
)
);
}
Lim::LoadConfig(
'/etc/lim/cli.yaml'
);
Lim::LoadConfigDirectory(
'/etc/lim/cli.d'
);
if
(
defined
$conf
) {
unless
(-r
$conf
and Lim::LoadConfig(
$conf
)) {
print
STDERR
'Unable to read configuration file: '
,
$conf
,
"\n"
;
exit
(1);
}
Lim::Config->{cli}->{config_file} =
$conf
;
}
else
{
Lim::LoadConfig(Lim::Config->{cli}->{config_file});
}
Lim::ParseOptions(
@options
);
Lim::UpdateConfig;
if
(
defined
$host
) {
Lim::Config->{host} =
$host
;
}
else
{
Lim::Config->{host} = Lim::Config->{cli}->{host};
}
if
(
defined
$port
) {
Lim::Config->{port} =
$port
;
}
else
{
Lim::Config->{port} = Lim::Config->{cli}->{port};
}
my
$cv
= AnyEvent->condvar;
my
@watchers
;
my
$cli
;
push
(
@watchers
,
AnyEvent->signal(
signal
=>
"HUP"
,
cb
=>
sub
{
}),
AnyEvent->signal(
signal
=>
"PIPE"
,
cb
=>
sub
{
}),
AnyEvent->signal(
signal
=>
"INT"
,
cb
=>
sub
{
if
(
defined
$cli
) {
$cli
->clear_line;
}
else
{
$cv
->
send
;
}
}),
AnyEvent->signal(
signal
=>
"QUIT"
,
cb
=>
sub
{
$cv
->
send
;
}),
AnyEvent->signal(
signal
=>
"TERM"
,
cb
=>
sub
{
$cv
->
send
;
}),
);
$cli
= Lim::CLI->new(
on_quit
=>
sub
{
$cv
->
send
;
});
if
(
defined
$cli
) {
push
(
@watchers
,
$cli
);
$cv
->
recv
;
}
@watchers
= ();