@ -21,23 +21,23 @@ import os
import os . path
import os . path
import time
import time
import re
import re
import glob
import logging
import logging
logger = logging . getLogger ( " filestore " )
logger = logging . getLogger ( " filestore " )
class InvalidAgeFormatError ( Exception ) :
class InvalidAgeFormatError ( Exception ) :
pass
pass
def register_args ( parser ) :
def register_args ( parser ) :
parsers = parser . add_subparsers ( )
parsers = parser . add_subparsers ( )
prune_parser = parsers . add_parser ( " prune " )
prune_parser = parsers . add_parser ( " prune " )
prune_parser . add_argument ( " -d " , " --directory " , help = " filestore directory " )
prune_parser . add_argument ( " -d " , " --directory " , help = " filestore directory " )
prune_parser . add_argument ( " --age " , help = " prune files older than age " )
prune_parser . add_argument ( " --age " , help = " prune files older than age " )
prune_parser . add_argument (
prune_parser . add_argument (
" -n " , " --dry-run " , action = " store_true " , default = False ,
" -n " , " --dry-run " , action = " store_true " , default = False ,
help = " only print what would happen " ) ;
help = " only print what would happen " )
prune_parser . add_argument (
prune_parser . add_argument (
" -v " , " --verbose " , action = " store_true " ,
" -v " , " --verbose " , action = " store_true " ,
default = False , help = " increase verbosity " )
default = False , help = " increase verbosity " )
@ -46,30 +46,32 @@ def register_args(parser):
help = " be quiet, log warnings and errors only " )
help = " be quiet, log warnings and errors only " )
prune_parser . set_defaults ( func = prune )
prune_parser . set_defaults ( func = prune )
def is_fileinfo ( path ) :
def is_fileinfo ( path ) :
return path . endswith ( " .json " )
return path . endswith ( " .json " )
def parse_age ( age ) :
def parse_age ( age ) :
m = re . match ( " ( \ d+) \ s*( \ w+) " , age )
m atched_age = re . match ( r " ( \ d+) \ s*( \ w+) " , age )
if not m :
if not m atched_age :
raise InvalidAgeFormatError ( age )
raise InvalidAgeFormatError ( age )
val = int ( m . group ( 1 ) )
val = int ( matched_age . group ( 1 ) )
unit = m . group ( 2 )
unit = matched_age . group ( 2 )
if unit == " s " :
if unit == " s " :
return val
return val
el if unit == " m " :
if unit == " m " :
return val * 60
return val * 60
el if unit == " h " :
if unit == " h " :
return val * 60 * 60
return val * 60 * 60
el if unit == " d " :
if unit == " d " :
return val * 60 * 60 * 24
return val * 60 * 60 * 24
else:
raise InvalidAgeFormatError ( " bad unit: %s " % ( unit ) )
raise InvalidAgeFormatError ( " bad unit: %s " % ( unit ) )
def get_filesize ( path ) :
def get_filesize ( path ) :
return os . stat ( path ) . st_size
return os . stat ( path ) . st_size
def remove_file ( path , dry_run ) :
def remove_file ( path , dry_run ) :
size = 0
size = 0
size + = get_filesize ( path )
size + = get_filesize ( path )
@ -77,6 +79,7 @@ def remove_file(path, dry_run):
os . unlink ( path )
os . unlink ( path )
return size
return size
def prune ( args ) :
def prune ( args ) :
if args . verbose :
if args . verbose :
@ -89,7 +92,7 @@ def prune(args):
" error: the filestore directory must be provided with --directory " ,
" error: the filestore directory must be provided with --directory " ,
file = sys . stderr )
file = sys . stderr )
return 1
return 1
if not args . age :
if not args . age :
print ( " error: no age provided, nothing to do " , file = sys . stderr )
print ( " error: no age provided, nothing to do " , file = sys . stderr )
return 1
return 1
@ -100,7 +103,6 @@ def prune(args):
count = 0
count = 0
for dirpath , dirnames , filenames in os . walk ( args . directory , topdown = True ) :
for dirpath , dirnames , filenames in os . walk ( args . directory , topdown = True ) :
# Do not go into the tmp directory.
# Do not go into the tmp directory.
if " tmp " in dirnames :
if " tmp " in dirnames :
dirnames . remove ( " tmp " )
dirnames . remove ( " tmp " )
@ -110,8 +112,9 @@ def prune(args):
mtime = os . path . getmtime ( path )
mtime = os . path . getmtime ( path )
this_age = now - mtime
this_age = now - mtime
if this_age > age :
if this_age > age :
logger . debug ( " Deleting %s ; age= %d s " % ( path , this_age ) )
logger . debug ( " Deleting %s ; age= %d s " , path , this_age )
size + = remove_file ( path , args . dry_run )
size + = remove_file ( path , args . dry_run )
count + = 1
count + = 1
logger . info ( " Removed %d files; %d bytes. " % ( count , size ) )
logger . info ( " Removed %d files; %d bytes. " , count , size )
return 0