[toc] # 測試目標 :::success 透過 Infoblox WAPI 建立 RPZ 清單,採用 cURL 命令 或 Postman 軟體執行 API 請求達成目標 ::: Infoblox 有提供 REST API (Web-based Application Programming Interface, WAPI),可讓管理者輕鬆將 NIOS 整合至自動化環境。 對於 Infoblox WAPI 官方有份文件 [[**Infoblox REST API NIOS 8.6**]](https://www.infoblox.com/wp-content/uploads/infoblox-deployment-infoblox-rest-api.pdf),其中提供詳細 API 說明及範例,有興趣可以參考。 :::info 瀏覽器網址列輸入 **`https://<infoblox_ip_address>/wapidoc`**,則提供 WAPI 線上文件。 ![](https://hackmd.io/_uploads/H14u85n22.png) 目前 WAPI 版本為 **2.12.3**。 ::: REST API 運作架構,透過命令或程式與 Infoblox 進行互動,達成靈活及彈性的應用。之後會透過簡單的 **Curl 命令**或 **Postman 軟體**執行操作測試。 <img width=480 src='https://hackmd.io/_uploads/ryy5bthnn.png'><br> 以下將針對**建立 Response Policy Zones(RPZ) 清單部份**做簡易說明(文件 pp.48 - 56),設定 RPZ 清單後可從原廠的情資中心定期更新資料庫來進行阻擋保護,一般方式會從原廠提供的 RPZ 清單,逐條手動輸入相關資訊建立完成,這裡想**透過 WAPI 方式自動化完成該項作業**。 # 使用 GUI 設定 RPZ 清單 在使用 API 方式建立 RPZ 清單前,我們先了解一下,傳統上**設定一組 RPZ 項目**,至少需要完成下列步驟: 1. 先使用瀏覽器登入 NIOS 2. 點選 **Data Management** 3. 選擇 **DNS** 4. 選擇 **Response Policy Zones** 5. 點選 **`+`** 新增 RPZ 項目 6. 選擇 **Add Response Policy Zone Feed** > Next 7. 輸入 **Name** 8. 調整 **Policy Override** [選項] 9. 調整 **Severity** [選項] > Next 10. 選擇 **Name Server Group**(ns_group)> **Save & Close** 然後根據項目數量,重複執行上述相同步驟完成建立任務。 :::warning - 原廠提供 **RPZ 清單目前計有 17 組**,所以用手動輸入建立 RPZ 清單的操作方式,需要**執行上述步驟 17 次**。 - 這裡還似乎忘記了要事先建立 **Name Server Group**(ns_group)。 ::: ![](https://hackmd.io/_uploads/r1Hf_Fn3n.png) # API 測試 ## 操作 API 工具 操作 API 最簡單的工具就是 **Curl 命令列**,原廠文件也是以此工具作為基礎。該工具在 Linux/MacOS 應該都是預設安裝的套件。所以初期測試工具也是以 Curl 命令為主。 後續再使用 **Postman 軟體**,相關軟體應用,可以參考 [[**使用 Postman 初探 Infoblox Web-based API(WAPI) 測試**]](https://hackmd.io/@farmer87/postman_infoblox_wapi_00)。Postman 軟體降低了 API 應用的複雜程度,也可作為命令或程式進行 API 開發的輔助工具。 好了,到此就先當作跟我一樣有 API 基本概念來進行測試了。 ## Schema 使用 cURL 進行 Infoblox API 連接測試,根據 [[官方文件 p.11]](https://www.infoblox.com/wp-content/uploads/infoblox-deployment-infoblox-rest-api.pdf) 說明,將必要的參數用變數指定,先對於 **Schema** API 進行首次查詢。 **API Call** (p.11) ![](https://hackmd.io/_uploads/BJB09E7ah.png) 以下就是使用 cURL 命令執行的**腳本範例**: ```bash ## 指定 Grid Master 及 API 請求資訊 grid_master_ip='10.7.155.91' grid_master_user='admin' grid_master_pass='infoblox' login="${grid_master_user}:${grid_master_pass}" wapi_ver='v2.12.3' wapiUri="https://${grid_master_ip}/wapi/${wapi_ver}" ## API 請求 curl -s -k -u ${login} -X GET "${wapiUri}/?_schema&_return_as_object=1" ``` **執行結果** 系統回覆查詢成功!回傳 API v2.12.3 支援的查詢物件。 ![](https://hackmd.io/_uploads/HJnsjEQpn.png) 按照這個範例,參考 Infoblox WAPI 官方文件,再執行幾個 API 查詢試試。 ## Get Members **API Call** (p.83) ![](https://hackmd.io/_uploads/r1sB0VXah.png) **腳本範例** ```bash grid_master_ip='10.7.155.91' grid_master_user='admin' grid_master_pass='infoblox' login="${grid_master_user}:${grid_master_pass}" wapi_ver='v2.12.3' wapiUri="https://${grid_master_ip}/wapi/${wapi_ver}" curl -s -k -u ${login} -X GET "${wapiUri}/?member?_return_as_object=1" ``` **執行結果** ![](https://hackmd.io/_uploads/Hy9JLVEan.png) ## Get details of a member based on its IPv4 address **API Call** (p.84) ![](https://hackmd.io/_uploads/S1jrmrXan.png) **腳本範例** ```bash grid_master_ip='10.7.155.91' grid_master_user='admin' grid_master_pass='infoblox' login="${grid_master_user}:${grid_master_pass}" wapi_ver='v2.12.3' wapiUri="https://${grid_master_ip}/wapi/${wapi_ver}" curl -s -k -u ${login} -X GET "${wapiUri}/member?ipv4_address=${grid_master_ip}&_return_fields%2B=vip_setting&_return_as_object=1" ``` **執行結果** ![](https://hackmd.io/_uploads/BkilQrmTn.png) ## Modify the name of a member **API Call** (p.86) ![](https://hackmd.io/_uploads/rk-BaVNa2.png) - 若要透過 API 調整設定,就會使用 **PUT** 請求,會需要指定對象(物件),上面看到的 <font color=red>member/b25IL...ZSQw:infoblox.localdomain</font> 就是參照物件。 - 對於參照物件需要先使用 **GET** 請求來取得,所以通常在進行 **調整設定 (PUT)** 或 **刪除設定(DELETE)** 前,都會需要先取得變動物件的參照值 (Object Reference)。 - 另外使用 **PUT** 請求時,會需要在 **BODY** 部份加入所需調整的項目資訊,使用 **`--data`** 可以將資訊內容帶入,一般都會採用 **JSON 格式**。 - 如果要調整的資訊內容有點多或複雜,可以採用將內容儲存成**檔案**,在進行 API 請求時直接引入檔案即可。可參考下面 [[**建立 Name Server Group**]](#建立-Name-Server-Group) 部份。 **腳本範例** 其實沒有很困難,只是步驟多一點,根據上面的運行概念,撰寫簡單的執行腳本即可。 ```bash grid_master_ip='10.7.155.91' grid_master_user='admin' grid_master_pass='infoblox' login="${grid_master_user}:${grid_master_pass}" wapi_ver='v2.12.3' wapiUri="https://${grid_master_ip}/wapi/${wapi_ver}" ## 指定 Grid Member 資訊 grid_member_ip='10.7.155.92' ## 查詢 Grid Member 資訊 curl -s -k -u ${login} -X GET "${wapiUri}/member?ipv4_address=${grid_member_ip}&_return_as_object=1" ``` **執行結果一** ![](https://hackmd.io/_uploads/HJpT5PNpn.png) 結果顯示目前 Grid Member 的查詢資訊: - **參照物件 (_ref)**: **`member/b25lLnZpcnR1YWxfbm9kZSQ0:test.infoblox.localdomain`** - **主機名稱 (host_name)**: **`test.infoblox.localdomain`** 接著持續進行。 ```bash ## 將指定物件參照值放入變數 grid_member_ref=$(curl -s -k -u ${login} -X GET "${wapiUri}/member?ipv4_address=${grid_member_ip}&_return_as_object=1" | jq -r '.result[]._ref') && echo ${grid_member_ref} ## 指定 Grid Member 欲調整的主機名稱 grid_member_hostname='reporting.infoblox.localdomain' ## 執行主機名稱變更 curl -s -k -u ${login} -X PUT "${wapiUri}/${grid_member_ref}" --header 'Content-Type: application/json' --data "{ \"host_name\": \"${grid_member_hostname}\" }" ``` **執行結果二** ![](https://hackmd.io/_uploads/HJWxwtNan.png) 執行完成後,再次查詢內容,顯示 Grid Member 主機名稱已變更為 **`reporting.infoblox.localdomain`**。 :::info 透過上面展示的 API Call 方式也可以完成以下程序: - 加入 Grid 成員 (Add a member to the grid, **p.87**) - 觸發成員加入 (Initiate member join, **p.89**) - 設定 Grid NTP 設定 (Configure NTP, **p.81**) - 啟用 DNS 服務 (Enable DNS Service on a member, **p.87**) 其他部份可自行參考文件測試。 ::: 大致上就跟一般 API 使用方式相同,接著就直接切入**目標: 設定 RPZ 清單**。 # 組態 RPZ ## 建立 Name Server Group 設定 RPZ 清單前,請先完成 **Name Server Group (NS Group)** 建立,由於我們會採用原廠提供的情資中心定期更新 RPZ 清單,所以參考原廠提供的設定資訊,先增加一組 **External Primary Name Server**,此時系統會要求設定 **Grid Secondary**,所以第二組 Name Server 就指定 Grid Master 即可。 :::warning - 若是有設定 Name Server 使用 **External Primary**,則 **Grid Secondary** 則為必要設定條件,且會以 **Grid Primary** 作為組態參數。(**`use_exteral_primary`**) - 可獨立組態 **Grid Primary**。 - 由於原廠提供的 Name Server 採用 **TSIG** 確保訊息安全,請根據內容完成 **External Primary** 配置。 ``` RPZ IP: 61.216.*.* Key Name: TSIG-******* Key Algorithm: HMAC-MD5 Key Data: D5bU9A9GkKna6w4*********************Bw3g== ``` ::: 由於 Infoblox 也提供 API 配置 NS Group,這裡就直接採用 API 配置也較為簡便。 **API Call** (P.43) ![](https://hackmd.io/_uploads/Sy71e_4Tn.png) 根據組態資訊建立 **ns_group.json** 配置 JSON 檔。 ![](https://hackmd.io/_uploads/S1Uc5YNa2.png) :::info 配置 JSON 檔其實可以透過簡單的變數轉換產生!可參考 [[**附錄: 範例腳本**]](#NS-Group-轉換-JSON-組態腳本) ::: 使用 API 請求完成 NS Group 的建立並顯示結果。:100: ![](https://hackmd.io/_uploads/S14acK4p3.png) 讓我們暫時回到 GUI 空間,同時檢驗組態,看來沒有問題! ![](https://hackmd.io/_uploads/Bkf8itNT2.png) ![](https://hackmd.io/_uploads/HkKCiYEpn.png) :::info 執行到此,有沒有發現其實採用 API 進行宣告式組態的佈署極為便利。只要配置環境及架構不變動,可以在短時間就可以佈署相同環境,至於環境變動下,也可以根據部署條件修改宣告的配置參數,迅速部署環境。 ::: ## 建立 RPZ 清單 讓我們回到最初目標吧!前面提到使用 GUI 進行 RPZ 配置需要**執行重複步驟 17 次**!除了擔心輸入錯誤資訊外,也浪費了不少寶貴時間。既然原廠 RPZ 清單更新配置變動不大,採用 API 進行自動化佈署應該不錯的方式?!到此應該也有所體悟了吧。 ### 整理 RPZ 清單 原廠提供 RPZ 清單格式如下: ![](https://hackmd.io/_uploads/S1VeBjhC3.png) 大致整理以下列表格進行呈現: | feed | rpz_name | | --- | --- | | AntiMalware | antimalware.rpz.infoblox.local | | Base | base.rpz.infoblox.local | | Bogon | bogon.rpz.infoblox.local | | DHS_AIS_Domain | dhs-ais-domain.rpz.infoblox.local | | DHS_AIS_IP | dhs-ais-ip.rpz.infoblox.local | | 以下省略 | ... | 為了後續使用 API 處立程序便利性,建議先整理成以下格式(以逗點區分的 CSV 文字檔): ![](https://hackmd.io/_uploads/SJ9TBi3A2.png) :::info - **feed** 項目作為註解(Comment)部份。 - **rpz_name** 項目作為 Name(FQDN) 部份。 - 之後版本還可以加入其他欄位,例如 **Severity**, **Policy Override** 等,在建立時可以一併調整。 - 儲存為`逗點區的 CSV 文字檔`,可簡化用於**程式選取**或**軟體匯入**作業,也便於後續**維護管理**清單。 ::: 接著檢視建立 RPZ 清單的 API,使用 **POST 請求**,先前已經展示過操作方式了!進行到這裡,應該跟我一樣都有基礎 API 操作能力了吧? ![](https://hackmd.io/_uploads/HykGg9Vph.png) 每個 RPZ 設定都要提供以下 JSON 配置內容,並帶入 **BODY** 進行 POST 請求建立 RPZ 紀錄。以下是第一組 RPZ 紀錄的 JSON 配置範例: ```json { "fqdn": "antimalware.rpz.infoblox.local", "comment": "AntiMalware", "ns_group": "rpz-group", "rpz_policy": "NODATA", "rpz_severity": "WARNING" } ``` :::info | 參數 | 對應設定 | 備註 | | --- | --- | --- | | **fqdn** | Name | -- | | **rpz_policy** | Policy Override | DISABLED => Log Only(Disabled)<br>GIVEN => None(Given) [**預設**]<br>**NODATA => Block(No Data)**<br>NXDOMAIN => Block(No Such Domain)<br>PASSTHRU => Passthru<br>SUBSTITUTE => Substitute(Domain Name) | | **rpz_severity** | Severity | INFORAMATIONAL => Informational<br>**WARNING => Warning**<br>MAJOR => Major [**預設**]<br>CRITICAL => Critical | | **comment** | Comment | 以 feed 名稱作為註解 | ::: ### 建立測試 執行以下腳本,完成第一筆 RPZ 紀錄。 ```bash grid_master_ip='10.7.155.91' grid_master_user='admin' grid_master_pass='infoblox' login="${grid_master_user}:${grid_master_pass}" wapi_ver='v2.12.3' wapiUri="https://${grid_master_ip}/wapi/${wapi_ver}" curl -s -k -u ${login} -X POST "${wapiUri}/zone_rp" -H'Content-Type: application/json' -d '{"fqdn": "antimalware.rpz.infoblox.local","comment": "AntiMalware","ns_group": "rpz-group","rpz_policy": "NODATA","rpz_severity": "WARNING"}' ``` **執行結果** ![](https://hackmd.io/_uploads/SyApxCrT3.png) 回到 GUI 空間檢視。OK喔! ![](https://hackmd.io/_uploads/HyAIWCBa3.png) ### 大量建立 既然有第一筆紀錄建立成功的經驗,剩下的 16 筆就按照相同方式完成就好了?! 既然都是重複動作,只要變更每個 **fqdn** 和 **comment** 的參數值即可,再加上我們已經先將 RPZ 清單用 CSV 格式整理過了,輕鬆使用以下方式就可以達成目標,這裡就簡單帶過,各位可以用自己的方式完成即可。 #### 方式一 只要透過簡單的整理技法,再使用 for 迴圈重複執行就可以了! ```bash fqdn=($(cat rpz_feed.csv | awk -F',' '{print $2}' | sed '1d')) comment=($(cat rpz_feed.csv | awk -F',' '{print $1}' | sed '1d')) for ((i=1;i<=${#fqdn[@]};i++)); do echo "{\"fqdn\": \"${fqdn[$i]}\",\"comment\": \"${comment[$i]}\",\"ns_group\": \"rpz-group\",\"rpz_policy\":\"NODATA\",\"rpz_severity\": \"WARNING\"}"; done ``` **執行範例** ![](https://hackmd.io/_uploads/BkQ7_oh0n.png) #### 方式二 這裡使用文件 P.110 提到的 **Multiple Object Body using /request** 功能,使用**一次請求**,搭配 **JSON 配置檔** 帶入 **Body** 完成 API 動作。 :::warning 其實還是要先整理 RPZ 清單,但只要對設備執行**一次 API 請求**。 ::: ![](https://hackmd.io/_uploads/HJkJiRST2.png) 同樣使用 [**整理技法**](#整理技法) 將 CSV 格式的 RPZ 清單轉換成以下檔案。可以參考 [[**附錄:範例腳本**]](#RPZ-轉換-JSON-組態腳本)。 **rpz_feed.json** ```json [ { "method": "POST", "object": "zone_rp", "data": { "fqdn": "antimalware.rpz.infoblox.local", "comment": "AntiMalware", "ns_group": "rpz-group", "rpz_policy": "NODATA", "rpz_severity": "WARNING" } }, { "method": "POST", "object": "zone_rp", "data": { "fqdn": "base.rpz.infoblox.local", "comment": "Base", "ns_group": "rpz-group", "rpz_policy": "NODATA", "rpz_severity": "WARNING" } }, ...... ``` 接著就直接執行 API 呼叫,並檢視實際執行狀態。看起來沒有問題的!:100: ```bash curl -s -k -u ${login} -X POST "${wapiUri}/request" -H'Content-Type: application/json' -d @rpz_feed.json ``` ![](https://hackmd.io/_uploads/HyRt_i302.png) 回到 GUI 空間檢視!看起來也沒有問題的!:100: ![](https://hackmd.io/_uploads/HJVbYo2A2.png) 好喔!只要執行一次 API 請求就可以完成 RPZ 清單的建立作業,雖然初期維護成本較高,但之後只要變動不大,都可以做適度調整快速完成,如果搭配其他佈署任務一同進行,應該是可以簡化 Infoblox 建置任務的。 # 試試 Postman 一般測試 API 都會透過視覺化的 Postman 來進行,使用 Postman 基本上可簡化 API 請求程序,執行時也可帶入檔案進行批次執行,這裡就簡單說明執行程序就好。Postman 基礎設定可以參考 [[**使用 Postman 初探 Infoblox Web-based API(WAPI) 測試**]](https://hackmd.io/@farmer87/infoblox_wapi_00)。 這裡就展示用匯入檔案的方式執行大量建立的方式。 ## Request 設定 - **Header** ![](https://hackmd.io/_uploads/rygyXtF63.png) - **Body** ![](https://hackmd.io/_uploads/rysnMFYp3.png) :::info 這裡的變數參照值等會就會按照匯入檔案的內容帶入。 ::: - **Test** ![](https://hackmd.io/_uploads/HktN6hYan.png) :::info 使用 **`console.log`** 可以在 API 請求完成後,在 Console 中顯示完成 RPZ 項目。 ::: ## Run Collection - 在 Collections 名稱右側點擊,選擇 **Run Collection** 執行。 ![](https://hackmd.io/_uploads/Syj4d3Yp3.png) - 或是在右下底部區域,點選 **Runner**。 ![](https://hackmd.io/_uploads/Sy4du2t63.png) - 選擇該 API 請求後,點選右側 **Select File** 匯入 RPZ 清單 CSV 檔案。 ![](https://hackmd.io/_uploads/By5GthFan.png) - 匯入 RPZ 清單,Postman 會自動取得 RPZ 清單數量作為**迭代次數**。很明顯的目前提供的 RPZ 清單為 17 筆紀錄。 ![](https://hackmd.io/_uploads/HkBLq2t62.png) - 點擊上圖右下方的 **Preview**,可預覽檔案內容確認變數參照值。**對應的變數名稱則與匯入檔案第一列一致**即可,這樣 Postman 便可自動正確取用。 ![](https://hackmd.io/_uploads/SkboFo3A2.png) - 點擊 <img width=200 src='https://hackmd.io/_uploads/rkx5T2FT3.png'>,Postman 便會重複執行 API 請求共 17 次,完成 RPZ 清單建立。 ![](https://hackmd.io/_uploads/r1sLA3Ya3.png) - 從 Postman Console 也可以看到佈署程序。 <img width=640 src='https://hackmd.io/_uploads/HkGmqs3C3.png'><br> :::info 使用 Postman 軟體也是可以達成與 cURL 命令相同的結果,透過視覺化運行,也降低了 API 使用的壓力,真的是 API 好幫手。 ::: # 結論 :::success - 使用 API 可以進行半自動化的設備組態及佈署。 - 使用 Postman 應該可以很輕鬆地進行 API 功能測試。 - 初期設置及學習成本較高,但後續導入系統及版本管理,應可降低維運成本。 - 其他 API 功能還有待學習進行測試。 ::: # 參考 - [Why use Infoblox WAPIs?](https://community.infoblox.com/t5/best-practices/why-use-infoblox-wapis/ba-p/13262) - [Infoblox REST API NIOS 8.6](https://www.infoblox.com/wp-content/uploads/infoblox-deployment-infoblox-rest-api.pdf) - [Consolidate your WAPIs using the Request Object](https://blogs.infoblox.com/community/consolidate-your-wapis-using-the-request-object/) - [The definitive list of REST examples](https://community.infoblox.com/t5/api-examples/the-definitive-list-of-rest-examples/td-p/1214) - [Get more value out of Infoblox NIOS APIs](https://blogs.infoblox.com/community/get-more-value-out-of-infoblox-nios-apis/) - [Interfacing with Infoblox WAPI using Python](http://dnaeon.github.io/interfacing-with-infoblox-wapi-using-python/) - [Introduction to Infoblox API (WAPI) using Python](https://sifbaksh.com/introduction-to-infoblox-api-wapi-using-python/) - [WAPI Documentation using Swagger](https://github.com/infobloxopen/infoblox-swagger-wapi) --- - [Automate Infoblox Infrastructure Using Ansible](https://www.infoblox.com/wp-content/uploads/infoblox-deployment-guide-automate-infoblox-infrastructure-using-ansible.pdf) - [Infoblox Terraform Provider v2](https://www.infoblox.com/wp-content/uploads/infoblox-deployment-guide-infoblox-ipam-plugin-for-terraform.pdf) # 附錄 ## NS Group 轉換 JSON 組態腳本 **ns_group.conf** ```bash ns_group_name='rpz-group' # external primary external_primary_name='infoblox' external_primary_address='61.216.*.*' external_primary_tsigkey_name='TSIG-*******' external_primary_tsigkey_alg='HMAC-MD5' external_primary_tsigkey='D5bU9A9GkKna6w4******Bw3g==' # grid secondary grid_master_hostname='gm.infoblox.localdomain' # options default_grid='true' use_external_primary='true' ``` **nsGroupConverter.sh** ```bash #!/bin/bash # function conv_nsgroup_json () { cat << EOF > ${targetConfig} { "name":"${ns_group_name}", "external_primaries": [ { "address": "${external_primary_address}", "name": "${external_primary_name}", "stealth": false, "tsig_key": "${external_primary_tsigkey}", "tsig_key_alg": "${external_primary_tsigkey_alg}", "tsig_key_name": "${external_primary_tsigkey_name}", "use_tsig_key_name": true } ], "grid_secondaries": [ { "enable_preferred_primaries": false, "grid_replicate": false, "lead": false, "name": "${grid_master_hostname}", "preferred_primaries": [], "stealth": false } ], "is_grid_default": ${default_grid}, "comment": "Created by Infoblox WAPI via cURL", "use_external_primary": ${use_external_primary} } EOF } sourceConfig='ns_group.conf' targetConfig='ns_group.json' if [[ ! -f "${sourceConfig}" ]]; then echo -e "<!> ${sourceConfig} NOT FOUND <!>" exit else source ${sourceConfig} conv_nsgroup_json echo -e "> Convert NS_Group JSON to ${targetConfig}" fi ``` **ns_group.json** ```json { "name":"rpz-group", "external_primaries": [ { "address": "61.216.*.*", "name": "infoblox", "stealth": false, "tsig_key": "D5bU9A9GkKna6w4******Bw3g==", "tsig_key_alg": "HMAC-MD5", "tsig_key_name": "TSIG-*******", "use_tsig_key_name": true } ], "grid_secondaries": [ { "enable_preferred_primaries": false, "grid_replicate": false, "lead": false, "name": "gm.infoblox.localdomain", "preferred_primaries": [], "stealth": false } ], "is_grid_default": true, "comment": "Created by Infoblox WAPI via cURL", "use_external_primary": true } ``` ## RPZ 轉換 JSON 組態腳本 **rpz_feed.csv** ```csv zone_rp_feed,zone_rp_name,ns_group,rpz_policy,rpz_severity AntiMalware,antimalware.rpz.infoblox.local,Rpz-group,NODATA,WARNING Base,base.rpz.infoblox.local,Rpz-group,NODATA,WARNING Bogon,bogon.rpz.infoblox.local,Rpz-group,NODATA,WARNING DHS_AIS_Domain,dhs-ais-domain.rpz.infoblox.local,Rpz-group,NODATA,WARNING DHS_AIS_IP,dhs-ais-ip.rpz.infoblox.local,Rpz-group,NODATA,WARNING <以下省略> ``` **rpzFeedConverter.sh** ```bash #!/bin/bash rpzCsvfile="${1:-rpz_feed.csv}" rpzJsonfile='rpz_feed.json' nsGroupName='rpz-group' rpzPolicy='NODATA' rpzSeverity='WARNING' if [[ ! -f "${rpzCsvfile}" ]]; then echo -e "\n<!> RPZ Feed File [${rpzCsvfile}] NOT FOUND <!>\n" exit fi feedName=($(cat ${rpzCsvfile} | awk -F',' '{print $1}' | sed '1d')) rpzName=($(cat ${rpzCsvfile} | awk -F',' '{print $2}' | sed '1d')) feedCount=${#feedName[@]} echo "[" for ((i=0;i<${feedCount};i++)); do count=$(expr $i + 1) if [[ ${count} != ${feedCount} ]]; then echo " { \"method\": \"POST\", \"object\": \"zone_rp\", \"data\": { \"fqdn\": \"${rpzName[$i]}\", \"comment\": \"${feedName[$i]}\", \"ns_group\": \"${nsGroupName}\", \"rpz_policy\": \"NODATA\", \"rpz_severity\": \"WARNING\" } }," else echo " { \"method\": \"POST\", \"object\": \"zone_rp\", \"data\": { \"fqdn\": \"${rpzName[$i]}\", \"comment\": \"${feedName[$i]}\", \"ns_group\": \"${nsGroupName}\", \"rpz_policy\": \"NODATA\", \"rpz_severity\": \"WARNING\" } }" fi done echo "]" ``` **rpz_feed.json** ```json [ { "method": "POST", "object": "zone_rp", "data": { "fqdn": "antimalware.rpz.infoblox.local", "comment": "AntiMalware", "ns_group": "rpz-group", "rpz_policy": "NODATA", "rpz_severity": "WARNING" } }, { "method": "POST", "object": "zone_rp", "data": { "fqdn": "base.rpz.infoblox.local", "comment": "Base", "ns_group": "rpz-group", "rpz_policy": "NODATA", "rpz_severity": "WARNING" } }, { "method": "POST", "object": "zone_rp", "data": { "fqdn": "bogon.rpz.infoblox.local", "comment": "Bogon", "ns_group": "rpz-group", "rpz_policy": "NODATA", "rpz_severity": "WARNING" } }, { "method": "POST", "object": "zone_rp", "data": { "fqdn": "dhs-ais-domain.rpz.infoblox.local", "comment": "DHS_AIS_Domain", "ns_group": "rpz-group", "rpz_policy": "NODATA", "rpz_severity": "WARNING" } }, { "method": "POST", "object": "zone_rp", "data": { "fqdn": "dhs-ais-ip.rpz.infoblox.local", "comment": "DHS_AIS_IP", "ns_group": "rpz-group", "rpz_policy": "NODATA", "rpz_severity": "WARNING" } }, ... 中間省略 ... ] ```