ALT Linux Team development discussions
 help / color / mirror / Atom feed
* [devel] systemd policy - different names for systemd and sysV.
@ 2012-05-11 11:16 Igor Vlasenko
  2012-05-11 18:31 ` Dmitry V. Levin
  0 siblings, 1 reply; 9+ messages in thread
From: Igor Vlasenko @ 2012-05-11 11:16 UTC (permalink / raw)
  To: devel; +Cc: ldv

[-- Attachment #1: Type: text/plain, Size: 2789 bytes --]

Господа,
когда имя 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.


[-- Attachment #2: chkconfig-2.patch --]
[-- Type: text/plain, Size: 1893 bytes --]

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];

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [devel] systemd policy - different names for systemd and sysV.
  2012-05-11 11:16 [devel] systemd policy - different names for systemd and sysV Igor Vlasenko
@ 2012-05-11 18:31 ` Dmitry V. Levin
  2012-05-11 19:19   ` Igor Vlasenko
  0 siblings, 1 reply; 9+ messages in thread
From: Dmitry V. Levin @ 2012-05-11 18:31 UTC (permalink / raw)
  To: ALT Devel discussion list

[-- Attachment #1: Type: text/plain, Size: 1564 bytes --]

On Fri, May 11, 2012 at 02:16:07PM +0300, Igor Vlasenko wrote:
> Господа,
> когда имя 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 (не обязательно предложенным патчем)

Патч, в принципе, логичный, и (с точностью до кода проверки суффикса)
применимый.  Только не логичнее ли применить это изменение прямо в
systemctl?  Есть ли какие-нибудь причины патчить именно chkconfig,
а не systemctl?

> +	/* wheather the end of realName ends with .service */
> +	if (strncmp (realName+strlen(realName)-sizeof(".service"),
> +		     ".service", sizeof(".service")) != 0) {

Если вдруг strlen(realName) окажется меньше sizeof(".service"), то
может получиться не очень хорошо.


-- 
ldv

[-- Attachment #2: Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [devel] systemd policy - different names for systemd and sysV.
  2012-05-11 18:31 ` Dmitry V. Levin
@ 2012-05-11 19:19   ` Igor Vlasenko
  2012-05-11 19:36     ` Igor Vlasenko
  0 siblings, 1 reply; 9+ messages in thread
From: Igor Vlasenko @ 2012-05-11 19:19 UTC (permalink / raw)
  To: ALT Devel discussion list; +Cc: Dmitry V. Levin

[-- Attachment #1: Type: text/plain, Size: 2020 bytes --]

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.


[-- Attachment #2: chkconfig-3.patch --]
[-- Type: text/plain, Size: 1953 bytes --]

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];

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [devel] systemd policy - different names for systemd and sysV.
  2012-05-11 19:19   ` Igor Vlasenko
@ 2012-05-11 19:36     ` Igor Vlasenko
  2012-05-18  9:55       ` Alexey Shabalin
  0 siblings, 1 reply; 9+ messages in thread
From: Igor Vlasenko @ 2012-05-11 19:36 UTC (permalink / raw)
  To: ALT Devel discussion list; +Cc: Dmitry V. Levin

[-- Attachment #1: Type: text/plain, Size: 489 bytes --]

On Fri, May 11, 2012 at 10:19:06PM +0300, Igor Vlasenko wrote:
> Спасибо, поправил, patch3 в аттачменте.

Извиняюсь,
еще поправил, потерял слеш когда выделял SYSTEMD_UNITDIR,
patch4 в аттачменте.

-- 

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.


[-- Attachment #2: chkconfig-4.patch --]
[-- Type: text/plain, Size: 1954 bytes --]

diff --git a/chkconfig.c b/chkconfig.c
index 63ddd73..cfb4f05 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];

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [devel] systemd policy - different names for systemd and sysV.
  2012-05-11 19:36     ` Igor Vlasenko
@ 2012-05-18  9:55       ` Alexey Shabalin
  2012-05-18 10:19         ` Dmitry V. Levin
  0 siblings, 1 reply; 9+ messages in thread
From: Alexey Shabalin @ 2012-05-18  9:55 UTC (permalink / raw)
  To: ALT Linux Team development discussions

2012/5/11 Igor Vlasenko :
> On Fri, May 11, 2012 at 10:19:06PM +0300, Igor Vlasenko wrote:
>> Спасибо, поправил, patch3 в аттачменте.
>
> Извиняюсь,
> еще поправил, потерял слеш когда выделял SYSTEMD_UNITDIR,
> patch4 в аттачменте.

Где-то что-то не срастается. Или я не того жду.

# rpm -q chkconfig
chkconfig-1.3.59-alt1

# ls -la /lib/systemd/system/bluetoothd.service
lrwxrwxrwx 1 root root 17 Фев 10 17:41
/lib/systemd/system/bluetoothd.service -> bluetooth.service

# chkconfig bluetoothd off
Symlink /lib/systemd/system/bluetooth.service does not point to a
*.service file, falling back to bluetoothd as systemd service name.
Внимание: Отправляется запрос 'systemctl disable bluetoothd.service'.
Failed to issue method call: No such file or directory

# chkconfig bluetoothd on
Symlink /lib/systemd/system/bluetooth.service does not point to a
*.service file, falling back to bluetoothd as systemd service name.
Внимание: Отправляется запрос 'systemctl enable bluetoothd.service'.
Failed to issue method call: No such file or directory

-- 
Alexey Shabalin


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [devel] systemd policy - different names for systemd and sysV.
  2012-05-18  9:55       ` Alexey Shabalin
@ 2012-05-18 10:19         ` Dmitry V. Levin
  2012-05-18 10:51           ` Alexey Shabalin
  0 siblings, 1 reply; 9+ messages in thread
From: Dmitry V. Levin @ 2012-05-18 10:19 UTC (permalink / raw)
  To: ALT Linux Team development discussions

[-- Attachment #1: Type: text/plain, Size: 498 bytes --]

On Fri, May 18, 2012 at 01:55:37PM +0400, Alexey Shabalin wrote:
> 2012/5/11 Igor Vlasenko :
> > On Fri, May 11, 2012 at 10:19:06PM +0300, Igor Vlasenko wrote:
> >> Спасибо, поправил, patch3 в аттачменте.
> >
> > Извиняюсь,
> > еще поправил, потерял слеш когда выделял SYSTEMD_UNITDIR,
> > patch4 в аттачменте.
> 
> Где-то что-то не срастается. Или я не того жду.
> 
> # rpm -q chkconfig
> chkconfig-1.3.59-alt1

Патч patch4 оказался с ошибкой, попробуйте 1.3.59-alt2.


-- 
ldv

[-- Attachment #2: Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [devel] systemd policy - different names for systemd and sysV.
  2012-05-18 10:19         ` Dmitry V. Levin
@ 2012-05-18 10:51           ` Alexey Shabalin
  2012-05-18 15:07             ` Dmitry V. Levin
  0 siblings, 1 reply; 9+ messages in thread
From: Alexey Shabalin @ 2012-05-18 10:51 UTC (permalink / raw)
  To: ALT Linux Team development discussions

18 мая 2012 г., 14:19 пользователь Dmitry V. Levin написал:
> On Fri, May 18, 2012 at 01:55:37PM +0400, Alexey Shabalin wrote:
>> 2012/5/11 Igor Vlasenko :
>> > On Fri, May 11, 2012 at 10:19:06PM +0300, Igor Vlasenko wrote:
>> >> Спасибо, поправил, patch3 в аттачменте.
>> >
>> > Извиняюсь,
>> > еще поправил, потерял слеш когда выделял SYSTEMD_UNITDIR,
>> > patch4 в аттачменте.
>>
>> Где-то что-то не срастается. Или я не того жду.
>>
>> # rpm -q chkconfig
>> chkconfig-1.3.59-alt1
>
> Патч patch4 оказался с ошибкой, попробуйте 1.3.59-alt2.

Вообще то почти ничего не поменялось, симлинки так и не обрабатываются:

# chkconfig bluetoothd on
Внимание: Отправляется запрос 'systemctl enable bluetoothd.service'.
Failed to issue method call: No such file or directory

# chkconfig bluetoothd off
Внимание: Отправляется запрос 'systemctl disable bluetoothd.service'.
Failed to issue method call: No such file or directory


-- 
Alexey Shabalin

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [devel] systemd policy - different names for systemd and sysV.
  2012-05-18 10:51           ` Alexey Shabalin
@ 2012-05-18 15:07             ` Dmitry V. Levin
  2012-05-18 16:05               ` Alexey Shabalin
  0 siblings, 1 reply; 9+ messages in thread
From: Dmitry V. Levin @ 2012-05-18 15:07 UTC (permalink / raw)
  To: ALT Linux Team development discussions

[-- Attachment #1: Type: text/plain, Size: 773 bytes --]

On Fri, May 18, 2012 at 02:51:04PM +0400, Alexey Shabalin wrote:
> 18 мая 2012 г., 14:19 пользователь Dmitry V. Levin написал:
> > On Fri, May 18, 2012 at 01:55:37PM +0400, Alexey Shabalin wrote:
> >> 2012/5/11 Igor Vlasenko :
> >> > On Fri, May 11, 2012 at 10:19:06PM +0300, Igor Vlasenko wrote:
> >> >> Спасибо, поправил, patch3 в аттачменте.
> >> >
> >> > Извиняюсь,
> >> > еще поправил, потерял слеш когда выделял SYSTEMD_UNITDIR,
> >> > patch4 в аттачменте.
> >>
> >> Где-то что-то не срастается. Или я не того жду.
> >>
> >> # rpm -q chkconfig
> >> chkconfig-1.3.59-alt1
> >
> > Патч patch4 оказался с ошибкой, попробуйте 1.3.59-alt2.
> 
> Вообще то почти ничего не поменялось, симлинки так и не обрабатываются:

Тогда 1.3.59-alt3.


-- 
ldv

[-- Attachment #2: Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [devel] systemd policy - different names for systemd and sysV.
  2012-05-18 15:07             ` Dmitry V. Levin
@ 2012-05-18 16:05               ` Alexey Shabalin
  0 siblings, 0 replies; 9+ messages in thread
From: Alexey Shabalin @ 2012-05-18 16:05 UTC (permalink / raw)
  To: ALT Linux Team development discussions

18 мая 2012 г., 19:07 пользователь Dmitry V. Levin написал:
> On Fri, May 18, 2012 at 02:51:04PM +0400, Alexey Shabalin wrote:
>> 18 мая 2012 г., 14:19 пользователь Dmitry V. Levin написал:
>> > On Fri, May 18, 2012 at 01:55:37PM +0400, Alexey Shabalin wrote:
>> >> 2012/5/11 Igor Vlasenko :
>> >> > On Fri, May 11, 2012 at 10:19:06PM +0300, Igor Vlasenko wrote:
>> >> >> Спасибо, поправил, patch3 в аттачменте.
>> >> >
>> >> > Извиняюсь,
>> >> > еще поправил, потерял слеш когда выделял SYSTEMD_UNITDIR,
>> >> > patch4 в аттачменте.
>> >>
>> >> Где-то что-то не срастается. Или я не того жду.
>> >>
>> >> # rpm -q chkconfig
>> >> chkconfig-1.3.59-alt1
>> >
>> > Патч patch4 оказался с ошибкой, попробуйте 1.3.59-alt2.
>>
>> Вообще то почти ничего не поменялось, симлинки так и не обрабатываются:
>
> Тогда 1.3.59-alt3.

# chkconfig bluetoothd on
Внимание: Отправляется запрос 'systemctl enable bluetooth.service'.
ln -s '/lib/systemd/system/bluetooth.service'
'/etc/systemd/system/bluetooth.target.wants/bluetooth.service'

Вот теперь работает.

-- 
Alexey Shabalin

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2012-05-18 16:05 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-05-11 11:16 [devel] systemd policy - different names for systemd and sysV Igor Vlasenko
2012-05-11 18:31 ` Dmitry V. Levin
2012-05-11 19:19   ` Igor Vlasenko
2012-05-11 19:36     ` Igor Vlasenko
2012-05-18  9:55       ` Alexey Shabalin
2012-05-18 10:19         ` Dmitry V. Levin
2012-05-18 10:51           ` Alexey Shabalin
2012-05-18 15:07             ` Dmitry V. Levin
2012-05-18 16:05               ` Alexey Shabalin

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git