Skip to content

Commit 4df7e8f

Browse files
committed
Merge remote-tracking branch 'origin/master' into edge
2 parents 0eeecf5 + 93caa5c commit 4df7e8f

File tree

6 files changed

+35
-10
lines changed

6 files changed

+35
-10
lines changed

mig/shared/fileio.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -617,14 +617,16 @@ def _copy_helper(src, dst, configuration, recursive):
617617
"""Copy a file or directory from src to dst where dst must be a new
618618
file/dir path and the parent dir is created if necessary. The recursive
619619
flag enables recursive copy.
620+
We use the same 'copy2' helper for single file copies as for the recursive
621+
copytree case to always transfer metadata, too.
620622
"""
621623
dst_dir = os.path.dirname(dst)
622624
makedirs_rec(dst_dir, configuration)
623625
try:
624626
if recursive:
625627
shutil.copytree(src, dst)
626628
else:
627-
shutil.copy(src, dst)
629+
shutil.copy2(src, dst)
628630
except Exception as exc:
629631
return (False, "copy %r %r failed: %s" % (src, dst, exc))
630632
return (True, "")

mig/shared/freezefunctions.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,17 +182,24 @@ def build_freezeitem_object(configuration, freeze_dict, summary=False,
182182
'title': 'Show archive file %(name)s' % file_item,
183183
'text': ''
184184
}
185+
# NOTE: we have file creation time in archive as timestamp
185186
int_timestamp = int(file_item['timestamp'])
187+
# NOTE: we may have preserved file modification time as file_mtime
188+
int_origtime = int(file_item.get('file_mtime', int_timestamp))
186189
# NOTE: datetime is not json-serializable so we force to string
187190
dt_timestamp = datetime.datetime.fromtimestamp(int_timestamp)
191+
dt_origtime = datetime.datetime.fromtimestamp(int_origtime)
188192
str_timestamp = "%s" % dt_timestamp
193+
if dt_timestamp != dt_origtime:
194+
str_timestamp += " / %s" % dt_origtime
189195
# NOTE: xmlrpc is limited to 32-bit ints so force size to string
190196
str_size = "%(size)s" % file_item
191197
entry = {
192198
'object_type': 'frozenfile',
193199
'name': file_item['name'],
194200
'showfile_link': showfile_link,
195201
'timestamp': int_timestamp,
202+
'origtime': int_origtime,
196203
'date': str_timestamp,
197204
'size': str_size,
198205
}
@@ -713,14 +720,16 @@ def get_frozen_files(client_id, freeze_id, configuration,
713720
entry = file_map.get(rel_path, {})
714721
if not entry or needs_update:
715722
entry['name'] = entry.get('name', rel_path)
716-
file_ctime, file_size = -1, -1
723+
file_ctime, file_mtime, file_size = -1, -1, -1
717724
try:
718725
file_ctime = os.path.getctime(frozen_path)
726+
file_mtime = os.path.getmtime(frozen_path)
719727
file_size = os.path.getsize(frozen_path)
720728
except Exception as err:
721729
_logger.warning("failed to update cached %s stats: %s" %
722730
(frozen_path, err))
723-
entry['timestamp'] = file_ctime
731+
entry['timestamp'] = entry['file_ctime'] = file_ctime
732+
entry['file_mtime'] = file_mtime
724733
entry['size'] = file_size
725734
updates += 1
726735

mig/shared/functionality/addfreezedata.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# --- BEGIN_HEADER ---
55
#
66
# addfreezedata - back end for adding data to existing freeze archive
7-
# Copyright (C) 2003-2018 The MiG Project lead by Brian Vinter
7+
# Copyright (C) 2003-2024 The MiG Project lead by Brian Vinter
88
#
99
# This file is part of MiG.
1010
#
@@ -26,10 +26,11 @@
2626
#
2727

2828
"""Add a file or folder to existing freeze archive e.g. in background job"""
29+
2930
from __future__ import absolute_import
3031

3132
from mig.shared.functionality.createfreeze import main as freeze_main, \
32-
signature as freeze_signature
33+
signature as freeze_signature, default_algo
3334

3435

3536
def main(client_id, user_arguments_dict):
@@ -39,4 +40,6 @@ def main(client_id, user_arguments_dict):
3940
args_dict = freeze_signature()[1]
4041
args_dict.update(user_arguments_dict)
4142
args_dict['flavor'] = ['freeze']
43+
# Always checksum when running in background
44+
args_dict['checksum_list'] = [default_algo]
4245
return freeze_main(client_id, args_dict)

mig/shared/functionality/createbackup.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# --- BEGIN_HEADER ---
55
#
66
# createbackup - back end for one-shot backup archive creation
7-
# Copyright (C) 2003-2018 The MiG Project lead by Brian Vinter
7+
# Copyright (C) 2003-2024 The MiG Project lead by Brian Vinter
88
#
99
# This file is part of MiG.
1010
#
@@ -29,7 +29,7 @@
2929
from __future__ import absolute_import
3030

3131
from mig.shared.functionality.createfreeze import main as createfreeze_main, \
32-
signature as createfreeze_signature, keyword_final
32+
signature as createfreeze_signature, keyword_final, default_algo
3333

3434

3535
def main(client_id, user_arguments_dict):
@@ -39,5 +39,7 @@ def main(client_id, user_arguments_dict):
3939
args_dict = createfreeze_signature()[1]
4040
args_dict.update(user_arguments_dict)
4141
args_dict['flavor'] = ['backup']
42+
# Always checksum when running in background
43+
args_dict['checksum_list'] = [default_algo]
4244
args_dict['freeze_state'] = [keyword_final]
4345
return createfreeze_main(client_id, args_dict)

mig/shared/functionality/createfreeze.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# --- BEGIN_HEADER ---
55
#
66
# createfreeze - back end for freezing archives
7-
# Copyright (C) 2003-2023 The MiG Project lead by Brian Vinter
7+
# Copyright (C) 2003-2024 The MiG Project lead by Brian Vinter
88
#
99
# This file is part of MiG.
1010
#
@@ -38,7 +38,7 @@
3838
keyword_auto, keyword_pending, keyword_final
3939
from mig.shared.fileio import strip_dir, walk
4040
from mig.shared.freezefunctions import create_frozen_archive, published_url, \
41-
is_frozen_archive
41+
is_frozen_archive, get_frozen_files, default_algo
4242
from mig.shared.functional import validate_input_and_cert, REJECT_UNSET
4343
from mig.shared.handlers import safe_handler, get_csrf_limit, make_csrf_token
4444
from mig.shared.html import man_base_js, man_base_html, html_post_helper
@@ -62,6 +62,7 @@ def signature():
6262
'freeze_department': [''],
6363
'freeze_organization': [''],
6464
'freeze_state': [keyword_auto],
65+
'checksum_list': [],
6566
}
6667
return ['text', defaults]
6768

@@ -243,6 +244,7 @@ def main(client_id, user_arguments_dict):
243244
freeze_department = accepted['freeze_department'][-1].strip()
244245
freeze_organization = accepted['freeze_organization'][-1].strip()
245246
freeze_publish = accepted['freeze_publish'][-1].strip()
247+
chksums = accepted['checksum_list']
246248
do_publish = (freeze_publish.lower() in ('on', 'true', 'yes', '1'))
247249

248250
# Share init of base meta with lookup of default state in freeze_flavors
@@ -336,6 +338,13 @@ def main(client_id, user_arguments_dict):
336338
freeze_id = freeze_meta['ID']
337339
logger.info("%s: successful for '%s': %s" % (op_name,
338340
freeze_id, client_id))
341+
# Calculate / update checksums if requested
342+
if chksums:
343+
(chksum_status, chksum_res) = get_frozen_files(client_id, freeze_id,
344+
configuration,
345+
checksum_list=chksums,
346+
force_refresh=True)
347+
339348
# Return simple status mainly for use in scripting
340349
output_objects.append({'object_type': 'freezestatus', 'freeze_id': freeze_id,
341350
'flavor': flavor, 'freeze_state': freeze_state})

mig/shared/output.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1619,7 +1619,7 @@ def html_format(configuration, ret_val, ret_msg, out_obj):
16191619
<tr>
16201620
<th>Name</th>
16211621
<th class="icon">Action<!-- Open, Delete --></th>
1622-
<th>Date</th>
1622+
<th>Date added / original</th>
16231623
<th>Size in bytes</th>'''
16241624
for algo in sorted_hash_algos:
16251625
checksum_field = '%ssum' % algo

0 commit comments

Comments
 (0)