mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-03-27 02:41:53 +00:00
104 lines
2.5 KiB
TypeScript
104 lines
2.5 KiB
TypeScript
import { inject, Injectable } from '@angular/core'
|
|
import { T } from '@start9labs/start-sdk'
|
|
import { ApiService } from './api.service'
|
|
|
|
export type SetupType = 'fresh' | 'restore' | 'attach' | 'transfer'
|
|
|
|
export type RecoverySource =
|
|
| {
|
|
type: 'migrate'
|
|
guid: string
|
|
}
|
|
| {
|
|
type: 'backup'
|
|
target:
|
|
| { type: 'disk'; logicalname: string }
|
|
| {
|
|
type: 'cifs'
|
|
hostname: string
|
|
path: string
|
|
username: string
|
|
password: string | null
|
|
}
|
|
serverId: string
|
|
password: string // plaintext, will be encrypted before sending
|
|
}
|
|
|
|
@Injectable({
|
|
providedIn: 'root',
|
|
})
|
|
export class StateService {
|
|
private readonly api = inject(ApiService)
|
|
|
|
// Determined at app init
|
|
kiosk = false
|
|
|
|
// Set during install flow, or loaded from status response
|
|
language = ''
|
|
keyboard = ''
|
|
|
|
// From install response or status response (incomplete)
|
|
dataDriveGuid = ''
|
|
attach = false
|
|
|
|
// Set during setup flow
|
|
setupType?: SetupType
|
|
recoverySource?: RecoverySource
|
|
|
|
/**
|
|
* Called for attach flow (existing data drive)
|
|
*/
|
|
async attachDrive(password: string | null): Promise<void> {
|
|
await this.api.attach({
|
|
guid: this.dataDriveGuid,
|
|
password: password ? await this.api.encrypt(password) : null,
|
|
})
|
|
}
|
|
|
|
/**
|
|
* Called for fresh, restore, and transfer flows
|
|
* Password is required for fresh, optional for restore/transfer
|
|
*/
|
|
async executeSetup(
|
|
password: string | null,
|
|
name: string,
|
|
hostname: string,
|
|
): Promise<void> {
|
|
let recoverySource: T.RecoverySource<T.EncryptedWire> | null = null
|
|
|
|
if (this.recoverySource) {
|
|
if (this.recoverySource.type === 'migrate') {
|
|
recoverySource = this.recoverySource
|
|
} else {
|
|
// backup type - need to encrypt the backup password
|
|
recoverySource = {
|
|
type: 'backup',
|
|
target: this.recoverySource.target,
|
|
serverId: this.recoverySource.serverId,
|
|
password: await this.api.encrypt(this.recoverySource.password),
|
|
}
|
|
}
|
|
}
|
|
|
|
await this.api.execute({
|
|
guid: this.dataDriveGuid,
|
|
password: password ? await this.api.encrypt(password) : null,
|
|
name,
|
|
hostname,
|
|
recoverySource,
|
|
})
|
|
}
|
|
|
|
/**
|
|
* Reset state for a fresh start
|
|
*/
|
|
reset(): void {
|
|
this.language = ''
|
|
this.keyboard = ''
|
|
this.dataDriveGuid = ''
|
|
this.attach = false
|
|
this.setupType = undefined
|
|
this.recoverySource = undefined
|
|
}
|
|
}
|