Skip to content

CiscoConfParse 初期化時の INFO 表示を抑制する

以前に CiscoConfParse でインターフェイス情報を抽出する というメモを書きました。 CiscoConfParse は「Cisco 機器のコンフィグを構造的に扱うことが出来る」便利なライブラリです。 但し、ネット上にある古いサンプルの書き方では実行時に INFO が表示されることがあります。 今回はそれを抑制する方法をメモしておきます。

factory の指定が無い場合

ネット上に存在する古いサンプルの場合、下記のように CiscoConfParse() の初期化時、factory を指定していません。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/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 が表示されます。

1
2
3
$ ./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 を指定します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/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 アドレスを取得」出来ていることが分かります。

1
2
$ ./sample.py
Address       : 172.16.1.1