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)