1
0
Fork 0
mirror of https://github.com/pygos/init.git synced 2024-11-22 03:09:46 +01:00

Add service commands to manage gcrond services

Signed-off-by: David Oberhollenzer <david.oberhollenzer@tele2.at>
This commit is contained in:
David Oberhollenzer 2018-09-18 15:30:25 +02:00
parent f38163772c
commit b9ba11b4db
4 changed files with 187 additions and 1 deletions

View file

@ -26,6 +26,11 @@ service_CFLAGS = $(AM_CFLAGS)
service_LDFLAGS = $(AM_LDFLAGS) service_LDFLAGS = $(AM_LDFLAGS)
service_LDADD = libinit.a libcfg.a service_LDADD = libinit.a libcfg.a
if GCROND
service_SOURCES += cmd/service/schedule.c
service_SOURCES += cmd/service/unschedule.c
endif
if USYSLOGD if USYSLOGD
syslog_SOURCES = cmd/syslog.c syslog_SOURCES = cmd/syslog.c
syslog_CPPFLAGS = $(AM_CPPFLAGS) syslog_CPPFLAGS = $(AM_CPPFLAGS)

90
cmd/service/schedule.c Normal file
View file

@ -0,0 +1,90 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/*
* Copyright (C) 2018 - David Oberhollenzer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include "servicecmd.h"
static int cmd_schedule(int argc, char **argv)
{
char *target, *linkname, *ptr;
int ret = EXIT_FAILURE;
struct stat sb;
if (check_arguments(argv[0], argc, 2, 2))
return EXIT_FAILURE;
for (ptr = argv[1]; isalnum(*ptr) || *ptr == '_'; ++ptr)
;
if (*ptr != '\0') {
fprintf(stderr, "Invalid service name '%s'\n", argv[1]);
tell_read_help(argv[0]);
return EXIT_FAILURE;
}
if (asprintf(&target, "%s/%s.gcron", TEMPLATEDIR, argv[1]) < 0) {
perror("asprintf");
return EXIT_FAILURE;
}
if (stat(target, &sb)) {
fprintf(stderr, "%s: %s\n", target, strerror(errno));
goto out_tgt;
}
if ((sb.st_mode & S_IFMT) != S_IFREG) {
fprintf(stderr, "%s: must be a regular file\n", target);
goto out_tgt;
}
if (asprintf(&linkname, "%s/%s", GCRONDIR, argv[1]) < 0) {
perror("asprintf");
goto out_tgt;
}
if (symlink(target, linkname)) {
fprintf(stderr, "creating symlink '%s' -> '%s: %s\n",
linkname, target, strerror(errno));
goto out;
}
ret = EXIT_SUCCESS;
out:
free(linkname);
out_tgt:
free(target);
return ret;
}
static command_t schedule = {
.cmd = "schedule",
.usage = "<name>",
.s_desc = "enable a gcrond service",
.l_desc = "This marks a gcrond service as enabled by creating a "
"symlink in " GCRONDIR " pointing to a template file in "
TEMPLATEDIR " with a .gcron extension.",
.run_cmd = cmd_schedule,
};
REGISTER_COMMAND(schedule)

View file

@ -28,6 +28,12 @@ configuration directory, pointing to the service template file.
An optional argument can be supplied to parameterize the template. An optional argument can be supplied to parameterize the template.
.TP .TP
.BR schedule " " \fI<service>\fP
If built with support for gcrond, enable a gcron service by creating a symlink
in the gcrond configuration directory, pointing to the service file.
The extension \fB.gcron\fP is automatically appended to the service name.
.TP
.BR disable " " \fI<command>\fP " " \fI[arguments]\fP .BR disable " " \fI<command>\fP " " \fI[arguments]\fP
Disable (but do not stop) a system service by removing the corresponding Disable (but do not stop) a system service by removing the corresponding
symlink in the configuration directory. symlink in the configuration directory.
@ -35,8 +41,11 @@ symlink in the configuration directory.
If the service is parameterized, arguments have to be specified to disable If the service is parameterized, arguments have to be specified to disable
the desired service instance. the desired service instance.
.TP .TP
.BR unschedule " " \fI<service>\fP
If built with support for gcrond, disable a gcron service by removing the
corresponding symlink in the gcron configuration directory.
.TP
.BR dumpscript " " \fI<command>\fP " " \fI[arguments]\fP .BR dumpscript " " \fI<command>\fP " " \fI[arguments]\fP
Parse a service file from and produce a pseudo shell script containing the Parse a service file from and produce a pseudo shell script containing the
exact commands executed when starting the service. exact commands executed when starting the service.
.SH AVAILABILITY .SH AVAILABILITY

82
cmd/service/unschedule.c Normal file
View file

@ -0,0 +1,82 @@
/* SPDX-License-Identifier: GPL-3.0-or-later */
/*
* Copyright (C) 2018 - David Oberhollenzer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include "servicecmd.h"
static int cmd_unschedule(int argc, char **argv)
{
int ret = EXIT_FAILURE;
char *linkname, *ptr;
struct stat sb;
if (check_arguments(argv[0], argc, 2, 2))
return EXIT_FAILURE;
for (ptr = argv[1]; isalnum(*ptr) || *ptr == '_'; ++ptr)
;
if (*ptr != '\0') {
fprintf(stderr, "Invalid service name '%s'\n", argv[1]);
tell_read_help(argv[0]);
return EXIT_FAILURE;
}
if (asprintf(&linkname, "%s/%s.gcron", GCRONDIR, argv[1]) < 0) {
perror("asprintf");
return EXIT_FAILURE;
}
if (lstat(linkname, &sb)) {
fprintf(stderr, "lstat %s: %s\n", linkname, strerror(errno));
goto out;
}
if ((sb.st_mode & S_IFMT) != S_IFLNK) {
fprintf(stderr, "error: '%s' is not a symlink!", linkname);
goto out;
}
if (unlink(linkname)) {
fprintf(stderr, "removing %s: %s\n",
linkname, strerror(errno));
goto out;
}
ret = EXIT_SUCCESS;
out:
free(linkname);
return ret;
}
static command_t unschedule = {
.cmd = "unschedule",
.usage = "<name>",
.s_desc = "disable a gcrond service",
.l_desc = "This disables a gcrond service by removing the coresponding "
"symlink in " GCRONDIR ".",
.run_cmd = cmd_unschedule,
};
REGISTER_COMMAND(unschedule)