diff --git a/packages/platform/lang/cs.json b/packages/platform/lang/cs.json index e925520890..99180e80bd 100644 --- a/packages/platform/lang/cs.json +++ b/packages/platform/lang/cs.json @@ -9,7 +9,8 @@ "Unauthorized": "Neoprávněný přístup", "UnknownMethod": "Neznámá metoda: {method}", "InternalServerError": "Interní chyba serveru", - "MaintenanceWarning": "Plánovaná údržba za {time, plural, =1 {méně než minutu} other {# minut}}", + "MaintenanceWarning": "Plánovaná údržba za", + "MaintenanceWarningTime": "{time, plural, =1 {méně než minutu} other {# minut}}", "AccountNotFound": "Účet nenalezen", "AccountNotConfirmed": "Účet není potvrzen", "WorkspaceNotFound": "Pracovní prostor nenalezen", diff --git a/packages/platform/lang/de.json b/packages/platform/lang/de.json index 6bdc47b83e..6b9c6c428b 100644 --- a/packages/platform/lang/de.json +++ b/packages/platform/lang/de.json @@ -9,7 +9,8 @@ "Unauthorized": "Nicht autorisiert", "UnknownMethod": "Unbekannte Methode: {method}", "InternalServerError": "Interner Serverfehler", - "MaintenanceWarning": "Wartung geplant in {time, plural, =1 {weniger als einer Minute} other {# Minuten}}", + "MaintenanceWarning": "Wartung geplant in", + "MaintenanceWarningTime": "{time, plural, =1 {weniger als einer Minute} other {# Minuten}}", "AccountNotFound": "Konto nicht gefunden", "AccountNotConfirmed": "Konto nicht bestätigt", "WorkspaceNotFound": "Arbeitsbereich nicht gefunden", diff --git a/packages/platform/lang/en.json b/packages/platform/lang/en.json index 805fad7bea..a9a3d6b9ac 100644 --- a/packages/platform/lang/en.json +++ b/packages/platform/lang/en.json @@ -9,7 +9,8 @@ "Unauthorized": "Unauthorized", "UnknownMethod": "Unknown method: {method}", "InternalServerError": "Internal server error", - "MaintenanceWarning": "Maintenance Scheduled in {time, plural, =1 {less than a minute} other {# minutes}}", + "MaintenanceWarning": "Maintenance Scheduled in", + "MaintenanceWarningTime": "{time, plural, =1 {less than a minute} other {# minutes}}", "AccountNotFound": "Account not found or the provided credentials are incorrect", "AccountNotConfirmed": "Account not confirmed", "WorkspaceNotFound": "Workspace not found", diff --git a/packages/platform/lang/es.json b/packages/platform/lang/es.json index f59fd9fd91..df47d4bc95 100644 --- a/packages/platform/lang/es.json +++ b/packages/platform/lang/es.json @@ -9,7 +9,8 @@ "Unauthorized": "No autorizado", "UnknownMethod": "Método desconocido: {method}", "InternalServerError": "Error interno del servidor", - "MaintenanceWarning": "Mantenimiento programado dentro de {time, plural, =1 {menos de un minuto} other {# minutos}}", + "MaintenanceWarning": "Mantenimiento programado dentro de", + "MaintenanceWarningTime": "{time, plural, =1 {menos de un minuto} other {# minutos}}", "AccountNotFound": "Cuenta no encontrada", "AccountNotConfirmed": "Cuenta no confirmada", "WorkspaceNotFound": "Espacio de trabajo no encontrado", diff --git a/packages/platform/lang/fr.json b/packages/platform/lang/fr.json index 5eb2ca3f74..6534bd4e00 100644 --- a/packages/platform/lang/fr.json +++ b/packages/platform/lang/fr.json @@ -9,7 +9,8 @@ "Unauthorized": "Non autorisé", "UnknownMethod": "Méthode inconnue : {method}", "InternalServerError": "Erreur interne du serveur", - "MaintenanceWarning": "Maintenance prévue dans {time, plural, =1 {moins d'une minute} other {# minutes}}", + "MaintenanceWarning": "Maintenance prévue dans", + "MaintenanceWarningTime": "{time, plural, =1 {moins d'une minute} other {# minutes}}", "AccountNotFound": "Compte non trouvé", "AccountNotConfirmed": "Compte non confirmé", "WorkspaceNotFound": "Espace de travail non trouvé", diff --git a/packages/platform/lang/it.json b/packages/platform/lang/it.json index 94c88a0261..242b96d4b4 100644 --- a/packages/platform/lang/it.json +++ b/packages/platform/lang/it.json @@ -9,7 +9,8 @@ "Unauthorized": "Non autorizzato", "UnknownMethod": "Metodo sconosciuto: {method}", "InternalServerError": "Errore interno del server", - "MaintenanceWarning": "Manutenzione programmata tra {time, plural, =1 {meno di un minuto} other {# minuti}}", + "MaintenanceWarning": "Manutenzione programmata tra", + "MaintenanceWarningTime": "{time, plural, =1 {meno di un minuto} other {# minuti}}", "AccountNotFound": "Account non trovato", "AccountNotConfirmed": "Account non confermato", "WorkspaceNotFound": "Spazio di lavoro non trovato", diff --git a/packages/platform/lang/ja.json b/packages/platform/lang/ja.json index 3fdf10dbd6..3b17f1ecd4 100644 --- a/packages/platform/lang/ja.json +++ b/packages/platform/lang/ja.json @@ -9,7 +9,8 @@ "Unauthorized": "認証されていません", "UnknownMethod": "不明なメソッド: {method}", "InternalServerError": "サーバー内部エラー", - "MaintenanceWarning": "{time, plural, =1 {1分以内に} other {#分後に}}メンテナンスが予定されています", + "MaintenanceWarning": "メンテナンスが予定されています", + "MaintenanceWarningTime": "{time, plural, =1 {1分以内に} other {#分後に}}", "AccountNotFound": "アカウントが見つからないか、認証情報が間違っています", "AccountNotConfirmed": "アカウントが確認されていません", "WorkspaceNotFound": "ワークスペースが見つかりません", diff --git a/packages/platform/lang/pt.json b/packages/platform/lang/pt.json index 0b270f01b9..427e7b2862 100644 --- a/packages/platform/lang/pt.json +++ b/packages/platform/lang/pt.json @@ -9,7 +9,8 @@ "Unauthorized": "Não autorizado", "UnknownMethod": "Método desconhecido: {method}", "InternalServerError": "Erro interno do servidor", - "MaintenanceWarning": "Manutenção programada dentro de {time, plural, =1 {menos de um minuto} other {# minutos}}", + "MaintenanceWarning": "Manutenção programada dentro de", + "MaintenanceWarningTime": "{time, plural, =1 {menos de um minuto} other {# minutos}}", "AccountNotFound": "Conta não encontrada", "AccountNotConfirmed": "Conta não confirmada", "WorkspaceNotFound": "Espaço de trabalho não encontrado", diff --git a/packages/platform/lang/ru.json b/packages/platform/lang/ru.json index 3517bbe522..1dcd77926c 100644 --- a/packages/platform/lang/ru.json +++ b/packages/platform/lang/ru.json @@ -9,7 +9,8 @@ "Unauthorized": "Неавторизован", "UnknownMethod": "Неизвестный метод: {method}", "InternalServerError": "Внутренняя ошибка сервера", - "MaintenanceWarning": "Серверные работы запланированы через {time, plural, one {# минуту} few {# минуты} other {# минут}}", + "MaintenanceWarning": "Серверные работы запланированы через", + "MaintenanceWarningTime": "{time, plural, one {# минуту} few {# минуты} other {# минут}}", "AccountNotFound": "Аккаунт не найден", "AccountNotConfirmed": "Аккаунт не подтвержден", "WorkspaceNotFound": "Рабочее пространство не найдено", diff --git a/packages/platform/lang/zh.json b/packages/platform/lang/zh.json index f1f064bcd9..28ec0c305d 100644 --- a/packages/platform/lang/zh.json +++ b/packages/platform/lang/zh.json @@ -9,7 +9,8 @@ "Unauthorized": "未授权", "UnknownMethod": "未知方法: {method}", "InternalServerError": "内部服务器错误", - "MaintenanceWarning": "计划在 {time, plural, =1 {不到一分钟} other {# 分钟}} 内进行维护", + "MaintenanceWarning": "计划在 内进行维护 ", + "MaintenanceWarningTime": "{time, plural, =1 {不到一分钟} other {# 分钟}}", "AccountNotFound": "账户未找到", "AccountNotConfirmed": "账户未确认", "WorkspaceNotFound": "工作区未找到", diff --git a/packages/platform/src/platform.ts b/packages/platform/src/platform.ts index 3ce5ebb814..37d2690a93 100644 --- a/packages/platform/src/platform.ts +++ b/packages/platform/src/platform.ts @@ -144,7 +144,8 @@ export default plugin(platformId, { ExpiredLink: '' as StatusCode, UnknownMethod: '' as StatusCode<{ method: string }>, InternalServerError: '' as StatusCode, - MaintenanceWarning: '' as StatusCode<{ time: number }>, + MaintenanceWarning: '' as StatusCode<{ time: number, message?: string }>, + MaintenanceWarningTime: '' as IntlString, AccountNotFound: '' as StatusCode<{ account?: string }>, AccountMismatch: '' as StatusCode<{ account?: string, requiredAccount?: string }>, AccountNotConfirmed: '' as StatusCode, diff --git a/packages/ui/src/components/internal/Root.svelte b/packages/ui/src/components/internal/Root.svelte index 58f6048c2e..c15e12382b 100644 --- a/packages/ui/src/components/internal/Root.svelte +++ b/packages/ui/src/components/internal/Root.svelte @@ -97,10 +97,12 @@ let readonlyAccount = false let systemAccount = false let maintenanceTime = -1 + let maintenanceMessage: string | undefined addEventListener(PlatformEvent, async (_event, _status: Status) => { if (_status.code === platform.status.MaintenanceWarning) { maintenanceTime = _status.params.time + maintenanceMessage = _status.params.message } else { if (readonlyAccount) return if (_status.code === platform.status.ReadOnlyAccount) { @@ -242,7 +244,12 @@ > {#if maintenanceTime > 0}
0}> -
{:else if status.severity !== Severity.OK} diff --git a/plugins/client-resources/src/index.ts b/plugins/client-resources/src/index.ts index 0c88df268f..5e7cea3ecb 100644 --- a/plugins/client-resources/src/index.ts +++ b/plugins/client-resources/src/index.ts @@ -112,7 +112,8 @@ export default async () => { if (event.event === WorkspaceEvent.MaintenanceNotification) { void setPlatformStatus( new Status(Severity.WARNING, platform.status.MaintenanceWarning, { - time: event.params.timeMinutes + time: event.params.timeMinutes, + message: event.params.message ?? '' }) ) } diff --git a/plugins/workbench-resources/src/components/ServerManagerGeneral.svelte b/plugins/workbench-resources/src/components/ServerManagerGeneral.svelte index 53f709db1f..fe66490b24 100644 --- a/plugins/workbench-resources/src/components/ServerManagerGeneral.svelte +++ b/plugins/workbench-resources/src/components/ServerManagerGeneral.svelte @@ -139,27 +139,38 @@ } $: update($ticker) + + let maintenanceMessage = 'A new version is planned to be installed in' {#if isAdminUser()}
1.
-
min diff --git a/pods/server/src/server_http.ts b/pods/server/src/server_http.ts index 4a092bf830..aae3efc569 100644 --- a/pods/server/src/server_http.ts +++ b/pods/server/src/server_http.ts @@ -205,6 +205,7 @@ export function startHttpServer ( try { const token = (req.query.token as string) ?? (req.headers.authorization ?? '').split(' ')[1] const payload = decodeToken(token) + if (payload.extra?.admin !== 'true' && payload.account !== systemAccountUuid) { console.warn('Non admin attempt to maintenance action', { payload }) res.writeHead(404, {}) @@ -216,11 +217,13 @@ export function startHttpServer ( switch (operation) { case 'maintenance': { - const timeMinutes = parseInt((req.query.timeout as string) ?? '5') - sessions.scheduleMaintenance(timeMinutes) + void retrieveJson(req).then((message) => { + const timeMinutes = parseInt((req.query.timeout as string) ?? '5') + sessions.scheduleMaintenance(timeMinutes, message) - res.writeHead(200) - res.end() + res.writeHead(200) + res.end() + }) return } case 'wipe-statistics': { diff --git a/server/account-service/src/index.ts b/server/account-service/src/index.ts index c439ac065a..0611617bc6 100644 --- a/server/account-service/src/index.ts +++ b/server/account-service/src/index.ts @@ -312,8 +312,13 @@ export function serveAccount (measureCtx: MeasureContext, brandings: BrandingMap const transactors = getAllTransactors(EndpointKind.Internal) for (const tr of transactors) { const serverEndpoint = tr.replaceAll('wss://', 'https://').replace('ws://', 'http://') + const jsonBody = JSON.stringify(req.request.body as any) await fetch(serverEndpoint + `/api/v1/manage?token=${token}&operation=maintenance&timeout=${timeMinutes}`, { - method: 'PUT' + method: 'PUT', + body: jsonBody, + headers: { + 'Content-Type': 'application/json;charset=utf-8' + } }) } diff --git a/server/core/src/types.ts b/server/core/src/types.ts index dc3b127eca..5c3ae9cea5 100644 --- a/server/core/src/types.ts +++ b/server/core/src/types.ts @@ -729,7 +729,7 @@ export interface SessionManager { closeWorkspaces: (ctx: MeasureContext) => Promise - scheduleMaintenance: (timeMinutes: number) => void + scheduleMaintenance: (timeMinutes: number, message?: string) => void profiling?: { start: () => void diff --git a/server/server/src/sessionManager.ts b/server/server/src/sessionManager.ts index 88c98de699..08ba0c147d 100644 --- a/server/server/src/sessionManager.ts +++ b/server/server/src/sessionManager.ts @@ -109,6 +109,7 @@ export class TSessionManager implements SessionManager { maintenanceTimer: any timeMinutes = 0 + maintenanceMessage?: string modelVersion = process.env.MODEL_VERSION ?? '' serverVersion = process.env.VERSION ?? '' @@ -146,8 +147,9 @@ export class TSessionManager implements SessionManager { this.ticksContext = ctx.newChild('ticks', {}) } - scheduleMaintenance (timeMinutes: number): void { + scheduleMaintenance (timeMinutes: number, message?: string): void { this.timeMinutes = timeMinutes + this.maintenanceMessage = message this.sendMaintenanceWarning() @@ -190,7 +192,8 @@ export class TSessionManager implements SessionManager { space: core.space.DerivedTx, createdBy: core.account.System, params: { - timeMinutes: this.timeMinutes + timeMinutes: this.timeMinutes, + message: this.maintenanceMessage } } } @@ -306,7 +309,7 @@ export class TSessionManager implements SessionManager { wsId, total: s.session.requests.size, user: s.session.getUser(), - ...cutObjectArray(r.params) + params: cutObjectArray(r.params) }) } }