diff --git a/agent/config/routes b/agent/config/routes index ace977d7d..b13f78a4a 100644 --- a/agent/config/routes +++ b/agent/config/routes @@ -38,6 +38,7 @@ /v0/apps/#AppId/autoconfig/#AppId AutoconfigureR POST /v0/disks ListDisksR GET +/v0/disks/#Text EjectDiskR DELETE /v0/update UpdateAgentR POST /v0/wifi WifiR GET POST diff --git a/agent/src/Handler/Backups.hs b/agent/src/Handler/Backups.hs index 128badf1d..0b0cff388 100644 --- a/agent/src/Handler/Backups.hs +++ b/agent/src/Handler/Backups.hs @@ -98,6 +98,9 @@ postRestoreBackupR appId = disableEndpointOnFailedUpdate $ do getListDisksR :: Handler (JSONResponse [AppMgr.DiskInfo]) getListDisksR = fmap JSONResponse . runM . handleS9ErrC $ listDisksLogic +deleteEjectDiskR :: Text -> Handler () +deleteEjectDiskR t = runM . handleS9ErrC $ ejectDiskLogic t + -- Logic @@ -203,6 +206,16 @@ restoreBackupLogic appId RestoreBackupReq {..} = do listDisksLogic :: (Has (Error S9Error) sig m, MonadIO m) => m [AppMgr.DiskInfo] listDisksLogic = runExceptT AppMgr.diskShow >>= liftEither +ejectDiskLogic :: (Has (Error S9Error) sig m, MonadIO m) => Text -> m () +ejectDiskLogic t = runExceptT (diskEject t) >>= liftEither + +diskEject :: MonadIO m => Text -> S9ErrT m () +diskEject t = do + (ec, _) <- AppMgr.readProcessInheritStderr "eject" [toS t] "" + case ec of + ExitSuccess -> pure () + ExitFailure n -> throwE $ EjectE n + insertBackupResult :: MonadIO m => AppId -> Version -> Bool -> SqlPersistT m (Entity BackupRecord) insertBackupResult appId appVersion succeeded = do uuid <- liftIO nextRandom diff --git a/agent/src/Lib/Error.hs b/agent/src/Lib/Error.hs index b014a4c3f..302b7f100 100644 --- a/agent/src/Lib/Error.hs +++ b/agent/src/Lib/Error.hs @@ -31,6 +31,7 @@ data S9Error = | AppMgrParseE Text Text String | AppMgrInvalidConfigE Text | AppMgrE Text Int + | EjectE Int | AvahiE Text | MetricE Text | AppMgrVersionE Version VersionRange @@ -86,6 +87,7 @@ toError = \case AppMgrParseE cmd result e -> ErrorResponse APPMGR_PARSE_ERROR [i|"appmgr #{cmd}" yielded an unparseable result:#{result}\nError: #{e}|] AppMgrE cmd code -> ErrorResponse APPMGR_ERROR [i|"appmgr #{cmd}" exited with #{code}|] + EjectE code -> ErrorResponse EJECT_ERROR [i|"eject" command exited with #{code}|] AppMgrVersionE av avs -> ErrorResponse APPMGR_ERROR [i|"appmgr version #{av}" fails to satisfy requisite spec #{avs}|] AvahiE e -> ErrorResponse AVAHI_ERROR [i|#{e}|] @@ -151,6 +153,7 @@ data ErrorCode = | APPMGR_CONFIG_ERROR | APPMGR_PARSE_ERROR | APPMGR_ERROR + | EJECT_ERROR | AVAHI_ERROR | REGISTRY_ERROR | APP_NOT_INSTALLED @@ -201,6 +204,7 @@ toStatus = \case AppMgrParseE{} -> status500 AppMgrInvalidConfigE _ -> status400 AppMgrE _ _ -> status500 + EjectE _ -> status500 AppMgrVersionE _ _ -> status500 AvahiE _ -> status500 MetricE _ -> status500