2017-04-27 2 views
0

Collected Python Pluginを使用して、P4Python APIを使用してPerforceからGraphite Metricsを収集します。 login()コマンドの前に指定されたサーバの指紋をアサートするためにP4_TRUSTコマンドを必要とするsslベースの接続を除いて、すべてが有効です。具体P4Python Perforce APIは、Collected Python(2.7)プラグインとして実行しているときにP4_TRUSTを受け入れません。

import collectd 
from P4 import P4 

def configer(configobj): 
    collectd.info('Configuring Perforce Plugin') 


def initer(): 
    collectd.info('Initializing Perforce Plugin') 


def reader(): 
    p4 = P4() 
    p4.port = "ssl:perforce1.lab.dell.com:1666" 
    p4.user = "perforce" 
    p4.charset = 'utf8' 
    p4.password = "Password" 
    p4.connect() 
    p4.run_trust("-i", '60:27:3E:E0:A6:58:8E:13:4F:9E:8C:C8:BF:C3:26:C2:91:2F:78:33') 
    p4.run_login() 

    result = p4.run('license', '-u') 
    collectd.info("User limit is :" + result[0].get('userLimit')) 

# 
    p4.disconnect() 

# -- Hook Callbacks, Order is important! ==# 
collectd.register_config(configer) 
collectd.register_init(initer) 
collectd.register_read(reader) 

がcollectd.log予想通りcollectdコンテキスト外で実行同じコードを実行

`[2017-04-27 11:33:58] Unhandled python exception in read callback: P4Exception: [P4#run] Errors during command execution("p4 login") 

    [Error]: "The authenticity of '10.99.248.42:1666' can't be established,\nthis may be your first attempt to connect to this P4PORT.\nThe fingerprint for the key sent to your client is\n60:27:3E:E0:A6:58:8E:13:4F:9E:8C:C8:BF:C3:26:C2:91:2F:78:33\nTo allow connection use the 'p4 trust' command." 


[2017-04-27 11:33:58] read-function of plugin `python.PerforceMetrics' failed. Will suspend it for 20.000 seconds. 
` 

に注意次の実行時エラーになります。

from P4 import P4 
import logging 

FORMAT = '%(asctime)-15s: %(name)s: %(levelname)s : %(message)s' 
logging.basicConfig(format=FORMAT, filename='/var/log/pytest.log', level=logging.INFO) 

def reader(): 
    p4 = P4() 
    p4.port = "ssl:perforce1.cec.lab.emc.com:1666" 
    p4.user = "perforce" 
    p4.charset = 'utf8' 
    p4.password = "Password" 
    p4.connect() 
    p4.run_trust("-i", '80:25:3E:E0:A6:58:8E:13:4F:9E:8C:C8:BF:C3:26:C2:91:2F:78:33') 
    p4.run_login() 

    result = p4.run('license', '-u') 
    logging.info ("User limit is :" + result[0].get('userLimit')) 

    # 
    p4.disconnect() 

reader() 

注:「P4 Trust」を必要としないSSL接続は、collectdで正しく動作します。

手がかりや考え方、またはこれにアプローチする方法は?

+0

'p4.run_trust'コマンドが正常に機能していますか? 〜/ .p4trustファイルを見て、コマンドラインから 'p4 trust'を実行したときの見た目と比較して、期待した情報が含まれていることを確認しましたか? –

+0

ブライアン、うん、私はp4信頼が正しく実行されていると確信しています...注:collectdなしで設定された2番目のコード...これは正常に動作します。 PythonプラグインがCollectdデーモンによってロードされたときに失敗し、信頼エラーがスローされます。 BTW ... p4python APIを使用して、.p4trustファイルを使用しない代わりに、指紋を直接 'p4.run_trust(" - i "、'80:25:3E:E0:A6:58:8E :13:4F:9E:8C:C8:BF:C3:26:C2:91:2F:78:33 ') ' –

答えて

1

そうですね、PERFORCEのサポートを受けていましたし、収集された収集に苦労している間に、私は正しい方向に向いていました。具体的には、環境変数としてのP4TRUSTを定義できます。この環境変数は、通常は使用され、デフォルトでp4run_trust p4Python API呼び出しのアプリケーションで作成された.p4trustファイルを指します。 だから、トリックはあなたのpythonプラグインでの環境P4TRUST環境変数を定義することです:

import collectd 
import os 
from P4 import P4 

def configer(configobj): 
    collectd.info('Configuring Perforce Plugin') 


def initer(): 
    collectd.info('Initializing Perforce Plugin') 


def reader(): 
    os.environ["P4TRUST"]="/root/.p4trust" 
    p4 = P4() 
    p4.port = "ssl:perforce1.lab.dell.com:1666" 
    p4.user = "perforce" 
    p4.charset = 'utf8' 
    p4.password = "Password" 
    p4.connect() 
    p4.run_trust("-i", '60:27:3E:E0:A6:58:8E:13:4F:9E:8C:C8:BF:C3:26:C2:91:2F:78:33') 
    p4.run_login() 

result = p4.run('license', '-u') 
collectd.info("User limit is :" + result[0].get('userLimit')) 

# 
p4.disconnect() 

# -- Hook Callbacks, Order is important! ==# 
collectd.register_config(configer) 
collectd.register_init(initer) 
collectd.register_read(reader) 

注:OSのライブラリを含めると

はos.environ [「P4TRUST」]の使用= "/root/.p4trust"

これはティッカーです!

関連する問題