Initial commit
This commit is contained in:
+176
@@ -0,0 +1,176 @@
|
||||
<?php
|
||||
/* ============================================================================
|
||||
* SoftSPM - skrypt diagnostyczny polaczenia z usluga SOAP systemu SYNDIS.
|
||||
*
|
||||
* PLIK JEDNORAZOWY - po zakonczonej diagnostyce NALEZY GO USUNAC z serwera.
|
||||
*
|
||||
* Uruchomienie:
|
||||
* - z przegladarki: http://<serwer>/syndis_test.php [wymaga zalogowania do SoftSPM]
|
||||
* - z wiersza polecen: C:\Programy\xampp_old\php\php.exe syndis_test.php
|
||||
*
|
||||
* Skrypt NICZEGO NIE ZAPISUJE - wykonuje wylacznie operacje odczytu.
|
||||
*
|
||||
* Testuje kolejno:
|
||||
* 1. osiagalnosc portu TCP [fsockopen]
|
||||
* 2. pobranie pliku WSDL przez HTTP
|
||||
* 3. surowy POST z gotowa koperta SOAP - z pominieciem klasy SoapClient
|
||||
* 4. wywolanie przez SoapClient w kilku wariantach opcji transportu
|
||||
* ========================================================================== */
|
||||
|
||||
$isCli = (php_sapi_name() == 'cli');
|
||||
|
||||
if (!$isCli)
|
||||
{
|
||||
session_start();
|
||||
if (empty($_SESSION['user'])) die('Brak dostepu - zaloguj sie najpierw do SoftSPM.');
|
||||
header('Content-Type: text/html; charset=utf-8');
|
||||
echo '<meta charset="utf-8"><style>body{font-family:Consolas,monospace;font-size:12px;background:#f6f9fb;color:#26323a;margin:16px}'
|
||||
. 'h2{font-family:"Segoe UI",Arial;font-size:16px;color:#0c7491;border-bottom:2px solid #29abe2;padding-bottom:4px;margin:22px 0 8px}'
|
||||
. 'h3{font-family:"Segoe UI",Arial;font-size:13px;margin:14px 0 4px;color:#26323a}'
|
||||
. 'pre{background:#fff;border:1px solid #dfe6ea;border-radius:6px;padding:10px;white-space:pre-wrap;word-break:break-all;max-height:340px;overflow:auto;margin:4px 0}'
|
||||
. '.ok{color:#1f8a53;font-weight:bold}.bad{color:#c1272d;font-weight:bold}.warn{color:#b3760a;font-weight:bold}</style>';
|
||||
}
|
||||
|
||||
function out($s='') { global $isCli; echo $isCli ? strip_tags($s)."\n" : $s."<br>\n"; }
|
||||
function head2($s) { global $isCli; echo $isCli ? "\n=== $s ===\n" : "<h2>$s</h2>\n"; }
|
||||
function head3($s) { global $isCli; echo $isCli ? "\n--- $s ---\n" : "<h3>$s</h3>\n"; }
|
||||
function dump($s) { global $isCli; echo $isCli ? $s."\n" : "<pre>".htmlspecialchars($s, ENT_QUOTES, 'UTF-8')."</pre>\n"; }
|
||||
function verdict($ok,$t) { return $ok ? '<span class="ok">OK</span> '.$t : '<span class="bad">BLAD</span> '.$t; }
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// Adresy do sprawdzenia - wszystkie wystepujace w kodzie importerow soap_*.php.
|
||||
// Mozna dopisac wlasny, np. array('192.168.1.50', 3615).
|
||||
// --------------------------------------------------------------------------
|
||||
$hosts = array(
|
||||
array('172.22.64.101', 3615, 'soap_of_while.php, soap_importwells.php - aktualnie skonfigurowany'),
|
||||
array('172.22.64.134', 3615, 'soap_importwells_migracja.php'),
|
||||
array('172.21.11.101', 3615, 'soap_update5min.php, soap_importusers.php'),
|
||||
array('172.20.43.10', 3615, 'adres zakomentowany w importerach'),
|
||||
);
|
||||
|
||||
$soapAction = 'http://www.mikronika.com.pl/2014/11/24/spm/GetUserInfos';
|
||||
$envelope = '<?xml version="1.0" encoding="UTF-8"?>'."\n"
|
||||
. '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" '
|
||||
. 'xmlns:ns1="http://www.mikronika.com.pl/2014/11/24/spm/types">'
|
||||
. '<SOAP-ENV:Body><ns1:GetUserInfosRequest/></SOAP-ENV:Body></SOAP-ENV:Envelope>';
|
||||
|
||||
$localWsdl = dirname(__FILE__).DIRECTORY_SEPARATOR.'SyndisSpm.wsdl';
|
||||
|
||||
out('SoftSPM - diagnostyka polaczenia z SYNDIS');
|
||||
out('Data: '.date('Y-m-d H:i:s').' | PHP '.phpversion().' | SOAP: '.(extension_loaded('soap') ? 'zaladowany' : 'BRAK ROZSZERZENIA'));
|
||||
out('Lokalny plik WSDL: '.$localWsdl.' - '.(is_file($localWsdl) ? 'jest' : 'BRAK'));
|
||||
|
||||
foreach ($hosts as $h)
|
||||
{
|
||||
list($ip, $port, $desc) = $h;
|
||||
head2($ip.':'.$port.' ['.$desc.']');
|
||||
|
||||
// ---------------- 1. osiagalnosc portu ----------------
|
||||
head3('1. Port TCP');
|
||||
$t0 = microtime(true);
|
||||
$errNo = 0; $errStr = '';
|
||||
$fp = @fsockopen($ip, $port, $errNo, $errStr, 5);
|
||||
$ms = round((microtime(true) - $t0) * 1000);
|
||||
if (!$fp)
|
||||
{
|
||||
out(verdict(false, "port nieosiagalny po {$ms} ms - {$errStr} [{$errNo}]"));
|
||||
out('Dalsze testy dla tego adresu pominiete.');
|
||||
continue;
|
||||
}
|
||||
out(verdict(true, "polaczono w {$ms} ms"));
|
||||
|
||||
// ---------------- 2. WSDL przez HTTP ----------------
|
||||
head3('2. Pobranie WSDL przez HTTP [port 80]');
|
||||
$ctx = stream_context_create(array('http' => array('timeout' => 8, 'ignore_errors' => true)));
|
||||
$wsdl = @file_get_contents('http://'.$ip.'/SyndisSpm.wsdl', false, $ctx);
|
||||
if ($wsdl === false)
|
||||
out(verdict(false, 'nie udalo sie pobrac'));
|
||||
else
|
||||
{
|
||||
$isXml = (strpos(substr($wsdl, 0, 200), '<?xml') !== false || strpos(substr($wsdl, 0, 400), '<definitions') !== false);
|
||||
out(verdict($isXml, strlen($wsdl).' B, '.($isXml ? 'wyglada na XML' : 'to NIE jest XML')));
|
||||
if (!$isXml) dump(substr($wsdl, 0, 600));
|
||||
}
|
||||
|
||||
// ---------------- 3. surowy POST bez SoapClient ----------------
|
||||
head3('3. Surowy POST z koperta SOAP [z pominieciem SoapClient]');
|
||||
$req = "POST / HTTP/1.1\r\n";
|
||||
$req .= "Host: {$ip}:{$port}\r\n";
|
||||
$req .= "Content-Type: text/xml; charset=utf-8\r\n";
|
||||
$req .= "SOAPAction: \"{$soapAction}\"\r\n";
|
||||
$req .= "User-Agent: SoftSPM-diag\r\n";
|
||||
$req .= "Content-Length: ".strlen($envelope)."\r\n";
|
||||
$req .= "Connection: close\r\n\r\n";
|
||||
$req .= $envelope;
|
||||
|
||||
stream_set_timeout($fp, 20);
|
||||
fwrite($fp, $req);
|
||||
$raw = '';
|
||||
while (!feof($fp))
|
||||
{
|
||||
$chunk = fread($fp, 8192);
|
||||
if ($chunk === false || $chunk === '') break;
|
||||
$raw .= $chunk;
|
||||
if (strlen($raw) > 400000) break;
|
||||
}
|
||||
$meta = stream_get_meta_data($fp);
|
||||
fclose($fp);
|
||||
|
||||
if ($meta['timed_out']) out(verdict(false, 'przekroczono czas oczekiwania na odpowiedz'));
|
||||
|
||||
if ($raw === '')
|
||||
out(verdict(false, 'serwer nie zwrocil ANI JEDNEGO bajtu'));
|
||||
else
|
||||
{
|
||||
$status = strtok($raw, "\r\n");
|
||||
$hasXml = (stripos($raw, '<?xml') !== false || stripos($raw, 'SOAP-ENV:Envelope') !== false);
|
||||
out(verdict($hasXml, strlen($raw).' B | '.$status));
|
||||
dump(substr($raw, 0, 4000));
|
||||
}
|
||||
|
||||
// ---------------- 4. SoapClient w kilku wariantach ----------------
|
||||
head3('4. SoapClient - warianty opcji transportu');
|
||||
if (!extension_loaded('soap')) { out('Rozszerzenie soap niezaladowane - test pominiety.'); continue; }
|
||||
|
||||
$wsdlSrc = is_file($localWsdl) ? $localWsdl : 'http://'.$ip.'/SyndisSpm.wsdl';
|
||||
$variants = array(
|
||||
'domyslne' => array(),
|
||||
'keep_alive=false' => array('keep_alive' => false),
|
||||
'keep_alive=false + SOAP 1.2' => array('keep_alive' => false, 'soap_version' => SOAP_1_2),
|
||||
'kompresja gzip' => array('keep_alive' => false, 'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP),
|
||||
);
|
||||
|
||||
foreach ($variants as $name => $opt)
|
||||
{
|
||||
$opt = array_merge(array('trace' => 1, 'exceptions' => 1, 'cache_wsdl' => WSDL_CACHE_NONE, 'connection_timeout' => 15), $opt);
|
||||
try
|
||||
{
|
||||
$cl = new SoapClient($wsdlSrc, $opt);
|
||||
$cl->__setLocation('http://'.$ip.':'.$port.'/');
|
||||
$r = $cl->GetUserInfos(array());
|
||||
|
||||
$cnt = 0;
|
||||
if (isset($r->users)) { $u = is_array($r->users) ? $r->users : array($r->users); $cnt = count($u); }
|
||||
out(verdict(true, $name.' - odebrano kont: '.$cnt));
|
||||
if ($cnt > 0)
|
||||
{
|
||||
$first = is_array($r->users) ? $r->users[0] : $r->users;
|
||||
out(' pierwszy rekord: '.$first->login.' / '.$first->fullName);
|
||||
}
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
out(verdict(false, $name.' - '.$e->getMessage()));
|
||||
if (isset($cl))
|
||||
{
|
||||
$resp = $cl->__getLastResponse();
|
||||
dump("NAGLOWKI ODPOWIEDZI:\n".$cl->__getLastResponseHeaders()
|
||||
."\nODPOWIEDZ (".strlen($resp)." B):\n".($resp === '' ? '[pusto]' : substr($resp, 0, 2000)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
head2('Koniec');
|
||||
out('Po zakonczeniu diagnostyki USUN ten plik z serwera.');
|
||||
?>
|
||||
Reference in New Issue
Block a user