CiscoConfParse 初期化時の INFO 表示を抑制する
以前に CiscoConfParse でインターフェイス情報を抽出する というメモを書きました。 CiscoConfParse は「Cisco 機器のコンフィグを構造的に扱うことが出来る」便利なライブラリです。 但し、ネット上にある古いサンプルの書き方では実行時に INFO
が表示されることがあります。 今回はそれを抑制する方法をメモしておきます。
factory の指定が無い場合
ネット上に存在する古いサンプルの場合、下記のように CiscoConfParse() の初期化時、factory
を指定していません。
| #!/usr/bin/env python3
from ciscoconfparse import CiscoConfParse
CONFIG = """!
interface GigabitEthernet0/1
ip address 172.16.1.1 255.255.255.0
"""
parse = CiscoConfParse(CONFIG.splitlines(), syntax='ios')
|
これを CiscoConfParse 1.9.17 以降で実行すると以下のような INFO
が表示されます。
| $ ./sample.py
2023-12-05 21:26:16.700 | INFO | ciscoconfparse.ciscoconfparse:__init__:701 - As of version 1.9.17 and later, `ignore_blank_lines=True` is only honored when `factory=True`
2023-12-05 21:26:16.700 | INFO | ciscoconfparse.ciscoconfparse:__init__:701 - As of version 1.9.17 and later, `ignore_blank_lines=True` is only honored when `factory=True`
|
factory の指定が有る場合
前述の INFO
を抑制するには CiscoConfParse() の初期化時に factory=True
を指定します。
| #!/usr/bin/env python3
from ciscoconfparse import CiscoConfParse
CONFIG = """!
interface GigabitEthernet0/1
ip address 172.16.1.1 255.255.255.0
"""
parse = CiscoConfParse(CONFIG.splitlines(), syntax='ios', factory=True)
|
これで初期化時の INFO
が表示されなくなります。
factory とは?
factory については下記のように書かれています。
factory is an experimental feature to derive more information about configurations by using several different configuration objects for a given syntax.
「factory が True と False で何が違うのか?」については以下を読むと理解出来ます。
以下のようなコードがあったとします。 CiscoConfParse()
の初期化時に factory
を指定していませんのでデフォルト値である factory=False
扱いになります。
1
2
3
4
5
6
7
8
9
10
11
12 | #!/usr/bin/env python3
from ciscoconfparse import CiscoConfParse
CONFIG = """!
interface GigabitEthernet0/1
ip address 172.16.1.1 255.255.255.0
"""
parse = CiscoConfParse(CONFIG.splitlines(), syntax='ios')
intf = parse.find_objects('^interface\sGigabitEthernet0/1')[0]
print("Address : " + intf.ipv4_addr)
|
このコードを実行するとエラーになります。 具体的には 12 行目の intf.ipv4.addr
を取得する部分でエラーになっています。
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | $ ./sample.py
2023-12-05 21:52:40.307 | INFO | ciscoconfparse.ciscoconfparse:__init__:701 - As of version 1.9.17 and later, `ignore_blank_lines=True` is only honored when `factory=True`
2023-12-05 21:52:40.308 | ERROR | ciscoconfparse.ccp_abc:__getattr__:142 - The ipv4_addr attribute does not exist
2023-12-05 21:52:40.307 | INFO | ciscoconfparse.ciscoconfparse:__init__:701 - As of version 1.9.17 and later, `ignore_blank_lines=True` is only honored when `factory=True`
2023-12-05 21:52:40.308 | ERROR | ciscoconfparse.ccp_abc:__getattr__:142 - The ipv4_addr attribute does not exist
2023-12-05 21:52:40.308 | ERROR | __main__:<module>:12 - An error has been caught in function '<module>', process 'MainProcess' (17601), thread 'MainThread' (8092536128):
Traceback (most recent call last):
File "/Users/enbutsu/Desktop/scripts/.venv/lib/python3.9/site-packages/ciscoconfparse/ccp_abc.py", line 138, in __getattr__
retval = getattr(object, attr)
└ 'ipv4_addr'
AttributeError: type object 'object' has no attribute 'ipv4_addr'
(snip)
|
このエラーは以下のように 10 行目の CiscoConfParse()
を初期化する際、factory=True
を指定することで解消します。
1
2
3
4
5
6
7
8
9
10
11
12 | #!/usr/bin/env python3
from ciscoconfparse import CiscoConfParse
CONFIG = """!
interface GigabitEthernet0/1
ip address 172.16.1.1 255.255.255.0
"""
parse = CiscoConfParse(CONFIG.splitlines(), syntax='ios')
intf = parse.find_objects('^interface\sGigabitEthernet0/1')[0]
print("Address : " + intf.ipv4_addr)
|
実行すると以下のように intf.ipv4_addr
の結果が意図した通りに「IPv4 アドレスを取得」出来ていることが分かります。
| $ ./sample.py
Address : 172.16.1.1
|