Issues (843)

Security Analysis    not enabled

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  Cross-Site Scripting
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  Code Injection
Code Injection enables an attacker to execute arbitrary code on the server.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Header Injection
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Variable Injection
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

scripts/daemon-spotter.php (2 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
#!/usr/bin/php
2
<?php
3
/**
4
* This script is used to retrieve message from SBS source like Dump1090, Radarcape,.. or from phpvms, wazzup files,AIS, APRS,...
5
* This script can be used as cron job with $globalDaemon = FALSE
6
*/
7
8
require_once(dirname(__FILE__).'/../require/class.SpotterImport.php');
9
require_once(dirname(__FILE__).'/../require/class.SpotterServer.php');
10
//require_once(dirname(__FILE__).'/../require/class.APRS.php');
11
require_once(dirname(__FILE__).'/../require/class.ATC.php');
12
require_once(dirname(__FILE__).'/../require/class.ACARS.php');
13
require_once(dirname(__FILE__).'/../require/class.SBS.php');
14
require_once(dirname(__FILE__).'/../require/class.Source.php');
15
require_once(dirname(__FILE__).'/../require/class.Connection.php');
16
require_once(dirname(__FILE__).'/../require/class.Common.php');
17
if (isset($globalTracker) && $globalTracker) {
18
    require_once(dirname(__FILE__).'/../require/class.TrackerImport.php');
19
}
20
if (isset($globalMarine) && $globalMarine) {
21
    require_once(dirname(__FILE__).'/../require/class.AIS.php');
22
    require_once(dirname(__FILE__).'/../require/class.MarineImport.php');
23
}
24
25
if (!isset($globalDebug)) $globalDebug = FALSE;
26
27
if ($globalInstalled === FALSE) {
28
    echo "This script MUST be run after install script. Use your web browser to run install/index.php";
29
    sleep(5);
30
    die();
31
}
32
33
34
// Check if schema is at latest version
35
$Connection = new Connection();
36
if ($Connection->connectionExists() === false) {
37
    echo "Can't connect to your database. Check DB is running, user/password and database logs.";
38
    exit();
39
}
40
if ($Connection->latest() === false) {
41
    echo "You MUST update to latest schema. Use your web browser to run install/index.php";
42
    exit();
43
}
44
if (PHP_SAPI != 'cli') {
45
    echo "This script MUST be called from console, not a web browser.";
46
//    exit();
47
}
48
49
// This is to be compatible with old version of settings.php
50
if (!isset($globalSources)) {
51
    if (isset($globalSBS1Hosts)) {
52
        //$hosts = $globalSBS1Hosts;
53
        foreach ($globalSBS1Hosts as $host) {
54
	    $globalSources[] = array('host' => $host);
55
    	}
56
    } else {
57
        if (!isset($globalSBS1Host)) {
58
	    echo '$globalSources MUST be defined !';
59
	    die;
60
	}
61
	//$hosts = array($globalSBS1Host.':'.$globalSBS1Port);
62
	$globalSources[] = array('host' => $globalSBS1Host,'port' => $globalSBS1Port);
63
    }
64
}
65
66
$options = getopt('s::',array('source::','server','nodaemon','idsource::','aprsserverssid::','aprsserverpass::','aprsserverhost::','aprsserverport::','format::','noaprsserver','enable-aircraft','disable-aircraft','enable-tracker','disable-tracker','enable-marine','disable-marine'));
67
//if (isset($options['s'])) $hosts = array($options['s']);
68
//elseif (isset($options['source'])) $hosts = array($options['source']);
69
if (isset($options['s'])) {
70
    $globalSources = array();
71
    if (isset($options['format'])) $globalSources[] = array('host' => $options['s'],'format' => $options['format']);
72
    else $globalSources[] = array('host' => $options['s']);
73
} elseif (isset($options['source'])) {
74
    $globalSources = array();
75
    if (isset($options['format'])) $globalSources[] = array('host' => $options['source'],'format' => $options['format']);
76
    else $globalSources[] = array('host' => $options['source']);
77
}
78
if (isset($options['aprsserverhost'])) {
79
	$globalServerAPRS = TRUE;
80
	$globalServerAPRShost = $options['aprsserverhost'];
81
}
82
if (isset($options['aprsserverport'])) $globalServerAPRSport = $options['aprsserverport'];
83
if (isset($options['aprsserverssid'])) $globalServerAPRSssid = $options['aprsserverssid'];
84
if (isset($options['aprsserverpass'])) $globalServerAPRSpass = $options['aprsserverpass'];
85
if (isset($options['noaprsserver'])) $globalServerAPRS = FALSE; 
86
if (isset($options['enable-aircraft'])) {
87
	if ($globalDebug) echo 'Enable Aircraft mode'."\n";
88
	$globalAircraft = TRUE; 
89
}
90
if (isset($options['disable-aircraft'])) {
91
	if ($globalDebug) echo 'Disable Aircraft mode'."\n";
92
	$globalAircraft = FALSE;
93
}
94
if (isset($options['enable-tracker'])) {
95
	if ($globalDebug) echo 'Enable Tracker mode'."\n";
96
	$globalTracker = TRUE; 
97
}
98
if (isset($options['disable-tracker'])) {
99
	if ($globalDebug) echo 'Disable Tracker mode'."\n";
100
	$globalTracker = FALSE;
101
}
102
if (isset($options['enable-marine'])) {
103
	if ($globalDebug) echo 'Enable Marine mode'."\n";
104
	$globalMarine = TRUE;
105
}
106
if (isset($options['disable-marine'])) {
107
	if ($globalDebug) echo 'Disable Marine mode'."\n";
108
	$globalMarine = FALSE;
109
}
110
if (isset($options['nodaemon'])) $globalDaemon = FALSE;
111
if (isset($options['server'])) $globalServer = TRUE;
112
if (isset($options['idsource'])) $id_source = $options['idsource'];
113
else $id_source = 1;
114
if (isset($globalServer) && $globalServer) {
115
    if ($globalDebug) echo "Using Server Mode\n";
116
    $SI=new SpotterServer();
117
/*
118
    require_once(dirname(__FILE__).'/../require/class.APRS.php');
119
    $SI = new adsb2aprs();
120
    $SI->connect();
121
*/
122
} else $SI=new SpotterImport($Connection->db);
123
124
if (isset($globalTracker) && $globalTracker) require_once(dirname(__FILE__).'/../require/class.TrackerImport.php');
125
if (isset($globalMarine) && $globalMarine) {
126
    require_once(dirname(__FILE__).'/../require/class.AIS.php');
127
    require_once(dirname(__FILE__).'/../require/class.MarineImport.php');
128
}
129
130
if (isset($globalTracker) && $globalTracker) $TI = new TrackerImport($Connection->db);
131
if (isset($globalMarine) && $globalMarine) {
132
    $AIS = new AIS();
133
    $MI = new MarineImport($Connection->db);
134
}
135
//$APRS=new APRS($Connection->db);
136
$SBS=new SBS();
137
if (!isset($globalNoDB) || $globalNoDB !== TRUE) {
138
	$ACARS=new ACARS($Connection->db,true);
139
	$Source=new Source($Connection->db);
140
}
141
$Common=new Common();
142
date_default_timezone_set('UTC');
143
//$servertz = system('date +%Z');
144
// signal handler - playing nice with sockets and dump1090
145
if (function_exists('pcntl_fork')) {
146
    pcntl_signal(SIGINT,  function() {
147
        global $sockets;
148
        echo "\n\nctrl-c or kill signal received. Tidying up ... ";
149
        die("Bye!\n");
150
    });
151
    pcntl_signal_dispatch();
152
}
153
154
// let's try and connect
155
if ($globalDebug) echo "Connecting...\n";
156
$use_aprs = false;
157
$aprs_full = false;
158
$reset = 0;
159
160
function connect_all($hosts) {
161
    //global $sockets, $formats, $globalDebug,$aprs_connect,$last_exec, $globalSourcesRights, $use_aprs;
162
    global $sockets,$httpfeeds, $globalSources, $globalDebug,$aprs_connect,$last_exec, $globalSourcesRights, $use_aprs, $reset,$context;
163
    $reset++;
164
    if ($globalDebug) echo 'Connect to all...'."\n";
165
    foreach ($hosts as $id => $value) {
166
	$host = $value['host'];
167
	$udp = false;
168
	$globalSources[$id]['last_exec'] = 0;
169
	// Here we check type of source(s)
170
	if (filter_var($host,FILTER_VALIDATE_URL) && (!isset($globalSources[$id]['format']) || strtolower($globalSources[$id]['format']) == 'auto')) {
171
            if (preg_match('/deltadb.txt$/i',$host)) {
172
        	//$formats[$id] = 'deltadbtxt';
173
        	$globalSources[$id]['format'] = 'deltadbtxt';
174
        	//$last_exec['deltadbtxt'] = 0;
175
        	if ($globalDebug) echo "Connect to deltadb source (".$host.")...\n";
176
            } else if (preg_match('/vatsim-data.txt$/i',$host)) {
177
        	//$formats[$id] = 'vatsimtxt';
178
        	$globalSources[$id]['format'] = 'vatsimtxt';
179
        	//$last_exec['vatsimtxt'] = 0;
180
        	if ($globalDebug) echo "Connect to vatsim source (".$host.")...\n";
181
    	    } else if (preg_match('/aircraftlist.json$/i',$host)) {
182
        	//$formats[$id] = 'aircraftlistjson';
183
        	$globalSources[$id]['format'] = 'aircraftlistjson';
184
        	//$last_exec['aircraftlistjson'] = 0;
185
        	if ($globalDebug) echo "Connect to aircraftlist.json source (".$host.")...\n";
186
    	    } else if (preg_match('/aircraft.json$/i',$host)) {
187
        	//$formats[$id] = 'aircraftjson';
188
        	$globalSources[$id]['format'] = 'aircraftjson';
189
        	//$last_exec['aircraftlistjson'] = 0;
190
        	if ($globalDebug) echo "Connect to aircraft.json source (".$host.")...\n";
191
    	    } else if (preg_match('/aircraft$/i',$host)) {
192
        	//$formats[$id] = 'planefinderclient';
193
        	$globalSources[$id]['format'] = 'planefinderclient';
194
        	//$last_exec['aircraftlistjson'] = 0;
195
        	if ($globalDebug) echo "Connect to planefinderclient source (".$host.")...\n";
196
    	    } else if (preg_match('/opensky/i',$host)) {
197
        	//$formats[$id] = 'aircraftlistjson';
198
        	$globalSources[$id]['format'] = 'opensky';
199
        	//$last_exec['aircraftlistjson'] = 0;
200
        	if ($globalDebug) echo "Connect to opensky source (".$host.")...\n";
201
    	    /*
202
    	    // Disabled for now, site change source format
203
    	    } else if (preg_match('/radarvirtuel.com\/list_aircrafts$/i',$host)) {
204
        	//$formats[$id] = 'radarvirtueljson';
205
        	$globalSources[$id]['format'] = 'radarvirtueljson';
206
        	//$last_exec['radarvirtueljson'] = 0;
207
        	if ($globalDebug) echo "Connect to radarvirtuel.com/file.json source (".$host.")...\n";
208
        	if (!isset($globalSourcesRights) || (isset($globalSourcesRights) && !$globalSourcesRights)) {
209
        	    echo '!!! You MUST set $globalSourcesRights = TRUE in settings.php if you have the right to use this feed !!!'."\n";
210
        	    exit(0);
211
        	}
212
    	    */
213
    	    } else if (preg_match('/planeUpdateFAA.php$/i',$host)) {
214
        	//$formats[$id] = 'planeupdatefaa';
215
        	$globalSources[$id]['format'] = 'planeupdatefaa';
216
        	//$last_exec['planeupdatefaa'] = 0;
217
        	if ($globalDebug) echo "Connect to planeUpdateFAA.php source (".$host.")...\n";
218
        	if (!isset($globalSourcesRights) || (isset($globalSourcesRights) && !$globalSourcesRights)) {
219
        	    echo '!!! You MUST set $globalSourcesRights = TRUE in settings.php if you have the right to use this feed !!!'."\n";
220
        	    exit(0);
221
        	}
222
            } else if (preg_match('/\/action.php\/acars\/data$/i',$host)) {
223
        	//$formats[$id] = 'phpvmacars';
224
        	$globalSources[$id]['format'] = 'phpvmacars';
225
        	//$last_exec['phpvmacars'] = 0;
226
        	if ($globalDebug) echo "Connect to phpvmacars source (".$host.")...\n";
227
            } else if (preg_match('/\/api\/v1\/acars\/data$/i',$host)) {
228
        	//$formats[$id] = 'phpvmacars';
229
        	$globalSources[$id]['format'] = 'vaos';
230
        	//$last_exec['phpvmacars'] = 0;
231
        	if ($globalDebug) echo "Connect to vaos source (".$host.")...\n";
232
            } else if (preg_match('/VAM-json.php$/i',$host)) {
233
        	//$formats[$id] = 'phpvmacars';
234
        	$globalSources[$id]['format'] = 'vam';
235
        	if ($globalDebug) echo "Connect to Vam source (".$host.")...\n";
236
            } else if (preg_match('/whazzup/i',$host)) {
237
        	//$formats[$id] = 'whazzup';
238
        	$globalSources[$id]['format'] = 'whazzup';
239
        	//$last_exec['whazzup'] = 0;
240
        	if ($globalDebug) echo "Connect to whazzup source (".$host.")...\n";
241
            } else if (preg_match('/blitzortung/i',$host)) {
242
        	$globalSources[$id]['format'] = 'blitzortung';
243
        	if ($globalDebug) echo "Connect to blitzortung source (".$host.")...\n";
244
            } else if (preg_match('/airwhere/i',$host)) {
245
        	$globalSources[$id]['format'] = 'airwhere';
246
        	if ($globalDebug) echo "Connect to airwhere source (".$host.")...\n";
247
            } else if (preg_match('/recentpireps/i',$host)) {
248
        	//$formats[$id] = 'pirepsjson';
249
        	$globalSources[$id]['format'] = 'pirepsjson';
250
        	//$last_exec['pirepsjson'] = 0;
251
        	if ($globalDebug) echo "Connect to pirepsjson source (".$host.")...\n";
252
            } else if (preg_match(':data.fr24.com/zones/fcgi/feed.js:i',$host)) {
253
        	//$formats[$id] = 'fr24json';
254
        	$globalSources[$id]['format'] = 'fr24json';
255
        	//$last_exec['fr24json'] = 0;
256
        	if ($globalDebug) echo "Connect to fr24 source (".$host.")...\n";
257
        	if (!isset($globalSourcesRights) || (isset($globalSourcesRights) && !$globalSourcesRights)) {
258
        	    echo '!!! You MUST set $globalSourcesRights = TRUE in settings.php if you have the right to use this feed !!!'."\n";
259
        	    exit(0);
260
        	}
261
            } else if (preg_match(':myshiptracking.com/:i',$host)) {
262
        	//$formats[$id] = 'fr24json';
263
        	$globalSources[$id]['format'] = 'myshiptracking';
264
        	//$last_exec['fr24json'] = 0;
265
        	if ($globalDebug) echo "Connect to myshiptracking source (".$host.")...\n";
266
        	if (!isset($globalSourcesRights) || (isset($globalSourcesRights) && !$globalSourcesRights)) {
267
        	    echo '!!! You MUST set $globalSourcesRights = TRUE in settings.php if you have the right to use this feed !!!'."\n";
268
        	    exit(0);
269
        	}
270
            //} else if (preg_match('/10001/',$host)) {
271
            } else if (preg_match('/10001/',$host) || (isset($globalSources[$id]['port']) && $globalSources[$id]['port'] == '10001')) {
272
        	//$formats[$id] = 'tsv';
273
        	$globalSources[$id]['format'] = 'tsv';
274
        	if ($globalDebug) echo "Connect to tsv source (".$host.")...\n";
275
            }
276
        } elseif (filter_var($host,FILTER_VALIDATE_URL) || (isset($globalSources[$id]['format']) && $globalSources[$id]['format'] == 'sailaway') || (isset($globalSources[$id]['format']) && $globalSources[$id]['format'] == 'sailawayfull') || (isset($globalSources[$id]['format']) && $globalSources[$id]['format'] == 'acarsjson')) {
277
    		if ($globalSources[$id]['format'] == 'aisnmeahttp' || $globalSources[$id]['format'] == 'acarsjson') {
278
    		    $idf = fopen($globalSources[$id]['host'],'r',false,$context);
279
    		    if ($idf !== false) {
280
    			$httpfeeds[$id] = $idf;
281
        		if ($globalDebug) echo "Connected to ".$globalSources[$id]['format']." source (".$host.")...\n";
282
    		    } elseif ($globalDebug) echo "Can't connect to ".$globalSources[$id]['host']."\n";
283
    		} elseif ($globalDebug && isset($globalSources[$id]['format']) && $globalSources[$id]['format'] == 'sailaway') echo "Connect to ".$globalSources[$id]['format']." source (sailaway)...\n";
284
    		elseif ($globalDebug && isset($globalSources[$id]['format']) && $globalSources[$id]['format'] == 'sailawayfull') echo "Connect to ".$globalSources[$id]['format']." source (sailawayfull)...\n";
285
    		elseif ($globalDebug) echo "Connect to ".$globalSources[$id]['format']." source (".$host.")...\n";
286
        } elseif (!filter_var($host,FILTER_VALIDATE_URL)) {
287
	    $hostport = explode(':',$host);
288
	    if (isset($hostport[1])) {
289
		$port = $hostport[1];
290
		$hostn = $hostport[0];
291
	    } else {
292
		$port = $globalSources[$id]['port'];
293
		$hostn = $globalSources[$id]['host'];
294
	    }
295
	    $Common = new Common();
296
	    if (!isset($globalSources[$id]['format']) || ($globalSources[$id]['format'] != 'acarsjsonudp' && $globalSources[$id]['format'] != 'acars' && $globalSources[$id]['format'] != 'flightgearsp')) {
297
        	$s = $Common->create_socket($hostn,$port, $errno, $errstr);
298
    	    } else {
299
    		$udp = true;
300
        	$s = $Common->create_socket_udp($hostn,$port, $errno, $errstr);
301
	    }
302
	    if ($s) {
303
    	        $sockets[$id] = $s;
304
    	        if (!isset($globalSources[$id]['format']) || strtolower($globalSources[$id]['format']) == 'auto') {
305
		    if (preg_match('/aprs/',$hostn) || $port == '10152' || $port == '14580') {
306
			//$formats[$id] = 'aprs';
307
			$globalSources[$id]['format'] = 'aprs';
308
			//$aprs_connect = 0;
309
			//$use_aprs = true;
310
		    } elseif (preg_match('/pub-vrs/',$hostn) || $port == '32001' || $port == '32005' || $port == '32010' || $port == '32015' || $port == '32030') {
311
			$globalSources[$id]['format'] = 'vrstcp';
312
    		    } elseif ($port == '10001') {
313
        		//$formats[$id] = 'tsv';
314
        		$globalSources[$id]['format'] = 'tsv';
315
		    } elseif ($port == '30002') {
316
        		//$formats[$id] = 'raw';
317
        		$globalSources[$id]['format'] = 'raw';
318
		    } elseif ($port == '5001') {
319
        		//$formats[$id] = 'raw';
320
        		$globalSources[$id]['format'] = 'flightgearmp';
321
		    } elseif ($port == '30005') {
322
			// Not yet supported
323
        		//$formats[$id] = 'beast';
324
        		$globalSources[$id]['format'] = 'beast';
325
		    //} else $formats[$id] = 'sbs';
326
		    } else $globalSources[$id]['format'] = 'sbs';
327
		    //if ($globalDebug) echo 'Connection in progress to '.$host.'('.$formats[$id].')....'."\n";
328
		}
329
		if ($globalDebug && $udp) echo 'Listening in UDP from '.$hostn.':'.$port.' ('.$globalSources[$id]['format'].')....'."\n";
330
		elseif ($globalDebug) echo 'Connection in progress to '.$hostn.':'.$port.' ('.$globalSources[$id]['format'].')....'."\n";
331
            } else {
332
		if ($globalDebug) echo 'Connection failed to '.$hostn.':'.$port.' : '.$errno.' '.$errstr."\n";
333
		sleep(10);
334
		connect_all($hosts);
335
    	    }
336
        }
337
    }
338
}
339
if (!isset($globalMinFetch)) $globalMinFetch = 15;
340
341
// Initialize all
342
$status = array();
343
$sockets = array();
344
$httpfeeds = array();
345
$formats = array();
346
$last_exec = array();
347
$time = time();
348
if (isset($globalSourcesTimeout)) $timeout = $globalSourcesTimeOut;
349
else if (isset($globalSBS1TimeOut)) $timeout = $globalSBS1TimeOut;
350
else $timeout = 20;
351
$errno = '';
352
$errstr='';
353
354
if (!isset($globalDaemon)) $globalDaemon = TRUE;
355
/* Initiate connections to all the hosts simultaneously */
356
//connect_all($hosts);
357
//connect_all($globalSources);
358
359
if (isset($globalProxy) && $globalProxy) {
360
    $context = stream_context_create(array('http' => array('timeout' => $timeout,'proxy' => $globalProxy,'request_fulluri' => true)));
361
} else {
362
    $context = stream_context_create(array('http' => array('timeout' => $timeout)));
363
}
364
365
// APRS Configuration
366
if (!is_array($globalSources)) {
367
	echo '$globalSources in require/settings.php MUST be an array';
368
	die;
369
}
370
foreach ($globalSources as $key => $source) {
371
    if (!isset($source['format'])) {
372
        $globalSources[$key]['format'] = 'auto';
373
    }
374
    if (isset($source['callback']) && $source['callback'] === TRUE) {
375
        unset($globalSources[$key]);
376
    }
377
}
378
connect_all($globalSources);
379
foreach ($globalSources as $key => $source) {
380
    if (isset($source['format']) && $source['format'] == 'aprs') {
381
	$aprs_connect = 0;
382
	$use_aprs = true;
383
	if (isset($source['port']) && $source['port'] == '10152') $aprs_full = true;
384
	break;
385
    }
386
}
387
388
if ($use_aprs) {
389
	require_once(dirname(__FILE__).'/../require/class.APRS.php');
390
	$APRS=new APRS();
391
	$aprs_connect = 0;
392
	$aprs_keep = 120;
393
	$aprs_last_tx = time();
394
	if (isset($globalAPRSversion)) $aprs_version = $globalAPRSversion;
395
	else $aprs_version = 'FlightAirMap '.str_replace(' ','_',$globalName);
396
	if (isset($globalAPRSssid)) $aprs_ssid = $globalAPRSssid;
397
	else $aprs_ssid = substr('FAM'.strtoupper(str_replace(' ','_',$globalName)),0,8);
398
	if (isset($globalAPRSfilter)) $aprs_filter = $globalAPRSfilter;
399
	else $aprs_filter =  'r/'.$globalCenterLatitude.'/'.$globalCenterLongitude.'/250.0';
400
	if ($aprs_full) $aprs_filter = '';
401
	if (isset($globalAPRSpass)) $aprs_pass = $globalAPRSpass;
402
	else $aprs_pass = '-1';
403
404
	if ($aprs_filter != '') $aprs_login = "user {$aprs_ssid} pass {$aprs_pass} vers {$aprs_version} filter {$aprs_filter}\n";
405
	else $aprs_login = "user {$aprs_ssid} pass {$aprs_pass} vers {$aprs_version}\n";
406
}
407
408
// connected - lets do some work
409
//if ($globalDebug) echo "Connected!\n";
410
sleep(1);
411
if ($globalDebug) echo "SCAN MODE \n\n";
412
if (!isset($globalCronEnd)) $globalCronEnd = 60;
413
$endtime = time()+$globalCronEnd;
414
$i = 1;
415
$tt = array();
416
// Delete all ATC
417
if ((isset($globalVA) && $globalVA) || (isset($globalIVAO) && $globalIVAO) || (isset($globalVATSIM) && $globalVATSIM)) {
418
	$ATC=new ATC($Connection->db);
419
}
420
if (!$globalDaemon && ((isset($globalVA) && $globalVA) || (isset($globalIVAO) && $globalIVAO) || (isset($globalVATSIM) && $globalVATSIM))) {
421
	$ATC->deleteAll();
422
}
423
424
// Infinite loop if daemon, else work for time defined in $globalCronEnd or only one time.
425
while ($i > 0) {
426
    if (function_exists('pcntl_fork')) pcntl_signal_dispatch();
427
428
    if (!$globalDaemon) $i = $endtime-time();
429
    // Delete old ATC
430
    if ($globalDaemon && ((isset($globalVA) && $globalVA) || (isset($globalIVAO) && $globalIVAO) || (isset($globalVATSIM) && $globalVATSIM))) {
431
	if ($globalDebug) echo 'Delete old ATC...'."\n";
432
        $ATC->deleteOldATC();
433
    }
434
    
435
    if (count($last_exec) == count($globalSources)) {
436
	$max = $globalMinFetch;
437
	foreach ($last_exec as $last) {
438
	    if ((time() - $last['last']) < $max) $max = time() - $last['last'];
439
	}
440
	if ($max < $globalMinFetch) {
441
	    if ($globalDebug) echo 'Sleeping...'."\n";
442
	    sleep($globalMinFetch-$max+2);
443
	}
444
    }
445
446
    
447
    //foreach ($formats as $id => $value) {
448
    foreach ($globalSources as $id => $value) {
449
	date_default_timezone_set('UTC');
450
	//if ($globalDebug) echo 'Source host : '.$value['host'].' - Source format: '.$value['format']."\n";
451
	if (!isset($last_exec[$id]['last'])) $last_exec[$id]['last'] = 0;
452
	if ($value['format'] === 'deltadbtxt' && 
453
	    (
454
		(isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) || 
455
		(!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
456
	    )
457
	) {
458
        //$buffer = $Common->getData($hosts[$id]);
459
        $buffer = $Common->getData($value['host']);
460
        if ($buffer != '') $reset = 0;
461
        $buffer = trim(str_replace(array("\r\n", "\r", "\n", "\\r", "\\n", "\\r\\n"), '\n', $buffer));
462
        $buffer = explode('\n', $buffer);
463
        foreach ($buffer as $line) {
464
            if ($line != '' && count($line) > 7) {
465
                $line = explode(',', $line);
466
                $data = array();
467
                $data['hex'] = $line[1]; // hex
468
                $data['ident'] = $line[2]; // ident
469
                if (isset($line[3])) $data['altitude'] = $line[3]; // altitude
470
                if (isset($line[4])) $data['speed'] = $line[4]; // speed
471
                if (isset($line[5])) $data['heading'] = $line[5]; // heading
472
                if (isset($line[6])) $data['latitude'] = $line[6]; // lat
473
                if (isset($line[7])) $data['longitude'] = $line[7]; // long
474
                $data['verticalrate'] = ''; // vertical rate
475
                //if (isset($line[9])) $data['squawk'] = $line[9]; // squawk
476
                $data['emergency'] = ''; // emergency
477
                $data['datetime'] = date('Y-m-d H:i:s');
478
                $data['format_source'] = 'deltadbtxt';
479
                $data['id_source'] = $id_source;
480
                if (isset($value['name']) && $value['name'] != '') $data['source_name'] = $value['name'];
481
                if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
482
                if (isset($value['sourcestats'])) $data['sourcestats'] = $value['sourcestats'];
483
                $SI->add($data);
484
                unset($data);
485
            }
486
        }
487
        $last_exec[$id]['last'] = time();
488
    } elseif ($value['format'] === 'radarcapejson' &&
489
            (
490
                (isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
491
                (!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
492
            )
493
        ) {
494
            //$buffer = $Common->getData($hosts[$id]);
495
            $buffer = $Common->getData($value['host']);
496
            if ($buffer != '') {
497
                $all_data = json_decode($buffer,true);
498
                foreach ($all_data as $line) {
499
                    $data = array();
500
                    $data['datetime'] = date('Y-m-d H:i:s',$line['uti']);
501
                    $data['hex'] = $line['hex']; // hex
502
                    $data['ident'] = $line['fli']; // ident
503
                    $data['altitude'] = $line['alt']; // altitude
504
                    $data['speed'] = $line['spd']; // speed
505
                    $data['heading'] = $line['trk']; // heading
506
                    $data['latitude'] = $line['lat']; // lat
507
                    $data['longitude'] = $line['lon']; // long
508
                    $data['verticalrate'] = $line['vrt']; // vertical rate
509
                    $data['squawk'] = $line['squ']; // squawk
510
                    $data['ground'] = $line['gda']; // ground
511
                    $data['registration'] = $line['reg'];
512
                    //$data['emergency'] = ''; // emergency
513
                    $data['datetime'] = date('Y-m-d H:i:s');
514
                    $data['format_source'] = 'radarcapejson';
515
                    $data['id_source'] = $id_source;
516
                    if (isset($value['name']) && $value['name'] != '') {
517
                        if (isset($line['src']) && !$line['src'] == 'M') $data['source_name'] = $value['name'].'_MLAT';
518
                        else $data['source_name'] = $value['name'];
519
                    } elseif (isset($line['src']) && $line['src'] == 'M') $data['source_name'] = 'MLAT';
520
                    if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
521
                    if (isset($value['sourcestats'])) $data['sourcestats'] = $value['sourcestats'];
522
523
                    $SI->add($data);
524
                    unset($data);
525
                }
526
            }
527
            $last_exec[$id]['last'] = time();
528
	} elseif ($value['format'] === 'aisnmeatxt' && 
529
	    (
530
		(isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) || 
531
		(!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch*3))
532
	    )
533
	) {
534
	    date_default_timezone_set('CET');
535
	    $buffer = $Common->getData(str_replace('{date}',date('Ymd'),$value['host']));
536
	    date_default_timezone_set('UTC');
537
	    if ($buffer != '') $reset = 0;
538
    	    $buffer=trim(str_replace(array("\r\n","\r","\n","\\r","\\n","\\r\\n"),'\n',$buffer));
539
	    $buffer = explode('\n',$buffer);
540
	    foreach ($buffer as $line) {
541
		if ($line != '') {
542
		    //echo "'".$line."'\n";
543
		    $add = false;
544
		    $ais_data = $AIS->parse_line(trim($line));
545
		    $data = array();
546
		    if (isset($ais_data['ident'])) $data['ident'] = $ais_data['ident'];
547
		    if (isset($ais_data['mmsi'])) $data['mmsi'] = substr($ais_data['mmsi'],-9);
548
		    if (isset($ais_data['speed'])) $data['speed'] = $ais_data['speed'];
549
		    if (isset($ais_data['heading'])) $data['heading'] = $ais_data['heading'];
550
		    if (isset($ais_data['latitude'])) $data['latitude'] = $ais_data['latitude'];
551
		    if (isset($ais_data['longitude'])) $data['longitude'] = $ais_data['longitude'];
552
		    if (isset($ais_data['status'])) $data['status'] = $ais_data['status'];
553
		    if (isset($ais_data['statusid'])) $data['status_id'] = $ais_data['statusid'];
554
		    if (isset($ais_data['type'])) $data['type'] = $ais_data['type'];
555
		    if (isset($ais_data['typeid'])) $data['type_id'] = $ais_data['typeid'];
556
		    if (isset($ais_data['imo'])) $data['imo'] = $ais_data['imo'];
557
		    if (isset($ais_data['callsign'])) $data['callsign'] = $ais_data['callsign'];
558
		    if (isset($ais_data['timestamp'])) {
559
			$data['datetime'] = date('Y-m-d H:i:s',$ais_data['timestamp']);
560
			if (!isset($last_exec[$id]['timestamp']) || $ais_data['timestamp'] >= $last_exec[$id]['timestamp']) {
561
			    $last_exec[$id]['timestamp'] = $ais_data['timestamp'];
562
			    $add = true;
563
			}
564
		    } else {
565
			$data['datetime'] = date('Y-m-d H:i:s');
566
			$add = true;
567
		    }
568
		    $data['format_source'] = 'aisnmeatxt';
569
    		    $data['id_source'] = $id_source;
570
		    //print_r($data);
571
		    if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
572
		    if ($add && isset($ais_data['mmsi_type']) && $ais_data['mmsi_type'] === 'Ship') $MI->add($data);
573
		    unset($data);
574
		}
575
    	    }
576
    	    $last_exec[$id]['last'] = time();
577
	} elseif ($value['format'] === 'aisnmeahttp') {
578
	    $arr = $httpfeeds;
579
	    $w = $e = null;
580
	    
581
	    if (isset($arr[$id])) {
582
		$nn = stream_select($arr,$w,$e,$timeout);
583
		if ($nn > 0) {
584
		    foreach ($httpfeeds as $feed) {
585
			$buffer = stream_get_line($feed,2000,"\n");
586
			if ($buffer === FALSE) {
587
			    connect_all($globalSources);
588
			}
589
			$buffer=trim(str_replace(array("\r\n","\r","\n","\\r","\\n","\\r\\n"),'\n',$buffer));
590
			$buffer = explode('\n',$buffer);
591
			foreach ($buffer as $line) {
592
			    if ($line != '') {
593
				$ais_data = $AIS->parse_line(trim($line));
594
				$data = array();
595
				if (isset($ais_data['ident'])) $data['ident'] = $ais_data['ident'];
596
				if (isset($ais_data['mmsi'])) $data['mmsi'] = substr($ais_data['mmsi'],-9);
597
				if (isset($ais_data['speed'])) $data['speed'] = $ais_data['speed'];
598
				if (isset($ais_data['heading'])) $data['heading'] = $ais_data['heading'];
599
				if (isset($ais_data['latitude'])) $data['latitude'] = $ais_data['latitude'];
600
				if (isset($ais_data['longitude'])) $data['longitude'] = $ais_data['longitude'];
601
				if (isset($ais_data['status'])) $data['status'] = $ais_data['status'];
602
				if (isset($ais_data['statusid'])) $data['status_id'] = $ais_data['statusid'];
603
				if (isset($ais_data['type'])) $data['type'] = $ais_data['type'];
604
				if (isset($ais_data['typeid'])) $data['type_id'] = $ais_data['typeid'];
605
				if (isset($ais_data['imo'])) $data['imo'] = $ais_data['imo'];
606
				if (isset($ais_data['callsign'])) $data['callsign'] = $ais_data['callsign'];
607
				if (isset($ais_data['destination'])) $data['arrival_code'] = $ais_data['destination'];
608
				if (isset($ais_data['eta_ts'])) $data['arrival_date'] = date('Y-m-d H:i:s',$ais_data['eta_ts']);
609
				if (isset($ais_data['timestamp'])) {
610
				    $data['datetime'] = date('Y-m-d H:i:s',$ais_data['timestamp']);
611
				} else {
612
				    $data['datetime'] = date('Y-m-d H:i:s');
613
				}
614
				$data['format_source'] = 'aisnmeahttp';
615
				$data['id_source'] = $id_source;
616
				if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
617
				if (isset($ais_data['mmsi_type']) && $ais_data['mmsi_type'] === 'Ship') $MI->add($data);
618
				unset($data);
619
			    }
620
			}
621
		    }
622
		} else {
623
		    $format = $value['format'];
624
		    if (isset($tt[$format])) $tt[$format]++;
625
		    else $tt[$format] = 0;
626
		    if ($tt[$format] > 30) {
627
			if ($globalDebug) echo 'Reconnect...'."\n";
628
			sleep(2);
629
			//$sourceeen[] = $value;
630
			//connect_all($sourceeen);
631
			//$sourceeen = array();
632
			connect_all($globalSources);
633
		    }
634
		}
635
	    }
636
	} elseif ($value['format'] === 'myshiptracking' && 
637
	    (
638
		(isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) || 
639
		(!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch*3))
640
	    )
641
	) {
642
	    $buffer = $Common->getData($value['host'],'get','','','','','20');
643
	    if ($buffer != '') {
644
		//echo $buffer;
645
		$all_data = json_decode($buffer,true);
646
		//print_r($all_data);
647
		if (isset($all_data[0]['DATA'])) {
648
		    foreach ($all_data[0]['DATA'] as $line) {
649
			if ($line != '') {
650
			    $data = array();
651
			    $data['ident'] = $line['NAME'];
652
			    $data['mmsi'] = $line['MMSI'];
653
			    if (strlen($data['mmsi']) > 9) {
654
				$data['mmsi'] = substr($data['mmsi'],-9);
655
			    }
656
			    $data['speed'] = $line['SOG'];
657
			    $data['heading'] = $line['COG'];
658
			    $data['latitude'] = $line['LAT'];
659
			    $data['longitude'] = $line['LNG'];
660
			    //    if (isset($ais_data['type'])) $data['type'] = $ais_data['type'];
661
			    //$data['type_id'] = $line['TYPE'];
662
			    $data['imo'] = $line['IMO'];
663
			    if ($line['DEST'] != '') $data['arrival_code'] = $line['DEST'];
664
			    if ($line['ARV'] != '') $data['arrival_time'] = date('Y-m-d H:i:s',strtotime($line['ARV']));
665
			    $data['datetime'] = date('Y-m-d H:i:s',$line['T']);
666
			    $data['format_source'] = 'myshiptracking';
667
			    $data['id_source'] = $id_source;
668
			    if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
669
			    $MI->add($data);
670
			    unset($data);
671
			}
672
		    }
673
		}
674
	    }
675
	    $last_exec[$id]['last'] = time();
676
	} elseif ($value['format'] === 'boatbeaconapp' && 
677
	    (
678
		(isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) || 
679
		(!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch*3))
680
	    )
681
	) {
682
	    $buffer = $Common->getData(str_replace('{timestamp}',time(),$value['host']));
683
	    if ($buffer != '') {
684
		$all_data = json_decode($buffer,true);
685
		if (isset($all_data[0]['mmsi'])) {
686
		    foreach ($all_data as $line) {
687
			if ($line != '') {
688
			    $data = array();
689
			    $data['ident'] = $line['shipname'];
690
			    $data['callsign'] = $line['callsign'];
691
			    $data['mmsi'] = substr($line['mmsi'],-9);
692
			    $data['speed'] = $line['sog'];
693
			    if ($line['heading'] != '511') $data['heading'] = $line['heading'];
694
			    $data['latitude'] = $line['latitude'];
695
			    $data['longitude'] = $line['longitude'];
696
			    $data['type_id'] = $line['shiptype'];
697
			    $data['arrival_code'] = $line['destination'];
698
			    $data['datetime'] = $line['time'];
699
			    $data['format_source'] = 'boatbeaconapp';
700
			    $data['id_source'] = $id_source;
701
			    if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
702
			    $MI->add($data);
703
			    unset($data);
704
			}
705
		    }
706
		}
707
		
708
	    }
709
    	    $last_exec[$id]['last'] = time();
710
	} elseif ($value['format'] === 'boatnerd' && 
711
	    (
712
		(isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
713
		(!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch*3))
714
	    )
715
	) {
716
	    $buffer = $Common->getData($value['host']);
717
	    if ($buffer != '') {
718
		$all_data = json_decode($buffer,true);
719
		if (isset($all_data['features'][0]['id'])) {
720
		    foreach ($all_data['features'] as $line) {
721
			print_r($line);
722
			$data = array();
723
			if (isset($line['properties']['name'])) $data['ident'] = $line['properties']['name'];
724
			if (isset($line['properties']['callsign'])) $data['callsign'] = $line['properties']['callsign'];
725
			if (isset($line['properties']['mmsi'])) $data['mmsi'] = substr($line['properties']['mmsi'],-9);
726
			if (isset($line['properties']['imo'])) $data['imo'] = $line['properties']['imo'];
727
			if (isset($line['properties']['speed'])) $data['speed'] = $line['properties']['speed'];
728
			if (isset($line['properties']['heading']) && $line['properties']['heading'] != 0) $data['heading'] = $line['properties']['heading'];
729
			$data['latitude'] = $line['geometry']['coordinates'][1];
730
			$data['longitude'] = $line['geometry']['coordinates'][0];
731
			if (isset($line['properties']['vesselType'])) $data['type'] = $line['properties']['vesselType'];
732
			if (isset($line['properties']['destination'])) $data['arrival_code'] = $line['properties']['destination'];
733
			if (isset($line['properties']['eta']) && $line['properties']['eta'] != '') $data['arrival_date'] = $line['properties']['eta'];
734
			$data['format_source'] = 'boatnerd';
735
			$data['id_source'] = $id_source;
736
			$data['datetime'] = date('Y-m-d H:i:s');
737
			if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
738
			if ($line['properties']['vesselType'] != 'Navigation Aid') $MI->add($data);
739
			unset($data);
740
		    }
741
		}
742
		
743
	    }
744
    	    $last_exec[$id]['last'] = time();
745
	} elseif ($value['format'] === 'shipplotter' && 
746
	    (
747
		(isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) || 
748
		(!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch*3))
749
	    )
750
	) {
751
	    if ($globalDebug) echo 'download...';
752
	    $buffer = $Common->getData($value['host'],'post',$value['post'],'','','','','ShipPlotter');
753
	    if ($globalDebug) echo 'done !'."\n";
754
	    // FIXME: Need more work
755
	    if ($buffer != '') $reset = 0;
756
    	    $buffer=trim(str_replace(array("\r\n","\r","\n","\\r","\\n","\\r\\n"),'\n',$buffer));
757
	    $buffer = explode('\n',$buffer);
758
	    foreach ($buffer as $line) {
759
		if ($line != '') {
760
		    $data = array();
761
		    //echo $line."\n";
762
		    $data['mmsi'] = (int)substr($line,0,9);
763
		    $data['datetime'] = date('Y-m-d H:i:s',substr($line,10,10));
764
		    $data['status_id'] = substr($line,21,2);
765
		    $data['type_id'] = substr($line,24,3);
766
		    $data['latitude'] = substr($line,29,9);
767
		    $data['longitude'] = substr($line,41,9);
768
		    $data['speed'] = round(substr($line,51,5));
769
		    //$data['course'] = substr($line,57,5);
770
		    $data['heading'] = round(substr($line,63,3));
771
		    //$data['draft'] = substr($line,67,4);
772
		    //$data['length'] = substr($line,72,3);
773
		    //$data['beam'] = substr($line,76,2);
774
		    $data['ident'] = trim(utf8_encode(substr($line,78,20)));
775
		    //$data['callsign'] = trim(substr($line,100,7);
776
		    $data['arrival_code'] = substr($line,108,20);
777
		    //$data['etaDate'] = substr($line,129,5);
778
		    //$data['etaTime'] = substr($line,135,5);
779
		    $data['format_source'] = 'shipplotter';
780
    		    $data['id_source'] = $id_source;
781
		    if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
782
		    //print_r($data);
783
		    //echo 'Add...'."\n";
784
		    $MI->add($data);
785
		    unset($data);
786
		}
787
    	    }
788
    	    $last_exec[$id]['last'] = time();
789
	} elseif ($value['format'] === 'sailawayfull' && 
790
	    (
791
		(!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > 10*60))
792
	    )
793
	) {
794
	    if (!isset($globalSailaway['key']) || $globalSailaway['key'] == '') {
795
		echo 'Sailaway API key MUST be defined';
796
		exit(0);
797
	    }
798
	    $sailawayoption = array('key' => $globalSailaway['key']);
799
	    if (isset($globalSailaway['usrnr'])) $sailawayoption = array_merge($sailawayoption,array('usrnr' => $globalSailaway['usrnr']));
800
	    if (isset($globalSailaway['ubtnr'])) $sailawayoption = array_merge($sailawayoption,array('ubtnr' => $globalSailaway['ubtnr']));
801
802
	    for ($i = 0; $i <= 1; $i++) {
803
		if ($globalDebug) echo '! Download... ';
804
		$buffer = $Common->getData('http://backend.sailaway.world/cgi-bin/sailaway/GetMissions.pl?'.http_build_query($sailawayoption).'&race='.$i.'&tutorial=0&hist=1&racetype=2&challengetype=2','get','','','','',30);
805
		if ($globalDebug) echo 'done'."\n";
806
		if ($buffer != '') {
807
		    $all_data = json_decode($buffer,true);
808
		    if (isset($all_data['missions'])) {
809
			foreach ($all_data['missions'] as $mission) {
810
				$mission_user = $mission['usrname'];
811
				$mission_name = preg_replace('/[\x00-\x1F\x7F-\xFF]/', '',$Common->remove_accents($mission['mistitle']));
812
				if (!isset($globalFilter['sailway']['race']) || (isset($globalFilter['sailway']['race']) && in_array($mission['misnr'],$globalFilter['sailway']['race']))) {
813
					//print_r($mission);
814
					$datar = array();
815
					$datar['id'] = $mission['misnr'];
816
					$datar['desc'] = $mission['misdescr'];
817
					//$datar['creator'] = trim(preg_replace('/[\x00-\x1F\x7F-\xFF]/', '',$Common->remove_accents($mission['usrname'])));
818
					$datar['creator'] = '';
819
					$datar['name'] = trim(preg_replace('/[\x00-\x1F\x7F-\xFF]/', '',$Common->remove_accents($mission['mistitle'])));
820
					if (isset($mission['misstart'])) $datar['startdate'] = date('Y-m-d H:i:s',strtotime($mission['misstart']));
821
					else $datar['startdate'] = '1970-01-01 00:00:00';
822
					/*
823
					$markers = array();
824
					foreach ($race_data['mission']['course'] as $course) {
825
					    $markers[] = array('lat' => $course['miclat'],'lon' => $course['miclon'],'name' => $course['micname'],'type' => $course['mictype']);
826
					}
827
					$datar['markers'] = json_encode($markers);
828
					//print_r($datar);
829
					*/
830
					$datar['markers'] = '';
831
					$MI->race_add($datar);
832
					unset($datar);
833
				}
834
			}
835
		    }
836
		}
837
		if ($globalDebug) echo '=== Wait... ===';
838
		sleep(10*60);
839
	    }
840
	    $buffer = $Common->getData('http://backend.sailaway.world/cgi-bin/sailaway/TrackAllBoats.pl?'.http_build_query($sailawayoption),'get','','','','',30);
841
	    if ($buffer != '') {
842
		$data = json_decode($buffer,true);
843
		//print_r($data);
844
		if (isset($data['boats'])) {
845
		    foreach ($data['boats'] as $sail) {
846
			$data = array();
847
			$data['id'] = $sail['ubtnr'];
848
			$data['datetime'] = date('Y-m-d H:i:s');
849
			if ($sail['online'] == '1') $data['last_update'] = date('Y-m-d H:i:s');
850
			$data['latitude'] = $sail['ubtlat'];
851
			$data['longitude'] = $sail['ubtlon'];
852
			$data['type_id'] = 36;
853
			$data['heading'] = $sail['ubtheading'];
854
			$data['ident'] = trim(preg_replace('/[\x00-\x1F\x7F-\xFF]/', '',$Common->remove_accents($sail['ubtname'])));
855
			$data['captain_name'] = $sail['usrname'];
856
			$allboats = array('Sailaway Cruiser 38','Mini Transat','Caribbean Rose','52&#39; Cruising Cat','50&#39; Performance Cruiser','Nordic Folkboat','32&#39; Offshore Racer');
857
			$boattype = $sail['ubtbtpnr'];
858
			if (isset($allboats[$boattype-1])) $data['type'] = $allboats[$boattype-1];
859
			$data['speed'] = round($sail['ubtspeed']*3.6,2);
860
			$data['format_source'] = 'sailaway';
861
			$data['id_source'] = $id_source;
862
			if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
863
			$MI->add($data);
864
			unset($data);
865
		    }
866
		} elseif ($globalDebug) echo 'Error in JSON parsing';
867
	    } elseif ($globalDebug) echo 'Empty result !'."\n";
868
869
    	    $last_exec[$id]['last'] = time();
870
	} elseif ($value['format'] === 'sailaway' && 
871
	    (
872
		(!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > 10*60))
873
	    )
874
	) {
875
	    /*
876
	    if (isset($globalSailaway['email']) && $globalSailaway['email'] != '' && isset($globalSailaway['password']) && $globalSailaway['password'] != '') {
877
		$authsailaway = $Common->getData('http://backend.sailaway.world/cgi-bin/sailaway/weblogin.pl','post',array('submitlogin' => 'Login','email' => $globalSailaway['email'],'pwd' => $globalSailaway['password'], 'page' => 'http://sailaway.world/cgi-bin/sailaway/missions.pl'),'','','','','',false,false,true);
878
		//echo $authsailaway;
879
		preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $authsailaway, $setcookie);
880
		if (isset($setcookie[1][0])) {
881
		    $sailaway_authcookie = $setcookie[1][0];
882
		    echo $sailaway_authcookie."\n";
883
		}
884
	    }
885
	    */
886
	    if (!isset($globalSailaway['key']) || $globalSailaway['key'] == '') {
887
		echo 'Sailaway API key MUST be defined';
888
		exit(0);
889
	    }
890
	    if ($globalDebug) echo '! Download... ';
891
	    $sailawayoption = array('key' => $globalSailaway['key']);
892
	    if (isset($globalSailaway['usrnr'])) $sailawayoption = array_merge($sailawayoption,array('usrnr' => $globalSailaway['usrnr']));
893
	    if (isset($globalSailaway['ubtnr'])) $sailawayoption = array_merge($sailawayoption,array('ubtnr' => $globalSailaway['ubtnr']));
894
	    if (isset($globalSailaway['misnr'])) $sailawayoption = array_merge($sailawayoption,array('misnr' => $globalSailaway['misnr']));
895
	    $buffer = $Common->getData('http://backend.sailaway.world/cgi-bin/sailaway/TrackAllBoats.pl?'.http_build_query($sailawayoption),'get','','','','',30);
896
	    if ($buffer != '') {
897
		$data = json_decode($buffer,true);
898
		//print_r($data);
899
		if (isset($data['boats'])) {
900
		    foreach ($data['boats'] as $sail) {
901
			$data = array();
902
			$data['id'] = $sail['ubtnr'];
903
			$data['datetime'] = date('Y-m-d H:i:s');
904
			if ($sail['online'] == '1') $data['last_update'] = date('Y-m-d H:i:s');
905
			$data['latitude'] = $sail['ubtlat'];
906
			$data['longitude'] = $sail['ubtlon'];
907
			$data['type_id'] = 36;
908
			$data['heading'] = $sail['ubtheading'];
909
			$data['ident'] = trim(preg_replace('/[\x00-\x1F\x7F-\xFF]/', '',$Common->remove_accents($sail['ubtname'])));
910
			$data['captain_name'] = $sail['usrname'];
911
			$allboats = array('Sailaway Cruiser 38','Mini Transat','Caribbean Rose','52&#39; Cruising Cat','50&#39; Performance Cruiser','Nordic Folkboat','32&#39; Offshore Racer');
912
			$boattype = $sail['ubtbtpnr'];
913
			if (isset($allboats[$boattype-1])) $data['type'] = $allboats[$boattype-1];
914
			$data['speed'] = round($sail['ubtspeed']*3.6,2);
915
			$data['format_source'] = 'sailaway';
916
			$data['id_source'] = $id_source;
917
			if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
918
			$MI->add($data);
919
			unset($data);
920
		    }
921
		} elseif ($globalDebug) echo 'Error in JSON parsing';
922
	    } elseif ($globalDebug) echo 'Empty result !'."\n";
923
    	    $last_exec[$id]['last'] = time();
924
	//} elseif (($value === 'whazzup' && (time() - $last_exec['whazzup'] > $globalMinFetch)) || ($value === 'vatsimtxt' && (time() - $last_exec['vatsimtxt'] > $globalMinFetch))) {
925
	} elseif (
926
	    (
927
		$value['format'] === 'whazzup' && 
928
		(
929
		    (isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) || 
930
		    (!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
931
		)
932
	    ) || (
933
		$value['format'] === 'vatsimtxt' && 
934
		(
935
		    (isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) || 
936
		    (!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
937
		)
938
	    )
939
	) {
940
	    //$buffer = $Common->getData($hosts[$id]);
941
	    $buffer = $Common->getData($value['host']);
942
    	    $buffer=trim(str_replace(array("\r\n","\r","\n","\\r","\\n","\\r\\n"),'\n',$buffer));
943
	    $buffer = explode('\n',$buffer);
944
	    $reset = 0;
945
	    foreach ($buffer as $line) {
946
    		if ($line != '') {
947
    		    $line = explode(':', $line);
948
    		    if (count($line) > 30 && $line[0] != 'callsign') {
949
			$data = array();
950
			if (isset($line[37]) && $line[37] != '') $data['id'] = $value['format'].'-'.$line[1].'-'.$line[0].'-'.$line[37];
951
			else $data['id'] = $value['format'].'-'.$line[1].'-'.$line[0];
952
			$data['pilot_id'] = $line[1];
953
			$data['pilot_name'] = $line[2];
954
			$data['hex'] = str_pad(dechex($Common->str2int($line[1])),6,'000000',STR_PAD_LEFT);
955
			$data['ident'] = $line[0]; // ident
956
			if ($line[7] != '' && $line[7] != 0) $data['altitude'] = $line[7]; // altitude
957
			$data['speed'] = $line[8]; // speed
958
			if (isset($line[45])) $data['heading'] = $line[45]; // heading
959
			elseif (isset($line[38])) $data['heading'] = $line[38]; // heading
960
			$data['latitude'] = $line[5]; // lat
961
	        	$data['longitude'] = $line[6]; // long
962
	        	$data['verticalrate'] = ''; // vertical rate
963
	        	$data['squawk'] = ''; // squawk
964
	        	$data['emergency'] = ''; // emergency
965
	        	$data['waypoints'] = $line[30];
966
			$data['datetime'] = date('Y-m-d H:i:s');
967
			//$data['datetime'] = date('Y-m-d H:i:s',strtotime($line[37]));
968
			//if (isset($line[37])) $data['last_update'] = $line[37];
969
		        $data['departure_airport_icao'] = $line[11];
970
		        $data['departure_airport_time'] = rtrim(chunk_split($line[22],2,':'),':');
971
		        $data['arrival_airport_icao'] = $line[13];
972
			$data['frequency'] = $line[4];
973
			$data['type'] = $line[18];
974
			$data['range'] = $line[19];
975
			if (isset($line[35])) $data['info'] = $line[35];
976
    			$data['id_source'] = $id_source;
977
	    		//$data['arrival_airport_time'] = ;
978
	    		if ($line[9] != '') {
979
	    		    $aircraft_data = explode('/',$line[9]);
980
	    		    if (count($aircraft_data) == 2) {
981
				//line[9] may equal to something like 'B738/L' in old FSD server's whazzup.txt file
982
	    			$data['aircraft_icao'] = $aircraft_data[0];
983
	    		    } else if (count($aircraft_data) > 2) {
984
				//line[9] may equal to something like 'H/B748/L'
985
				$data['aircraft_icao'] = $aircraft_data[1];
986
			    }
987
        		}
988
	    		/*
989
	    		if ($value === 'whazzup') $data['format_source'] = 'whazzup';
990
	    		elseif ($value === 'vatsimtxt') $data['format_source'] = 'vatsimtxt';
991
	    		*/
992
	    		$data['format_source'] = $value['format'];
993
			if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
994
			if (isset($value['name']) && $value['name'] != '') $data['source_name'] = $value['name'];
995
    			if ($line[3] === 'PILOT') $SI->add($data);
996
			elseif ($line[3] === 'ATC') {
997
				//print_r($data);
998
				$data['info'] = str_replace('^&sect;','<br />',$data['info']);
999
				$data['info'] = str_replace('&amp;sect;','',$data['info']);
1000
				$typec = substr($data['ident'],-3);
1001
				if ($typec === 'APP') $data['type'] = 'Approach';
1002
				elseif ($typec === 'TWR') $data['type'] = 'Tower';
1003
				elseif ($typec === 'OBS') $data['type'] = 'Observer';
1004
				elseif ($typec === 'GND') $data['type'] = 'Ground';
1005
				elseif ($typec === 'DEL') $data['type'] = 'Delivery';
1006
				elseif ($typec === 'DEP') $data['type'] = 'Departure';
1007
				elseif ($typec === 'FSS') $data['type'] = 'Flight Service Station';
1008
				elseif ($typec === 'CTR') $data['type'] = 'Control Radar or Centre';
1009
				elseif ($data['type'] === '') $data['type'] = 'Observer';
1010
				if (!isset($data['source_name'])) $data['source_name'] = '';
1011
				if (isset($ATC)) {
1012
					if (count($ATC->getByIdent($data['ident'],$data['format_source'])) > 0) echo $ATC->update($data['ident'],$data['frequency'],$data['latitude'],$data['longitude'],$data['range'],$data['info'],$data['datetime'],$data['type'],$data['pilot_id'],$data['pilot_name'],$data['format_source'],$data['source_name']);
1013
					else echo $ATC->add($data['ident'],$data['frequency'],$data['latitude'],$data['longitude'],$data['range'],$data['info'],$data['datetime'],$data['type'],$data['pilot_id'],$data['pilot_name'],$data['format_source'],$data['source_name']);
1014
				}
1015
			}
1016
    			unset($data);
1017
    		    }
1018
    		}
1019
    	    }
1020
    	    //if ($value === 'whazzup') $last_exec['whazzup'] = time();
1021
    	    //elseif ($value === 'vatsimtxt') $last_exec['vatsimtxt'] = time();
1022
    	    $last_exec[$id]['last'] = time();
1023
    	} elseif ($value['format'] === 'airwhere' && 
1024
    	    (
1025
    		(isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
1026
    		(!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
1027
    	    )
1028
    	) {
1029
	    $buffer = $Common->getData('http://www.airwhere.co.uk/pilots.php','get','','','','','20');
1030
	    if ($buffer != '') {
1031
		$all_data = simplexml_load_string($buffer);
1032
		foreach($all_data->children() as $childdata) {
1033
			$data = array();
1034
			$line = $childdata;
1035
			//$data['hex'] = str_pad(dechex((int)$line['pktPilotID']),6,'000000',STR_PAD_LEFT);
1036
			$data['id'] = date('Ymd').(int)$line['pktPilotID'];
1037
			$data['datetime'] = date('Y-m-d H:i:s',strtotime((string)$line['entryTime'].' BST'));
1038
			$data['latitude'] = (float)$line['pktLatitude'];
1039
			$data['longitude'] = (float)$line['pktLongitude'];
1040
			if ((float)$line['pktTrack'] != 0) $data['heading'] = (float)$line['pktTrack'];
1041
			if ((int)$line['pktSpeed'] != 0) $data['speed'] = (int)$line['pktSpeed'];
1042
			$data['altitude'] = round((int)$line['pktAltitude']*3.28084);
1043
			$data['altitude_relative'] = 'AMSL';
1044
			$data['pilot_id'] = (int)$line['pktPilotID'];
1045
			$data['aircraft_icao'] = 'PARAGLIDER';
1046
			$pilot_data = explode(',',$Common->getData('http://www.airwhere.co.uk/pilotdetails.php?pilot='.$data['pilot_id']));
1047
			if (isset($pilot_data[4])) $data['pilot_name'] = $pilot_data[4];
1048
			$data['format_source'] = $value['format'];
1049
			$SI->add($data);
1050
			unset($data);
1051
		}
1052
	    }
1053
	    $Source->deleteOldLocationByType('gs');
1054
	    $buffer = $Common->getData('http://www.airwhere.co.uk/gspositions.php','get','','','','','20');
1055
	    if ($buffer != '') {
1056
		$all_data = simplexml_load_string($buffer);
1057
		foreach($all_data->children() as $childdata) {
1058
			$data = array();
1059
			$line = $childdata;
1060
			$data['id'] = (int)$line['gsID'];
1061
			$data['latitude'] = (float)$line['gsLatitude'];
1062
			$data['longitude'] = (float)$line['gsLongitude'];
1063
			$data['altitude'] = round((int)$line['gsHeight']*3.28084);
1064
			$data['altitude_relative'] = 'AMSL';
1065
			$data['datetime'] = date('Y-m-d H:i:s',strtotime((string)$line['gsLastUpdate'].' BST'));
1066
			if (count($Source->getLocationInfoByLocationID($data['id'])) > 0) {
1067
				$Source->updateLocationByLocationID('',$data['latitude'],$data['longitude'],$data['altitude'],'','','airwhere','antenna.png','gs',$id,$data['id'],$data['datetime']);
1068
			} else {
1069
				$Source->addLocation('',$data['latitude'],$data['longitude'],$data['altitude'],'','','airwhere','antenna.png','gs',$id,$data['id'],$data['datetime']);
1070
			}
1071
			unset($data);
1072
		}
1073
	    }
1074
	    $last_exec[$id]['last'] = time();
1075
	/*
1076
	} if ($value['format'] === 'aircraftlistjson') {
1077
	    print_r($globalSources);
1078
	    print_r($last_exec);
1079
	    echo $globalMinFetch;
1080
	*/
1081
	} elseif ($value['format'] === 'aircraftlistjson' && 
1082
	    (
1083
		(isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
1084
		(!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
1085
	    )
1086
	) {
1087
	    $buffer = $Common->getData($value['host'],'get','','','','','20');
1088
	    if ($buffer != '') {
1089
	        $all_data = json_decode($buffer,true);
1090
		if (isset($all_data['acList'])) {
1091
		    $reset = 0;
1092
		    foreach ($all_data['acList'] as $line) {
1093
			$data = array();
1094
			$data['hex'] = $line['Icao']; // hex
1095
			if (isset($line['Call'])) $data['ident'] = $line['Call']; // ident
1096
			if (isset($line['Alt'])) $data['altitude'] = $line['Alt']; // altitude
1097
			if (isset($line['Spd'])) $data['speed'] = $line['Spd']; // speed
1098
			if (isset($line['Trak'])) $data['heading'] = $line['Trak']; // heading
1099
			if (isset($line['Lat'])) $data['latitude'] = $line['Lat']; // lat
1100
			if (isset($line['Long'])) $data['longitude'] = $line['Long']; // long
1101
			//$data['verticalrate'] = $line['']; // verticale rate
1102
			if (isset($line['Sqk'])) $data['squawk'] = $line['Sqk']; // squawk
1103
			$data['emergency'] = ''; // emergency
1104
			if (isset($line['Reg'])) $data['registration'] = $line['Reg'];
1105
			if (isset($line['PosTime'])) $data['datetime'] = date('Y-m-d H:i:s',round($line['PosTime']/1000));
1106
			else $data['datetime'] = date('Y-m-d H:i:s');
1107
			//$data['datetime'] = date('Y-m-d H:i:s');
1108
			if (isset($line['Type'])) $data['aircraft_icao'] = $line['Type'];
1109
			$data['format_source'] = 'aircraftlistjson';
1110
			$data['id_source'] = $id_source;
1111
			if (isset($value['name']) && $value['name'] != '') $data['source_name'] = $value['name'];
1112
			if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
1113
			if (isset($data['latitude'])) $SI->add($data);
1114
			unset($data);
1115
		    }
1116
		} elseif (is_array($all_data)) {
1117
		    $reset = 0;
1118
		    foreach ($all_data as $line) {
1119
			$data = array();
1120
			$data['hex'] = $line['hex']; // hex
1121
			$data['ident'] = $line['flight']; // ident
1122
			$data['altitude'] = $line['altitude']; // altitude
1123
			$data['speed'] = $line['speed']; // speed
1124
			$data['heading'] = $line['track']; // heading
1125
			$data['latitude'] = $line['lat']; // lat
1126
			$data['longitude'] = $line['lon']; // long
1127
			$data['verticalrate'] = $line['vrt']; // verticale rate
1128
			$data['squawk'] = $line['squawk']; // squawk
1129
			$data['emergency'] = ''; // emergency
1130
			if (isset($line['PosTime'])) $data['datetime'] = date('Y-m-d H:i:s',round($line['PosTime']/1000));
1131
			else $data['datetime'] = date('Y-m-d H:i:s');
1132
			$data['format_source'] = 'aircraftlistjson';
1133
			$data['id_source'] = $id_source;
1134
			if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
1135
			if (isset($value['name']) && $value['name'] != '') $data['source_name'] = $value['name'];
1136
			$SI->add($data);
1137
			unset($data);
1138
		    }
1139
		}
1140
	    } elseif ($globalDebug) echo 'No data'."\n";
1141
    	    //$last_exec['aircraftlistjson'] = time();
1142
    	    $last_exec[$id]['last'] = time();
1143
    	//} elseif ($value === 'planeupdatefaa' && (time() - $last_exec['planeupdatefaa'] > $globalMinFetch)) {
1144
    	} elseif ($value['format'] === 'planeupdatefaa' && 
1145
    	    (
1146
    		(isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) || 
1147
    		(!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
1148
    	    )
1149
    	) {
1150
	    $buffer = $Common->getData($value['host']);
1151
	    $all_data = json_decode($buffer,true);
1152
	    if (isset($all_data['planes'])) {
1153
		$reset = 0;
1154
		foreach ($all_data['planes'] as $key => $line) {
1155
		    $data = array();
1156
		    $data['hex'] = $key; // hex
1157
		    $data['ident'] = $line[3]; // ident
1158
		    $data['altitude'] = $line[6]; // altitude
1159
		    $data['speed'] = $line[8]; // speed
1160
		    $data['heading'] = $line[7]; // heading
1161
		    $data['latitude'] = $line[4]; // lat
1162
		    $data['longitude'] = $line[5]; // long
1163
		    //$data['verticalrate'] = $line[]; // verticale rate
1164
		    $data['squawk'] = $line[10]; // squawk
1165
		    $data['emergency'] = ''; // emergency
1166
		    $data['registration'] = $line[2];
1167
		    $data['aircraft_icao'] = $line[0];
1168
		    $deparr = explode('-',$line[1]);
1169
		    if (count($deparr) === 2) {
1170
			$data['departure_airport_icao'] = $deparr[0];
1171
			$data['arrival_airport_icao'] = $deparr[1];
1172
		    }
1173
		    $data['datetime'] = date('Y-m-d H:i:s',$line[9]);
1174
	    	    $data['format_source'] = 'planeupdatefaa';
1175
    		    $data['id_source'] = $id_source;
1176
		    if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
1177
		    if (isset($value['name']) && $value['name'] != '') $data['source_name'] = $value['name'];
1178
		    $SI->add($data);
1179
		    unset($data);
1180
		}
1181
	    }
1182
	    //$last_exec['planeupdatefaa'] = time();
1183
	    $last_exec[$id]['last'] = time();
1184
	} elseif ($value['format'] === 'opensky' && 
1185
	    (
1186
		(isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) || 
1187
		(!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
1188
	    )
1189
	) {
1190
	    $buffer = $Common->getData($value['host']);
1191
	    $all_data = json_decode($buffer,true);
1192
	    if (isset($all_data['states'])) {
1193
		$reset = 0;
1194
		foreach ($all_data['states'] as $key => $line) {
1195
		    $data = array();
1196
		    $data['hex'] = $line[0]; // hex
1197
		    $data['ident'] = trim($line[1]); // ident
1198
		    $data['altitude'] = round($line[7]*3.28084); // altitude
1199
		    $data['speed'] = round($line[9]*1.94384); // speed
1200
		    $data['heading'] = round($line[10]); // heading
1201
		    $data['latitude'] = $line[6]; // lat
1202
		    $data['longitude'] = $line[5]; // long
1203
		    $data['verticalrate'] = $line[11]; // verticale rate
1204
		    //$data['squawk'] = $line[10]; // squawk
1205
		    //$data['emergency'] = ''; // emergency
1206
		    //$data['registration'] = $line[2];
1207
		    //$data['aircraft_icao'] = $line[0];
1208
		    $data['datetime'] = date('Y-m-d H:i:s',$line[3]);
1209
		    $data['format_source'] = 'opensky';
1210
		    $data['id_source'] = $id_source;
1211
		    if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
1212
		    $SI->add($data);
1213
		    unset($data);
1214
		}
1215
	    }
1216
	    //$last_exec['planeupdatefaa'] = time();
1217
	    $last_exec[$id]['last'] = time();
1218
	} elseif ($value['format'] === 'aircraftjson' && 
1219
	    (
1220
		(isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) || 
1221
		(!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
1222
	    )
1223
	) {
1224
	    $buffer = $Common->getData($value['host']);
1225
	    $all_data = json_decode($buffer,true);
1226
	    if (isset($all_data['aircraft']) && isset($all_data['now']) && $all_data['now'] > time()-1800) {
1227
		$reset = 0;
1228
		foreach ($all_data['aircraft'] as $key => $line) {
1229
		    $data = array();
1230
		    // add support for ground vehicule with ~ in front of hex
1231
		    if (isset($line['hex'])) $data['hex'] = $line['hex']; // hex
1232
		    if (isset($line['flight'])) $data['ident'] = trim($line['flight']); // ident
1233
		    if (isset($line['altitude'])) $data['altitude'] = $line['altitude']; // altitude
1234
		    if (isset($line['speed'])) $data['speed'] = $line['speed']; // speed
1235
		    if (isset($line['track'])) $data['heading'] = $line['track']; // heading
1236
		    if (isset($line['lat'])) $data['latitude'] = $line['lat']; // lat
1237
		    if (isset($line['lon'])) $data['longitude'] = $line['lon']; // long
1238
		    if (isset($line['vert_rate'])) $data['verticalrate'] = $line['vert_rate']; // verticale rate
1239
		    if (isset($line['squawk'])) $data['squawk'] = $line['squawk']; // squawk
1240
		    //$data['emergency'] = ''; // emergency
1241
		    //$data['registration'] = $line[2];
1242
		    //$data['aircraft_icao'] = $line[0];
1243
		    $data['datetime'] = date('Y-m-d H:i:s');
1244
		    $data['format_source'] = 'aircraftjson';
1245
		    $data['id_source'] = $id_source;
1246
		    if (isset($value['name']) && $value['name'] != '') {
1247
			    if (isset($line['mlat']) && !empty($line['mlat'])) $data['source_name'] = $value['name'].'_MLAT';
1248
			    else $data['source_name'] = $value['name'];
1249
		    } elseif (isset($line['mlat']) && !empty($line['mlat'])) $data['source_name'] = 'MLAT';
1250
		    if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
1251
		    $SI->add($data);
1252
		    unset($data);
1253
		}
1254
	    }
1255
	    //$last_exec['planeupdatefaa'] = time();
1256
	    $last_exec[$id]['last'] = time();
1257
	} elseif ($value['format'] === 'planefinderclient' && 
1258
	    (
1259
		(isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) || 
1260
		(!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
1261
	    )
1262
	) {
1263
	    $buffer = $Common->getData($value['host']);
1264
	    $all_data = json_decode($buffer,true);
1265
	    if (isset($all_data['aircraft'])) {
1266
		$reset = 0;
1267
		foreach ($all_data['aircraft'] as $key => $line) {
1268
		    $data = array();
1269
		    $data['hex'] = $key; // hex
1270
		    if (isset($line['callsign'])) $data['ident'] = trim($line['callsign']); // ident
1271
		    if (isset($line['altitude'])) $data['altitude'] = $line['altitude']; // altitude
1272
		    if (isset($line['speed'])) $data['speed'] = $line['speed']; // speed
1273
		    if (isset($line['heading'])) $data['heading'] = $line['heading']; // heading
1274
		    if (isset($line['lat'])) $data['latitude'] = $line['lat']; // lat
1275
		    if (isset($line['lon'])) $data['longitude'] = $line['lon']; // long
1276
		    if (isset($line['vert_rate'])) $data['verticalrate'] = $line['vert_rate']; // verticale rate
1277
		    if (isset($line['squawk'])) $data['squawk'] = $line['squawk']; // squawk
1278
		    //$data['emergency'] = ''; // emergency
1279
		    if (isset($line['reg'])) $data['registration'] = $line['reg'];
1280
		    if (isset($line['type'])) $data['aircraft_icao'] = $line['type'];
1281
		    $data['datetime'] = date('Y-m-d H:i:s',$line['pos_update_time']);
1282
		    $data['format_source'] = 'planefinderclient';
1283
		    $data['id_source'] = $id_source;
1284
		    if (isset($value['name']) && $value['name'] != '') $data['source_name'] = $value['name'];
1285
		    if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
1286
		    $SI->add($data);
1287
		    unset($data);
1288
		}
1289
	    }
1290
	    $last_exec[$id]['last'] = time();
1291
	//} elseif ($value === 'fr24json' && (time() - $last_exec['fr24json'] > $globalMinFetch)) {
1292
	} elseif ($value['format'] === 'fr24json' && 
1293
	    (
1294
		(isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
1295
		(!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
1296
	    )
1297
	) {
1298
	    //$buffer = $Common->getData($hosts[$id]);
1299
	    $buffer = $Common->getData($value['host']);
1300
	    $all_data = json_decode($buffer,true);
1301
	    if (!empty($all_data)) $reset = 0;
1302
	    foreach ($all_data as $key => $line) {
1303
		if ($key != 'full_count' && $key != 'version' && $key != 'stats') {
1304
		    $data = array();
1305
		    $data['hex'] = $line[0];
1306
		    $data['ident'] = $line[16]; //$line[13]
1307
	    	    $data['altitude'] = $line[4]; // altitude
1308
	    	    $data['speed'] = $line[5]; // speed
1309
	    	    $data['heading'] = $line[3]; // heading
1310
	    	    $data['latitude'] = $line[1]; // lat
1311
	    	    $data['longitude'] = $line[2]; // long
1312
	    	    $data['verticalrate'] = $line[15]; // verticale rate
1313
	    	    $data['squawk'] = $line[6]; // squawk
1314
	    	    $data['aircraft_icao'] = $line[8];
1315
	    	    $data['registration'] = $line[9];
1316
		    $data['departure_airport_iata'] = $line[11];
1317
		    $data['arrival_airport_iata'] = $line[12];
1318
	    	    $data['emergency'] = ''; // emergency
1319
		    $data['datetime'] = date('Y-m-d H:i:s'); //$line[10]
1320
	    	    $data['format_source'] = 'fr24json';
1321
    		    $data['id_source'] = $id_source;
1322
		    if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
1323
		    if (isset($value['name']) && $value['name'] != '') $data['source_name'] = $value['name'];
1324
		    $SI->add($data);
1325
		    unset($data);
1326
		}
1327
	    }
1328
	    //$last_exec['fr24json'] = time();
1329
	    $last_exec[$id]['last'] = time();
1330
	//} elseif ($value === 'radarvirtueljson' && (time() - $last_exec['radarvirtueljson'] > $globalMinFetch)) {
1331
	} elseif ($value['format'] === 'radarvirtueljson' && 
1332
	    (
1333
		(isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
1334
		(!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
1335
	    )
1336
	) {
1337
	    //$buffer = $Common->getData($hosts[$id],'get','','','','','150');
1338
	    $buffer = $Common->getData($value['host'],'get','','','','','150');
1339
	    //echo $buffer;
1340
	    $buffer = str_replace(array("\n","\r"),"",$buffer);
1341
	    $buffer = preg_replace('/,"num":(.+)/','}',$buffer);
1342
	    $all_data = json_decode($buffer,true);
1343
	    if (json_last_error() != JSON_ERROR_NONE) {
1344
		die(json_last_error_msg());
1345
	    }
1346
	    if (isset($all_data['mrkrs'])) {
1347
		$reset = 0;
1348
		foreach ($all_data['mrkrs'] as $key => $line) {
1349
		    if (isset($line['inf'])) {
1350
			$data = array();
1351
			$data['hex'] = $line['inf']['ia'];
1352
			if (isset($line['inf']['cs'])) $data['ident'] = $line['inf']['cs']; //$line[13]
1353
	    		$data['altitude'] = round($line['inf']['al']*3.28084); // altitude
1354
	    		if (isset($line['inf']['gs'])) $data['speed'] = round($line['inf']['gs']*0.539957); // speed
1355
	    		if (isset($line['inf']['tr'])) $data['heading'] = $line['inf']['tr']; // heading
1356
	    		$data['latitude'] = $line['pt'][0]; // lat
1357
	    		$data['longitude'] = $line['pt'][1]; // long
1358
	    		//if (isset($line['inf']['vs'])) $data['verticalrate'] = $line['inf']['vs']; // verticale rate
1359
	    		if (isset($line['inf']['sq'])) $data['squawk'] = $line['inf']['sq']; // squawk
1360
	    		//$data['aircraft_icao'] = $line[8];
1361
	    		if (isset($line['inf']['rc'])) $data['registration'] = $line['inf']['rc'];
1362
			//$data['departure_airport_iata'] = $line[11];
1363
			//$data['arrival_airport_iata'] = $line[12];
1364
	    		//$data['emergency'] = ''; // emergency
1365
			$data['datetime'] = date('Y-m-d H:i:s',$line['inf']['dt']); //$line[10]
1366
	    		$data['format_source'] = 'radarvirtueljson';
1367
    			$data['id_source'] = $id_source;
1368
			if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
1369
			if (isset($value['name']) && $value['name'] != '') $data['source_name'] = $value['name'];
1370
			$SI->add($data);
1371
			unset($data);
1372
		    }
1373
		}
1374
	    }
1375
	    //$last_exec['radarvirtueljson'] = time();
1376
	    $last_exec[$id]['last'] = time();
1377
	//} elseif ($value === 'pirepsjson' && (time() - $last_exec['pirepsjson'] > $globalMinFetch)) {
1378
	} elseif ($value['format'] === 'pirepsjson' && 
1379
	    (
1380
		(isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) || 
1381
		(!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
1382
	    )
1383
	) {
1384
	    //$buffer = $Common->getData($hosts[$id]);
1385
	    $buffer = $Common->getData($value['host'].'?'.time());
1386
	    $all_data = json_decode(utf8_encode($buffer),true);
1387
	    
1388
	    if (isset($all_data['pireps'])) {
1389
		$reset = 0;
1390
	        foreach ($all_data['pireps'] as $line) {
1391
		    $data = array();
1392
		    $data['id'] = $line['id'];
1393
		    $data['hex'] = substr(str_pad(dechex($line['id']),6,'000000',STR_PAD_LEFT),0,6);
1394
		    $data['ident'] = $line['callsign']; // ident
1395
		    if (isset($line['pilotid'])) $data['pilot_id'] = $line['pilotid']; // pilot id
1396
		    if (isset($line['name'])) $data['pilot_name'] = $line['name']; // pilot name
1397
		    if (isset($line['alt'])) $data['altitude'] = $line['alt']; // altitude
1398
		    if (isset($line['gs'])) $data['speed'] = $line['gs']; // speed
1399
		    if (isset($line['heading'])) $data['heading'] = $line['heading']; // heading
1400
		    if (isset($line['route'])) $data['waypoints'] = $line['route']; // route
1401
		    $data['latitude'] = $line['lat']; // lat
1402
		    $data['longitude'] = $line['lon']; // long
1403
		    //$data['verticalrate'] = $line['vrt']; // verticale rate
1404
		    //$data['squawk'] = $line['squawk']; // squawk
1405
		    //$data['emergency'] = ''; // emergency
1406
		    if (isset($line['depicao'])) $data['departure_airport_icao'] = $line['depicao'];
1407
		    if (isset($line['deptime'])) $data['departure_airport_time'] = $line['deptime'];
1408
		    if (isset($line['arricao'])) $data['arrival_airport_icao'] = $line['arricao'];
1409
		    //$data['arrival_airport_time'] = $line['arrtime'];
1410
		    if (isset($line['aircraft'])) $data['aircraft_icao'] = $line['aircraft'];
1411
		    if (isset($line['transponder'])) $data['squawk'] = $line['transponder'];
1412
		    if (isset($line['atis'])) $data['info'] = $line['atis'];
1413
		    else $data['info'] = '';
1414
		    $data['format_source'] = 'pireps';
1415
    		    $data['id_source'] = $id_source;
1416
		    $data['datetime'] = date('Y-m-d H:i:s');
1417
		    if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
1418
		    if (isset($value['name']) && $value['name'] != '') $data['source_name'] = $value['name'];
1419
		    if ($line['icon'] === 'plane') {
1420
			$SI->add($data);
1421
		    //    print_r($data);
1422
    		    } elseif ($line['icon'] === 'ct') {
1423
			$data['info'] = str_replace('^&sect;','<br />',$data['info']);
1424
			$data['info'] = str_replace('&amp;sect;','',$data['info']);
1425
			$typec = substr($data['ident'],-3);
1426
			$data['type'] = '';
1427
			if ($typec === 'APP') $data['type'] = 'Approach';
1428
			elseif ($typec === 'TWR') $data['type'] = 'Tower';
1429
			elseif ($typec === 'OBS') $data['type'] = 'Observer';
1430
			elseif ($typec === 'GND') $data['type'] = 'Ground';
1431
			elseif ($typec === 'DEL') $data['type'] = 'Delivery';
1432
			elseif ($typec === 'DEP') $data['type'] = 'Departure';
1433
			elseif ($typec === 'FSS') $data['type'] = 'Flight Service Station';
1434
			elseif ($typec === 'CTR') $data['type'] = 'Control Radar or Centre';
1435
			else $data['type'] = 'Observer';
1436
			if (isset($ATC)) echo $ATC->add($data['ident'],'',$data['latitude'],$data['longitude'],'0',$data['info'],$data['datetime'],$data['type'],$data['pilot_id'],$data['pilot_name'],$data['format_source']);
1437
		    }
1438
		    unset($data);
1439
		}
1440
	    }
1441
	    //$last_exec['pirepsjson'] = time();
1442
	    $last_exec[$id]['last'] = time();
1443
	//} elseif ($value === 'phpvmacars' && (time() - $last_exec['phpvmacars'] > $globalMinFetch)) {
1444
	} elseif ($value['format'] === 'phpvmacars' && 
1445
	    (
1446
		(isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
1447
		(!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
1448
	    )
1449
	) {
1450
	    //$buffer = $Common->getData($hosts[$id]);
1451
	    if ($globalDebug) echo 'Get Data...'."\n";
1452
	    $buffer = $Common->getData($value['host']);
1453
	    $all_data = json_decode($buffer,true);
1454
	    if ($buffer != '' && is_array($all_data)) {
1455
		$reset = 0;
1456
		foreach ($all_data as $line) {
1457
	    	    $data = array();
1458
	    	    //$data['id'] = $line['id']; // id not usable
1459
	    	    if (isset($line['pilotid']) && isset($line['registration'])) $data['id'] = $line['pilotid'].$line['flightnum'].trim($line['registration']);
1460
	    	    elseif (isset($line['pilotid'])) $data['id'] = $line['pilotid'].$line['flightnum'];
1461
	    	    $data['hex'] = substr(str_pad(bin2hex($line['flightnum']),6,'000000',STR_PAD_LEFT),-6); // hex
1462
	    	    if (isset($line['pilotname'])) $data['pilot_name'] = $line['pilotname'];
1463
	    	    if (isset($line['pilotid'])) $data['pilot_id'] = $line['pilotid'];
1464
	    	    $data['ident'] = $line['flightnum']; // ident
1465
	    	    $data['altitude'] = $line['alt']; // altitude
1466
	    	    $data['speed'] = $line['gs']; // speed
1467
	    	    $data['heading'] = $line['heading']; // heading
1468
	    	    $data['latitude'] = $line['lat']; // lat
1469
	    	    $data['longitude'] = $line['lng']; // long
1470
	    	    $data['verticalrate'] = ''; // verticale rate
1471
	    	    $data['squawk'] = ''; // squawk
1472
	    	    $data['emergency'] = ''; // emergency
1473
	    	    //$data['datetime'] = $line['lastupdate'];
1474
	    	    //$data['last_update'] = $line['lastupdate'];
1475
	    	    if (isset($value['timezone'])) {
1476
	    		$datetime = new DateTime($line['lastupdate'],new DateTimeZone($value['timezone']));
1477
	    		$datetime->setTimeZone(new DateTimeZone('UTC'));
1478
	    		$data['datetime'] = $datetime->format('Y-m-d H:i:s');
1479
	    	    } else $data['datetime'] = date('Y-m-d H:i:s');
1480
	    	    $data['departure_airport_icao'] = $line['depicao'];
1481
	    	    $data['departure_airport_time'] = $line['deptime'];
1482
	    	    $data['arrival_airport_icao'] = $line['arricao'];
1483
    		    $data['arrival_airport_time'] = $line['arrtime'];
1484
    		    if (isset($line['registration'])) {
1485
    			$data['registration'] = trim($line['registration']);
1486
    			//if (isset($line['aircraft'])) $data['id'] = $line['aircraft'];
1487
    		    } else $data['registration'] = $line['aircraft'];
1488
		    if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
1489
		    if (isset($line['route'])) $data['waypoints'] = $line['route']; // route
1490
		    if (isset($line['aircraftname'])) {
1491
			$line['aircraftname'] = strtoupper($line['aircraftname']);
1492
			$line['aircraftname'] = str_replace('BOEING ','B',$line['aircraftname']);
1493
	    		$aircraft_data = explode('-',$line['aircraftname']);
1494
	    		if (isset($aircraft_data[1]) && strlen($aircraft_data[0]) >= 3 && strlen($aircraft_data[0]) <= 4) $data['aircraft_icao'] = $aircraft_data[0];
1495
	    		elseif (isset($aircraft_data[1]) && strlen($aircraft_data[1]) >= 3 && strlen($aircraft_data[1]) <= 4) $data['aircraft_icao'] = $aircraft_data[1];
1496
	    		else {
1497
	    		    $aircraft_data = explode(' ',$line['aircraftname']);
1498
	    		    if (isset($aircraft_data[1])) $data['aircraft_icao'] = str_replace('-','',$aircraft_data[1]);
1499
	    		    else $data['aircraft_icao'] = str_replace('-','',$line['aircraftname']);
1500
	    		}
1501
	    	    }
1502
    		    if (isset($line['route'])) $data['waypoints'] = $line['route'];
1503
    		    $data['id_source'] = $id_source;
1504
	    	    $data['format_source'] = 'phpvmacars';
1505
		    if (isset($value['name']) && $value['name'] != '') $data['source_name'] = $value['name'];
1506
		    $SI->add($data);
1507
		    unset($data);
1508
		}
1509
		if ($globalDebug) echo 'No more data...'."\n";
1510
		unset($buffer);
1511
		unset($all_data);
1512
	    }
1513
	    //$last_exec['phpvmacars'] = time();
1514
	    $last_exec[$id]['last'] = time();
1515
	} elseif ($value['format'] === 'vaos' && 
1516
	    (
1517
		(isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
1518
		(!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
1519
	    )
1520
	) {
1521
	    //$buffer = $Common->getData($hosts[$id]);
1522
	    if ($globalDebug) echo 'Get Data...'."\n";
1523
	    $buffer = $Common->getData($value['host']);
1524
	    $all_data = json_decode($buffer,true);
1525
	    if ($buffer != '' && is_array($all_data) && isset($all_data['ACARSData'])) {
1526
		$reset = 0;
1527
		foreach ($all_data['ACARSData'] as $line) {
1528
		    //print_r($line);
1529
	    	    $data = array();
1530
	    	    //$data['id'] = $line['id']; // id not usable
1531
	    	    $data['id'] = $line['id'];
1532
	    	    //$data['hex'] = substr(str_pad(bin2hex($line['flightnum']),6,'000000',STR_PAD_LEFT),-6); // hex
1533
	    	    if (isset($line['user']['username'])) $data['pilot_name'] = $line['user']['username'];
1534
	    	    if (isset($line['user_id'])) $data['pilot_id'] = $line['user_id'];
1535
	    	    $data['ident'] = str_replace(' ','',$line['bid']['flightnum']); // ident
1536
	    	    if (is_numeric($data['ident'])) $data['ident'] = $line['bid']['airline']['icao'].$data['ident'];
1537
	    	    $data['altitude'] = $line['altitude']; // altitude
1538
	    	    $data['speed'] = $line['groundspeed']; // speed
1539
	    	    $data['heading'] = $line['heading']; // heading
1540
	    	    $data['latitude'] = $line['lat']; // lat
1541
	    	    $data['longitude'] = $line['lon']; // long
1542
	    	    //$data['verticalrate'] = ''; // verticale rate
1543
	    	    //$data['squawk'] = ''; // squawk
1544
	    	    //$data['emergency'] = ''; // emergency
1545
	    	    if (isset($value['timezone'])) {
1546
	    		$datetime = new DateTime($line['updated_at'],new DateTimeZone($value['timezone']));
1547
	    		$datetime->setTimeZone(new DateTimeZone('UTC'));
1548
	    		$data['datetime'] = $datetime->format('Y-m-d H:i:s');
1549
	    	    } else $data['datetime'] = date('Y-m-d H:i:s');
1550
	    	    
1551
	    	    $data['departure_airport_icao'] = $line['bid']['depapt']['icao'];
1552
	    	    $data['departure_airport_time'] = $line['bid']['deptime'];
1553
	    	    $data['arrival_airport_icao'] = $line['bid']['arrapt']['icao'];
1554
		    $data['arrival_airport_time'] = $line['bid']['arrtime'];
1555
		    $data['registration'] = $line['bid']['aircraft']['registration'];
1556
1557
		    if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
1558
		    if (isset($line['bid']['route']) && $line['bid']['route'] != '') $data['waypoints'] = $line['bid']['route']; // route
1559
	    	    $data['aircraft_icao'] = $line['bid']['aircraft']['icao'];
1560
1561
    		    $data['id_source'] = $id_source;
1562
	    	    $data['format_source'] = 'vaos';
1563
		    if (isset($value['name']) && $value['name'] != '') $data['source_name'] = $value['name'];
1564
		    $SI->add($data);
1565
		    unset($data);
1566
		}
1567
		if ($globalDebug) echo 'No more data...'."\n";
1568
		unset($buffer);
1569
		unset($all_data);
1570
	    }
1571
	    //$last_exec['phpvmacars'] = time();
1572
	    $last_exec[$id]['last'] = time();
1573
	} elseif ($value['format'] === 'vam' && 
1574
	    (
1575
		(isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) ||
1576
		(!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
1577
	    )
1578
	) {
1579
	    //$buffer = $Common->getData($hosts[$id]);
1580
	    if ($globalDebug) echo 'Get Data...'."\n";
1581
	    $buffer = $Common->getData($value['host']);
1582
	    $all_data = json_decode($buffer,true);
1583
	    if ($buffer != '' && is_array($all_data)) {
1584
		$reset = 0;
1585
		foreach ($all_data as $line) {
1586
	    	    $data = array();
1587
	    	    //$data['id'] = $line['id']; // id not usable
1588
	    	    $data['id'] = trim($line['flight_id']);
1589
	    	    $data['hex'] = substr(str_pad(bin2hex($line['callsign']),6,'000000',STR_PAD_LEFT),-6); // hex
1590
	    	    $data['pilot_name'] = $line['pilot_name'];
1591
	    	    $data['pilot_id'] = $line['pilot_id'];
1592
	    	    $data['ident'] = trim($line['callsign']); // ident
1593
	    	    $data['altitude'] = $line['altitude']; // altitude
1594
	    	    $data['speed'] = $line['gs']; // speed
1595
	    	    $data['heading'] = $line['heading']; // heading
1596
	    	    $data['latitude'] = $line['latitude']; // lat
1597
	    	    $data['longitude'] = $line['longitude']; // long
1598
	    	    $data['verticalrate'] = ''; // verticale rate
1599
	    	    $data['squawk'] = ''; // squawk
1600
	    	    $data['emergency'] = ''; // emergency
1601
	    	    //$data['datetime'] = $line['lastupdate'];
1602
	    	    $data['last_update'] = $line['last_update'];
1603
		    $data['datetime'] = date('Y-m-d H:i:s');
1604
	    	    $data['departure_airport_icao'] = $line['departure'];
1605
	    	    //$data['departure_airport_time'] = $line['departure_time'];
1606
	    	    $data['arrival_airport_icao'] = $line['arrival'];
1607
    		    //$data['arrival_airport_time'] = $line['arrival_time'];
1608
    		    //$data['registration'] = $line['aircraft'];
1609
		    if (isset($line['route'])) $data['waypoints'] = $line['route']; // route
1610
	    	    $data['aircraft_icao'] = $line['plane_type'];
1611
    		    $data['id_source'] = $id_source;
1612
	    	    $data['format_source'] = 'vam';
1613
		    if (isset($value['noarchive']) && $value['noarchive'] === TRUE) $data['noarchive'] = true;
1614
		    if (isset($value['name']) && $value['name'] != '') $data['source_name'] = $value['name'];
1615
		    $SI->add($data);
1616
		    unset($data);
1617
		}
1618
		if ($globalDebug) echo 'No more data...'."\n";
1619
		unset($buffer);
1620
		unset($all_data);
1621
	    }
1622
	    //$last_exec['phpvmacars'] = time();
1623
	    $last_exec[$id]['last'] = time();
1624
	} elseif ($value['format'] === 'blitzortung' && 
1625
	    (
1626
		(isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalSources[$id]['minfetch'])) || 
1627
		(!isset($globalSources[$id]['minfetch']) && (time() - $last_exec[$id]['last'] > $globalMinFetch))
1628
	    )
1629
	) {
1630
	    //$buffer = $Common->getData($hosts[$id]);
1631
	    if ($globalDebug) echo 'Get Data...'."\n";
1632
	    $buffer = $Common->getData($value['host']);
1633
	    $all_data = json_decode($buffer,true);
1634
	    if ($buffer != '') {
1635
		$Source->deleteLocationBySource('blitzortung');
1636
		$buffer=trim(str_replace(array("\r\n","\r","\n","\\r","\\n","\\r\\n"),'\n',$buffer));
1637
		$buffer = explode('\n',$buffer);
1638
		foreach ($buffer as $buffer_line) {
1639
		    $line = json_decode($buffer_line,true);
1640
		    if (isset($line['time'])) {
1641
			$data = array();
1642
			$data['altitude'] = $line['alt']; // altitude
1643
			$data['latitude'] = $line['lat']; // lat
1644
			$data['longitude'] = $line['lon']; // long
1645
			$data['datetime'] = date('Y-m-d H:i:s',substr($line['time'],0,10));
1646
			$data['id_source'] = $id_source;
1647
			$data['format_source'] = 'blitzortung';
1648
			$SI->add($data);
1649
			if ($globalDebug) echo '☈ Lightning added'."\n";
1650
			$Source->addLocation('',$data['latitude'],$data['longitude'],0,'','','blitzortung','weather/thunderstorm.png','lightning',$id,0,$data['datetime']);
1651
			unset($data);
1652
		    }
1653
		}
1654
		if ($globalDebug) echo 'No more data...'."\n";
1655
		unset($buffer);
1656
	    }
1657
	    $last_exec[$id]['last'] = time();
1658
	} elseif ($value['format'] === 'acarsjson') {
1659
        $arr = $httpfeeds;
1660
        $w = $e = null;
1661
        if (isset($arr[$id])) {
1662
            $nn = stream_select($arr,$w,$e,$timeout);
1663
            if ($nn > 0) {
1664
                foreach ($httpfeeds as $feed) {
1665
                    $buffer = stream_get_line($feed,2000,"\n");
1666
                    if ($buffer === FALSE) {
1667
                        connect_all($globalSources);
1668
                    }
1669
                    $buffer=trim(str_replace(array("\r\n","\r","\n","\\r","\\n","\\r\\n"),'\n',$buffer));
1670
                    $buffer = explode('\n',$buffer);
1671
                    foreach ($buffer as $line) {
1672
                        if ($line != '') {
1673
                            $line = json_decode($line, true);
1674
                            if (!empty($line)) {
1675
                                $ACARS->add(isset($line['text']) ? $line['text'] : '', array('registration' => str_replace('.', '', $line['tail']), 'ident' => $line['flight'], 'label' => $line['label'], 'block_id' => $line['block_id'], 'msg_no' => $line['msgno'], 'message' => (isset($line['text']) ? $line['text'] : '')));
1676
                                $ACARS->deleteLiveAcarsData();
1677
                            }
1678
                        }
1679
                    }
1680
                }
1681
            } else {
1682
                $format = $value['format'];
1683
                if (isset($tt[$format])) $tt[$format]++;
1684
                else $tt[$format] = 0;
1685
                if ($tt[$format] > 30) {
1686
                    if ($globalDebug) echo 'Reconnect...'."\n";
1687
                    sleep(2);
1688
                    //$sourceeen[] = $value;
1689
                    //connect_all($sourceeen);
1690
                    //$sourceeen = array();
1691
                    connect_all($globalSources);
1692
                }
1693
            }
1694
        }
1695
	//} elseif ($value === 'sbs' || $value === 'tsv' || $value === 'raw' || $value === 'aprs' || $value === 'beast') {
1696
	} elseif ($value['format'] === 'sbs' || $value['format'] === 'tsv' || $value['format'] === 'raw' || $value['format'] === 'aprs' || $value['format'] === 'famaprs' || $value['format'] === 'beast' || $value['format'] === 'flightgearmp' || $value['format'] === 'flightgearsp' || $value['format'] === 'acars' || $value['format'] === 'acarsjsonudp' || $value['format'] === 'acarssbs3' || $value['format'] === 'ais' || $value['format'] === 'vrstcp') {
1697
	    //$last_exec[$id]['last'] = time();
1698
	    //$read = array( $sockets[$id] );
1699
	    $read = $sockets;
1700
	    $write = NULL;
1701
	    $e = NULL;
1702
	    $n = socket_select($read, $write, $e, $timeout);
1703
	    if ($e != NULL) var_dump($e);
1704
	    if ($n > 0) {
1705
		$reset = 0;
1706
		foreach ($read as $nb => $r) {
1707
		    //$value = $formats[$nb];
1708
		    $format = $globalSources[$nb]['format'];
1709
		    if ($format === 'sbs' || $format === 'aprs' || $format === 'famaprs' || $format === 'raw' || $format === 'tsv' || $format === 'acarssbs3') {
1710
			$buffer = @socket_read($r, 6000,PHP_NORMAL_READ);
1711
		    } elseif ($format === 'vrstcp') {
1712
			$buffer = @socket_read($r, 6000);
1713
		    } else {
1714
			$az = socket_recvfrom($r,$buffer,6000,0,$remote_ip,$remote_port);
1715
		    }
1716
		    //$buffer = socket_read($r, 60000,PHP_NORMAL_READ);
1717
		    //echo $buffer."\n";
1718
		    // lets play nice and handle signals such as ctrl-c/kill properly
1719
		    //if (function_exists('pcntl_fork')) pcntl_signal_dispatch();
1720
		    $error = false;
1721
		    //$SI::del();
1722
		    if ($buffer !== FALSE) {
1723
			if ($format === 'vrstcp') {
1724
			    $buffer = explode('},{',$buffer);
1725
			} else $buffer=trim(str_replace(array("\r\n","\r","\n","\\r","\\n","\\r\\n"),'',$buffer));
1726
		    }
1727
		    // SBS format is CSV format
1728
		    if ($buffer !== FALSE && $buffer !== '') {
1729
			$tt[$format] = 0;
1730
			if ($format === 'acarssbs3') {
1731
			    if ($globalDebug) echo 'ACARS : '.$buffer."\n";
1732
			    $ACARS->add(trim($buffer));
1733
			    $ACARS->deleteLiveAcarsData();
1734
			} elseif ($format === 'raw') {
1735
			    // AVR format
1736
			    $data = $SBS->parse($buffer);
1737
			    if (is_array($data)) {
1738
				//if (!empty($data)) print_r($data);
1739
				$data['datetime'] = date('Y-m-d H:i:s');
1740
				$data['format_source'] = 'raw';
1741
				if (isset($globalSources[$nb]['name']) && $globalSources[$nb]['name'] != '') $data['source_name'] = $globalSources[$nb]['name'];
1742
				if (isset($globalSources[$nb]['sourcestats'])) $data['sourcestats'] = $globalSources[$nb]['sourcestats'];
1743
				if (isset($globalSources[$nb]['noarchive']) && $globalSources[$nb]['noarchive'] === TRUE) $data['noarchive'] = true;
1744
				//if (($data['latitude'] === '' && $data['longitude'] === '') || (is_numeric($data['latitude']) && is_numeric($data['longitude']))) $SI->add($data);
1745
				$SI->add($data);
1746
				unset($data);
1747
			    }
1748
			} elseif ($format === 'ais') {
1749
			    $ais_data = $AIS->parse_line(trim($buffer));
1750
			    $data = array();
1751
			    if (isset($ais_data['ident'])) $data['ident'] = $ais_data['ident'];
1752
			    if (isset($ais_data['mmsi'])) $data['mmsi'] = substr($ais_data['mmsi'],-9);
1753
			    if (isset($ais_data['speed'])) $data['speed'] = $ais_data['speed'];
1754
			    if (isset($ais_data['heading'])) $data['heading'] = $ais_data['heading'];
1755
			    if (isset($ais_data['latitude'])) $data['latitude'] = $ais_data['latitude'];
1756
			    if (isset($ais_data['longitude'])) $data['longitude'] = $ais_data['longitude'];
1757
			    if (isset($ais_data['status'])) $data['status'] = $ais_data['status'];
1758
			    if (isset($ais_data['statusid'])) $data['status_id'] = $ais_data['statusid'];
1759
			    if (isset($ais_data['type'])) $data['type'] = $ais_data['type'];
1760
			    if (isset($ais_data['imo'])) $data['imo'] = $ais_data['imo'];
1761
			    if (isset($ais_data['callsign'])) $data['callsign'] = $ais_data['callsign'];
1762
			    if (isset($ais_data['destination'])) $data['arrival_code'] = $ais_data['destination'];
1763
			    if (isset($ais_data['eta_ts'])) $data['arrival_date'] = date('Y-m-d H:i:s',$ais_data['eta_ts']);
1764
			    if (isset($globalSources[$nb]['noarchive']) && $globalSources[$nb]['noarchive'] === TRUE) $data['noarchive'] = true;
1765
			    if (isset($globalSources[$nb]['name']) && $globalSources[$nb]['name'] != '') $data['source_name'] = $globalSources[$nb]['name'];
1766
			    if (isset($globalSources[$nb]['sourcestats'])) $data['sourcestats'] = $globalSources[$nb]['sourcestats'];
1767
1768
			    if (isset($ais_data['timestamp'])) {
1769
				$data['datetime'] = date('Y-m-d H:i:s',$ais_data['timestamp']);
1770
			    } else {
1771
				$data['datetime'] = date('Y-m-d H:i:s');
1772
			    }
1773
			    $data['format_source'] = 'aisnmea';
1774
    			    $data['id_source'] = $id_source;
1775
			    if (isset($ais_data['mmsi_type']) && $ais_data['mmsi_type'] === 'Ship') $MI->add($data);
1776
			    unset($data);
1777
                        } elseif ($format === 'flightgearsp') {
1778
                    	    //echo $buffer."\n";
1779
                    	    if (strlen($buffer) > 5) {
1780
				$line = explode(',',$buffer);
1781
				$data = array();
1782
				//XGPS,2.0947,41.3093,-3047.6953,198.930,0.000,callsign,c172p
1783
				$data['hex'] = substr(str_pad(bin2hex($line[6].$line[7]),6,'000000',STR_PAD_LEFT),0,6);
1784
				$data['ident'] = $line[6];
1785
				$data['aircraft_name'] = $line[7];
1786
				$data['longitude'] = $line[1];
1787
				$data['latitude'] = $line[2];
1788
				$data['altitude'] = round($line[3]*3.28084);
1789
				$data['heading'] = round($line[4]);
1790
				$data['speed'] = round($line[5]*1.94384);
1791
				$data['datetime'] = date('Y-m-d H:i:s');
1792
				$data['format_source'] = 'flightgearsp';
1793
				if (isset($globalSources[$nb]['noarchive']) && $globalSources[$nb]['noarchive'] === TRUE) $data['noarchive'] = true;
1794
				if (($data['latitude'] === '' && $data['longitude'] === '') || (is_numeric($data['latitude']) && is_numeric($data['longitude']))) $SI->add($data);
1795
				//$send = @ socket_send( $r  , $data_aprs , strlen($data_aprs) , 0 );
1796
			    }
1797
                        } elseif ($format === 'acars') {
1798
                    	    if ($globalDebug) echo 'ACARS : '.$buffer."\n";
1799
			    $ACARS->add(trim($buffer));
1800
			    socket_sendto($r, "OK " . $buffer , 100 , 0 , $remote_ip , $remote_port);
1801
			    $ACARS->deleteLiveAcarsData();
1802
			} elseif ($format === 'acarsjsonudp') {
1803
			    if ($globalDebug) echo 'ACARS : '.$buffer."\n";
1804
                            $line = json_decode(trim($buffer), true);
1805
                            if (!empty($line)) {
1806
				$line = array_merge(array('text' => '','tail' => '','label' => '','block_id' => '','flight' => '','msgno' => ''),$line);
1807
                                $ACARS->add(isset($line['text']) ? $line['text'] : '', array('registration' => str_replace('.', '', $line['tail']), 'ident' => $line['flight'], 'label' => $line['label'], 'block_id' => $line['block_id'], 'msg_no' => $line['msgno'], 'message' => (isset($line['text']) ? $line['text'] : '')));
1808
                                $ACARS->deleteLiveAcarsData();
1809
                            }
1810
			    socket_sendto($r, "OK " . $buffer , 100 , 0 , $remote_ip , $remote_port);
1811
			} elseif ($format === 'flightgearmp') {
1812
			    if (substr($buffer,0,1) != '#') {
1813
				$data = array();
1814
				//echo $buffer."\n";
1815
				$line = explode(' ',$buffer);
1816
				if (count($line) === 11) {
1817
				    $userserver = explode('@',$line[0]);
1818
				    $data['hex'] = substr(str_pad(bin2hex($line[0]),6,'000000',STR_PAD_LEFT),0,6); // hex
1819
				    $data['ident'] = $userserver[0];
1820
				    $data['registration'] = $userserver[0];
1821
				    $data['latitude'] = $line[4];
1822
				    $data['longitude'] = $line[5];
1823
				    $data['altitude'] = $line[6];
1824
				    $data['datetime'] = date('Y-m-d H:i:s');
1825
				    $aircraft_type = $line[10];
1826
				    $aircraft_type = preg_split(':/:',$aircraft_type);
1827
				    $data['aircraft_name'] = substr(end($aircraft_type),0,-4);
1828
				    if (isset($globalSources[$nb]['noarchive']) && $globalSources[$nb]['noarchive'] === TRUE) $data['noarchive'] = true;
1829
				    if (($data['latitude'] === '' && $data['longitude'] === '') || (is_numeric($data['latitude']) && is_numeric($data['longitude']))) $SI->add($data);
1830
				}
1831
			    }
1832
			} elseif ($format === 'beast') {
1833
			    echo 'Beast Binary format not yet supported. Beast AVR format is supported in alpha state'."\n";
1834
			    die;
1835
			} elseif ($format === 'vrstcp') {
1836
			    foreach($buffer as $all_data) {
1837
				$line = json_decode('{'.$all_data.'}',true);
1838
				$data = array();
1839
				if (isset($line['Icao'])) $data['hex'] = $line['Icao']; // hex
1840
				if (isset($line['Call'])) $data['ident'] = $line['Call']; // ident
1841
				if (isset($line['Alt'])) $data['altitude'] = $line['Alt']; // altitude
1842
				if (isset($line['Spd'])) $data['speed'] = $line['Spd']; // speed
1843
				if (isset($line['Trak'])) $data['heading'] = $line['Trak']; // heading
1844
				if (isset($line['Lat'])) $data['latitude'] = $line['Lat']; // lat
1845
				if (isset($line['Long'])) $data['longitude'] = $line['Long']; // long
1846
				//$data['verticalrate'] = $line['']; // verticale rate
1847
				if (isset($line['Sqk'])) $data['squawk'] = $line['Sqk']; // squawk
1848
				$data['emergency'] = ''; // emergency
1849
				if (isset($line['Reg'])) $data['registration'] = $line['Reg'];
1850
				/*
1851
				if (isset($line['PosTime'])) $data['datetime'] = date('Y-m-d H:i:s',$line['PosTime']/1000);
1852
				else $data['datetime'] = date('Y-m-d H:i:s');
1853
				*/
1854
				$data['datetime'] = date('Y-m-d H:i:s');
1855
				if (isset($line['Type'])) $data['aircraft_icao'] = $line['Type'];
1856
		    		$data['format_source'] = 'vrstcp';
1857
				$data['id_source'] = $id_source;
1858
				if (isset($globalSources[$nb]['noarchive']) && $globalSources[$nb]['noarchive'] === TRUE) $data['noarchive'] = true;
1859
				if (isset($value['name']) && $value['name'] != '') $data['source_name'] = $value['name'];
1860
				if (isset($data['latitude']) && isset($data['hex'])) $SI->add($data);
1861
				unset($data);
1862
			    }
1863
			} elseif ($format === 'tsv' || substr($buffer,0,4) === 'clock') {
1864
			    $line = explode("\t", $buffer);
1865
			    for($k = 0; $k < count($line); $k=$k+2) {
1866
				$key = $line[$k];
1867
			        $lined[$key] = $line[$k+1];
1868
			    }
1869
    			    if (count($lined) > 3) {
1870
    				$data['hex'] = $lined['hexid'];
1871
    				//$data['datetime'] = date('Y-m-d H:i:s',strtotime($lined['clock']));;
1872
    				$data['datetime'] = date('Y-m-d H:i:s');;
1873
    				if (isset($lined['ident'])) $data['ident'] = $lined['ident'];
1874
    				if (isset($lined['lat'])) $data['latitude'] = $lined['lat'];
1875
    				if (isset($lined['lon'])) $data['longitude'] = $lined['lon'];
1876
    				if (isset($lined['speed'])) $data['speed'] = $lined['speed'];
1877
    				if (isset($lined['squawk'])) $data['squawk'] = $lined['squawk'];
1878
    				if (isset($lined['alt'])) $data['altitude'] = $lined['alt'];
1879
    				if (isset($lined['heading'])) $data['heading'] = $lined['heading'];
1880
    				$data['id_source'] = $id_source;
1881
    				$data['format_source'] = 'tsv';
1882
    				if (isset($globalSources[$nb]['name']) && $globalSources[$nb]['name'] != '') $data['source_name'] = $globalSources[$nb]['name'];
1883
    				if (isset($globalSources[$nb]['sourcestats'])) $data['sourcestats'] = $globalSources[$nb]['sourcestats'];
1884
				if (isset($globalSources[$nb]['noarchive']) && $globalSources[$nb]['noarchive'] === TRUE) $data['noarchive'] = true;
1885
    				if (($data['latitude'] === '' && $data['longitude'] === '') || (is_numeric($data['latitude']) && is_numeric($data['longitude']))) $SI->add($data);
1886
    				unset($lined);
1887
    				unset($data);
1888
    			    } else $error = true;
1889
			} elseif ($format === 'aprs' && $use_aprs) {
1890
			    if ($aprs_connect === 0) {
1891
				$send = @ socket_send( $r  , $aprs_login , strlen($aprs_login) , 0 );
1892
				$aprs_connect = 1;
1893
			    }
1894
			    
1895
			    if ( $aprs_keep>60 && time() - $aprs_last_tx > $aprs_keep ) {
1896
				$aprs_last_tx = time();
1897
				$data_aprs = "# Keep alive";
1898
				$send = @ socket_send( $r  , $data_aprs , strlen($data_aprs) , 0 );
1899
			    }
1900
			    
1901
			    //echo 'Connect : '.$aprs_connect.' '.$buffer."\n";
1902
			    //echo 'APRS data : '.$buffer."\n";
1903
			    $buffer = str_replace('APRS <- ','',$buffer);
1904
			    $buffer = str_replace('APRS -> ','',$buffer);
1905
			    //echo $buffer."\n";
1906
			    date_default_timezone_set('UTC');
1907
			    if (substr($buffer,0,1) != '#' && substr($buffer,0,1) != '@' && substr($buffer,0,5) != 'APRS ') {
1908
				$line = $APRS->parse($buffer);
1909
				//if (is_array($line) && isset($line['address']) && $line['address'] != '' && isset($line['ident'])) {
1910
				if (is_array($line) && isset($line['latitude']) && isset($line['longitude']) && (isset($line['ident']) || isset($line['address']) || isset($line['mmsi']))) {
1911
				    $aprs_last_tx = time();
1912
				    $data = array();
1913
				    //print_r($line);
1914
				    if (isset($line['address'])) $data['hex'] = $line['address'];
1915
				    if (isset($line['mmsi'])) $data['mmsi'] = $line['mmsi'];
1916
				    if (isset($line['imo'])) $data['imo'] = $line['imo'];
1917
				    if (isset($line['squawk'])) $data['squawk'] = $line['squawk'];
1918
				    if (isset($line['arrival_code'])) $data['arrival_code'] = $line['arrival_code'];
1919
				    if (isset($line['arrival_date'])) $data['arrival_date'] = $line['arrival_date'];
1920
				    if (isset($line['typeid'])) $data['type_id'] = $line['typeid'];
1921
				    if (isset($line['statusid'])) $data['status_id'] = $line['statusid'];
1922
				    if (isset($line['timestamp'])) $data['datetime'] = date('Y-m-d H:i:s',$line['timestamp']);
1923
				    else $data['datetime'] = date('Y-m-d H:i:s');
1924
				    //$data['datetime'] = date('Y-m-d H:i:s');
1925
				    if (isset($line['ident'])) $data['ident'] = $line['ident'];
1926
				    $data['latitude'] = $line['latitude'];
1927
				    $data['longitude'] = $line['longitude'];
1928
				    //$data['verticalrate'] = $line[16];
1929
				    if (isset($line['speed'])) $data['speed'] = $line['speed'];
1930
				    //else $data['speed'] = 0;
1931
				    if (isset($line['altitude'])) $data['altitude'] = $line['altitude'];
1932
				    if (isset($line['comment'])) $data['comment'] = $line['comment'];
1933
				    if (isset($line['symbol'])) $data['type'] = $line['symbol'];
1934
				    //if (isset($line['heading'])) $data['heading'] = $line['heading'];
1935
				    
1936
				    if (isset($line['heading']) && isset($line['format_source'])) $data['heading'] = $line['heading'];
1937
				    //else echo 'No heading...'."\n";
1938
				    //else $data['heading'] = 0;
1939
				    if (isset($line['stealth'])) $data['aircraft_type'] = $line['stealth'];
1940
				    //if (!isset($line['source_type']) && (!isset($globalAPRSarchive) || (isset($globalAPRSarchive) && $globalAPRSarchive === FALSE))) $data['noarchive'] = true;
1941
				    if (isset($globalAPRSarchive) && $globalAPRSarchive === FALSE) $data['noarchive'] = true;
1942
				    elseif (isset($globalAPRSarchive) && $globalAPRSarchive === TRUE) $data['noarchive'] = false;
1943
				    if (isset($globalSources[$nb]['noarchive']) && $globalSources[$nb]['noarchive'] === TRUE) $data['noarchive'] = true;
1944
				    elseif (isset($globalSources[$nb]['noarchive']) && $globalSources[$nb]['noarchive'] === FALSE) $data['noarchive'] = false;
1945
    				    $data['id_source'] = $id_source;
1946
    				    if (isset($line['format_source'])) $data['format_source'] = $line['format_source'];
1947
				    else $data['format_source'] = 'aprs';
1948
				    $data['source_name'] = $line['source'];
1949
				    if (isset($line['source_type'])) $data['source_type'] = $line['source_type'];
1950
				    else $data['source_type'] = 'flarm';
1951
    				    if (isset($globalSources[$nb]['sourcestats'])) $data['sourcestats'] = $globalSources[$nb]['sourcestats'];
1952
				    $currentdate = date('Y-m-d H:i:s');
1953
				    $aprsdate = strtotime($data['datetime']);
1954
				    if ($data['source_type'] != 'modes' && $data['source_type'] != 'ais') $data['altitude_relative'] = 'AMSL';
1955
				    // Accept data if time <= system time + 20s
1956
				    //if (($data['source_type'] === 'modes') || isset($line['stealth']) && ($line['stealth'] === 0 || $line['stealth'] === '') && (strtotime($data['datetime']) <= strtotime($currentdate)+20) && (($data['latitude'] === '' && $data['longitude'] === '') || (is_numeric($data['latitude']) && is_numeric($data['longitude'])))) {
1957
				    if (
1958
					($data['source_type'] === 'modes') || 
1959
					isset($line['stealth']) && 
1960
					(!isset($data['hex']) || $data['hex'] != 'FFFFFF') && 
1961
					 ($line['stealth'] === 0 || $line['stealth'] == '') && 
1962
					 (($data['latitude'] == '' && $data['longitude'] == '') || (is_numeric($data['latitude']) && is_numeric($data['longitude'])))) {
1963
					$send = $SI->add($data);
1964
				    } elseif ($data['source_type'] === 'ais') {
1965
					$data['type'] = '';
1966
					if (isset($globalMarine) && $globalMarine) $send = $MI->add($data);
1967
				    } elseif (isset($line['stealth']) && $line['stealth'] != 0) {
1968
					 echo '-------- '.$data['ident'].' : APRS stealth ON => not adding'."\n";
1969
				    } elseif (isset($globalAircraft) && $globalAircraft && isset($line['symbol']) && isset($line['latitude']) && isset($line['longitude']) && (
1970
					    //$line['symbol'] === 'Balloon' ||
1971
					    $line['symbol'] === 'Glider' || 
1972
					    $line['symbol'] === 'No. Plane' || 
1973
					    $line['symbol'] === 'Aircraft (small)' || $line['symbol'] === 'Helicopter')) {
1974
					    if ($line['symbol'] === 'Ballon') $data['aircraft_icao'] = 'BALL';
1975
					    if ($line['symbol'] === 'Glider') $data['aircraft_icao'] = 'PARAGLIDER';
1976
					    $send = $SI->add($data);
1977
				    } elseif (isset($globalMarine) && $globalMarine && isset($line['symbol']) && isset($line['latitude']) && isset($line['longitude']) && (
1978
					    $line['symbol'] === 'Yacht (Sail)' || 
1979
					    $line['symbol'] === 'Ship (Power Boat)')) {
1980
					    $send = $MI->add($data);
1981
				    } elseif (isset($line['symbol']) && isset($line['latitude']) && isset($line['longitude']) && (
1982
					    $line['symbol'] === 'Car' || 
1983
					    $line['symbol'] === 'Ambulance' || 
1984
					    $line['symbol'] === 'Van' || 
1985
					    $line['symbol'] === 'Truck' || $line['symbol'] === 'Truck (18 Wheeler)' || 
1986
					    $line['symbol'] === 'Motorcycle' || 
1987
					    $line['symbol'] === 'Tractor' || 
1988
					    $line['symbol'] === 'Police' || 
1989
					    $line['symbol'] === 'Bike' || 
1990
					    $line['symbol'] === 'Jogger' || 
1991
					    $line['symbol'] === 'Horse' || 
1992
					    $line['symbol'] === 'Bus' || 
1993
					    $line['symbol'] === 'Jeep' || 
1994
					    $line['symbol'] === 'Recreational Vehicle' || 
1995
					    $line['symbol'] === 'Yacht (Sail)' || 
1996
					    $line['symbol'] === 'Ship (Power Boat)' || 
1997
					    $line['symbol'] === 'Firetruck' || 
1998
					    $line['symbol'] === 'Balloon' || $line['symbol'] === 'Glider' || 
1999
					    $line['symbol'] === 'Aircraft (small)' || $line['symbol'] === 'Helicopter' || 
2000
					    $line['symbol'] === 'SUV' ||
2001
					    $line['symbol'] === 'Snowmobile' ||
2002
					    $line['symbol'] === 'Mobile Satellite Station')) {
2003
				    //} elseif (isset($line['symbol']) && isset($line['latitude']) && isset($line['longitude']) && isset($line['speed']) && $line['symbol'] != 'Weather Station' && $line['symbol'] != 'House QTH (VHF)' && $line['symbol'] != 'Dot' && $line['symbol'] != 'TCP-IP' && $line['symbol'] != 'xAPRS (UNIX)' && $line['symbol'] != 'Antenna' && $line['symbol'] != 'Cloudy' && $line['symbol'] != 'HF Gateway' && $line['symbol'] != 'Yagi At QTH' && $line['symbol'] != 'Digi' && $line['symbol'] != '8' && $line['symbol'] != 'MacAPRS') {
2004
				//    } elseif (isset($line['symbol']) && isset($line['latitude']) && isset($line['longitude']) && $line['symbol'] != 'Weather Station' && $line['symbol'] != 'House QTH (VHF)' && $line['symbol'] != 'Dot' && $line['symbol'] != 'TCP-IP' && $line['symbol'] != 'xAPRS (UNIX)' && $line['symbol'] != 'Antenna' && $line['symbol'] != 'Cloudy' && $line['symbol'] != 'HF Gateway' && $line['symbol'] != 'Yagi At QTH' && $line['symbol'] != 'Digi' && $line['symbol'] != '8' && $line['symbol'] != 'MacAPRS') {
2005
					//echo '!!!!!!!!!!!!!!!! SEND !!!!!!!!!!!!!!!!!!!!'."\n";
2006
					if (isset($globalTracker) && $globalTracker) $send = $TI->add($data);
2007
				    } elseif (!isset($line['stealth']) && is_numeric($data['latitude']) && is_numeric($data['longitude']) && isset($data['ident']) && isset($data['altitude'])) {
2008
					if (!isset($data['altitude'])) $data['altitude'] = 0;
2009
					$Source->deleteOldLocationByType('gs');
2010
					if (count($Source->getLocationInfoByNameType($data['ident'],'gs')) > 0) {
2011
						$Source->updateLocation($data['ident'],$data['latitude'],$data['longitude'],$data['altitude'],'','',$data['source_name'],'antenna.png','gs',$id,0,$data['datetime']);
2012
					} else {
2013
						$Source->addLocation($data['ident'],$data['latitude'],$data['longitude'],$data['altitude'],'','',$data['source_name'],'antenna.png','gs',$id,0,$data['datetime']);
2014
					}
2015
				    } elseif (isset($line['symbol']) && $line['symbol'] === 'Weather Station') {
2016
					//if ($globalDebug) echo '!! Weather Station not yet supported'."\n";
2017
					if ($globalDebug) echo '# Weather Station added'."\n";
2018
					$Source->deleteOldLocationByType('wx');
2019
					$weather_data = json_encode($line);
2020
					if (count($Source->getLocationInfoByNameType($data['ident'],'wx')) > 0) {
2021
						$Source->updateLocation($data['ident'],$data['latitude'],$data['longitude'],0,'','',$data['source_name'],'wx.png','wx',$id,0,$data['datetime'],$weather_data);
2022
					} else {
2023
						$Source->addLocation($data['ident'],$data['latitude'],$data['longitude'],0,'','',$data['source_name'],'wx.png','wx',$id,0,$data['datetime'],$weather_data);
2024
					}
2025
				    } elseif (isset($line['symbol']) && ($line['symbol'] === 'Lightning' || $line['symbol'] === 'Thunderstorm')) {
2026
					//if ($globalDebug) echo '!! Weather Station not yet supported'."\n";
2027
					if ($globalDebug) echo '☈ Lightning added'."\n";
2028
					$Source->deleteOldLocationByType('lightning');
2029
					if (count($Source->getLocationInfoByNameType($data['ident'],'lightning')) > 0) {
2030
						$Source->updateLocation($data['ident'],$data['latitude'],$data['longitude'],0,'','',$data['source_name'],'weather/thunderstorm.png','lightning',$id,0,$data['datetime'],$data['comment']);
2031
					} else {
2032
						$Source->addLocation($data['ident'],$data['latitude'],$data['longitude'],0,'','',$data['source_name'],'weather/thunderstorm.png','lightning',$id,0,$data['datetime'],$data['comment']);
2033
					}
2034
				    } elseif ($globalDebug) {
2035
				    	echo '/!\ Not added: '.$buffer."\n";
2036
				    	print_r($line);
2037
				    }
2038
				    unset($data);
2039
				}
2040
				elseif (is_array($line) && isset($line['ident']) && $line['ident'] != '') {
2041
					$Source->updateLocationDescByName($line['ident'],$line['source'],$id,$line['comment']);
2042
				}
2043
				/*
2044
				elseif (is_array($line) && $globalDebug && isset($line['symbol']) && isset($line['latitude']) && isset($line['longitude']) && ($line['symbol'] === 'Car' || $line['symbol'] === 'Ambulance' || $line['symbol'] === 'Van' || $line['symbol'] === 'Truck' || $line['symbol'] === 'Truck (18 Wheeler)' || $line['symbol'] === 'Motorcycle')) {
2045
					echo '!! Car & Trucks not yet supported'."\n";
2046
				}
2047
				*/
2048
				//elseif ($line === false && $globalDebug) echo 'Ignored ('.$buffer.")\n";
2049
				elseif ($line === true && $globalDebug) echo '!! Failed : '.$buffer."!!\n";
2050
				if (isset($Source) && isset($globalSources[$nb]['last_weather_clean']) && time()-$globalSources[$nb]['last_weather_clean'] > 60*5) {
2051
					$Source->deleteOldLocationByType('lightning');
2052
					$Source->deleteOldLocationByType('wx');
2053
					$globalSources[$nb]['last_weather_clean'] = time();
2054
				} elseif (!isset($globalSources[$nb]['last_weather_clean'])) {
2055
					$globalSources[$nb]['last_weather_clean'] = time();
2056
				}
2057
			    }
2058
			} else {
2059
			    $line = explode(',', $buffer);
2060
			    //print_r($line);
2061
    			    if (count($line) > 20) {
2062
    			    	$data['hex'] = $line[4];
2063
    				/*
2064
    				$data['datetime'] = $line[6].' '.$line[7];
2065
    					date_default_timezone_set($globalTimezone);
2066
    					$datetime = new DateTime($data['datetime']);
2067
    					$datetime->setTimezone(new DateTimeZone('UTC'));
2068
    					$data['datetime'] = $datetime->format('Y-m-d H:i:s');
2069
    					date_default_timezone_set('UTC');
2070
    				*/
2071
    				// Force datetime to current UTC datetime
2072
    				date_default_timezone_set('UTC');
2073
    				$data['datetime'] = date('Y-m-d H:i:s');
2074
    				$data['ident'] = trim($line[10]);
2075
    				$data['latitude'] = $line[14];
2076
    				$data['longitude'] = $line[15];
2077
    				$data['verticalrate'] = $line[16];
2078
    				$data['emergency'] = $line[20];
2079
    				$data['speed'] = $line[12];
2080
    				$data['squawk'] = $line[17];
2081
    				$data['altitude'] = $line[11];
2082
    				$data['heading'] = $line[13];
2083
    				$data['ground'] = $line[21];
2084
    				$data['emergency'] = $line[19];
2085
    				$data['format_source'] = 'sbs';
2086
				if (isset($globalSources[$nb]['name']) && $globalSources[$nb]['name'] != '') $data['source_name'] = $globalSources[$nb]['name'];
2087
				elseif ($line[0] == 'MLAT') $data['source_name'] = 'MLAT';
2088
				if (isset($globalSources[$nb]['sourcestats'])) $data['sourcestats'] = $globalSources[$nb]['sourcestats'];
2089
				if (isset($globalSources[$nb]['noarchive']) && $globalSources[$nb]['noarchive'] === TRUE) $data['noarchive'] = true;
2090
    				$data['id_source'] = $id_source;
2091
    				if (($data['latitude'] === '' && $data['longitude'] === '') || (is_numeric($data['latitude']) && is_numeric($data['longitude']))) $send = $SI->add($data);
2092
    				else $error = true;
2093
    				unset($data);
2094
    			    } else $error = true;
2095
			    if ($error) {
2096
				if (count($line) > 1 && ($line[0] === 'STA' || $line[0] === 'AIR' || $line[0] === 'SEL' || $line[0] === 'ID' || $line[0] === 'CLK')) { 
2097
					if ($globalDebug) echo "Not a message. Ignoring... \n";
2098
				} else {
2099
					if ($globalDebug) echo "Wrong line format. Ignoring... \n";
2100
					if ($globalDebug) {
2101
						echo $buffer;
2102
						//print_r($line);
2103
					}
2104
					//socket_close($r);
2105
					if ($globalDebug) echo "Reconnect after an error...\n";
2106
					if ($format === 'aprs') $aprs_connect = 0;
2107
					$sourceer[$nb] = $globalSources[$nb];
2108
					connect_all($sourceer);
2109
					$sourceer = array();
2110
				}
2111
			    }
2112
			}
2113
			// Sleep for xxx microseconds
2114
			if (isset($globalSBSSleep)) usleep($globalSBSSleep);
2115
		    } else {
2116
			if ($format === 'flightgearmp') {
2117
			    	if ($globalDebug) echo "Reconnect FlightGear MP...";
2118
				//@socket_close($r);
2119
				sleep($globalMinFetch);
2120
				$sourcefg[$nb] = $globalSources[$nb];
2121
				connect_all($sourcefg);
2122
				$sourcefg = array();
2123
				break;
2124
				
2125
			} elseif ($format != 'acars' && $format != 'flightgearsp') {
2126
			    if (isset($tt[$format])) $tt[$format]++;
2127
			    else $tt[$format] = 0;
2128
			    if ($tt[$format] > 30 || $buffer === FALSE) {
2129
				if ($globalDebug) echo "ERROR : Reconnect ".$format."...";
2130
				//@socket_close($r);
2131
				sleep(2);
2132
				$aprs_connect = 0;
2133
				$sourceee[$nb] = $globalSources[$nb];
2134
				connect_all($sourceee);
2135
				$sourceee = array();
2136
				//connect_all($globalSources);
2137
				$tt[$format]=0;
2138
				break;
2139
			    } 
2140
			    //else if ($globalDebug) echo "Trying again (".$tt[$format]."x) ".$format."...";
2141
			}
2142
		    }
2143
		}
2144
	    } else {
2145
		$error = socket_strerror(socket_last_error());
2146
		if (($error != SOCKET_EINPROGRESS && $error != SOCKET_EALREADY && $error != 'Success') || (time() - $time >= $timeout && $error != 'Success')) {
2147
			if ($globalDebug) echo "ERROR : socket_select give this error ".$error . "\n";
2148
			if (isset($globalDebug)) echo "Restarting...\n";
2149
			// Restart the script if possible
2150
			if (is_array($sockets)) {
2151
			    if ($globalDebug) echo "Shutdown all sockets...";
2152
			    
2153
			    foreach ($sockets as $sock) {
2154
				@socket_shutdown($sock,2);
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
2155
				@socket_close($sock);
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
2156
			    }
2157
			    
2158
			}
2159
			if ($globalDebug) echo "Waiting...";
2160
			sleep(2);
2161
			$time = time();
2162
			//connect_all($hosts);
2163
			$aprs_connect = 0;
2164
			if ($reset%5 === 0) sleep(20);
2165
			if ($reset > 100) exit('Too many attempts...');
2166
			if ($globalDebug) echo "Restart all connections...";
2167
			connect_all($globalSources);
2168
		}
2169
	    }
2170
	}
2171
	if ($globalDaemon === false) {
2172
	    if ($globalDebug) echo 'Check all...'."\n";
2173
	    if (isset($SI)) $SI->checkAll();
2174
	    if (isset($TI)) $TI->checkAll();
2175
	    if (isset($MI)) $MI->checkAll();
2176
	}
2177
    }
2178
}
2179
2180
?>
2181