From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on sa.int.altlinux.org X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=AWL,BAYES_00, RCVD_IN_SORBS_WEB,SPF_PASS autolearn=no version=3.2.5 Date: Fri, 11 May 2012 14:16:07 +0300 From: Igor Vlasenko To: devel@lists.altlinux.org Message-ID: <20120511111606.GA19617@dad.imath.kiev.ua> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="VS++wcV0S1rZb1Fb" Content-Disposition: inline Content-Transfer-Encoding: 8bit User-Agent: Mutt/1.5.21 (2010-09-15) X-imath-kiev-ua-MailScanner-Information: Please contact the ISP for more information X-imath-kiev-ua-MailScanner-ID: A35274B0453.A088F X-imath-kiev-ua-MailScanner: Found to be clean X-imath-kiev-ua-MailScanner-From: vlasenko@imath.kiev.ua Cc: ldv@altlinux.org Subject: [devel] systemd policy - different names for systemd and sysV. X-BeenThere: devel@lists.altlinux.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: ALT Linux Team development discussions List-Id: ALT Linux Team development discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 11 May 2012 11:16:14 -0000 Archived-At: List-Archive: List-Post: --VS++wcV0S1rZb1Fb Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit Господа, когда имя systemd сервиса отличается от имени sysV init скрипта, возникает вопрос, что писать в %post/un_service . Естественно, хочется писать в %post/un_service имя sysV init скрипта. Если сделать симлинк systemd сервиса с sysV init именем, например, bluetoothd.service -> bluetooth.service service start/stop работать будет. Проблема в том, что chkconfig 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. --VS++wcV0S1rZb1Fb Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="chkconfig-2.patch" 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]; --VS++wcV0S1rZb1Fb--