our
$VERSION
=
'1.16.0'
;
use
if
$OSNAME
eq
'MSWin32'
,
'Win32::Console::ANSI'
;
our
$no_color
= 0;
my
$has_syslog
= 0;
my
$log_fh
;
our
$debug
= 0;
our
$silent
= 0;
our
$format
=
"[%D] %l - %s"
;
my
$log_opened
= 0;
sub
init {
return
if
$silent
;
eval
{
die
if
( Rex::Config->get_log_filename || !Rex::Config->get_log_facility );
die
if
(
$OSNAME
=~ m/^MSWin/ );
Sys::Syslog->
use
;
openlog(
"rex"
,
"ndelay,pid"
, Rex::Config->get_log_facility );
$has_syslog
= 1;
};
$log_opened
= 1;
}
sub
info {
my
(
$msg
,
$type
) =
@_
;
my
$color
=
'green'
;
if
(
defined
(
$type
) ) {
CHECK_COLOR: {
$type
eq
'warn'
&&
do
{
$color
=
'yellow'
;
last
CHECK_COLOR; };
$type
eq
'error'
&&
do
{
$color
=
'red'
;
last
CHECK_COLOR; };
}
}
return
if
$silent
;
if
(
defined
(
$type
) ) {
$msg
= format_string(
$msg
,
uc
(
$type
) );
}
else
{
$msg
= format_string(
$msg
,
"INFO"
);
}
unless
(
$log_opened
) {
init();
$log_opened
= 2;
}
if
(
$has_syslog
) {
syslog(
"info"
,
$msg
);
}
if
( Rex::Config->get_log_filename() ) {
open
(
$log_fh
,
">>"
, Rex::Config->get_log_filename() ) or
die
(
$OS_ERROR
);
flock
(
$log_fh
, 2 );
print
{
$log_fh
}
"$msg\n"
if
(
$log_fh
);
close
(
$log_fh
);
}
if
(
$no_color
) {
print
STDERR
"$msg\n"
if
(
(
(
defined
$::QUIET && $::QUIET == 2 )
&& (
defined
$type
&&
$type
ne
'info'
)
)
|| !
defined
$::QUIET
);
}
else
{
print
STDERR colored( [
$color
],
"$msg\n"
)
if
(
(
(
defined
$::QUIET && $::QUIET == 2 )
&& (
defined
$type
&&
$type
ne
'info'
)
)
|| !
defined
$::QUIET
);
}
if
(
$log_opened
== 2 ) {
&shutdown
();
}
}
sub
debug {
my
(
$msg
) =
@_
;
return
if
$silent
;
return
unless
$debug
;
$msg
= format_string(
$msg
,
"DEBUG"
);
unless
(
$log_opened
) {
init();
$log_opened
= 2;
}
if
(
$has_syslog
) {
syslog(
"debug"
,
$msg
);
}
if
( Rex::Config->get_log_filename() ) {
open
(
$log_fh
,
">>"
, Rex::Config->get_log_filename() ) or
die
(
$OS_ERROR
);
flock
(
$log_fh
, 2 );
print
{
$log_fh
}
"$msg\n"
if
(
$log_fh
);
close
(
$log_fh
);
}
if
(
$no_color
) {
print
STDERR
"$msg\n"
unless
($::QUIET);
}
else
{
print
STDERR colored( [
'red'
],
"$msg\n"
)
unless
($::QUIET);
}
if
(
$log_opened
== 2 ) {
&shutdown
();
}
}
sub
get_timestamp {
my
(
$sec
,
$min
,
$hour
,
$mday
,
$mon
,
$year
,
$wday
,
$yday
,
$isdst
) =
localtime
(
time
);
$mon
++;
$year
+= 1900;
return
"$year-"
.
sprintf
(
"%02i"
,
$mon
) .
"-"
.
sprintf
(
"%02i"
,
$mday
) .
" "
.
sprintf
(
"%02i"
,
$hour
) .
":"
.
sprintf
(
"%02i"
,
$min
) .
":"
.
sprintf
(
"%02i"
,
$sec
);
}
sub
shutdown
{
return
if
$silent
;
return
unless
$log_opened
;
if
(
$has_syslog
) {
closelog();
}
else
{
close
(
$log_fh
)
if
$log_fh
;
}
$log_opened
= 0;
}
sub
format_string {
my
(
$s
,
$level
) =
@_
;
my
$date
= get_timestamp;
my
$host
=
Rex::get_current_connection()
&& Rex::get_current_connection()->{conn}->server
? Rex::get_current_connection()->{conn}->server
:
"<local>"
;
my
$line
=
$format
;
$line
=~ s/\
%D
/
$date
/gms;
$line
=~ s/\
%h
/
$host
/gms;
$line
=~ s/\
%s
/
$s
/gms;
$line
=~ s/\
%l
/
$level
/gms;
$line
=~ s/\
%p
/
$PID
/gms;
return
$line
;
}
sub
masq {
my
(
$format
,
@params
) =
@_
;
return
$format
if
scalar
@params
== 0;
return
$format
if
scalar
(
grep
{
defined
}
@params
) == 0;
if
(
exists
$ENV
{REX_DEBUG_INSECURE} &&
$ENV
{REX_DEBUG_INSECURE} eq
"1"
) {
return
sprintf
(
$format
,
@params
);
}
return
sprintf
(
$format
, (
"**********"
) x
@params
);
}
1;