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年9月12日 星期日

如何使用vba下載郵件並上傳至伺服器

程式很簡單,監控outlook的郵件主旨,然後將符合主旨的附檔存下來(這部份很簡單就成功了,網路上很多可以參考的範例)。

一開始當然是要讓outlook可以使用開發者功能,才能寫VBA程式。


接著我們開始建立專案,把程式寫好。


最後就是建立規則,這邊的關鍵是要『執行程式碼』,不是『執行程式』。












接著把附檔丟到我的linux server上,然後linux server會去檢查檔案是否存在,在的話把它匯入資料庫。
要在outlook開發程式只能用vba,但vba要呼叫tftp一直時好時壞。難怪前輩們都是用scp或sftp....

這邊簡單補充一下,一般是用excel先做測試,先開啟開發者功能,然後允許巨集,接著插入一個模組,把程式丟到模組,就可以測試了。測試完成後,再回到outlook,用alt+F11就可以開啟VBA編輯介面(建議outlook也要開啟開發者功能並允許使用巨集),接著產生新的outlook規則,然後呼叫程式碼(我之前一直選成呼叫應用程式)

但在公司不管用tftp或scp都失敗。(有幾次成功,但...不穩定的東西誰敢用)
在家裡用tftp跟scp倒是都成功。
看來是tftp client的問題嗎或者環境問題嗎?在公司換了一個tftp client,結果輕易成功了。Windows 10預設的tftp.exe 可能在AD環境執行有一些權限限制吧?

附上簡單範例範例:
Sub uploadfile()
ChDir "D:\TEMP" ' Make "D:\TEMP" the current folder.
ChDrive "D" ' Make "D" the current drive.
Dim wsh As Object Set wsh = VBA.CreateObject("WScript.Shell") Dim waitOnReturn As Boolean: waitOnReturn = True Dim windowStyle As Integer: windowStyle = 1 wsh.Run "d:\temp\upload.bat", windowStyle, waitOnReturn
end Sub

upload.bat的內容如下:
cd d:\temp
d:
tftp.exe -i 192.168.1.2 PUT "my test.xlsx"
另外有幾個要特別留意的問題,在處理過程中比較常遇到的,雖然排除了但我沒有認真回頭去看哪些不需要。
1、vba shell timeout
2、vba shell path
3、vba dir & driver
4、vba shell mode and WScript.Shell
5、chr 34 and double quote (") , and """" & 總之就是雙引號之類的問題


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,所以如果用起來很奇怪請忽略...






2021年2月14日 星期日

AMD Ryzen 3 3100搭配技嘉 B450M GAMING安裝黑蘋果macOS Big Sur

 

趁過年來整理一下黑蘋果的教學。這一次使用的硬碟是AMD Ryzen 3 3100搭配技嘉 B450M GAMING。網路上的教學很少,所以自己弄了一份。

顯卡的部份是AMD RX570,macOS Big Sur原生支援,因此螢幕也直接抓到了。不需再做其它設定。

現在安裝黑蘋果又比以前更容易了,可以使用Recovery mode來安裝,不需要下載整個OS下來測試,如果是像筆者這種笨笨try and error的人,可以省下很多時間。這主要是因為OpenCore取代了使用了很多年的clover的關係。使用OpenCore的原因有很多,總之就是時代的改變

 

安裝的部份,中文的網頁比較亂,因此我們參考這個網頁:

https://manjaro.site/how-to-create-macos-big-sur-installer-from-windows-10/

 

要安裝gitPython,接著下載OpenCore程式:

git clone https://github.com/acidanthera/OpenCorePkg

 

執行cmd,接著切換到macrecovery目錄:

cd OpenCorePkg-master\Utilities\macrecovery"

 

我們要安裝Big Sur,因此參數修改如下:

python macrecovery.py -b Mac-E43C1C25D4880AD6 -m 00000000000000000 download

 

會下載這兩個檔案:

BaseSystem.dmg

BaseSystem.chunklist

加起來只有625MB

 

接著準備一個隨身碟,使用FAT32格式,磁碟名稱為EFI,建立資料夾,名稱為:com.apple.recovery.boot

接著把BaseSystem.dmgBaseSystem.chunklist這兩個檔案放進去。

 

接著把在EFI磁碟中,再建立一個名為EFI的資料夾。接著下載

https://github.com/acidanthera/OpenCorePkg/releases/download/0.6.6/OpenCore-0.6.6-RELEASE.zip

將之解壓縮之後,把

X64\EFI裡的兩個資料夾BOOTOC都複製到EFI磁碟裡的EFI資料夾中。這個是正規的作法(但其實我沒有用到)

 

接著是重頭戲,需要自己準備能讓黑蘋果開機的相關檔案及設定。筆者失敗了數次後,才發現原作者有提供其使用的設定範例:

 

https://manjaro.site/hackintosh-download-zone/hackintosh-efi-download-for-intel-and-amd-system/#B_AMD_Platform

 

我們直接下載MSI B450I Gaming Plus AC Hackintosh OpenCore 0.6.4 EFI,這個檔案。下載後檔名應該是Hackintosh-Ryzen-MSI-B450I-master.zip將之解壓縮後,取出其BOOTOC資料夾,複製到EFI磁碟中的EFI資料夾。

 

由於我們要用recovery mode,需要開機時就載入網路卡。我們編輯

EFI磁碟中,EFI\OC裡的config.plist (我在此使用的是Notepad++作為編輯工具,我們只是要加XML,因此沒有用到較視覺化的編輯工具)

 

Root -> Kernel -> Add中,新增以下XML(AddArray)

 

                        <dict>

                                <key>BundlePath</key>

                                <string>RealtekRTL8111.kext</string>

                                <key>Comment</key>

                                <string>RTL8111</string>

                                <key>Enabled</key>

                                <true/>

                                <key>ExecutablePath</key>

                                <string>Contents/MacOS/RealtekRTL8111</string>

                                <key>MaxKernel</key>

                                <string></string>

                                <key>MinKernel</key>

                                <string></string>

                                <key>PlistPath</key>

                                <string>Contents/Info.plist</string>

                        </dict>   

 

新增完成後會像這樣:(用視覺化的工具查看,例如plistEditor ProProperTree)

 


 之後進BIOPS設定用隨身碟開機,記得選UEFI開頭的(BIOS的設定請上網找一下,應該滿街都是),開機後記得進入CLI mode設定網路卡(筆者的環境是dhcp環境)

設定方式如下:

ifconfig en0 up

ipconfig set en0 DHCP

如果要手動設定IP的話:

ipconfig set en0 INFORM 192.168.0.150

設定gateway:(有點忘了,不是很確定)

route add default 192.168.0.1

要上網的話還需要設定dns server,但....我要設定的時候DHCP突然通了。所以沒有研究。

好像也是編輯/etc/resolv.conf


這邊筆者失敗數次(手動設定IP但網卡一直active/inactive)後來放著去吃飯,回來一看DHCP突然生效了。有網路之後就可以使用recovery mode從網路上下載OS並安裝。這部份沒有什麼特別的,就不再額外說明。

 

另外提醒一下,在安裝OSX時,分割磁碟前要記得先割一個200MB左右的FAT32分割區,名為EFI,同樣的把你剛隨身碟的內容整個COPY過去,之後安裝完成後才可以用OSX碟開機。(不然你之後只能用隨身碟開機),筆者是兩種作業系統各獨立一個硬碟,使用OSX碟開機時會載入OpenCore,它也會抓到Windows 10,因此也可以從Windows 10開機。

2021年1月18日 星期一

鍵盤按一次`出現兩個``,還有按一次'會出現兩個''的解法

 之前鍵盤按一次`出現兩個``,還有'會出現兩個'',本來想說也沒有關係。但最近半夜被挖起來處理障礙。因為這個問題一直打錯密碼被鎖帳號。

今天買了新鍵盤,但問題還是相同,看來不是鍵盤的問題。只好下定決心把問題解決。

試了一下,是因為我有設定英文鍵盤的關係。英文鍵盤其實有分United States-國際跟US兩種,只要修改為 US這個問題就自動解決了。






2021年1月9日 星期六

AMD CPU支援GNS3 L2 switch相關設定

 換成AMD CPU之後,GNS3的L2 switch就不能跑了。原先一直以為是AMD CPU不支援HAXM的關係。今天福至心靈換了關鍵字查了一下,原來只是記憶體開的太小的關係 (說也奇怪,在Intel平台開256Mb就夠了,在AMD平台要開到1024Mb,也許我用的img檔不一樣吧)

😓