2013-07-25 44 views
2

我試圖讓我的Ejabberd安裝外部驗證突然exitted。我不斷收到以下錯誤消息。Ejabberd外部認證:extauth腳本以理「正常」

extauth腳本以理 '正常'

我ejabberd版本是2.1.13突然exitted。

用以下配置試過了,

1. {auth_method,外部}。
{extauth_program,「php /tmp/test.php」}。

2. {auth_method,外部}。
{extauth_program,「/ tmp/test.php」}。

3 {auth_method,外部}。
%% {extauth_program,「/ tmp/test.php」}。

以上所有配置都返回相同的錯誤。

回答

0

什麼是你的test.php腳本?你確定這是工作?也許這只是正常終止,因爲錯誤說。 驗證腳本應該不會終止,只是繼續從標準輸入讀取。有一個例子,你可以在這裏用作指南 https://github.com/processone/ejabberd/blob/master/examples/extauth/check_pass_null.pl

+0

我正在使用此腳本http://www.ejabberd.im/files/efiles/check_mysql.php.txt –

+0

我作爲root用戶和ejabberd用戶從命令行手動執行腳本,它執行並且看起來不像投擲錯誤。 –

0

花了1天試圖獲得工作ejabberd授權。
問題基本上出現在從標準輸入讀取時阻止進程。它在請求字符串的末尾被阻塞,直到由於超時而斷開連接。
這裏是用於非塊符號由符號從描述符讀取的溶液:

function non_block_read($fd, &$data) { 
    $read = array($fd); 
    $write = array(); 
    $except = array(); 
    $result = stream_select($read, $write, $except, 0); 
    if($result === false) { 
       throw new Exception('stream_select failed'); 
     } 
    if($result === 0) return false; 
    $data.= stream_get_line($fd, 1); 
    return true; 
} 

這裏是守護程序代碼也使壽命讀取週期。

$fh = fopen("php://stdin", 'r'); 
$fhout = fopen("php://stdout", 'w'); 
$pdo = new PDO('mysql:host='.$host.';dbname='.$db, $user,$pass); 
if(!$fh){ 
    die("Cannot open STDIN\n"); 
} 
$aStr=''; 
$collect=false; 
do { 
     if (!non_block_read($fh,$aStr)) { 
       if (strlen($aStr) > 0) { 
         $toAuth = substr(trim($aStr),1); 
         checkAuth($toAuth,$pdo,$fhout); 
         $aStr=''; 
       } 
       else sleep (1); 
     } 
} 
while (true); 

一些解釋:checkAuth - 實現'auth'和'isuser'處理程序的任何函數。
睡眠(1) - 簡單的方法來逃避CPU負載。
第一個符號 - 服務符號,前置消息,它不同於客戶端,所以我只是把它剪掉。
這裏是答覆代碼。回覆 - true |錯誤的值。

$message = @pack("nn", 2, $result); 
fwrite($stdout, $message); 
flush(); 

享受。