App-Munner
view release on metacpan or search on metacpan
foreach my $pair (@$list) {
next
if !$pair;
next
if ref $pair ne "HASH";
my ( $key, $val ) = %$pair;
if ( $export ) {
$env .= "export ";
}
$env .= join "=", quotemeta($key), $val;
if ( $export ) {
$env .= ";\n";
}
else {
$env .= " \\\n";
}
}
return $env;
}
sub _env_hash {
my $list = shift
or return q{};
return config_help("env need to be in list")
if ref $list ne "ARRAY";
my %env = ();
foreach my $pair (@$list) {
next
if !$pair;
next
if ref $pair ne "HASH";
my ( $key, $val ) = %$pair;
$env{$key} = $val;
}
return \%env;
}
sub _make_run_script {
my $app_name = shift;
my $command = shift
or die "$app_name is MISSING RUN COMMAND.";
my $filename = shift;
my $fh = shift;
print $fh "#!/bin/sh\n";
print $fh $command;
close $fh;
chmod 0700, $filename;
}
sub killer {
foreach my $app_name (@apps) {
my $app_config = $apps{$app_name};
my $pid = delete $app_config->{pid}
or next;
kill sig_num("INT"), $pid;
}
exit;
}
sub group_of_apps {
my $wanted_groups = shift
or return ();
return ()
if ref $wanted_groups ne "ARRAY"
or !@$wanted_groups;
my $groups = $config->{groups}
or config_help("No group is define in your config");
config_help("Group config is missing or invalid")
if ref $groups ne "HASH"
or !%$groups;
foreach my $group_name (@$wanted_groups) {
my $group_config = $groups->{$group_name}
or config_help("Group name $group_name is not defined in the config");
my $apps = $group_config->{apps} || [];
config_help("groups.$group_name.apps need to be an array")
if ref $apps ne "ARRAY";
push @apps, @$apps;
my $grps = $group_config->{groups} || [];
config_help("groups.$group_name.groups need to be an array")
if ref $grps ne "ARRAY";
if (@$grps) {
push @apps, group_of_apps($grps);
}
}
return uniq @apps;
}
sub config_help {
my $message = shift || q{};
print <<"HELP";
$message
munner.yml config template:
---------------------------
base_dir: "... base directory to find the app ..."
apps:
( run in 0.797 second using v1.01-cache-2.11-cpan-5837b0d9d2c )