From efae1e7e6cdea46687f901c8609fa3a33b7920b9 Mon Sep 17 00:00:00 2001 From: Matt Hill Date: Fri, 2 Jun 2023 14:28:00 -0600 Subject: [PATCH] add Tor logs to UI --- .../app/app/preloader/preloader.component.ts | 1 - .../server-routes/server-routing.module.ts | 5 ++++ .../server-show/server-show.page.ts | 13 +++++++++- .../server-routes/tor-logs/tor-logs.module.ts | 24 +++++++++++++++++++ .../server-routes/tor-logs/tor-logs.page.html | 8 +++++++ .../server-routes/tor-logs/tor-logs.page.scss | 0 .../server-routes/tor-logs/tor-logs.page.ts | 24 +++++++++++++++++++ .../app/services/api/embassy-api.service.ts | 6 +++++ .../services/api/embassy-live-api.service.ts | 10 ++++++++ .../services/api/embassy-mock-api.service.ts | 21 ++++++++++++++++ 10 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 frontend/projects/ui/src/app/pages/server-routes/tor-logs/tor-logs.module.ts create mode 100644 frontend/projects/ui/src/app/pages/server-routes/tor-logs/tor-logs.page.html create mode 100644 frontend/projects/ui/src/app/pages/server-routes/tor-logs/tor-logs.page.scss create mode 100644 frontend/projects/ui/src/app/pages/server-routes/tor-logs/tor-logs.page.ts diff --git a/frontend/projects/ui/src/app/app/preloader/preloader.component.ts b/frontend/projects/ui/src/app/app/preloader/preloader.component.ts index d12f4743d..53cd4db10 100644 --- a/frontend/projects/ui/src/app/app/preloader/preloader.component.ts +++ b/frontend/projects/ui/src/app/app/preloader/preloader.component.ts @@ -54,7 +54,6 @@ const ICONS = [ 'mail-outline', 'map-outline', 'medkit-outline', - 'newspaper-outline', 'notifications-outline', 'open-outline', 'options-outline', diff --git a/frontend/projects/ui/src/app/pages/server-routes/server-routing.module.ts b/frontend/projects/ui/src/app/pages/server-routes/server-routing.module.ts index 14f55f682..c6afcbdf2 100644 --- a/frontend/projects/ui/src/app/pages/server-routes/server-routing.module.ts +++ b/frontend/projects/ui/src/app/pages/server-routes/server-routing.module.ts @@ -34,6 +34,11 @@ const routes: Routes = [ m => m.KernelLogsPageModule, ), }, + { + path: 'tor-logs', + loadChildren: () => + import('./tor-logs/tor-logs.module').then(m => m.TorLogsPageModule), + }, { path: 'metrics', loadChildren: () => diff --git a/frontend/projects/ui/src/app/pages/server-routes/server-show/server-show.page.ts b/frontend/projects/ui/src/app/pages/server-routes/server-show/server-show.page.ts index bdadd9e69..2e6287b50 100644 --- a/frontend/projects/ui/src/app/pages/server-routes/server-show/server-show.page.ts +++ b/frontend/projects/ui/src/app/pages/server-routes/server-show/server-show.page.ts @@ -470,7 +470,7 @@ export class ServerShowPage { { title: 'OS Logs', description: 'Raw, unfiltered operating system logs', - icon: 'newspaper-outline', + icon: 'receipt-outline', action: () => this.navCtrl.navigateForward(['logs'], { relativeTo: this.route }), detail: true, @@ -488,6 +488,17 @@ export class ServerShowPage { detail: true, disabled$: of(false), }, + { + title: 'Tor Logs', + description: 'Diagnostic log stream for the Tor daemon on StartOS', + icon: 'receipt-outline', + action: () => + this.navCtrl.navigateForward(['tor-logs'], { + relativeTo: this.route, + }), + detail: true, + disabled$: of(false), + }, ], Support: [ { diff --git a/frontend/projects/ui/src/app/pages/server-routes/tor-logs/tor-logs.module.ts b/frontend/projects/ui/src/app/pages/server-routes/tor-logs/tor-logs.module.ts new file mode 100644 index 000000000..38be1f73d --- /dev/null +++ b/frontend/projects/ui/src/app/pages/server-routes/tor-logs/tor-logs.module.ts @@ -0,0 +1,24 @@ +import { NgModule } from '@angular/core' +import { CommonModule } from '@angular/common' +import { Routes, RouterModule } from '@angular/router' +import { IonicModule } from '@ionic/angular' +import { TorLogsPage } from './tor-logs.page' +import { LogsComponentModule } from 'src/app/components/logs/logs.component.module' + +const routes: Routes = [ + { + path: '', + component: TorLogsPage, + }, +] + +@NgModule({ + imports: [ + CommonModule, + IonicModule, + RouterModule.forChild(routes), + LogsComponentModule, + ], + declarations: [TorLogsPage], +}) +export class TorLogsPageModule {} diff --git a/frontend/projects/ui/src/app/pages/server-routes/tor-logs/tor-logs.page.html b/frontend/projects/ui/src/app/pages/server-routes/tor-logs/tor-logs.page.html new file mode 100644 index 000000000..43fb6ff18 --- /dev/null +++ b/frontend/projects/ui/src/app/pages/server-routes/tor-logs/tor-logs.page.html @@ -0,0 +1,8 @@ + diff --git a/frontend/projects/ui/src/app/pages/server-routes/tor-logs/tor-logs.page.scss b/frontend/projects/ui/src/app/pages/server-routes/tor-logs/tor-logs.page.scss new file mode 100644 index 000000000..e69de29bb diff --git a/frontend/projects/ui/src/app/pages/server-routes/tor-logs/tor-logs.page.ts b/frontend/projects/ui/src/app/pages/server-routes/tor-logs/tor-logs.page.ts new file mode 100644 index 000000000..4fc304715 --- /dev/null +++ b/frontend/projects/ui/src/app/pages/server-routes/tor-logs/tor-logs.page.ts @@ -0,0 +1,24 @@ +import { Component } from '@angular/core' +import { RR } from 'src/app/services/api/api.types' +import { ApiService } from 'src/app/services/api/embassy-api.service' + +@Component({ + selector: 'tor-logs', + templateUrl: './tor-logs.page.html', + styleUrls: ['./tor-logs.page.scss'], +}) +export class TorLogsPage { + constructor(private readonly api: ApiService) {} + + followLogs() { + return async (params: RR.FollowServerLogsReq) => { + return this.api.followTorLogs(params) + } + } + + fetchLogs() { + return async (params: RR.GetServerLogsReq) => { + return this.api.getTorLogs(params) + } + } +} diff --git a/frontend/projects/ui/src/app/services/api/embassy-api.service.ts b/frontend/projects/ui/src/app/services/api/embassy-api.service.ts index 0a729a133..4f159aa48 100644 --- a/frontend/projects/ui/src/app/services/api/embassy-api.service.ts +++ b/frontend/projects/ui/src/app/services/api/embassy-api.service.ts @@ -73,6 +73,8 @@ export abstract class ApiService { params: RR.GetServerLogsReq, ): Promise + abstract getTorLogs(params: RR.GetServerLogsReq): Promise + abstract followServerLogs( params: RR.FollowServerLogsReq, ): Promise @@ -81,6 +83,10 @@ export abstract class ApiService { params: RR.FollowServerLogsReq, ): Promise + abstract followTorLogs( + params: RR.FollowServerLogsReq, + ): Promise + abstract getServerMetrics( params: RR.GetServerMetricsReq, ): Promise diff --git a/frontend/projects/ui/src/app/services/api/embassy-live-api.service.ts b/frontend/projects/ui/src/app/services/api/embassy-live-api.service.ts index 5150cddd1..5a91d45d6 100644 --- a/frontend/projects/ui/src/app/services/api/embassy-live-api.service.ts +++ b/frontend/projects/ui/src/app/services/api/embassy-live-api.service.ts @@ -135,6 +135,10 @@ export class LiveApiService extends ApiService { return this.rpcRequest({ method: 'server.kernel-logs', params }) } + async getTorLogs(params: RR.GetServerLogsReq): Promise { + return this.rpcRequest({ method: 'server.tor-logs', params }) + } + async followServerLogs( params: RR.FollowServerLogsReq, ): Promise { @@ -147,6 +151,12 @@ export class LiveApiService extends ApiService { return this.rpcRequest({ method: 'server.kernel-logs.follow', params }) } + async followTorLogs( + params: RR.FollowServerLogsReq, + ): Promise { + return this.rpcRequest({ method: 'server.tor-logs.follow', params }) + } + async getServerMetrics( params: RR.GetServerMetricsReq, ): Promise { diff --git a/frontend/projects/ui/src/app/services/api/embassy-mock-api.service.ts b/frontend/projects/ui/src/app/services/api/embassy-mock-api.service.ts index 18c0c41ac..59a2934a9 100644 --- a/frontend/projects/ui/src/app/services/api/embassy-mock-api.service.ts +++ b/frontend/projects/ui/src/app/services/api/embassy-mock-api.service.ts @@ -211,6 +211,17 @@ export class MockApiService extends ApiService { } } + async getTorLogs(params: RR.GetServerLogsReq): Promise { + await pauseFor(2000) + const entries = this.randomLogs(params.limit) + + return { + entries, + 'start-cursor': 'startCursor', + 'end-cursor': 'endCursor', + } + } + async followServerLogs( params: RR.FollowServerLogsReq, ): Promise { @@ -231,6 +242,16 @@ export class MockApiService extends ApiService { } } + async followTorLogs( + params: RR.FollowServerLogsReq, + ): Promise { + await pauseFor(2000) + return { + 'start-cursor': 'start-cursor', + guid: '7251d5be-645f-4362-a51b-3a85be92b31e', + } + } + randomLogs(limit = 1): Log[] { const arrLength = Math.ceil(limit / Mock.ServerLogs.length) const logs = new Array(arrLength)