main: Add --test option for a dry run.
[matthijs/projects/backupninja.git] / src / backupninja
1 #!/usr/bin/python
2 # -*- mode: python; sh-basic-offset: 4; indent-tabs-mode: nil; -*-
3 # vim: set filetype=python sw=4 sts=4 expandtab autoindent:
4 #
5 #    Backupninja python reimplementation, based on original backupninja program
6 #    by riseup.net.
7 #    Copyright (C) 2010  Matthijs Kooijman <matthijs@stdin.nl>
8 #
9 #    This program is free software; you can redistribute it and/or modify
10 #    it under the terms of the GNU General Public License as published by
11 #    the Free Software Foundation; either version 2 of the License, or
12 #    (at your option) any later version.
13 #
14 #    This program is distributed in the hope that it will be useful,
15 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
16 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 #    GNU General Public License for more details.
18 #
19 #    You should have received a copy of the GNU General Public License along
20 #    with this program; if not, write to the Free Software Foundation, Inc.,
21 #    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22
23 """ Check for scheduled backupninja actions and run them when needed """
24
25 import optparse
26 import logging
27 import sys
28
29 from backupninja.log import setup_logging
30 from backupninja import config
31 from backupninja import action
32
33 log = logging.getLogger()
34
35 def make_option_parser():
36     description = """%prog checks for scheduled actions and runs them when needed."""
37     parser = optparse.OptionParser(description=description)
38     parser.add_option( "-c", "--confdir"
39                      , help="Load configuration from CONFIG_DIR "
40                             "instead of '%default'. When "
41                             "the --conffile or --actionsdir options "
42                             "specify relative paths, they are taken "
43                             "relative to this directory."
44                      , default="/etc/backupninja"
45                      , dest="config_dir"
46                      , metavar="CONFIG_DIR")
47     parser.add_option( "-f", "--conffile"
48                      , help="Load the main configuration from FILE instead "
49                             "of '%default'. If FILE is a relative path, it "
50                             "is interpreted relative to CONFIG_DIR."
51                      , default='backupninja.conf'
52                      , dest="global_config"
53                      , metavar="FILE")
54     parser.add_option( "-a", "--actionsdir"
55                      , help="Load action configurations from ACTIONS_DIR "
56                             "instead of '%default'. If ACTIONS_DIR is a "
57                             "relative path, it is interpreted relative to "
58                             "CONFIG_DIR."
59                      , default="actions"
60                      , dest="actions_dir"
61                      , metavar="ACTIONS_DIR")
62     parser.add_option( "-d", "--debug"
63                      , help="Run in debug mode. This only means logging is "
64                             "more verbose."
65                      , action="store_true"
66                      , dest="debug")
67     parser.add_option( "-t", "--test"
68                      , help="Run in testing mode. This means no actions "
69                             "are taken, only show what would be done "
70                             "(as far as possible without taking "
71                             "actions, of course)."
72                      , action="store_true"
73                      , dest="test")
74     return parser
75  
76 def main(argv):
77     # Parse options (Note that this exits in case of --help or an
78     # invalid commandline)
79     parser = make_option_parser()
80     (options, args) = parser.parse_args(argv)
81
82     # Setup logging
83     setup_logging(options)
84
85     # Load config file
86     global_conf = config.get_global_config(options)
87     if global_conf is None:
88         # Error was already logged
89         return 1
90
91     # Process command
92     action.run_all_actions(options, global_conf)
93
94     return 0
95
96 if __name__ == '__main__':
97     sys.exit(main(sys.argv))