Система Orphus
[]

среда, 9 декабря 2009 г.

Vnstat 1.9 и Ubuntu 9.10 - исправление бага

Я уже рассказывал про vnstat в своем посте "Собираем vnstat в ubuntu и настраиваем lighttpd для vnstati", но все же напомню: это простенькая консольная программа для учета потребляемого трафика, т.ж. есть веб-морда.
Что за баг? Простое переполнение буфера при попытке построить картинку с почасовым графиком. Пример:
$ vnstati -h -o /tmp/vnstatcgi/vnstat_0_h.png -i wlan0


Я послал автору багрепорт, на который он ответил почти сразу же. В результате переписки я узнал, что я не первый, кто с этим столкнулся. А решение уже есть, аж целых 3:
1. В конфигурационном файле /etc/vnstat.conf для параметра HourlyRate выставить значение 0
2. В конфигурационном файле /etc/vnstat.conf для параметра RateUnit выставить значение 0
3. Подправить исходники. Именно на этом варианте я и остановился. Для этого открываем файл src/image.c и идем к строке 1401, в которой видим:
static char buffer[6]
Просто заменяем цифру 6 на 7:
static char buffer[7]
Все. Теперь осталось перекомпилировать и переустановить vnstat.
После этих действий у меня все заработало на ура :)

Выражаю огромнейшую благодарность автору vnstat, Teemu Toivola.




PS: Себе на заметку, чтобы не забыть...
$ sudo aptitude install libgd2-xpm libgd2-xpm-dev lighttpd
cd /tmp
wget wget http://humdi.net/vnstat/vnstat-1.9.tar.gz
tar zxf vnstat-1.9.tar.gz
cd vnstat-1.9
# bug fix
sed -i 's/static\ char\ buffer\[6\]/static char buffer[7]/' src/image.c
sudo make all
sudo make install
sudo vnstat --testkernel
sudo vnstat -u -i wlan0

# после подключения модема, если нужен второй интерфейс
# sudo vnstat -u -i ppp0

# у меня не стандартный umask
sudo chmod 644 /var/lib/vnstat/wlan0
# настраиваю интерфейс по дефолту, локаль, формат даты/времени для ежедневного, ужемесячного и топового графиков, а так же для заголовков, показывать все в кбайт/сек, а не кбит/сек, сохранять каждую пинуту, на не 5 минут
sudo sed -i -e 's/\(Interface\ \+\)"[a-zA-Z0-9]\+"/\1"wlan0"/;s/\(Locale\ \+\)"\-"/\1"en_US.UTF-8"/;s/\(DayFormat\ \+\)"%x"/\1"%d.%m.%Y"/;s/\(MonthFormat\ \+\)"%b '"'"'%y"/\1"%b %Y"/;s/\(TopFormat\ \+\)"%x"/\1"%d.%m.%Y"/;s/\(RateUnit\ \+\)1/\1 0/;s/\(SaveInterval\ \+\)5/\1 1/;s/\(HeaderFormat\ \+\)"%x\ %H\:%M"/\1"%d.%m.%Y %H:%M"/' /etc/vnstat.conf
sudo cp -v examples/init.d/ubuntu/vnstat /etc/init.d/
sudo /etc/init.d/vnstat start
sudo lighttpd-enable-mod cgi
# чтобы cgi работал
printf '$HTTP["url"] =~ "^/*" {\n\tcgi.assign = ( ".cgi" => "/usr/bin/perl" )\n}\n' | sudo tee -a /etc/lighttpd/conf-enabled/10-cgi.conf > /dev/null
sudo /etc/init.d/lighttpd force-reload
sudo -u www-data mkdir /tmp/vnstatcgi
sudo cp -v examples/vnstat.cgi /var/www/
sudo sed -i -e "s/my \$host = '.*'\;/my \$host = 'Laptop'\;/g;s/my \$cachetime = '[0-9]\+'\;/my \$cachetime = '1'\;/g" /var/www/vnstat.cgi
sudo chown -R www-data:www-data /var/www

# Для одного интерфейса (wlan0)
grep -vE "interface =>" /var/www/vnstat.cgi | sed -e "s/my \@graphs = (/my @graphs = (\n        { interface => 'wlan0' },/g" | sudo tee /var/www/vnstat.cgi.tmp > /dev/null && sudo mv /var/www/vnstat.cgi.tmp /var/www/vnstat.cgi
sudo chmod 755 /var/www/vnstat.cgi
sudo chown -R www-data:www-data /var/www
/var/www/vnstat.cgi | sudo -u www-data tee /var/www/index.html > /dev/null
sudo chmod 644 /var/www/index.html



# Для двух интерфейсов (wlan0 и ppp0)
grep -vE "interface =>" /var/www/vnstat.cgi | sed -e "s/my \@graphs = (/my @graphs = (\n        { interface => 'wlan0' },/g" | sudo tee /var/www/vnstat.cgi.tmp > /dev/null && sudo mv /var/www/vnstat.cgi.tmp /var/www/vnstat.cgi
sudo chmod 755 /var/www/vnstat.cgi
sudo chown -R www-data:www-data /var/www
/var/www/vnstat.cgi | sudo -u www-data tee /var/www/index.html > /dev/null
sudo chmod 644 /var/www/index.html
# по каталогу для каждого интерфейса
sudo -u www-data mkdir -p /var/www/{wlan,ppp}0
sudo chmod 755 /var/www/{wlan,ppp}0
sudo cp /var/www/index.html /var/www/wlan0/
sudo cp /var/www/index.html /var/www/ppp0/
# подправляют индекс для каждого интерфейса
sudo sed -i 's/src="vnstat.cgi/src="..\/vnstat.cgi/g' /var/www/wlan0/index.html
sudo sed -i 's/src="vnstat.cgi?0/src="..\/vnstat.cgi?1/g' /var/www/ppp0/index.html
# делаю индекс, который будет из корня кидать в wlan0
printf '<html><head><meta http-equiv="Refresh" content="0; URL=wlan0"></head><body></body></html>' | sudo -u www-data tee /var/www/index.html > /dev/null
# добавляют ppp0
sudo -u www-data sed -i "/interface =>/a { interface => 'ppp0' }," /var/www/vnstat.cgi

#---------------------------------------------------------------------------------------
sudo chown -R www-data:www-data /var/www

# Добавить эти строки в /etc/rc.local, чтобы выставлялись нужные права (у меня umask не стандартный)
chown root:www-data /var/lib/vnstat/.{ppp,wlan}0 
chmod 644 /var/lib/vnstat/.{ppp,wlan}0
chown root:www-data /var/lib/vnstat/* 
chmod 644 /var/lib/vnstat/*
PPS: В некоторых местах вроде как бы что-то лишнее... Но это сделано нарочно, чтобы ручками не настраивать, а вот таким воть скиптом.




Информация с сайта http://angel2s2.blogspot.com/. Если Вы читаете информацию на другом сайте, пожалуйста свяжитесь с автором сайта http://angel2s2.blogspot.com/.

Похожие статьи

0 коммент.:

Отправить комментарий