テンプレート
テンプレートで再利用可能なルールセットを定義し、複数のコマンドで共有できます。
テンプレートの定義
template primitive
|,>>
allow cat, echo, head, tail, wc, sort, uniqこれで primitive テンプレートにパイプコンテキストのルールが定義されました。
next: による委譲
next: でコマンドにテンプレートを割り当てます:
allow ls
next: primitive
allow find
next: primitiveこれで ls | cat も find | cat も primitive テンプレートのルールで評価されます。
extends: による継承
テンプレートは他のテンプレートを継承できます:
template primitive
|,>>
allow cat, echo, head, tail, wc
template safeRead
next: primitive
|,>>
allow grep, awk, sed
template bulkExec
extends: safeRead
|,>>
deny rm "破壊的コマンドにパイプしないでください"
exec:
deny rm "一時ファイルに展開してください"
allow cp, mv, touch継承チェーン
primitive ← safeRead ← bulkExecbulkExec を使うコマンド:
allow find
next: bulkExecパイプコンテキストで得られるルール:
allow cat, echo, head, tail, wc(primitive から)allow grep, awk, sed(safeRead から)deny rm(bulkExec 自身)
exec コンテキストで得られるルール:
deny rm,allow cp, mv, touch(bulkExec 自身)
last-rule-wins とテンプレート
テンプレートのルールはコマンド自身のルールより先に評価されます。そのためコマンド側でテンプレートのルールを上書きできます:
allow grep
next: bulkExec
|,>>
allow rm # bulkExec の deny rm を上書きgrep | rm → bulkExec の deny rm が先にマッチ → コマンド自身の allow rm が後にマッチ → last-rule-wins で allow
循環参照の検出
extends: の循環参照はパース時にエラーになります:
template a
extends: b
template b
extends: a
# → error: circular extends detected: [a] -> bテンプレート設計のベストプラクティス
- 安全な出力先を
primitiveにまとめる —cat,head,wc等の読み取り専用コマンド - 処理系を
safeReadにまとめる —grep,awk,sed等のフィルター - 破壊的操作の保護を
bulkExecにまとめる —rmの deny、-execの制御 - プロジェクト固有のテンプレートは別名で —
myProjectSafe等