File: download_repos_parallel.py

package info (click to toggle)
librepo 1.20.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,028 kB
  • sloc: ansic: 18,802; python: 3,822; xml: 581; sh: 142; makefile: 64
file content (90 lines) | stat: -rwxr-xr-x 3,029 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#!/usr/bin/env python3

"""
librepo - example of usage of download_metadata API
"""

import os
import sys
import shutil

import librepo

DESTDIR = "downloaded_metadata"
PROGRESSBAR_LEN = 50

def hmf_callback_handle(data, msg, url, metadata):
    """Handle mirror failure callback"""
    print("%s: %s: %s (%s)" % (metadata, msg, url, data))
    sys.stdout.flush()

def hmf_callback(data, msg, url):
    """Handle mirror failure callback"""
    print("%s: %s (%s)" % (msg, url, data))
    sys.stdout.flush()

def end_callback(data, status, msg):
    """End callback"""
    print("End status: %s: %s (%s)" % (str(status), str(msg), str(data)))
    sys.stdout.flush()

def progress_callback(data, total_to_download, downloaded):
    """Progress callback"""
    if total_to_download <= 0:
        return
    completed = int(downloaded / (total_to_download / PROGRESSBAR_LEN))
    print(
        "[%s%s] %8s/%8s (%s)\r" % ('#'*completed, '-'*(PROGRESSBAR_LEN-completed), int(downloaded), int(total_to_download), str(data)),
    )
    sys.stdout.flush()

def create_handle(repo):
    # Handle represents a download configuration
    h = librepo.Handle()

    # --- Mandatory arguments -------------------------------------------
    # URL of metalink
    h.setopt(librepo.LRO_METALINKURL, "https://mirrors.fedoraproject.org/metalink?repo=" + repo + "&arch=x86_64")
    # Type of repository
    h.setopt(librepo.LRO_REPOTYPE, librepo.LR_YUMREPO)

    # --- Optional arguments --------------------------------------------
    # Make download interruptible
    h.setopt(librepo.LRO_INTERRUPTIBLE, True)
    # Destination directory for metadata
    h.setopt(librepo.LRO_DESTDIR, DESTDIR + "/" + repo)
    # Check checksum of all files (if checksum is available in repomd.xml)
    h.setopt(librepo.LRO_CHECKSUM, True)
    # Download only primary.xml, comps.xml and updateinfo
    # Note: repomd.xml is downloaded implicitly!
    # Note: If LRO_YUMDLIST is None -> all files are downloaded
    h.setopt(librepo.LRO_YUMDLIST, ["primary", "group", "updateinfo"])

    # Callback to display progress of downloading
    h.setopt(librepo.LRO_PROGRESSCB, progress_callback)
    # Callback to call handle mirror failure
    h.setopt(librepo.LRO_HMFCB, hmf_callback_handle)
    # Set user data for the callback
    h.setopt(librepo.LRO_PROGRESSDATA, "Callback data set in handle")

    return h


if __name__ == "__main__":
    # Prepare destination directory
    if os.path.exists(DESTDIR):
        shutil.rmtree(DESTDIR)
    os.mkdir(DESTDIR)

    cbdata = "Callback data set in metadata target"
    m1 = librepo.MetadataTarget(create_handle("fedora-41"), cbdata, progress_callback, hmf_callback, end_callback)
    m2 = librepo.MetadataTarget(create_handle("updates-released-f41"), cbdata, progress_callback, hmf_callback, end_callback)

    ret = librepo.download_metadata([m1, m2])
    if (ret):
        print(ret, file=sys.stderr)

    if (m1.err):
        print(m1.err, file=sys.stderr)
    if (m2.err):
        print(m2.err, file=sys.stderr)