handlers: Make create_action pass any kwargs to the constructor.
[matthijs/projects/backupninja.git] / src / lib / backupninja / action.py
1 # -*- mode: python; sh-basic-offset: 4; indent-tabs-mode: nil; -*-
2 # vim: set filetype=python sw=4 sts=4 expandtab autoindent:
3 #
4 #    Backupninja python reimplementation, based on original backupninja program
5 #    by riseup.net.
6 #    Copyright (C) 2010  Matthijs Kooijman <matthijs@stdin.nl>
7 #
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.
12 #
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.
17 #
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.
21
22 """ Running backup actions """
23
24 import os
25 import logging as log
26
27 from backupninja import config
28 from backupninja import handlers
29
30 def run_all_actions(opts, global_config):
31     """
32     Run all defined actions.
33
34     opts are the parsed commandline options, global_config is the parsed
35     global configuration.
36     """
37     log.info('Running all actions')
38     try:
39         action_configs = config.list_actions(opts)
40     except OSError, e:
41         log.critical('Unable to list actions: %s', e)
42         return
43
44     action_configs.sort()
45
46     for action_config in action_configs:
47         run_action(action_config, opts, global_config)
48
49 def run_action(action_config, opts, global_config):
50     """
51     Run a single action. action_config is the full path to its
52     configuration file. opts are the parsed commandline options,
53     global_config is the parsed global configuration.
54     """
55     # Split the action filename
56     parts = os.path.basename(action_config).split('.')
57     if (len(parts) != 2):
58         log.error('Invalid action filename: "%s". Should be in the form name.type, where type is a valid handler.' % action_config)
59         return
60     (action_name, action_ty) = parts
61     log.info('Running action "%s.%s"', action_name, action_ty)
62
63     try:
64         # Create a handler for this action
65         action = handlers.create_action(action_ty)
66         # Let the handler load its configuration file
67         action.load_config(action_config)
68         # Run it
69         action.run(test=opts.test)
70         action.finish(test=opts.test)
71         # Ask the action if there where any failures
72         success = not action.failed
73     except Exception, e:
74         log.error('Unexpected exception: %s', e)
75         import traceback
76         log.debug(traceback.format_exc())
77         success = False
78
79     if success:
80         log.info('Running action "%s.%s" succeeded', action_name, action_ty)
81     else:
82         log.info('Running action "%s.%s" failed', action_name, action_ty)