Work on launchd support

This commit is contained in:
Jamie Cameron
2015-04-25 22:00:07 -07:00
parent d47ee41c32
commit 4b2ba48e58
3 changed files with 97 additions and 3 deletions

View File

@@ -379,6 +379,41 @@ elsif ($init_mode eq "systemd" && $access{'bootup'}) {
]);
}
elsif ($init_mode eq "launchd" && $access{'bootup'}) {
# Show launchd agents
print &ui_form_start("mass_launchd.cgi", "post");
@links = ( &select_all_link("d"),
&select_invert_link("d"),
&ui_link("edit_launchd.cgi?new=1", $text{'index_ladd'}) );
print &ui_links_row(\@links);
print &ui_columns_start([ "", $text{'index_lname'},
$text{'index_uboot'},
$text{'index_ustatus'}, ]);
foreach $u (&list_launchd_agents()) {
$l = "edit_launchd.cgi?name=".&urlize($u->{'name'});
print &ui_columns_row([
&ui_checkbox("d", $u->{'name'}, undef),
&ui_link($l, $u->{'name'}),
$u->{'boot'} == 1 ? $text{'yes'} :
"<font color=#ff0000>$text{'no'}</font>",
$u->{'status'} ? $text{'yes'} :
"<font color=#ff0000>$text{'no'}</font>",
]);
}
print &ui_columns_end();
print &ui_links_row(\@links);
print &ui_form_end([ [ "start", $text{'index_start'} ],
[ "stop", $text{'index_stop'} ],
[ "restart", $text{'index_restart'} ],
undef,
[ "addboot", $text{'index_addboot'} ],
[ "delboot", $text{'index_delboot'} ],
undef,
[ "addboot_start", $text{'index_addboot_start'} ],
[ "delboot_stop", $text{'index_delboot_stop'} ],
]);
}
# reboot/shutdown buttons
print &ui_hr();

View File

@@ -28,7 +28,9 @@ use WebminCore;
This variable is set based on the bootup system in use. Possible values are :
=item osx - MacOSX hostconfig files
=item osx - MacOSX hostconfig files, for older versions
=item launchd - MacOS Launchd, for newer versions
=item rc - FreeBSD 6+ RC files
@@ -38,14 +40,17 @@ This variable is set based on the bootup system in use. Possible values are :
=item win32 - Windows services
=item upstart - Upstart, seend on Ubuntu 11
=item upstart - Upstart, seen on Ubuntu 11
=item systemd - SystemD, as seen on Fedora 16
=item systemd - SystemD, seen on Fedora 16
=cut
if ($config{'init_mode'}) {
$init_mode = $config{'init_mode'};
}
elsif (&has_command("launchd")) {
$init_mode = "launchd";
}
elsif ($config{'hostconfig'}) {
$init_mode = "osx";
}
@@ -2235,4 +2240,55 @@ elsif ($out =~ /stopped/i) {
return -1;
}
# list_launchd_agents()
# Returns an array of hash refs, each of which is a launchd daemon/agent
sub list_launchd_agents
{
my @rv;
# Get the initial list of actions
my $out = &backquote_command("launchctl list");
&error("Failed to list launchd agents : $out") if ($?);
foreach my $l (split(/\r?\n/, $out)) {
next if ($l =~ /^PID/); # Header line
my ($pid, $status, $label) = split(/\s+/, $l);
next if ($label =~ /^0x/); # Not really a launchd job
push(@rv, { 'name' => $label,
'status' => $pid eq "-" ? 0 : 1,
'pid' => $pid eq "-" ? undef : $pid, });
}
# Get details on each one
foreach my $a (@rv) {
my $out = &backquote_command("launchctl list ".quotemeta($a->{'name'}));
my %attrs;
foreach my $l (split(/\r?\n/, $out)) {
if ($l =~ /"(\S+)"\s*=\s*"([^"]*)";/ ||
$l =~ /"(\S+)"\s*=\s*\S+;/) {
$attrs{lc($1)} = $2;
}
}
$a->{'start'} = $attrs{'program'};
$a->{'file'} = &get_launchd_file($a->{'name'});
# XXX started at boot?
}
return @rv;
}
# get_launchd_file(name)
# Returns the path to the launchd config file for some name
sub get_launchd_file
{
my ($name) = @_;
foreach my $dir ("/Library/LaunchAgents",
"/Library/LaunchDaemons/",
"/System/Library/LaunchAgents",
"/System/Library/LaunchDaemons") {
my $path = $dir."/".$name.".plist";
return $path if (-r $path);
}
return "/Library/LaunchDaemons/".$name.".plist";
}
1;

View File

@@ -50,6 +50,8 @@ index_ustatus=Running now?
index_uadd=Create a new upstart service.
index_sadd=Create a new systemd service.
index_always=Always
index_ladd=Create a new launchd agent.
index_lname=Agent name
edit_title=Edit Action
create_title=Create Action
@@ -187,6 +189,7 @@ mode_win32=Windows services
mode_rc=FreeBSD RC scripts
mode_upstart=Upstart
mode_systemd=Systemd
mode_launchd=LaunchD
upstart_title1=Create Upstart Service
upstart_title2=Edit Upstart Service