SNMPとTelnetを扱うテスト用アプリをC#で作った備忘録
需要はないけれど、業務内のテストツールとしてタイトルのものを作ったので
現場異動するため備忘録書き残し。
ざっくり合計3種類、7つのテストツールを1ヵ月強かけて作った。
SNMPとはなんぞや
我らがネットワークエンジニアとしてが解説しているので丸投げ。
ネットワークエンジニアとして
何を作っていたのか
WEB画面上で、とある機器の状態を監視、操作をおこなうための
テストツールをWindows Formで作っていた。
- SNMP Manager
- エミュレーター × 5個
- Telnetクライアント
SNMP Manager
MIBブラウザの下位互換GUIアプリケーション。
最低限の機能のみで、画面はこんな感じ。
SNMP Managerの中身
SharpSnmpLibを使わせてもらった。
懇切丁寧なサンプルが用意されているのでほぼそのまま使えた。
IPアドレス、ポート番号、バージョン、Read/Writeをチェックして
指定されたOIDの値をGET/SETする。
特段変わったことや詰まったことはなかったので割愛。
エミュレーター
ある機器の状態を表示と操作ができるGUIアプリケーション。
SNMPを使って、OID(オブジェクトID)の値を参照と更新を、画面上で制御する。
機器の特性上、本番と接続してテストができないため
テスト用アプリとして、Windows Formのアプリケーションを機器として用意し
それぞれのOIDに対して操作するといったものを作ることになった。
画面はこんな感じ。
エミュレーターの中身
同じく、SharpSnmpLibを使わせてもらった。
懇切丁寧なサンプルが用意されていて以下略。
内部にOIDのオブジェクトを保持していて、画面上でOIDの値をGET/SETできるように
なっている。
この画面の肝は、
- SNMP Manageなど外部の操作でOIDの値が書き換わった場合、リアルタイムで
テキストボックスやコンボボックスなどに反映する - 内外の操作履歴をログ出力する
となっていて、1番目のリアルタイム反映に手こずった。
(UIスレッドとは異なるスレッドで更新するため)
デリゲート使えば済む話ではあったけれど。
Telnetクライアント
Telnetサーバーに接続、ログイン、コマンド送受信、受信内容を画面で確認ができる
GUIアプリケーション。
別に画面作らずともTera Termでも良いんじゃないかとは思っていたが
お客さんに向けての説明にも使うということから
泣きながら作った。(理由は後述)
泣きながら作った理由
提供されているTCPクラスやsocketクラスを使用しても、うまく動かなった。
ChatGPTや海外の兄貴達の実装を参考にしたが、大苦戦した。
接続はできたが、ログインができなかった
接続コマンドを実行すると、WSLで入れたUbuntuでTelnet接続を開始するが
ログイン用のユーザー名とパスワードを要求するリクエストに対して
画面で入力したユーザー名とパスワードを送ることができなかった。
ログインする処理について言及していたスレがググっても見つからず詰まった。
標準出力を取得できなかった
リクエストが受け取れないことの原因として、CUIの標準出力を取得できなかったことが原因だった。
Windowsコマンドプロンプトの標準出力を取得する実装を参考にしたが、
実力不足とUbuntuの仕様なのか、なんか違うなということで取得できなかった。
文字コード問題(これは唯一解決できた)
画面に表示されるログ履歴に、文字化けした受信したコマンドが出力された。
ChatGPTは頑なにASCII→UTF8でエンコードしろと出たし、海外の兄貴達も同意見だったが
文字化けは一向に解消されなかった。
インフラの知人に泣きついて調べてもらうと、文字コードはiso-8859-1だという。
参考リンク
ASCIIをエンコードする文字コードらしいが割愛。
iso-8859-1でエンコードして、ようやく人間が理解できるログを出すことができた。
そして現場を去る
尻切れトンボになってしまったが、一番面倒であろう入力とログ表示の画面は作ったので
上司に事情とどこまでできているかを話し、環境構築の手順書をさっくりと渡して
現場を去り、別の現場へと異動した。
上司が凄腕なので、良い感じにログインやコマンド送受信ができるようになっていると思う。
どこかの機会で、実装の中身を覗けたら良いな。
Discussion