53 lines
1.5 KiB
Text
53 lines
1.5 KiB
Text
|
#!/usr/bin/env python3
|
||
|
|
||
|
# 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
|
||
|
)
|