Cachéサーバでのオペレーティングシステムコマンドの実行

Developer Connectionの記事に基づいて、彼はCachéまたはEnsembleがインストールされているサーバーオペレーティングシステムからコマンドを呼び出すためのクラスの独自の実装を作成しました。
ホストOS上でCachéから何かを行う必要がある場合、クラスが便利になります。バックアップファイルの管理、バージョン管理システムでの作業の構成、その他の便利なアクション。
このクラスを使用すると、任意のホストOSでコマンドを実行し、グローバル変数またはローカル変数への応答を取得できます。

コメント付きのクラスコード
クラスServer.Manage Extends%RegisteredObject
{

パラメーター cmdlist = "dir、type、ver" ;

///メソッドはコマンドラインからコマンドシーケンスを削除します
///許可されたコマンドのみを残す
ClassMethod safeCmd( cmd As%文字列
{
set cmd = $ piece cmd "&&" // 1つのコマンドを残す
set cmd = $ piece cmd "|"
for i = 1:1: $ length (.. #cmdlist "、" set safe $ p (.. #cmdlist "、" i ))= "" //許可されたコマンドのリスト
if ' $ data safe $ piece cmd "" ))) set cmd = ""
cmdを 終了
}

///メソッドは、サーバーでcmdコマンドを実行し、結果を広告グローバルに追加して、次のようにします。
/// @ ad =行数
/// @ ad @(行番号)= valuea
ClassMethod runCmd( cmd ad As%String As%ステータス
{
sc = $$$ OKを 設定します
$ SYSTEM .Processを実行し ます。 SetZEOF (1) // EOFでエラー生成モードをオフにする
//コマンドラインを安全にします
set cmd (1)= .. safeCmd cmd
quit cmd (1)= "" $$$エラー $$$ GeneralError 「無効なコマンド」 _ cmd
set cmd = cmd (1)
//送信されたグローバルをクリアします
@ 広告を 殺す
セット = 0

{
//コマンドラインでデバイスを開き、応答を読み取ります
open cmd "QR:K \ CP866 \" if ' $ test $$$ ThrowStatus $$$ ERROR $$$ GeneralError "コマンドを実行できませんでした" _ cmd ))
Set IO = $ IO //現在のデバイスを記憶する
//ファイルの最後に到達するまでコマンドラインの結果を1行ずつ読み取り、グローバルに追加します
{
cmdを 使用
読み取り str quit $ zeof = -1
set @ ad @( $ Increment count ))= str
}
@ ad = countを 設定
//デバイスを閉じます
#dim e as %Exception.AbstractException
} キャッチ {
sc = eを 設定し ます。 AsStatus ()
// e.Log()を行います//
}
//デバイスを閉じます
cmdを 閉じる

//現在のデバイスを返します
$ data IO IOを 使用する 場合
scを 終了
}

}

cmdlistパラメーターには、許可されるコマンドのリストがコンマで区切られて含まれています。
safeCmd()メソッドはコマンドラインを組み合わせます。
runCmd()メソッドは実際にcmdコマンドを実行し、結果を間接アドレス広告に入れます。

上記のコードは、Cachéがサポートするすべてのオペレーティングシステムで動作し、コマンドを実行し、結果を受け取り、エラーを処理します。 記事で説明されている実装とは異なり、作業はCommandPipeデバイス(openコマンドの「QR」モード)によって編成されます。 詳細はドキュメントをご覧ください。

デモ

使用例がここで確認できます-CSP + Twitter Bootstrapで構築された小さなプロジェクト。
サーバーは虐殺のために送信されませんでした-許可されたコマンド:type、ver、 format c、 dir。
クラスとWebプロジェクトのコードはgithubに投稿されています。

Source: https://habr.com/ru/post/J174601/


All Articles