Самый маленький Хабра-кармограф — для munin

    Несколько раз уже на Хабре писали карматрекеры — отображающие изменение кармы на графике. Самый известный и живой до сих пор — Хаброметр. Однако для моих целей он не вполне подходил — слишком редкий опрос, раз в сутки (впрочем, в соответствии со старыми правилами использования API хабра — массовый опрос с бОльшей частотой затруднителен).

    Так что я написал свой крошечный munin-плагин для хабра. Если вам он не нужен, то ничего интересного вы под катом не увидите: несколько строчек PHP, парсинг XML стандартными средствами — на все про все 10 минут. Частота опроса — стандартная, раз в 5 минут.

    Результат



    Исходники

    Скачать: s.14.by/habracarma

    #!/usr/bin/php
    <?php
    	error_reporting(0);
    	$username = "BarsMonster";//Change this to your username!
    
    	if ((count($argv) > 1) && ($argv[1] == 'config'))
    	{
    		print("graph_title KarmaGraph $username
    graph_category web 
    graph_vlabel #
    karma.label Karma
    rating.label Rating
    ");
    		exit();
    	}
    	$xml = new SimpleXMLElement(file_get_contents("http://habrahabr.ru/api/profile/$username/"));
    
    	print('karma.value ' . $xml->karma . "\n");
    	print('rating.value ' . $xml->rating . "\n");
    ?>


    Установка

    • Само собой нужен munin, практически любой версии.
    • Кладем плагин в /usr/share/munin/plugins/
    • Указываем имя пользователя внутри плагина. Я не стал выносить его в отдельный конфиг — так только больше работы для всех.
    • Делаем на него симлинк в /etc/munin/plugins
    • chmod a+x habracarma
    • Перезапускаем munin-node

    Надеюсь, кому-то он окажется полезен.
    • +11
    • 4,8k
    • 7
    Поделиться публикацией

    Комментарии 7

      +2
      Надо такой же, но для постов сделать — чтобы писал рейтинг, просмотры, избранное, количество комментариев, с точками на графике: выход на главную, попадание в лучшее за сутки.
        +6
        Меня задело слово «самый» в заголовке статьи:
        #!/bin/bash
        username='burik666'
        if [ "$1" = "config" ]; then
            echo "graph_title KarmaGraph $username
        graph_category web 
        graph_vlabel #
        karma.label Karma
        rating.label Rating"
            exit
        fi
        curl -s http://habrahabr.ru/api/profile/$username/|grep -E '<karma|rating>'|sed -r 's/<([^>]+)>([^<]+)<\/[^>]+>/\1.value \2/g'
        
          0
          спасибо за скрипт — прикручу к conky
            +2
            Неоптимально! Фиксед:
            #!/bin/sh
            username='Self_Perfection'
            if [ «$1» = «config» ]; then
                echo «graph_title KarmaGraph $username
            graph_category web 
            graph_vlabel #
            karma.label Karma
            rating.label Rating»
                exit
            fi
            wget -qO- http://habrahabr.ru/api/profile/$username/|sed -nr '/karma>|rating>/{s/<([^>]+)>([^<]+)<\/[^>]+>/\1.value \2/;p}'
            

            1. /bin/sh вместо /bin/bash. На убунточке, например, будет использоваться dash, а он гораздо легче
            2. wget вместо curl
            3. Убран grep — на один форк меньше


            Можно и от sed избавиться, вырезать нужные данные из xml чисто силами sh, или даже избавиться от wget, если воспользоваться фичей /dev/tcp баша. Но скрипт станет гораздо длиннее и хуже читаем.
              +1
              Я тут на днях узнал, что баш умеет регулярные выражения. Не удержался и переписал на чистом баше.
              #!/bin/bash
              username='Self_Perfection'
              if [ "$1" = "config" ]; then
                  echo "graph_title KarmaGraph $username
              graph_category web 
              graph_vlabel #
              karma.label Karma
              rating.label Rating"
                  exit
              fi
              
              exec 33<>/dev/tcp/habrahabr.ru/80
              echo -e "GET /api/profile/$username/ HTTP/1.0\r\nHost: habrahabr.ru\r\n" >&33
              read -d $'\0' REPLY <&33
              
              for v in karma rating; do
                  if [[ $REPLY =~ "<$v>"(.*)"</$v>" ]]; then
                      echo "$v.value ${BASH_REMATCH[1]}"
                  fi
              done


              Не так уж и страшно
                0
                Спасибо, интересно.
                За комментарии как в этой статье мы и любим хабр :-)
                  +1
                  В общем идеал не достижим даже с третьей итерации, так что перенёс к себе в гитхабчик.

                  Главное, что изменил: юзернейм теперь указывается традиционным мунинским способом указания ресурса для мониторинга — дописыванием к имени плагина через подчёркивание. Так что теперь установка кармографа предельно упростилась:

                  sudo wget -O /etc/munin/plugins/habrakarma_ВАШЛОГИН https://github.com/Self-Perfection/munin-habrakarma/raw/master/habrakarma_ && sudo chmod -c 755 /etc/munin/plugins/habrakarma_* && sudo systemctl restart munin-node
                  


                  Нужно только в команде выше заменить логин на ваш реальный и, возможно, заменить команду перезапуска munin-node на специфичную для вашего дистрибутива. И ВСЁ

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое