[devel] systemd policy - different names for systemd and sysV.

Igor Vlasenko vlasenko на imath.kiev.ua
Пт Май 11 15:16:07 MSK 2012


Господа,
когда имя systemd сервиса отличается от имени sysV init скрипта,
возникает вопрос, что писать в %post/un_service <name>.

Естественно, хочется писать в %post/un_service 
имя sysV init скрипта.

Если сделать симлинк systemd сервиса с sysV init именем,
например, bluetoothd.service -> bluetooth.service
service <sysV init имя> start/stop работать будет.

Проблема в том, что chkconfig <sysV init имя> on / off
не работает, даже если есть симлинк, поскольку эта функциональность
считается неправильной в systemctl.

Это плохо, так как не позволяет писать скрипты, одинаково
работающие хоть под sysV init, хоть под systemd.

Однако нам ничто не мешает пропатчить chkconfig,
чтобы он разрешал симлинк в настоящее имя systemd сервиса.

Пример такого достаточно тривиального патча к chkconfig
приложен в аттачменте (chkconfig-2.patch).

Предлагаю патчить chkconfig (не обязательно предложенным патчем)
так как иначе придется переименовывать sysV init скрипты,
а это 
1) будут замусорены сотни спеков
2) сотни спеков будут замусорены как правило некорректным
кодом, который еще надо тщательно тестировать, чтобы он не
сломал обновление.

Ведь при переименовании, если не проследить,
может поменяться имя pid файла, и вообще у нас при переименовании 
нет condrestart, а есть только <старое имя> stop
и <новое имя> start, и универсальный триггер для condrestart при
переименовании, использование которого можно было бы рекомендовать
в полиси, вряд ли получится написать. Нужно будет смотреть 
в каждый sysV 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..727a820 100644
--- a/chkconfig.c
+++ b/chkconfig.c
@@ -622,15 +622,43 @@ 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);
+	/* wheather the end of realName ends with .service */
+	if (strncmp (realName+strlen(realName)-sizeof(".service"),
+		     ".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 +676,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