From 7e147089e487697105ff23182355d2385d469a31 Mon Sep 17 00:00:00 2001 From: doronz Date: Thu, 20 Jul 2023 13:53:47 +0300 Subject: [PATCH] services: add `RestoreService` --- pymobiledevice3/services/restore_service.py | 41 +++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100755 pymobiledevice3/services/restore_service.py diff --git a/pymobiledevice3/services/restore_service.py b/pymobiledevice3/services/restore_service.py new file mode 100755 index 000000000..9adbf8551 --- /dev/null +++ b/pymobiledevice3/services/restore_service.py @@ -0,0 +1,41 @@ +from typing import Mapping + +from pymobiledevice3.exceptions import PyMobileDevice3Exception +from pymobiledevice3.remote.remote_service import RemoteService +from pymobiledevice3.remote.remote_service_discovery import RemoteServiceDiscoveryService + + +class RestoreService(RemoteService): + SERVICE_NAME = 'com.apple.RestoreRemoteServices.restoreserviced' + + def __init__(self, lockdown: RemoteServiceDiscoveryService): + super().__init__(lockdown, self.SERVICE_NAME) + + def delay_recovery_image(self) -> None: + """ + Set `delay-recovery-image` on devices of ProductType 0x1677b394. Otherwise, fail + """ + self.validate_command('delayrecoveryimage') + + def enter_recovery(self) -> None: + """ Enter recovery """ + self.validate_command('recovery') + + def reboot(self) -> None: + """ Reboot device """ + self.validate_command('reboot') + + def get_preflightinfo(self) -> Mapping: + """ Get preflight info """ + return self.service.send_receive_request({'command': 'getpreflightinfo'}) + + def get_nonces(self) -> Mapping: + """ Get ApNonce and SEPNonce """ + return self.service.send_receive_request({'command': 'getnonces'}) + + def validate_command(self, command: str) -> Mapping: + """ Execute command and validate result is `success` """ + response = self.service.send_receive_request({'command': command}) + if response.get('result') != 'success': + raise PyMobileDevice3Exception(f'request command: {command} failed with error: {response}') + return response