our
@EXPORT
= ();
our
@EXPORT_OK
=
qw/
sort_port sort_modules
interval_to_daterange
sql_match
request_is_api
request_is_api_report
request_is_api_search
/
;
our
%EXPORT_TAGS
= (
all
=> \
@EXPORT_OK
);
sub
request_is_api {
return
((request->
accept
and request->
accept
=~ m/(?:json|javascript)/) and (
index
(request->path, uri_for(
'/api/'
)->path) == 0
or
(param(
'return_url'
)
and
index
(param(
'return_url'
), uri_for(
'/api/'
)->path) == 0)
));
}
sub
request_is_api_report {
return
(request_is_api and (
index
(request->path, uri_for(
'/api/v1/report/'
)->path) == 0
or
(param(
'return_url'
)
and
index
(param(
'return_url'
), uri_for(
'/api/v1/report/'
)->path) == 0)
));
}
sub
request_is_api_search {
return
(request_is_api and (
index
(request->path, uri_for(
'/api/v1/search/'
)->path) == 0
or
(param(
'return_url'
)
and
index
(param(
'return_url'
), uri_for(
'/api/v1/search/'
)->path) == 0)
));
}
sub
sql_match {
my
(
$text
,
$exact
) =
@_
;
return
unless
$text
;
$text
=~ s/^\s+//;
$text
=~ s/\s+$//;
$text
=~ s/[*]+/%/g;
$text
=~ s/[?]/_/g;
$text
=
'%'
.
$text
.
'%'
unless
$exact
;
$text
=~ s/\%+/%/g;
return
(
wantarray
? (
$text
, {
-ilike
=>
$text
}) :
$text
);
}
sub
sort_port {
my
(
$aval
,
$bval
) =
@_
;
$aval
= $1
if
$aval
=~
qr/^10(GigabitEthernet.+)$/
;
$bval
= $1
if
$bval
=~
qr/^10(GigabitEthernet.+)$/
;
my
$numbers
=
qr{^(\d+)$}
;
my
$numeric
=
qr{^([\d\.]+)$}
;
my
$dotted_numeric
=
qr{^(\d+)[:.](\d+)$}
;
my
$letter_number
=
qr{^([a-zA-Z]+)(\d+)$}
;
my
$wordcharword
=
qr{^([^:\/.]+)[-\ :\/\.]+([^:\/.0-9]+)(\d+)?$}
;
my
$netgear
=
qr{^Slot: (\d+) Port: (\d+) }
;
my
$ciscofast
=
qr{^
# Word Number slash (Gigabit0/)
(\D+)(\d+)[\/:]
# Groups of symbol float (/5.5/5.5/5.5), separated by slash or colon
([\/:\.\d]+)
# Optional dash (-Bearer Channel)
(-.*)?
$}
x;
my
@a
= ();
my
@b
= ();
if
(
$aval
=~
$dotted_numeric
) {
@a
= ($1,$2);
}
elsif
(
$aval
=~
$letter_number
) {
@a
= ($1,$2);
}
elsif
(
$aval
=~
$netgear
) {
@a
= ($1,$2);
}
elsif
(
$aval
=~
$numbers
) {
@a
= ($1);
}
elsif
(
$aval
=~
$ciscofast
) {
@a
= ($1,$2);
push
@a
,
split
(/[:\/]/,$3), $4;
}
elsif
(
$aval
=~
$wordcharword
) {
@a
= ($1,$2,$3);
}
else
{
@a
= (
$aval
);
}
if
(
$bval
=~
$dotted_numeric
) {
@b
= ($1,$2);
}
elsif
(
$bval
=~
$letter_number
) {
@b
= ($1,$2);
}
elsif
(
$bval
=~
$netgear
) {
@b
= ($1,$2);
}
elsif
(
$bval
=~
$numbers
) {
@b
= ($1);
}
elsif
(
$bval
=~
$ciscofast
) {
@b
= ($1,$2);
push
@b
,
split
(/[:\/]/,$3),$4;
}
elsif
(
$bval
=~
$wordcharword
) {
@b
= ($1,$2,$3);
}
else
{
@b
= (
$bval
);
}
my
$val
= 0;
while
(
scalar
(
@a
) or
scalar
(
@b
)){
last
if
$val
!= 0;
my
$a1
=
shift
@a
;
my
$b1
=
shift
@b
;
unless
(
defined
$b1
){
$val
= 1;
last
;
}
unless
(
defined
$a1
) {
$val
= -1;
last
;
}
if
(
$a1
=~
$numeric
and
$b1
=~
$numeric
){
$val
=
$a1
<=>
$b1
;
}
elsif
(
$a1
ne
$b1
) {
$val
=
$a1
cmp
$b1
;
}
}
return
$val
;
}
sub
sort_modules {
my
$input
=
shift
;
my
%modules
;
foreach
my
$module
(
@$input
) {
$modules
{
$module
->
index
}{module} =
$module
;
if
(
$module
->parent) {
{
no
warnings
'uninitialized'
;
push
(@{
$modules
{
$module
->parent}{children}{
$module
->class}},
$module
->
index
);
}
}
else
{
push
(@{
$modules
{root}},
$module
->
index
);
}
}
return
\
%modules
;
}
sub
interval_to_daterange {
my
$interval
=
shift
;
unless
(
$interval
and
$interval
=~ m/^(?:\d+)\s+(?:day|week|month|year)s?$/) {
return
"1970-01-01 to "
. Time::Piece->new->ymd;
}
my
%const
= (
day
=> ONE_DAY,
week
=> ONE_WEEK,
month
=> ONE_MONTH,
year
=> ONE_YEAR
);
my
(
$amt
,
$factor
)
=
$interval
=~ /^(\d+)\s+(day|week|month|year)s?$/gmx;
$amt
--
if
$factor
eq
'day'
;
my
$start
= Time::Piece->new -
$const
{
$factor
} *
$amt
;
return
$start
->ymd .
" to "
. Time::Piece->new->ymd;
}
1;