You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.6 KiB
56 lines
1.6 KiB
#!/usr/bin/env python3 |
|
# |
|
# This script is in the public domain |
|
# |
|
# Author: Johannes Schauer Marin Rodrigues <josch@mister-muffin.de> |
|
# |
|
# thin layer around /usr/lib/apt/solvers/apt, so that we can capture the solver |
|
# result |
|
# |
|
# we set Debug::EDSP::WriteSolution=yes so that Install stanzas also come with |
|
# Package and Version fields. That way, we do not also have to parse the EDSP |
|
# request and spend time matching ID numbers |
|
|
|
import subprocess |
|
import sys |
|
import os |
|
import getpass |
|
|
|
if not os.path.exists("/usr/lib/apt/solvers/apt"): |
|
print( |
|
"""Error: ERR_NO_SOLVER |
|
Message: The external apt solver doesn't exist. You must install the apt-utils package. |
|
""" |
|
) |
|
exit() |
|
|
|
fname = os.environ.get("APT_EDSP_DUMP_FILENAME") |
|
if fname is None: |
|
print( |
|
"""Error: ERR_NO_FILENAME |
|
Message: You have to set the environment variable APT_EDSP_DUMP_FILENAME |
|
to a valid filename to store the dump of EDSP solver input in. |
|
For example with: export APT_EDSP_DUMP_FILENAME=/tmp/dump.edsp |
|
""" |
|
) |
|
exit() |
|
|
|
try: |
|
with open(fname, "w") as f: |
|
with subprocess.Popen( |
|
["/usr/lib/apt/solvers/apt", "-oDebug::EDSP::WriteSolution=yes"], |
|
stdin=sys.stdin.fileno(), |
|
stdout=subprocess.PIPE, |
|
bufsize=0, # unbuffered |
|
text=True, # open in text mode |
|
) as p: |
|
for line in p.stdout: |
|
print(line, end="") |
|
f.write(line) |
|
except (FileNotFoundError, PermissionError) as e: |
|
print( |
|
"""Error: ERR_CREATE_FILE |
|
Message: Writing EDSP solver input to file '%s' failed as it couldn't be created! |
|
""" |
|
% fname |
|
)
|
|
|