рдкрд╛рдЗрдерди рдореЗрдВ рдПрдбрд┐рдЯрд┐рдВрдЧ рдХрдиреНрдлрд┐рдЧреНрд╕



рдХреНрдпрд╛ рдЖрдкрдХреЛ рдХрднреА рднреА рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкрд╛рд░реНрд╕ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдмрджрд▓рд╛рд╡ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рд╣реИ? рдФрд░ NSD рдпрд╛ BIND9 рдЬреИрд╕реЗ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╕реНрд╡рд░реВрдкреЛрдВ рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ? рдФрд░ рдпрджрд┐ рдкреНрд░рд╛рд░реВрдк рд▓рд╛рдЗрди рдмреНрд░реЗрдХ, рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдФрд░ рдмрдЪрдд рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХрд╛рд░реНрдп рдЬрд▓реНрджреА рд╕реЗ рддреБрдЪреНрдЫ рд╢реНрд░реЗрдгреА рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде рдЕрдЬрдЧрд░-рдкреБрди: рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕рд╛рдЭрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред


рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЙрдиреНрдлрд┐рдЧ рдлрд╛рдЗрд▓ рдФрд░ рдкрд╛рдпрдерди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рдмреАрдЪ рдСрдмреНрдЬреЗрдХреНрдЯ рдореИрдкрд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред
рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдХрднреА рднреА "рдмреНрд░реЗрдХ" рди рдХрд░реЗрдВ, рдФрд░ рдЕрдкрд░рд┐рдЪрд┐рдд рдмреНрд▓реЙрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд░реНрдореАрд▓реА рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рднреА рдмрдЪрд╛рддрд╛ рд╣реИред

рдЪрд▓реЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ:

>>> from reconfigure.configs import FSTabConfig >>> from reconfigure.items.fstab import FilesystemData >>> >>> config = FSTabConfig(path='/etc/fstab') >>> config.load() >>> print config.tree { "filesystems": [ { "passno": "0", "device": "proc", "mountpoint": "/proc", "freq": "0", "type": "proc", "options": "nodev,noexec,nosuid" }, { "passno": "1", "device": "UUID=dfccef1e-d46c-45b8-969d-51391898c55e", "mountpoint": "/", "freq": "0", "type": "ext4", "options": "errors=remount-ro" } ] } >>> tmpfs = FilesystemData() >>> tmpfs.mountpoint = '/srv/cache' >>> tmpfs.type = 'tmpfs' >>> tmpfs.device = 'none' >>> config.tree.filesystems.append(tmpfs) >>> config.save() >>> quit() $ cat /etc/fstab proc /proc proc nodev,noexec,nosuid 0 0 UUID=dfccef1e-d46c-45b8-969d-51391898c55e / ext4 errors=remount-ro 0 1 none /srv/cache tmpfs none 0 0 


рд░реАрдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдПрдХ рдореЙрдбреНрдпреВрд▓рд░ рд╕рд┐рд╕реНрдЯрдо рд╣реИ, рдФрд░ * рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреНрд▓рд╛рд╕реЗрд╕ рдХреБрдЫ рдЖрдВрддрд░рд┐рдХ рд▓реЙрдЬрд┐рдХ рдХреЛ рдЫрд┐рдкрд╛рддреЗ рд╣реИрдВред
рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдкрд┐рдЫрд▓рд╛ рдЙрджрд╛рд╣рд░рдг "рд╣реВрдб рдХреЗ рддрд╣рдд" рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрд╛рда рдкрд╛рд░реНрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕рд╛рд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 >>> from reconfigure.parsers import SSVParser >>> from reconfigure.builders import BoundBuilder >>> content = open('/etc/fstab').read() >>> syntax_tree = SSVParser().parse(content) >>> syntax_tree <reconfigure.nodes.RootNode object at 0x7f1319eeec50> >>> print syntax_tree (None) (line) (token) value = proc (token) value = /proc (token) value = proc (token) value = nodev,noexec,nosuid (token) value = 0 (token) value = 0 (line) (token) value = UUID=83810b56-ef4b-44de-85c8-58dc589aef48 (token) value = / (token) value = ext4 (token) value = errors=remount-ro (token) value = 0 (token) value = 1 


рдлрд┐рд░, рдмрд┐рд▓реНрдбрд░ рд╡рд░реНрдЧ рдирд┐рдпрдорд┐рдд рдЕрдЬрдЧрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА рд╕реЗ рдмрд╛рдВрдзрддрд╛ рд╣реИред

 >>> builder = BoundBuilder(FSTabData) >>> data_tree = builder.build(syntax_tree) >>> print data_tree { "filesystems": [ { "passno": "0", "device": "proc", "mountpoint": "/proc", "freq": "0", "type": "proc", "options": "nodev,noexec,nosuid" }, { "passno": "1", "device": "UUID=83810b56-ef4b-44de-85c8-58dc589aef48", "mountpoint": "/", "freq": "0", "type": "ext4", "options": "errors=remount-ro" } ] } 


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБрдПрдВ рдкреНрд░реЙрдХреНрд╕реА рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕рднреА рдлрд╝реАрд▓реНрдб рдЧреБрдг рд╣реИрдВ, рдФрд░ рдмрджрд▓рддреЗ рд╕рдордп, рд╡реЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЯреНрд░реА рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред

 >>> syntax_tree.children[0] <reconfigure.nodes.Node object at 0x7f51c63b9f10> >>> print syntax_tree.children[0] (line) (token) value = proc (token) value = /proc (token) value = proc (token) value = nodev,noexec,nosuid (token) value = 0 (token) value = 0 >>> data_tree.filesystems[0].options += ',rw' >>> print syntax_tree.children[0] (line) (token) value = proc (token) value = /proc (token) value = proc (token) value = nodev,noexec,nosuid,rw (token) value = 0 (token) value = 0 


рдкреЗрдбрд╝ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдХреНрд▓рд╛рд╕ рдлреАрд▓реНрдб рдореЗрдВ рдмрд╛рдБрдзрдиреЗ рдХреЗ рдирд┐рдпрдо * рдбреЗрдЯрд╛ рдХреНрд▓рд╛рд╕реЗрд╕ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВред
/Etc/resolv.conf рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:

 from reconfigure.nodes import Node, PropertyNode from reconfigure.items.bound import BoundData class ResolvData (BoundData): pass class ItemData (BoundData): def template(self): return Node('line', children=[ Node('token', children=[PropertyNode('value', 'nameserver')]), Node('token', children=[PropertyNode('value', '8.8.8.8')]), ]) ResolvData.bind_collection('items', item_class=ItemData) ItemData.bind_property('value', 'name', path=lambda x: x.children[0]) ItemData.bind_property('value', 'value', path=lambda x: x.children[1]) 


рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА, рд╕рд┐рдВрдЯреИрдХреНрд╕ рдФрд░ рдбреЗрдЯрд╛ рдЯреНрд░реА рд╣реИрдВ:

 >>> print open('/etc/resolv.conf').read() # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN nameserver 127.0.0.1 >>> print syntax_tree (None) (line) (Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN) (token) value = nameserver (token) value = 127.0.0.1 >>> print data_tree { "items": [ { "name": "nameserver", "value": "127.0.0.1" } ] } 


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд░реАрдХреЙрдиреНрдлрд┐рдЧрд░ рдХреБрдЫ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕реЗ рдЕрд╡рдЧрдд рд╣реИ, рдФрд░ рдпрд╣ рдпрд╛рдж рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдерд╛ред

рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкрд╛рд░реНрд╕рд░реНрд╕, рдмрд┐рд▓реНрдбрд░реЛрдВ рдФрд░ рд╢рд╛рдорд┐рд▓рдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдкреБрди: рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ ред

рд░реАрдХреЙрдиреНрдлрд┐рдЧрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдЬрд╝реЗрдВрддреА 1.0 рдмреАрдЯрд╛ рдХрд╛ рджрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд▓реА рдмрд╛рд░ рдЙрд╕ рдкрд░ рдЕрдзрд┐рдХ :)

Github
PYPI
рдкреНрд░рд▓реЗрдЦрди
DEB рдФрд░ RPM рдкреИрдХреЗрдЬ рдЕрдЬреЗрдВрдЯреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ

Source: https://habr.com/ru/post/In188248/


All Articles