File: //scripts/setup_systemd_timer_for_plugins
#!/usr/local/cpanel/3rdparty/bin/perl
# Copyright 2025 WebPros International, LLC
# All rights reserved.
# copyright@cpanel.net http://cpanel.net
# This code is subject to the cPanel license. Unauthorized copying is prohibited.
package scripts::setup_systemd_timer_for_plugins;
use cPstrict;
use Cpanel::SafeRun::Object ();
use Cpanel::Imports ();
use parent qw( Cpanel::HelpfulScript );
use constant SYSTEMCTL_BINARY => '/usr/bin/systemctl';
use constant _OPTIONS => (
'app_name=s',
'method=s',
'verbose!'
);
my $verbose = 0;
=encoding utf-8
=head1 NAME
setup_systemd_timer_for_plugins
=head1 USAGE
setup_systemd_timer_for_plugins [--app_name <app name> --method <method name> | --help]
=head1 DESCRIPTION
This script adds/removes the systemd timer/service for a specific plugin. This
enables and starts, or disables and stops the respective timers and services.
This script requires the C<initialize_${app_name}_plugin.service> and
C<initialize_${app_name}_plugin.timer> files in '/etc/systemd/system'
directory.
Running this setup with out the files will result in failure.
The script excepts either 'add' or 'remove' for --method.
The script shows addition verbose output for --verbose.
=cut
__PACKAGE__->new(@ARGV)->run() if !caller;
=head2 I<OBJ>->run()
Runs this script.
=cut
sub run ($self) {
my $app_name = $self->getopt('app_name');
my $method = $self->getopt('method');
if ( !$app_name || !$method ) {
die $self->full_help();
}
if ( $method !~ /^(add|remove)$/ ) {
say "The method accepts the following argument: 'add' (or) 'remove'";
die $self->full_help();
}
$verbose = $self->getopt('verbose') if defined $self->getopt('verbose');
my $systemd_name = 'initialize_' . $app_name . '_plugin';
say "Running setup_systemd_timer_for_plugins for app: $app_name, method: $method" if $verbose;
$self->$method($systemd_name) if __PACKAGE__->can($method);
_reload_daemon();
return 0;
}
sub add ( $self, $systemd_name ) {
my $systemd_timer = $systemd_name . '.timer';
return _systemd_enable_and_start($systemd_timer);
}
sub remove ( $self, $systemd_name ) {
my $systemd_service = $systemd_name . '.service';
my $systemd_timer = $systemd_name . '.timer';
return _systemd_disable_and_stop($systemd_timer) &&
_systemd_disable($systemd_service);
}
sub _reload_daemon () {
say "Reloading daemon.." if $verbose;
return Cpanel::SafeRun::Object->new_or_die(
'program' => SYSTEMCTL_BINARY,
'args' => ['daemon-reload']
);
}
sub _systemd_enable_and_start ($systemd_name) {
say "Enabling systemd service $systemd_name" if $verbose;
my $result = Cpanel::SafeRun::Object->new(
'program' => SYSTEMCTL_BINARY,
'args' => ['enable', $systemd_name, '--now']
);
if ( $result->exec_failed ) {
say "Failed to enable and start $systemd_name";
say $result->stderr;
return !!0;
}
return !!1;
}
sub _systemd_disable_and_stop ($systemd_name) {
say "Disabling systemd service $systemd_name" if $verbose;
my $result = Cpanel::SafeRun::Object->new(
'program' => SYSTEMCTL_BINARY,
'args' => ['disable', $systemd_name, '--now']
);
if ( $result->exec_failed ) {
say "Failed to disable and stop $systemd_name";
say $result->stderr;
return !!0;
}
return !!1;
}
sub _systemd_disable ($systemd_name) {
say "Disabling systemd service $systemd_name" if $verbose;
my $result = Cpanel::SafeRun::Object->new(
'program' => SYSTEMCTL_BINARY,
'args' => ['disable', $systemd_name]
);
if ( $result->exec_failed ) {
say "Failed to disable $systemd_name";
say $result->stderr;
return !!0;
}
return !!1;
}
1;