ConfigParser.MissingSectionHeaderError when parsing rsyncd config file with global options

11,689

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.)

Share:
11,689
Pranjal Mittal
Author by

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, 2022

Comments

  • Pranjal Mittal
    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.