Bug 3659

Summary: snmpd перестал читать сведения из /proc после апгрейда на kernel-image-std-up-2.4.22-alt16
Product: Sisyphus Reporter: Andrei Bulava <abulava>
Component: net-snmpAssignee: Kostya Timoshenko <kt>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: blocker    
Priority: P2 CC: ldv, pilot, shaba
Version: unstable   
Hardware: all   
OS: Linux   
Attachments:
Description Flags
Патч к /etc/init.d/snmpd none

Description Andrei Bulava 2004-02-10 20:05:14 MSK
У меня настроен mrtg на получение данных об eth0 от локального snmpd. До
апргрейда ядра на kernel-image-std-up-2.4.22-alt16 проблем не было. В новой
сборке ядра имеет место restricted /proc access. Очевидное решение включить
пользователя snmp в группу proc не даёт желаемого результата: после запуска
snmpd из инит-скриптов при старте системы всё равно у snmpd не получается читать
данные из /proc. Но (!) после выполнения service snmpd restart всё нормализуется
- до следующей перезагрузки.

Steps to Reproduce:
1. установить net-snmp & mrtg
2. настроить (запустить cfgmaker) mrtg на получение данных об eth0 

Actual Results:  
В /var/log/messages при каждом запуске mrtg по cron:

Feb 10 18:55:00 adelaide crond[1354]: (root) CMD (/usr/bin/mrtg --user mrtg
--group mrtg /etc/mrtg/mrtg-eth0.cfg)
Feb 10 18:55:00 adelaide crond[1355]: (root) CMD (/usr/bin/mrtg --user mrtg
--group mrtg /etc/mrtg/mrtg.cfg)
Feb 10 18:55:04 adelaide syslog[861]: Connection from 127.0.0.1
Feb 10 18:55:04 adelaide syslog[861]: Received SNMP packet(s) from 127.0.0.1
Feb 10 18:55:04 adelaide syslog[861]: Connection from 127.0.0.1
Feb 10 18:55:04 adelaide syslog[861]: cannot open /proc/net/dev - continuing...
Feb 10 18:55:04 adelaide last message repeated 20 times
Feb 10 18:55:04 adelaide syslog[861]: snmpd: Cannot open /proc/net/arp
Feb 10 18:55:04 adelaide last message repeated 2 times
Feb 10 18:55:04 adelaide syslog[861]: Connection from 127.0.0.1
Feb 10 18:55:04 adelaide syslog[861]: cannot open /proc/net/dev - continuing...
Feb 10 18:55:04 adelaide last message repeated 19 times
Feb 10 18:55:04 adelaide syslog[861]: snmpd: Cannot open /proc/net/arp
Feb 10 18:55:04 adelaide last message repeated 2 times
Feb 10 18:55:04 adelaide syslog[861]: Connection from 127.0.0.1
Feb 10 18:55:04 adelaide last message repeated 3 times
Feb 10 18:55:04 adelaide syslog[861]: cannot open /proc/net/dev - continuing...
Feb 10 18:55:04 adelaide last message repeated 16 times
Feb 10 18:55:04 adelaide syslog[861]: snmpd: Cannot open /proc/net/arp
Feb 10 18:55:04 adelaide last message repeated 2 times


Expected Results:  
нормальная работа snmpd, которую удаётся восстановить только ручным рестартом.
Comment 1 Andrei Bulava 2004-04-21 09:39:52 MSD
Система: ALT Linux Sisyphus (20040415)

$ id snmp
uid=112(snmp) gid=100(users) группы=100(users),19(proc)

$ rpm -qv net-snmp
net-snmp-5.1-alt3

После старта системы имею в /var/log/messages:

Apr 20 20:50:00 adelaide crond[7276]: (root) CMD (/usr/bin/mrtg --user mrtg
--group mrtg /etc/mrtg/mrtg-eth0.cfg) 
Apr 20 20:50:00 adelaide crond[7277]: (root) CMD (/usr/bin/mrtg --user mrtg
--group mrtg /etc/mrtg/mrtg.cfg) 
Apr 20 20:50:02 adelaide snmpd: Connection from 127.0.0.1 
Apr 20 20:50:02 adelaide snmpd: Connection from 127.0.0.1 
Apr 20 20:50:02 adelaide snmpd: cannot open /proc/net/dev - continuing... 
Apr 20 20:50:02 adelaide last message repeated 20 times
Apr 20 20:50:02 adelaide snmpd: snmpd: Cannot open /proc/net/arp 
Apr 20 20:50:02 adelaide last message repeated 2 times
Apr 20 20:50:02 adelaide snmpd: Connection from 127.0.0.1 
Apr 20 20:50:02 adelaide snmpd: cannot open /proc/net/dev - continuing... 
Apr 20 20:50:02 adelaide last message repeated 19 times
Apr 20 20:50:02 adelaide snmpd: snmpd: Cannot open /proc/net/arp 
Apr 20 20:50:02 adelaide last message repeated 2 times
Apr 20 20:50:02 adelaide snmpd: Connection from 127.0.0.1 
Apr 20 20:50:03 adelaide last message repeated 3 times
Apr 20 20:50:03 adelaide snmpd: cannot open /proc/net/dev - continuing... 
Apr 20 20:50:03 adelaide last message repeated 16 times
Apr 20 20:50:03 adelaide snmpd: snmpd: Cannot open /proc/net/arp 
Apr 20 20:50:03 adelaide last message repeated 2 times

Затем в адрес root приходит сообщение:

Date: Tue, 20 Apr 2004 20:50:03 +0300 (EEST)
From: Cron Daemon <root@adelaide.office>
To: root@adelaide.office
Subject: Cron <root@adelaide> /usr/bin/mrtg --user mrtg --group mrtg
/etc/mrtg/mrtg-eth0.cfg

WARNING: Could not match host:'public@localhost:' ref:'Descr' key:'eth0'
ERROR: Target[localhost_eth0][_IN_] ' $target->[0]{$mode} ' did not eval into
defined data
ERROR: Target[localhost_eth0][_OUT_] ' $target->[0]{$mode} ' did not eval into
defined data

Тут же перезапускаю snmpd (service snmpd restart) и в /var/log/messages:

Apr 20 20:52:48 adelaide snmpd: Received TERM or STOP signal...  shutting down... 
Apr 20 20:52:49 adelaide snmpd: snmpd shutdown succeeded
Apr 20 20:52:49 adelaide snmpd: snmpd startup succeeded
Apr 20 20:52:50 adelaide snmpd: NET-SNMP version 5.1 
Apr 20 20:55:00 adelaide crond[7487]: (root) CMD (/usr/bin/mrtg --user mrtg
--group mrtg /etc/mrtg/mrtg-eth0.cfg) 
Apr 20 20:55:00 adelaide crond[7488]: (root) CMD (/usr/bin/mrtg --user mrtg
--group mrtg /etc/mrtg/mrtg.cfg) 
Apr 20 20:55:02 adelaide snmpd: Connection from 127.0.0.1 
Apr 20 20:55:02 adelaide snmpd: Received SNMP packet(s) from 127.0.0.1 
Apr 20 20:55:02 adelaide snmpd: Connection from 127.0.0.1 
Apr 20 20:55:02 adelaide last message repeated 12 times

Сообщения от cron прекращаются, mrtg начинает давать показания.

Т.е. налицо восстановление работоспособности snmpd. Но только до следующей
перезагрузки. После перезагрузки картина повторяется с вероятностью 100%.

Судя по тому, что до этого основной группой псевдопользователя snmp была
gid=100(users), я решил, что на самом деле такая основная группа практически
не играет какой-то специальной роли.

Поэтому проблему удаётся решить с помощью комплекса из 2-х неотрывных друг от
друга мер:

1) модифицировать псевдопользователя snmp т.о., чтобы

$ id snmp
uid=112(snmp) gid=19(proc) группы=19(proc)

Для этого понадобится модифицировать spec-файл net-snmp, чтобы вторая строчка
%post выглядела как

/usr/sbin/usermod -g proc snmp &>/dev/null ||:

2) модифицировать /etc/init.d/snmpd наложением нижеследующего патча:

--- /etc/init.d/snmpd.DISTRO    2004-02-18 15:35:09 +0200
+++ /etc/init.d/snmpd   2004-04-20 21:24:19 +0300
@@ -14,7 +14,7 @@
 # Source function library.
 . /etc/init.d/functions
 
-OPTIONS="-Ls DAEMON -Lf /dev/null -p /var/run/snmpd.pid -a -u `getuseruid snmp`"
+OPTIONS="-Ls DAEMON -Lf /dev/null -p /var/run/snmpd.pid -a -u `getuseruid snmp`
-g `id -g snmp`"
 PIDFILE=/var/run/snmpd.pid
 LOCKFILE=/var/lock/subsys/snmpd
 RETVAL=0
Comment 2 Andrei Bulava 2004-04-21 09:44:49 MSD
Created attachment 393 [details]
Патч к /etc/init.d/snmpd

В Additional Comment #1 From Andrei Bulava  2004-04-21 09:39 предлагаемый мною
патч приведён в неудобном виде, поэтому прилагаю его отдельно.
Comment 3 Dmitry V. Levin 2004-04-21 21:34:03 MSD
Предлагаю пропатчить на тему использования initgroups(3). 
Comment 4 Denis Ovsienko 2004-04-22 10:26:37 MSD
С ldv согласен, именно это и является правильным. Хороший пример как это
делается --- apache.
Comment 5 Andrei Bulava 2004-05-04 12:52:06 MSD
В i/D/ ушёл:

51e642b0a1c2e6ee43346309818f44da  net-snmp-5.1.1-alt1.1.src.rpm

$ rpm -qp --lastchange net-snmp-5.1.1-alt1.1.src.rpm
* Пнд Май 03 2004 Andrei Bulava <abulava@altlinux.ru> 5.1.1-alt1.1

- added 'initgroups' patch to use all groups of which 'snmp' user
  was a member
- fixed init script & postinstall script to rollback changes which
  worked around lack of the initgroups function call in snmpd

Патч достаточно прямолинейный: добавляет инициализацию списка вспомогательных
групп путём вызова initgroups(3) (спасибо ldv@ и pilot@). Повторить все тонкости
аналогичного места в apache (в части кроссплатформенности) - такой цели я не
ставил. Тем не менее, и в таком виде патч, хочется верить, не вызовет отторжение
у upstream ;-)
Comment 6 inger@altlinux.org 2004-06-03 17:22:44 MSD
как я понял этот пакет уже в Сизифе 
 
Comment 7 Andrei Bulava 2004-06-03 19:16:55 MSD
(In reply to comment #6)
> как я понял этот пакет уже в Сизифе 
>  

Да, в Сизифе пакет с исправлением, предложенным в comment #1.

Идеологически более правильный вариант исправления, описанный в comment #5,
остался в Daedalus и в настоящий момент не ставится на систему с Sisyphus (после
пересборки Сизифа с новым openssl).

На своём тестовом стенде я использую самую свежую Сизифную версию, баг закрыт.
Жаль только, если правильный патч так и не дойдёт до upstream :-(