From 01b6d0c9befc7fb41c989a48d3b0a403aafd6317 Mon Sep 17 00:00:00 2001 From: Dees_Troy Date: Tue, 22 Jan 2013 01:41:09 +0000 Subject: Convert AOSP commands to ORS for encrypted devices Change-Id: I6a76a51cd9efd7db67d7abeeb26f9bdd0eebf5a9 --- gui/action.cpp | 12 +++++++++++ openrecoveryscript.cpp | 26 ++++++++++++++++++------ openrecoveryscript.hpp | 1 + recovery.cpp | 54 ++++++++++++++++++++++++++++++++++++-------------- variables.h | 4 ++++ 5 files changed, 76 insertions(+), 21 deletions(-) diff --git a/gui/action.cpp b/gui/action.cpp index 997cf558e..9c3ee5916 100644 --- a/gui/action.cpp +++ b/gui/action.cpp @@ -1014,6 +1014,18 @@ int GUIAction::doAction(Action action, int isThreaded /* = 0 */) DataManager::SetValue(TW_IS_ENCRYPTED, 0); DataManager::ReadSettingsFile(); + // Check for the SCRIPT_FILE_TMP first as these are AOSP recovery commands + // that we converted to ORS commands during boot in recovery.cpp. + // Run those first. + if (TWFunc::Path_Exists(SCRIPT_FILE_TMP)) { + ui_print("Processing AOSP recovery commands...\n"); + if (OpenRecoveryScript::run_script_file() == 0) { + usleep(2000000); // Sleep for 2 seconds before rebooting + TWFunc::tw_reboot(rb_system); + load_theme = 0; + } + } + // Check for the ORS file in /cache and attempt to run those commands. if (OpenRecoveryScript::check_for_script_file()) { ui_print("Processing OpenRecoveryScript file...\n"); if (OpenRecoveryScript::run_script_file() == 0) { diff --git a/openrecoveryscript.cpp b/openrecoveryscript.cpp index 8e95555f7..f0efae401 100644 --- a/openrecoveryscript.cpp +++ b/openrecoveryscript.cpp @@ -30,6 +30,8 @@ #include #include #include +#include +#include #include "twrp-functions.hpp" #include "partitions.hpp" @@ -38,15 +40,13 @@ #include "variables.h" #include "adb_install.h" extern "C" { -#include "data.h" -#include "twinstall.h" -#include "gui/gui.h" -int TWinstall_zip(const char* path, int* wipe_cache); + #include "data.h" + #include "twinstall.h" + #include "gui/gui.h" + int TWinstall_zip(const char* path, int* wipe_cache); } extern RecoveryUI* ui; -static const char *SCRIPT_FILE_CACHE = "/cache/recovery/openrecoveryscript"; -static const char *SCRIPT_FILE_TMP = "/tmp/openrecoveryscript"; #define SCRIPT_COMMAND_SIZE 512 int OpenRecoveryScript::check_for_script_file(void) { @@ -378,6 +378,20 @@ int OpenRecoveryScript::run_script_file(void) { return ret_val; } +int OpenRecoveryScript::Insert_ORS_Command(string Command) { + ofstream ORSfile(SCRIPT_FILE_TMP); + if (ORSfile.is_open()) { + //if (Command.substr(Command.size() - 1, 1) != "\n") + // Command += "\n"; + LOGI("Inserting '%s'\n", Command.c_str()); + ORSfile << Command.c_str(); + ORSfile.close(); + return 1; + } + LOGE("Unable to append '%s' to '%s'\n", Command.c_str(), SCRIPT_FILE_TMP); + return 0; +} + int OpenRecoveryScript::Install_Command(string Zip) { // Install zip string ret_string; diff --git a/openrecoveryscript.hpp b/openrecoveryscript.hpp index ca0ea9f33..2c7a81e41 100644 --- a/openrecoveryscript.hpp +++ b/openrecoveryscript.hpp @@ -33,6 +33,7 @@ class OpenRecoveryScript public: static int check_for_script_file(); // Checks to see if the ORS file is present in /cache static int run_script_file(); // Executes the commands in the ORS file + static int Insert_ORS_Command(string Command); // Inserts the Command into the SCRIPT_FILE_TMP file static int Install_Command(string Zip); // Installs a zip static string Locate_Zip_File(string Path, string File); // Attempts to locate the zip file in storage static int Backup_Command(string Options); // Runs a backup diff --git a/recovery.cpp b/recovery.cpp index 581e67e46..7d1dd142e 100644 --- a/recovery.cpp +++ b/recovery.cpp @@ -822,6 +822,7 @@ main(int argc, char **argv) { // Load up all the resources gui_loadResources(); + PartitionManager.Mount_By_Path("/cache", true); get_args(&argc, &argv); int previous_runs = 0; @@ -907,19 +908,23 @@ main(int argc, char **argv) { #endif int status = INSTALL_SUCCESS; + string ORSCommand; if (perform_backup) { char empt[50]; gui_console_only(); strcpy(empt, "(Current Date)"); DataManager_SetStrValue(TW_BACKUP_NAME, empt); - if (OpenRecoveryScript::Backup_Command("BSDCAE") != 0) + if (!OpenRecoveryScript::Insert_ORS_Command("backup BSDCAE\n")) status = INSTALL_ERROR; } if (status == INSTALL_SUCCESS) { // Prevent other actions if backup failed if (update_package != NULL) { - gui_console_only(); - if (OpenRecoveryScript::Install_Command(update_package) == 0) + ORSCommand = "install "; + ORSCommand += update_package; + ORSCommand += "\n"; + + if (OpenRecoveryScript::Insert_ORS_Command(ORSCommand)) status = INSTALL_SUCCESS; else status = INSTALL_ERROR; @@ -933,8 +938,8 @@ main(int argc, char **argv) { if (status != INSTALL_SUCCESS) ui->Print("Installation aborted.\n"); */ } else if (wipe_data) { - gui_console_only(); - if (!PartitionManager.Factory_Reset()) status = INSTALL_ERROR; + if (!OpenRecoveryScript::Insert_ORS_Command("wipe data\n")) + status = INSTALL_ERROR; /* if (device->WipeData()) status = INSTALL_ERROR; if (erase_volume("/data")) status = INSTALL_ERROR; @@ -942,8 +947,8 @@ main(int argc, char **argv) { */ if (status != INSTALL_SUCCESS) ui->Print("Data wipe failed.\n"); } else if (wipe_cache) { - gui_console_only(); - if (wipe_cache && erase_volume("/cache")) status = INSTALL_ERROR; + if (!OpenRecoveryScript::Insert_ORS_Command("wipe cache\n")) + status = INSTALL_ERROR; if (status != INSTALL_SUCCESS) ui->Print("Cache wipe failed.\n"); } else if (!just_exit) { status = INSTALL_ERROR; // No command specified @@ -951,7 +956,7 @@ main(int argc, char **argv) { } //if (status != INSTALL_SUCCESS) ui->SetBackground(RecoveryUI::ERROR); - if (status != INSTALL_SUCCESS /*|| ui->IsTextVisible()*/) { + if (1) { finish_recovery(NULL); DataManager_ReadSettingsFile(); if (PartitionManager.Mount_By_Path("/system", false) && TWFunc::Path_Exists("/system/recovery-from-boot.p")) { @@ -959,14 +964,33 @@ main(int argc, char **argv) { ui_print("Renamed stock recovery file in /system to prevent\nthe stock ROM from replacing TWRP.\n"); } PartitionManager.UnMount_By_Path("/system", false); - if (DataManager_GetIntValue(TW_IS_ENCRYPTED) == 0 && OpenRecoveryScript::check_for_script_file()) { - gui_console_only(); - if (OpenRecoveryScript::run_script_file() != 0) { - // There was an error, boot the recovery - gui_start(); - } else { - usleep(2000000); // Sleep for 2 seconds before rebooting + if (DataManager_GetIntValue(TW_IS_ENCRYPTED) == 0) { + // Check for the SCRIPT_FILE_TMP first as these are AOSP recovery commands + // that we converted to ORS commands up above. Run those first. + int boot_recovery = 1, check = 1; + if (TWFunc::Path_Exists(SCRIPT_FILE_TMP)) { + boot_recovery = 0; + gui_console_only(); + if (OpenRecoveryScript::run_script_file() != 0) { + // There was an error, boot the recovery + check = 0; + gui_start(); + } else { + usleep(2000000); // Sleep for 2 seconds before rebooting + } } + // Check for the ORS file in /cache and attempt to run those commands. + if (check && OpenRecoveryScript::check_for_script_file()) { + boot_recovery = 0; + if (OpenRecoveryScript::run_script_file() != 0) { + // There was an error, boot the recovery + gui_start(); + } else { + usleep(2000000); // Sleep for 2 seconds before rebooting + } + } + if (boot_recovery) + gui_start(); } else gui_start(); //prompt_and_wait(device); diff --git a/variables.h b/variables.h index 0b1c7ab58..c40badb44 100644 --- a/variables.h +++ b/variables.h @@ -171,4 +171,8 @@ #define CUSTOM_LUN_FILE "/sys/devices/platform/usb_mass_storage/lun%d/file" #endif +// For OpenRecoveryScript +#define SCRIPT_FILE_CACHE "/cache/recovery/openrecoveryscript" +#define SCRIPT_FILE_TMP "/tmp/openrecoveryscript" + #endif // _VARIABLES_HEADER_ -- cgit v1.2.3