Что за баг? Простое переполнение буфера при попытке построить картинку с почасовым графиком. Пример:
$ 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 коммент.:
Отправить комментарий