見出し画像

TWSNMP FC/FKのgNMI対応開発2日目:gNMIcとSNMP TRAPで連携する機能を作っています

今朝は、5時近くに、助手の猫さんが起こしてくれました。猫さんは日の出前に活動を開始するようです。

昨日、整理した開発項目を作り始めました。
最初は、開発量の少ないgNMIcから送信されたSNMP TRAPに関する処理です。
TRAPに付帯するMIBにsysNameがあれば、その値からノードを検索して登録されていれば、TRAPの送信元を、そのノードに置き換えるという簡単な仕様にしました。

		for _, vb := range s.Variables {
			key := datastore.MIBDB.OIDToName(vb.Name)
			val := datastore.GetMIBValueString(key, &vb, false)
			vbs += fmt.Sprintf("%s=%s\n", key, val)
			if strings.HasPrefix(key, "sysName") {
				n := datastore.FindNodeFromName(val)
				if n != nil {
					record["FromAddress"] = fmt.Sprintf("%s(%s) via %s", n.IP, n.Name, u.IP.String())
				}
			}
		}

のぐらいの変更でできました。

gNMIcの設定ファイルを

username: admin
password: NokiaSrl1!
skip-verify: true
log: true

targets:
  192.168.1.50:

subscriptions:
  sub1:
    paths:
      - /interface/admin-state
      - /interface/oper-state
      - /interface/ifindex
      - /system/name/host-name
    stream-mode: on-change
    encoding: ascii

outputs:
  snmp_trap:
    type: snmp
    address: 192.168.1.250
    port: 162
    community: public
    cache: 
      type: oc
      # duration, default: 60s.
      # updates older than the expiration value will not be read from the cache.
      expiration: 60s
      # enable extra logging
      debug: true
    traps:
      - trigger:
          path: /interface/oper-state # static path
          oid: '".1.3.6.1.2.1.2.2.1.8"' # ifOperStatus
          type: int
          value: if (.values."/interface/oper-state" == "up") 
                  then 1 
                  else 2 
                  end
        bindings:         
          - path: '"/system/name/host-name"' # jq script
            oid: '".1.3.6.1.2.1.1.5"' # sysName
            type: octetString
            value: '.values."/system/name/host-name"'

          - path: '"/interface[name="+.tags.interface_name+"]/admin-state"' # jq script
            oid: '".1.3.6.1.2.1.2.2.1.7"' # ifAdminStatus
            type: int
            value: if (.values."/interface/admin-state" == "enable") 
                    then 1 
                    else 2 
                    end

          - path: '"/interface[name="+.tags.interface_name+"]/oper-state"' # jq script
            oid: '".1.3.6.1.6.3.1.1.4.1.0"' # sysTrapOID.0
            type: objectID
            value: if (.values."/interface/oper-state" == "up") 
                    then ".1.3.6.1.6.3.1.1.5.4"
                    else ".1.3.6.1.6.3.1.1.5.3"
                    end

          - path: '"/interface[name="+.tags.interface_name+"]/ifindex"' # jq script
            oid: '".1.3.6.1.2.1.2.2.1.1"' # ifIndex
            type: int
            value: '.values."/interface/ifindex" | tonumber' # jq script

のように設定してsubscribeすれば対象のノードのLANポートの状態が変化した時にTRAPを送信します。
TWSNMP FCで受信した場合

のようになります。元の対象ノードと経由したgNMIcがわかるようになっています。

昨日、作ったマインドマップを修正しました。

SNMP連携とgNMツールなどのパラメータの設定です。

明日に続く

いいなと思ったら応援しよう!

twsnmp
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。