Skip to content

Commit 860327b

Browse files
authored
chore: always return local version if update check fails (#485)
1 parent 66fbda8 commit 860327b

File tree

4 files changed

+51
-35
lines changed

4 files changed

+51
-35
lines changed

jsonrpc.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,8 +266,13 @@ func rpcSetDevChannelState(enabled bool) error {
266266
func rpcGetUpdateStatus() (*UpdateStatus, error) {
267267
includePreRelease := config.IncludePreRelease
268268
updateStatus, err := GetUpdateStatus(context.Background(), GetDeviceID(), includePreRelease)
269+
// to ensure backwards compatibility,
270+
// if there's an error, we won't return an error, but we will set the error field
269271
if err != nil {
270-
return nil, fmt.Errorf("error checking for updates: %w", err)
272+
if updateStatus == nil {
273+
return nil, fmt.Errorf("error checking for updates: %w", err)
274+
}
275+
updateStatus.Error = err.Error()
271276
}
272277

273278
return updateStatus, nil

ota.go

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ type UpdateStatus struct {
4141
Remote *UpdateMetadata `json:"remote"`
4242
SystemUpdateAvailable bool `json:"systemUpdateAvailable"`
4343
AppUpdateAvailable bool `json:"appUpdateAvailable"`
44+
45+
// for backwards compatibility
46+
Error string `json:"error,omitempty"`
4447
}
4548

4649
const UpdateMetadataUrl = "https://api.jetkvm.com/releases"
@@ -489,52 +492,47 @@ func TryUpdate(ctx context.Context, deviceId string, includePreRelease bool) err
489492
}
490493

491494
func GetUpdateStatus(ctx context.Context, deviceId string, includePreRelease bool) (*UpdateStatus, error) {
495+
updateStatus := &UpdateStatus{}
496+
492497
// Get local versions
493498
systemVersionLocal, appVersionLocal, err := GetLocalVersion()
494499
if err != nil {
495-
return nil, fmt.Errorf("error getting local version: %w", err)
500+
return updateStatus, fmt.Errorf("error getting local version: %w", err)
501+
}
502+
updateStatus.Local = &LocalMetadata{
503+
AppVersion: appVersionLocal.String(),
504+
SystemVersion: systemVersionLocal.String(),
496505
}
497506

498507
// Get remote metadata
499508
remoteMetadata, err := fetchUpdateMetadata(ctx, deviceId, includePreRelease)
500509
if err != nil {
501-
return nil, fmt.Errorf("error checking for updates: %w", err)
502-
}
503-
504-
// Build local UpdateMetadata
505-
localMetadata := &LocalMetadata{
506-
AppVersion: appVersionLocal.String(),
507-
SystemVersion: systemVersionLocal.String(),
510+
return updateStatus, fmt.Errorf("error checking for updates: %w", err)
508511
}
512+
updateStatus.Remote = remoteMetadata
509513

514+
// Get remote versions
510515
systemVersionRemote, err := semver.NewVersion(remoteMetadata.SystemVersion)
511516
if err != nil {
512-
return nil, fmt.Errorf("error parsing remote system version: %w", err)
517+
return updateStatus, fmt.Errorf("error parsing remote system version: %w", err)
513518
}
514519
appVersionRemote, err := semver.NewVersion(remoteMetadata.AppVersion)
515520
if err != nil {
516-
return nil, fmt.Errorf("error parsing remote app version: %w, %s", err, remoteMetadata.AppVersion)
521+
return updateStatus, fmt.Errorf("error parsing remote app version: %w, %s", err, remoteMetadata.AppVersion)
517522
}
518523

519-
systemUpdateAvailable := systemVersionRemote.GreaterThan(systemVersionLocal)
520-
appUpdateAvailable := appVersionRemote.GreaterThan(appVersionLocal)
524+
updateStatus.SystemUpdateAvailable = systemVersionRemote.GreaterThan(systemVersionLocal)
525+
updateStatus.AppUpdateAvailable = appVersionRemote.GreaterThan(appVersionLocal)
521526

522527
// Handle pre-release updates
523528
isRemoteSystemPreRelease := systemVersionRemote.Prerelease() != ""
524529
isRemoteAppPreRelease := appVersionRemote.Prerelease() != ""
525530

526531
if isRemoteSystemPreRelease && !includePreRelease {
527-
systemUpdateAvailable = false
532+
updateStatus.SystemUpdateAvailable = false
528533
}
529534
if isRemoteAppPreRelease && !includePreRelease {
530-
appUpdateAvailable = false
531-
}
532-
533-
updateStatus := &UpdateStatus{
534-
Local: localMetadata,
535-
Remote: remoteMetadata,
536-
SystemUpdateAvailable: systemUpdateAvailable,
537-
AppUpdateAvailable: appUpdateAvailable,
535+
updateStatus.AppUpdateAvailable = false
538536
}
539537

540538
return updateStatus, nil

ui/src/routes/devices.$id.settings.general.update.tsx

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,10 @@ export default function SettingsGeneralUpdateRoute() {
4343

4444
export interface SystemVersionInfo {
4545
local: { appVersion: string; systemVersion: string };
46-
remote: { appVersion: string; systemVersion: string };
46+
remote?: { appVersion: string; systemVersion: string };
4747
systemUpdateAvailable: boolean;
4848
appUpdateAvailable: boolean;
49+
error?: string;
4950
}
5051

5152
export function Dialog({
@@ -142,13 +143,19 @@ function LoadingState({
142143
return new Promise<SystemVersionInfo>((resolve, reject) => {
143144
send("getUpdateStatus", {}, async resp => {
144145
if ("error" in resp) {
145-
notifications.error("Failed to check for updates");
146+
notifications.error(`Failed to check for updates: ${resp.error}`);
146147
reject(new Error("Failed to check for updates"));
147148
} else {
148149
const result = resp.result as SystemVersionInfo;
149150
setAppVersion(result.local.appVersion);
150151
setSystemVersion(result.local.systemVersion);
151-
resolve(result);
152+
153+
if (result.error) {
154+
notifications.error(`Failed to check for updates: ${result.error}`);
155+
reject(new Error("Failed to check for updates"));
156+
} else {
157+
resolve(result);
158+
}
152159
}
153160
});
154161
});
@@ -235,9 +242,9 @@ function UpdatingDeviceState({
235242

236243
console.log(
237244
`For ${type}:\n` +
238-
` Download Progress: ${downloadProgress}% (${otaState[`${type}DownloadProgress`]})\n` +
239-
` Update Progress: ${updateProgress}% (${otaState[`${type}UpdateProgress`]})\n` +
240-
` Verification Progress: ${verificationProgress}% (${otaState[`${type}VerificationProgress`]})`,
245+
` Download Progress: ${downloadProgress}% (${otaState[`${type}DownloadProgress`]})\n` +
246+
` Update Progress: ${updateProgress}% (${otaState[`${type}UpdateProgress`]})\n` +
247+
` Verification Progress: ${verificationProgress}% (${otaState[`${type}VerificationProgress`]})`,
241248
);
242249

243250
if (type === "app") {
@@ -442,13 +449,14 @@ function UpdateAvailableState({
442449
{versionInfo?.systemUpdateAvailable ? (
443450
<>
444451
<span className="font-semibold">System:</span>{" "}
445-
{versionInfo?.remote.systemVersion}
452+
{versionInfo?.remote?.systemVersion}
446453
<br />
447454
</>
448455
) : null}
449456
{versionInfo?.appUpdateAvailable ? (
450457
<>
451-
<span className="font-semibold">App:</span> {versionInfo?.remote.appVersion}
458+
<span className="font-semibold">App:</span>{" "}
459+
{versionInfo?.remote?.appVersion}
452460
</>
453461
) : null}
454462
</p>

ui/src/routes/devices.$id.tsx

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -703,12 +703,17 @@ export default function KvmIdRoute() {
703703

704704
send("getUpdateStatus", {}, async resp => {
705705
if ("error" in resp) {
706-
notifications.error("Failed to get device version");
707-
} else {
708-
const result = resp.result as SystemVersionInfo;
709-
setAppVersion(result.local.appVersion);
710-
setSystemVersion(result.local.systemVersion);
706+
notifications.error(`Failed to get device version: ${resp.error}`);
707+
return
711708
}
709+
710+
const result = resp.result as SystemVersionInfo;
711+
if (result.error) {
712+
notifications.error(`Failed to get device version: ${result.error}`);
713+
}
714+
715+
setAppVersion(result.local.appVersion);
716+
setSystemVersion(result.local.systemVersion);
712717
});
713718
}, [appVersion, send, setAppVersion, setSystemVersion]);
714719

0 commit comments

Comments
 (0)