Fabricを変更/オーバーライドするのではなく、stdout(または任意のiostream)をフィルターに置き換えることができます。
これは、特定のパスワードを検閲するためにstdoutをオーバーライドする例です。引数で設定されたenv.password
Fabricの変数からパスワードを取得します。フィルタでパスワードを指定する必要がないように、正規表現でも同じことができることに注意してください。-I
また、これは世界で最も効率的なコードではありませんが、ファブリックを使用している場合は、速度よりも管理性を重視する可能性があります。
#!/usr/bin/python
import sys
import string
from fabric.api import *
from fabric.tasks import *
from fabric.contrib import *
class StreamFilter(object):
def __init__(self, filter, stream):
self.stream = stream
self.filter = filter
def write(self,data):
data = data.replace(self.filter, '[[TOP SECRET]]')
self.stream.write(data)
self.stream.flush()
def flush(self):
self.stream.flush()
@task
def can_you_see_the_password():
sys.stdout = StreamFilter(env.password, sys.stdout)
print 'Hello there'
print 'My password is %s' % env.password
実行時:
fab -I can_you_see_the_password
Initial value for env.password:
これにより、次のものが生成されます。
Hello there
My password is [[TOP SECRET]]