ConfigParser.MissingSectionHeaderError when parsing rsyncd config file with global options
Solution 1
Alex Martelli provided a solution for using ConfigParser to parse similar files (which are section less files). His solution is a file-like wrapper that will automatically insert a dummy section.
You can apply the above solution to parsing rsyncd config files.
>>> class FakeGlobalSectionHead(object):
... def __init__(self, fp):
... self.fp = fp
... self.sechead = '[global]\n'
... def readline(self):
... if self.sechead:
... try: return self.sechead
... finally: self.sechead = None
... else: return self.fp.readline()
...
>>> cp = ConfigParser()
>>> cp.readfp(FakeGlobalSectionHead(open('rsyncd.conf')))
>>> print(cp.items('global'))
[('path', '/data/ftp'), ('pid file', '/var/run/rsyncdpid.pid'), ...]
Solution 2
I use itertools.chain
(Python 3):
import configparser, itertools
cfg = configparser.ConfigParser()
filename = 'foo.ini'
with open(filename) as fp:
cfg.read_file(itertools.chain(['[global]'], fp), source=filename)
print(cfg.items('global'))
(source=filename
results in better error messages, especially if you read from multiple config files.)
Pranjal Mittal
TaggedWeb.com offers a software solutions marketplace, covering integrations, usage support, consultations and more. Business users often struggle with picking software and integrating it. Our mission is to help businesses find and utilize the best-fit software for their needs.
Updated on July 24, 2022Comments
-
Pranjal Mittal almost 2 years
A configuration file generally needs section headers for each section. In rsyncd config files a global section need not explicitly have a section header. Example of an rsyncd.conf file:
[rsyncd.conf]
# GLOBAL OPTIONS path = /data/ftp pid file = /var/run/rsyncdpid.pid syslog facility = local3 uid = rsync gid = rsync read only = true use chroot = true # MODULE OPTIONS [mod1] ...
How to parse such config files using python
ConfigParser
? Doing the following gives an erorr:>>> import ConfigParser >>> cp = ConfigParser.ConfigParser() >>> cp.read("rsyncd.conf") # Error: ConfigParser.MissingSectionHeaderError: File contains no section headers.