xref: /qemu/tests/functional/qemu_test/archive.py (revision 379ee839f9ae374302c4b9f444c9f804ec7a2796)
1cfcb4484SDaniel P. Berrangé# SPDX-License-Identifier: GPL-2.0-or-later
2cfcb4484SDaniel P. Berrangé#
3cfcb4484SDaniel P. Berrangé# Utilities for python-based QEMU tests
4cfcb4484SDaniel P. Berrangé#
5cfcb4484SDaniel P. Berrangé# Copyright 2024 Red Hat, Inc.
6cfcb4484SDaniel P. Berrangé#
7cfcb4484SDaniel P. Berrangé# Authors:
8cfcb4484SDaniel P. Berrangé#  Thomas Huth <thuth@redhat.com>
9cfcb4484SDaniel P. Berrangé
10cfcb4484SDaniel P. Berrangéimport os
11cfcb4484SDaniel P. Berrangéimport subprocess
12cfcb4484SDaniel P. Berrangéimport tarfile
13*379ee839SDaniel P. Berrangéimport zipfile
14cfcb4484SDaniel P. Berrangé
15cfcb4484SDaniel P. Berrangé
16cfcb4484SDaniel P. Berrangédef tar_extract(archive, dest_dir, member=None):
17cfcb4484SDaniel P. Berrangé    with tarfile.open(archive) as tf:
18cfcb4484SDaniel P. Berrangé        if hasattr(tarfile, 'data_filter'):
19cfcb4484SDaniel P. Berrangé            tf.extraction_filter = getattr(tarfile, 'data_filter',
20cfcb4484SDaniel P. Berrangé                                           (lambda member, path: member))
21cfcb4484SDaniel P. Berrangé        if member:
22cfcb4484SDaniel P. Berrangé            tf.extract(member=member, path=dest_dir)
23cfcb4484SDaniel P. Berrangé        else:
24cfcb4484SDaniel P. Berrangé            tf.extractall(path=dest_dir)
25cfcb4484SDaniel P. Berrangé
26cfcb4484SDaniel P. Berrangédef cpio_extract(cpio_handle, output_path):
27cfcb4484SDaniel P. Berrangé    cwd = os.getcwd()
28cfcb4484SDaniel P. Berrangé    os.chdir(output_path)
29cfcb4484SDaniel P. Berrangé    subprocess.run(['cpio', '-i'],
30cfcb4484SDaniel P. Berrangé                   input=cpio_handle.read(),
31cfcb4484SDaniel P. Berrangé                   stderr=subprocess.DEVNULL)
32cfcb4484SDaniel P. Berrangé    os.chdir(cwd)
33*379ee839SDaniel P. Berrangé
34*379ee839SDaniel P. Berrangédef zip_extract(archive, dest_dir, member=None):
35*379ee839SDaniel P. Berrangé    with zipfile.ZipFile(archive, 'r') as zf:
36*379ee839SDaniel P. Berrangé        if member:
37*379ee839SDaniel P. Berrangé            zf.extract(member=member, path=dest_dir)
38*379ee839SDaniel P. Berrangé        else:
39*379ee839SDaniel P. Berrangé            zf.extractall(path=dest_dir)
40