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;