顯示具有 網管軟體 標籤的文章。 顯示所有文章
顯示具有 網管軟體 標籤的文章。 顯示所有文章

2023年12月8日 星期五

apache 2.4.52 to 2.4.57 another method

 


RHEL8本來只有支援apache 2.4.37,本來透過codeit.repo升到2.4.52,最近要升到2.4.57

(2.4.58要使用openssl 3.0以後的版本,是超大工程,因此就升到2.4.57)


以下講一下流程。

這一次自己編RPM檔來升版,本來以為會跟上次一次順利完成,但其實問題也不少,因此記錄一下。

cd /root/rpmbuild/SOURCES

rpmbuild -tb httpd-2.4.57.tar.bz2

記得先把相關設定檔備份好 (理論上yum會幫你備,但我的case他沒有備對,可能是我做過太多升版降版的測試的關係)

dnf localinstall httpd-2.4.57-1.x86_64.rpm httpd-manual-2.4.57-1.x86_64.rpm httpd-tools-2.4.57-1.x86_64.rpm mod_ssl-2.4.57-1.x86_64.rpm 

其它同時編譯出來的RPM檔就看你的需求。

倒回設定檔 (/etc/httpd/conf/httpd.conf)及其它的設定檔。這邊有一個問題。

我原先的2.4.52在讀取modules 是這樣讀的

Include conf.modules.d/*.conf

但升版後這個conf.moduels.d的目錄不見了。

所以我改回自己讀。

例如:

LoadModule mpm_prefork_module /usr/lib64/httpd/modules/mod_mpm_prefork.so

這邊預設是讀mod_mpm_event.so,會有MPM的錯誤訊息,所以我改讀mpm_prefork

我這邊用絕對目錄。如果要用相對目錄的話,

要調整以下的參數:

ServerRoot "/etc/httpd"


復原後發現PHP不能跑(因為httpd相依的php rpm被移掉了),回頭下載php-7.2.24-1.el8.x86_64.rpm

rpm2cpio php-7.2.24-1.el8.x86_64.rpm | cpio -idmv

取出libphp7.so搬到/usr/lib64/httpd/modules/


SSL的部份也一樣在升版時mod_ssl被刪除了,下載mod_ssl-2.4.58-1.el8.x86_64.rpm,取出mod_ssl.so

wget https://pkgs.dyn.su/el8/modular/x86_64/httpd/mod_ssl-2.4.58-1.el8.x86_64.rpm

rpm2cpio mod_ssl-2.4.58-1.el8.x86_64.rpm | cpio -idmv

放到/usr/lib64/httpd/modules/

再修改httpd.conf

LoadModule ssl_module /usr/lib64/httpd/modules/mod_ssl.so


這樣就差不多了。有開放使用者個人網頁的話,記得修改httpd.conf,新增:

LoadModule dir_module /usr/lib64/httpd/modules/mod_dir.so

LoadModule userdir_module /usr/lib64/httpd/modules/mod_userdir.so


有要跑cgi-bin的perl的話,記得修改httpd.conf,新增:

LoadModule cgid_module /usr/lib64/httpd/modules/mod_cgid.so


另外我的webgit也壞了,後來修改/etc/httpd/conf.d/gitweb.conf才跑出來。

有加#號的是原先的設定。

猜想是因為mod_fcgid.x86_64 : FastCGI interface module for Apache 2 這個模組也被刪掉的原因


Alias /git /var/www/git


<Directory /var/www/git>

  #Options +ExecCGI

  #AddHandler cgi-script .cgi

  #DirectoryIndex gitweb.cgi

  Options +ExecCGI +FollowSymLinks +SymLinksIfOwnerMatch

  AllowOverride All

  order allow,deny

  Allow from all

  AddHandler cgi-script cgi

  DirectoryIndex gitweb.cgi

</Directory>


另外在升版apache時,其實php-pear也被移掉了,但我好像只有之前測試multithread時有用到,因此就不裝回了。需要時再說吧。


本來由於設定檔沒有備到,打算降回2.4.52,但只能降到2.4.37(AppStream),而且設定檔也不會回來了。只好硬著頭往上升,

還好順利完成了。

後來才發現可以透過codeit升到apache 2.4.57,但同樣要解決php等幾個軟體的相容性問題。

但也記錄一下,可以看到有2.4.57及2.4.58的版本供選擇。

dnf module enable httpd:codeit

dnf module list httpd:codeit

dnf module info httpd:codeit

接著再用dnf或yum來處理。看的出來CodeIT確實有提供apache 2.4.57了

# yum --enablerepo=CodeIT info httpd

Updating Subscription Management repositories.

Unable to read consumer identity

Last metadata expiration check: 3:39:17 ago on Sun 10 Dec 2023 11:54:01 AM CST.

Installed Packages

Name         : httpd

Version      : 2.4.57

Release      : 1

Architecture : x86_64

Size         : 4.6 M

Source       : httpd-2.4.57-1.src.rpm

Repository   : @System

From repo    : @commandline

Summary      : Apache HTTP Server

URL          : http://httpd.apache.org/

License      : Apache License, Version 2.0

Description  : Apache is a powerful, full-featured, efficient, and freely-available

             : Web server. Apache is also the most popular Web server on the

             : Internet.




2023年8月14日 星期一

build apache http server 2.4.x rpm package on centos 7

目前系統上跑的是httpd-2.4.52,但在codeit上並沒有提供httpd-2.4.57讓我升版。

之前依習慣就自己下載tarball來編譯安裝,但這一次在做OpenSSH升版時想到可以用rpmbuild做rpm檔來裝。所以就想在httpd上也如法泡製。

1、下載檔案至rpmbuild的SOURCE目錄,我的目錄本來就有..可能之前就有玩過了..

為了保險,還是先做目錄:(先yum install rpm-build 然後還是要自己建目錄)

mkdir -p /root/rpmbuild/SOURCES

cd /root/rpmbuild/SOURCES

接著把檔案下載回來:

wget https://dlcdn.apache.org/httpd/httpd-2.4.57.tar.bz2

2、把apr及apr-util的rpm裝起來

3、把該裝的東西補一補:
yum install autoconf libuuid-devel lua-devel libxml2-devel wget rpm-build autoconf zlib-devel libselinux-devel libuuid-devel pcre-devel openldap-devel lua-devel libxml2-devel  openssl-devel apr-devel postgresql-devel mysql-devel sqlite-devel  unixODBC-devel nss-devel expat-devel mailcap libtool gcc-toolset-11-gcc
4、來做RPM檔,如果過程中有錯誤訊息,應該就是有東西沒有裝到。
像我在nm卡了一下,才發現是gcc-toolset-11-gcc沒有裝。
rpmbuild -tb httpd-2.4.57.tar.bz2
5、把rpm檔裝起來:
cd /root/rpmbuild/RPMS/x86_64
dnf localinstall httpd-2.4.57-1.x86_64.rpm httpd-devel-2.4.57-1.x86_64.rpm httpd-manual-2.4.57-1.x86_64.rpm
這樣就好了。

其實他也是用tarball幫你編譯安裝,但好處是你不用再考慮路徑的問題。
例如我在用tarball安裝時,bin檔如果沒有指定目錄,會裝在/usr/local/bin,但用rpm安裝,就會在/usr/bin 這樣日後要移除或升版的話,在管理時會輕鬆很多。






OpenSSH更新心得 (after upgrade couldn't auto login server without password)

 OpenSSH有資安問題,建議更新。


好,我更新。

更新之後,發現本來可以auto login的設備都不通了。

簡單,public key更新就好。

更新後也不行。

看了一下debug訊息,不接受RSA?合理,改用ed25519。

欸,還是不行。

試了一個小時,好吧,我先換回舊版......

剛看了說明,似乎用RSA key 長度 2048 以上可以,但...我累了。改天吧 XD

 
補充一下:在client看到的錯誤訊息是這個:no mutual signature algorithm

有趣的是,在server用/usr/sbin/sshd -d -p 2222 再從client測試竟然看不到明顯的錯誤訊息。

最後還是還是解決了,其實在client這樣下就可以了:

ssh -o 'PubkeyAcceptedKeyTypes +ssh-rsa' myself@example.server.com

不過奇怪的是,在serer的sshd_config加PubkeyAcceptedKeyTypes +ssh-rsa 竟然沒有效...

原來是要在~/.ssh/config (只改該使用者) 或是在 /etc/ssh/ssh_config (改整台機器) 加上此設定才有效。

補充一下,用rpmbuild安裝輕鬆很多。
可以直接參考下文:
https://blog.csdn.net/m0_37682535/article/details/119254661

2023年2月2日 星期四

Install Percona Monitoring Plugins for Cacti

話說最近apache常常自己死掉,然後mysql常常不理我。所以打算在另一台server上用cacti監控它們。我選用的是percona,它在cacti上有開發相關的監控套件。

環境:rhel 8, apache 2.4.52, mysql 5.5.60-MariaDB

percona的部份,可以參考以下說明:

https://www.percona.com/doc/percona-monitoring-plugins/LATEST/cacti/index.html

percona的說明算是詳細,但照說明書做的話一定搞不定,我自己都搞了快兩天。所以我還是自己弄了一份教學,希望可以幫上其它人的忙。

由於我們要抓apache的資料,因此要幫他開新功能,請參考下列網頁。難度不高照作即可。

https://httpd.apache.org/docs/2.4/mod/mod_status.html

裝完之後要試一下能不能跑:(網址記得代換為自己的IP或網址)

wget wget -U Cacti/1.0 -q -O - -T 5 "http://www.omg.com/server-status?auto"

如果你apache裝對了,應該會有下面的回應:(我只節錄部份)

www.omg.com

ServerVersion: Apache/2.4.52 (codeit) OpenSSL/1.1.1m PHP/5.6.40 SVN/1.7.14 mod_wsgi/3.4 Python/2.7.5

ServerMPM: event

Server Built: Dec 20 2021 11:29:54

CurrentTime: Thursday, 02-Feb-2023 16:24:36 CST

我這一台server裝的是rhel8,所以我用yum來裝percona。

yum install percona-cacti-templates

這樣裝起來是1.1.8版,也是最後一版,以後也不會有新的版本了。

接著我們要先修改一下它的設定檔。

vi /usr/share/cacti/scripts/ss_get_by_ssh.php
vi /usr/share/cacti/scripts/ss_get_mysql_stats.php
MySQL的部份要修改帳號及密碼,ssh的部份你要設定一個可以免密碼登入要監控主機的帳號。 不過我只打算透過網頁抓Apache的資料,因此我就不設定ssh的部份。

修改完成後,我們也來測試一下,先試一下apache:

php /usr/share/cacti/scripts/ss_get_by_ssh.php --type apache --host www.omg.com --items gg,gh
有正常輸出的話,再試一下mysql:
/usr/bin/php -q /usr/share/cacti/scripts/ss_get_mysql_stats.php --host www.omg.com --items kx,ky --user omg --pass ohmygod --port 3306

再來就是麻煩的部份:

cd /usr/share/cacti/resource/percona/bin

讓自己產生符合你需要的template:
perl pmp-cacti-template --script ../../../scripts/ss_get_by_ssh.php ../definitions/apache.def > apache.xml

正常狀況下,你會得到以下的錯誤訊息:
Redundant argument in sprintf

這個不難解決,有人幫忙做了patch,我們將之下載,但在下載前,先把舊的檔案刪掉。
rm pmp-cacti-template
wget https://raw.githubusercontent.com/percona/percona-monitoring-plugins/master/cacti/bin/pmp-cacti-template

然後稍微修一下:
vi pmp-cacti-template

找到這一段:
my %hash_version_codes = (
把"0.8.6j" => "0013"的最後補上一個逗號,,
再新增add   "1.2.2"  => "0103"
我用的Cacti是1.2.2,因此我加上對應的0103。

接著我們要讓它產生新的hash,以配合Cacti的版本:
先做mysql的部份:
./pmp-cacti-make-hashes --refresh /usr/share/cacti/resource/percona/definitions/mysql.def > /usr/share/cacti/resource/percona/definitions/mysql_now.def

再來做Apache的部份:
./pmp-cacti-make-hashes --refresh /usr/share/cacti/resource/percona/definitions/apache.def > /usr/share/cacti/resource/percona/definitions/apache_now.def

再來要產出給Cacti import的XML檔。
perl pmp-cacti-template --script ../../../scripts/ss_get_by_ssh.php ../definitions/apache_nowdef > apache.xml
然後我們失敗了,得到一串字:
Both the meta file and the script file must have a version at pmp-cacti-template line 641.

好吧,回頭修一下,既然他說沒有版本資訊,我們就塞給他:
vi /usr/share/cacti/scripts/ss_get_by_ssh.php 
找到
$version = '$VERSION$';
改成
$version = '1.2.2';

接著再試試看有沒有正常產出:
perl pmp-cacti-template --script ../../../scripts/ss_get_by_ssh.php ../definitions/apache_nowdef > apache.xml

然後是mysql:
perl pmp-cacti-template --script ../../../scripts/ss_get_mysql_stats.php ../definitions/mysql_now.def > mysql.xml

接著你可以把檔案傳出來,再用cacti的介面上傳。
或者也可以用cli,然後你會遇到另一個問題,原因是你的filename後面要加上等號= (之前Cacti 1.2.15好像不需要加=號,這個問題我花了一段時間,最後去trace source code才發現...)

cd /usr/share/cacti
產出apache的xml:
php cli/import_template.php --filename=resource/percona/bin/apache.xml
產出mysql的xml:
php cli/import_template.php --filename=resource/percona/bin/mysql.xml
這樣就大功告成了,最後回到你的Cacti 在既有的device或者新增一個device,在Add Graph Template,可以找到像這種的東西,就真的是大功告成了。






2022年7月15日 星期五

cacti手動撰寫script建立template

最近在重寫cacti的template,做一個簡單的筆記,不然過幾年我又忘了。

我們針對的是script_server的部份

 1、通常是把scripts找一個適合的出來改。

cp ss_cisco_temperature.php test.php

vi test.php

function ss_cisco_temperature 上面都刪除。

但要載入必要的library,通常我會再加一點料,這樣要測試的時候比較好測試。

 error_reporting(0);

 include_once(dirname(__FILE__) . '/../include/global.php');

 include_once(dirname(__FILE__) . '/../lib/snmp.php');

 $cmd = "get";

 $arg1 = "rbnEntityTempCurrent";

 $arg2 = "104.1";

 $hostname = "1.2.3.4";

 $host_id = "30";

 $result = ssr_temperature($hostname, $host_id, "2:161:5000:1:10:iiiseed:::::: ", $cmd, $arg1 , $arg2 );

 print_r($result);

$cmd有兩種:index, num_indexes, 

$arg1有兩種:query (walk全部) get (get一個值)

如果$arg1是get的話,$arg2要填入你要查的oid。

之後要測試的時候很簡單,

把查詢的查參數改掉就好。

$result = ssr_temperature("139.175.240.150", "52", "2:161:5000:1:10:public:::::: ", $cmd, $arg1 = '', $arg2 = '');

php test.php

就可以驗證測試結果,把index,num_indexes, query arg2,get arg2

都各測一輪就差不多了。稍微看一下輸出的格式是否跟其它檔案或者與你預期的是否相符。

index就要列出所有的index

num_indexes要計算有幾個index 

query arg1(descr) ,通常是列出所有index及其對應的descr

query arg1(value) ,通常是列出所有index及其對應的value

以下兩個如果沒有show出來 (我的範例是沒有的,要自己print_r($result);

get arg1(descr) arg2(oid),先snmpwalk所有的index如果有相符的再秀出其oid對應的descr

get arg1(value) arg2(oid),取出該oid對應的value


之後就是調校data query, data template, graph template,通常我是duplicate其它的template後再進行修改。


在cacit 1.2.x版,有一個我常常忘記的設定,在建立data query時,需要Associated Data Templates,在建立Data Source後,後方的check box記得勾選,不然不會生效。







最後要提醒一下,把test.php還原成ssr_temperature.php時,我們會把前面的檔頭加回去,print call_user_func_array('ssr_temperature', $_SERVER['argv']); 這一行記得要更新成你命名的function 名稱,不然在執行時就無法執行了。


2022年7月13日 星期三

cacti Cisco IOSXR ASR temperature and Ericsson(Redback) SmartEdge/SSR temperature

 之前在cacti 0.8.x有寫過Cisco IOSXR ASR temperature and Ericsson(Redback) temperature。自己寫的原因是在網路上找不到。

但換成cacti 1.2.x後就不能用了。找了一陣子看過了幾年有沒有人放出來,但還是找不到。

本來想要修一修舊的就好,但修的不太順,索性寫個新的版本,希望下次cacti大改版時還能用啊。

Cisco的部份主要只有在ASR 9010測試過,理論上ASR 9006應該也可以。

但我沒有寫get的部份,在realtime的部份也許不能用(等要用再來修吧)

https://github.com/tiserle/cacti_asr_temperature

ericsson的部份比較麻煩,有限制版本。在SmardEdge的部份,SEOS6是一定不能用的(snmpd沒有吐資料),SEOS12可以用,SEOS11我手邊沒有得測,所以不知道,我猜可以。

最麻煩的是SSR ,在IPOS 18可以用,但要調cacti的參數,原因是他們的snmpd被snmpwalk爬時忘了設定limit,會一路爬到timeout,此外SSR對於snmpd的priority設定的很低,常常就不回資料,要等一下才行。如果要用的話記得在設備中的snmp timeout盡量拉長。這個是用snmp index寫的,比較簡單,但變化自然就比較少。

https://github.com/tiserle/cacti_ericsson_redback_temperature

後來手癢寫了script-server的版本,但同樣的,在設備中的snmp timeout還是要拉到50000 (50秒)才行。

https://github.com/tiserle/cacti_ericsson_redback_temperature

2021年9月29日 星期三

新版Cacti 如何import舊版的template ( How new Cacti import template of old Cacti)

這一題我好像解過,但久了又忘了,做一個記錄,避免久了再忘。

簡單來說,Cacti的所有template的xml檔都有一段:hash_xxoooo的文字。以下例而言,06代表功能,0024代表版本。

hash_06002419414480d6897c8731c7dc6c5310653e

我們可以簡單查詢0024代表的是0.8.8版

cat /usr/share/cacti/include/global_arrays.php  | grep 0024

        '0.8.8'  => '0024',

        '0.8.8a' => '0024',

        '0.8.8b' => '0024',

我們要從Cacti 1.2.18 import 這些template,就要修改這些hash的內容,要從0024改成0102 (0102是從下面的指令抓出來的),

cat /usr/share/cacti/include/global_arrays.php  | grep 1.2.18

        '1.2.18'  => '0102',

以此例而言,要把hash_060024 改成 hash_060102

但一個一個改太笨,可以的話當然是sed一行搞定,可惜我功力不強,試不出來。只好寫小程式來處理,範例如下。

#!/bin/bash

from=`grep -oe 'hash_..0024' test.xml | sort | uniq`

for value in $from

do

    to=`echo $value | sed 's/0024/0102/g'`

    sed -i "s/$value/$to/g" "test.xml"

done

PHP的版本:

<?php

 $version = "0102";

 $fp = file("test.xml");

 $myfile = fopen("output.xml", "w");

 foreach($fp as $line)

 {

  if(preg_match("/hash_/",$line))

  {

   $pos = strpos($line, "hash_");

   $orig = substr($line,$pos,11);

   $new = substr($line,$pos,7);

   $newstring = $new.$version;

   $line = str_replace($orig,$newstring,$line);

  }

  fwrite($myfile, $line);

 }

 fclose($myfile);

?>

如果要從cli import template的話,可以使用下列指令:

php /usr/share/cacti/cli/import_template.php --filename output.xml


Cacti 異常的原因 ( Poller Output Table not Empty )

之前在RHEL8裝了Cacti,之後再手動升版,但一直異常。Cacti的圖常常畫不出來。

昨天終於找到原因。原因是用yum install cacti時,他在/etc/crontab裡面會新增Cacti的poller的設定。

但我之前是手動在/etc/cron.d裡面新增cacti的poller,所以我同時有兩個poller在跑。

當時常見的log如下:

2021/05/16 03:30:02 - POLLER: Poller[1] NOTE: Poller Int: '300', Cron Int: '300', Time Since Last: '0.26', Max Runtime '298', Poller Runs: '1'

然後經常有Poller Output Table not Empty的log:

2021/05/16 03:30:02 - POLLER: Poller[1] WARNING: Poller Output Table not Empty.  Issues: 39, DS[828, 828, 827, 827, 826, 826, 804, 804, 799, 799, 798, 797, 796, 795, 794, 793, 792, 791, 790, 814], Additional Issues Remain.  Only showing first 20

試了很多方法,找了很多方法都解決不掉,後來就跑去用LibreNMS了...

在找到原因後,回頭再check當時的log,真的一看就知道問題所在。難怪當時同時會有兩個spine在執行,但當下真的不覺得奇怪。只能說,找到答案之後回頭看一切都是那麼合理。

2021/05/16 03:30:02 - POLLER: Poller[1] DEBUG: About to Spawn a Remote Process [CMD: /usr/local/spine/bin/spine, ARGS:  -C '/usr/local/spine/etc/spine.conf' --poller=1 --first=0 --last=61 --mibs]

2021/05/16 03:30:02 - POLLER: Poller[1] DEBUG: About to Spawn a Remote Process [CMD: /usr/local/spine/bin/spine, ARGS:  -C '/usr/local/spine/etc/spine.conf' --poller=1 --first=0 --last=61]



2021年3月9日 星期二

如何在librenms新增你想要抓的東西,例如記憶體使用量(率)、風扇轉數等等...

前言:

其實這個題目我寫的有點心虛,因為我對librenms其實不太熟...之前裝librenms就是裝好能用,然後定期更新而已。

直到這一次公司買了新的設備 Ericsson SSR 8010。librenms內建的模組沒有辦法抓到它記憶體使用量及風扇轉速,因此我只好以『自己』的方式來處理。如果有觀念錯誤的地方煩請指正或指點。

以下切入正題:

重要觀念:

在librenms要新增資料,有兩種方式:dicovery、poller。這兩者以我的認知而言,doscovery用在第一次新增裝置或之後設定rediscovery時使用,而poller則是用在設備上線後的維運。但以我這一次維護而言,mempools及storage在discovery及poller都要設定。但fanspeed及temperature只需要設定discovery...我也不知道為什麼。也許之後有機會再研究。

關於除錯:

先講除錯的部份,如果我們不曉得怎麼去看程式的輸出就無法除錯。因此除錯的部份是最重要的。

以discovery而言:

cd /opt/librenms

./discovery.php -h 74 -d -m mempools

以poller而言:

./poller.php -h 74 -d -m mempools

-h指的是設備編號,在設備的連結可以看出來。

-d代表debug,但資訊太多。我覺得不是很好用。

-m指的是要看的模組,如果指定的話比較不會被一堆資訊蓋掉。

當然,你也可以在設備的設定介面,在modules這邊把不需要的關閉。但關閉的時候要小心,我不曉得關到哪一個把網路介面給關掉,找不到解法,最後只好把設備刪除再重新新增一次。

設備的預先定義在:

/opt/librenms/includes/definitions

檔名為seos.yaml,
內容如下:os: seos
text: 'Redback Networks SmartEdge'
type: network
icon: ericsson
mib_dir:
    - ericsson
discovery:
    - sysObjectID:
        - .1.3.6.1.4.1.2352.1
bad_iftype:
    - l2vlan
    - softwareLoopback
我只有新增bad_iftype的部份,把vlan及loopback IP加入,讓它不去爬流量。

mempools:

接著我們講怎麼抓記憶體的資訊,先切換至

/opt/librenms/includes/discovery/mempools

新增seos.inc.php這個檔案:
<?php

if ($device['os'] == 'seos') {
    echo 'SmartEdge(SSR): ';

    $used  = snmp_get($device, '.1.3.6.1.4.1.2352.2.16.1.2.1.4.1', '-OvQ');
    $free  = snmp_get($device, '.1.3.6.1.4.1.2352.2.16.1.2.1.3.1', '-OvQ');
    $used = $used*1024;
    $free = $free*1024;
    $total = ($free + $used);
    $percent = ($used / $total * 100);
    //echo "used:$used free:$free :total:$total percent:$percent";
    if (is_numeric($total) && is_numeric($used)) {
        discover_mempool($valid_mempool, $device, 0, 'seos', 'Memory', '1', null, null);
    }
}
我參考的是f5.inc.php這個檔案,將其複製後再加以修改而成。*1024的目的是因為它輸出的是KB。
在測試的時候。可以把echo那一行的註解拿掉,觀察其輸出是不是跟我們想像的一樣:

我們回到/opt/librenms,並執行:
./discovery.php -h 74 -m mempools

#### Load disco module mempools ####
FORTIAUTHENTICATOR-MEMORY-POOL: FORTISANDBOX-MEMORY-POOL: SmartEdge(SSR): used:1084664000 free:48010928000 :total:49095592000 percent:2.2092899908407.

>> Runtime for discovery module 'mempools': 0.1420 seconds with 86408 bytes
>> SNMP: [9/0.13s] MySQL: [2/0.00s] RRD: [0/0.00s]
#### Unload disco module mempools ####

檢查一下輸出的部份是不是都有我們預期的數字 格式正不正確,接著我們把echo該行加上註解,再重新執行一次:
./discovery.php -h 74 -m mempools
可以看到這一段,(MIB檔名顯示有誤但不影響)
#### Load disco module mempools ####
FORTIAUTHENTICATOR-MEMORY-POOL: FORTISANDBOX-MEMORY-POOL: SmartEdge(SSR): .
可以看到紅色的一點,如果是+號代表新增,如果是U代表update,.就猜不出來了,猜想是沒有變化。接著我們要到poller去做一次類似的事,
目錄在:
/opt/librenms/includes/polling/mempools
seos.inc.php的內容如下:
<?php

// Simple hard-coded poller for SmartEdge

echo 'SmartEdge(SSR) MemPool'.'\n';
$used = snmp_get($device, '.1.3.6.1.4.1.2352.2.16.1.2.1.4.1', '-OvQ');
$user = $used * 1024;
$free = snmp_get($device, '.1.3.6.1.4.1.2352.2.16.1.2.1.3.1', '-OvQ');
$free = $free * 1024;
$mempool['total'] = ($free + $used);
$mempool['free']  = $free;
$mempool['used']  = $used;
這個程式很簡單,由於輸出是KB,因此我也乘以1024。

其它的部份,包含storage、fanspeed及temperature相差不多。注意一下所在的目錄(環境類的會收在sensors這個目錄),還有要參考的檔案就好了。感覺是不用特別示範。我覺得比較有趣的是temperature,它的SNMP輸出是這樣:
iso.3.6.1.4.1.2352.2.4.1.5.1.2.1.1 = STRING: "Fan unit 1 on slot FT1"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.1.2 = STRING: "Fan unit 2 on slot FT1"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.1.3 = STRING: "Fan unit 3 on slot FT1"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.1.4 = STRING: "Fan unit 4 on slot FT1"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.1.5 = STRING: "Fan unit 5 on slot FT1"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.1.6 = STRING: "Fan unit 6 on slot FT1"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.2.1 = STRING: "Fan unit 1 on slot FT2"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.2.2 = STRING: "Fan unit 2 on slot FT2"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.2.3 = STRING: "Fan unit 3 on slot FT2"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.2.4 = STRING: "Fan unit 4 on slot FT2"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.2.5 = STRING: "Fan unit 5 on slot FT2"
iso.3.6.1.4.1.2352.2.4.1.5.1.2.2.6 = STRING: "Fan unit 6 on slot FT2"
它有兩層,(1.1~1.6還有2.1~2.6),要想辦法把它塞在同一個array,再一次輸出。我是用土砲硬幹的方式做的,一定有更有趣的方法。也許有空再來玩。

這一些檔案我都放在我的github上。
https://github.com/tiserle/librenms-seos
有需要的話可以上來參考。但硬幹的部份笑笑就好。
另外我不太會操作github,所以如果用起來很奇怪請忽略...






2020年7月7日 星期二

librenms ignore sub-interface (dot1q pvc)

用librenms時,我不想要讓它去爬設備上的sub-interface,那要怎麼處理呢?

每一個版本不同,依現在的版本:1.64.1的話

/opt/librenms/includes/definitions

編輯seos.yaml

新增以下設定:
bad_iftype:
    - l2vlan

2019年5月8日 星期三

cacti 破圖的處理方式及Get Script Server Data及Get Script Data的差異

運氣很不好,cacti用別人寫的Cisco ASR的CPU及記憶體 template突然破圖。

先做基本查錯。
在log看到以下訊息:
ERROR: Input Expected, Script Server Terminating
PHP Script Server communications lost.  Restarting PHP Script Server

查了網路上的教學,一般是建議手動執行script_server.php來除錯。但我一執行就有錯誤訊息:(在另一台主機就沒有)
php -q script_server.php
PHP Script Server has Started - Parent is cmd
ERROR: Input Expected, Script Server Terminating

網路上有人教更進一步的除錯,終於有了比較明顯的訊息。感覺是主機的問題,造成parser時好時壞。(這主機很多人在裝套件我自己也更新過PHP之類的),不曉得是哪一個環節出了問題。
php -q poller.php --force --debug
/usr/share/cacti/site/scripts/ss_cisco-cpm.php: line 1: ?php
:
/usr/share/cacti/site/scripts/ss_cisco-cpm.php: line 2: /bin:
/usr/share/cacti/site/scripts/ss_cisco-cpm.php: line 3: syntax error near unexpected token `$_SERVER["argv"][0]'
/usr/share/cacti/site/scripts/ss_cisco-cpm.php: line 3: `if (!isset($_SERVER["argv"][0]) || isset($_SERVER['REQUEST_METHOD'])  || isset($_SERVER['REMOTE_ADDR'])) {
'
此題暫時無解,就再觀望一下吧目前是用另一台librenms先頂著用。

順便比較一下Get Script Server Data與Get Script Data的差異:


Get Script Server Data(Indexed):
在執行的時候需要指定function (ss_ciscocpm),因此只能在script_server.php的環境下除錯 (但在我的狀況下由於一執行script_server就當掉,因此無法除錯)
SERVER: /usr/share/cacti/site/scripts/ss_cisco-cpm.php ss_ciscocpm mydevice 55 2:161:5000:1:10:public:::::: get 1min 2082, output: 2


Get Script Data(Indexed):
不用指定function,因此也可以直接在cli下除錯。
SCRIPT: /usr/share/cacti/site/scripts/ss_cisco-cpm.php mydevice 55 2:161:5000:1:10:public:::::: get 1min 2082, output: U

例如:
php -q /usr/share/cacti/site/scripts/ss_cisco-cpm.php mydevice 4 2:161:5000:1:10:public:::::: get 1min 82

2018年6月9日 星期六

關於cacti script_server 的使用方法 (How to program cacti script_server)

搞了幾天才搞好,來做個記錄:
我其實是在弄cacti批次讀取ASR的溫度並繪圖的功能一開始想要自己寫(去年已經寫過ERX版的了,記得難度不高)。程式不難寫,但建完index之後,沒有辦法query module name,試了一兩天都搞不定(再加上那幾天電話跟派案很多,根本沒有辦法好好測試)。後來有空了,再回頭去抄自己的程式,才發現問題在XML檔。之後就順利query了。
原以為順利query之後,就可以簡單get value,但又卡了兩天,原因又是我去年沒有仔細看教學跟說明,就直接抄別人的東西又運氣很好的做出來。今天仔細看了說明,才知道自己的問題在哪,之後就順利把圖弄出來了。問題還是在XML檔。剛好是跟query當時相反的設定。原因在於Cacti在scrips_server以及scrips_query定義的方式不同。但我一開始抄的時候沒有弄的太清楚就趕時間硬上,反而花了很多時間。
在解決問題之前,最好還是能把問題弄懂,可以省下很多時間。



如果要用script_server的方式來執行,





這兩行都一定要加,否則之後在polling時無法輸出 (都是U)
XML的格式很重要,不然script_server不吃,之後就沒有辦法輸出。


最後是測試方法:
[root@MARS /]# /usr/bin/php /usr/share/cacti/site/script_server.php
PHP Script Server has Started - Parent is cmd
/usr/share/cacti/site/scripts/iosxr_temperature.php iosxr_temp 1.1.1.1 4 2:161:500:1:10:public:::::: get temperature 52737404
PHP Parse error:  syntax error, unexpected '}' in /usr/share/cacti/site/scripts/iosxr_temperature.php on line 109


這樣就能debug了。





2017年1月12日 星期四

RRD檔爆值導致數值爆表時的處理方式 (RRD破圖)

之前有建一些RRD檔來收設備的流量,後來就順便弄一個日報表看來有沒有線路需要擴頻或者調節頻寬的。一開始也順順的,但後來就開始遇到爆量這件事。









後來由於有更重要的報表要參考這些流量,因此只好認真的來解決這個問題。
在網路上翻了一下之後就確定問題了。

原因是我建立rrd檔時,沒有設定正確的上限值,為避免麻煩我都是定『U』,代表不做上限。

但設備的2^64的counter遲早都是會爆的,它爆了之後,rrdtool不曉得該如何處理,就幫你單純的用減法來減,因此在剛爆的時候,數值一減都很驚人。 (試想0-2^64的值有多大)

有想過很多的解法,例如異常值不進RRD檔,這邊的作法有兩種,一者是若第一名的流量是第二名的10倍以上就放棄它。(然後用遞迴來處理....),第二種作法是先確定線路的最大頻寬若流量大於它就將之放棄。但經過實驗證實,這兩種方法都很爛。所以才有了修正RRD檔的作法 。

修正RRD檔的作法其實也很簡單,就把它dump出來,修正一下上限再倒回去就好了。問題是,上限該怎麼決定呢?


如果你有用cacti的話,可能會有印象,cacti使用的值的來源應該就是它去抓取介面的SNMP MIB的ifSpeed的值。用這個值其實就可以了。一般是10^8(100M)或10^9(1G)

但我的線路有很多種,往上還有2.5G及5G,我就設定為10^10。(不過在實務上我還是把它除以8,因為我認為ifSpeed是bit,應該要用snmpget到的byte來算會比較準)

2017/01/20 補充後續:
之前設定3.1250000000e+08的時,估計最大頻寬是2.5G,果然今天就破圖了
不過這也證明了,小弟的假設是正確的。max的準確設定值確實應該以BYTE來計算。
但如果要偷懶還是以cacti的預設值:10,000,000,000來填入吧,這樣最大值是80Gbps流量,除非用100Gbps的port,不然應該很難再破圖。



2011年6月3日 星期五

OpenNMS的安裝、設定及簡易操作說明

這個是2008年的某個期末報告。
國內對於OpenNMS介紹的相關文章並不多。
因此我整理一下我安裝和操作的流程,希望需要的人可以有資料可以參考。

n安裝平台:Ubuntu 8.04 LTS Server edition
安裝版本:OpenNMS Development 1.5.91

需額外安裝軟體:
Sun JDK 1.5
PostgreSQL 8.2
rrdtool

前置作業:
首先要編輯/etc/apt/source.list,增加以下來源:
deb http://debian.opennms.org/ unstable main
deb-src http://debian.opennms.org/ unstable main

接著我們增加OpenNMS 的PGP Key 到APT
wget -O - http://debian.opennms.org/OPENNMS-GPG-KEY | sudo apt-key add -

安裝 Java SDK
我們使用apt-get安裝
sudo apt-get install sun-java5-jdk

驗證版本
java -version

如果之前有安裝過tomcat4或jre時,需重新選擇要使用的套件
指令如下:
sudo update-alternatives --config java

下載OpenNMS
下載安裝OpenNMS及相關套件,此步驟會一併下載及安裝rrdtool及postgresql
export SKIP_IPLIKE_INSTALL=1
sudo apt-get update
sudo apt-get install opennms
export OPENNMS_HOME=/usr/share/opennms

設定資料庫
此步驟要編輯pg_hba.conf及postgresql.conf
檔案都存放在/etc/postgresql/8.2/main

先編輯pg_hba.conf,設定本機認證方式
local all all ident sameuser
host all all 127.0.0.1/32 md5
host all all ::1/128 md5
修改為:
local all all trust
host all all 127.0.0.1/32 trust
host all all ::1/128 trust

接著我們編輯postgresql.conf
找到 listen_addresses = ‘localhost’ ,將前面的#號刪除
之後重啟postgresql
/etc/init.d/postgresql-8.2 restart

設定OpenNMS
我們先告訴OpenNMS,Java在哪裡
OPENNMS_HOME/bin/runjava -s

接著我們啟始OpenNMS及資料庫
OPENNMS_HOME/bin/install -dis

之後再宣告Java Home的所在
export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun

最後我們執行opennms
/etc/init.d/opennms start

到這個階段我們可以試著登入opennms試試囉,
預設的網址在:

http://yourhost:8980/opennms/
( yourhost記得代換為自己使用的IP。)

帳號及密碼預設都為 admin/admin

接下來是介面說明的部份,由於是從簡報檔案擷取下來的,因此看起來可能會有點怪怪的。

OpenNMS的功能表

Node List – 提供Node的資訊
Search – 搜尋Node
Outages – 搜尋失聯的Node
Path Outages – 路徑異常功能
Dashboard – 儀表板
Events – 事件
Alarms – 告警
Notifications – 通知
Assets – 資產
Reports – 報表
Charts – 圖表
Surveillance – 監督
Admin – 管理
Help – 協助


登入畫面

Nodes with Outages
失聯的節點
Percentage change over past 24 hours
24小時內變化的百分比
Notification
Resource Graphs
KSC Reports
Key SNMP Customized ,自己指定要看的snmp data,並可以自訂時間軸及圖的種類

















功能介紹- Node List

提供Node的資訊
服務的可用性
介面
通知
近期事件
近期失聯記錄














功能介紹- Search

當監控的Node數量多時可以快速找到要找的Node
依名稱關鍵字搜尋
依IP搜尋
以IP別名搜尋
以提供的服務搜尋
以MAC address搜尋
以資產類別搜尋
以資料所在搜尋

功能介紹 - Outages

當失聯的Node數量多時可以快速找到要找的Node
以Outages id來搜尋
列出目前失聯的Node
列出所有失聯的Node

功能介紹- Path Outages

Path Outages提供路徑異常功能,若該點失聯,則它以下的節點都不會列為失聯。
功能是釐清事件,能更準確的識別問題點。
以下圖為例,若將10.1.3.254設定為10.1.3.1~3的Path Outages,若10.1.3.254失聯時,10.1.3.1~3不會列入失聯記錄中。



功能介紹- Dashboard

針對Router、Switch及Server等重要設備提供快速資訊的查看,提供以下功能:
Alarms
Notifications
Node Status
Resource Graphs
也可以自訂除了Router、Switch及Server以外的類別
















功能介紹- Events

提供查看Events的介面
以Event ID來搜尋
列出目前所有的Event
提供進階搜尋功能
所含內文
IP
Label
等級
服務
時間
















功能介紹- Alarms


提供查看Alarms的介面
以Alarm ID來搜尋
列出目前所有的Alarms
提供進階搜尋功能
所含內文
IP
Label
等級
服務
時間
















功能介紹- Notifications

查詢通知記錄
以User或Notices內容來搜尋
針對登入的使用者的notices
列出送出的notices
列出已被認知的notices

功能介紹- Assets

查詢資產資料
以資產類別搜尋
列出所有節點的資產資訊

功能介紹- Reports

製作報表
Resource Graphs
KSC Performance, Nodes, Domain
Availability
Statistics Reports

功能介紹- Charts
















功能介紹- Surveillance
















功能介紹- Admin

Configure Discovery
Configure Users, Groups and Roles
Configure Notifications
Manage and Unmanage Interfaces and Services
Configure SNMP Data Collection per Interface
Configure SNMP Community Names by IP
Add Interface
Delete Nodes
Import and Export Asset Information


Scheduled Outages
Manage Surveillance Categories
Manage Applications
Manage Provisioning Groups
Manage Thresholds
Manage Location Monitors