[devel] systemd policy - different names for systemd and sysV.
Igor Vlasenko
vlasenko на imath.kiev.ua
Пт Май 11 23:19:06 MSK 2012
On Fri, May 11, 2012 at 10:31:28PM +0400, Dmitry V. Levin wrote:
> > + /* wheather the end of realName ends with .service */
> > + if (strncmp (realName+strlen(realName)-sizeof(".service"),
> > + ".service", sizeof(".service")) != 0) {
>
> Если вдруг strlen(realName) окажется меньше sizeof(".service"), то
> может получиться не очень хорошо.
Спасибо, поправил, patch3 в аттачменте.
> Патч, в принципе, логичный, и (с точностью до кода проверки суффикса)
> применимый. Только не логичнее ли применить это изменение прямо в
> systemctl? Есть ли какие-нибудь причины патчить именно chkconfig,
> а не systemctl?
В systemctl этот патч может вызвать нежелательные эффекты, например,
сломать user overrides в /etc/systemd. Поэтому врядли этот патч
попадет в апстрим. См. аналогичной функциональности патч от Andrey Borzenkov'а
[ http://lists.freedesktop.org/archives/systemd-devel/2011-March/001725.html ]
и ответ на него Lennart'а Poettering'га
[ http://lists.freedesktop.org/archives/systemd-devel/2011-March/001790.html ]
А поскольку код systemd бурно развивается, без поддержки апстрима
поддерживать в нем патчи достаточно накладно.
В то же время chkconfig достаточно стабилен, и логика иметь у нас
переносимый между init-ами скрипт туда вписывается.
--
Dr. Igor Vlasenko
--------------------
Topology Department
Institute of Math
Kiev, Ukraine
--
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.
----------- следующая часть -----------
diff --git a/chkconfig.c b/chkconfig.c
index 63ddd73..f293426 100644
--- a/chkconfig.c
+++ b/chkconfig.c
@@ -622,15 +622,44 @@ int setService(char * name, int type, int where, int state) {
return 0;
}
+#ifndef SYSTEMD_UNITDIR
+# define SYSTEMD_UNITDIR "/lib/systemd/system"
+#endif
+
+static char* systemdServiceName (const char* name) {
+ char *p;
+ char *serviceFile;
+ struct stat statbuf;
+ xasprintf(&serviceFile, SYSTEMD_UNITDIR "%s.service", name);
+ lstat(serviceFile,&statbuf);
+ if (!S_ISLNK(statbuf.st_mode)) {
+ xasprintf(&p, "%s.service", name);
+ } else {
+ char *realFile = realpath(serviceFile,NULL);
+ char *realName = basename(realFile);
+ off_t suffixOffset = strlen(realName)-sizeof(".service");
+ /* wheather the end of realName ends with .service */
+ if (suffixOffset <= 0 || strncmp (realName + suffixOffset,
+ ".service", sizeof(".service")) != 0) {
+ fprintf(stderr, _("Symlink %s does not point to a *.service file. Falling back to %s as systemd service name.\n"), realFile, name);
+ xasprintf(&p, "%s.service", name);
+ } else {
+ p = strdup (realName);
+ }
+ free(realFile);
+ }
+ free(serviceFile);
+ return p;
+}
+
+
void forwardSystemd(const char *name, int type, const char *verb) {
if (type == TYPE_XINETD)
return;
if (systemdActive() && isOverriddenBySystemd(name)) {
- char *p;
-
- xasprintf(&p, "%s.service", name);
+ char *p = systemdServiceName(name);
fprintf(stderr, _("Note: Forwarding request to 'systemctl %s %s'.\n"),
verb, p);
@@ -648,8 +677,10 @@ static int systemd_loaded_type(const char *name) {
char *cmd;
FILE *p;
int rc = 0;
+ char *systemdName = systemdServiceName(name);
- xasprintf(&cmd, "systemctl status %s.service", name);
+ xasprintf(&cmd, "systemctl status %s", systemdName);
+ free(systemdName);
p = popen(cmd, "r");
if (p) {
char buf[1024];
Подробная информация о списке рассылки Devel