new file versioning policy and manager. be sure to add version_folder in your conf

This commit is contained in:
ville rantanen
2018-07-21 12:50:20 +03:00
parent 7d123db05f
commit 46ef4f2856
8 changed files with 146 additions and 35 deletions

View File

@@ -93,6 +93,68 @@ def list_folders(shares,config):
print(tabulate(table, headers = "firstrow"))
def list_versions(shares, config, opts):
if 'data_folder' not in config:
print("data_folder not defined in config")
sys.exit(1)
data_folder = os.path.join(config['__root_path__'], config['data_folder'])
table = []
header = ['Share', 'Path', 'File', 'Size', 'Unit']
if opts.delete == None:
header.append('Age')
else:
header.append('Delete')
table.append(header)
now = datetime.now()
for share in shares:
if opts.name:
if share['name'] != opts.name:
continue
version_folder = os.path.join(
data_folder,
share['path'],
config['version_folder']
)
if not os.path.isdir(version_folder):
table.append((
share['name'],
share['path']+'/',
'-', '-', '-', '-'
))
else:
for filename in sorted(os.listdir(version_folder)):
full_path = os.path.join(version_folder, filename)
if os.path.isdir(full_path):
size = get_folder_size(full_path)
else:
size = os.path.getsize(full_path)
(size_num, size_unit) = file_size_human(
size,
HTML=False
).split(" ",1)
parsed_date = version_date(filename)
if parsed_date == None:
age_str = '-'
else:
age = now - parsed_date
age_str = "%d d"%( age.days, )
if opts.delete != None:
to_delete = age.days >= opts.delete
age_str = "To Del" if to_delete else "Keep"
if not opts.dry and to_delete:
age_str = "Deleted"
os.remove(full_path)
table.append((
share['name'],
share['path'] + '/',
filename,
size_num,
size_unit,
age_str
))
print(tabulate(table, headers = "firstrow"))
def add_share(shares, config, opts):
# Make name and path safe:
@@ -408,7 +470,7 @@ def print_rest_api_download(config, share, token, show_filename):
if not os.path.exists(share_path):
print("no files")
sys.exit(0)
for filename in iter_folder_files(share_path):
for filename in iter_folder_files(share_path, version_folder = config['version_folder']):
if show_filename:
if filename != show_filename:
continue
@@ -441,7 +503,7 @@ def print_rest_api_direct(config, share, token, show_filename):
if not os.path.exists(share_path):
print("no files")
sys.exit(0)
for filename in iter_folder_files(share_path):
for filename in iter_folder_files(share_path, version_folder = config['version_folder']):
if show_filename:
if filename != show_filename:
continue
@@ -540,6 +602,14 @@ def parse_options():
parser_list = subparsers.add_parser('list', help = "List shares")
## list folders
parser_folders = subparsers.add_parser('folders', help = "List the subfolders in data folder, and their disk usage")
## list versions
parser_versions = subparsers.add_parser('versions', help = "List the old versions stored in shares, and their disk usage")
parser_versions.add_argument('--delete', action="store", dest="delete", default = None, type = int,
help = "Delete old versions, older than N days.")
parser_versions.add_argument('--dry', action="store_true", dest="dry", default = False,
help = "Do not actually delete files.")
parser_versions.add_argument('-n','--name', action="store", dest="name", required = False, default = None,
help = "Show / Delete only this share versions. If omitted, applies to all shares")
## Show
parser_show = subparsers.add_parser('show', help = "Show share")
parser_show.add_argument('-P', action="store_true", dest="show_password", default = False,
@@ -655,6 +725,8 @@ if __name__ == "__main__":
if opts.subparser_name == 'list':
list_shares(shares,opts)
if opts.subparser_name == 'versions':
list_versions(shares,config,opts)
elif opts.subparser_name == 'folders':
list_folders(shares,config)
elif opts.subparser_name == 'show':