Helix Coreサーバ管理者ガイド (2020.1)

コマンドハンドラの仕様

コマンドハンドラでは、異なる環境から異なるユーザが異なるコマンドを実行した場合に、ブローカがどう応答するかを指定することができます。 ユーザがコマンドを実行する時、Helixブローカは一致するコマンドハンドラを検索し、最初に見つかった一致を使用します。 ユーザのコマンドに一致するコマンドハンドラが存在しない場合、コマンドはターゲットのHelix Coreサーバに転送され、通常処理されます。

コマンドハンドラの仕様の一般的なシンタックスは、broker.confのサンプルに示されています。

command: commandpattern
{
# Conditions for the command to meet (optional)
# Note that with the exception of 'flags', these are regex patterns.
  flags           = required-flags;
  args            = required-arguments;
  user            = required-user;
  workspace       = required-client-workspace;
  prog            = required-client-program;
  version         = required-version-of-client-program;

  # What to do with matching commands (required)
  action  = pass | reject | redirect | filter | respond ;

  # How to go about it
  destination = altserver;            # Required for action = redirect
  execute = /path/to/filter/program;  # Required for action = filter
  message = rejection-message;        # Required for action = reject
}

commandpatternパラメータには正規表現を使用でき、ワイルドカード.*を含めることができます。 例えば、commandpatternuser.*p4 userコマンドとp4 usersコマンドの両方に一致します。 詳細については、正規表現の概要を参照してください。

以下の表はパラメータについて詳しく説明しています。

パラメータ 意味

flags

処理されるコマンドのコマンドラインに指定される可能性のあるオプションのリスト。

この機能により、ユーザが指定するオプションに応じて、同じp4コマンドに異なる処理を指定することができます。 ここでは1文字のオプションのみが指定できることにご注意ください。 複数の文字からなるオプションや、引数をとるオプションは、フィルタプログラムを使用して処理してください。

args

処理されるコマンドのコマンドラインで指定される可能性のある引数のリスト。

user

コマンドを実行したユーザの名前。

workspace

コマンド実行時に有効だったHelixサーバクライアントワークスペースの設定。

prog

ユーザがコマンドを実行したHelixサーバクライアントアプリケーション。 この機能により、アプリケーションごとにコマンドを処理することができます。

version

ユーザがコマンドを実行したHelixサーバアプリケーションのバージョン。

action

Helixブローカが指定のコマンドを処理する方法を定義します。 有効な値は、passrejectredirectfilter、およびrespondです。

destination

リダイレクトされたコマンドについては、コマンドのリダイレクト先のレプリカの名前。 リダイレクト先は、altserver設定でリストされた事前定義済みの代替(レプリカ)サーバの名前にする必要があります。

リダイレクト先をキーワードrandomに設定することで、ロードバランシングを実装することができます。 コマンドは、定義済みの代替(レプリカ)サーバにランダムにリダイレクトされます。

リダイレクト先をコマンドのリダイレクト先のサーバのaddress:portに設定することもできます。

execute

実行するフィルタプログラムへのパス。 フィルタプログラムについて詳しくは、フィルタプログラムを参照してください。

message

ユーザに送信されるメッセージ。一般的には、コマンドが実行される前に送信されます。上記のアクションのいずれとも併用できます。

checkauth

接続を認証します。 trueに設定している場合、Helixブローカはユーザの接続に対してp4 protects -mを実行し、ユーザがHelix Coreサーバへのアクセス権を付与されていることを確認した後、アクションを開始します。 falseに設定している場合または設定を行っていない場合、Helixブローカは確認を行いません。 フィルタプログラムが実行されている場合、ユーザに付与される最も高い権限がmaxPermパラメータとして渡されます。 フィルタプログラムについて詳しくは、フィルタプログラムを参照してください。

例えば、次のコマンドハンドラはユーザjoebuildonlyクライアントワークスペースでp4 submitを起動することを禁止します。

command: submit
{
    user = joe;
    workspace = buildonly;
    action = reject;
    message = "Submit failed: Please do not submit from this workspace."
}

正規表現の概要

正規表現、またはregexとは、文字列とのパターン一致に使用される、検索パターンをなす一続きの文字列のことです。 以下は、コマンドハンドラの仕様で使用できる正規表現の機能の概要です。

正規表現は、0以上のブランチからなります。 ブランチは、|で区切ります。 正規表現は、少なくとも1つのブランチと一致する任意の文字列と一致します。

ブランチは、0以上の連結されるピースからなります。 すべてのピースが順に一致する場合に、ブランチが一致します。つまり、最初のピース、2番目のピース、3番目のピースなどのように、ピースが順に一致すると、ブランチが一致することになります。

ピースは、原子、あるいは原子とそれに続く量指定子(*+、または?)です。 原子に*が続くと、原子が0回以上並んだインスタンスに一致します。 原子に+が続くと、原子が1回以上並んだインスタンスに一致します。 原子に? が続くと、原子が0回または1回並んだインスタンスに一致します。

原子は、以下のいずれかからなります。

  • 括弧で囲まれた下位の正規表現 - その下位の正規表現に一致
  • 範囲(以下を参照)
  • . - 任意の1文字と一致
  • ^ - 文字列の最初に一致
  • $ - 文字列の最後に一致
  • \に1文字が続いたもの - その文字に一致
  • 他に意味を持たない1文字 - その文字に一致

範囲は、角括弧([])に囲まれた一続きの文字列であり、通常はそのシーケンスの任意の1文字に一致します。 シーケンスが^で始まる場合、そのシーケンスに含まれない任意の1文字に一致します。 シーケンス内の2文字が-で区切られている場合、この記号は2つの文字間に含まれるすべてのASCII文字の短縮形です(例: [0-9]は10進数の任意の1文字に一致し、[a-z]は小文字のアルファベットの任意の1文字に一致します)。 シーケンスにリテラル]を含めるには、それを最初の1文字にします(^に続けることもできます)。 シーケンスにリテラル-を含めるには、それを最初か最後の1文字にします。

フィルタプログラム

コマンドハンドラのactionfilterである場合、Helixブローカexecuteパラメータにより指定されるプログラムまたはスクリプトを実行し、プログラムによって返されるアクションを実行します。 フィルタプログラムを使用すると、ブローカコンフィギュレーションファイルによって提供される機能を超えて規則を実施することができます。

Helixブローカは、コマンドの詳細を次の形式でプログラムの標準入力に渡すことによって、フィルタプログラムを起動します。

コマンドの詳細 定義

command:

ユーザコマンド

brokerListenPort:

ブローカが接続待機しているポート

brokerTargetPort:

ターゲットサーバが接続待機しているポート

clientPort:

クライアントのP4PORT設定

clientProg:

クライアントアプリケーションプログラム

clientVersion:

クライアントアプリケーションプログラムのバージョン

clientProtocol:

クライアントプロトコルのレベル

apiProtocol:

APIプロトコルのレベル

maxLockTime:

中止前にテーブルをロックする最大ロック時間(ミリ秒単位)

maxPerm

最も高い権限(checkauthが設定されている場合)

maxResults:

結果として返されるデータの最大行数

maxScanRows:

コマンドによりスキャンされるデータの最大行数

workspace:

クライアントワークスペースの名前

user:

要求ユーザの名前

clientIp:

クライアントのIPアドレス

proxyIp:

プロキシのIPアドレス(ある場合)

cwd:

クライアントの作業ディレクトリ

argCount:

コマンドへの引数の数

Arg0:

1番目の引数(ある場合)

Arg1:

2番目の引数(ある場合)

clientHost:

クライアントのホスト名

brokerLevel:

ブローカの内部バージョンレベル。

proxyLevel:

プロキシの内部バージョンレベル(ある場合)。

コマンドの引数に印字不能文字が含まれている場合、%記号のあとにその印字不能文字のASCIIコードを表す2桁の16進数を続けたものが、フィルタプログラムに送信されます。 例えば、タブ文字は%09とエンコードされます。

スクリプトがデータを必要としているかどうかにかかわらず、フィルタプログラムは他の処理を実行する前に標準入力(STDIN)からこのデータを読ま込まなければなりません。 フィルタスクリプトが標準入力(STDIN)からデータを読み込まない場合、「パイプの破損」エラーが発生し、ブローカがユーザのコマンドを拒否する場合があります。

フィルタプログラムは、以下の4つのいずれかの形式でデータを表示し、標準出力(stdout)のブローカに応答しなければなりません。

action: PASS
message: a message for the user (optional)
action: REJECT
message: a message for the user (required)
action: REDIRECT
altserver: (an alternate server name)
message: a message for the user (optional)
action: RESPOND
message: a message for the user (required)
action: CONTINUE
注意

actionの値は、大文字と小文字を区別します。

actionキーワードは常に必須であり、ユーザの要求への応答方法をブローカに指示します。 使用可能なactionは、以下のとおりです。

操作 定義

PASS

ユーザのコマンドを変更せずに実行します。 ユーザへのmessageは任意です。

REJECT

ユーザのコマンドを拒否し、エラーメッセージを返します。 ユーザへのmessageは必須です。

REDIRECT

コマンドを別の(代替)レプリカサーバにリダイレクトします。 altserverが必要です。 詳細については、集中認証サーバで動作するように代替サーバを設定するを参照してください。 ユーザへのmessageは任意です。

このアクションを実装するため、ブローカは代替サーバとの新しい接続を確立し、元のサーバではなく代替サーバにクライアントから送信されるすべてのメッセージをルーティングします。 これは、クライアントが代替Webサーバに直接接続するように要求されるHTTPリダイレクションとは異なります。

RESPOND

コマンドを実行せずに、情報提供メッセージを返します。 ユーザへのmessageは必須です。

CONTINUE

与えられたコマンドに一致する次のコマンドハンドラまで繰り延べます。

複数のハンドラの使用について詳しくは、「ブローカが複数のコマンドハンドラを処理する方法」を参照してください。

フィルタプログラムが、上記4つのメッセージによるもの以外の応答を返した場合、ユーザのコマンドは拒否されます。 フィルタスクリプトコードの実行中にエラーが発生したためブローカがユーザのコマンドを拒否した場合、ブローカはエラーメッセージを返します。

ブローカフィルタプログラムでは、複数行のメッセージ応答を処理することが困難です。 ブローカからメッセージを送信する際に新しい行が正しく解釈されるようにするには、次のような構文を使用する必要があります。

message="\"line 1\nline 3\nline f\n\""

この行は必ず引用符で囲む必要があります。

次の手順

代替サーバの定義