基於SQL的Regex規則引擎
我有一張表格,用於根據提供的條件確定操作。這就是它現在的樣子。
IPAddress, MACAddress, Hostname, ScriptName, Argument1, Argument2, Argument3 10.2.1.* , .* , .* , diagnostics.sh, -runAll, ,
在此表中,前三列是條件,後四列是操作。條件單元格的值是我在其上執行 REGEX_LIKE 的正則表達式值,因此當我查找要在設備上執行的正確腳本時,我會查看它的 IP(或 MAC 我給定一個或另一個,而不是兩者)和主機名,如果正則表達式匹配,那麼我得到需要執行的腳本名稱和該腳本的參數。
有些腳本只有一個參數,有些腳本有兩個參數,有些腳本有三個參數。
如何修改它,以便我可以任意列出條件和操作。例如,給我一個鍵、值映射(屬性名稱、屬性值)用於條件,一旦滿足規則,我檢索與該設備相關的操作鍵、值元素列表。
為簡單起見,一旦初始化此數據庫,就不會對其進行任何更新。它在啟動時通過從平面文件中讀取規則進行初始化,並在執行時用於確定已滿足所提供輸入的規則。
這是我認為更適合此的架構,但我不知道這是否正確,也不知道如何獲取匹配規則。
Table Name: Column List Attributes: attributeId, name, value Conditions: conditionId, ruleId, attributeId Actions : actionId, ruleId, attributeId Rules : ruleId
這是我自己想出來的。我將描述我為自己編寫查詢所做的工作。我沒有要在此處粘貼的查詢,因為我刪除了查詢,因為我不再需要它,但是如果有人需要它,請給我發消息,我會重新編寫它。
我創建了兩個表,Rule(Id, Name) 和 Parameter(Id, Key, Value, RuleId, Type)。
規則表是不言自明的,參數表對於每個規則有兩種類型的參數,一個條件或一個動作。每個規則都應該有任意數量的條件和動作。條件參數應具有覆蓋 IP 子網或主機名約定等的正則表達式
然後我創建了一個 SQL 查詢來獲取每個規則的條件總數,並創建一個 SQL 查詢來獲取與使用者提供的輸入匹配的條件總數;例如,如果條件包括主機名、IP、building_name,我會使用 regex_like 獲得這些條件匹配的規則列表,然後我對 ruleId 進行計數,並將其與上一個關於 count 和 ruleId 的查詢連接起來。這給了我滿足所有條件的 ruleIds 列表,從中我可以查詢參數表以獲取該規則的相應操作列表。
PostgreSQL
我不確定您為什麼要為此使用正則表達式。PostgreSQL 已經有特定的類型。
CREATE TABLE whatev ( IPAddress inet, MACAddress macaddr, Hostname text, ScriptName text, CHECK ( IPAddress IS NULL OR MACAddress IS NULL ) ); INSERT INTO whatev VALUES ( '10.2.1/24', null, 'Evan Box', 'rmrf' );
不要將 ip、網路遮罩或 MAC 地址儲存為文本。
SELECT * FROM whatev WHERE ipaddress >> '10.2.1.4';
我不太明白你想做什麼。我還會向您指出ip4r,它在這方面非常出色。
至於儲存條件,我不完全確定您的意思,但是您當然可以將條件儲存為 inet 有一組豐富的運算符