#!/usr/bin/env perl
BEGIN {
push
(
@INC
,
'lib'
);
};
Readonly
my
$GEN_API_DIR
=> dirname(abs_path($0));
Readonly
my
$SCRIPT_NAME
=> basename($0);
Readonly
my
$MODULE_NAME
=>
'API'
;
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};
$f
->get_api_version() ||
die
(
"Failed to get api_version "
.Dumper(
$f
));
my
$version
=
$f
->{result};
$f
->set_api_version(
$version
);
$f
->get_api_commands() ||
die
(
"Failed to get commands metdata "
.Dumper(
$f
));
return
$version
,
$f
->{result};
}
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
) =
@_
;
my
$fn
=
"$GEN_API_DIR/../lib/Net/FreeIPA/$MODULE_NAME.pm"
;
open
FH,
"> $fn"
;
print
FH
$text
;
close
FH;
print
"Created module $fn\n"
}
sub
main
{
my
(
$version
,
$commands
) = get_api(
$ENV
{GEN_API_HOSTNAME});
my
$tt
= Template->new({
INCLUDE_PATH
=>
$GEN_API_DIR
,
INTERPOLATE
=> 1,
}) ||
die
"$Template::ERROR\n"
;
my
$vars
= {
prefix
=>
'api_'
,
version
=>
$version
,
commands
=>
$commands
,
module_name
=>
$MODULE_NAME
,
script_name
=>
$SCRIPT_NAME
,
join_name
=>
sub
{
my
$args
=
shift
;
return
join
(
' '
,
map
{
$_
->{name}}
@$args
); },
join_name_vars
=>
sub
{
my
$args
=
shift
;
return
join
(
', '
,
map
{
'$'
.
$_
->{name}}
@$args
)},
join_type
=>
sub
{
my
$args
=
shift
;
return
join
(
' '
,
map
{
$_
->{type}}
@$args
) },
ref
=>
sub
{
return
ref
(
shift
) },
check_hash
=>
sub
{
my
$array
=
shift
;
my
@newarray
;
foreach
my
$el
(
@$array
) {
if
(
ref
(
$el
) eq
''
) {
my
$oldel
=
$el
;
$oldel
=~ s/[*+?]$//;
$el
= {
name
=>
$oldel
,
type
=>
'unknown'
,
class
=>
'unknown'
,
doc
=>
'unknown'
,
};
}
push
(
@newarray
,
$el
);
};
return
\
@newarray
;
}
};
my
$text
=
''
;
$tt
->process(
'api.tt'
,
$vars
, \
$text
)
||
die
$tt
->error(),
"\n"
;
make_module(
$text
);
}
main();