NFS exports configuration

NFSExports and NFSExportsD provide a parsed output of the content of an exports file as defined in man exports(5). The content is parsed into a dictionary, where the key is the export path and the value is another dictionary, where the key is the hostname and the value is the option list, parsed into an actual list.

The default ("-") hostname is not specially handled, nor are wildcards.

If export paths are defined multiple times in a file, only the first one is parsed. All subsequent redefinitions are not parsed and the raw line is added to the ignored_lines member.

All raw lines are kept in raw_lines, which is a dict where the key is the export path and the value is the stripped raw line.

Parsers included in this module are:

NFSExports - file nfs_exports

NFSExportsD - files in the nfs_exports.d directory

Sample content of the /etc/exports file:

/home/utcs/shared/ro                    @group(ro,sync)   ins1.example.com(rw,sync,no_root_squash) ins2.example.com(rw,sync,no_root_squash)
/home/insights/shared/rw                @group(rw,sync)   ins1.example.com(rw,sync,no_root_squash) ins2.example.com(ro,sync,no_root_squash)
/home/insights/shared/special/all/mail  @group(rw,sync,no_root_squash)
/home/insights/ins/special/all/config   @group(ro,sync,no_root_squash)  ins1.example.com(rw,sync,no_root_squash)
#/home/insights                          ins1.example.com(rw,sync,no_root_squash)
/home/example                           @group(rw,sync,root_squash) ins1.example.com(rw,sync,no_root_squash) ins2.example.com(rw,sync,no_root_squash)
# A duplicate host for this exported path
/home/example                           ins2.example.com(rw,sync,no_root_squash)

Examples

>>> type(exports)
<class 'insights.parsers.nfs_exports.NFSExports'>
>>> type(exports.data) == type({})
True
>>> exports.raw_lines['/home/insights/shared/rw']  # List of lines that define this path
['/home/insights/shared/rw                @group(rw,sync)   ins1.example.com(rw,sync,no_root_squash) ins2.example.com(ro,sync,no_root_squash)']
>>> exports.raw_lines['/home/example']  # Lines are stored even if they contain duplicate hosts
['/home/example                           @group(rw,sync,root_squash) ins1.example.com(rw,sync,no_root_squash) ins2.example.com(rw,sync,no_root_squash)', '/home/example                           ins2.example.com(rw,sync,no_root_squash)']
>>> exports.ignored_exports
{'/home/example': {'ins2.example.com': ['rw', 'sync', 'no_root_squash']}}
>>> sorted(list(exports.all_options()))
['no_root_squash', 'ro', 'root_squash', 'rw', 'sync']
>>> sorted(list(exports.export_paths()))
['/home/example', '/home/insights/ins/special/all/config', '/home/insights/shared/rw', '/home/insights/shared/special/all/mail', '/home/utcs/shared/ro']
class insights.parsers.nfs_exports.NFSExports(context)[source]

Bases: NFSExportsBase

Subclass to attach nfs_exports spec to

class insights.parsers.nfs_exports.NFSExportsBase(context)[source]

Bases: Parser

Class to parse /etc/exports and /etc/exports.d/*.exports.

Exports are stored keyed on the path of the export, and then the host definition. The flags are stored as a list. NFS allows the same path to be listed on multiple lines and in multiple files, but an exported path can only have one definition for a given host.

data

Key is export path, value is a dict, where the key is the client host and the value is a list of options.

Type:

dict

ignored_exports

A dictionary of exported paths that have host definitions that conflicted with a previous definition.

Type:

dict

ignored_lines

A synonym for the above ignored_exports dictionary, for historical reasons.

Type:

dict

raw_lines

The list of the raw lines that define each exported path, including any lines that may have ignored exports.

Type:

dict of lists

all_options()[source]

Returns the set of all options used in all export entries

export_paths()[source]

Returns the set of all export paths as strings

parse_content(content)[source]

This method must be implemented by classes based on this class.

class insights.parsers.nfs_exports.NFSExportsD(context)[source]

Bases: NFSExportsBase

Subclass to attach nfs_exports.d spec to