1 # -*- mode: python; sh-basic-offset: 4; indent-tabs-mode: nil; -*-
2 # vim: set filetype=python sw=4 sts=4 expandtab autoindent:
4 # Backupninja python reimplementation, based on original backupninja program
6 # Copyright (C) 2010 Matthijs Kooijman <matthijs@stdin.nl>
8 # This program is free software; you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation; either version 2 of the License, or
11 # (at your option) any later version.
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
18 # You should have received a copy of the GNU General Public License along
19 # with this program; if not, write to the Free Software Foundation, Inc.,
20 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 """ Load configuration for backupninja and configured actions """
24 import os, ConfigParser
26 # Defaults for global configuration values
27 default_global_config = {}
31 def get_global_config(opts):
33 Returns the global configuration, in a SafeConfigParser object.
34 If the configuration file can not be found, logs an error and
37 opts are the parsed commandline options.
39 global_config = os.path.join(opts.config_dir, opts.global_config)
40 return load_config(global_config, default_global_config)
42 def list_actions(opts):
44 Lists all actions defined in the configuration directory. Returns a
45 list of full paths to action configuration files.
47 opts are the parsed commandline options.
49 actions_dir = os.path.join(opts.config_dir, opts.actions_dir)
50 return [os.path.join(actions_dir, f)
51 for f in os.listdir(actions_dir)
52 if not f.startswith('.')]
54 def load_config(filename, defaults):
56 Load a configuration file, using the given default values.
58 The defaults argument contains a dictionary of sections. Each key is
59 a section name, each value is a dictionary of values (where the key
60 is the value name and the value is the actual value).
62 # Open a file and read it
63 config = ConfigParser.SafeConfigParser()
64 _set_default_config(config, defaults)
65 log.debug('Reading config file "%s"', filename)
67 file = open(filename, 'r')
69 # Log the error and return None
70 msg = 'Unable to open configuration file "%s": %s' % (filename, e)
77 def _set_default_config(parser, values):
79 Saves the values given to the ConfigParser given. This can be used
80 to store a set of default values to a ConfigParser before loading a
81 file (The defaults argument to the ConfigParser constructor only
82 sets the values of the "DEFAULT" section).
84 The values argument contains a dictionary of sections. Each key is a
85 section name, each value is a dictionary of values (where the key is
86 the value name and the value is the actual value).
88 for section, options in values.items():
89 if not parser.has_section(section):
90 parser.add_section(section)
91 for option, value in options.items():
92 # Interpret None as "no default", since ConfigParser doesn't
93 # like non-string values.
95 parser.set(section, option, value)