2012-11-29 28 views
0

我試圖從python根據其mac地址刪除dhcpd.lease的租約。刪除從python dhcpd.leases給mac的租約?

這是一個例子dhcpd.lease

lease 10.14.53.253 { 
    starts 3 2012/10/17 09:27:20; 
    ends 4 2012/10/18 09:27:20; 
    tstp 4 2012/10/18 09:27:20; 
    binding state free; 
    hardware ethernet 00:23:18:62:31:5b; 
} 
lease 10.14.53.252 { 
    starts 3 2012/10/17 10:15:17; 
    ends 4 2012/10/18 10:15:17; 
    tstp 4 2012/10/18 10:15:17; 
    binding state free; 
    hardware ethernet 70:71:bc:c8:46:3c; 
    uid "\001pq\274\310F<"; 
} 

假設我給出'00:23:18:62:31:5B」。然後我應該刪除屬於這個租約的所有線路。刪除後,文件應該是這樣

lease 10.14.53.252 { 
    starts 3 2012/10/17 10:15:17; 
    ends 4 2012/10/18 10:15:17; 
    tstp 4 2012/10/18 10:15:17; 
    binding state free; 
    hardware ethernet 70:71:bc:c8:46:3c; 
    uid "\001pq\274\310F<"; 
} 

我簡單的讀取文件並把它放在一個字符串,但我不知道以後的事情。我試過這個正則表達式,但沒有工作。它只檢查文件的第一行。

fh = open(DHCPFILE) 
lines = fh.read() 
fh.close() 
m = re.match(r"(.*lease.*%s.*})" % mac ,lines) 

回答

1

這個問題形狀像一個正則表達式釘子,所以請把那錘子下來。

正確的工具是將內容解析爲一個python結構,過濾出你不想要的項目,然後再寫出剩餘的項目。

pyparsing會使解析工作變得簡單;以下是基於an existing example

from pyparsing import * 

LBRACE,RBRACE,SEMI,QUOTE = map(Suppress,'{};"') 
ipAddress = Combine(Word(nums) + ('.' + Word(nums))*3) 
hexint = Word(hexnums,exact=2) 
macAddress = Combine(hexint + (':'+hexint)*5) 
hdwType = Word(alphanums) 

yyyymmdd = Combine((Word(nums,exact=4)|Word(nums,exact=2))+ 
        ('/'+Word(nums,exact=2))*2) 
hhmmss = Combine(Word(nums,exact=2)+(':'+Word(nums,exact=2))*2) 
dateRef = oneOf(list(""))("weekday") + yyyymmdd("date") + \ 
                 hhmmss("time") 

startsStmt = "starts" + dateRef + SEMI 
endsStmt = "ends" + (dateRef | "never") + SEMI 
tstpStmt = "tstp" + dateRef + SEMI 
tsfpStmt = "tsfp" + dateRef + SEMI 
hdwStmt = "hardware" + hdwType("type") + macAddress("mac") + SEMI 
uidStmt = "uid" + QuotedString('"')("uid") + SEMI 
bindingStmt = "binding" + Word(alphanums) + Word(alphanums) + SEMI 

leaseStatement = startsStmt | endsStmt | tstpStmt | tsfpStmt | hdwStmt | \ 
                 uidStmt | bindingStmt 
leaseDef = "lease" + ipAddress("ipaddress") + LBRACE + \ 
          Dict(ZeroOrMore(Group(leaseStatement))) + RBRACE 

input = open(DHCPLEASEFILE).read() 
with open(OUTPUTFILE, 'w') as output: 
    for lease, start, stop in leaseDef.scanString(input): 
     if lease.hardware.mac != mac: 
      output.write(input[start:stop]) 

上述代碼簡潔地定義了一個dhcp.leases文件的語法,然後使用scanString()解析出文件中的每個租約。 scanString()返回一系列匹配項,每個匹配項都包含解析結果以及原始字符串中的開始和結束位置。

解析結果有一個.hardware.mac屬性(如果輸入中沒有硬件語句,您可能希望捕獲AttributeError例外),使您可以輕鬆地測試要刪除的MAC地址。如果MAC地址不匹配,我們使用startstop職位將整個租約寫回到輸出文件,以獲取該租約的原始文本(比從解析信息中格式化租約要容易得多)。