From cd3114227a2228eefc270ae7020a3abc99e6c9b4 Mon Sep 17 00:00:00 2001 From: "Ira W. Snyder" Date: Tue, 26 Dec 2006 19:49:49 -0800 Subject: [PATCH] [RARSLAVE] Add porcelain Add all of the user-level polish, such as the option parser, and all related functions which are needed to implement its actions. Signed-off-by: Ira W. Snyder --- rarslave.py | 168 +++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 152 insertions(+), 16 deletions(-) diff --git a/rarslave.py b/rarslave.py index 285974d..1315f85 100644 --- a/rarslave.py +++ b/rarslave.py @@ -1,7 +1,10 @@ #!/usr/bin/env python # vim: set ts=4 sts=4 sw=4 textwidth=112 : -import re, os, sys +VERSION="2.0.0" +PROGRAM="rarslave2" + +import re, os, sys, optparse import par2parser import RarslaveConfig import RarslaveLogger @@ -12,6 +15,9 @@ import RarslaveLogger config = RarslaveConfig.RarslaveConfig() logger = RarslaveLogger.RarslaveLogger () +# Global options to be set / used later. +options = None + class RarslaveExtractor (object): def __init__ (self, type): @@ -390,7 +396,7 @@ class PAR2Set (object): return -ECHECK # Extraction Stage - EXTRACT_DIR = config.get_value ('directories', 'extract_directory') + EXTRACT_DIR = options.extract_dir extractor = find_extraction_heads (self.dir, self.likely_files) ret = extractor.extract (EXTRACT_DIR) @@ -399,7 +405,7 @@ class PAR2Set (object): return -EEXTRACT # Deletion Stage - DELETE_INTERACTIVE = config.get_value ('options', 'interactive') + DELETE_INTERACTIVE = options.interactive deleteable_files = find_deleteable_files (self.likely_files) ret = delete_list (deleteable_files, DELETE_INTERACTIVE) @@ -451,38 +457,168 @@ def generate_all_parsets (dir): return parsets -def main (): - TOPDIR = os.path.abspath ('test_material') +def check_required_progs(): + """Check if the required programs are installed""" - for (dir, subdirs, files) in os.walk (TOPDIR): - parsets = generate_all_parsets (dir) - for p in parsets: - p.run_all () + shell_not_found = 32512 + needed = [] + + if run_command ('par2repair --help > /dev/null 2>&1') == shell_not_found: + needed.append ('par2repair') + + if run_command ('unrar --help > /dev/null 2>&1') == shell_not_found: + needed.append ('unrar') + + if run_command ('unzip --help > /dev/null 2>&1') == shell_not_found: + needed.append ('unzip') + + if needed: + for n in needed: + print 'Needed program "%s" not found in $PATH' % (n, ) + + sys.exit(1) + +def run_options (options): + options.work_dir = full_abspath (options.work_dir) + + if options.extract_dir != None: + options.extract_dir = full_abspath (options.extract_dir) - print '\nRARSLAVE STATUS\n' + if options.version: + print PROGRAM + ' - ' + VERSION + print + print 'Copyright (c) 2005,2006 Ira W. Snyder (devel@irasnyder.com)' + print + print 'This program comes with ABSOLUTELY NO WARRANTY.' + print 'This is free software, and you are welcome to redistribute it' + print 'under certain conditions. See the file COPYING for details.' + sys.exit (0) + + if options.check_progs: + check_required_progs () + + if options.write_def_config: + config.write_config (default=True) + + if options.write_config: + config.write_config () + +def find_loglevel (options): + + loglevel = options.verbose - options.quiet + + if loglevel < RarslaveLogger.MessageType.Fatal: + loglevel = RarslaveLogger.MessageType.Fatal + + if loglevel > RarslaveLogger.MessageType.Debug: + loglevel = RarslaveLogger.MessageType.Debug + + return loglevel + +def printMessageTable (loglevel): - # Used in '--quiet' mode if logger.hasFatalMessages (): print '\nFatal Messages\n' + '=' * 80 logger.printLoglevel (RarslaveLogger.MessageType.Fatal) - # Used in no options mode + if loglevel == RarslaveLogger.MessageType.Fatal: + return + if logger.hasNormalMessages (): print '\nNormal Messages\n' + '=' * 80 logger.printLoglevel (RarslaveLogger.MessageType.Normal) - # Used in --verbose mode + if loglevel == RarslaveLogger.MessageType.Normal: + return + if logger.hasVerboseMessages (): print '\nVerbose Messages\n' + '=' * 80 logger.printLoglevel (RarslaveLogger.MessageType.Verbose) - # Used in --debug mode + if loglevel == RarslaveLogger.MessageType.Verbose: + return + if logger.hasDebugMessages (): print '\nDebug Messages\n' + '=' * 80 logger.printLoglevel (RarslaveLogger.MessageType.Debug) - print '\n\nALL MESSAGES:' - logger.printAllMessages () + return + +def main (): + + # Build the OptionParser + parser = optparse.OptionParser() + parser.add_option('-n', '--not-recursive', + action='store_false', dest='recursive', + default=config.get_value('options', 'recursive'), + help="Don't run recursively") + + parser.add_option('-d', '--work-dir', + dest='work_dir', type='string', + default=config.get_value('directories', 'working_directory'), + help="Start running at DIR", metavar='DIR') + + parser.add_option('-e', '--extract-dir', + dest='extract_dir', type='string', + default=config.get_value('directories', 'extract_directory'), + help="Extract to DIR", metavar='DIR') + + parser.add_option('-p', '--check-required-programs', + action='store_true', dest='check_progs', + default=False, + help="Check for required programs") + + parser.add_option('-f', '--write-default-config', + action='store_true', dest='write_def_config', + default=False, help="Write out a new default config") + + parser.add_option('-c', '--write-new-config', + action='store_true', dest='write_config', + default=False, help="Write out the current config") + + parser.add_option('-i', '--interactive', dest='interactive', action='store_true', + default=config.get_value('options', 'interactive'), + help="Confirm before removing files") + + parser.add_option('-q', '--quiet', dest='quiet', action='count', + default=0, help="Output fatal messages only") + + parser.add_option('-v', '--verbose', dest='verbose', action='count', + default=0, help="Output extra information") + + parser.add_option('-V', '--version', dest='version', action='store_true', + default=False, help="Output version information") + + parser.version = VERSION + + # Parse the given options + global options + (options, args) = parser.parse_args() + + # Run any special actions that are needed on these options + run_options (options) + + # Find the loglevel using the options given + loglevel = find_loglevel (options) + + # Run recursively + if options.recursive: + for (dir, subdirs, files) in os.walk (options.work_dir): + parsets = generate_all_parsets (dir) + for p in parsets: + p.run_all () + + # Non-recursive + else: + parsets = generate_all_parsets (options.work_dir) + for p in parsets: + p.run_all () + + # Print the results + printMessageTable (loglevel) + + # Done! + return 0 if __name__ == '__main__': main () -- 2.25.1