LoginSignup
0
0

More than 3 years have passed since last update.

4DからTelnet端末を制御したい

Posted at

4DからTelnet端末を制御したい

背景

WiFiブリッジホストの古いヤツ、ヤマハルーターの古いヤツ、ネットワークカメラの古いヤツ、PoEハブの古いヤツ。これらをモニタリングして状況に応じて再起動をかけたいので昔はPerl Net::Telnetモジュールを使ったりしていた。そちらを使えばイイのだが端末の設定しまくって → 破損 → リプレイス → 設定手順忘れた・・・とか泣けてくる。大体コレが起こるのが数年後の忘れた頃w

4D Serverなら

4D Serverならアプリを別端末に移動して起動すると、まるっと環境は元通り。4D Serverに監視と再起動を任せるためTelnetコンポーネントを作ってみた。ログインしてコンフィグやログを取ったり再起動かけたりする単純なコマンドなら動くようになったみたい。

ちなみに・・・CUIなどうしても使いたいコマンドなどは、4D ServerのストラクチャーのResourcesに放り込んでおくとクライアントが接続した時に自動的に配信される仕組みがあって便利。ffmpegとかImageMagickとか自前で作ったexeとかdllとか放り込んでおくと、クライアントへのインストールが不要で決まったパスでアクセスできる。

内容

4D標準コマンドと、InternetCommands PluginのTCPローレベルコマンドで処理構成されています。
BLOBデータを送受信してエンコーディングはShift_JISのみ想定だったかな。

使い方

ヤマハのルーターに接続してコンフィグ取ってきたりリスタートしたり、使い方はこんな感じ。

コンフィグ取得


C_OBJECT($obj)
ARRAY TEXT($arrLines;0)

OB SET($obj;"HOST";"192.168.0.1";"PORT";23)  //ホストアドレスとポートの設定
OB SET($obj;"USER";"";"USER_PROMPT";"")  //ユーザー名なし、明示的にユーザー名とプロンプトを無しにするとスキップ
OB SET($obj;"PASS";"hogehoge";"PASS_PROMPT";"Password:")  //パスワードとパスワードプロンプト
OB SET($obj;"PROMPT";">";"MORE_PROMPT";"---")  //通常のコマンド待ちプロンプトと、ページングプロンプト
If (True)
    $err:=Telnet_clinet (->$obj;"connect")  //オブジェクトの内容で接続、自動ログインまで実施www
    If ($err=0)
        $err:=Telnet_clinet (->$obj;"command";"show config")  //コマンドとして、show configを実行
        OB GET ARRAY($obj;"LINES";$arrLines)  //コマンドの戻り値がLINESとして文字列配列になっている。
        $err:=Telnet_clinet (->$obj;"disconnect")  //切断、デフォルトのexitコマンドが実行されTCP_Closeされる。
        ALERT(Array_join (->$arrLines;Char(13)))
    Else 
        ALERT("接続できません。\n"+JSON Stringify($obj;*))
    End if 
End if 

リスタートする場合


If (True)
    $err:=Telnet_clinet (->$obj;"connect")  //オブジェクトの内容で接続、自動ログインまで実施www
        $prompt:=""  //プロンプト待ちは明示的に無し(こうしておかないとコマンド実行後の待ち受け状態になってしまう)
        $err:=Telnet_clinet (->$obj;"command";"restart";$prompt)
        OB SET($obj;"LOGGED_IN";False)  //リスタートなのでログイン状態は強制解除(こうしておかないとdisconnect時にexitしようとして固まる)
        $err:=Telnet_clinet (->$obj;"disconnect")  //TCP_Close実行しなきゃね。
    Else 
        ALERT("接続できません。\n"+JSON Stringify($obj;*))
    End if 
End if 

オブジェクトは参照渡しできるのでポインタ渡しする必要は無いけど、先に設定配列渡しとかでコード作ってた残骸かな。

ダウンロード

こちらからダウンロードできます。v16〜v18の適宜バージョンの合ったものをダウンロードしてください。
4Dのダウンロードはこちらより。

問題点

特に認識していませんが、おそらく複雑なコマンドを処理させようとすると問題が出ます(*^ー^)。テストしてマトモに動いているのは先のコンフィグ取得と再起動くらいですw トラブルが発生しても責任は負いかねます。自前で拡張/改修/解決をご希望の場合はご連絡ください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0