diff options
| author | David Oberhollenzer <david.oberhollenzer@tele2.at> | 2018-09-18 15:30:25 +0200 | 
|---|---|---|
| committer | David Oberhollenzer <david.oberhollenzer@tele2.at> | 2018-09-19 12:22:14 +0200 | 
| commit | b9ba11b4db9c862ca1d2c90cafcf6495183619a9 (patch) | |
| tree | e5ef035b8cc2e9bcfdf3112ce64a0a416dd75b40 /cmd/service | |
| parent | f38163772cb8ca25c440393132e8678e65437320 (diff) | |
Add service commands to manage gcrond services
Signed-off-by: David Oberhollenzer <david.oberhollenzer@tele2.at>
Diffstat (limited to 'cmd/service')
| -rw-r--r-- | cmd/service/schedule.c | 90 | ||||
| -rw-r--r-- | cmd/service/service.8 | 11 | ||||
| -rw-r--r-- | cmd/service/unschedule.c | 82 | 
3 files changed, 182 insertions, 1 deletions
| diff --git a/cmd/service/schedule.c b/cmd/service/schedule.c new file mode 100644 index 0000000..41a4f1d --- /dev/null +++ b/cmd/service/schedule.c @@ -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) diff --git a/cmd/service/service.8 b/cmd/service/service.8 index 6465db6..a897817 100644 --- a/cmd/service/service.8 +++ b/cmd/service/service.8 @@ -28,6 +28,12 @@ configuration directory, pointing to the service template file.  An optional argument can be supplied to parameterize the template.  .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  Disable (but do not stop) a system service by removing the corresponding  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  the desired service instance.  .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 -  Parse a service file from and produce a pseudo shell script containing the  exact commands executed when starting the service.  .SH AVAILABILITY diff --git a/cmd/service/unschedule.c b/cmd/service/unschedule.c new file mode 100644 index 0000000..aea6982 --- /dev/null +++ b/cmd/service/unschedule.c @@ -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) | 
