Compare commits
10 Commits
v2.0.0
...
3c020d25ed
| Author | SHA1 | Date | |
|---|---|---|---|
| 3c020d25ed | |||
| ed6186f63b | |||
| aefbcabac0 | |||
| 7b5ad0ffc6 | |||
| c5e8b7f178 | |||
| c4870763a9 | |||
| 6591e7eaa8 | |||
| 58d405396e | |||
| f7523ae5e2 | |||
| 024a43e20b |
10
CHANGELOG.md
10
CHANGELOG.md
@@ -1,5 +1,15 @@
|
|||||||
### Changelog
|
### Changelog
|
||||||
|
|
||||||
|
#### [v2.1.1](https://git.w33ble.com/w33ble/adsb-index/compare/v2.1.0...v2.1.1) (6 November 2018)
|
||||||
|
- fix: saner defaults [`c5e8b7f`](https://git.w33ble.com/w33ble/adsb-index/commit/c5e8b7f178a8bbc76b72eea08afc4d578baababb)
|
||||||
|
|
||||||
|
#### [v2.1.0](https://git.w33ble.com/w33ble/adsb-index/compare/v2.0.1...v2.1.0) (2 November 2018)
|
||||||
|
- feat: add raw version of text fields [`6591e7e`](https://git.w33ble.com/w33ble/adsb-index/commit/6591e7eaa8c9c317a55632f856310cdd3f783464)
|
||||||
|
|
||||||
|
#### [v2.0.1](https://git.w33ble.com/w33ble/adsb-index/compare/v2.0.0...v2.0.1) (2 November 2018)
|
||||||
|
- fix: format undefined fields [`024a43e`](https://git.w33ble.com/w33ble/adsb-index/commit/024a43e20b7ebcf79ef5625df2021a41fa9b2ce9)
|
||||||
|
- fix: exit on errors [`f7523ae`](https://git.w33ble.com/w33ble/adsb-index/commit/f7523ae5e20414dfec597050051566adbba9a310)
|
||||||
|
|
||||||
### [v2.0.0](https://git.w33ble.com/w33ble/adsb-index/compare/v1.0.1...v2.0.0) (2 November 2018)
|
### [v2.0.0](https://git.w33ble.com/w33ble/adsb-index/compare/v1.0.1...v2.0.0) (2 November 2018)
|
||||||
- feat: add ads-b exchange source [`9f0da54`](https://git.w33ble.com/w33ble/adsb-index/commit/9f0da54ccfc639ec6367ea85ec39bea117fd3108)
|
- feat: add ads-b exchange source [`9f0da54`](https://git.w33ble.com/w33ble/adsb-index/commit/9f0da54ccfc639ec6367ea85ec39bea117fd3108)
|
||||||
- feat: use ads-b exchange data [`89261d0`](https://git.w33ble.com/w33ble/adsb-index/commit/89261d0010315ad248dcfdcf25916d952de648d8)
|
- feat: use ads-b exchange data [`89261d0`](https://git.w33ble.com/w33ble/adsb-index/commit/89261d0010315ad248dcfdcf25916d952de648d8)
|
||||||
|
|||||||
@@ -13,4 +13,8 @@ WORKDIR /app
|
|||||||
VOLUME /app/data
|
VOLUME /app/data
|
||||||
COPY --from=0 /build .
|
COPY --from=0 /build .
|
||||||
COPY . .
|
COPY . .
|
||||||
ENTRYPOINT ["yarn", "start"]
|
|
||||||
|
ENV ELASTICSEARCH_HOST="host.docker.internal"
|
||||||
|
ENV ELASTICSEARCH_PORT="9200"
|
||||||
|
|
||||||
|
ENTRYPOINT ["node", "bin/index", "-t", "5"]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# adsb-index
|
# fake-adsb-index
|
||||||
|
|
||||||
ADS-B indexing script.
|
FAKE ADS-B indexing script.
|
||||||
|
|
||||||
[](https://raw.githubusercontent.com/w33ble/adsb-index/master/LICENSE)
|
[](https://raw.githubusercontent.com/w33ble/adsb-index/master/LICENSE)
|
||||||
[](https://www.npmjs.com/package/adsb-index)
|
[](https://www.npmjs.com/package/adsb-index)
|
||||||
|
|||||||
23
bin/index.js
23
bin/index.js
@@ -5,23 +5,26 @@ const runInterval = require('interval-promise');
|
|||||||
const mod = require('../src/index.mjs').default;
|
const mod = require('../src/index.mjs').default;
|
||||||
const logger = require('../src/lib/logger.mjs').default;
|
const logger = require('../src/lib/logger.mjs').default;
|
||||||
|
|
||||||
const { index, interval, lat, lon, radius, ...elasticsearch } = getopts(process.argv.slice(2), {
|
const esHost = process.env.ELASTICSEARCH_HOST || 'localhost';
|
||||||
|
const esPort = process.env.ELASTICSEARCH_PORT || '9200';
|
||||||
|
const auth = process.env.ELASTICSEARCH_AUTH || '';
|
||||||
|
|
||||||
|
const { index, interval, lat, lon, radius, ...esConfig } = getopts(process.argv.slice(2), {
|
||||||
string: ['host', 'auth', 'log', 'index'],
|
string: ['host', 'auth', 'log', 'index'],
|
||||||
alias: {
|
alias: {
|
||||||
h: 'host',
|
h: 'host',
|
||||||
u: 'auth',
|
|
||||||
l: 'log',
|
l: 'log',
|
||||||
i: 'index',
|
i: 'index',
|
||||||
t: 'interval',
|
t: 'interval',
|
||||||
},
|
},
|
||||||
default: {
|
default: {
|
||||||
host: 'localhost:9200',
|
host: `${esHost}:${esPort}`,
|
||||||
log: 'error',
|
log: 'error',
|
||||||
index: 'adsb-data',
|
index: 'adsb-data',
|
||||||
interval: 0,
|
interval: 0,
|
||||||
lat: 33.433638,
|
lat: 33.433638,
|
||||||
lon: -112.008113,
|
lon: -112.008113,
|
||||||
radius: 1000,
|
radius: 200,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -32,17 +35,25 @@ function handleError(err) {
|
|||||||
|
|
||||||
async function fetchAndIndex() {
|
async function fetchAndIndex() {
|
||||||
logger.debug('Fetching and indexing data...');
|
logger.debug('Fetching and indexing data...');
|
||||||
return mod(index, { elasticsearch, filter: { lat, lon, radius } });
|
return mod(index, { elasticsearch: { ...esConfig, auth }, filter: { lat, lon, radius } });
|
||||||
}
|
}
|
||||||
|
|
||||||
async function run() {
|
async function run() {
|
||||||
// initial kickoff
|
// initial kickoff
|
||||||
await fetchAndIndex().catch(handleError);
|
await fetchAndIndex().catch(handleError);
|
||||||
|
|
||||||
|
// listen for termination
|
||||||
|
const terminate = () => {
|
||||||
|
console.log('Terminating...');
|
||||||
|
process.exit(0);
|
||||||
|
};
|
||||||
|
process.on('SIGINT', terminate);
|
||||||
|
process.on('SIGTERM', terminate);
|
||||||
|
|
||||||
// scheduled running
|
// scheduled running
|
||||||
if (interval === 0) return;
|
if (interval === 0) return;
|
||||||
logger.debug(`Starting interval (${interval}s)...`);
|
logger.debug(`Starting interval (${interval}s)...`);
|
||||||
runInterval(fetchAndIndex, interval * 1000);
|
runInterval(() => fetchAndIndex().catch(handleError), interval * 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
run().catch(handleError);
|
run().catch(handleError);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "adsb-index",
|
"name": "adsb-index",
|
||||||
"version": "2.0.0",
|
"version": "2.1.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "ADS-B indexing script",
|
"description": "ADS-B indexing script",
|
||||||
"bin": "bin/index.js",
|
"bin": "bin/index.js",
|
||||||
|
|||||||
@@ -26,8 +26,8 @@ export async function createIndex(client, index) {
|
|||||||
mappings: {
|
mappings: {
|
||||||
[doctype]: {
|
[doctype]: {
|
||||||
properties: {
|
properties: {
|
||||||
operator: { type: 'keyword' },
|
operator: { type: 'text', fields: { raw: { type: 'keyword' } } },
|
||||||
aircraft: { type: 'text' },
|
aircraft: { type: 'text', fields: { raw: { type: 'keyword' } } },
|
||||||
aircraft_manufacturer: { type: 'keyword' },
|
aircraft_manufacturer: { type: 'keyword' },
|
||||||
transponder: { type: 'keyword' },
|
transponder: { type: 'keyword' },
|
||||||
callsign: { type: 'keyword' },
|
callsign: { type: 'keyword' },
|
||||||
@@ -45,8 +45,8 @@ export async function createIndex(client, index) {
|
|||||||
squawk: { type: 'keyword' },
|
squawk: { type: 'keyword' },
|
||||||
spi: { type: 'boolean' },
|
spi: { type: 'boolean' },
|
||||||
position_source: { type: 'keyword' },
|
position_source: { type: 'keyword' },
|
||||||
from: { type: 'text' },
|
from: { type: 'text', fields: { raw: { type: 'keyword' } } },
|
||||||
to: { type: 'text' },
|
to: { type: 'text', fields: { raw: { type: 'keyword' } } },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
|
|
||||||
export default axios.create({
|
export default axios.create({
|
||||||
timeout: 5000,
|
timeout: 3000,
|
||||||
responseType: 'json',
|
responseType: 'json',
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json; charset=utf-8',
|
'Content-Type': 'application/json; charset=utf-8',
|
||||||
|
|||||||
@@ -1,57 +1,206 @@
|
|||||||
import fetch from './fetch.mjs';
|
/* eslint import/prefer-default-export: 0 */
|
||||||
|
|
||||||
export async function getOpenskyData() {
|
const aircrafts = [
|
||||||
const positionSourceMap = ['ADS-B', 'ASTERIX', 'MLAT'];
|
{
|
||||||
const res = await fetch.get(`https://opensky-network.org/api/states/all`);
|
transponder: 'abe09a',
|
||||||
return res.data.states.map(rec => ({
|
callsign: 'SWA146',
|
||||||
transponder: `${rec[0]}`.toLowerCase(),
|
origin_country: 'United States',
|
||||||
callsign: `${rec[1]}`.trim(),
|
time_position: '2019-01-28T20:49:35.234Z',
|
||||||
origin_country: rec[2],
|
last_contact: '2019-01-28T20:49:35.234Z',
|
||||||
time_position: new Date(rec[3] * 1000),
|
location: '33.440986,-112.079717',
|
||||||
last_contact: new Date(rec[4] * 1000),
|
lat: 33.440986,
|
||||||
location: rec[5] && rec[6] ? `${rec[6]},${rec[5]}` : null,
|
lon: -112.079717,
|
||||||
lat: rec[6],
|
baro_altitude: 1950,
|
||||||
lon: rec[5],
|
geo_altitude: 2000,
|
||||||
baro_altitude: rec[7],
|
on_ground: false,
|
||||||
geo_altitude: rec[13],
|
velocity: 162.1,
|
||||||
on_ground: rec[8],
|
vertical_rate: -832,
|
||||||
velocity: rec[9],
|
squawk: '1523',
|
||||||
vertical_rate: rec[11],
|
|
||||||
squawk: rec[14],
|
|
||||||
spi: rec[15],
|
|
||||||
position_source: positionSourceMap[rec[16]],
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function getAdbsExchangeData({ lat, lon, radius }) {
|
|
||||||
const positionSourceMap = ['Unknown', 'Mode-S', 'ADS-B', 'ADS-B', 'ADS-B', 'ADS-B'];
|
|
||||||
const formatNumber = str => str && Number(`${str}`.replace(/[^0-9.-]/, ''));
|
|
||||||
|
|
||||||
const res = await fetch.get(
|
|
||||||
`http://public-api.adsbexchange.com/VirtualRadar/AircraftList.json?lat=${lat}&lng=${lon}&fDstL=0&fDstU=${radius}`
|
|
||||||
);
|
|
||||||
|
|
||||||
return res.data.acList.map(rec => ({
|
|
||||||
transponder: `${rec.Icao}`.toLowerCase(),
|
|
||||||
callsign: `${rec.Call}`.trim(),
|
|
||||||
origin_country: rec.Cou,
|
|
||||||
time_position: new Date(rec.PosTime),
|
|
||||||
last_contact: new Date(rec.PosTime),
|
|
||||||
location: rec.Lat && rec.Long ? `${rec.Lat},${rec.Long}` : null,
|
|
||||||
lat: rec.Lat,
|
|
||||||
lon: rec.Long,
|
|
||||||
baro_altitude: formatNumber(rec.Alt),
|
|
||||||
geo_altitude: formatNumber(rec.GAlt),
|
|
||||||
on_ground: rec.Gnd,
|
|
||||||
velocity: formatNumber(rec.Spd),
|
|
||||||
vertical_rate: formatNumber(rec.Vsi),
|
|
||||||
squawk: rec.Sqk,
|
|
||||||
spi: false,
|
spi: false,
|
||||||
position_source: positionSourceMap[rec.Trt],
|
position_source: 'ADS-B',
|
||||||
operator: rec.Op,
|
operator: 'Southwest Airlines',
|
||||||
aircraft: rec.Mdl,
|
aircraft: '2014 BOEING 737-8H4',
|
||||||
aircraft_manufacturer: rec.Man,
|
aircraft_manufacturer: 'Boeing',
|
||||||
from: rec.From,
|
from: 'KHOU William P Hobby, Houston, United States',
|
||||||
to: rec.To,
|
to: 'KONT Ontario, United States',
|
||||||
}));
|
},
|
||||||
|
{
|
||||||
|
transponder: 'acc1ee',
|
||||||
|
callsign: 'AAL2450',
|
||||||
|
origin_country: 'United States',
|
||||||
|
time_position: '2019-01-28T20:49:07.341Z',
|
||||||
|
last_contact: '2019-01-28T20:49:07.341Z',
|
||||||
|
location: '33.431071,-112.004887',
|
||||||
|
lat: 33.431071,
|
||||||
|
lon: -112.004887,
|
||||||
|
baro_altitude: 1150,
|
||||||
|
geo_altitude: 1200,
|
||||||
|
on_ground: false,
|
||||||
|
velocity: 125,
|
||||||
|
vertical_rate: 64,
|
||||||
|
squawk: '',
|
||||||
|
spi: false,
|
||||||
|
position_source: 'ADS-B',
|
||||||
|
operator: 'AMERICAN AIRLINES INC - FORT WORTH, TX',
|
||||||
|
aircraft: '1999 BOEING 737-823',
|
||||||
|
aircraft_manufacturer: 'Boeing',
|
||||||
|
from: 'KLAX Los Angeles, United States',
|
||||||
|
to: 'KDFW Dallas Fort Worth, Dallas-Fort Worth, United States',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
transponder: 'a742c2',
|
||||||
|
callsign: 'AAL2197',
|
||||||
|
origin_country: 'United States',
|
||||||
|
time_position: '2019-01-28T20:46:30.215Z',
|
||||||
|
last_contact: '2019-01-28T20:46:30.215Z',
|
||||||
|
location: '33.431053,-112.020776',
|
||||||
|
lat: 33.431053,
|
||||||
|
lon: -112.020776,
|
||||||
|
baro_altitude: 1475,
|
||||||
|
geo_altitude: 1525,
|
||||||
|
on_ground: false,
|
||||||
|
velocity: 183,
|
||||||
|
vertical_rate: 3264,
|
||||||
|
squawk: '2656',
|
||||||
|
spi: false,
|
||||||
|
position_source: 'ADS-B',
|
||||||
|
operator: 'American Airlines',
|
||||||
|
aircraft: '2013 AIRBUS A321-231',
|
||||||
|
aircraft_manufacturer: 'Airbus',
|
||||||
|
from: 'KMCO Orlando, United States',
|
||||||
|
to: 'KDFW Dallas Fort Worth, Dallas-Fort Worth, United States',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
transponder: 'a23c2e',
|
||||||
|
callsign: 'ASH5742',
|
||||||
|
origin_country: 'United States',
|
||||||
|
time_position: '2019-01-28T20:40:09.162Z',
|
||||||
|
last_contact: '2019-01-28T20:40:09.162Z',
|
||||||
|
location: '33.440826,-112.020557',
|
||||||
|
lat: 33.440826,
|
||||||
|
lon: -112.020557,
|
||||||
|
baro_altitude: 1100,
|
||||||
|
geo_altitude: 1088,
|
||||||
|
on_ground: false,
|
||||||
|
velocity: 138,
|
||||||
|
vertical_rate: -320,
|
||||||
|
squawk: '2444',
|
||||||
|
spi: false,
|
||||||
|
position_source: 'ADS-B',
|
||||||
|
operator: 'BANK OF UTAH TRUSTEE - SALT LAKE CITY, UT',
|
||||||
|
aircraft: '2006 BOMBARDIER INC CL-600-2D24',
|
||||||
|
aircraft_manufacturer: 'Bombardier',
|
||||||
|
from: 'N/A',
|
||||||
|
to: 'N/A',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
transponder: 'a91e6e',
|
||||||
|
callsign: 'N/A',
|
||||||
|
origin_country: 'United States',
|
||||||
|
time_position: '2019-01-28T19:02:32.530Z',
|
||||||
|
last_contact: '2019-01-28T19:02:32.530Z',
|
||||||
|
location: '33.435703,-112.003822',
|
||||||
|
lat: 33.435703,
|
||||||
|
lon: -112.003822,
|
||||||
|
baro_altitude: 1350,
|
||||||
|
geo_altitude: 1530,
|
||||||
|
on_ground: false,
|
||||||
|
velocity: 130,
|
||||||
|
vertical_rate: -384,
|
||||||
|
squawk: '1363',
|
||||||
|
spi: false,
|
||||||
|
position_source: 'ADS-B',
|
||||||
|
operator: 'Spirit Airlines',
|
||||||
|
aircraft: 'Airbus A321 231SL',
|
||||||
|
aircraft_manufacturer: 'Airbus',
|
||||||
|
from: 'N/A',
|
||||||
|
to: 'N/A',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
transponder: 'a8a7f1',
|
||||||
|
callsign: 'NKS1167',
|
||||||
|
origin_country: 'United States',
|
||||||
|
time_position: '2019-01-28T00:20:20.803Z',
|
||||||
|
last_contact: '2019-01-28T00:20:20.803Z',
|
||||||
|
location: '33.440826,-111.981006',
|
||||||
|
lat: 33.440826,
|
||||||
|
lon: -111.981006,
|
||||||
|
baro_altitude: 1200,
|
||||||
|
geo_altitude: 1259,
|
||||||
|
on_ground: false,
|
||||||
|
velocity: 143,
|
||||||
|
vertical_rate: -768,
|
||||||
|
squawk: '6513',
|
||||||
|
spi: false,
|
||||||
|
position_source: 'ADS-B',
|
||||||
|
operator: 'Spirit Airlines',
|
||||||
|
aircraft: '2015 AIRBUS A321-231',
|
||||||
|
aircraft_manufacturer: 'Airbus',
|
||||||
|
from: 'N/A',
|
||||||
|
to: 'N/A',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
transponder: 'aa56db',
|
||||||
|
callsign: 'UAL1139',
|
||||||
|
origin_country: 'United States',
|
||||||
|
time_position: '2019-01-28T21:04:05.916Z',
|
||||||
|
last_contact: '2019-01-28T21:04:05.916Z',
|
||||||
|
location: '33.429953,-112.004802',
|
||||||
|
lat: 33.429953,
|
||||||
|
lon: -112.004802,
|
||||||
|
baro_altitude: 1100,
|
||||||
|
geo_altitude: 1251,
|
||||||
|
on_ground: false,
|
||||||
|
velocity: 156,
|
||||||
|
vertical_rate: -960,
|
||||||
|
squawk: '3352',
|
||||||
|
spi: false,
|
||||||
|
position_source: 'ADS-B',
|
||||||
|
operator: 'United Airlines',
|
||||||
|
aircraft: '2010 BOEING 737-824',
|
||||||
|
aircraft_manufacturer: 'Boeing',
|
||||||
|
from: 'KIAD Washington Dulles, United States',
|
||||||
|
to: 'MWCR Owen Roberts, Georgetown, Cayman Islands',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
transponder: 'abb601',
|
||||||
|
callsign: 'SWA1386',
|
||||||
|
origin_country: 'United States',
|
||||||
|
time_position: '2019-01-28T21:02:07.189Z',
|
||||||
|
last_contact: '2019-01-28T21:02:07.189Z',
|
||||||
|
location: '33.432129,-111.9989',
|
||||||
|
lat: 33.432129,
|
||||||
|
lon: -111.9989,
|
||||||
|
baro_altitude: 1875,
|
||||||
|
geo_altitude: 1925,
|
||||||
|
on_ground: false,
|
||||||
|
velocity: 23,
|
||||||
|
vertical_rate: -832,
|
||||||
|
squawk: '7427',
|
||||||
|
spi: false,
|
||||||
|
position_source: 'ADS-B',
|
||||||
|
operator: 'Southwest Airlines',
|
||||||
|
aircraft: 'Boeing 737NG 800/W',
|
||||||
|
aircraft_manufacturer: 'Boeing',
|
||||||
|
from: 'KFLL Fort Lauderdale Hollywood, United States',
|
||||||
|
to: 'KPIT Pittsburgh, United States',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export async function getAdbsExchangeData() {
|
||||||
|
const count = Math.ceil(Math.random() * 3);
|
||||||
|
const now = new Date();
|
||||||
|
|
||||||
|
const records = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < count; i += 1) {
|
||||||
|
const idx = Math.floor(Math.random() * (aircrafts.length - 1));
|
||||||
|
records.push({
|
||||||
|
...aircrafts[idx],
|
||||||
|
time_position: now.toISOString(),
|
||||||
|
last_contact: now.toISOString(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return records;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user