Splunk管理レンズを作成するためにaugeasでIniFileモジュールを使用しています。これは、通常のINIファイルのようにセクションヘッダーを含むすべてのファイルでうまく機能しますが、name = valueのペアを使用するだけで、このスキームに従わないファイルがいくつかあります。
セクションをメインなどの一般的なものに定義せずに、これらのエントリをマップする準備ができている方法はありますか?この2番目のファイルタイプについて別のモジュールを学ぶ必要はありません。今のところそれを回避する準備ができている方法があります。
module Splunk =
autoload xfm
let comment = IniFile.comment IniFile.comment_re IniFile.comment_default
let sep = IniFile.sep IniFile.sep_re IniFile.sep_default
let setting = IniFile.record_re
let title = IniFile.title ( IniFile.record_re )
let entry = IniFile.entry steting sep comment
let record = IniFile.record title entry
let lns = IniFile.lns record comment
let filter = incl "/etc/splunk/*.conf"
let xfm = transform lns filter
test lns get "[section]\ntest-value=yes\n" = ?
test lns get "test=yes\n" = ?
PHPレンズは同様の機能を提供し、定義されたセクションの前のINIファイルの設定をサポートします。これをレンズに適合させ、「設定」を修正しましたあいまいさを避けるためにIniFile.entry_re
を使用すべきだったレンズ。
module Splunk =
autoload xfm
let comment = IniFile.comment IniFile.comment_re IniFile.comment_default
let sep = IniFile.sep IniFile.sep_re IniFile.sep_default
let empty = IniFile.empty
let setting = IniFile.entry_re
let title = IniFile.title ( IniFile.record_re - ".anon" )
let entry = IniFile.entry setting sep comment
let record = IniFile.record title entry
let record_anon = [ label ".anon" . ( entry | empty )+ ]
let lns = record_anon | record*
let filter = incl "/etc/splunk/*.conf"
let xfm = transform lns filter
test lns get "[section]\ntest-value=yes\n" = ?
test lns get "test=yes\n" = ?
生成されるツリーは次のようになり、セクション外のすべての設定が「.anon」ノードの下に配置されます。
Test result: splunk.aug:20.2-.31:
{ ".anon"
{ "test" = "yes" }
}
このノードは、プット方向のあいまいさを回避するために必要です。例を挙げると、このツリーをファイルに書き戻すタスクがある場合は、次のようになります。
{ "foo" }
[foo]
(セクション名)またはfoo=
(セクション外の設定)のいずれかとして記述できます。 「.anon」サブツリーは、この変換バックにあいまいさがないことを保証します。それを削除してフラットな構造にするには、ファイルの種類ごとに2番目のモジュール/レンズを作成する必要があります。これはより自然な解決策だと思います。 「.anon」ノードは、同じファイルに混合があるPHPの場合に意味があります。
完了してテストを追加したら、レンズをAugeasプロジェクトに提出してください。ぜひ含めてください。 trac 経由で送信するか、 list に送信します。