完美包装(Python中)

完美包装(Python中),python,wrapper,Python,Wrapper,我运行了一个配置管理工具,它调用/usr/bin/dpkg,但不显示stdout/stderr 出现问题,我想调试问题的根源 我想查看对dpkg和stdout/stderr的所有调用 我将原始的/usr/bin/dpkg移动到/usr/bin/dpkg orig,并编写了一个包装: #!/usr/bin/env python import os import sys import datetime import subx import psutil cmd=list(sys.argv) cmd[

我运行了一个配置管理工具,它调用/usr/bin/dpkg,但不显示stdout/stderr

出现问题,我想调试问题的根源

我想查看对
dpkg
和stdout/stderr的所有调用

我将原始的
/usr/bin/dpkg
移动到
/usr/bin/dpkg orig
,并编写了一个包装:

#!/usr/bin/env python
import os
import sys
import datetime
import subx
import psutil
cmd=list(sys.argv)
cmd[0]='dpkg-orig'

def parents(pid=None):
    if pid==1:
        return '\n'
    if pid is None:
        pid = os.getpid()
    process = psutil.Process(pid)
    lines = [parents(process.ppid())]
    lines.append('Parent: %s' % ' '.join(process.cmdline()))
    return '\n'.join(lines)

result = subx.call(cmd, assert_zero_exit_status=False)
with open('/var/tmp/dpkg-calls.log', 'ab') as fd:
    fd.write('----------- %s\n' % (datetime.datetime.now()))
    fd.write('%s\n' % parents())
    fd.write('stdout:\n%s\n\n' % result.stdout)
    sys.stdout.write(result.stdout)
    fd.write('stderr:\n%s\n' % result.stderr)
    fd.write('ret: %s\n' % result.ret)
    sys.stderr.write(result.stderr)
sys.exit(result.ret)
现在,我再次运行配置管理工具并搜索非零“ret:”行

输出:

Parent: /usr/bin/apt-get -q -y -o DPkg::Options::=--force-confold -o DPkg::Options::=--force-confdef install openssl-foo-bar-aptguettler.cert
Parent: python /usr/bin/dpkg --force-confold --force-confdef --status-fd 67 --no-triggers --unpack --auto-deconfigure /var/cache/apt/archives/openssl-foo-bar-aptguettler.cert_1-2_all.deb

stdout:


stderr:
dpkg: error: unable to read filedescriptor flags for <package status and progress file descriptor>: Bad file descriptor

ret: 2
Parent:/usr/bin/apt get-q-y-o DPkg::Options:=--force confold-o DPkg::Options:=--force confdef安装openssl-foo-bar-aptguettler.cert
父级:python/usr/bin/dpkg--force confold--force confdef--status fd 67--no触发器--unpack--auto deconfigure/var/cache/apt/archives/openssl-foo-bar-aptguettler.cert_1-2_all.deb
标准:
标准:
dpkg:错误:无法读取的文件描述符标志:错误的文件描述符
ret:2
这是因为我的包装还不完善

调用
dpkg
的工具想要读取文件描述符,但这不适用于我的包装器

我的目标是:

  • 捕获对dpkg的所有调用,并将其写入日志文件(works)
  • 写出父进程(工作)
  • dpkg
    的父进程不应注意到差异,也不应像上面那样失败(尚未工作)

你知道如何实现这一点吗?

我编写了一个简单的python脚本,解决了这个问题:

用于记录对linux命令的所有调用的包装器

特定用例:我的配置管理工具调用 /usr/bin/dpkg。出现错误,但不幸的是我的配置 管理工具没有向我显示整个stdout/stderr。我没有 有什么不对劲

一般用例:包装一个linux命令,如/usr/bin/dpkg,然后写入 把所有的电话都打出去