#!/usr/bin/env perl
BEGIN {
unshift
(
@INC
,
'lib'
);
};
Readonly
my
$GEN_API_DIR
=> dirname(abs_path($0));
Readonly
my
$SCRIPT_NAME
=> basename($0);
Readonly
my
$MODULE_NAME
=>
'Data'
;
sub
get_api
{
my
(
$hostname
,
%opts
) =
@_
;
$opts
{
log
} = mklogger();
my
$f
= Net::FreeIPA->new(
$hostname
,
%opts
);
die
(
"Failed to initialise the rest client"
)
if
!
$f
->{rc};
delete
$f
->{api_version};
my
$version
=
$f
->get_api_version() ||
die
(
"Failed to get api_version "
.Dumper(
$f
));
$f
->set_api_version(
$version
);
my
$commands
=
$f
->get_api_commands() ||
die
(
"Failed to get commands metdata "
.Dumper(
$f
));
return
$version
,
$commands
;
}
sub
mklogger
{
my
$logger
= get_logger(
"Net::FreeIPA"
);
if
(
$ENV
{GEN_API_DEBUG}) {
$logger
->level(
$DEBUG
);
}
else
{
$logger
->level(
$INFO
);
};
my
$appender
= Log::Log4perl::Appender->new(
"Log::Log4perl::Appender::Screen"
,
mode
=>
"append"
,
);
my
$layout
=
Log::Log4perl::Layout::PatternLayout->new(
"%d [%p] %F{1}:%L %M - %m%n"
);
$appender
->layout(
$layout
);
$logger
->add_appender(
$appender
);
return
$logger
;
}
my
$f
= Net::FreeIPA->new();
sub
make_module
{
my
(
$text
,
$pod
) =
@_
;
my
$fn
=
"$GEN_API_DIR/../lib/Net/FreeIPA/API/Data."
;
$fn
.=
$pod
?
'pod'
:
'pm'
;
open
FH,
"> $fn"
||
die
(
"Failed to open $fn: $!"
);
print
FH
$text
;
close
FH;
print
"Created $fn\n"
}
sub
main
{
my
(
$version
,
$commands
) = get_api(
$ENV
{GEN_API_HOSTNAME},
debugapi
=> (
$ENV
{GEN_API_DEBUG} ? 1 : 0));
my
$tt
= Template->new({
INCLUDE_PATH
=>
$GEN_API_DIR
,
INTERPOLATE
=> 1,
}) ||
die
"$Template::ERROR\n"
;
my
$vars
= {
prefix
=>
$Net::FreeIPA::API::API_METHOD_PREFIX
,
version
=>
$version
,
commands
=>
$commands
,
module_name
=>
$MODULE_NAME
,
script_name
=>
$SCRIPT_NAME
,
encode_json
=>
sub
{
return
encode_json(Net::FreeIPA::API::Magic::cache(
shift
));},
check_hash
=>
sub
{
my
$array
=
shift
;
my
@newarray
;
foreach
my
$el
(
@$array
) {
if
(
ref
(
$el
) eq
''
) {
my
$oldel
=
$el
;
$oldel
=~ s/[*+?]$//;
$el
= {
%Net::FreeIPA::API::Magic::CACHE_TAKES_DEFAULT
};
$el
->{name} =
$oldel
;
$el
->{doc} =
'unknown'
;
};
push
(
@newarray
,
$el
);
};
return
\
@newarray
;
}
};
Net::FreeIPA::API::Magic::flush_cache();
my
$pod
=
''
;
$tt
->process(
'pod.tt'
,
$vars
, \
$pod
)
||
die
"POD error "
,
$tt
->error(),
"\n"
;
make_module(
$pod
, 1);
my
$api
=
''
;
$tt
->process(
'data.tt'
,
$vars
, \
$api
)
||
die
"API error "
,
$tt
->error(),
"\n"
;
make_module(
$api
);
}
main();