From ad3ff720efad02a122a84b9d44ffa94987827b30 Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Wed, 10 Jun 2020 15:36:54 -0500 Subject: [PATCH 01/12] Use wire service logs --- packages/console-app/config.yml | 17 +++-- .../src/containers/panels/wns/WNSLog.js | 3 +- packages/console-app/src/gql/wns_log.graphql | 4 +- packages/console-server/config.yml | 19 +++--- packages/console-server/src/gql/api.graphql | 25 ++----- .../console-server/src/gql/system.graphql | 8 --- .../console-server/src/resolvers/index.js | 13 +--- packages/console-server/src/resolvers/log.js | 65 +++++++++++++++++++ packages/console-server/src/server/main.js | 6 +- 9 files changed, 95 insertions(+), 65 deletions(-) delete mode 100644 packages/console-server/src/gql/system.graphql create mode 100644 packages/console-server/src/resolvers/log.js diff --git a/packages/console-app/config.yml b/packages/console-app/config.yml index 150b1c4..85be7a6 100644 --- a/packages/console-app/config.yml +++ b/packages/console-app/config.yml @@ -22,20 +22,19 @@ system: services: app: prefix: '/app' - server: 'http://127.0.0.1:5999' + server: 'https://xbox.local' wns: - server: 'http://127.0.0.1:9473/api' - webui: 'http://127.0.0.1:9473/webui' + server: 'https://xbox.local/dxos/wns/api' + webui: 'https://xbox.local/dxos/wns/webui' signal: - server: 'http://127.0.0.1:4000' - api: 'http://127.0.0.1:4000' + server: 'wss://xbox.local/dxos/signal' + api: 'https://xbox.local/dxos/signal/' ipfs: - server: '/ip4/127.0.0.1/tcp/5001' - gateway: '/ip4//127.0.0.1:8888/ipfs/' - webui: 'http://127.0.0.1:5001/webui' + server: 'https://xbox.local/dxos/ipfs/api' + gateway: 'https://xbox.local/dxos/ipfs/gateway' wellknown: - endpoint: 'http://127.0.0.1:9000/.well-known/dxos' + endpoint: 'https://xbox.local/.well-known/dxos' diff --git a/packages/console-app/src/containers/panels/wns/WNSLog.js b/packages/console-app/src/containers/panels/wns/WNSLog.js index d0f40bb..9fcb485 100644 --- a/packages/console-app/src/containers/panels/wns/WNSLog.js +++ b/packages/console-app/src/containers/panels/wns/WNSLog.js @@ -14,12 +14,13 @@ import Log from '../../../components/Log'; const WNSLog = () => { const { config } = useContext(ConsoleContext); const data = useQueryStatusReducer(useQuery(WNS_LOG, { pollInterval: config.api.intervalLog })); + console.error(data); if (!data) { return null; } return ( - + ); }; diff --git a/packages/console-app/src/gql/wns_log.graphql b/packages/console-app/src/gql/wns_log.graphql index ab5f741..4c80fdc 100644 --- a/packages/console-app/src/gql/wns_log.graphql +++ b/packages/console-app/src/gql/wns_log.graphql @@ -3,8 +3,8 @@ # query { - wns_log @client { + wns_log { timestamp - log + json } } diff --git a/packages/console-server/config.yml b/packages/console-server/config.yml index ac97bae..85be7a6 100644 --- a/packages/console-server/config.yml +++ b/packages/console-server/config.yml @@ -3,8 +3,6 @@ # NOTE: Set CONFIG_FILE to swap out this config file. # -# TODO(burdon): Set defaults. - app: title: 'Console' org': 'DxOS' @@ -24,20 +22,19 @@ system: services: app: prefix: '/app' - server: 'http://127.0.0.1:5999' + server: 'https://xbox.local' wns: - server: 'https://node1.dxos.network/wns/api' - webui: 'https://node1.dxos.network/wns/webui' + server: 'https://xbox.local/dxos/wns/api' + webui: 'https://xbox.local/dxos/wns/webui' signal: - server: 'http://127.0.0.1:4000' - api: 'http://127.0.0.1:4000' + server: 'wss://xbox.local/dxos/signal' + api: 'https://xbox.local/dxos/signal/' ipfs: - server: '/ip4/127.0.0.1/tcp/5001' - gateway: '/ip4//127.0.0.1:8888/ipfs/' - webui: 'http://127.0.0.1:5001/webui' + server: 'https://xbox.local/dxos/ipfs/api' + gateway: 'https://xbox.local/dxos/ipfs/gateway' wellknown: - endpoint: 'http://127.0.0.1:9000/.well-known/dxos' + endpoint: 'https://xbox.local/.well-known/dxos' diff --git a/packages/console-server/src/gql/api.graphql b/packages/console-server/src/gql/api.graphql index 62780ad..542a323 100644 --- a/packages/console-server/src/gql/api.graphql +++ b/packages/console-server/src/gql/api.graphql @@ -8,33 +8,22 @@ type JSONResult { json: String! } -type Result { - timestamp: String! - code: Int! -} - -type Log { - timestamp: String! - log: [String]! -} - # # Schema # -type Mutation { - action(command: String!): Result! -} - type Query { - system_status: SystemStatus! + app_swarm_log: JSONResult! + ipfs_log: JSONResult! ipfs_status: JSONResult! + ipfs_swarm_log: JSONResult! + signal_status: JSONResult! + signal_swarm_log: JSONResult! + system_status: JSONResult! wns_status: JSONResult! - wns_records(type: String): JSONResult! - wns_log: Log! + wns_log: JSONResult! } schema { - mutation: Mutation query: Query } diff --git a/packages/console-server/src/gql/system.graphql b/packages/console-server/src/gql/system.graphql deleted file mode 100644 index 937ce42..0000000 --- a/packages/console-server/src/gql/system.graphql +++ /dev/null @@ -1,8 +0,0 @@ -# -# Copyright 2020 DxOS.org -# - -type SystemStatus { - timestamp: String! - json: String! -} diff --git a/packages/console-server/src/resolvers/index.js b/packages/console-server/src/resolvers/index.js index d0fcd65..32288dd 100644 --- a/packages/console-server/src/resolvers/index.js +++ b/packages/console-server/src/resolvers/index.js @@ -7,6 +7,7 @@ import defaultsDeep from 'lodash.defaultsdeep'; import { ipfsResolvers } from './ipfs'; import { systemResolvers } from './system'; +import { logResolvers } from "./log"; const log = debug('dxos:console:server:resolvers'); @@ -19,14 +20,4 @@ export const resolvers = defaultsDeep({ // TODO(burdon): Auth. // https://www.apollographql.com/docs/apollo-server/data/errors/#codes - Mutation: { - action: async (_, { command }) => { - log(`WNS action: ${command}`); - - return { - timestamp: new Date().toUTCString(), - code: 0 - }; - } - } -}, ipfsResolvers, systemResolvers); +}, ipfsResolvers, systemResolvers, logResolvers); diff --git a/packages/console-server/src/resolvers/log.js b/packages/console-server/src/resolvers/log.js new file mode 100644 index 0000000..a58693f --- /dev/null +++ b/packages/console-server/src/resolvers/log.js @@ -0,0 +1,65 @@ +// +// Copyright 2020 DxOS.org +// + +import moment from 'moment'; +import pick from 'lodash.pick'; +import os from 'os'; +import si from 'systeminformation'; +import { spawnSync } from "child_process"; + +class LogCache { + constructor(maxLines = 500) { + // Sets in JS iterate in insertion order. + this.buffer = new Set(); + this.maxLines = maxLines; + } + + append(lines) { + const added = []; + for (const line of lines) { + if (!this.buffer.has(line)) { + this.buffer.add(line); + added.push(line); + } + } + + if (this.buffer.size > this.maxLines) { + this.buffer = new Set(Array.from(this.buffer).slice(parseInt(this.maxLines / 2))); + } + + return added; + } +} + +const _caches = new Map(); +const getLogCache = (name) => { + let cache = _caches.get(name); + if (!cache) { + cache = new LogCache(); + _caches.set(name, cache); + } + return cache; +} + +const getLogs = async (name, lines = 100) => { + const command = 'wire'; + const args = ['service', 'logs', '--lines', lines, name]; + + const child = spawnSync(command, args, { encoding: 'utf8' }); + const logLines = child.stdout.split(/\n/); + const cache = getLogCache(name); + return cache.append(logLines); +}; + +export const logResolvers = { + Query: { + wns_log: async () => { + const logs = await getLogs('wns-list'); + return { + timestamp: new Date().toUTCString(), + json: JSON.stringify(logs) + }; + } + } +}; diff --git a/packages/console-server/src/server/main.js b/packages/console-server/src/server/main.js index 073aeb6..8d7d22c 100644 --- a/packages/console-server/src/server/main.js +++ b/packages/console-server/src/server/main.js @@ -22,7 +22,6 @@ import SYSTEM_STATUS from '@dxos/console-app/src/gql/system_status.graphql'; import { resolvers } from '../resolvers'; import API_SCHEMA from '../gql/api.graphql'; -import SYSTEM_SCHEMA from '../gql/system.graphql'; const argv = yargs .option('config', { @@ -113,10 +112,7 @@ app.get(publicUrl, (req, res) => { const server = new ApolloServer({ typeDefs: [ - API_SCHEMA, - SYSTEM_SCHEMA - // WNS_EXTENSIONS, - // WNS_SCHEMA + API_SCHEMA ], // https://www.apollographql.com/docs/graphql-tools/resolvers From 5965c53696566a966251c032360db8f31ea919a3 Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Wed, 10 Jun 2020 15:56:20 -0500 Subject: [PATCH 02/12] Add back version.json --- packages/console-app/src/version.json | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 packages/console-app/src/version.json diff --git a/packages/console-app/src/version.json b/packages/console-app/src/version.json new file mode 100644 index 0000000..8dbb7e7 --- /dev/null +++ b/packages/console-app/src/version.json @@ -0,0 +1,7 @@ +{ + "build": { + "name": "@dxos/console-app", + "buildDate": "2020-06-10T20:28:40.010Z", + "version": "1.0.0-beta.0" + } +} From 0fb12ec30ff32957aead2ec04b3f382058b1492f Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Wed, 10 Jun 2020 17:15:07 -0500 Subject: [PATCH 03/12] More logging. --- packages/console-app/config.yml | 2 +- packages/console-app/src/components/Log.js | 3 ++ .../src/containers/panels/signal/SignalLog.js | 11 +++++- .../src/containers/panels/wns/WNSLog.js | 12 +++++-- .../console-app/src/gql/signal_log.graphql | 4 +-- packages/console-app/src/version.json | 2 +- packages/console-server/src/gql/api.graphql | 8 +++-- packages/console-server/src/resolvers/log.js | 34 ++++++++++++++++--- 8 files changed, 61 insertions(+), 15 deletions(-) diff --git a/packages/console-app/config.yml b/packages/console-app/config.yml index 85be7a6..b34222e 100644 --- a/packages/console-app/config.yml +++ b/packages/console-app/config.yml @@ -12,7 +12,7 @@ app: api: path: '/api' - port: 4000 + port: 4004 intervalLog: 5000 pollInterval: 10000 diff --git a/packages/console-app/src/components/Log.js b/packages/console-app/src/components/Log.js index 8016ed3..470c98b 100644 --- a/packages/console-app/src/components/Log.js +++ b/packages/console-app/src/components/Log.js @@ -106,6 +106,9 @@ const Log = ({ log = [] }) => { ); }; + // TODO(telackey): Why do these display in reverse? + log.reverse(); + return (
diff --git a/packages/console-app/src/containers/panels/signal/SignalLog.js b/packages/console-app/src/containers/panels/signal/SignalLog.js index 77a84ea..0e59248 100644 --- a/packages/console-app/src/containers/panels/signal/SignalLog.js +++ b/packages/console-app/src/containers/panels/signal/SignalLog.js @@ -11,6 +11,9 @@ import { ConsoleContext, useQueryStatusReducer } from '../../../hooks'; import Log from '../../../components/Log'; +const MAX_LINES = 1000; +const oldLines = []; + const SignalLog = () => { const { config } = useContext(ConsoleContext); const data = useQueryStatusReducer(useQuery(SIGNAL_LOG, { pollInterval: config.api.intervalLog })); @@ -18,8 +21,14 @@ const SignalLog = () => { return null; } + const newLines = JSON.parse(data.signal_log.json); + oldLines.push(...newLines); + if (oldLines.length > MAX_LINES) { + oldLines.splice(0, oldLines.length - MAX_LINES); + } + return ( - + ); }; diff --git a/packages/console-app/src/containers/panels/wns/WNSLog.js b/packages/console-app/src/containers/panels/wns/WNSLog.js index 9fcb485..d9d3ed1 100644 --- a/packages/console-app/src/containers/panels/wns/WNSLog.js +++ b/packages/console-app/src/containers/panels/wns/WNSLog.js @@ -11,16 +11,24 @@ import { ConsoleContext, useQueryStatusReducer } from '../../../hooks'; import Log from '../../../components/Log'; +const MAX_LINES = 1000; +const oldLines = []; + const WNSLog = () => { const { config } = useContext(ConsoleContext); const data = useQueryStatusReducer(useQuery(WNS_LOG, { pollInterval: config.api.intervalLog })); - console.error(data); if (!data) { return null; } + const newLines = JSON.parse(data.wns_log.json); + oldLines.push(...newLines); + if (oldLines.length > MAX_LINES) { + oldLines.splice(0, oldLines.length - MAX_LINES); + } + return ( - + ); }; diff --git a/packages/console-app/src/gql/signal_log.graphql b/packages/console-app/src/gql/signal_log.graphql index 9e8194d..ea53570 100644 --- a/packages/console-app/src/gql/signal_log.graphql +++ b/packages/console-app/src/gql/signal_log.graphql @@ -3,8 +3,8 @@ # query { - signal_log @client { + signal_log { timestamp - log + json } } diff --git a/packages/console-app/src/version.json b/packages/console-app/src/version.json index 8dbb7e7..d120e6d 100644 --- a/packages/console-app/src/version.json +++ b/packages/console-app/src/version.json @@ -1,7 +1,7 @@ { "build": { "name": "@dxos/console-app", - "buildDate": "2020-06-10T20:28:40.010Z", + "buildDate": "2020-06-10T22:08:16.919Z", "version": "1.0.0-beta.0" } } diff --git a/packages/console-server/src/gql/api.graphql b/packages/console-server/src/gql/api.graphql index 542a323..5b2cfd5 100644 --- a/packages/console-server/src/gql/api.graphql +++ b/packages/console-server/src/gql/api.graphql @@ -13,15 +13,17 @@ type JSONResult { # type Query { - app_swarm_log: JSONResult! + app_log: JSONResult! + app_status: JSONResult! ipfs_log: JSONResult! ipfs_status: JSONResult! ipfs_swarm_log: JSONResult! + ipfs_swarm_status: JSONResult! + signal_log: JSONResult! signal_status: JSONResult! - signal_swarm_log: JSONResult! system_status: JSONResult! - wns_status: JSONResult! wns_log: JSONResult! + wns_status: JSONResult! } schema { diff --git a/packages/console-server/src/resolvers/log.js b/packages/console-server/src/resolvers/log.js index a58693f..bb6eaba 100644 --- a/packages/console-server/src/resolvers/log.js +++ b/packages/console-server/src/resolvers/log.js @@ -2,11 +2,7 @@ // Copyright 2020 DxOS.org // -import moment from 'moment'; -import pick from 'lodash.pick'; -import os from 'os'; -import si from 'systeminformation'; -import { spawnSync } from "child_process"; +import { spawnSync } from 'child_process'; class LogCache { constructor(maxLines = 500) { @@ -60,6 +56,34 @@ export const logResolvers = { timestamp: new Date().toUTCString(), json: JSON.stringify(logs) }; + }, + signal_log: async () => { + const logs = await getLogs('signal'); + return { + timestamp: new Date().toUTCString(), + json: JSON.stringify(logs) + }; + }, + ipfs_log: async () => { + const logs = await getLogs('ipfs'); + return { + timestamp: new Date().toUTCString(), + json: JSON.stringify(logs) + }; + }, + ipfs_swarm_log: async () => { + const logs = await getLogs('ipfs'); + return { + timestamp: new Date().toUTCString(), + json: JSON.stringify(logs) + }; + }, + app_log: async () => { + const logs = await getLogs('ipfs'); + return { + timestamp: new Date().toUTCString(), + json: JSON.stringify(logs) + }; } } }; From 20e152f6e3b0f1e66d394031f337c5b5f26b4daf Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Wed, 10 Jun 2020 17:17:19 -0500 Subject: [PATCH 04/12] Fix service name. --- packages/console-server/src/resolvers/log.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/console-server/src/resolvers/log.js b/packages/console-server/src/resolvers/log.js index bb6eaba..9be7ad3 100644 --- a/packages/console-server/src/resolvers/log.js +++ b/packages/console-server/src/resolvers/log.js @@ -51,7 +51,7 @@ const getLogs = async (name, lines = 100) => { export const logResolvers = { Query: { wns_log: async () => { - const logs = await getLogs('wns-list'); + const logs = await getLogs('wns-lite'); return { timestamp: new Date().toUTCString(), json: JSON.stringify(logs) From 44fd5a083009d605ca79f499e44120ea2d13a3af Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Wed, 10 Jun 2020 17:56:08 -0500 Subject: [PATCH 05/12] Incremental --- .../src/containers/panels/signal/SignalLog.js | 7 +++-- .../console-app/src/gql/signal_log.graphql | 4 +-- packages/console-app/src/gql/wns_log.graphql | 4 +-- packages/console-app/src/version.json | 2 +- packages/console-server/src/gql/api.graphql | 10 +++---- packages/console-server/src/resolvers/log.js | 27 ++++++++++--------- 6 files changed, 30 insertions(+), 24 deletions(-) diff --git a/packages/console-app/src/containers/panels/signal/SignalLog.js b/packages/console-app/src/containers/panels/signal/SignalLog.js index 0e59248..8a7437f 100644 --- a/packages/console-app/src/containers/panels/signal/SignalLog.js +++ b/packages/console-app/src/containers/panels/signal/SignalLog.js @@ -16,7 +16,10 @@ const oldLines = []; const SignalLog = () => { const { config } = useContext(ConsoleContext); - const data = useQueryStatusReducer(useQuery(SIGNAL_LOG, { pollInterval: config.api.intervalLog })); + const data = useQueryStatusReducer(useQuery(SIGNAL_LOG, { + pollInterval: config.api.intervalLog, + variables: { first: oldLines.length === 0 } + })); if (!data) { return null; } @@ -28,7 +31,7 @@ const SignalLog = () => { } return ( - + ); }; diff --git a/packages/console-app/src/gql/signal_log.graphql b/packages/console-app/src/gql/signal_log.graphql index ea53570..a39a708 100644 --- a/packages/console-app/src/gql/signal_log.graphql +++ b/packages/console-app/src/gql/signal_log.graphql @@ -2,8 +2,8 @@ # Copyright 2020 DxOS.org # -query { - signal_log { +query ($incremental: Boolean) { + signal_log(incremental: $incremental) { timestamp json } diff --git a/packages/console-app/src/gql/wns_log.graphql b/packages/console-app/src/gql/wns_log.graphql index 4c80fdc..4bf829d 100644 --- a/packages/console-app/src/gql/wns_log.graphql +++ b/packages/console-app/src/gql/wns_log.graphql @@ -2,8 +2,8 @@ # Copyright 2020 DxOS.org # -query { - wns_log { +query($incremental: Boolean) { + wns_log(incremental: $incremental) { timestamp json } diff --git a/packages/console-app/src/version.json b/packages/console-app/src/version.json index d120e6d..90b5e24 100644 --- a/packages/console-app/src/version.json +++ b/packages/console-app/src/version.json @@ -1,7 +1,7 @@ { "build": { "name": "@dxos/console-app", - "buildDate": "2020-06-10T22:08:16.919Z", + "buildDate": "2020-06-10T22:43:33.469Z", "version": "1.0.0-beta.0" } } diff --git a/packages/console-server/src/gql/api.graphql b/packages/console-server/src/gql/api.graphql index 5b2cfd5..8f6f991 100644 --- a/packages/console-server/src/gql/api.graphql +++ b/packages/console-server/src/gql/api.graphql @@ -13,16 +13,16 @@ type JSONResult { # type Query { - app_log: JSONResult! + app_log(incremental: Boolean): JSONResult! app_status: JSONResult! - ipfs_log: JSONResult! + ipfs_log(incremental: Boolean): JSONResult! ipfs_status: JSONResult! - ipfs_swarm_log: JSONResult! + ipfs_swarm_log(incremental: Boolean): JSONResult! ipfs_swarm_status: JSONResult! - signal_log: JSONResult! + signal_log(incremental: Boolean): JSONResult! signal_status: JSONResult! system_status: JSONResult! - wns_log: JSONResult! + wns_log(incremental: Boolean): JSONResult! wns_status: JSONResult! } diff --git a/packages/console-server/src/resolvers/log.js b/packages/console-server/src/resolvers/log.js index 9be7ad3..462b783 100644 --- a/packages/console-server/src/resolvers/log.js +++ b/packages/console-server/src/resolvers/log.js @@ -29,6 +29,7 @@ class LogCache { } const _caches = new Map(); + const getLogCache = (name) => { let cache = _caches.get(name); if (!cache) { @@ -38,48 +39,50 @@ const getLogCache = (name) => { return cache; } -const getLogs = async (name, lines = 100) => { +const getLogs = async (name, incremental = false, lines = 100) => { const command = 'wire'; const args = ['service', 'logs', '--lines', lines, name]; const child = spawnSync(command, args, { encoding: 'utf8' }); const logLines = child.stdout.split(/\n/); const cache = getLogCache(name); - return cache.append(logLines); + const added = cache.append(logLines); + + return incremental ? added : Array.from(cache.buffer); }; export const logResolvers = { Query: { - wns_log: async () => { - const logs = await getLogs('wns-lite'); + wns_log: async (_, { incremental }) => { + const logs = await getLogs('wns-lite', incremental); return { timestamp: new Date().toUTCString(), json: JSON.stringify(logs) }; }, - signal_log: async () => { - const logs = await getLogs('signal'); + signal_log: async (_, { incremental }) => { + const logs = await getLogs('signal', incremental); return { timestamp: new Date().toUTCString(), json: JSON.stringify(logs) }; }, - ipfs_log: async () => { - const logs = await getLogs('ipfs'); + ipfs_log: async (_, { incremental }) => { + const logs = await getLogs('ipfs', incremental); return { timestamp: new Date().toUTCString(), json: JSON.stringify(logs) }; }, - ipfs_swarm_log: async () => { - const logs = await getLogs('ipfs'); + ipfs_swarm_log: async (_, { incremental }) => { + const logs = await getLogs('ipfs-swarm-connect', incremental); return { timestamp: new Date().toUTCString(), json: JSON.stringify(logs) }; }, - app_log: async () => { - const logs = await getLogs('ipfs'); + app_log: async (_, { incremental }) => { + const logs = await getLogs('app', incremental); return { timestamp: new Date().toUTCString(), json: JSON.stringify(logs) From 22f2c7c600c6fb1aa50353444eefe5a1b2d08845 Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Wed, 10 Jun 2020 23:47:42 -0500 Subject: [PATCH 06/12] Full/incremental log updates. --- .../src/containers/panels/signal/SignalLog.js | 32 ++++++++++++------- .../src/containers/panels/signal/Signaling.js | 1 - .../src/containers/panels/wns/WNSLog.js | 29 +++++++++++------ packages/console-app/src/resolvers.js | 2 +- .../console-server/src/resolvers/index.js | 3 +- packages/console-server/src/resolvers/log.js | 28 ++++++++-------- 6 files changed, 57 insertions(+), 38 deletions(-) diff --git a/packages/console-app/src/containers/panels/signal/SignalLog.js b/packages/console-app/src/containers/panels/signal/SignalLog.js index 8a7437f..3ecd0bf 100644 --- a/packages/console-app/src/containers/panels/signal/SignalLog.js +++ b/packages/console-app/src/containers/panels/signal/SignalLog.js @@ -7,32 +7,40 @@ import { useQuery } from '@apollo/react-hooks'; import SIGNAL_LOG from '../../../gql/signal_log.graphql'; -import { ConsoleContext, useQueryStatusReducer } from '../../../hooks'; +import { ConsoleContext } from '../../../hooks'; import Log from '../../../components/Log'; const MAX_LINES = 1000; -const oldLines = []; +const logBuffer = []; const SignalLog = () => { const { config } = useContext(ConsoleContext); - const data = useQueryStatusReducer(useQuery(SIGNAL_LOG, { - pollInterval: config.api.intervalLog, - variables: { first: oldLines.length === 0 } - })); + const { data, refetch, startPolling, stopPolling } = useQuery(SIGNAL_LOG, { + variables: { incremental: false } + }); + if (!data) { return null; } - const newLines = JSON.parse(data.signal_log.json); - oldLines.push(...newLines); - if (oldLines.length > MAX_LINES) { - oldLines.splice(0, oldLines.length - MAX_LINES); + const { incremental, lines } = JSON.parse(data.signal_log.json); + + if (!incremental) { + stopPolling(); + refetch({ incremental: true }); + startPolling(config.api.intervalLog); + } + + logBuffer.push(...lines); + if (logBuffer.length > MAX_LINES) { + logBuffer.splice(0, logBuffer.length - MAX_LINES); } return ( - + ); -}; +} +; export default SignalLog; diff --git a/packages/console-app/src/containers/panels/signal/Signaling.js b/packages/console-app/src/containers/panels/signal/Signaling.js index bfe9fa4..6fd5323 100644 --- a/packages/console-app/src/containers/panels/signal/Signaling.js +++ b/packages/console-app/src/containers/panels/signal/Signaling.js @@ -39,7 +39,6 @@ const useStyles = makeStyles(() => ({ const Signal = () => { const classes = useStyles(); const [tab, setTab] = useState(TAB_STATUS); - const [type, setType] = useState(); return ( { const { config } = useContext(ConsoleContext); - const data = useQueryStatusReducer(useQuery(WNS_LOG, { pollInterval: config.api.intervalLog })); + const { data, refetch, startPolling, stopPolling } = useQuery(WNS_LOG, { + variables: { incremental: false } + }); + if (!data) { return null; } - const newLines = JSON.parse(data.wns_log.json); - oldLines.push(...newLines); - if (oldLines.length > MAX_LINES) { - oldLines.splice(0, oldLines.length - MAX_LINES); + const { incremental, lines } = JSON.parse(data.signal_log.json); + + if (!incremental) { + stopPolling(); + refetch({ incremental: true }); + startPolling(config.api.intervalLog); + } + + logBuffer.push(...lines); + if (logBuffer.length > MAX_LINES) { + logBuffer.splice(0, logBuffer.length - MAX_LINES); } return ( - + ); -}; +} +; export default WNSLog; diff --git a/packages/console-app/src/resolvers.js b/packages/console-app/src/resolvers.js index 019c0f4..0c5f13e 100644 --- a/packages/console-app/src/resolvers.js +++ b/packages/console-app/src/resolvers.js @@ -105,7 +105,7 @@ export const createResolvers = config => { timestamp: timestamp(), log: [] }; - }, + } } }; }; diff --git a/packages/console-server/src/resolvers/index.js b/packages/console-server/src/resolvers/index.js index 32288dd..907ea1c 100644 --- a/packages/console-server/src/resolvers/index.js +++ b/packages/console-server/src/resolvers/index.js @@ -7,8 +7,9 @@ import defaultsDeep from 'lodash.defaultsdeep'; import { ipfsResolvers } from './ipfs'; import { systemResolvers } from './system'; -import { logResolvers } from "./log"; +import { logResolvers } from './log'; +// eslint-disable-next-line const log = debug('dxos:console:server:resolvers'); /** diff --git a/packages/console-server/src/resolvers/log.js b/packages/console-server/src/resolvers/log.js index 462b783..9be338d 100644 --- a/packages/console-server/src/resolvers/log.js +++ b/packages/console-server/src/resolvers/log.js @@ -5,13 +5,13 @@ import { spawnSync } from 'child_process'; class LogCache { - constructor(maxLines = 500) { + constructor (maxLines = 500) { // Sets in JS iterate in insertion order. this.buffer = new Set(); this.maxLines = maxLines; } - append(lines) { + append (lines) { const added = []; for (const line of lines) { if (!this.buffer.has(line)) { @@ -37,7 +37,7 @@ const getLogCache = (name) => { _caches.set(name, cache); } return cache; -} +}; const getLogs = async (name, incremental = false, lines = 100) => { const command = 'wire'; @@ -46,7 +46,7 @@ const getLogs = async (name, incremental = false, lines = 100) => { const child = spawnSync(command, args, { encoding: 'utf8' }); const logLines = child.stdout.split(/\n/); const cache = getLogCache(name); - const added = cache.append(logLines); + const added = cache.append(logLines); return incremental ? added : Array.from(cache.buffer); }; @@ -54,38 +54,38 @@ const getLogs = async (name, incremental = false, lines = 100) => { export const logResolvers = { Query: { wns_log: async (_, { incremental }) => { - const logs = await getLogs('wns-lite', incremental); + const lines = await getLogs('wns-lite', incremental); return { timestamp: new Date().toUTCString(), - json: JSON.stringify(logs) + json: JSON.stringify({ incremental, lines }) }; }, signal_log: async (_, { incremental }) => { - const logs = await getLogs('signal', incremental); + const lines = await getLogs('signal', incremental); return { timestamp: new Date().toUTCString(), - json: JSON.stringify(logs) + json: JSON.stringify({ incremental, lines }) }; }, ipfs_log: async (_, { incremental }) => { - const logs = await getLogs('ipfs', incremental); + const lines = await getLogs('ipfs', incremental); return { timestamp: new Date().toUTCString(), - json: JSON.stringify(logs) + json: JSON.stringify({ incremental, lines }) }; }, ipfs_swarm_log: async (_, { incremental }) => { - const logs = await getLogs('ipfs-swarm-connect', incremental); + const lines = await getLogs('ipfs-swarm-connect', incremental); return { timestamp: new Date().toUTCString(), - json: JSON.stringify(logs) + json: JSON.stringify({ incremental, lines }) }; }, app_log: async (_, { incremental }) => { - const logs = await getLogs('app', incremental); + const lines = await getLogs('app', incremental); return { timestamp: new Date().toUTCString(), - json: JSON.stringify(logs) + json: JSON.stringify({ incremental, lines }) }; } } From c226486d053427533c49b9501d1fdd59ebdcfcad Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Thu, 11 Jun 2020 00:28:19 -0500 Subject: [PATCH 07/12] Unify log api. --- .../console-app/src/components/LogPoller.js | 42 +++++++++++++++++ .../src/containers/panels/signal/SignalLog.js | 46 ------------------- .../src/containers/panels/signal/Signaling.js | 6 ++- .../src/containers/panels/wns/WNS.js | 6 ++- .../src/containers/panels/wns/WNSLog.js | 46 ------------------- packages/console-app/src/gql/logs.graphql | 10 ++++ .../console-app/src/gql/signal_log.graphql | 10 ---- packages/console-app/src/gql/wns_log.graphql | 10 ---- packages/console-app/src/version.json | 2 +- packages/console-server/src/gql/api.graphql | 6 +-- packages/console-server/src/resolvers/log.js | 32 +------------ 11 files changed, 64 insertions(+), 152 deletions(-) create mode 100644 packages/console-app/src/components/LogPoller.js delete mode 100644 packages/console-app/src/containers/panels/signal/SignalLog.js delete mode 100644 packages/console-app/src/containers/panels/wns/WNSLog.js create mode 100644 packages/console-app/src/gql/logs.graphql delete mode 100644 packages/console-app/src/gql/signal_log.graphql delete mode 100644 packages/console-app/src/gql/wns_log.graphql diff --git a/packages/console-app/src/components/LogPoller.js b/packages/console-app/src/components/LogPoller.js new file mode 100644 index 0000000..7a501af --- /dev/null +++ b/packages/console-app/src/components/LogPoller.js @@ -0,0 +1,42 @@ +// +// Copyright 2020 DxOS.org +// + +import React, { useContext } from 'react'; +import { useQuery } from '@apollo/react-hooks'; + +import { ConsoleContext, useQueryStatusReducer } from '../hooks'; + +import Log from './Log'; + +const MAX_LINES = 1000; +const logBuffer = []; + +const LogPoller = ({ service, query }) => { + const { config } = useContext(ConsoleContext); + const data = useQueryStatusReducer(useQuery(query, { + pollInterval: config.api.intervalLog, + variables: { service, incremental: logBuffer.length !== 0 } + })); + + if (!data) { + return null; + } + + const { incremental, lines } = JSON.parse(data.wns_log.json); + + if (!incremental && lines.length) { + logBuffer.length = 0; + } + + logBuffer.push(...lines); + if (logBuffer.length > MAX_LINES) { + logBuffer.splice(0, logBuffer.length - MAX_LINES); + } + + return ( + + ); +}; + +export default LogPoller; diff --git a/packages/console-app/src/containers/panels/signal/SignalLog.js b/packages/console-app/src/containers/panels/signal/SignalLog.js deleted file mode 100644 index 3ecd0bf..0000000 --- a/packages/console-app/src/containers/panels/signal/SignalLog.js +++ /dev/null @@ -1,46 +0,0 @@ -// -// Copyright 2020 DxOS.org -// - -import React, { useContext } from 'react'; -import { useQuery } from '@apollo/react-hooks'; - -import SIGNAL_LOG from '../../../gql/signal_log.graphql'; - -import { ConsoleContext } from '../../../hooks'; - -import Log from '../../../components/Log'; - -const MAX_LINES = 1000; -const logBuffer = []; - -const SignalLog = () => { - const { config } = useContext(ConsoleContext); - const { data, refetch, startPolling, stopPolling } = useQuery(SIGNAL_LOG, { - variables: { incremental: false } - }); - - if (!data) { - return null; - } - - const { incremental, lines } = JSON.parse(data.signal_log.json); - - if (!incremental) { - stopPolling(); - refetch({ incremental: true }); - startPolling(config.api.intervalLog); - } - - logBuffer.push(...lines); - if (logBuffer.length > MAX_LINES) { - logBuffer.splice(0, logBuffer.length - MAX_LINES); - } - - return ( - - ); -} -; - -export default SignalLog; diff --git a/packages/console-app/src/containers/panels/signal/Signaling.js b/packages/console-app/src/containers/panels/signal/Signaling.js index 6fd5323..37dd380 100644 --- a/packages/console-app/src/containers/panels/signal/Signaling.js +++ b/packages/console-app/src/containers/panels/signal/Signaling.js @@ -9,11 +9,13 @@ import Tab from '@material-ui/core/Tab'; import Tabs from '@material-ui/core/Tabs'; import TabContext from '@material-ui/lab/TabContext'; +import SIGNAL_LOG from '../../../gql/logs.graphql'; + import Panel from '../../../components/Panel'; import Toolbar from '../../../components/Toolbar'; -import SignalLog from './SignalLog'; import SignalStatus from './SignalStatus'; +import LogPoller from "../../../components/LogPoller"; const TAB_STATUS = 'status'; const TAB_LOG = 'log'; @@ -62,7 +64,7 @@ const Signal = () => { {tab === TAB_LOG && (
- +
)} diff --git a/packages/console-app/src/containers/panels/wns/WNS.js b/packages/console-app/src/containers/panels/wns/WNS.js index 0d7c80e..00476f7 100644 --- a/packages/console-app/src/containers/panels/wns/WNS.js +++ b/packages/console-app/src/containers/panels/wns/WNS.js @@ -9,10 +9,12 @@ import Tab from '@material-ui/core/Tab'; import Tabs from '@material-ui/core/Tabs'; import TabContext from '@material-ui/lab/TabContext'; +import WNS_LOG from '../../../gql/wns_log.graphql'; + +import LogPoller from "../../../components/LogPoller"; import Panel from '../../../components/Panel'; import Toolbar from '../../../components/Toolbar'; -import WNSLog from './WNSLog'; import WNSRecords, { WNSRecordType } from './WNSRecords'; import WNSStatus from './WNSStatus'; @@ -76,7 +78,7 @@ const WNS = () => { {tab === TAB_LOG && (
- +
)} diff --git a/packages/console-app/src/containers/panels/wns/WNSLog.js b/packages/console-app/src/containers/panels/wns/WNSLog.js deleted file mode 100644 index 265c406..0000000 --- a/packages/console-app/src/containers/panels/wns/WNSLog.js +++ /dev/null @@ -1,46 +0,0 @@ -// -// Copyright 2020 DxOS.org -// - -import React, { useContext } from 'react'; -import { useQuery } from '@apollo/react-hooks'; - -import WNS_LOG from '../../../gql/wns_log.graphql'; - -import { ConsoleContext } from '../../../hooks'; - -import Log from '../../../components/Log'; - -const MAX_LINES = 1000; -const logBuffer = []; - -const WNSLog = () => { - const { config } = useContext(ConsoleContext); - const { data, refetch, startPolling, stopPolling } = useQuery(WNS_LOG, { - variables: { incremental: false } - }); - - if (!data) { - return null; - } - - const { incremental, lines } = JSON.parse(data.signal_log.json); - - if (!incremental) { - stopPolling(); - refetch({ incremental: true }); - startPolling(config.api.intervalLog); - } - - logBuffer.push(...lines); - if (logBuffer.length > MAX_LINES) { - logBuffer.splice(0, logBuffer.length - MAX_LINES); - } - - return ( - - ); -} -; - -export default WNSLog; diff --git a/packages/console-app/src/gql/logs.graphql b/packages/console-app/src/gql/logs.graphql new file mode 100644 index 0000000..fb4b122 --- /dev/null +++ b/packages/console-app/src/gql/logs.graphql @@ -0,0 +1,10 @@ +# +# Copyright 2020 DxOS.org +# + +query ($service: String!, $incremental: Boolean) { + logs(service: $service, incremental: $incremental) { + timestamp + json + } +} diff --git a/packages/console-app/src/gql/signal_log.graphql b/packages/console-app/src/gql/signal_log.graphql deleted file mode 100644 index a39a708..0000000 --- a/packages/console-app/src/gql/signal_log.graphql +++ /dev/null @@ -1,10 +0,0 @@ -# -# Copyright 2020 DxOS.org -# - -query ($incremental: Boolean) { - signal_log(incremental: $incremental) { - timestamp - json - } -} diff --git a/packages/console-app/src/gql/wns_log.graphql b/packages/console-app/src/gql/wns_log.graphql deleted file mode 100644 index 4bf829d..0000000 --- a/packages/console-app/src/gql/wns_log.graphql +++ /dev/null @@ -1,10 +0,0 @@ -# -# Copyright 2020 DxOS.org -# - -query($incremental: Boolean) { - wns_log(incremental: $incremental) { - timestamp - json - } -} diff --git a/packages/console-app/src/version.json b/packages/console-app/src/version.json index 90b5e24..618f306 100644 --- a/packages/console-app/src/version.json +++ b/packages/console-app/src/version.json @@ -1,7 +1,7 @@ { "build": { "name": "@dxos/console-app", - "buildDate": "2020-06-10T22:43:33.469Z", + "buildDate": "2020-06-11T05:01:31.306Z", "version": "1.0.0-beta.0" } } diff --git a/packages/console-server/src/gql/api.graphql b/packages/console-server/src/gql/api.graphql index 8f6f991..31121b0 100644 --- a/packages/console-server/src/gql/api.graphql +++ b/packages/console-server/src/gql/api.graphql @@ -13,16 +13,12 @@ type JSONResult { # type Query { - app_log(incremental: Boolean): JSONResult! + logs(service: String!, incremental: Boolean): JSONResult! app_status: JSONResult! - ipfs_log(incremental: Boolean): JSONResult! ipfs_status: JSONResult! - ipfs_swarm_log(incremental: Boolean): JSONResult! ipfs_swarm_status: JSONResult! - signal_log(incremental: Boolean): JSONResult! signal_status: JSONResult! system_status: JSONResult! - wns_log(incremental: Boolean): JSONResult! wns_status: JSONResult! } diff --git a/packages/console-server/src/resolvers/log.js b/packages/console-server/src/resolvers/log.js index 9be338d..8cdbaec 100644 --- a/packages/console-server/src/resolvers/log.js +++ b/packages/console-server/src/resolvers/log.js @@ -53,40 +53,12 @@ const getLogs = async (name, incremental = false, lines = 100) => { export const logResolvers = { Query: { - wns_log: async (_, { incremental }) => { - const lines = await getLogs('wns-lite', incremental); + logs: async (_, { service, incremental }) => { + const lines = await getLogs(service, incremental); return { timestamp: new Date().toUTCString(), json: JSON.stringify({ incremental, lines }) }; }, - signal_log: async (_, { incremental }) => { - const lines = await getLogs('signal', incremental); - return { - timestamp: new Date().toUTCString(), - json: JSON.stringify({ incremental, lines }) - }; - }, - ipfs_log: async (_, { incremental }) => { - const lines = await getLogs('ipfs', incremental); - return { - timestamp: new Date().toUTCString(), - json: JSON.stringify({ incremental, lines }) - }; - }, - ipfs_swarm_log: async (_, { incremental }) => { - const lines = await getLogs('ipfs-swarm-connect', incremental); - return { - timestamp: new Date().toUTCString(), - json: JSON.stringify({ incremental, lines }) - }; - }, - app_log: async (_, { incremental }) => { - const lines = await getLogs('app', incremental); - return { - timestamp: new Date().toUTCString(), - json: JSON.stringify({ incremental, lines }) - }; - } } }; From 958821b9ae29362c0c3d88213d9b2dd58d81bbf9 Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Thu, 11 Jun 2020 00:35:39 -0500 Subject: [PATCH 08/12] Further unify logging. --- packages/console-app/src/components/LogPoller.js | 8 +++++--- .../console-app/src/containers/panels/signal/Signaling.js | 4 +--- packages/console-app/src/containers/panels/wns/WNS.js | 4 +--- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/packages/console-app/src/components/LogPoller.js b/packages/console-app/src/components/LogPoller.js index 7a501af..05aa399 100644 --- a/packages/console-app/src/components/LogPoller.js +++ b/packages/console-app/src/components/LogPoller.js @@ -7,14 +7,16 @@ import { useQuery } from '@apollo/react-hooks'; import { ConsoleContext, useQueryStatusReducer } from '../hooks'; +import LOGS from '../gql/logs.graphql'; + import Log from './Log'; const MAX_LINES = 1000; const logBuffer = []; -const LogPoller = ({ service, query }) => { +const LogPoller = ({ service }) => { const { config } = useContext(ConsoleContext); - const data = useQueryStatusReducer(useQuery(query, { + const data = useQueryStatusReducer(useQuery(LOGS, { pollInterval: config.api.intervalLog, variables: { service, incremental: logBuffer.length !== 0 } })); @@ -23,7 +25,7 @@ const LogPoller = ({ service, query }) => { return null; } - const { incremental, lines } = JSON.parse(data.wns_log.json); + const { incremental, lines } = JSON.parse(data.logs.json); if (!incremental && lines.length) { logBuffer.length = 0; diff --git a/packages/console-app/src/containers/panels/signal/Signaling.js b/packages/console-app/src/containers/panels/signal/Signaling.js index 37dd380..793b5c9 100644 --- a/packages/console-app/src/containers/panels/signal/Signaling.js +++ b/packages/console-app/src/containers/panels/signal/Signaling.js @@ -9,8 +9,6 @@ import Tab from '@material-ui/core/Tab'; import Tabs from '@material-ui/core/Tabs'; import TabContext from '@material-ui/lab/TabContext'; -import SIGNAL_LOG from '../../../gql/logs.graphql'; - import Panel from '../../../components/Panel'; import Toolbar from '../../../components/Toolbar'; @@ -64,7 +62,7 @@ const Signal = () => { {tab === TAB_LOG && (
- +
)} diff --git a/packages/console-app/src/containers/panels/wns/WNS.js b/packages/console-app/src/containers/panels/wns/WNS.js index 00476f7..0c1a742 100644 --- a/packages/console-app/src/containers/panels/wns/WNS.js +++ b/packages/console-app/src/containers/panels/wns/WNS.js @@ -9,8 +9,6 @@ import Tab from '@material-ui/core/Tab'; import Tabs from '@material-ui/core/Tabs'; import TabContext from '@material-ui/lab/TabContext'; -import WNS_LOG from '../../../gql/wns_log.graphql'; - import LogPoller from "../../../components/LogPoller"; import Panel from '../../../components/Panel'; import Toolbar from '../../../components/Toolbar'; @@ -78,7 +76,7 @@ const WNS = () => { {tab === TAB_LOG && (
- +
)} From 99f87336c6f46c213791b9883ec98bb79d2a71a8 Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Thu, 11 Jun 2020 01:17:33 -0500 Subject: [PATCH 09/12] More logging, and service info tab. --- packages/console-app/src/components/Log.js | 1 + .../console-app/src/components/LogPoller.js | 14 +- packages/console-app/src/containers/Main.js | 4 +- .../src/containers/panels/Status.js | 49 ++++- .../src/containers/panels/apps/Apps.js | 7 + .../src/containers/panels/bots/BotRecords.js | 2 +- .../src/containers/panels/ipfs/IPFS.js | 180 +++++------------- .../src/containers/panels/ipfs/IPFSStatus.js | 165 ++++++++++++++++ .../console-app/src/gql/system_status.graphql | 7 + packages/console-server/src/gql/api.graphql | 1 + .../console-server/src/resolvers/system.js | 23 ++- 11 files changed, 308 insertions(+), 145 deletions(-) create mode 100644 packages/console-app/src/containers/panels/ipfs/IPFSStatus.js diff --git a/packages/console-app/src/components/Log.js b/packages/console-app/src/components/Log.js index 470c98b..63aa12a 100644 --- a/packages/console-app/src/components/Log.js +++ b/packages/console-app/src/components/Log.js @@ -15,6 +15,7 @@ const useStyles = makeStyles(theme => ({ }, log: { + width: '100%', display: 'flex', // Pin to bottom (render in time order). flexDirection: 'column-reverse', diff --git a/packages/console-app/src/components/LogPoller.js b/packages/console-app/src/components/LogPoller.js index 05aa399..8af5958 100644 --- a/packages/console-app/src/components/LogPoller.js +++ b/packages/console-app/src/components/LogPoller.js @@ -12,10 +12,20 @@ import LOGS from '../gql/logs.graphql'; import Log from './Log'; const MAX_LINES = 1000; -const logBuffer = []; +const _logBuffers = new Map(); + +const getLogBuffer = (name) => { + let buffer = _logBuffers.get(name); + if (!buffer) { + buffer = []; + _logBuffers.set(name, buffer); + } + return buffer; +} const LogPoller = ({ service }) => { const { config } = useContext(ConsoleContext); + const logBuffer = getLogBuffer(service); const data = useQueryStatusReducer(useQuery(LOGS, { pollInterval: config.api.intervalLog, variables: { service, incremental: logBuffer.length !== 0 } @@ -37,7 +47,7 @@ const LogPoller = ({ service }) => { } return ( - + ); }; diff --git a/packages/console-app/src/containers/Main.js b/packages/console-app/src/containers/Main.js index 688d7d1..d2695ee 100644 --- a/packages/console-app/src/containers/Main.js +++ b/packages/console-app/src/containers/Main.js @@ -22,7 +22,7 @@ import ConsoleContextProvider from './ConsoleContextProvider'; import AppRecords from './panels/apps/Apps'; import Bots from './panels/bots/Bots'; import Config from './panels/Config'; -import IPFS from './panels/ipfs/IPFS'; +import IPFSStatus from './panels/ipfs/IPFS'; import Metadata from './panels/Metadata'; import Signaling from './panels/signal/Signaling'; import Status from './panels/Status'; @@ -49,7 +49,7 @@ const Main = ({ config }) => { - + diff --git a/packages/console-app/src/containers/panels/Status.js b/packages/console-app/src/containers/panels/Status.js index ab54343..1932ba8 100644 --- a/packages/console-app/src/containers/panels/Status.js +++ b/packages/console-app/src/containers/panels/Status.js @@ -2,8 +2,12 @@ // Copyright 2020 DxOS.org // -import React, { useContext } from 'react'; +import React, { useContext, useState } from 'react'; import { useQuery } from '@apollo/react-hooks'; +import { makeStyles } from '@material-ui/core'; +import Tab from '@material-ui/core/Tab'; +import Tabs from '@material-ui/core/Tabs'; +import TabContext from '@material-ui/lab/TabContext'; import Json from '../../components/Json'; @@ -14,8 +18,31 @@ import { ConsoleContext, useQueryStatusReducer } from '../../hooks'; import Panel from '../../components/Panel'; import Toolbar from '../../components/Toolbar'; +const TAB_SYSTEM = 'system'; +const TAB_SERVICES = 'services'; + +const useStyles = makeStyles(() => ({ + expand: { + flex: 1 + }, + + panel: { + display: 'flex', + overflow: 'hidden', + flex: 1 + }, + + paper: { + display: 'flex', + overflow: 'hidden', + flex: 1 + } +})); + const Status = () => { + const classes = useStyles(); const { config } = useContext(ConsoleContext); + const [tab, setTab] = useState(TAB_SYSTEM); const systemResponse = useQueryStatusReducer(useQuery(SYSTEM_STATUS, { pollInterval: config.api.intervalQuery })); if (!systemResponse) { return null; @@ -26,10 +53,26 @@ const Status = () => { return ( + + setTab(value)}> + + + + } > - + + {tab === TAB_SYSTEM && ( +
+ +
+ )} + + {tab === TAB_SERVICES && ( +
+
+ )} +
); }; diff --git a/packages/console-app/src/containers/panels/apps/Apps.js b/packages/console-app/src/containers/panels/apps/Apps.js index c026ca0..bf5b6fd 100644 --- a/packages/console-app/src/containers/panels/apps/Apps.js +++ b/packages/console-app/src/containers/panels/apps/Apps.js @@ -11,8 +11,10 @@ import Panel from '../../../components/Panel'; import Toolbar from '../../../components/Toolbar'; import AppRecords from './AppRecords'; +import LogPoller from "../../../components/LogPoller"; const TAB_RECORDS = 'records'; +const TAB_LOG = 'log'; const useStyles = makeStyles(theme => ({ root: {} @@ -29,6 +31,7 @@ const Apps = () => { setTab(value)}> + } @@ -36,6 +39,10 @@ const Apps = () => { {tab === TAB_RECORDS && ( )} + + {tab === TAB_LOG && ( + + )}
); }; diff --git a/packages/console-app/src/containers/panels/bots/BotRecords.js b/packages/console-app/src/containers/panels/bots/BotRecords.js index fac62c1..9a8d90c 100644 --- a/packages/console-app/src/containers/panels/bots/BotRecords.js +++ b/packages/console-app/src/containers/panels/bots/BotRecords.js @@ -29,7 +29,7 @@ const AppRecords = () => { return null; } - const records = data.wns_records.json; + const records = JSON.parse(data.wns_records.json); return ( diff --git a/packages/console-app/src/containers/panels/ipfs/IPFS.js b/packages/console-app/src/containers/panels/ipfs/IPFS.js index 8334560..99a9388 100644 --- a/packages/console-app/src/containers/panels/ipfs/IPFS.js +++ b/packages/console-app/src/containers/panels/ipfs/IPFS.js @@ -3,122 +3,44 @@ // import React, { useState } from 'react'; -import get from 'lodash.get'; - -import { useQuery } from '@apollo/react-hooks'; import { makeStyles } from '@material-ui/core'; +import Paper from '@material-ui/core/Paper'; import Tab from '@material-ui/core/Tab'; import Tabs from '@material-ui/core/Tabs'; -import TableBody from '@material-ui/core/TableBody'; -import TableHead from '@material-ui/core/TableHead'; -import TableRow from '@material-ui/core/TableRow'; +import TabContext from '@material-ui/lab/TabContext'; -import IPFS_STATUS from '../../../gql/ipfs_status.graphql'; -import WNS_RECORDS from '../../../gql/wns_records.graphql'; - -import { useQueryStatusReducer } from '../../../hooks'; - -import Json from '../../../components/Json'; import Panel from '../../../components/Panel'; -import Table from '../../../components/Table'; -import TableCell from '../../../components/TableCell'; import Toolbar from '../../../components/Toolbar'; -import { BooleanIcon } from '../../../components/BooleanIcon'; -const RECORD_TYPE = 'wrn:service'; -const SERVICE_TYPE = 'ipfs'; - -const useStyles = makeStyles((theme) => ({ - tableContainer: { - flex: 1, - overflowY: 'scroll' - }, - - table: { - tableLayout: 'fixed', - - '& th': { - fontVariant: 'all-small-caps', - fontSize: 18, - cursor: 'ns-resize' - } - }, - - connected: { - fontWeight: 'bold' - }, - - disconnected: { - fontStyle: 'italic' - }, - - colShort: { - width: '30%' - }, - - colWide: {}, - - colBoolean: { - width: '10%' - }, - - caption: { - backgroundColor: theme.palette.primary[500], - color: theme.palette.primary.contrastText, - paddingLeft: '1em', - margin: 0 - } -})); +import LogPoller from '../../../components/LogPoller'; +import IPFSStatus from './IPFSStatus'; const TAB_STATUS = 'status'; const TAB_LOG = 'log'; +const TAB_SWARM_LOG = 'swarm'; + +const useStyles = makeStyles(() => ({ + expand: { + flex: 1 + }, + + panel: { + display: 'flex', + overflow: 'hidden', + flex: 1 + }, + + paper: { + display: 'flex', + overflow: 'hidden', + flex: 1 + } +})); const IPFS = () => { const classes = useStyles(); const [tab, setTab] = useState(TAB_STATUS); - const ipfsResponse = useQueryStatusReducer(useQuery(IPFS_STATUS)); - const wnsResponse = useQueryStatusReducer(useQuery(WNS_RECORDS, { - variables: { attributes: { type: RECORD_TYPE, service: SERVICE_TYPE } } - })); - - if (!wnsResponse || !ipfsResponse) { - return null; - } - - const ipfsData = JSON.parse(ipfsResponse.ipfs_status.json); - const registeredServers = JSON.parse(wnsResponse.wns_records.json); - - const displayServers = registeredServers.map((service) => { - console.error(service); - const addresses = get(service, 'attributes.ipfs.addresses'); - let connected = false; - for (const address of addresses) { - const parts = address.split('/'); - const nodeId = parts[parts.length - 1]; - connected = !!ipfsData.swarm.peers.find(({ peer }) => peer === nodeId); - if (connected) { - break; - } - } - - return { - name: get(service, 'name'), - version: get(service, 'version'), - description: get(service, 'attributes.description'), - ipfs: get(service, 'attributes.ipfs'), - connected - }; - }); - - displayServers.sort((a, b) => { - return a.connected && !b.connected ? -1 : b.connected && !a.connected ? 1 : b.name < a.name ? 1 : -1; - }); - - if (displayServers.length === 0) { - displayServers.push({ name: 'None' }); - } - return ( { setTab(value)}> + } > -

WNS-registered IPFS Servers

-
- - - Identifier - Description - Connected - Address - - - - {displayServers.map(({ name, description, ipfs, connected }) => ( - - {name} - {description} - - - - - {ipfs.addresses} - - - ))} - -
+ + {tab === TAB_STATUS && ( +
+ + + +
+ )} -

Local IPFS Server

- + {tab === TAB_LOG && ( +
+ +
+ )} + + {tab === TAB_SWARM_LOG && ( +
+ +
+ )} +
); }; diff --git a/packages/console-app/src/containers/panels/ipfs/IPFSStatus.js b/packages/console-app/src/containers/panels/ipfs/IPFSStatus.js new file mode 100644 index 0000000..9d851f9 --- /dev/null +++ b/packages/console-app/src/containers/panels/ipfs/IPFSStatus.js @@ -0,0 +1,165 @@ +// +// Copyright 2020 DxOS.org +// + +import React, { useState } from 'react'; +import get from 'lodash.get'; + +import { useQuery } from '@apollo/react-hooks'; +import { makeStyles } from '@material-ui/core'; +import Tab from '@material-ui/core/Tab'; +import Tabs from '@material-ui/core/Tabs'; +import TableBody from '@material-ui/core/TableBody'; +import TableHead from '@material-ui/core/TableHead'; +import TableRow from '@material-ui/core/TableRow'; + +import IPFS_STATUS from '../../../gql/ipfs_status.graphql'; +import WNS_RECORDS from '../../../gql/wns_records.graphql'; + +import { useQueryStatusReducer } from '../../../hooks'; + +import Json from '../../../components/Json'; +import Panel from '../../../components/Panel'; +import Table from '../../../components/Table'; +import TableCell from '../../../components/TableCell'; +import Toolbar from '../../../components/Toolbar'; +import { BooleanIcon } from '../../../components/BooleanIcon'; + +const RECORD_TYPE = 'wrn:service'; +const SERVICE_TYPE = 'ipfs'; + +const useStyles = makeStyles((theme) => ({ + tableContainer: { + flex: 1, + overflowY: 'scroll' + }, + + table: { + tableLayout: 'fixed', + + '& th': { + fontVariant: 'all-small-caps', + fontSize: 18, + cursor: 'ns-resize' + } + }, + + connected: { + fontWeight: 'bold' + }, + + disconnected: { + fontStyle: 'italic' + }, + + colShort: { + width: '30%' + }, + + colWide: {}, + + colBoolean: { + width: '10%' + }, + + caption: { + backgroundColor: theme.palette.primary[500], + color: theme.palette.primary.contrastText, + paddingLeft: '1em', + margin: 0 + } +})); + +const TAB_STATUS = 'status'; +const TAB_LOG_IPFS = 'log'; +const TAB_LOG_SWARM = 'connect log'; + +const IPFSStatus = () => { + const classes = useStyles(); + const [tab, setTab] = useState(TAB_STATUS); + + const ipfsResponse = useQueryStatusReducer(useQuery(IPFS_STATUS)); + const wnsResponse = useQueryStatusReducer(useQuery(WNS_RECORDS, { + variables: { attributes: { type: RECORD_TYPE, service: SERVICE_TYPE } } + })); + + if (!wnsResponse || !ipfsResponse) { + return null; + } + + const ipfsData = JSON.parse(ipfsResponse.ipfs_status.json); + const registeredServers = JSON.parse(wnsResponse.wns_records.json); + + const displayServers = registeredServers.map((service) => { + console.error(service); + const addresses = get(service, 'attributes.ipfs.addresses'); + let connected = false; + for (const address of addresses) { + const parts = address.split('/'); + const nodeId = parts[parts.length - 1]; + connected = !!ipfsData.swarm.peers.find(({ peer }) => peer === nodeId); + if (connected) { + break; + } + } + + return { + name: get(service, 'name'), + version: get(service, 'version'), + description: get(service, 'attributes.description'), + ipfs: get(service, 'attributes.ipfs'), + connected + }; + }); + + displayServers.sort((a, b) => { + return a.connected && !b.connected ? -1 : b.connected && !a.connected ? 1 : b.name < a.name ? 1 : -1; + }); + + if (displayServers.length === 0) { + displayServers.push({ name: 'None' }); + } + + return ( + +

WNS-registered IPFS Servers

+ + + + Identifier + Description + Connected + Address + + + + {displayServers.map(({ name, description, ipfs, connected }) => ( + + {name} + {description} + + + + + {ipfs.addresses} + + + ))} + +
+ +

Local IPFS Server

+ +
+ ); +}; + +export default IPFSStatus; diff --git a/packages/console-app/src/gql/system_status.graphql b/packages/console-app/src/gql/system_status.graphql index d22abba..4e2668a 100644 --- a/packages/console-app/src/gql/system_status.graphql +++ b/packages/console-app/src/gql/system_status.graphql @@ -8,3 +8,10 @@ query { json } } + +query { + service_status { + timestamp, + json + } +} diff --git a/packages/console-server/src/gql/api.graphql b/packages/console-server/src/gql/api.graphql index 31121b0..57d8838 100644 --- a/packages/console-server/src/gql/api.graphql +++ b/packages/console-server/src/gql/api.graphql @@ -17,6 +17,7 @@ type Query { app_status: JSONResult! ipfs_status: JSONResult! ipfs_swarm_status: JSONResult! + service_status: JSONResult! signal_status: JSONResult! system_status: JSONResult! wns_status: JSONResult! diff --git a/packages/console-server/src/resolvers/system.js b/packages/console-server/src/resolvers/system.js index cd86bbd..8200b01 100644 --- a/packages/console-server/src/resolvers/system.js +++ b/packages/console-server/src/resolvers/system.js @@ -6,6 +6,7 @@ import moment from 'moment'; import pick from 'lodash.pick'; import os from 'os'; import si from 'systeminformation'; +import { spawnSync } from "child_process"; const num = new Intl.NumberFormat('en', { maximumSignificantDigits: 3 }); @@ -77,6 +78,18 @@ const getSystemInfo = async () => { }; }; +/** + * Get system inforamtion. + * https://www.npmjs.com/package/systeminformation + */ +const getServiceInfo = async () => { + const command = 'wire'; + const args = ['service', '--json']; + + const child = spawnSync(command, args, { encoding: 'utf8' }); + return child.stdout; +} + export const systemResolvers = { Query: { system_status: async () => { @@ -86,6 +99,14 @@ export const systemResolvers = { timestamp: new Date().toUTCString(), json: JSON.stringify(system) }; - } + }, + service_status: async () => { + const serviceInfo = await getServiceInfo(); + + return { + timestamp: new Date().toUTCString(), + json: JSON.stringify(serviceInfo) + }; + }, } }; From a36c6cfee8d4492d079f436e1ef8d76e2915e47c Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Thu, 11 Jun 2020 01:25:46 -0500 Subject: [PATCH 10/12] Decode json. --- packages/console-app/src/components/LogPoller.js | 4 ++-- .../console-app/src/containers/panels/Status.js | 14 +++++++++----- .../console-app/src/containers/panels/apps/Apps.js | 2 +- .../src/containers/panels/ipfs/IPFSStatus.js | 12 ++---------- .../src/containers/panels/signal/Signaling.js | 2 +- .../console-app/src/containers/panels/wns/WNS.js | 2 +- .../console-app/src/gql/service_status.graphql | 10 ++++++++++ packages/console-app/src/gql/system_status.graphql | 7 ------- packages/console-app/src/version.json | 2 +- packages/console-server/src/resolvers/system.js | 2 +- 10 files changed, 28 insertions(+), 29 deletions(-) create mode 100644 packages/console-app/src/gql/service_status.graphql diff --git a/packages/console-app/src/components/LogPoller.js b/packages/console-app/src/components/LogPoller.js index 8af5958..d67d2f9 100644 --- a/packages/console-app/src/components/LogPoller.js +++ b/packages/console-app/src/components/LogPoller.js @@ -21,7 +21,7 @@ const getLogBuffer = (name) => { _logBuffers.set(name, buffer); } return buffer; -} +}; const LogPoller = ({ service }) => { const { config } = useContext(ConsoleContext); @@ -47,7 +47,7 @@ const LogPoller = ({ service }) => { } return ( - + ); }; diff --git a/packages/console-app/src/containers/panels/Status.js b/packages/console-app/src/containers/panels/Status.js index 1932ba8..9303d37 100644 --- a/packages/console-app/src/containers/panels/Status.js +++ b/packages/console-app/src/containers/panels/Status.js @@ -11,6 +11,7 @@ import TabContext from '@material-ui/lab/TabContext'; import Json from '../../components/Json'; +import SERVICE_STATUS from '../../gql/service_status.graphql'; import SYSTEM_STATUS from '../../gql/system_status.graphql'; import { ConsoleContext, useQueryStatusReducer } from '../../hooks'; @@ -44,19 +45,21 @@ const Status = () => { const { config } = useContext(ConsoleContext); const [tab, setTab] = useState(TAB_SYSTEM); const systemResponse = useQueryStatusReducer(useQuery(SYSTEM_STATUS, { pollInterval: config.api.intervalQuery })); - if (!systemResponse) { + const serviceResponse = useQueryStatusReducer(useQuery(SERVICE_STATUS, { pollInterval: config.api.intervalQuery })); + if (!systemResponse || !serviceResponse) { return null; } - const data = JSON.parse(systemResponse.system_status.json); + const systemData = JSON.parse(systemResponse.system_status.json); + const serviceData = JSON.parse(serviceResponse.service_status.json); return ( setTab(value)}> - - + + } @@ -64,12 +67,13 @@ const Status = () => { {tab === TAB_SYSTEM && (
- +
)} {tab === TAB_SERVICES && (
+
)}
diff --git a/packages/console-app/src/containers/panels/apps/Apps.js b/packages/console-app/src/containers/panels/apps/Apps.js index bf5b6fd..6675e99 100644 --- a/packages/console-app/src/containers/panels/apps/Apps.js +++ b/packages/console-app/src/containers/panels/apps/Apps.js @@ -11,7 +11,7 @@ import Panel from '../../../components/Panel'; import Toolbar from '../../../components/Toolbar'; import AppRecords from './AppRecords'; -import LogPoller from "../../../components/LogPoller"; +import LogPoller from '../../../components/LogPoller'; const TAB_RECORDS = 'records'; const TAB_LOG = 'log'; diff --git a/packages/console-app/src/containers/panels/ipfs/IPFSStatus.js b/packages/console-app/src/containers/panels/ipfs/IPFSStatus.js index 9d851f9..ec708d4 100644 --- a/packages/console-app/src/containers/panels/ipfs/IPFSStatus.js +++ b/packages/console-app/src/containers/panels/ipfs/IPFSStatus.js @@ -2,13 +2,11 @@ // Copyright 2020 DxOS.org // -import React, { useState } from 'react'; +import React from 'react'; import get from 'lodash.get'; import { useQuery } from '@apollo/react-hooks'; import { makeStyles } from '@material-ui/core'; -import Tab from '@material-ui/core/Tab'; -import Tabs from '@material-ui/core/Tabs'; import TableBody from '@material-ui/core/TableBody'; import TableHead from '@material-ui/core/TableHead'; import TableRow from '@material-ui/core/TableRow'; @@ -22,7 +20,6 @@ import Json from '../../../components/Json'; import Panel from '../../../components/Panel'; import Table from '../../../components/Table'; import TableCell from '../../../components/TableCell'; -import Toolbar from '../../../components/Toolbar'; import { BooleanIcon } from '../../../components/BooleanIcon'; const RECORD_TYPE = 'wrn:service'; @@ -70,13 +67,8 @@ const useStyles = makeStyles((theme) => ({ } })); -const TAB_STATUS = 'status'; -const TAB_LOG_IPFS = 'log'; -const TAB_LOG_SWARM = 'connect log'; - const IPFSStatus = () => { const classes = useStyles(); - const [tab, setTab] = useState(TAB_STATUS); const ipfsResponse = useQueryStatusReducer(useQuery(IPFS_STATUS)); const wnsResponse = useQueryStatusReducer(useQuery(WNS_RECORDS, { @@ -138,7 +130,7 @@ const IPFSStatus = () => { {name} {description} - + {ipfs.addresses} diff --git a/packages/console-app/src/containers/panels/signal/Signaling.js b/packages/console-app/src/containers/panels/signal/Signaling.js index 793b5c9..278d0c4 100644 --- a/packages/console-app/src/containers/panels/signal/Signaling.js +++ b/packages/console-app/src/containers/panels/signal/Signaling.js @@ -13,7 +13,7 @@ import Panel from '../../../components/Panel'; import Toolbar from '../../../components/Toolbar'; import SignalStatus from './SignalStatus'; -import LogPoller from "../../../components/LogPoller"; +import LogPoller from '../../../components/LogPoller'; const TAB_STATUS = 'status'; const TAB_LOG = 'log'; diff --git a/packages/console-app/src/containers/panels/wns/WNS.js b/packages/console-app/src/containers/panels/wns/WNS.js index 0c1a742..6d13354 100644 --- a/packages/console-app/src/containers/panels/wns/WNS.js +++ b/packages/console-app/src/containers/panels/wns/WNS.js @@ -9,7 +9,7 @@ import Tab from '@material-ui/core/Tab'; import Tabs from '@material-ui/core/Tabs'; import TabContext from '@material-ui/lab/TabContext'; -import LogPoller from "../../../components/LogPoller"; +import LogPoller from '../../../components/LogPoller'; import Panel from '../../../components/Panel'; import Toolbar from '../../../components/Toolbar'; diff --git a/packages/console-app/src/gql/service_status.graphql b/packages/console-app/src/gql/service_status.graphql new file mode 100644 index 0000000..1abae0e --- /dev/null +++ b/packages/console-app/src/gql/service_status.graphql @@ -0,0 +1,10 @@ +# +# Copyright 2020 DxOS.org +# + +query { + service_status { + timestamp, + json + } +} diff --git a/packages/console-app/src/gql/system_status.graphql b/packages/console-app/src/gql/system_status.graphql index 4e2668a..d22abba 100644 --- a/packages/console-app/src/gql/system_status.graphql +++ b/packages/console-app/src/gql/system_status.graphql @@ -8,10 +8,3 @@ query { json } } - -query { - service_status { - timestamp, - json - } -} diff --git a/packages/console-app/src/version.json b/packages/console-app/src/version.json index 618f306..a7f299b 100644 --- a/packages/console-app/src/version.json +++ b/packages/console-app/src/version.json @@ -1,7 +1,7 @@ { "build": { "name": "@dxos/console-app", - "buildDate": "2020-06-11T05:01:31.306Z", + "buildDate": "2020-06-11T06:21:53.153Z", "version": "1.0.0-beta.0" } } diff --git a/packages/console-server/src/resolvers/system.js b/packages/console-server/src/resolvers/system.js index 8200b01..2d03546 100644 --- a/packages/console-server/src/resolvers/system.js +++ b/packages/console-server/src/resolvers/system.js @@ -87,7 +87,7 @@ const getServiceInfo = async () => { const args = ['service', '--json']; const child = spawnSync(command, args, { encoding: 'utf8' }); - return child.stdout; + return JSON.parse(child.stdout); } export const systemResolvers = { From fecda21c1ae612f7a32164d9e3aebcf579cb0006 Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Thu, 11 Jun 2020 01:29:05 -0500 Subject: [PATCH 11/12] Reset config. --- packages/console-app/config.yml | 19 ++++++++++--------- packages/console-server/config.yml | 19 +++++++++++-------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/packages/console-app/config.yml b/packages/console-app/config.yml index b34222e..150b1c4 100644 --- a/packages/console-app/config.yml +++ b/packages/console-app/config.yml @@ -12,7 +12,7 @@ app: api: path: '/api' - port: 4004 + port: 4000 intervalLog: 5000 pollInterval: 10000 @@ -22,19 +22,20 @@ system: services: app: prefix: '/app' - server: 'https://xbox.local' + server: 'http://127.0.0.1:5999' wns: - server: 'https://xbox.local/dxos/wns/api' - webui: 'https://xbox.local/dxos/wns/webui' + server: 'http://127.0.0.1:9473/api' + webui: 'http://127.0.0.1:9473/webui' signal: - server: 'wss://xbox.local/dxos/signal' - api: 'https://xbox.local/dxos/signal/' + server: 'http://127.0.0.1:4000' + api: 'http://127.0.0.1:4000' ipfs: - server: 'https://xbox.local/dxos/ipfs/api' - gateway: 'https://xbox.local/dxos/ipfs/gateway' + server: '/ip4/127.0.0.1/tcp/5001' + gateway: '/ip4//127.0.0.1:8888/ipfs/' + webui: 'http://127.0.0.1:5001/webui' wellknown: - endpoint: 'https://xbox.local/.well-known/dxos' + endpoint: 'http://127.0.0.1:9000/.well-known/dxos' diff --git a/packages/console-server/config.yml b/packages/console-server/config.yml index 85be7a6..ac97bae 100644 --- a/packages/console-server/config.yml +++ b/packages/console-server/config.yml @@ -3,6 +3,8 @@ # NOTE: Set CONFIG_FILE to swap out this config file. # +# TODO(burdon): Set defaults. + app: title: 'Console' org': 'DxOS' @@ -22,19 +24,20 @@ system: services: app: prefix: '/app' - server: 'https://xbox.local' + server: 'http://127.0.0.1:5999' wns: - server: 'https://xbox.local/dxos/wns/api' - webui: 'https://xbox.local/dxos/wns/webui' + server: 'https://node1.dxos.network/wns/api' + webui: 'https://node1.dxos.network/wns/webui' signal: - server: 'wss://xbox.local/dxos/signal' - api: 'https://xbox.local/dxos/signal/' + server: 'http://127.0.0.1:4000' + api: 'http://127.0.0.1:4000' ipfs: - server: 'https://xbox.local/dxos/ipfs/api' - gateway: 'https://xbox.local/dxos/ipfs/gateway' + server: '/ip4/127.0.0.1/tcp/5001' + gateway: '/ip4//127.0.0.1:8888/ipfs/' + webui: 'http://127.0.0.1:5001/webui' wellknown: - endpoint: 'https://xbox.local/.well-known/dxos' + endpoint: 'http://127.0.0.1:9000/.well-known/dxos' From 2201dccd8238531551baac9cb554af77f0f4e635 Mon Sep 17 00:00:00 2001 From: Thomas E Lackey Date: Thu, 11 Jun 2020 01:30:39 -0500 Subject: [PATCH 12/12] Fix route name --- packages/console-app/src/containers/Main.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/console-app/src/containers/Main.js b/packages/console-app/src/containers/Main.js index d2695ee..688d7d1 100644 --- a/packages/console-app/src/containers/Main.js +++ b/packages/console-app/src/containers/Main.js @@ -22,7 +22,7 @@ import ConsoleContextProvider from './ConsoleContextProvider'; import AppRecords from './panels/apps/Apps'; import Bots from './panels/bots/Bots'; import Config from './panels/Config'; -import IPFSStatus from './panels/ipfs/IPFS'; +import IPFS from './panels/ipfs/IPFS'; import Metadata from './panels/Metadata'; import Signaling from './panels/signal/Signaling'; import Status from './panels/Status'; @@ -49,7 +49,7 @@ const Main = ({ config }) => { - +