| #!/usr/bin/python |
| |
| """A crontab script to delete night test data.""" |
| __author__ = 'shenhan@google.com (Han Shen)' |
| |
| import datetime |
| import optparse |
| import os |
| import re |
| import sys |
| |
| from utils import command_executer |
| from utils import constants |
| from utils import misc |
| |
| DIR_BY_WEEKDAY = ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun') |
| |
| |
| def CleanNumberedDir(s, dry_run=False): |
| """Deleted directories under each dated_dir.""" |
| chromeos_dirs = [os.path.join(s, x) for x in os.listdir(s) |
| if misc.IsChromeOsTree(os.path.join(s, x))] |
| ce = command_executer.GetCommandExecuter() |
| all_succeeded = True |
| for cd in chromeos_dirs: |
| if misc.DeleteChromeOsTree(cd, dry_run=dry_run): |
| print 'Successfully removed chromeos tree "{0}".'.format(cd) |
| else: |
| all_succeeded = False |
| print 'Failed to remove chromeos tree "{0}", please check.'.format(cd) |
| |
| if not all_succeeded: |
| print 'Failed to delete at least one chromeos tree, please check.' |
| return False |
| |
| ## Now delete the numbered dir Before forcibly removing the directory, just |
| ## check 's' to make sure it is sane. A valid dir to be removed must be |
| ## '/usr/local/google/crostc/(SUN|MON|TUE...|SAT)'. |
| valid_dir_pattern = ('^' + constants.CROSTC_WORKSPACE + '/(' + |
| '|'.join(DIR_BY_WEEKDAY) + ')') |
| if not re.search(valid_dir_pattern, s): |
| print ('Trying to delete an invalid dir "{0}" (must match "{1}"), ' |
| 'please check.'.format(s, valid_dir_pattern)) |
| return False |
| |
| cmd = 'rm -fr {0}'.format(s) |
| if dry_run: |
| print cmd |
| else: |
| if ce.RunCommand(cmd, return_output=False, print_to_console=True, |
| terminated_timeout=480) == 0: |
| print 'Successfully removed "{0}".'.format(s) |
| else: |
| all_succeeded = False |
| print 'Failed to remove "{0}", please check.'.format(s) |
| return all_succeeded |
| |
| |
| def CleanDatedDir(dated_dir, dry_run=False): |
| # List subdirs under dir |
| subdirs = [os.path.join(dated_dir, x) for x in os.listdir(dated_dir) |
| if os.path.isdir(os.path.join(dated_dir, x))] |
| all_succeeded = True |
| for s in subdirs: |
| if not CleanNumberedDir(s, dry_run): |
| all_succeeded = False |
| return all_succeeded |
| |
| |
| def ProcessArguments(argv): |
| """Process arguments.""" |
| parser = optparse.OptionParser( |
| description='Automatically delete nightly test data directories.', |
| usage='auto_delete_nightly_test_data.py options') |
| parser.add_option('-d', '--dry_run', dest='dry_run', |
| default=False, action='store_true', |
| help='Only print command line, do not execute anything.') |
| parser.add_option('--days_to_perserve', dest='days_to_preserve', default=3, |
| help=('Specify the number of days, test data generated ' |
| 'on these days will *NOT* be deleted. ' |
| 'Defaults to 3.')) |
| options, _ = parser.parse_args(argv) |
| return options |
| |
| |
| def Main(argv): |
| """Delete nightly test data directories.""" |
| options = ProcessArguments(argv) |
| # Function 'isoweekday' returns 1(Monday) - 7 (Sunday). |
| d = datetime.datetime.today().isoweekday() |
| # We go back 1 week, delete from that day till we are |
| # options.days_to_preserve away from today. |
| s = d - 7 |
| e = d - int(options.days_to_preserve) |
| rv = 0 |
| for i in range(s + 1, e): |
| if i <= 0: |
| ## Wrap around if index is negative. 6 is from i + 7 - 1, because |
| ## DIR_BY_WEEKDAY starts from 0, while isoweekday is from 1-7. |
| dated_dir = DIR_BY_WEEKDAY[i+6] |
| else: |
| dated_dir = DIR_BY_WEEKDAY[i-1] |
| rv += 0 if CleanDatedDir(os.path.join( |
| constants.CROSTC_WORKSPACE, dated_dir), options.dry_run) else 1 |
| return rv |
| |
| |
| if __name__ == '__main__': |
| retval = Main(sys.argv) |
| sys.exit(retval) |