尋ねられたように、質問に直接答える:
Yum (/usr/share/yum-cli/output.py) ソースにあります:
if self.conf.debuglevel < 2 or not sys.stdout.isatty():
progressbar = None
callback = None
else:
progressbar = YumTextMeter(fo=sys.stdout)
callback = CacheProgressCallback()
したがって、ハッキーな解決策は、Yum に pty を割り当てることです...
残念ながら、ストック Java ライブラリは、Linux が PTY の割り当てに使用する ptmx インターフェースへのアクセスを提供していないようです (ただし、JNI バインディングを使用してアクセスすることも考えられます — コードはそれほど複雑ではありません; Google で簡単に検索すると、そうするための素敵なストックライブラリを見つけられなかったので、おそらく私が見逃しているものがあるか、誰かが今ごろ転がっているはずだと思うでしょう)、これを行うための「最も簡単な」方法は、 Yum 内部を呼び出して入札を行い、コールバックを要求する Python ラッパー。いずれにせよ、純粋な Java ではありませんが、外部の Python インタープリターにリンクする (そして、Yum は Python であるため、インストールされている必要があることはわかっています) ほうが、C コードで JNI リンクを行うよりも手間がかからない可能性があります。(例として、
でも:
または、pkcon を使用すること、または DBus を使用して PackageKit と通信することを検討しましたか?
DBus を使用するのに外部ライブラリは必要ありませんが、インストール プロセスを少し考え直す必要があるかもしれません。http://dbus.freedesktop.org/doc/dbus-java/に Java DBus ライブラリがあり、接続ロジックをラップします。その時点で、例はhttp://www.packagekit.org/pk-faq.htmlにあります。 #session-methodsでアクセスの要点がわかります。DBus インターフェースは、進行中のトランザクションをチェックする方法を提供すると私は信じています。これは、私が見る最も「ハック」なソリューションかもしれません。そして、おまけとして、少なくともUbuntuに移植できます(私は信じています)。
ただし、pkcon はオプションです。tty でない場合は出力を減らしますが、進行状況を適切な解析可能な形式で stdout に書き込むように見えます。
$ pkcon update > tmp < /dev/null & tail -f tmp
Transaction: Updating packages
Status: Waiting for authentication
Status: Waiting in queue
Status: Starting
Status: Resolving dependencies
Status: Downloading packages
Percentage: 10
Percentage: 40
Percentage: 50
Percentage: 70
これは実際の出力なので、粒度はそれほど高くありませんが、解析にはかなり適しているように見えます。
残念ながら、比較できる Fedora 14 ボックスがありません。これは Fedora 15 のものです。