From 96994ee0447a4bd8dd31427e87d552d34afe306a Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Tue, 29 Dec 2020 11:59:09 +0100 Subject: [PATCH 01/69] add yaml for GS_290 --- src/main/resources/yaml/GS290.yml | 99 ++++++++++++++++++++++++++++ src/main/resources/yaml/GS290_fs.yml | 86 ++++++++++++++++++++++++ 2 files changed, 185 insertions(+) create mode 100644 src/main/resources/yaml/GS290.yml create mode 100644 src/main/resources/yaml/GS290_fs.yml diff --git a/src/main/resources/yaml/GS290.yml b/src/main/resources/yaml/GS290.yml new file mode 100644 index 00000000..e108b079 --- /dev/null +++ b/src/main/resources/yaml/GS290.yml @@ -0,0 +1,99 @@ +## Copyright 2019-2020 - ECORP SAS + +## This program is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program. If not, see . +## Author: Vincent Bourgmayer +--- +name: GS290 +flash: + f1: + script: enableOemUnlock + parameters: ~ + codes: ~ + output: ~ + succeed: f2 + failed: ~ + f2: + script: wait-fastboot + parameters: + fastboot_folder_path: ${ADB_FOLDER_PATH} + codes: + ok: + 0: ~ + ko: + 1: script_error_waitFastboot_1 + output: ~ + succeed: f3 + failed: ~ + f3: + script: unlock-GS290 + parameters: + fastboot_folder_path: ${ADB_FOLDER_PATH} + codes: + ok: + 0: ~ + ko: + 10: script_error_oemUnlock_10 + output: ~ + succeed: f4 + failed: ~ + f4: + script: wait-fastboot + parameters: + fastboot_folder_path: ${ADB_FOLDER_PATH} + codes: + ok: + 0: ~ + ko: + 1: script_error_waitFastboot_1 + output: ~ + succeed: f5 + failed: ~ + f5: + script: install-from-bootloader-GS290 + parameters: + archive_path: ${ARCHIVE_PATH} + fastboot_folder_path: ${ADB_FOLDER_PATH} + java_folder_path: ${JAVA_FOLDER_PATH} + codes: + ok: + 0: ~ + ko: + 1: script_error_installFromFastboot_1 + 2: script_error_installFromFastboot_2 + 3: script_error_installFromFastboot_3 + 101: script_error_installFromFastboot_101 + 102: script_error_installFromFastboot_102 + output: ~ + succeed: f6 + failed: ~ + f6: + script: askAccount + parameters: ~ + codes: ~ + output: ~ + succeed: f7 + failed: ~ + f7: + script: wait-reboot-from-fastboot + parameters: + fastboot_folder_path: ${ADB_FOLDER_PATH} + codes: + ok: + 0: ~ + ko: + 1: script_error_unknown + 101: script_error_waitRebootFromFastboot_101 + output: ~ + succeed: ~ + failed: ~ \ No newline at end of file diff --git a/src/main/resources/yaml/GS290_fs.yml b/src/main/resources/yaml/GS290_fs.yml new file mode 100644 index 00000000..b179f7d5 --- /dev/null +++ b/src/main/resources/yaml/GS290_fs.yml @@ -0,0 +1,86 @@ +## Copyright 2019-2020 - ECORP SAS + +## This program is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program. If not, see . +## Author: Vincent Bourgmayer +--- +sources: + rom: + url: https://images.ecloud.global/stable/GS290/IMG-e-latest-GS290.zip + filePath: IMG-e-latest-GS290.zip + boot.img: + url: https://images.ecloud.global/stable/GS290/boot.img + filePath: boot.img + lk.img: + url: https://images.ecloud.global/stable/GS290/lk.img + filePath: lk.img + logo.bin: + url: https://images.ecloud.global/stable/GS290/logo.bin + filePath: logo.bin + recovery: + url: https://images.ecloud.global/stable/GS290/recovery-e-latest-GS290.img + filePath: recovery-e-latest-GS290.img +flash: + f1: + ui: + type: enableOemUnlock + f2: + ui: + type: action + title: stepTitle_StartInFastbootFP3 + instruction: + - install_instr_turnOff + - install_instr_startFastboot + stepNumber: 1/5 + titleIcon: icon-download.png + f3: + ui: + type: load + title: stepTitle2On7 + instruction: + - install_instr_oemUnlock + stepNumber: 2/5 + averageTime: 12 + f4: + ui: + type: action + title: stepTitle3On7FP3 + instruction: + - install_instr_readAllWarning + - install_instr_selectUnlockBootloader + - install_instr_unlockBootloader + - install_instr_bootWarning + - install_instr_startFastbootFromOptions + - install_instr_ifYouMissedTimeout + stepNumber: 3/5 + titleIcon: icon-download.png + f5: + ui: + type: load + title: stepTitle6On7 + instruction: + - install_instr_eosInstall + stepNumber: 4/5 + averageTime: 200 + f6: + ui: + type: askAccount + f7: + ui: + type: action + title: + instruction: + - install_instr_selectLockBootloader + - install_instr_lockBootloader + stepNumber: 5/5 + titleIcon: icon-download.png -- GitLab From 0dc5b04214276a0b75df1c36b16d2af64ce07878 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Tue, 29 Dec 2020 14:39:15 +0100 Subject: [PATCH 02/69] add linux scripts for GS290 and cp+rename into windows scripts folder --- .../linux/install-from-bootloader-GS290.sh | 56 +++++++++++++++++++ flash-scripts/linux/unlock-GS290.sh | 35 ++++++++++++ .../windows/install-from-bootloader-GS290.bat | 56 +++++++++++++++++++ flash-scripts/windows/unlock-GS290.bat | 35 ++++++++++++ 4 files changed, 182 insertions(+) create mode 100644 flash-scripts/linux/install-from-bootloader-GS290.sh create mode 100644 flash-scripts/linux/unlock-GS290.sh create mode 100644 flash-scripts/windows/install-from-bootloader-GS290.bat create mode 100644 flash-scripts/windows/unlock-GS290.bat diff --git a/flash-scripts/linux/install-from-bootloader-GS290.sh b/flash-scripts/linux/install-from-bootloader-GS290.sh new file mode 100644 index 00000000..b0bf929e --- /dev/null +++ b/flash-scripts/linux/install-from-bootloader-GS290.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +# Copyright (C) 2020 ECORP SAS - Author: Romain Hunault +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Parameter +# $1: DEVICE_ID device id +# $2: ARCHIVE_PATH path to archive + +# Exit status +# - 0 : device flashed +# - 1 : generic error +# - 101 : DEVICE_ID missing +# - 102 : ARCHIVE_PATH missing + +DEVICE_ID=$1 +ARCHIVE_PATH=$2 + +if [ -z $DEVICE_ID ] +then + exit 101 +fi + +if [ -z $ARCHIVE_PATH ] +then + exit 102 +fi + +fastboot -s $DEVICE_ID erase userdata +sleep 1 +fastboot -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img +sleep 1 +fastboot -s $DEVICE_ID flash recovery $ARCHIVE_PATH/recovery-e-latest-GS290.img +sleep 1 +fastboot -s $DEVICE_ID flash system $ARCHIVE_PATH/system.img +sleep 1 +fastboot -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img +sleep 1 +fastboot -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin +sleep 1 +fastboot -w +sleep 1 +fastboot reboot +sleep 1 diff --git a/flash-scripts/linux/unlock-GS290.sh b/flash-scripts/linux/unlock-GS290.sh new file mode 100644 index 00000000..0bdb3fc0 --- /dev/null +++ b/flash-scripts/linux/unlock-GS290.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +# Copyright (C) 2020 ECORP SAS - Author: Romain Hunault +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Parameter +# $1: device id + +# Exit status +# - 0 : bootloader locked +# - 1 : generic error +# - 101 : $DEVICE_ID missing + +DEVICE_ID=$1 + +if [ -z $DEVICE_ID ] +then + exit 101 +fi + +fastboot -s $DEVICE_ID flashing unlock +sleep 1 +# fastboot reboot-bootloader diff --git a/flash-scripts/windows/install-from-bootloader-GS290.bat b/flash-scripts/windows/install-from-bootloader-GS290.bat new file mode 100644 index 00000000..b0bf929e --- /dev/null +++ b/flash-scripts/windows/install-from-bootloader-GS290.bat @@ -0,0 +1,56 @@ +#!/bin/bash + +# Copyright (C) 2020 ECORP SAS - Author: Romain Hunault +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Parameter +# $1: DEVICE_ID device id +# $2: ARCHIVE_PATH path to archive + +# Exit status +# - 0 : device flashed +# - 1 : generic error +# - 101 : DEVICE_ID missing +# - 102 : ARCHIVE_PATH missing + +DEVICE_ID=$1 +ARCHIVE_PATH=$2 + +if [ -z $DEVICE_ID ] +then + exit 101 +fi + +if [ -z $ARCHIVE_PATH ] +then + exit 102 +fi + +fastboot -s $DEVICE_ID erase userdata +sleep 1 +fastboot -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img +sleep 1 +fastboot -s $DEVICE_ID flash recovery $ARCHIVE_PATH/recovery-e-latest-GS290.img +sleep 1 +fastboot -s $DEVICE_ID flash system $ARCHIVE_PATH/system.img +sleep 1 +fastboot -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img +sleep 1 +fastboot -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin +sleep 1 +fastboot -w +sleep 1 +fastboot reboot +sleep 1 diff --git a/flash-scripts/windows/unlock-GS290.bat b/flash-scripts/windows/unlock-GS290.bat new file mode 100644 index 00000000..0bdb3fc0 --- /dev/null +++ b/flash-scripts/windows/unlock-GS290.bat @@ -0,0 +1,35 @@ +#!/bin/bash + +# Copyright (C) 2020 ECORP SAS - Author: Romain Hunault +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Parameter +# $1: device id + +# Exit status +# - 0 : bootloader locked +# - 1 : generic error +# - 101 : $DEVICE_ID missing + +DEVICE_ID=$1 + +if [ -z $DEVICE_ID ] +then + exit 101 +fi + +fastboot -s $DEVICE_ID flashing unlock +sleep 1 +# fastboot reboot-bootloader -- GitLab From 60f315149cc7ce1738f4be9ebd909a7f31bdeb2c Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 30 Dec 2020 16:51:21 +0100 Subject: [PATCH 03/69] convert unlock-GS290 script from shell to batch --- flash-scripts/windows/unlock-GS290.bat | 31 +++++++++++++++++++------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/flash-scripts/windows/unlock-GS290.bat b/flash-scripts/windows/unlock-GS290.bat index 0bdb3fc0..9609b642 100644 --- a/flash-scripts/windows/unlock-GS290.bat +++ b/flash-scripts/windows/unlock-GS290.bat @@ -17,19 +17,34 @@ # Parameter # $1: device id +# $2: fastboot folder path # Exit status # - 0 : bootloader locked # - 1 : generic error # - 101 : $DEVICE_ID missing +# - 102 : $FASTBOOT_FOLDER_PATH is missing -DEVICE_ID=$1 +set DEVICE_ID="%1" +set FASTBOOT_FOLDER_PATH=%~2 +set FASTBOOT_PATH="%FASTBOOT_FOLDER_PATH%fastboot" +echo "FASTBOOT path:"%FASTBOOT_PATH% -if [ -z $DEVICE_ID ] -then - exit 101 -fi +if not defined %DEVICE_ID ( + exit /b 101 +) -fastboot -s $DEVICE_ID flashing unlock -sleep 1 -# fastboot reboot-bootloader +if not defined %FASTBOOT_FOLDER_PATH ( + exit /b 102 +) + +%FASTBOOT_PATH% -s %DEVICE_ID% flashing unlock + +if errorLevel 1 ( + echo "flashing unlock fails" + exit /b 1 +) + +timeout 1 >nul + +exit /b 0 -- GitLab From 3468dbea5b2f429e024cebf35508ac585cceb6cc Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 30 Dec 2020 16:55:56 +0100 Subject: [PATCH 04/69] add missing parameter to unlock-GS290.sh --- flash-scripts/linux/unlock-GS290.sh | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/flash-scripts/linux/unlock-GS290.sh b/flash-scripts/linux/unlock-GS290.sh index 0bdb3fc0..42647e09 100644 --- a/flash-scripts/linux/unlock-GS290.sh +++ b/flash-scripts/linux/unlock-GS290.sh @@ -17,19 +17,29 @@ # Parameter # $1: device id +# $2: fastboot folder path # Exit status # - 0 : bootloader locked # - 1 : generic error # - 101 : $DEVICE_ID missing +# - 102 : $FASTBOOT_FOLDER_PATH is missing DEVICE_ID=$1 +FASTBOOT_FOLDER_PATH=$2 +FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" if [ -z $DEVICE_ID ] then exit 101 fi -fastboot -s $DEVICE_ID flashing unlock +if [ -z $FASTBOOT_FOLDER_PATH ] +then + exit 102 +fi + + +"$FASTBOOT_PATH" -s $DEVICE_ID flashing unlock sleep 1 # fastboot reboot-bootloader -- GitLab From 241abedffcc0a02ec5c60737e0b4cf2d69cb11dd Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 30 Dec 2020 17:34:49 +0100 Subject: [PATCH 05/69] add missing parameter to install-from-bootloader-GS290.sh --- .../linux/install-from-bootloader-GS290.sh | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/flash-scripts/linux/install-from-bootloader-GS290.sh b/flash-scripts/linux/install-from-bootloader-GS290.sh index b0bf929e..ae8070b2 100644 --- a/flash-scripts/linux/install-from-bootloader-GS290.sh +++ b/flash-scripts/linux/install-from-bootloader-GS290.sh @@ -18,15 +18,19 @@ # Parameter # $1: DEVICE_ID device id # $2: ARCHIVE_PATH path to archive +# $3: fastboot folder path # Exit status # - 0 : device flashed # - 1 : generic error # - 101 : DEVICE_ID missing # - 102 : ARCHIVE_PATH missing +# - 103 : fastboot folder path missing DEVICE_ID=$1 ARCHIVE_PATH=$2 +FASTBOOT_FOLDER_PATH=$3 +FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" if [ -z $DEVICE_ID ] then @@ -38,19 +42,24 @@ then exit 102 fi -fastboot -s $DEVICE_ID erase userdata +if [ -z $FASTBOOT_FOLDER_PATH ] +then + exit 103 +fi + +$FASTBOOT_PATH -s $DEVICE_ID erase userdata sleep 1 -fastboot -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img +$FASTBOOT_PATH -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img sleep 1 -fastboot -s $DEVICE_ID flash recovery $ARCHIVE_PATH/recovery-e-latest-GS290.img +$FASTBOOT_PATH -s $DEVICE_ID flash recovery $ARCHIVE_PATH/recovery-e-latest-GS290.img sleep 1 -fastboot -s $DEVICE_ID flash system $ARCHIVE_PATH/system.img +$FASTBOOT_PATH -s $DEVICE_ID flash system $ARCHIVE_PATH/system.img sleep 1 -fastboot -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img +$FASTBOOT_PATH -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img sleep 1 -fastboot -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin +$FASTBOOT_PATH -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin sleep 1 -fastboot -w +$FASTBOOT_PATH -w sleep 1 -fastboot reboot +$FASTBOOT_PATH reboot sleep 1 -- GitLab From 3516dac2a33d313ca9a538520f5f0c02ce38f640 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 30 Dec 2020 17:44:22 +0100 Subject: [PATCH 06/69] convert install-from-bootloader-GS290.sh into bat --- .../linux/install-from-bootloader-GS290.sh | 2 + .../windows/install-from-bootloader-GS290.bat | 60 +++++++++++++------ 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/flash-scripts/linux/install-from-bootloader-GS290.sh b/flash-scripts/linux/install-from-bootloader-GS290.sh index ae8070b2..7957cc1f 100644 --- a/flash-scripts/linux/install-from-bootloader-GS290.sh +++ b/flash-scripts/linux/install-from-bootloader-GS290.sh @@ -47,6 +47,8 @@ then exit 103 fi +# add unzip for system + $FASTBOOT_PATH -s $DEVICE_ID erase userdata sleep 1 $FASTBOOT_PATH -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img diff --git a/flash-scripts/windows/install-from-bootloader-GS290.bat b/flash-scripts/windows/install-from-bootloader-GS290.bat index b0bf929e..ac3ce0dd 100644 --- a/flash-scripts/windows/install-from-bootloader-GS290.bat +++ b/flash-scripts/windows/install-from-bootloader-GS290.bat @@ -18,39 +18,63 @@ # Parameter # $1: DEVICE_ID device id # $2: ARCHIVE_PATH path to archive +# $3: fastboot folder path # Exit status # - 0 : device flashed # - 1 : generic error # - 101 : DEVICE_ID missing # - 102 : ARCHIVE_PATH missing +# - 103 : fastboot folder path missing -DEVICE_ID=$1 -ARCHIVE_PATH=$2 +set DEVICE_ID="%1" +set ARCHIVE_PATH=%~2 +set FASTBOOT_FOLDER_PATH=%~3 +set FASTBOOT_PATH="%FASTBOOT_FOLDER_PATH%fastboot" -if [ -z $DEVICE_ID ] -then - exit 101 -fi +if not defined %DEVICE_ID ( + exit /b 101 +) -if [ -z $ARCHIVE_PATH ] -then - exit 102 -fi +if not defined %ARCHIVE_PATH ( + exit /b 102 +) -fastboot -s $DEVICE_ID erase userdata +if not defined %FASTBOOT_FOLDER_PATH ( + exit /b 103 +) + +for %%a in ("%ARCHIVE_PATH%") do ( + set ARCHIVE_NAME="%%~na" +) + +for %%a in ("%ARCHIVE_PATH%") do ( + set ARCHIVE_FOLDER_PATH="%%~dpa" +) + +echo "archive path : "%ARCHIVE_PATH% +echo "archive folder path : "%ARCHIVE_FOLDER_PATH% +echo "fastboot path : "%FASTBOOT_PATH% + +cd "%ARCHIVE_FOLDER_PATH%" + +timeout 1 >nul 2>&1 + +# Should we unzip ? + +%FASTBOOT_PATH% -s %DEVICE_ID% erase userdata sleep 1 -fastboot -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img +%FASTBOOT_PATH% -s %DEVICE_ID% flash --disable-verity --disable-verification boot boot.img sleep 1 -fastboot -s $DEVICE_ID flash recovery $ARCHIVE_PATH/recovery-e-latest-GS290.img +%FASTBOOT_PATH% -s %DEVICE_ID% flash recovery recovery-e-latest-GS290.img sleep 1 -fastboot -s $DEVICE_ID flash system $ARCHIVE_PATH/system.img +%FASTBOOT_PATH% -s %DEVICE_ID% flash system system.img sleep 1 -fastboot -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img +%FASTBOOT_PATH% -s %DEVICE_ID% flash lk lk.img sleep 1 -fastboot -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin +%FASTBOOT_PATH% -s %DEVICE_ID% flash logo logo.bin sleep 1 -fastboot -w +%FASTBOOT_PATH% -w sleep 1 -fastboot reboot +%FASTBOOT_PATH% reboot sleep 1 -- GitLab From d644406ccfca71941fc4cbec438cf60895f73cb7 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Thu, 31 Dec 2020 12:18:10 +0100 Subject: [PATCH 07/69] update some scripts for GS290 --- flash-scripts/linux/install-from-bootloader-GS290.sh | 4 ++-- flash-scripts/windows/install-from-bootloader-GS290.bat | 4 ++-- flash-scripts/windows/unlock-GS290.bat | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/flash-scripts/linux/install-from-bootloader-GS290.sh b/flash-scripts/linux/install-from-bootloader-GS290.sh index 7957cc1f..cb90a19e 100644 --- a/flash-scripts/linux/install-from-bootloader-GS290.sh +++ b/flash-scripts/linux/install-from-bootloader-GS290.sh @@ -61,7 +61,7 @@ $FASTBOOT_PATH -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img sleep 1 $FASTBOOT_PATH -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin sleep 1 -$FASTBOOT_PATH -w +$FASTBOOT_PATH -s $DEVICE_ID -w sleep 1 -$FASTBOOT_PATH reboot +$FASTBOOT_PATH -s $DEVICE_ID reboot sleep 1 diff --git a/flash-scripts/windows/install-from-bootloader-GS290.bat b/flash-scripts/windows/install-from-bootloader-GS290.bat index ac3ce0dd..999d30d8 100644 --- a/flash-scripts/windows/install-from-bootloader-GS290.bat +++ b/flash-scripts/windows/install-from-bootloader-GS290.bat @@ -74,7 +74,7 @@ sleep 1 sleep 1 %FASTBOOT_PATH% -s %DEVICE_ID% flash logo logo.bin sleep 1 -%FASTBOOT_PATH% -w +%FASTBOOT_PATH% -s %DEVICE_ID% -w sleep 1 -%FASTBOOT_PATH% reboot +%FASTBOOT_PATH% -s %DEVICE_ID% reboot sleep 1 diff --git a/flash-scripts/windows/unlock-GS290.bat b/flash-scripts/windows/unlock-GS290.bat index 9609b642..b5fb97fe 100644 --- a/flash-scripts/windows/unlock-GS290.bat +++ b/flash-scripts/windows/unlock-GS290.bat @@ -20,8 +20,8 @@ # $2: fastboot folder path # Exit status -# - 0 : bootloader locked -# - 1 : generic error +# - 0 : flashing unlocked +# - 1 : flashing unlock failed # - 101 : $DEVICE_ID missing # - 102 : $FASTBOOT_FOLDER_PATH is missing -- GitLab From f04be7de8553e64c9e42a7a11b48bfa17b733f22 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Thu, 31 Dec 2020 12:18:38 +0100 Subject: [PATCH 08/69] update GS290 config file & add missing translation entries --- src/main/resources/lang/translation.properties | 3 +++ src/main/resources/yaml/GS290.yml | 9 +++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/resources/lang/translation.properties b/src/main/resources/lang/translation.properties index a2d4cee0..c516a410 100644 --- a/src/main/resources/lang/translation.properties +++ b/src/main/resources/lang/translation.properties @@ -177,6 +177,9 @@ script_error_installFromFastboot_102 = Could not unpack /e/ install archive script_error_waitReboot_10 = No device's serial number provided script_error_waitReboot_101 = Can't run instruction on the device script_error_waitRebootFromFastboot_101 = Can't run instruction on the device +script_error_serialNumber_missing=No device's serial number provided +script_error_fastboot_path_missing= No fastboot tool path provided +script_error_fastboot_flashingUnlock_failed=Could not unlock flashing script_error_unknown= The installation encounter an error java_error_unknow= The installation encounter an internal error flash_process_cancelled=The installation process has been cancelled diff --git a/src/main/resources/yaml/GS290.yml b/src/main/resources/yaml/GS290.yml index e108b079..4696621d 100644 --- a/src/main/resources/yaml/GS290.yml +++ b/src/main/resources/yaml/GS290.yml @@ -38,12 +38,15 @@ flash: f3: script: unlock-GS290 parameters: + device_id: ${DEVICE_ID} fastboot_folder_path: ${ADB_FOLDER_PATH} codes: ok: 0: ~ ko: - 10: script_error_oemUnlock_10 + 1: script_error_fastboot_flashingUnlock_failed + 101: script_error_deviceID_missing + 102: script_error_fastbootPath_missing output: ~ succeed: f4 failed: ~ @@ -62,6 +65,7 @@ flash: f5: script: install-from-bootloader-GS290 parameters: + device_id: ${DEVICE_ID} archive_path: ${ARCHIVE_PATH} fastboot_folder_path: ${ADB_FOLDER_PATH} java_folder_path: ${JAVA_FOLDER_PATH} @@ -72,8 +76,9 @@ flash: 1: script_error_installFromFastboot_1 2: script_error_installFromFastboot_2 3: script_error_installFromFastboot_3 - 101: script_error_installFromFastboot_101 + 101: script_error_deviceID_missing 102: script_error_installFromFastboot_102 + 103: script_error_fastbootPath_missing output: ~ succeed: f6 failed: ~ -- GitLab From 4cba349c54216d937d18a6bff3a9dcb0770b1eb8 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Tue, 29 Dec 2020 11:59:09 +0100 Subject: [PATCH 09/69] add yaml for GS_290 --- src/main/resources/yaml/GS290.yml | 99 ++++++++++++++++++++++++++++ src/main/resources/yaml/GS290_fs.yml | 86 ++++++++++++++++++++++++ 2 files changed, 185 insertions(+) create mode 100644 src/main/resources/yaml/GS290.yml create mode 100644 src/main/resources/yaml/GS290_fs.yml diff --git a/src/main/resources/yaml/GS290.yml b/src/main/resources/yaml/GS290.yml new file mode 100644 index 00000000..e108b079 --- /dev/null +++ b/src/main/resources/yaml/GS290.yml @@ -0,0 +1,99 @@ +## Copyright 2019-2020 - ECORP SAS + +## This program is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program. If not, see . +## Author: Vincent Bourgmayer +--- +name: GS290 +flash: + f1: + script: enableOemUnlock + parameters: ~ + codes: ~ + output: ~ + succeed: f2 + failed: ~ + f2: + script: wait-fastboot + parameters: + fastboot_folder_path: ${ADB_FOLDER_PATH} + codes: + ok: + 0: ~ + ko: + 1: script_error_waitFastboot_1 + output: ~ + succeed: f3 + failed: ~ + f3: + script: unlock-GS290 + parameters: + fastboot_folder_path: ${ADB_FOLDER_PATH} + codes: + ok: + 0: ~ + ko: + 10: script_error_oemUnlock_10 + output: ~ + succeed: f4 + failed: ~ + f4: + script: wait-fastboot + parameters: + fastboot_folder_path: ${ADB_FOLDER_PATH} + codes: + ok: + 0: ~ + ko: + 1: script_error_waitFastboot_1 + output: ~ + succeed: f5 + failed: ~ + f5: + script: install-from-bootloader-GS290 + parameters: + archive_path: ${ARCHIVE_PATH} + fastboot_folder_path: ${ADB_FOLDER_PATH} + java_folder_path: ${JAVA_FOLDER_PATH} + codes: + ok: + 0: ~ + ko: + 1: script_error_installFromFastboot_1 + 2: script_error_installFromFastboot_2 + 3: script_error_installFromFastboot_3 + 101: script_error_installFromFastboot_101 + 102: script_error_installFromFastboot_102 + output: ~ + succeed: f6 + failed: ~ + f6: + script: askAccount + parameters: ~ + codes: ~ + output: ~ + succeed: f7 + failed: ~ + f7: + script: wait-reboot-from-fastboot + parameters: + fastboot_folder_path: ${ADB_FOLDER_PATH} + codes: + ok: + 0: ~ + ko: + 1: script_error_unknown + 101: script_error_waitRebootFromFastboot_101 + output: ~ + succeed: ~ + failed: ~ \ No newline at end of file diff --git a/src/main/resources/yaml/GS290_fs.yml b/src/main/resources/yaml/GS290_fs.yml new file mode 100644 index 00000000..b179f7d5 --- /dev/null +++ b/src/main/resources/yaml/GS290_fs.yml @@ -0,0 +1,86 @@ +## Copyright 2019-2020 - ECORP SAS + +## This program is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program. If not, see . +## Author: Vincent Bourgmayer +--- +sources: + rom: + url: https://images.ecloud.global/stable/GS290/IMG-e-latest-GS290.zip + filePath: IMG-e-latest-GS290.zip + boot.img: + url: https://images.ecloud.global/stable/GS290/boot.img + filePath: boot.img + lk.img: + url: https://images.ecloud.global/stable/GS290/lk.img + filePath: lk.img + logo.bin: + url: https://images.ecloud.global/stable/GS290/logo.bin + filePath: logo.bin + recovery: + url: https://images.ecloud.global/stable/GS290/recovery-e-latest-GS290.img + filePath: recovery-e-latest-GS290.img +flash: + f1: + ui: + type: enableOemUnlock + f2: + ui: + type: action + title: stepTitle_StartInFastbootFP3 + instruction: + - install_instr_turnOff + - install_instr_startFastboot + stepNumber: 1/5 + titleIcon: icon-download.png + f3: + ui: + type: load + title: stepTitle2On7 + instruction: + - install_instr_oemUnlock + stepNumber: 2/5 + averageTime: 12 + f4: + ui: + type: action + title: stepTitle3On7FP3 + instruction: + - install_instr_readAllWarning + - install_instr_selectUnlockBootloader + - install_instr_unlockBootloader + - install_instr_bootWarning + - install_instr_startFastbootFromOptions + - install_instr_ifYouMissedTimeout + stepNumber: 3/5 + titleIcon: icon-download.png + f5: + ui: + type: load + title: stepTitle6On7 + instruction: + - install_instr_eosInstall + stepNumber: 4/5 + averageTime: 200 + f6: + ui: + type: askAccount + f7: + ui: + type: action + title: + instruction: + - install_instr_selectLockBootloader + - install_instr_lockBootloader + stepNumber: 5/5 + titleIcon: icon-download.png -- GitLab From 047812b0eebff5554abe7b75a3f877f3f98eaaa9 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Tue, 29 Dec 2020 14:39:15 +0100 Subject: [PATCH 10/69] add linux scripts for GS290 and cp+rename into windows scripts folder --- .../linux/install-from-bootloader-GS290.sh | 56 +++++++++++++++++++ flash-scripts/linux/unlock-GS290.sh | 35 ++++++++++++ .../windows/install-from-bootloader-GS290.bat | 56 +++++++++++++++++++ flash-scripts/windows/unlock-GS290.bat | 35 ++++++++++++ 4 files changed, 182 insertions(+) create mode 100644 flash-scripts/linux/install-from-bootloader-GS290.sh create mode 100644 flash-scripts/linux/unlock-GS290.sh create mode 100644 flash-scripts/windows/install-from-bootloader-GS290.bat create mode 100644 flash-scripts/windows/unlock-GS290.bat diff --git a/flash-scripts/linux/install-from-bootloader-GS290.sh b/flash-scripts/linux/install-from-bootloader-GS290.sh new file mode 100644 index 00000000..b0bf929e --- /dev/null +++ b/flash-scripts/linux/install-from-bootloader-GS290.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +# Copyright (C) 2020 ECORP SAS - Author: Romain Hunault +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Parameter +# $1: DEVICE_ID device id +# $2: ARCHIVE_PATH path to archive + +# Exit status +# - 0 : device flashed +# - 1 : generic error +# - 101 : DEVICE_ID missing +# - 102 : ARCHIVE_PATH missing + +DEVICE_ID=$1 +ARCHIVE_PATH=$2 + +if [ -z $DEVICE_ID ] +then + exit 101 +fi + +if [ -z $ARCHIVE_PATH ] +then + exit 102 +fi + +fastboot -s $DEVICE_ID erase userdata +sleep 1 +fastboot -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img +sleep 1 +fastboot -s $DEVICE_ID flash recovery $ARCHIVE_PATH/recovery-e-latest-GS290.img +sleep 1 +fastboot -s $DEVICE_ID flash system $ARCHIVE_PATH/system.img +sleep 1 +fastboot -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img +sleep 1 +fastboot -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin +sleep 1 +fastboot -w +sleep 1 +fastboot reboot +sleep 1 diff --git a/flash-scripts/linux/unlock-GS290.sh b/flash-scripts/linux/unlock-GS290.sh new file mode 100644 index 00000000..0bdb3fc0 --- /dev/null +++ b/flash-scripts/linux/unlock-GS290.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +# Copyright (C) 2020 ECORP SAS - Author: Romain Hunault +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Parameter +# $1: device id + +# Exit status +# - 0 : bootloader locked +# - 1 : generic error +# - 101 : $DEVICE_ID missing + +DEVICE_ID=$1 + +if [ -z $DEVICE_ID ] +then + exit 101 +fi + +fastboot -s $DEVICE_ID flashing unlock +sleep 1 +# fastboot reboot-bootloader diff --git a/flash-scripts/windows/install-from-bootloader-GS290.bat b/flash-scripts/windows/install-from-bootloader-GS290.bat new file mode 100644 index 00000000..b0bf929e --- /dev/null +++ b/flash-scripts/windows/install-from-bootloader-GS290.bat @@ -0,0 +1,56 @@ +#!/bin/bash + +# Copyright (C) 2020 ECORP SAS - Author: Romain Hunault +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Parameter +# $1: DEVICE_ID device id +# $2: ARCHIVE_PATH path to archive + +# Exit status +# - 0 : device flashed +# - 1 : generic error +# - 101 : DEVICE_ID missing +# - 102 : ARCHIVE_PATH missing + +DEVICE_ID=$1 +ARCHIVE_PATH=$2 + +if [ -z $DEVICE_ID ] +then + exit 101 +fi + +if [ -z $ARCHIVE_PATH ] +then + exit 102 +fi + +fastboot -s $DEVICE_ID erase userdata +sleep 1 +fastboot -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img +sleep 1 +fastboot -s $DEVICE_ID flash recovery $ARCHIVE_PATH/recovery-e-latest-GS290.img +sleep 1 +fastboot -s $DEVICE_ID flash system $ARCHIVE_PATH/system.img +sleep 1 +fastboot -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img +sleep 1 +fastboot -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin +sleep 1 +fastboot -w +sleep 1 +fastboot reboot +sleep 1 diff --git a/flash-scripts/windows/unlock-GS290.bat b/flash-scripts/windows/unlock-GS290.bat new file mode 100644 index 00000000..0bdb3fc0 --- /dev/null +++ b/flash-scripts/windows/unlock-GS290.bat @@ -0,0 +1,35 @@ +#!/bin/bash + +# Copyright (C) 2020 ECORP SAS - Author: Romain Hunault +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Parameter +# $1: device id + +# Exit status +# - 0 : bootloader locked +# - 1 : generic error +# - 101 : $DEVICE_ID missing + +DEVICE_ID=$1 + +if [ -z $DEVICE_ID ] +then + exit 101 +fi + +fastboot -s $DEVICE_ID flashing unlock +sleep 1 +# fastboot reboot-bootloader -- GitLab From 711f308c3aa2bf3a2917945025566895e24498e4 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 30 Dec 2020 16:51:21 +0100 Subject: [PATCH 11/69] convert unlock-GS290 script from shell to batch --- flash-scripts/windows/unlock-GS290.bat | 31 +++++++++++++++++++------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/flash-scripts/windows/unlock-GS290.bat b/flash-scripts/windows/unlock-GS290.bat index 0bdb3fc0..9609b642 100644 --- a/flash-scripts/windows/unlock-GS290.bat +++ b/flash-scripts/windows/unlock-GS290.bat @@ -17,19 +17,34 @@ # Parameter # $1: device id +# $2: fastboot folder path # Exit status # - 0 : bootloader locked # - 1 : generic error # - 101 : $DEVICE_ID missing +# - 102 : $FASTBOOT_FOLDER_PATH is missing -DEVICE_ID=$1 +set DEVICE_ID="%1" +set FASTBOOT_FOLDER_PATH=%~2 +set FASTBOOT_PATH="%FASTBOOT_FOLDER_PATH%fastboot" +echo "FASTBOOT path:"%FASTBOOT_PATH% -if [ -z $DEVICE_ID ] -then - exit 101 -fi +if not defined %DEVICE_ID ( + exit /b 101 +) -fastboot -s $DEVICE_ID flashing unlock -sleep 1 -# fastboot reboot-bootloader +if not defined %FASTBOOT_FOLDER_PATH ( + exit /b 102 +) + +%FASTBOOT_PATH% -s %DEVICE_ID% flashing unlock + +if errorLevel 1 ( + echo "flashing unlock fails" + exit /b 1 +) + +timeout 1 >nul + +exit /b 0 -- GitLab From 6b862e72753d061e66ad514c90a86e81ee114a29 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 30 Dec 2020 16:55:56 +0100 Subject: [PATCH 12/69] add missing parameter to unlock-GS290.sh --- flash-scripts/linux/unlock-GS290.sh | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/flash-scripts/linux/unlock-GS290.sh b/flash-scripts/linux/unlock-GS290.sh index 0bdb3fc0..42647e09 100644 --- a/flash-scripts/linux/unlock-GS290.sh +++ b/flash-scripts/linux/unlock-GS290.sh @@ -17,19 +17,29 @@ # Parameter # $1: device id +# $2: fastboot folder path # Exit status # - 0 : bootloader locked # - 1 : generic error # - 101 : $DEVICE_ID missing +# - 102 : $FASTBOOT_FOLDER_PATH is missing DEVICE_ID=$1 +FASTBOOT_FOLDER_PATH=$2 +FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" if [ -z $DEVICE_ID ] then exit 101 fi -fastboot -s $DEVICE_ID flashing unlock +if [ -z $FASTBOOT_FOLDER_PATH ] +then + exit 102 +fi + + +"$FASTBOOT_PATH" -s $DEVICE_ID flashing unlock sleep 1 # fastboot reboot-bootloader -- GitLab From 5f3270e47d852082b4d8c58448da033f819a743b Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 30 Dec 2020 17:34:49 +0100 Subject: [PATCH 13/69] add missing parameter to install-from-bootloader-GS290.sh --- .../linux/install-from-bootloader-GS290.sh | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/flash-scripts/linux/install-from-bootloader-GS290.sh b/flash-scripts/linux/install-from-bootloader-GS290.sh index b0bf929e..ae8070b2 100644 --- a/flash-scripts/linux/install-from-bootloader-GS290.sh +++ b/flash-scripts/linux/install-from-bootloader-GS290.sh @@ -18,15 +18,19 @@ # Parameter # $1: DEVICE_ID device id # $2: ARCHIVE_PATH path to archive +# $3: fastboot folder path # Exit status # - 0 : device flashed # - 1 : generic error # - 101 : DEVICE_ID missing # - 102 : ARCHIVE_PATH missing +# - 103 : fastboot folder path missing DEVICE_ID=$1 ARCHIVE_PATH=$2 +FASTBOOT_FOLDER_PATH=$3 +FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" if [ -z $DEVICE_ID ] then @@ -38,19 +42,24 @@ then exit 102 fi -fastboot -s $DEVICE_ID erase userdata +if [ -z $FASTBOOT_FOLDER_PATH ] +then + exit 103 +fi + +$FASTBOOT_PATH -s $DEVICE_ID erase userdata sleep 1 -fastboot -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img +$FASTBOOT_PATH -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img sleep 1 -fastboot -s $DEVICE_ID flash recovery $ARCHIVE_PATH/recovery-e-latest-GS290.img +$FASTBOOT_PATH -s $DEVICE_ID flash recovery $ARCHIVE_PATH/recovery-e-latest-GS290.img sleep 1 -fastboot -s $DEVICE_ID flash system $ARCHIVE_PATH/system.img +$FASTBOOT_PATH -s $DEVICE_ID flash system $ARCHIVE_PATH/system.img sleep 1 -fastboot -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img +$FASTBOOT_PATH -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img sleep 1 -fastboot -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin +$FASTBOOT_PATH -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin sleep 1 -fastboot -w +$FASTBOOT_PATH -w sleep 1 -fastboot reboot +$FASTBOOT_PATH reboot sleep 1 -- GitLab From 5fea9299376f9f70c3916d6bb1fb92338a427711 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 30 Dec 2020 17:44:22 +0100 Subject: [PATCH 14/69] convert install-from-bootloader-GS290.sh into bat --- .../linux/install-from-bootloader-GS290.sh | 2 + .../windows/install-from-bootloader-GS290.bat | 60 +++++++++++++------ 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/flash-scripts/linux/install-from-bootloader-GS290.sh b/flash-scripts/linux/install-from-bootloader-GS290.sh index ae8070b2..7957cc1f 100644 --- a/flash-scripts/linux/install-from-bootloader-GS290.sh +++ b/flash-scripts/linux/install-from-bootloader-GS290.sh @@ -47,6 +47,8 @@ then exit 103 fi +# add unzip for system + $FASTBOOT_PATH -s $DEVICE_ID erase userdata sleep 1 $FASTBOOT_PATH -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img diff --git a/flash-scripts/windows/install-from-bootloader-GS290.bat b/flash-scripts/windows/install-from-bootloader-GS290.bat index b0bf929e..ac3ce0dd 100644 --- a/flash-scripts/windows/install-from-bootloader-GS290.bat +++ b/flash-scripts/windows/install-from-bootloader-GS290.bat @@ -18,39 +18,63 @@ # Parameter # $1: DEVICE_ID device id # $2: ARCHIVE_PATH path to archive +# $3: fastboot folder path # Exit status # - 0 : device flashed # - 1 : generic error # - 101 : DEVICE_ID missing # - 102 : ARCHIVE_PATH missing +# - 103 : fastboot folder path missing -DEVICE_ID=$1 -ARCHIVE_PATH=$2 +set DEVICE_ID="%1" +set ARCHIVE_PATH=%~2 +set FASTBOOT_FOLDER_PATH=%~3 +set FASTBOOT_PATH="%FASTBOOT_FOLDER_PATH%fastboot" -if [ -z $DEVICE_ID ] -then - exit 101 -fi +if not defined %DEVICE_ID ( + exit /b 101 +) -if [ -z $ARCHIVE_PATH ] -then - exit 102 -fi +if not defined %ARCHIVE_PATH ( + exit /b 102 +) -fastboot -s $DEVICE_ID erase userdata +if not defined %FASTBOOT_FOLDER_PATH ( + exit /b 103 +) + +for %%a in ("%ARCHIVE_PATH%") do ( + set ARCHIVE_NAME="%%~na" +) + +for %%a in ("%ARCHIVE_PATH%") do ( + set ARCHIVE_FOLDER_PATH="%%~dpa" +) + +echo "archive path : "%ARCHIVE_PATH% +echo "archive folder path : "%ARCHIVE_FOLDER_PATH% +echo "fastboot path : "%FASTBOOT_PATH% + +cd "%ARCHIVE_FOLDER_PATH%" + +timeout 1 >nul 2>&1 + +# Should we unzip ? + +%FASTBOOT_PATH% -s %DEVICE_ID% erase userdata sleep 1 -fastboot -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img +%FASTBOOT_PATH% -s %DEVICE_ID% flash --disable-verity --disable-verification boot boot.img sleep 1 -fastboot -s $DEVICE_ID flash recovery $ARCHIVE_PATH/recovery-e-latest-GS290.img +%FASTBOOT_PATH% -s %DEVICE_ID% flash recovery recovery-e-latest-GS290.img sleep 1 -fastboot -s $DEVICE_ID flash system $ARCHIVE_PATH/system.img +%FASTBOOT_PATH% -s %DEVICE_ID% flash system system.img sleep 1 -fastboot -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img +%FASTBOOT_PATH% -s %DEVICE_ID% flash lk lk.img sleep 1 -fastboot -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin +%FASTBOOT_PATH% -s %DEVICE_ID% flash logo logo.bin sleep 1 -fastboot -w +%FASTBOOT_PATH% -w sleep 1 -fastboot reboot +%FASTBOOT_PATH% reboot sleep 1 -- GitLab From af88b48b434a4cba73ba1f5e49126126cbcc7330 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Thu, 31 Dec 2020 12:18:10 +0100 Subject: [PATCH 15/69] update some scripts for GS290 --- flash-scripts/linux/install-from-bootloader-GS290.sh | 4 ++-- flash-scripts/windows/install-from-bootloader-GS290.bat | 4 ++-- flash-scripts/windows/unlock-GS290.bat | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/flash-scripts/linux/install-from-bootloader-GS290.sh b/flash-scripts/linux/install-from-bootloader-GS290.sh index 7957cc1f..cb90a19e 100644 --- a/flash-scripts/linux/install-from-bootloader-GS290.sh +++ b/flash-scripts/linux/install-from-bootloader-GS290.sh @@ -61,7 +61,7 @@ $FASTBOOT_PATH -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img sleep 1 $FASTBOOT_PATH -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin sleep 1 -$FASTBOOT_PATH -w +$FASTBOOT_PATH -s $DEVICE_ID -w sleep 1 -$FASTBOOT_PATH reboot +$FASTBOOT_PATH -s $DEVICE_ID reboot sleep 1 diff --git a/flash-scripts/windows/install-from-bootloader-GS290.bat b/flash-scripts/windows/install-from-bootloader-GS290.bat index ac3ce0dd..999d30d8 100644 --- a/flash-scripts/windows/install-from-bootloader-GS290.bat +++ b/flash-scripts/windows/install-from-bootloader-GS290.bat @@ -74,7 +74,7 @@ sleep 1 sleep 1 %FASTBOOT_PATH% -s %DEVICE_ID% flash logo logo.bin sleep 1 -%FASTBOOT_PATH% -w +%FASTBOOT_PATH% -s %DEVICE_ID% -w sleep 1 -%FASTBOOT_PATH% reboot +%FASTBOOT_PATH% -s %DEVICE_ID% reboot sleep 1 diff --git a/flash-scripts/windows/unlock-GS290.bat b/flash-scripts/windows/unlock-GS290.bat index 9609b642..b5fb97fe 100644 --- a/flash-scripts/windows/unlock-GS290.bat +++ b/flash-scripts/windows/unlock-GS290.bat @@ -20,8 +20,8 @@ # $2: fastboot folder path # Exit status -# - 0 : bootloader locked -# - 1 : generic error +# - 0 : flashing unlocked +# - 1 : flashing unlock failed # - 101 : $DEVICE_ID missing # - 102 : $FASTBOOT_FOLDER_PATH is missing -- GitLab From a19b877f7c4ddc09503e82e41e5838ba8dbf9bc6 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Thu, 31 Dec 2020 12:18:38 +0100 Subject: [PATCH 16/69] update GS290 config file & add missing translation entries --- src/main/resources/lang/translation.properties | 3 +++ src/main/resources/yaml/GS290.yml | 9 +++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/resources/lang/translation.properties b/src/main/resources/lang/translation.properties index 64f746f4..9c2ca7f8 100644 --- a/src/main/resources/lang/translation.properties +++ b/src/main/resources/lang/translation.properties @@ -178,6 +178,9 @@ script_error_installFromFastboot_102 = Could not unpack /e/ install archive script_error_waitReboot_10 = No device's serial number provided script_error_waitReboot_101 = Can't run instruction on the device script_error_waitRebootFromFastboot_101 = Can't run instruction on the device +script_error_serialNumber_missing=No device's serial number provided +script_error_fastboot_path_missing= No fastboot tool path provided +script_error_fastboot_flashingUnlock_failed=Could not unlock flashing script_error_unknown= The installation encounter an error java_error_unknow= The installation encounter an internal error flash_process_cancelled=The installation process has been cancelled diff --git a/src/main/resources/yaml/GS290.yml b/src/main/resources/yaml/GS290.yml index e108b079..4696621d 100644 --- a/src/main/resources/yaml/GS290.yml +++ b/src/main/resources/yaml/GS290.yml @@ -38,12 +38,15 @@ flash: f3: script: unlock-GS290 parameters: + device_id: ${DEVICE_ID} fastboot_folder_path: ${ADB_FOLDER_PATH} codes: ok: 0: ~ ko: - 10: script_error_oemUnlock_10 + 1: script_error_fastboot_flashingUnlock_failed + 101: script_error_deviceID_missing + 102: script_error_fastbootPath_missing output: ~ succeed: f4 failed: ~ @@ -62,6 +65,7 @@ flash: f5: script: install-from-bootloader-GS290 parameters: + device_id: ${DEVICE_ID} archive_path: ${ARCHIVE_PATH} fastboot_folder_path: ${ADB_FOLDER_PATH} java_folder_path: ${JAVA_FOLDER_PATH} @@ -72,8 +76,9 @@ flash: 1: script_error_installFromFastboot_1 2: script_error_installFromFastboot_2 3: script_error_installFromFastboot_3 - 101: script_error_installFromFastboot_101 + 101: script_error_deviceID_missing 102: script_error_installFromFastboot_102 + 103: script_error_fastbootPath_missing output: ~ succeed: f6 failed: ~ -- GitLab From bdaa8aa034dabee766bc6e89e76e2a74ce9ec48a Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Tue, 26 Jan 2021 18:48:46 +0100 Subject: [PATCH 17/69] update instruction key in GS290_fs.yml --- src/main/resources/yaml/GS290_fs.yml | 41 ++++++++++++++++------------ 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/src/main/resources/yaml/GS290_fs.yml b/src/main/resources/yaml/GS290_fs.yml index b179f7d5..9a019cb4 100644 --- a/src/main/resources/yaml/GS290_fs.yml +++ b/src/main/resources/yaml/GS290_fs.yml @@ -33,15 +33,27 @@ sources: flash: f1: ui: - type: enableOemUnlock + type: action + title: stepTitle_checkDeviceUptodate + instruction: + - install_instr_connectTowifi + - install_instr_GS290_accessSystemSettings + - install_instr_GS290_accessSystemUpdate + - install_instr_doAnyUpdates + - install_instr_continueIfDeviceUpToDate + stepNumber: 1/6 + titleIcon: icon-download.png f2: ui: type: action - title: stepTitle_StartInFastbootFP3 + title: stepTitle_enableOemUnlock instruction: - - install_instr_turnOff - - install_instr_startFastboot - stepNumber: 1/5 + - install_instr_GS290_accessSettings + - install_instr_searchOEM + - install_instr_enableOEMUnlocking + - install_instr_acceptOEMUnlockWarning + - install_instr_onceDoneThenContinue + stepNumber: 2/6 titleIcon: icon-download.png f3: ui: @@ -49,20 +61,16 @@ flash: title: stepTitle2On7 instruction: - install_instr_oemUnlock - stepNumber: 2/5 + stepNumber: 3/6 averageTime: 12 f4: ui: type: action title: stepTitle3On7FP3 instruction: - - install_instr_readAllWarning - - install_instr_selectUnlockBootloader - - install_instr_unlockBootloader - - install_instr_bootWarning - - install_instr_startFastbootFromOptions - - install_instr_ifYouMissedTimeout - stepNumber: 3/5 + - install_instr_pressVolUpTo + - install_instr_waitInstallStartAuto + stepNumber: 4/6 titleIcon: icon-download.png f5: ui: @@ -70,7 +78,7 @@ flash: title: stepTitle6On7 instruction: - install_instr_eosInstall - stepNumber: 4/5 + stepNumber: 5/6 averageTime: 200 f6: ui: @@ -80,7 +88,6 @@ flash: type: action title: instruction: - - install_instr_selectLockBootloader - - install_instr_lockBootloader - stepNumber: 5/5 + - install_instr_onceDeviceRebootThenContinue + stepNumber: 6/6 titleIcon: icon-download.png -- GitLab From 90671c96d4c0367ea4cfb281506588173de43f92 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 27 Jan 2021 10:49:27 +0100 Subject: [PATCH 18/69] update title of step and add missing text in translation.properties --- src/main/resources/lang/translation.properties | 6 +++++- src/main/resources/yaml/GS290_fs.yml | 10 +++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/resources/lang/translation.properties b/src/main/resources/lang/translation.properties index 9c2ca7f8..ef30c974 100644 --- a/src/main/resources/lang/translation.properties +++ b/src/main/resources/lang/translation.properties @@ -251,4 +251,8 @@ stepTitle_formatDataTurnOff = Format data and turn off stepTitle_restartRecovery = Restart in Recovery mode stepTitle_installOS = /e/ Installation stepTitle_resizeDataPartition = Resize Data partition -stepTitle_StartInFastbootFP3 = Start device in Fastboot mode \ No newline at end of file +stepTitle_StartInFastbootFP3 = Start device in Fastboot mode +stepTitle_checkDeviceUptodate= Check device is up-to-date +stepTitle_enableOemUnlock= Enable OEM unlocking +stepTitle_beforeInstallation= Before installation +stepTitle_rebootDevice= Reboot device \ No newline at end of file diff --git a/src/main/resources/yaml/GS290_fs.yml b/src/main/resources/yaml/GS290_fs.yml index 9a019cb4..4d79935f 100644 --- a/src/main/resources/yaml/GS290_fs.yml +++ b/src/main/resources/yaml/GS290_fs.yml @@ -33,7 +33,7 @@ sources: flash: f1: ui: - type: action + cd type: action title: stepTitle_checkDeviceUptodate instruction: - install_instr_connectTowifi @@ -58,7 +58,7 @@ flash: f3: ui: type: load - title: stepTitle2On7 + title: stepTitle_oemUnlock instruction: - install_instr_oemUnlock stepNumber: 3/6 @@ -66,7 +66,7 @@ flash: f4: ui: type: action - title: stepTitle3On7FP3 + title: stepTitle_beforeInstallation instruction: - install_instr_pressVolUpTo - install_instr_waitInstallStartAuto @@ -75,7 +75,7 @@ flash: f5: ui: type: load - title: stepTitle6On7 + title: stepTitle_installOS instruction: - install_instr_eosInstall stepNumber: 5/6 @@ -86,7 +86,7 @@ flash: f7: ui: type: action - title: + title: stepTitle_rebootDevice instruction: - install_instr_onceDeviceRebootThenContinue stepNumber: 6/6 -- GitLab From 8f78c1b524b1bf4e8460776eafaa25b435421a28 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 27 Jan 2021 11:59:04 +0100 Subject: [PATCH 19/69] add missing instructions's text for GS290 and update some instruction key in GS290 config file --- src/main/resources/lang/translation.properties | 12 ++++++++++++ src/main/resources/yaml/GS290_fs.yml | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/resources/lang/translation.properties b/src/main/resources/lang/translation.properties index ef30c974..08377dec 100644 --- a/src/main/resources/lang/translation.properties +++ b/src/main/resources/lang/translation.properties @@ -158,6 +158,18 @@ install_instr_startDl_pressPowerBixbyVolDown= Keep pressing simultaneously "Powe install_instr_startRec_pressPowerBixbyVolUp= Keep pressing simultaneously "Power" & "Bixby" & "Volume Up" until 'teamwin' screen appears install_instr_leaveDl_pressPowerBixbyVolDown= Keep pressing simultaneously "Power" & "Bixby" & "Volume Down" until device turns off install_instr_update_stockrom= Update your device to the latest version +install_instr_connectTowifi= Connect your device to Wi-fi +install_instr_GS290_accessSystemSettings = Open Settings and go to "System" +install_instr_GS290_accessSystemUpdate = Open "System update" +install_instr_continueIfDeviceUpToDate = Once your device is up-to-date, you can click on continue. Note that you must have the latest Android 10 version installed. +install_instr_GS290_accessSettings = Access to settings +install_instr_searchOEM = Tap on the search icon. Type "OEM" to search "OEM unlocking" option +install_instr_enableOEMUnlocking = Enable "OEM unlocking" +install_instr_acceptOEMUnlockWarning = Accept the warning message by taping on "enable" +install_instr_onceDoneThenContinue = Once OEM unlocking is enabled, you can click on continue +install_instr_waitInstallStartAuto = Please wait, installation will start automatically +install_instr_onceDeviceRebootThenContinue = Your device will reboot automatically. Once it's done, you can click on continue + script_error_waitDownload_1 = Can't detect device in "Download mode" script_error_waitFastboot_1 = Can't detect device in "fastboot mode" script_error_oemUnlock_10 = Can't allow custom OS installation on your device diff --git a/src/main/resources/yaml/GS290_fs.yml b/src/main/resources/yaml/GS290_fs.yml index 4d79935f..66f1d38f 100644 --- a/src/main/resources/yaml/GS290_fs.yml +++ b/src/main/resources/yaml/GS290_fs.yml @@ -39,7 +39,7 @@ flash: - install_instr_connectTowifi - install_instr_GS290_accessSystemSettings - install_instr_GS290_accessSystemUpdate - - install_instr_doAnyUpdates + - install_instr_update_stockrom - install_instr_continueIfDeviceUpToDate stepNumber: 1/6 titleIcon: icon-download.png -- GitLab From 92b796b4e8fa662a18e9d5111c8a38e3855497ad Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 27 Jan 2021 17:15:44 +0100 Subject: [PATCH 20/69] rewrote scripts for GS290 --- ...nlock-GS290.sh => gs290-flashingUnlock.sh} | 16 +- .../linux/gs290-install-from-bootloader.sh | 139 ++++++++++++++++++ .../linux/gs290-wait-reboot-from-fastboot.sh | 50 +++++++ .../linux/install-from-bootloader-GS290.sh | 67 --------- flash-scripts/linux/reboot-fastboot.sh | 63 ++++++++ 5 files changed, 264 insertions(+), 71 deletions(-) rename flash-scripts/linux/{unlock-GS290.sh => gs290-flashingUnlock.sh} (80%) create mode 100644 flash-scripts/linux/gs290-install-from-bootloader.sh create mode 100644 flash-scripts/linux/gs290-wait-reboot-from-fastboot.sh delete mode 100644 flash-scripts/linux/install-from-bootloader-GS290.sh create mode 100644 flash-scripts/linux/reboot-fastboot.sh diff --git a/flash-scripts/linux/unlock-GS290.sh b/flash-scripts/linux/gs290-flashingUnlock.sh similarity index 80% rename from flash-scripts/linux/unlock-GS290.sh rename to flash-scripts/linux/gs290-flashingUnlock.sh index 42647e09..34992211 100644 --- a/flash-scripts/linux/unlock-GS290.sh +++ b/flash-scripts/linux/gs290-flashingUnlock.sh @@ -21,25 +21,33 @@ # Exit status # - 0 : bootloader locked -# - 1 : generic error +# - 1 : unknown error +# - 2 : Flashing unlocked failed # - 101 : $DEVICE_ID missing # - 102 : $FASTBOOT_FOLDER_PATH is missing DEVICE_ID=$1 FASTBOOT_FOLDER_PATH=$2 -FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" +# check serial number has been provided if [ -z $DEVICE_ID ] then exit 101 fi +# Check fastboot parent folder path has been provided if [ -z $FASTBOOT_FOLDER_PATH ] then exit 102 fi +# Build fastboot path +FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" + +# Unlock bootloader +if ! "$FASTBOOT_PATH" -s $DEVICE_ID flashing unlock +then + exit 2 +fi -"$FASTBOOT_PATH" -s $DEVICE_ID flashing unlock sleep 1 -# fastboot reboot-bootloader diff --git a/flash-scripts/linux/gs290-install-from-bootloader.sh b/flash-scripts/linux/gs290-install-from-bootloader.sh new file mode 100644 index 00000000..53fa7ed6 --- /dev/null +++ b/flash-scripts/linux/gs290-install-from-bootloader.sh @@ -0,0 +1,139 @@ +#!/bin/bash + +# Copyright (C) 2020 ECORP SAS - Author: Romain Hunault +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Parameter +# $1: DEVICE_ID device id +# $2: ARCHIVE_PATH path to archive +# $3: fastboot folder path +# $4: Java folder path + + +# Exit status +# - 0 : device flashed +# - 1 : generic error +# - 10: can't unpack system.img +# - 11: can't wipe data +# - 12: can't flash boot +# - 13: can't flash recovery +# - 14: can't flash system +# - 15: can't flash lk +# - 16: can't flash logo +# - 101 : DEVICE_ID missing +# - 102 : ARCHIVE_PATH missing +# - 103 : fastboot folder path missing + +DEVICE_ID=$1 +ARCHIVE_PATH=$2 +FASTBOOT_FOLDER_PATH=$3 +JAVA_FOLDER_PATH=$4 + +# Check serial number has been provided +if [ -z $DEVICE_ID ] +then + exit 101 +fi + +# check path to rom has been provided +if [ -z $ARCHIVE_PATH ] +then + exit 102 +fi + +#check path to adb/fasboot has been provided +if [ -z $FASTBOOT_FOLDER_PATH ] +then + exit 103 +fi + +# Check java folder has been provided +if [ -z JAVA_FOLDER_PATH ] +then + exit 104 +fi + + +# Build fastboot path +FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" + +# Build java jar path +JAR_PATH=${JAVA_FOLDER_PATH}"/bin/jar" + +# Build archive folder path +ARCHIVE_FOLDER_PATH=$(dirname "$1")"/" + +# unzip for system.img +cd "$ARCHIVE_FOLDER_PATH" + +if ! "$JAR_PATH" -x -v -f "$ARCHIVE_PATH" ; +then + exit 10 +fi + +echo "unpacked archive" + +sleep 1 + +# Wipe user data +if ! "$FASTBOOT_PATH" -w ; +then + exit 11 +fi + +echo "user data wiped" + +sleep 5 + + +# Flash the device + +sleep 1 +if !$FASTBOOT_PATH -s $DEVICE_ID flash --disable-verity --disable-verification boot boot.img +then + exit 12 +fi +sleep 1 +echo "Flashed boot" + +if !$FASTBOOT_PATH -s $DEVICE_ID flash recovery recovery-e-latest-GS290.img +then + exit 13 +fi +sleep 1 +echo "Flashed recovery" + +$FASTBOOT_PATH -s $DEVICE_ID flash system system.img +then + exit 14 +fi +sleep 1 +echo "Flashed system" + +$FASTBOOT_PATH -s $DEVICE_ID flash lk lk.img +then + exit 15 +fi +sleep 1 +echo "Flashed lk" + +$FASTBOOT_PATH -s $DEVICE_ID flash logo logo.bin +then + exit 16 +fi +sleep 1 +echo "Flashed logo" + + diff --git a/flash-scripts/linux/gs290-wait-reboot-from-fastboot.sh b/flash-scripts/linux/gs290-wait-reboot-from-fastboot.sh new file mode 100644 index 00000000..0a79a4b4 --- /dev/null +++ b/flash-scripts/linux/gs290-wait-reboot-from-fastboot.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +# Copyright (C) 2020 ECORP SAS - Author: Vincent Bourgmayer +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Parameter + +# $1: ADB_FOLDER_PATH: the path where runnable adb is stored + +# Exit status +# - 0 : success +# - 1 : unknown error +# - 10 : fastboot reboot command failed +# - 101 : no device found in fastboot + +FASTBOOT_FOLDER_PATH=$1 +FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" + +echo "fastboot path: $FASTBOOT_PATH" + +#check that device is in recovery mode +if ! "$FASTBOOT_PATH" devices 2>&1 | grep "fastboot" +then + echo "Device not detected in fastboot" + exit 101 +fi + +# Reboot the device +if ! "$FASTBOOT_PATH" reboot +then + exit 10 +fi + +#Then we wait that it left this state +while [ "$($FASTBOOT_PATH devices | grep -q fastboot; echo $?)" = 0 ] +do + sleep 1s +done \ No newline at end of file diff --git a/flash-scripts/linux/install-from-bootloader-GS290.sh b/flash-scripts/linux/install-from-bootloader-GS290.sh deleted file mode 100644 index cb90a19e..00000000 --- a/flash-scripts/linux/install-from-bootloader-GS290.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/bash - -# Copyright (C) 2020 ECORP SAS - Author: Romain Hunault -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# Parameter -# $1: DEVICE_ID device id -# $2: ARCHIVE_PATH path to archive -# $3: fastboot folder path - -# Exit status -# - 0 : device flashed -# - 1 : generic error -# - 101 : DEVICE_ID missing -# - 102 : ARCHIVE_PATH missing -# - 103 : fastboot folder path missing - -DEVICE_ID=$1 -ARCHIVE_PATH=$2 -FASTBOOT_FOLDER_PATH=$3 -FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" - -if [ -z $DEVICE_ID ] -then - exit 101 -fi - -if [ -z $ARCHIVE_PATH ] -then - exit 102 -fi - -if [ -z $FASTBOOT_FOLDER_PATH ] -then - exit 103 -fi - -# add unzip for system - -$FASTBOOT_PATH -s $DEVICE_ID erase userdata -sleep 1 -$FASTBOOT_PATH -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img -sleep 1 -$FASTBOOT_PATH -s $DEVICE_ID flash recovery $ARCHIVE_PATH/recovery-e-latest-GS290.img -sleep 1 -$FASTBOOT_PATH -s $DEVICE_ID flash system $ARCHIVE_PATH/system.img -sleep 1 -$FASTBOOT_PATH -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img -sleep 1 -$FASTBOOT_PATH -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin -sleep 1 -$FASTBOOT_PATH -s $DEVICE_ID -w -sleep 1 -$FASTBOOT_PATH -s $DEVICE_ID reboot -sleep 1 diff --git a/flash-scripts/linux/reboot-fastboot.sh b/flash-scripts/linux/reboot-fastboot.sh new file mode 100644 index 00000000..7879d68a --- /dev/null +++ b/flash-scripts/linux/reboot-fastboot.sh @@ -0,0 +1,63 @@ +#!/bin/bash + +# Copyright (C) 2020 - Author: Ingo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# TODO: What if 2 devices detected? +# Parameter +# $1: serial number of the device +# $2: The folder where fastboot runnable is stored + +# Exit status +# - 0 : Device in fastboot mode detected +# - 1 : unknown Error +# - 10: rebooting in bootloader failed +# - 101: Device ID not provided +# - 102: Missing path to adb and fastboot + +DEVICE_ID=$1 +ADBFASTBOOT_FOLDER_PATH=$2 + +# Check DEVICE ID has been provided +if [ -z "$DEVICE_ID" ] +then + exit 101 +fi + +# Check adb and fastboot parent path has been provided +if [ -z "ADBFASTBOOT_FOLDER_PATH" ] +then + exit 102 +fi + +# Construct path to ADB and FASTBOOT +FASTBOOT_PATH=${ADBFASTBOOT_FOLDER_PATH}"fastboot" +ADB_PATH=${ADBFASTBOOT_FOLDER_PATH}"adb" + +# reboot device in bootloader mode +if !"ADB_PATH" -s "$DEVICE_ID" reboot bootloader +then + exit 10; +fi + +# Wait device to reboot in fastboot mode +while [ "$($FASTBOOT_PATH devices | grep -q fastboot; echo $?)" = 1 ] +do + sleep 3s +done +#TODO: we should handle the case where this doesn't work + +sleep 5s +echo "fastboot mode detected" \ No newline at end of file -- GitLab From f74b6d084c6399eabc57643994231f7e5d1cb40c Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 27 Jan 2021 17:16:19 +0100 Subject: [PATCH 21/69] update configs for GS290 --- src/main/resources/yaml/GS290.yml | 44 ++++++++++++++++------------ src/main/resources/yaml/GS290_fs.yml | 9 +++--- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/main/resources/yaml/GS290.yml b/src/main/resources/yaml/GS290.yml index 4696621d..9817806a 100644 --- a/src/main/resources/yaml/GS290.yml +++ b/src/main/resources/yaml/GS290.yml @@ -17,26 +17,21 @@ name: GS290 flash: f1: - script: enableOemUnlock + script: ~ parameters: ~ codes: ~ output: ~ succeed: f2 failed: ~ f2: - script: wait-fastboot - parameters: - fastboot_folder_path: ${ADB_FOLDER_PATH} - codes: - ok: - 0: ~ - ko: - 1: script_error_waitFastboot_1 + script: ~ + parameters: ~ + codes: ~ output: ~ succeed: f3 failed: ~ f3: - script: unlock-GS290 + script: reboot-fastboot parameters: device_id: ${DEVICE_ID} fastboot_folder_path: ${ADB_FOLDER_PATH} @@ -44,26 +39,31 @@ flash: ok: 0: ~ ko: - 1: script_error_fastboot_flashingUnlock_failed + 1: script_error_unknown + 10: script_error_cantRebootBootloader 101: script_error_deviceID_missing 102: script_error_fastbootPath_missing output: ~ succeed: f4 failed: ~ f4: - script: wait-fastboot + script: gs290-flashingUnlock parameters: + device_id: ${DEVICE_ID} fastboot_folder_path: ${ADB_FOLDER_PATH} codes: ok: 0: ~ ko: - 1: script_error_waitFastboot_1 + 1: script_error_unknown + 2: script_error_flashingUnlockFailed + 101: script_error_deviceID_missing + 102: script_error_fastbootPath_missing output: ~ succeed: f5 failed: ~ f5: - script: install-from-bootloader-GS290 + script: gs290-install-from-bootloader parameters: device_id: ${DEVICE_ID} archive_path: ${ARCHIVE_PATH} @@ -73,9 +73,14 @@ flash: ok: 0: ~ ko: - 1: script_error_installFromFastboot_1 - 2: script_error_installFromFastboot_2 - 3: script_error_installFromFastboot_3 + 1: script_error_unknown + 10: script_error_cantUnpackSources + 11: script_error_cantWipeData + 12: script_error_cantFlashBoot + 13: script_error_cantFlashRecovery + 14: script_error_cantFlashsystem + 15: script_error_cantFlashLk + 16: script_error_cantFlashLogo 101: script_error_deviceID_missing 102: script_error_installFromFastboot_102 103: script_error_fastbootPath_missing @@ -90,7 +95,7 @@ flash: succeed: f7 failed: ~ f7: - script: wait-reboot-from-fastboot + script: gs290-wait-reboot-from-fastboot parameters: fastboot_folder_path: ${ADB_FOLDER_PATH} codes: @@ -98,7 +103,8 @@ flash: 0: ~ ko: 1: script_error_unknown - 101: script_error_waitRebootFromFastboot_101 + 10: script_error_cantrebootFromFasboot + 101: script_error_noDeviceFoundInFastboot output: ~ succeed: ~ failed: ~ \ No newline at end of file diff --git a/src/main/resources/yaml/GS290_fs.yml b/src/main/resources/yaml/GS290_fs.yml index 66f1d38f..c1747e63 100644 --- a/src/main/resources/yaml/GS290_fs.yml +++ b/src/main/resources/yaml/GS290_fs.yml @@ -58,17 +58,18 @@ flash: f3: ui: type: load - title: stepTitle_oemUnlock + title: stepTitle_rebootBootloader instruction: - - install_instr_oemUnlock + - install_instr_rebootingOnBootloader stepNumber: 3/6 averageTime: 12 f4: ui: type: action - title: stepTitle_beforeInstallation + title: stepTitle_oemUnlock instruction: - - install_instr_pressVolUpTo + - install_instr_pressVolUpToAcceptOEMUnlocking + - install_instr_unlockingOem - install_instr_waitInstallStartAuto stepNumber: 4/6 titleIcon: icon-download.png -- GitLab From 4a5df37ce4e25d3b1ea0585958cc7f10f47d447d Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Tue, 2 Feb 2021 10:26:01 +0100 Subject: [PATCH 22/69] add missing GS290 translation key in translation.properties --- src/main/resources/lang/translation.properties | 5 +++-- src/main/resources/yaml/GS290_fs.yml | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/resources/lang/translation.properties b/src/main/resources/lang/translation.properties index 08377dec..437e1bd1 100644 --- a/src/main/resources/lang/translation.properties +++ b/src/main/resources/lang/translation.properties @@ -162,14 +162,15 @@ install_instr_connectTowifi= Connect your device to Wi-fi install_instr_GS290_accessSystemSettings = Open Settings and go to "System" install_instr_GS290_accessSystemUpdate = Open "System update" install_instr_continueIfDeviceUpToDate = Once your device is up-to-date, you can click on continue. Note that you must have the latest Android 10 version installed. -install_instr_GS290_accessSettings = Access to settings install_instr_searchOEM = Tap on the search icon. Type "OEM" to search "OEM unlocking" option install_instr_enableOEMUnlocking = Enable "OEM unlocking" install_instr_acceptOEMUnlockWarning = Accept the warning message by taping on "enable" install_instr_onceDoneThenContinue = Once OEM unlocking is enabled, you can click on continue install_instr_waitInstallStartAuto = Please wait, installation will start automatically install_instr_onceDeviceRebootThenContinue = Your device will reboot automatically. Once it's done, you can click on continue - +install_instr_rebootingOnBootloader=Your device will reboot automatically on bootloader mode +install_instr_pressVolUpToAcceptOEMUnlocking = Press "Volume up" to accept OEM unlocking +install_instr_unlockingOem= Easy-installer is unlocking OEM script_error_waitDownload_1 = Can't detect device in "Download mode" script_error_waitFastboot_1 = Can't detect device in "fastboot mode" script_error_oemUnlock_10 = Can't allow custom OS installation on your device diff --git a/src/main/resources/yaml/GS290_fs.yml b/src/main/resources/yaml/GS290_fs.yml index c1747e63..31480a2b 100644 --- a/src/main/resources/yaml/GS290_fs.yml +++ b/src/main/resources/yaml/GS290_fs.yml @@ -48,7 +48,7 @@ flash: type: action title: stepTitle_enableOemUnlock instruction: - - install_instr_GS290_accessSettings + - install_instr_openSettings - install_instr_searchOEM - install_instr_enableOEMUnlocking - install_instr_acceptOEMUnlockWarning -- GitLab From ed1854466e90a504d87f2cf338eeb8bff15fa5b0 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Tue, 29 Dec 2020 11:59:09 +0100 Subject: [PATCH 23/69] add yaml for GS_290 --- src/main/resources/yaml/GS290.yml | 99 ++++++++++++++++++++++++++++ src/main/resources/yaml/GS290_fs.yml | 86 ++++++++++++++++++++++++ 2 files changed, 185 insertions(+) create mode 100644 src/main/resources/yaml/GS290.yml create mode 100644 src/main/resources/yaml/GS290_fs.yml diff --git a/src/main/resources/yaml/GS290.yml b/src/main/resources/yaml/GS290.yml new file mode 100644 index 00000000..e108b079 --- /dev/null +++ b/src/main/resources/yaml/GS290.yml @@ -0,0 +1,99 @@ +## Copyright 2019-2020 - ECORP SAS + +## This program is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program. If not, see . +## Author: Vincent Bourgmayer +--- +name: GS290 +flash: + f1: + script: enableOemUnlock + parameters: ~ + codes: ~ + output: ~ + succeed: f2 + failed: ~ + f2: + script: wait-fastboot + parameters: + fastboot_folder_path: ${ADB_FOLDER_PATH} + codes: + ok: + 0: ~ + ko: + 1: script_error_waitFastboot_1 + output: ~ + succeed: f3 + failed: ~ + f3: + script: unlock-GS290 + parameters: + fastboot_folder_path: ${ADB_FOLDER_PATH} + codes: + ok: + 0: ~ + ko: + 10: script_error_oemUnlock_10 + output: ~ + succeed: f4 + failed: ~ + f4: + script: wait-fastboot + parameters: + fastboot_folder_path: ${ADB_FOLDER_PATH} + codes: + ok: + 0: ~ + ko: + 1: script_error_waitFastboot_1 + output: ~ + succeed: f5 + failed: ~ + f5: + script: install-from-bootloader-GS290 + parameters: + archive_path: ${ARCHIVE_PATH} + fastboot_folder_path: ${ADB_FOLDER_PATH} + java_folder_path: ${JAVA_FOLDER_PATH} + codes: + ok: + 0: ~ + ko: + 1: script_error_installFromFastboot_1 + 2: script_error_installFromFastboot_2 + 3: script_error_installFromFastboot_3 + 101: script_error_installFromFastboot_101 + 102: script_error_installFromFastboot_102 + output: ~ + succeed: f6 + failed: ~ + f6: + script: askAccount + parameters: ~ + codes: ~ + output: ~ + succeed: f7 + failed: ~ + f7: + script: wait-reboot-from-fastboot + parameters: + fastboot_folder_path: ${ADB_FOLDER_PATH} + codes: + ok: + 0: ~ + ko: + 1: script_error_unknown + 101: script_error_waitRebootFromFastboot_101 + output: ~ + succeed: ~ + failed: ~ \ No newline at end of file diff --git a/src/main/resources/yaml/GS290_fs.yml b/src/main/resources/yaml/GS290_fs.yml new file mode 100644 index 00000000..b179f7d5 --- /dev/null +++ b/src/main/resources/yaml/GS290_fs.yml @@ -0,0 +1,86 @@ +## Copyright 2019-2020 - ECORP SAS + +## This program is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program. If not, see . +## Author: Vincent Bourgmayer +--- +sources: + rom: + url: https://images.ecloud.global/stable/GS290/IMG-e-latest-GS290.zip + filePath: IMG-e-latest-GS290.zip + boot.img: + url: https://images.ecloud.global/stable/GS290/boot.img + filePath: boot.img + lk.img: + url: https://images.ecloud.global/stable/GS290/lk.img + filePath: lk.img + logo.bin: + url: https://images.ecloud.global/stable/GS290/logo.bin + filePath: logo.bin + recovery: + url: https://images.ecloud.global/stable/GS290/recovery-e-latest-GS290.img + filePath: recovery-e-latest-GS290.img +flash: + f1: + ui: + type: enableOemUnlock + f2: + ui: + type: action + title: stepTitle_StartInFastbootFP3 + instruction: + - install_instr_turnOff + - install_instr_startFastboot + stepNumber: 1/5 + titleIcon: icon-download.png + f3: + ui: + type: load + title: stepTitle2On7 + instruction: + - install_instr_oemUnlock + stepNumber: 2/5 + averageTime: 12 + f4: + ui: + type: action + title: stepTitle3On7FP3 + instruction: + - install_instr_readAllWarning + - install_instr_selectUnlockBootloader + - install_instr_unlockBootloader + - install_instr_bootWarning + - install_instr_startFastbootFromOptions + - install_instr_ifYouMissedTimeout + stepNumber: 3/5 + titleIcon: icon-download.png + f5: + ui: + type: load + title: stepTitle6On7 + instruction: + - install_instr_eosInstall + stepNumber: 4/5 + averageTime: 200 + f6: + ui: + type: askAccount + f7: + ui: + type: action + title: + instruction: + - install_instr_selectLockBootloader + - install_instr_lockBootloader + stepNumber: 5/5 + titleIcon: icon-download.png -- GitLab From e98a79890b3c4aa4e0c6cf68b3915957949e06b2 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Tue, 29 Dec 2020 14:39:15 +0100 Subject: [PATCH 24/69] add linux scripts for GS290 and cp+rename into windows scripts folder --- .../linux/install-from-bootloader-GS290.sh | 56 +++++++++++++++++++ flash-scripts/linux/unlock-GS290.sh | 35 ++++++++++++ .../windows/install-from-bootloader-GS290.bat | 56 +++++++++++++++++++ flash-scripts/windows/unlock-GS290.bat | 35 ++++++++++++ 4 files changed, 182 insertions(+) create mode 100644 flash-scripts/linux/install-from-bootloader-GS290.sh create mode 100644 flash-scripts/linux/unlock-GS290.sh create mode 100644 flash-scripts/windows/install-from-bootloader-GS290.bat create mode 100644 flash-scripts/windows/unlock-GS290.bat diff --git a/flash-scripts/linux/install-from-bootloader-GS290.sh b/flash-scripts/linux/install-from-bootloader-GS290.sh new file mode 100644 index 00000000..b0bf929e --- /dev/null +++ b/flash-scripts/linux/install-from-bootloader-GS290.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +# Copyright (C) 2020 ECORP SAS - Author: Romain Hunault +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Parameter +# $1: DEVICE_ID device id +# $2: ARCHIVE_PATH path to archive + +# Exit status +# - 0 : device flashed +# - 1 : generic error +# - 101 : DEVICE_ID missing +# - 102 : ARCHIVE_PATH missing + +DEVICE_ID=$1 +ARCHIVE_PATH=$2 + +if [ -z $DEVICE_ID ] +then + exit 101 +fi + +if [ -z $ARCHIVE_PATH ] +then + exit 102 +fi + +fastboot -s $DEVICE_ID erase userdata +sleep 1 +fastboot -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img +sleep 1 +fastboot -s $DEVICE_ID flash recovery $ARCHIVE_PATH/recovery-e-latest-GS290.img +sleep 1 +fastboot -s $DEVICE_ID flash system $ARCHIVE_PATH/system.img +sleep 1 +fastboot -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img +sleep 1 +fastboot -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin +sleep 1 +fastboot -w +sleep 1 +fastboot reboot +sleep 1 diff --git a/flash-scripts/linux/unlock-GS290.sh b/flash-scripts/linux/unlock-GS290.sh new file mode 100644 index 00000000..0bdb3fc0 --- /dev/null +++ b/flash-scripts/linux/unlock-GS290.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +# Copyright (C) 2020 ECORP SAS - Author: Romain Hunault +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Parameter +# $1: device id + +# Exit status +# - 0 : bootloader locked +# - 1 : generic error +# - 101 : $DEVICE_ID missing + +DEVICE_ID=$1 + +if [ -z $DEVICE_ID ] +then + exit 101 +fi + +fastboot -s $DEVICE_ID flashing unlock +sleep 1 +# fastboot reboot-bootloader diff --git a/flash-scripts/windows/install-from-bootloader-GS290.bat b/flash-scripts/windows/install-from-bootloader-GS290.bat new file mode 100644 index 00000000..b0bf929e --- /dev/null +++ b/flash-scripts/windows/install-from-bootloader-GS290.bat @@ -0,0 +1,56 @@ +#!/bin/bash + +# Copyright (C) 2020 ECORP SAS - Author: Romain Hunault +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Parameter +# $1: DEVICE_ID device id +# $2: ARCHIVE_PATH path to archive + +# Exit status +# - 0 : device flashed +# - 1 : generic error +# - 101 : DEVICE_ID missing +# - 102 : ARCHIVE_PATH missing + +DEVICE_ID=$1 +ARCHIVE_PATH=$2 + +if [ -z $DEVICE_ID ] +then + exit 101 +fi + +if [ -z $ARCHIVE_PATH ] +then + exit 102 +fi + +fastboot -s $DEVICE_ID erase userdata +sleep 1 +fastboot -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img +sleep 1 +fastboot -s $DEVICE_ID flash recovery $ARCHIVE_PATH/recovery-e-latest-GS290.img +sleep 1 +fastboot -s $DEVICE_ID flash system $ARCHIVE_PATH/system.img +sleep 1 +fastboot -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img +sleep 1 +fastboot -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin +sleep 1 +fastboot -w +sleep 1 +fastboot reboot +sleep 1 diff --git a/flash-scripts/windows/unlock-GS290.bat b/flash-scripts/windows/unlock-GS290.bat new file mode 100644 index 00000000..0bdb3fc0 --- /dev/null +++ b/flash-scripts/windows/unlock-GS290.bat @@ -0,0 +1,35 @@ +#!/bin/bash + +# Copyright (C) 2020 ECORP SAS - Author: Romain Hunault +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Parameter +# $1: device id + +# Exit status +# - 0 : bootloader locked +# - 1 : generic error +# - 101 : $DEVICE_ID missing + +DEVICE_ID=$1 + +if [ -z $DEVICE_ID ] +then + exit 101 +fi + +fastboot -s $DEVICE_ID flashing unlock +sleep 1 +# fastboot reboot-bootloader -- GitLab From 76adadd396f45e4878764eeff6d03dc68efe58cc Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 30 Dec 2020 16:51:21 +0100 Subject: [PATCH 25/69] convert unlock-GS290 script from shell to batch --- flash-scripts/windows/unlock-GS290.bat | 31 +++++++++++++++++++------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/flash-scripts/windows/unlock-GS290.bat b/flash-scripts/windows/unlock-GS290.bat index 0bdb3fc0..9609b642 100644 --- a/flash-scripts/windows/unlock-GS290.bat +++ b/flash-scripts/windows/unlock-GS290.bat @@ -17,19 +17,34 @@ # Parameter # $1: device id +# $2: fastboot folder path # Exit status # - 0 : bootloader locked # - 1 : generic error # - 101 : $DEVICE_ID missing +# - 102 : $FASTBOOT_FOLDER_PATH is missing -DEVICE_ID=$1 +set DEVICE_ID="%1" +set FASTBOOT_FOLDER_PATH=%~2 +set FASTBOOT_PATH="%FASTBOOT_FOLDER_PATH%fastboot" +echo "FASTBOOT path:"%FASTBOOT_PATH% -if [ -z $DEVICE_ID ] -then - exit 101 -fi +if not defined %DEVICE_ID ( + exit /b 101 +) -fastboot -s $DEVICE_ID flashing unlock -sleep 1 -# fastboot reboot-bootloader +if not defined %FASTBOOT_FOLDER_PATH ( + exit /b 102 +) + +%FASTBOOT_PATH% -s %DEVICE_ID% flashing unlock + +if errorLevel 1 ( + echo "flashing unlock fails" + exit /b 1 +) + +timeout 1 >nul + +exit /b 0 -- GitLab From a6c7469205e27c627d2a29b23a6a6e3d5efcb89f Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 30 Dec 2020 16:55:56 +0100 Subject: [PATCH 26/69] add missing parameter to unlock-GS290.sh --- flash-scripts/linux/unlock-GS290.sh | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/flash-scripts/linux/unlock-GS290.sh b/flash-scripts/linux/unlock-GS290.sh index 0bdb3fc0..42647e09 100644 --- a/flash-scripts/linux/unlock-GS290.sh +++ b/flash-scripts/linux/unlock-GS290.sh @@ -17,19 +17,29 @@ # Parameter # $1: device id +# $2: fastboot folder path # Exit status # - 0 : bootloader locked # - 1 : generic error # - 101 : $DEVICE_ID missing +# - 102 : $FASTBOOT_FOLDER_PATH is missing DEVICE_ID=$1 +FASTBOOT_FOLDER_PATH=$2 +FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" if [ -z $DEVICE_ID ] then exit 101 fi -fastboot -s $DEVICE_ID flashing unlock +if [ -z $FASTBOOT_FOLDER_PATH ] +then + exit 102 +fi + + +"$FASTBOOT_PATH" -s $DEVICE_ID flashing unlock sleep 1 # fastboot reboot-bootloader -- GitLab From fa4ca660ed1ce09585208719498d2e623a1a137f Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 30 Dec 2020 17:34:49 +0100 Subject: [PATCH 27/69] add missing parameter to install-from-bootloader-GS290.sh --- .../linux/install-from-bootloader-GS290.sh | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/flash-scripts/linux/install-from-bootloader-GS290.sh b/flash-scripts/linux/install-from-bootloader-GS290.sh index b0bf929e..ae8070b2 100644 --- a/flash-scripts/linux/install-from-bootloader-GS290.sh +++ b/flash-scripts/linux/install-from-bootloader-GS290.sh @@ -18,15 +18,19 @@ # Parameter # $1: DEVICE_ID device id # $2: ARCHIVE_PATH path to archive +# $3: fastboot folder path # Exit status # - 0 : device flashed # - 1 : generic error # - 101 : DEVICE_ID missing # - 102 : ARCHIVE_PATH missing +# - 103 : fastboot folder path missing DEVICE_ID=$1 ARCHIVE_PATH=$2 +FASTBOOT_FOLDER_PATH=$3 +FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" if [ -z $DEVICE_ID ] then @@ -38,19 +42,24 @@ then exit 102 fi -fastboot -s $DEVICE_ID erase userdata +if [ -z $FASTBOOT_FOLDER_PATH ] +then + exit 103 +fi + +$FASTBOOT_PATH -s $DEVICE_ID erase userdata sleep 1 -fastboot -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img +$FASTBOOT_PATH -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img sleep 1 -fastboot -s $DEVICE_ID flash recovery $ARCHIVE_PATH/recovery-e-latest-GS290.img +$FASTBOOT_PATH -s $DEVICE_ID flash recovery $ARCHIVE_PATH/recovery-e-latest-GS290.img sleep 1 -fastboot -s $DEVICE_ID flash system $ARCHIVE_PATH/system.img +$FASTBOOT_PATH -s $DEVICE_ID flash system $ARCHIVE_PATH/system.img sleep 1 -fastboot -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img +$FASTBOOT_PATH -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img sleep 1 -fastboot -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin +$FASTBOOT_PATH -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin sleep 1 -fastboot -w +$FASTBOOT_PATH -w sleep 1 -fastboot reboot +$FASTBOOT_PATH reboot sleep 1 -- GitLab From d0d5f86720e6acdbd48d118e79eba25b9befc308 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 30 Dec 2020 17:44:22 +0100 Subject: [PATCH 28/69] convert install-from-bootloader-GS290.sh into bat --- .../linux/install-from-bootloader-GS290.sh | 2 + .../windows/install-from-bootloader-GS290.bat | 60 +++++++++++++------ 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/flash-scripts/linux/install-from-bootloader-GS290.sh b/flash-scripts/linux/install-from-bootloader-GS290.sh index ae8070b2..7957cc1f 100644 --- a/flash-scripts/linux/install-from-bootloader-GS290.sh +++ b/flash-scripts/linux/install-from-bootloader-GS290.sh @@ -47,6 +47,8 @@ then exit 103 fi +# add unzip for system + $FASTBOOT_PATH -s $DEVICE_ID erase userdata sleep 1 $FASTBOOT_PATH -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img diff --git a/flash-scripts/windows/install-from-bootloader-GS290.bat b/flash-scripts/windows/install-from-bootloader-GS290.bat index b0bf929e..ac3ce0dd 100644 --- a/flash-scripts/windows/install-from-bootloader-GS290.bat +++ b/flash-scripts/windows/install-from-bootloader-GS290.bat @@ -18,39 +18,63 @@ # Parameter # $1: DEVICE_ID device id # $2: ARCHIVE_PATH path to archive +# $3: fastboot folder path # Exit status # - 0 : device flashed # - 1 : generic error # - 101 : DEVICE_ID missing # - 102 : ARCHIVE_PATH missing +# - 103 : fastboot folder path missing -DEVICE_ID=$1 -ARCHIVE_PATH=$2 +set DEVICE_ID="%1" +set ARCHIVE_PATH=%~2 +set FASTBOOT_FOLDER_PATH=%~3 +set FASTBOOT_PATH="%FASTBOOT_FOLDER_PATH%fastboot" -if [ -z $DEVICE_ID ] -then - exit 101 -fi +if not defined %DEVICE_ID ( + exit /b 101 +) -if [ -z $ARCHIVE_PATH ] -then - exit 102 -fi +if not defined %ARCHIVE_PATH ( + exit /b 102 +) -fastboot -s $DEVICE_ID erase userdata +if not defined %FASTBOOT_FOLDER_PATH ( + exit /b 103 +) + +for %%a in ("%ARCHIVE_PATH%") do ( + set ARCHIVE_NAME="%%~na" +) + +for %%a in ("%ARCHIVE_PATH%") do ( + set ARCHIVE_FOLDER_PATH="%%~dpa" +) + +echo "archive path : "%ARCHIVE_PATH% +echo "archive folder path : "%ARCHIVE_FOLDER_PATH% +echo "fastboot path : "%FASTBOOT_PATH% + +cd "%ARCHIVE_FOLDER_PATH%" + +timeout 1 >nul 2>&1 + +# Should we unzip ? + +%FASTBOOT_PATH% -s %DEVICE_ID% erase userdata sleep 1 -fastboot -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img +%FASTBOOT_PATH% -s %DEVICE_ID% flash --disable-verity --disable-verification boot boot.img sleep 1 -fastboot -s $DEVICE_ID flash recovery $ARCHIVE_PATH/recovery-e-latest-GS290.img +%FASTBOOT_PATH% -s %DEVICE_ID% flash recovery recovery-e-latest-GS290.img sleep 1 -fastboot -s $DEVICE_ID flash system $ARCHIVE_PATH/system.img +%FASTBOOT_PATH% -s %DEVICE_ID% flash system system.img sleep 1 -fastboot -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img +%FASTBOOT_PATH% -s %DEVICE_ID% flash lk lk.img sleep 1 -fastboot -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin +%FASTBOOT_PATH% -s %DEVICE_ID% flash logo logo.bin sleep 1 -fastboot -w +%FASTBOOT_PATH% -w sleep 1 -fastboot reboot +%FASTBOOT_PATH% reboot sleep 1 -- GitLab From 33a197cc056ce23e2d4c0126aeb5cd755026a52f Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Thu, 31 Dec 2020 12:18:10 +0100 Subject: [PATCH 29/69] update some scripts for GS290 --- flash-scripts/linux/install-from-bootloader-GS290.sh | 4 ++-- flash-scripts/windows/install-from-bootloader-GS290.bat | 4 ++-- flash-scripts/windows/unlock-GS290.bat | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/flash-scripts/linux/install-from-bootloader-GS290.sh b/flash-scripts/linux/install-from-bootloader-GS290.sh index 7957cc1f..cb90a19e 100644 --- a/flash-scripts/linux/install-from-bootloader-GS290.sh +++ b/flash-scripts/linux/install-from-bootloader-GS290.sh @@ -61,7 +61,7 @@ $FASTBOOT_PATH -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img sleep 1 $FASTBOOT_PATH -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin sleep 1 -$FASTBOOT_PATH -w +$FASTBOOT_PATH -s $DEVICE_ID -w sleep 1 -$FASTBOOT_PATH reboot +$FASTBOOT_PATH -s $DEVICE_ID reboot sleep 1 diff --git a/flash-scripts/windows/install-from-bootloader-GS290.bat b/flash-scripts/windows/install-from-bootloader-GS290.bat index ac3ce0dd..999d30d8 100644 --- a/flash-scripts/windows/install-from-bootloader-GS290.bat +++ b/flash-scripts/windows/install-from-bootloader-GS290.bat @@ -74,7 +74,7 @@ sleep 1 sleep 1 %FASTBOOT_PATH% -s %DEVICE_ID% flash logo logo.bin sleep 1 -%FASTBOOT_PATH% -w +%FASTBOOT_PATH% -s %DEVICE_ID% -w sleep 1 -%FASTBOOT_PATH% reboot +%FASTBOOT_PATH% -s %DEVICE_ID% reboot sleep 1 diff --git a/flash-scripts/windows/unlock-GS290.bat b/flash-scripts/windows/unlock-GS290.bat index 9609b642..b5fb97fe 100644 --- a/flash-scripts/windows/unlock-GS290.bat +++ b/flash-scripts/windows/unlock-GS290.bat @@ -20,8 +20,8 @@ # $2: fastboot folder path # Exit status -# - 0 : bootloader locked -# - 1 : generic error +# - 0 : flashing unlocked +# - 1 : flashing unlock failed # - 101 : $DEVICE_ID missing # - 102 : $FASTBOOT_FOLDER_PATH is missing -- GitLab From e9d546fdd7245a88dd48c2132958183cd7310b37 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Thu, 31 Dec 2020 12:18:38 +0100 Subject: [PATCH 30/69] update GS290 config file & add missing translation entries --- src/main/resources/lang/translation.properties | 3 +++ src/main/resources/yaml/GS290.yml | 9 +++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/resources/lang/translation.properties b/src/main/resources/lang/translation.properties index 505d05c7..afc5640b 100644 --- a/src/main/resources/lang/translation.properties +++ b/src/main/resources/lang/translation.properties @@ -178,6 +178,9 @@ script_error_installFromFastboot_102 = Could not unpack /e/ install archive script_error_waitReboot_10 = No device's serial number provided script_error_waitReboot_101 = Can't run instruction on the device script_error_waitRebootFromFastboot_101 = Can't run instruction on the device +script_error_serialNumber_missing=No device's serial number provided +script_error_fastboot_path_missing= No fastboot tool path provided +script_error_fastboot_flashingUnlock_failed=Could not unlock flashing script_error_unknown= The installation encounter an error java_error_unknow= The installation encounter an internal error flash_process_cancelled=The installation process has been cancelled diff --git a/src/main/resources/yaml/GS290.yml b/src/main/resources/yaml/GS290.yml index e108b079..4696621d 100644 --- a/src/main/resources/yaml/GS290.yml +++ b/src/main/resources/yaml/GS290.yml @@ -38,12 +38,15 @@ flash: f3: script: unlock-GS290 parameters: + device_id: ${DEVICE_ID} fastboot_folder_path: ${ADB_FOLDER_PATH} codes: ok: 0: ~ ko: - 10: script_error_oemUnlock_10 + 1: script_error_fastboot_flashingUnlock_failed + 101: script_error_deviceID_missing + 102: script_error_fastbootPath_missing output: ~ succeed: f4 failed: ~ @@ -62,6 +65,7 @@ flash: f5: script: install-from-bootloader-GS290 parameters: + device_id: ${DEVICE_ID} archive_path: ${ARCHIVE_PATH} fastboot_folder_path: ${ADB_FOLDER_PATH} java_folder_path: ${JAVA_FOLDER_PATH} @@ -72,8 +76,9 @@ flash: 1: script_error_installFromFastboot_1 2: script_error_installFromFastboot_2 3: script_error_installFromFastboot_3 - 101: script_error_installFromFastboot_101 + 101: script_error_deviceID_missing 102: script_error_installFromFastboot_102 + 103: script_error_fastbootPath_missing output: ~ succeed: f6 failed: ~ -- GitLab From 367accd4b86b5122aae5251effc640aef672738f Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Tue, 29 Dec 2020 11:59:09 +0100 Subject: [PATCH 31/69] add yaml for GS_290 --- src/main/resources/yaml/GS290.yml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/main/resources/yaml/GS290.yml b/src/main/resources/yaml/GS290.yml index 4696621d..e108b079 100644 --- a/src/main/resources/yaml/GS290.yml +++ b/src/main/resources/yaml/GS290.yml @@ -38,15 +38,12 @@ flash: f3: script: unlock-GS290 parameters: - device_id: ${DEVICE_ID} fastboot_folder_path: ${ADB_FOLDER_PATH} codes: ok: 0: ~ ko: - 1: script_error_fastboot_flashingUnlock_failed - 101: script_error_deviceID_missing - 102: script_error_fastbootPath_missing + 10: script_error_oemUnlock_10 output: ~ succeed: f4 failed: ~ @@ -65,7 +62,6 @@ flash: f5: script: install-from-bootloader-GS290 parameters: - device_id: ${DEVICE_ID} archive_path: ${ARCHIVE_PATH} fastboot_folder_path: ${ADB_FOLDER_PATH} java_folder_path: ${JAVA_FOLDER_PATH} @@ -76,9 +72,8 @@ flash: 1: script_error_installFromFastboot_1 2: script_error_installFromFastboot_2 3: script_error_installFromFastboot_3 - 101: script_error_deviceID_missing + 101: script_error_installFromFastboot_101 102: script_error_installFromFastboot_102 - 103: script_error_fastbootPath_missing output: ~ succeed: f6 failed: ~ -- GitLab From 7ff0cc1f5dab28b6e6985bcb721f0619aa57c20f Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Tue, 29 Dec 2020 14:39:15 +0100 Subject: [PATCH 32/69] add linux scripts for GS290 and cp+rename into windows scripts folder --- .../linux/install-from-bootloader-GS290.sh | 27 +++------ flash-scripts/linux/unlock-GS290.sh | 12 +--- .../windows/install-from-bootloader-GS290.bat | 59 ++++++------------- flash-scripts/windows/unlock-GS290.bat | 35 ++++------- 4 files changed, 37 insertions(+), 96 deletions(-) diff --git a/flash-scripts/linux/install-from-bootloader-GS290.sh b/flash-scripts/linux/install-from-bootloader-GS290.sh index cb90a19e..b0bf929e 100644 --- a/flash-scripts/linux/install-from-bootloader-GS290.sh +++ b/flash-scripts/linux/install-from-bootloader-GS290.sh @@ -18,19 +18,15 @@ # Parameter # $1: DEVICE_ID device id # $2: ARCHIVE_PATH path to archive -# $3: fastboot folder path # Exit status # - 0 : device flashed # - 1 : generic error # - 101 : DEVICE_ID missing # - 102 : ARCHIVE_PATH missing -# - 103 : fastboot folder path missing DEVICE_ID=$1 ARCHIVE_PATH=$2 -FASTBOOT_FOLDER_PATH=$3 -FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" if [ -z $DEVICE_ID ] then @@ -42,26 +38,19 @@ then exit 102 fi -if [ -z $FASTBOOT_FOLDER_PATH ] -then - exit 103 -fi - -# add unzip for system - -$FASTBOOT_PATH -s $DEVICE_ID erase userdata +fastboot -s $DEVICE_ID erase userdata sleep 1 -$FASTBOOT_PATH -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img +fastboot -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img sleep 1 -$FASTBOOT_PATH -s $DEVICE_ID flash recovery $ARCHIVE_PATH/recovery-e-latest-GS290.img +fastboot -s $DEVICE_ID flash recovery $ARCHIVE_PATH/recovery-e-latest-GS290.img sleep 1 -$FASTBOOT_PATH -s $DEVICE_ID flash system $ARCHIVE_PATH/system.img +fastboot -s $DEVICE_ID flash system $ARCHIVE_PATH/system.img sleep 1 -$FASTBOOT_PATH -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img +fastboot -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img sleep 1 -$FASTBOOT_PATH -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin +fastboot -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin sleep 1 -$FASTBOOT_PATH -s $DEVICE_ID -w +fastboot -w sleep 1 -$FASTBOOT_PATH -s $DEVICE_ID reboot +fastboot reboot sleep 1 diff --git a/flash-scripts/linux/unlock-GS290.sh b/flash-scripts/linux/unlock-GS290.sh index 42647e09..0bdb3fc0 100644 --- a/flash-scripts/linux/unlock-GS290.sh +++ b/flash-scripts/linux/unlock-GS290.sh @@ -17,29 +17,19 @@ # Parameter # $1: device id -# $2: fastboot folder path # Exit status # - 0 : bootloader locked # - 1 : generic error # - 101 : $DEVICE_ID missing -# - 102 : $FASTBOOT_FOLDER_PATH is missing DEVICE_ID=$1 -FASTBOOT_FOLDER_PATH=$2 -FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" if [ -z $DEVICE_ID ] then exit 101 fi -if [ -z $FASTBOOT_FOLDER_PATH ] -then - exit 102 -fi - - -"$FASTBOOT_PATH" -s $DEVICE_ID flashing unlock +fastboot -s $DEVICE_ID flashing unlock sleep 1 # fastboot reboot-bootloader diff --git a/flash-scripts/windows/install-from-bootloader-GS290.bat b/flash-scripts/windows/install-from-bootloader-GS290.bat index 999d30d8..3c7115da 100644 --- a/flash-scripts/windows/install-from-bootloader-GS290.bat +++ b/flash-scripts/windows/install-from-bootloader-GS290.bat @@ -18,63 +18,40 @@ # Parameter # $1: DEVICE_ID device id # $2: ARCHIVE_PATH path to archive -# $3: fastboot folder path # Exit status # - 0 : device flashed # - 1 : generic error # - 101 : DEVICE_ID missing # - 102 : ARCHIVE_PATH missing -# - 103 : fastboot folder path missing -set DEVICE_ID="%1" -set ARCHIVE_PATH=%~2 -set FASTBOOT_FOLDER_PATH=%~3 -set FASTBOOT_PATH="%FASTBOOT_FOLDER_PATH%fastboot" -if not defined %DEVICE_ID ( - exit /b 101 -) +DEVICE_ID=$1 +ARCHIVE_PATH=$2 -if not defined %ARCHIVE_PATH ( - exit /b 102 -) +if [ -z $DEVICE_ID ] +then + exit 101 +fi -if not defined %FASTBOOT_FOLDER_PATH ( - exit /b 103 -) +if [ -z $ARCHIVE_PATH ] +then + exit 102 +fi -for %%a in ("%ARCHIVE_PATH%") do ( - set ARCHIVE_NAME="%%~na" -) - -for %%a in ("%ARCHIVE_PATH%") do ( - set ARCHIVE_FOLDER_PATH="%%~dpa" -) - -echo "archive path : "%ARCHIVE_PATH% -echo "archive folder path : "%ARCHIVE_FOLDER_PATH% -echo "fastboot path : "%FASTBOOT_PATH% - -cd "%ARCHIVE_FOLDER_PATH%" - -timeout 1 >nul 2>&1 - -# Should we unzip ? - -%FASTBOOT_PATH% -s %DEVICE_ID% erase userdata +fastboot -s $DEVICE_ID erase userdata sleep 1 -%FASTBOOT_PATH% -s %DEVICE_ID% flash --disable-verity --disable-verification boot boot.img +fastboot -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img sleep 1 -%FASTBOOT_PATH% -s %DEVICE_ID% flash recovery recovery-e-latest-GS290.img +fastboot -s $DEVICE_ID flash recovery $ARCHIVE_PATH/recovery-e-latest-GS290.img sleep 1 -%FASTBOOT_PATH% -s %DEVICE_ID% flash system system.img +fastboot -s $DEVICE_ID flash system $ARCHIVE_PATH/system.img sleep 1 -%FASTBOOT_PATH% -s %DEVICE_ID% flash lk lk.img +fastboot -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img sleep 1 -%FASTBOOT_PATH% -s %DEVICE_ID% flash logo logo.bin +fastboot -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin sleep 1 -%FASTBOOT_PATH% -s %DEVICE_ID% -w +fastboot -w sleep 1 -%FASTBOOT_PATH% -s %DEVICE_ID% reboot +fastboot reboot sleep 1 diff --git a/flash-scripts/windows/unlock-GS290.bat b/flash-scripts/windows/unlock-GS290.bat index b5fb97fe..0bdb3fc0 100644 --- a/flash-scripts/windows/unlock-GS290.bat +++ b/flash-scripts/windows/unlock-GS290.bat @@ -17,34 +17,19 @@ # Parameter # $1: device id -# $2: fastboot folder path # Exit status -# - 0 : flashing unlocked -# - 1 : flashing unlock failed +# - 0 : bootloader locked +# - 1 : generic error # - 101 : $DEVICE_ID missing -# - 102 : $FASTBOOT_FOLDER_PATH is missing -set DEVICE_ID="%1" -set FASTBOOT_FOLDER_PATH=%~2 -set FASTBOOT_PATH="%FASTBOOT_FOLDER_PATH%fastboot" -echo "FASTBOOT path:"%FASTBOOT_PATH% +DEVICE_ID=$1 -if not defined %DEVICE_ID ( - exit /b 101 -) +if [ -z $DEVICE_ID ] +then + exit 101 +fi -if not defined %FASTBOOT_FOLDER_PATH ( - exit /b 102 -) - -%FASTBOOT_PATH% -s %DEVICE_ID% flashing unlock - -if errorLevel 1 ( - echo "flashing unlock fails" - exit /b 1 -) - -timeout 1 >nul - -exit /b 0 +fastboot -s $DEVICE_ID flashing unlock +sleep 1 +# fastboot reboot-bootloader -- GitLab From ae7e9e1ce1872e22d18e57c18dfcbcea0d35a941 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 30 Dec 2020 16:51:21 +0100 Subject: [PATCH 33/69] convert unlock-GS290 script from shell to batch --- flash-scripts/windows/unlock-GS290.bat | 31 +++++++++++++++++++------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/flash-scripts/windows/unlock-GS290.bat b/flash-scripts/windows/unlock-GS290.bat index 0bdb3fc0..9609b642 100644 --- a/flash-scripts/windows/unlock-GS290.bat +++ b/flash-scripts/windows/unlock-GS290.bat @@ -17,19 +17,34 @@ # Parameter # $1: device id +# $2: fastboot folder path # Exit status # - 0 : bootloader locked # - 1 : generic error # - 101 : $DEVICE_ID missing +# - 102 : $FASTBOOT_FOLDER_PATH is missing -DEVICE_ID=$1 +set DEVICE_ID="%1" +set FASTBOOT_FOLDER_PATH=%~2 +set FASTBOOT_PATH="%FASTBOOT_FOLDER_PATH%fastboot" +echo "FASTBOOT path:"%FASTBOOT_PATH% -if [ -z $DEVICE_ID ] -then - exit 101 -fi +if not defined %DEVICE_ID ( + exit /b 101 +) -fastboot -s $DEVICE_ID flashing unlock -sleep 1 -# fastboot reboot-bootloader +if not defined %FASTBOOT_FOLDER_PATH ( + exit /b 102 +) + +%FASTBOOT_PATH% -s %DEVICE_ID% flashing unlock + +if errorLevel 1 ( + echo "flashing unlock fails" + exit /b 1 +) + +timeout 1 >nul + +exit /b 0 -- GitLab From 5030e296ee4ce2db6569db59027a5431a8667cfb Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 30 Dec 2020 16:55:56 +0100 Subject: [PATCH 34/69] add missing parameter to unlock-GS290.sh --- flash-scripts/linux/unlock-GS290.sh | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/flash-scripts/linux/unlock-GS290.sh b/flash-scripts/linux/unlock-GS290.sh index 0bdb3fc0..42647e09 100644 --- a/flash-scripts/linux/unlock-GS290.sh +++ b/flash-scripts/linux/unlock-GS290.sh @@ -17,19 +17,29 @@ # Parameter # $1: device id +# $2: fastboot folder path # Exit status # - 0 : bootloader locked # - 1 : generic error # - 101 : $DEVICE_ID missing +# - 102 : $FASTBOOT_FOLDER_PATH is missing DEVICE_ID=$1 +FASTBOOT_FOLDER_PATH=$2 +FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" if [ -z $DEVICE_ID ] then exit 101 fi -fastboot -s $DEVICE_ID flashing unlock +if [ -z $FASTBOOT_FOLDER_PATH ] +then + exit 102 +fi + + +"$FASTBOOT_PATH" -s $DEVICE_ID flashing unlock sleep 1 # fastboot reboot-bootloader -- GitLab From 23eef8d5e0e541ba5e23bb827fcf0cb3fbe03d00 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 30 Dec 2020 17:34:49 +0100 Subject: [PATCH 35/69] add missing parameter to install-from-bootloader-GS290.sh --- .../linux/install-from-bootloader-GS290.sh | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/flash-scripts/linux/install-from-bootloader-GS290.sh b/flash-scripts/linux/install-from-bootloader-GS290.sh index b0bf929e..ae8070b2 100644 --- a/flash-scripts/linux/install-from-bootloader-GS290.sh +++ b/flash-scripts/linux/install-from-bootloader-GS290.sh @@ -18,15 +18,19 @@ # Parameter # $1: DEVICE_ID device id # $2: ARCHIVE_PATH path to archive +# $3: fastboot folder path # Exit status # - 0 : device flashed # - 1 : generic error # - 101 : DEVICE_ID missing # - 102 : ARCHIVE_PATH missing +# - 103 : fastboot folder path missing DEVICE_ID=$1 ARCHIVE_PATH=$2 +FASTBOOT_FOLDER_PATH=$3 +FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" if [ -z $DEVICE_ID ] then @@ -38,19 +42,24 @@ then exit 102 fi -fastboot -s $DEVICE_ID erase userdata +if [ -z $FASTBOOT_FOLDER_PATH ] +then + exit 103 +fi + +$FASTBOOT_PATH -s $DEVICE_ID erase userdata sleep 1 -fastboot -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img +$FASTBOOT_PATH -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img sleep 1 -fastboot -s $DEVICE_ID flash recovery $ARCHIVE_PATH/recovery-e-latest-GS290.img +$FASTBOOT_PATH -s $DEVICE_ID flash recovery $ARCHIVE_PATH/recovery-e-latest-GS290.img sleep 1 -fastboot -s $DEVICE_ID flash system $ARCHIVE_PATH/system.img +$FASTBOOT_PATH -s $DEVICE_ID flash system $ARCHIVE_PATH/system.img sleep 1 -fastboot -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img +$FASTBOOT_PATH -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img sleep 1 -fastboot -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin +$FASTBOOT_PATH -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin sleep 1 -fastboot -w +$FASTBOOT_PATH -w sleep 1 -fastboot reboot +$FASTBOOT_PATH reboot sleep 1 -- GitLab From b229a947ee6af161865cf4fa0456ed7f527fee39 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 30 Dec 2020 17:44:22 +0100 Subject: [PATCH 36/69] convert install-from-bootloader-GS290.sh into bat --- .../linux/install-from-bootloader-GS290.sh | 2 + .../windows/install-from-bootloader-GS290.bat | 60 +++++++++++++------ 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/flash-scripts/linux/install-from-bootloader-GS290.sh b/flash-scripts/linux/install-from-bootloader-GS290.sh index ae8070b2..7957cc1f 100644 --- a/flash-scripts/linux/install-from-bootloader-GS290.sh +++ b/flash-scripts/linux/install-from-bootloader-GS290.sh @@ -47,6 +47,8 @@ then exit 103 fi +# add unzip for system + $FASTBOOT_PATH -s $DEVICE_ID erase userdata sleep 1 $FASTBOOT_PATH -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img diff --git a/flash-scripts/windows/install-from-bootloader-GS290.bat b/flash-scripts/windows/install-from-bootloader-GS290.bat index 3c7115da..be6f2c34 100644 --- a/flash-scripts/windows/install-from-bootloader-GS290.bat +++ b/flash-scripts/windows/install-from-bootloader-GS290.bat @@ -18,40 +18,64 @@ # Parameter # $1: DEVICE_ID device id # $2: ARCHIVE_PATH path to archive +# $3: fastboot folder path # Exit status # - 0 : device flashed # - 1 : generic error # - 101 : DEVICE_ID missing # - 102 : ARCHIVE_PATH missing +# - 103 : fastboot folder path missing -DEVICE_ID=$1 -ARCHIVE_PATH=$2 +set DEVICE_ID="%1" +set ARCHIVE_PATH=%~2 +set FASTBOOT_FOLDER_PATH=%~3 +set FASTBOOT_PATH="%FASTBOOT_FOLDER_PATH%fastboot" -if [ -z $DEVICE_ID ] -then - exit 101 -fi +if not defined %DEVICE_ID ( + exit /b 101 +) -if [ -z $ARCHIVE_PATH ] -then - exit 102 -fi +if not defined %ARCHIVE_PATH ( + exit /b 102 +) -fastboot -s $DEVICE_ID erase userdata +if not defined %FASTBOOT_FOLDER_PATH ( + exit /b 103 +) + +for %%a in ("%ARCHIVE_PATH%") do ( + set ARCHIVE_NAME="%%~na" +) + +for %%a in ("%ARCHIVE_PATH%") do ( + set ARCHIVE_FOLDER_PATH="%%~dpa" +) + +echo "archive path : "%ARCHIVE_PATH% +echo "archive folder path : "%ARCHIVE_FOLDER_PATH% +echo "fastboot path : "%FASTBOOT_PATH% + +cd "%ARCHIVE_FOLDER_PATH%" + +timeout 1 >nul 2>&1 + +# Should we unzip ? + +%FASTBOOT_PATH% -s %DEVICE_ID% erase userdata sleep 1 -fastboot -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img +%FASTBOOT_PATH% -s %DEVICE_ID% flash --disable-verity --disable-verification boot boot.img sleep 1 -fastboot -s $DEVICE_ID flash recovery $ARCHIVE_PATH/recovery-e-latest-GS290.img +%FASTBOOT_PATH% -s %DEVICE_ID% flash recovery recovery-e-latest-GS290.img sleep 1 -fastboot -s $DEVICE_ID flash system $ARCHIVE_PATH/system.img +%FASTBOOT_PATH% -s %DEVICE_ID% flash system system.img sleep 1 -fastboot -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img +%FASTBOOT_PATH% -s %DEVICE_ID% flash lk lk.img sleep 1 -fastboot -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin +%FASTBOOT_PATH% -s %DEVICE_ID% flash logo logo.bin sleep 1 -fastboot -w +%FASTBOOT_PATH% -w sleep 1 -fastboot reboot +%FASTBOOT_PATH% reboot sleep 1 -- GitLab From d87ee04c257b91975b1a4bb169099fd27d129b8e Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Thu, 31 Dec 2020 12:18:10 +0100 Subject: [PATCH 37/69] update some scripts for GS290 --- flash-scripts/linux/install-from-bootloader-GS290.sh | 4 ++-- flash-scripts/windows/install-from-bootloader-GS290.bat | 4 ++-- flash-scripts/windows/unlock-GS290.bat | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/flash-scripts/linux/install-from-bootloader-GS290.sh b/flash-scripts/linux/install-from-bootloader-GS290.sh index 7957cc1f..cb90a19e 100644 --- a/flash-scripts/linux/install-from-bootloader-GS290.sh +++ b/flash-scripts/linux/install-from-bootloader-GS290.sh @@ -61,7 +61,7 @@ $FASTBOOT_PATH -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img sleep 1 $FASTBOOT_PATH -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin sleep 1 -$FASTBOOT_PATH -w +$FASTBOOT_PATH -s $DEVICE_ID -w sleep 1 -$FASTBOOT_PATH reboot +$FASTBOOT_PATH -s $DEVICE_ID reboot sleep 1 diff --git a/flash-scripts/windows/install-from-bootloader-GS290.bat b/flash-scripts/windows/install-from-bootloader-GS290.bat index be6f2c34..452510cc 100644 --- a/flash-scripts/windows/install-from-bootloader-GS290.bat +++ b/flash-scripts/windows/install-from-bootloader-GS290.bat @@ -75,7 +75,7 @@ sleep 1 sleep 1 %FASTBOOT_PATH% -s %DEVICE_ID% flash logo logo.bin sleep 1 -%FASTBOOT_PATH% -w +%FASTBOOT_PATH% -s %DEVICE_ID% -w sleep 1 -%FASTBOOT_PATH% reboot +%FASTBOOT_PATH% -s %DEVICE_ID% reboot sleep 1 diff --git a/flash-scripts/windows/unlock-GS290.bat b/flash-scripts/windows/unlock-GS290.bat index 9609b642..b5fb97fe 100644 --- a/flash-scripts/windows/unlock-GS290.bat +++ b/flash-scripts/windows/unlock-GS290.bat @@ -20,8 +20,8 @@ # $2: fastboot folder path # Exit status -# - 0 : bootloader locked -# - 1 : generic error +# - 0 : flashing unlocked +# - 1 : flashing unlock failed # - 101 : $DEVICE_ID missing # - 102 : $FASTBOOT_FOLDER_PATH is missing -- GitLab From 9498f84ef90d36bcb7e037681b7af4c81a21332d Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Thu, 31 Dec 2020 12:18:38 +0100 Subject: [PATCH 38/69] update GS290 config file & add missing translation entries --- src/main/resources/yaml/GS290.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/resources/yaml/GS290.yml b/src/main/resources/yaml/GS290.yml index e108b079..4696621d 100644 --- a/src/main/resources/yaml/GS290.yml +++ b/src/main/resources/yaml/GS290.yml @@ -38,12 +38,15 @@ flash: f3: script: unlock-GS290 parameters: + device_id: ${DEVICE_ID} fastboot_folder_path: ${ADB_FOLDER_PATH} codes: ok: 0: ~ ko: - 10: script_error_oemUnlock_10 + 1: script_error_fastboot_flashingUnlock_failed + 101: script_error_deviceID_missing + 102: script_error_fastbootPath_missing output: ~ succeed: f4 failed: ~ @@ -62,6 +65,7 @@ flash: f5: script: install-from-bootloader-GS290 parameters: + device_id: ${DEVICE_ID} archive_path: ${ARCHIVE_PATH} fastboot_folder_path: ${ADB_FOLDER_PATH} java_folder_path: ${JAVA_FOLDER_PATH} @@ -72,8 +76,9 @@ flash: 1: script_error_installFromFastboot_1 2: script_error_installFromFastboot_2 3: script_error_installFromFastboot_3 - 101: script_error_installFromFastboot_101 + 101: script_error_deviceID_missing 102: script_error_installFromFastboot_102 + 103: script_error_fastbootPath_missing output: ~ succeed: f6 failed: ~ -- GitLab From cd52a14a537199fe282a055886d1390e1c6f89fd Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Tue, 26 Jan 2021 18:48:46 +0100 Subject: [PATCH 39/69] update instruction key in GS290_fs.yml --- src/main/resources/yaml/GS290_fs.yml | 41 ++++++++++++++++------------ 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/src/main/resources/yaml/GS290_fs.yml b/src/main/resources/yaml/GS290_fs.yml index b179f7d5..9a019cb4 100644 --- a/src/main/resources/yaml/GS290_fs.yml +++ b/src/main/resources/yaml/GS290_fs.yml @@ -33,15 +33,27 @@ sources: flash: f1: ui: - type: enableOemUnlock + type: action + title: stepTitle_checkDeviceUptodate + instruction: + - install_instr_connectTowifi + - install_instr_GS290_accessSystemSettings + - install_instr_GS290_accessSystemUpdate + - install_instr_doAnyUpdates + - install_instr_continueIfDeviceUpToDate + stepNumber: 1/6 + titleIcon: icon-download.png f2: ui: type: action - title: stepTitle_StartInFastbootFP3 + title: stepTitle_enableOemUnlock instruction: - - install_instr_turnOff - - install_instr_startFastboot - stepNumber: 1/5 + - install_instr_GS290_accessSettings + - install_instr_searchOEM + - install_instr_enableOEMUnlocking + - install_instr_acceptOEMUnlockWarning + - install_instr_onceDoneThenContinue + stepNumber: 2/6 titleIcon: icon-download.png f3: ui: @@ -49,20 +61,16 @@ flash: title: stepTitle2On7 instruction: - install_instr_oemUnlock - stepNumber: 2/5 + stepNumber: 3/6 averageTime: 12 f4: ui: type: action title: stepTitle3On7FP3 instruction: - - install_instr_readAllWarning - - install_instr_selectUnlockBootloader - - install_instr_unlockBootloader - - install_instr_bootWarning - - install_instr_startFastbootFromOptions - - install_instr_ifYouMissedTimeout - stepNumber: 3/5 + - install_instr_pressVolUpTo + - install_instr_waitInstallStartAuto + stepNumber: 4/6 titleIcon: icon-download.png f5: ui: @@ -70,7 +78,7 @@ flash: title: stepTitle6On7 instruction: - install_instr_eosInstall - stepNumber: 4/5 + stepNumber: 5/6 averageTime: 200 f6: ui: @@ -80,7 +88,6 @@ flash: type: action title: instruction: - - install_instr_selectLockBootloader - - install_instr_lockBootloader - stepNumber: 5/5 + - install_instr_onceDeviceRebootThenContinue + stepNumber: 6/6 titleIcon: icon-download.png -- GitLab From 77d69bbf8bb9bbd0b81b53c3e40921a240d66bbd Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 27 Jan 2021 10:49:27 +0100 Subject: [PATCH 40/69] update title of step and add missing text in translation.properties --- src/main/resources/lang/translation.properties | 6 +++++- src/main/resources/yaml/GS290_fs.yml | 10 +++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/resources/lang/translation.properties b/src/main/resources/lang/translation.properties index afc5640b..d1d2cd1b 100644 --- a/src/main/resources/lang/translation.properties +++ b/src/main/resources/lang/translation.properties @@ -252,4 +252,8 @@ stepTitle_formatDataTurnOff = Format data and turn off stepTitle_restartRecovery = Restart in Recovery mode stepTitle_installOS = /e/ Installation stepTitle_resizeDataPartition = Resize Data partition -stepTitle_StartInFastbootFP3 = Start device in Fastboot mode \ No newline at end of file +stepTitle_StartInFastbootFP3 = Start device in Fastboot mode +stepTitle_checkDeviceUptodate= Check device is up-to-date +stepTitle_enableOemUnlock= Enable OEM unlocking +stepTitle_beforeInstallation= Before installation +stepTitle_rebootDevice= Reboot device \ No newline at end of file diff --git a/src/main/resources/yaml/GS290_fs.yml b/src/main/resources/yaml/GS290_fs.yml index 9a019cb4..4d79935f 100644 --- a/src/main/resources/yaml/GS290_fs.yml +++ b/src/main/resources/yaml/GS290_fs.yml @@ -33,7 +33,7 @@ sources: flash: f1: ui: - type: action + cd type: action title: stepTitle_checkDeviceUptodate instruction: - install_instr_connectTowifi @@ -58,7 +58,7 @@ flash: f3: ui: type: load - title: stepTitle2On7 + title: stepTitle_oemUnlock instruction: - install_instr_oemUnlock stepNumber: 3/6 @@ -66,7 +66,7 @@ flash: f4: ui: type: action - title: stepTitle3On7FP3 + title: stepTitle_beforeInstallation instruction: - install_instr_pressVolUpTo - install_instr_waitInstallStartAuto @@ -75,7 +75,7 @@ flash: f5: ui: type: load - title: stepTitle6On7 + title: stepTitle_installOS instruction: - install_instr_eosInstall stepNumber: 5/6 @@ -86,7 +86,7 @@ flash: f7: ui: type: action - title: + title: stepTitle_rebootDevice instruction: - install_instr_onceDeviceRebootThenContinue stepNumber: 6/6 -- GitLab From 3ed254e89bb2321ed61ff926e9b63dce8a10d4a4 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 27 Jan 2021 11:59:04 +0100 Subject: [PATCH 41/69] add missing instructions's text for GS290 and update some instruction key in GS290 config file --- src/main/resources/lang/translation.properties | 12 ++++++++++++ src/main/resources/yaml/GS290_fs.yml | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/resources/lang/translation.properties b/src/main/resources/lang/translation.properties index d1d2cd1b..e4fcec9e 100644 --- a/src/main/resources/lang/translation.properties +++ b/src/main/resources/lang/translation.properties @@ -158,6 +158,18 @@ install_instr_startDl_pressPowerBixbyVolDown= Keep pressing simultaneously "Powe install_instr_startRec_pressPowerBixbyVolUp= Keep pressing simultaneously "Power" & "Bixby" & "Volume Up" until 'teamwin' screen appears install_instr_leaveDl_pressPowerBixbyVolDown= Keep pressing simultaneously "Power" & "Bixby" & "Volume Down" until device turns off install_instr_update_stockrom= Update your device to the latest version +install_instr_connectTowifi= Connect your device to Wi-fi +install_instr_GS290_accessSystemSettings = Open Settings and go to "System" +install_instr_GS290_accessSystemUpdate = Open "System update" +install_instr_continueIfDeviceUpToDate = Once your device is up-to-date, you can click on continue. Note that you must have the latest Android 10 version installed. +install_instr_GS290_accessSettings = Access to settings +install_instr_searchOEM = Tap on the search icon. Type "OEM" to search "OEM unlocking" option +install_instr_enableOEMUnlocking = Enable "OEM unlocking" +install_instr_acceptOEMUnlockWarning = Accept the warning message by taping on "enable" +install_instr_onceDoneThenContinue = Once OEM unlocking is enabled, you can click on continue +install_instr_waitInstallStartAuto = Please wait, installation will start automatically +install_instr_onceDeviceRebootThenContinue = Your device will reboot automatically. Once it's done, you can click on continue + script_error_waitDownload_1 = Can't detect device in "Download mode" script_error_waitFastboot_1 = Can't detect device in "fastboot mode" script_error_oemUnlock_10 = Can't allow custom OS installation on your device diff --git a/src/main/resources/yaml/GS290_fs.yml b/src/main/resources/yaml/GS290_fs.yml index 4d79935f..66f1d38f 100644 --- a/src/main/resources/yaml/GS290_fs.yml +++ b/src/main/resources/yaml/GS290_fs.yml @@ -39,7 +39,7 @@ flash: - install_instr_connectTowifi - install_instr_GS290_accessSystemSettings - install_instr_GS290_accessSystemUpdate - - install_instr_doAnyUpdates + - install_instr_update_stockrom - install_instr_continueIfDeviceUpToDate stepNumber: 1/6 titleIcon: icon-download.png -- GitLab From b558a2b9077fa1edbcc43b95e99ed2ff57abbe0e Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 27 Jan 2021 17:15:44 +0100 Subject: [PATCH 42/69] rewrote scripts for GS290 --- ...nlock-GS290.sh => gs290-flashingUnlock.sh} | 16 +- .../linux/gs290-install-from-bootloader.sh | 139 ++++++++++++++++++ .../linux/gs290-wait-reboot-from-fastboot.sh | 50 +++++++ .../linux/install-from-bootloader-GS290.sh | 67 --------- flash-scripts/linux/reboot-fastboot.sh | 63 ++++++++ 5 files changed, 264 insertions(+), 71 deletions(-) rename flash-scripts/linux/{unlock-GS290.sh => gs290-flashingUnlock.sh} (80%) create mode 100644 flash-scripts/linux/gs290-install-from-bootloader.sh create mode 100644 flash-scripts/linux/gs290-wait-reboot-from-fastboot.sh delete mode 100644 flash-scripts/linux/install-from-bootloader-GS290.sh create mode 100644 flash-scripts/linux/reboot-fastboot.sh diff --git a/flash-scripts/linux/unlock-GS290.sh b/flash-scripts/linux/gs290-flashingUnlock.sh similarity index 80% rename from flash-scripts/linux/unlock-GS290.sh rename to flash-scripts/linux/gs290-flashingUnlock.sh index 42647e09..34992211 100644 --- a/flash-scripts/linux/unlock-GS290.sh +++ b/flash-scripts/linux/gs290-flashingUnlock.sh @@ -21,25 +21,33 @@ # Exit status # - 0 : bootloader locked -# - 1 : generic error +# - 1 : unknown error +# - 2 : Flashing unlocked failed # - 101 : $DEVICE_ID missing # - 102 : $FASTBOOT_FOLDER_PATH is missing DEVICE_ID=$1 FASTBOOT_FOLDER_PATH=$2 -FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" +# check serial number has been provided if [ -z $DEVICE_ID ] then exit 101 fi +# Check fastboot parent folder path has been provided if [ -z $FASTBOOT_FOLDER_PATH ] then exit 102 fi +# Build fastboot path +FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" + +# Unlock bootloader +if ! "$FASTBOOT_PATH" -s $DEVICE_ID flashing unlock +then + exit 2 +fi -"$FASTBOOT_PATH" -s $DEVICE_ID flashing unlock sleep 1 -# fastboot reboot-bootloader diff --git a/flash-scripts/linux/gs290-install-from-bootloader.sh b/flash-scripts/linux/gs290-install-from-bootloader.sh new file mode 100644 index 00000000..53fa7ed6 --- /dev/null +++ b/flash-scripts/linux/gs290-install-from-bootloader.sh @@ -0,0 +1,139 @@ +#!/bin/bash + +# Copyright (C) 2020 ECORP SAS - Author: Romain Hunault +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Parameter +# $1: DEVICE_ID device id +# $2: ARCHIVE_PATH path to archive +# $3: fastboot folder path +# $4: Java folder path + + +# Exit status +# - 0 : device flashed +# - 1 : generic error +# - 10: can't unpack system.img +# - 11: can't wipe data +# - 12: can't flash boot +# - 13: can't flash recovery +# - 14: can't flash system +# - 15: can't flash lk +# - 16: can't flash logo +# - 101 : DEVICE_ID missing +# - 102 : ARCHIVE_PATH missing +# - 103 : fastboot folder path missing + +DEVICE_ID=$1 +ARCHIVE_PATH=$2 +FASTBOOT_FOLDER_PATH=$3 +JAVA_FOLDER_PATH=$4 + +# Check serial number has been provided +if [ -z $DEVICE_ID ] +then + exit 101 +fi + +# check path to rom has been provided +if [ -z $ARCHIVE_PATH ] +then + exit 102 +fi + +#check path to adb/fasboot has been provided +if [ -z $FASTBOOT_FOLDER_PATH ] +then + exit 103 +fi + +# Check java folder has been provided +if [ -z JAVA_FOLDER_PATH ] +then + exit 104 +fi + + +# Build fastboot path +FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" + +# Build java jar path +JAR_PATH=${JAVA_FOLDER_PATH}"/bin/jar" + +# Build archive folder path +ARCHIVE_FOLDER_PATH=$(dirname "$1")"/" + +# unzip for system.img +cd "$ARCHIVE_FOLDER_PATH" + +if ! "$JAR_PATH" -x -v -f "$ARCHIVE_PATH" ; +then + exit 10 +fi + +echo "unpacked archive" + +sleep 1 + +# Wipe user data +if ! "$FASTBOOT_PATH" -w ; +then + exit 11 +fi + +echo "user data wiped" + +sleep 5 + + +# Flash the device + +sleep 1 +if !$FASTBOOT_PATH -s $DEVICE_ID flash --disable-verity --disable-verification boot boot.img +then + exit 12 +fi +sleep 1 +echo "Flashed boot" + +if !$FASTBOOT_PATH -s $DEVICE_ID flash recovery recovery-e-latest-GS290.img +then + exit 13 +fi +sleep 1 +echo "Flashed recovery" + +$FASTBOOT_PATH -s $DEVICE_ID flash system system.img +then + exit 14 +fi +sleep 1 +echo "Flashed system" + +$FASTBOOT_PATH -s $DEVICE_ID flash lk lk.img +then + exit 15 +fi +sleep 1 +echo "Flashed lk" + +$FASTBOOT_PATH -s $DEVICE_ID flash logo logo.bin +then + exit 16 +fi +sleep 1 +echo "Flashed logo" + + diff --git a/flash-scripts/linux/gs290-wait-reboot-from-fastboot.sh b/flash-scripts/linux/gs290-wait-reboot-from-fastboot.sh new file mode 100644 index 00000000..0a79a4b4 --- /dev/null +++ b/flash-scripts/linux/gs290-wait-reboot-from-fastboot.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +# Copyright (C) 2020 ECORP SAS - Author: Vincent Bourgmayer +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Parameter + +# $1: ADB_FOLDER_PATH: the path where runnable adb is stored + +# Exit status +# - 0 : success +# - 1 : unknown error +# - 10 : fastboot reboot command failed +# - 101 : no device found in fastboot + +FASTBOOT_FOLDER_PATH=$1 +FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" + +echo "fastboot path: $FASTBOOT_PATH" + +#check that device is in recovery mode +if ! "$FASTBOOT_PATH" devices 2>&1 | grep "fastboot" +then + echo "Device not detected in fastboot" + exit 101 +fi + +# Reboot the device +if ! "$FASTBOOT_PATH" reboot +then + exit 10 +fi + +#Then we wait that it left this state +while [ "$($FASTBOOT_PATH devices | grep -q fastboot; echo $?)" = 0 ] +do + sleep 1s +done \ No newline at end of file diff --git a/flash-scripts/linux/install-from-bootloader-GS290.sh b/flash-scripts/linux/install-from-bootloader-GS290.sh deleted file mode 100644 index cb90a19e..00000000 --- a/flash-scripts/linux/install-from-bootloader-GS290.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/bash - -# Copyright (C) 2020 ECORP SAS - Author: Romain Hunault -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# Parameter -# $1: DEVICE_ID device id -# $2: ARCHIVE_PATH path to archive -# $3: fastboot folder path - -# Exit status -# - 0 : device flashed -# - 1 : generic error -# - 101 : DEVICE_ID missing -# - 102 : ARCHIVE_PATH missing -# - 103 : fastboot folder path missing - -DEVICE_ID=$1 -ARCHIVE_PATH=$2 -FASTBOOT_FOLDER_PATH=$3 -FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" - -if [ -z $DEVICE_ID ] -then - exit 101 -fi - -if [ -z $ARCHIVE_PATH ] -then - exit 102 -fi - -if [ -z $FASTBOOT_FOLDER_PATH ] -then - exit 103 -fi - -# add unzip for system - -$FASTBOOT_PATH -s $DEVICE_ID erase userdata -sleep 1 -$FASTBOOT_PATH -s $DEVICE_ID flash --disable-verity --disable-verification boot $ARCHIVE_PATH/boot.img -sleep 1 -$FASTBOOT_PATH -s $DEVICE_ID flash recovery $ARCHIVE_PATH/recovery-e-latest-GS290.img -sleep 1 -$FASTBOOT_PATH -s $DEVICE_ID flash system $ARCHIVE_PATH/system.img -sleep 1 -$FASTBOOT_PATH -s $DEVICE_ID flash lk $ARCHIVE_PATH/lk.img -sleep 1 -$FASTBOOT_PATH -s $DEVICE_ID flash logo $ARCHIVE_PATH/logo.bin -sleep 1 -$FASTBOOT_PATH -s $DEVICE_ID -w -sleep 1 -$FASTBOOT_PATH -s $DEVICE_ID reboot -sleep 1 diff --git a/flash-scripts/linux/reboot-fastboot.sh b/flash-scripts/linux/reboot-fastboot.sh new file mode 100644 index 00000000..7879d68a --- /dev/null +++ b/flash-scripts/linux/reboot-fastboot.sh @@ -0,0 +1,63 @@ +#!/bin/bash + +# Copyright (C) 2020 - Author: Ingo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# TODO: What if 2 devices detected? +# Parameter +# $1: serial number of the device +# $2: The folder where fastboot runnable is stored + +# Exit status +# - 0 : Device in fastboot mode detected +# - 1 : unknown Error +# - 10: rebooting in bootloader failed +# - 101: Device ID not provided +# - 102: Missing path to adb and fastboot + +DEVICE_ID=$1 +ADBFASTBOOT_FOLDER_PATH=$2 + +# Check DEVICE ID has been provided +if [ -z "$DEVICE_ID" ] +then + exit 101 +fi + +# Check adb and fastboot parent path has been provided +if [ -z "ADBFASTBOOT_FOLDER_PATH" ] +then + exit 102 +fi + +# Construct path to ADB and FASTBOOT +FASTBOOT_PATH=${ADBFASTBOOT_FOLDER_PATH}"fastboot" +ADB_PATH=${ADBFASTBOOT_FOLDER_PATH}"adb" + +# reboot device in bootloader mode +if !"ADB_PATH" -s "$DEVICE_ID" reboot bootloader +then + exit 10; +fi + +# Wait device to reboot in fastboot mode +while [ "$($FASTBOOT_PATH devices | grep -q fastboot; echo $?)" = 1 ] +do + sleep 3s +done +#TODO: we should handle the case where this doesn't work + +sleep 5s +echo "fastboot mode detected" \ No newline at end of file -- GitLab From 5bf14af27d30be3024242796401673460258a835 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 27 Jan 2021 17:16:19 +0100 Subject: [PATCH 43/69] update configs for GS290 --- src/main/resources/yaml/GS290.yml | 44 ++++++++++++++++------------ src/main/resources/yaml/GS290_fs.yml | 9 +++--- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/main/resources/yaml/GS290.yml b/src/main/resources/yaml/GS290.yml index 4696621d..9817806a 100644 --- a/src/main/resources/yaml/GS290.yml +++ b/src/main/resources/yaml/GS290.yml @@ -17,26 +17,21 @@ name: GS290 flash: f1: - script: enableOemUnlock + script: ~ parameters: ~ codes: ~ output: ~ succeed: f2 failed: ~ f2: - script: wait-fastboot - parameters: - fastboot_folder_path: ${ADB_FOLDER_PATH} - codes: - ok: - 0: ~ - ko: - 1: script_error_waitFastboot_1 + script: ~ + parameters: ~ + codes: ~ output: ~ succeed: f3 failed: ~ f3: - script: unlock-GS290 + script: reboot-fastboot parameters: device_id: ${DEVICE_ID} fastboot_folder_path: ${ADB_FOLDER_PATH} @@ -44,26 +39,31 @@ flash: ok: 0: ~ ko: - 1: script_error_fastboot_flashingUnlock_failed + 1: script_error_unknown + 10: script_error_cantRebootBootloader 101: script_error_deviceID_missing 102: script_error_fastbootPath_missing output: ~ succeed: f4 failed: ~ f4: - script: wait-fastboot + script: gs290-flashingUnlock parameters: + device_id: ${DEVICE_ID} fastboot_folder_path: ${ADB_FOLDER_PATH} codes: ok: 0: ~ ko: - 1: script_error_waitFastboot_1 + 1: script_error_unknown + 2: script_error_flashingUnlockFailed + 101: script_error_deviceID_missing + 102: script_error_fastbootPath_missing output: ~ succeed: f5 failed: ~ f5: - script: install-from-bootloader-GS290 + script: gs290-install-from-bootloader parameters: device_id: ${DEVICE_ID} archive_path: ${ARCHIVE_PATH} @@ -73,9 +73,14 @@ flash: ok: 0: ~ ko: - 1: script_error_installFromFastboot_1 - 2: script_error_installFromFastboot_2 - 3: script_error_installFromFastboot_3 + 1: script_error_unknown + 10: script_error_cantUnpackSources + 11: script_error_cantWipeData + 12: script_error_cantFlashBoot + 13: script_error_cantFlashRecovery + 14: script_error_cantFlashsystem + 15: script_error_cantFlashLk + 16: script_error_cantFlashLogo 101: script_error_deviceID_missing 102: script_error_installFromFastboot_102 103: script_error_fastbootPath_missing @@ -90,7 +95,7 @@ flash: succeed: f7 failed: ~ f7: - script: wait-reboot-from-fastboot + script: gs290-wait-reboot-from-fastboot parameters: fastboot_folder_path: ${ADB_FOLDER_PATH} codes: @@ -98,7 +103,8 @@ flash: 0: ~ ko: 1: script_error_unknown - 101: script_error_waitRebootFromFastboot_101 + 10: script_error_cantrebootFromFasboot + 101: script_error_noDeviceFoundInFastboot output: ~ succeed: ~ failed: ~ \ No newline at end of file diff --git a/src/main/resources/yaml/GS290_fs.yml b/src/main/resources/yaml/GS290_fs.yml index 66f1d38f..c1747e63 100644 --- a/src/main/resources/yaml/GS290_fs.yml +++ b/src/main/resources/yaml/GS290_fs.yml @@ -58,17 +58,18 @@ flash: f3: ui: type: load - title: stepTitle_oemUnlock + title: stepTitle_rebootBootloader instruction: - - install_instr_oemUnlock + - install_instr_rebootingOnBootloader stepNumber: 3/6 averageTime: 12 f4: ui: type: action - title: stepTitle_beforeInstallation + title: stepTitle_oemUnlock instruction: - - install_instr_pressVolUpTo + - install_instr_pressVolUpToAcceptOEMUnlocking + - install_instr_unlockingOem - install_instr_waitInstallStartAuto stepNumber: 4/6 titleIcon: icon-download.png -- GitLab From 087f77414fe11a4d83943cbf314af4a076d23acf Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Tue, 2 Feb 2021 10:26:01 +0100 Subject: [PATCH 44/69] add missing GS290 translation key in translation.properties --- src/main/resources/lang/translation.properties | 5 +++-- src/main/resources/yaml/GS290_fs.yml | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/resources/lang/translation.properties b/src/main/resources/lang/translation.properties index e4fcec9e..7e74c649 100644 --- a/src/main/resources/lang/translation.properties +++ b/src/main/resources/lang/translation.properties @@ -162,14 +162,15 @@ install_instr_connectTowifi= Connect your device to Wi-fi install_instr_GS290_accessSystemSettings = Open Settings and go to "System" install_instr_GS290_accessSystemUpdate = Open "System update" install_instr_continueIfDeviceUpToDate = Once your device is up-to-date, you can click on continue. Note that you must have the latest Android 10 version installed. -install_instr_GS290_accessSettings = Access to settings install_instr_searchOEM = Tap on the search icon. Type "OEM" to search "OEM unlocking" option install_instr_enableOEMUnlocking = Enable "OEM unlocking" install_instr_acceptOEMUnlockWarning = Accept the warning message by taping on "enable" install_instr_onceDoneThenContinue = Once OEM unlocking is enabled, you can click on continue install_instr_waitInstallStartAuto = Please wait, installation will start automatically install_instr_onceDeviceRebootThenContinue = Your device will reboot automatically. Once it's done, you can click on continue - +install_instr_rebootingOnBootloader=Your device will reboot automatically on bootloader mode +install_instr_pressVolUpToAcceptOEMUnlocking = Press "Volume up" to accept OEM unlocking +install_instr_unlockingOem= Easy-installer is unlocking OEM script_error_waitDownload_1 = Can't detect device in "Download mode" script_error_waitFastboot_1 = Can't detect device in "fastboot mode" script_error_oemUnlock_10 = Can't allow custom OS installation on your device diff --git a/src/main/resources/yaml/GS290_fs.yml b/src/main/resources/yaml/GS290_fs.yml index c1747e63..31480a2b 100644 --- a/src/main/resources/yaml/GS290_fs.yml +++ b/src/main/resources/yaml/GS290_fs.yml @@ -48,7 +48,7 @@ flash: type: action title: stepTitle_enableOemUnlock instruction: - - install_instr_GS290_accessSettings + - install_instr_openSettings - install_instr_searchOEM - install_instr_enableOEMUnlocking - install_instr_acceptOEMUnlockWarning -- GitLab From af6feb2cbdc814b25019d8713d3f5b6134841451 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Tue, 2 Feb 2021 15:30:45 +0100 Subject: [PATCH 45/69] update ThreadFactory to handle no script step + refactoring if loadYAMLFile(), loadFlashProcess() and loadFlashExtra() --- .../easy/installer/threads/ThreadFactory.java | 84 +++++++++++-------- 1 file changed, 47 insertions(+), 37 deletions(-) diff --git a/src/main/java/ecorp/easy/installer/threads/ThreadFactory.java b/src/main/java/ecorp/easy/installer/threads/ThreadFactory.java index 771e68e7..5cf6c5d7 100644 --- a/src/main/java/ecorp/easy/installer/threads/ThreadFactory.java +++ b/src/main/java/ecorp/easy/installer/threads/ThreadFactory.java @@ -83,30 +83,34 @@ public class ThreadFactory { //load config file InputStream is = getClass().getResourceAsStream(yamlFolderPath+modelName+".yml"); - Map yamLContent= (Map)yaml.load(is); - - if(yamLContent == null) throw new NullPointerException("flash content load from yaml is empty"); - flashMould = new ProcessMould(modelName); - - loadFlashProcess((Map) yamLContent.get("flash")); + Map yamlContent= (Map)yaml.load(is); is.close(); + if(yamlContent == null || yamlContent.isEmpty() ) { + logger.error("Parsed step list from yaml file is empty or null"); + return false; + } + + flashMould = new ProcessMould(modelName); + loadFlashProcess((Map) yamlContent.get("flash")); - //Load config file specific to Flash station + //Load config file specific to user interface //DO NOT USE classLoader() to load resource! is = getClass().getResourceAsStream(yamlFolderPath+modelName+"_fs.yml"); - yamLContent= (Map)yaml.load(is); - if(yamLContent == null) throw new NullPointerException("extra content load from yaml is empty"); - - loadFlashExtra((Map) yamLContent.get("flash")); - - loadSourcesToDownload((Map) yamLContent.get("sources")); - + //@TODO @REFACTOR USE ANOTHER VARIABLE! + yamlContent= (Map)yaml.load(is); is.close(); - }catch(IOException | NullPointerException e){ + if(yamlContent == null || yamlContent.isEmpty()) { + logger.error("Parsed extra datas (UI, sources) from yaml file are empty or null"); + return false; + } + + loadFlashExtra((Map) yamlContent.get("flash")); + loadSourcesToDownload((Map) yamlContent.get("sources")); + + }catch(IOException e){ logger.error("modelName = {}, error= {}", modelName, e.toString()); - return false; } return true; @@ -118,44 +122,50 @@ public class ThreadFactory { */ protected void loadFlashProcess( Map steps){ logger.info("loadFlashProcess( ... ) "); - if(steps == null || steps.isEmpty()){ - throw new InvalidParameterException("Flash steps loaded from YAML are invalid"); - } Set keys = steps.keySet(); - - String scriptExtension = AppConstants.OsName.toLowerCase().contains("windows") ? ".bat" : ".sh"; + for(String key: keys){ logger.debug("Key = "+key); - Map stepData = (Map) steps.get(key); - Step step = new Step(); + Map stepData = (Map) steps.get(key); //Content load from YAML file + Step step = new Step(); //Object to build - step.setScript((String) stepData.get("script")+scriptExtension); - - Map codes = (Map) stepData.get("codes"); - if(codes != null){ - step.setOkCode ( (Map) codes.get("ok") ); - step.setKoCode ( (Map) codes.get("ko") ); + //1. Does the step contain a script ? + if(stepData.get("script") != null){ + step.setScript(stepData.get("script")+( AppConstants.isWindowsOs() ? ".bat" : ".sh" ) ); + + //Fill the result codes fields + Map codes = (Map) stepData.get("codes"); + if(codes != null){ + step.setOkCode ( (Map) codes.get("ok") ); + step.setKoCode ( (Map) codes.get("ko") ); + } + + //Fill the parameters field + step.setParameters ((LinkedHashMap) stepData.get("parameters") ); + + //Fill the output to read - this is the name of a variable + //to create and store in CommonParams for use in another step + step.setOutput ((String) stepData.get("output") ); + }else{ //This is for step without script to run + step.setScript(null); } - step.setParameters ((LinkedHashMap) stepData.get("parameters") ); - - step.setOutput ((String) stepData.get("output") ); + //Fill the step's key of the next step in case of success or failure step.setAfterSuccess ((String) stepData.get("succeed") ); step.setAfterFail ((String) stepData.get("failed") ); - this.flashMould.addStep(key, step); + + //Integrate the step in the process + flashMould.addStep(key, step); } } /** - * Load extra element for Flash process (it contains mainly UI's element) + * Load extra element for Flash process (sources to dl and UI definition) * @TODO: make entries's key a final static to be store only at one place * @param steps Map Loaded from YAML */ protected void loadFlashExtra( Map steps){ logger.info("loadFlashExtra(...)"); - if(steps == null || steps.isEmpty()){ - throw new InvalidParameterException("Flash steps's extra loaded from YAML are invalid"); - } for(String key : (Set) steps.keySet() ){ Map subObj = (Map) steps.get(key); -- GitLab From d5a76cbf08522a1a8b0f9734a785fdb8d800b582 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 3 Feb 2021 10:16:11 +0100 Subject: [PATCH 46/69] add a method 'hasScript()' --- src/main/java/ecorp/easy/installer/models/Command.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/ecorp/easy/installer/models/Command.java b/src/main/java/ecorp/easy/installer/models/Command.java index cce01939..4db83466 100644 --- a/src/main/java/ecorp/easy/installer/models/Command.java +++ b/src/main/java/ecorp/easy/installer/models/Command.java @@ -261,4 +261,12 @@ public class Command { } return step.getAfterFail(); } + + /** + * tell if the command has a script registered + * @return false if step's script is null else return true + */ + public boolean hasScript(){ + return (step.getScript() != null); + } } -- GitLab From eaa09472eb0b53e1fde264f7140352714cd3920a Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 3 Feb 2021 11:35:41 +0100 Subject: [PATCH 47/69] update flashThread.java to pause the thread when there is no script --- .../easy/installer/threads/FlashThread.java | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/main/java/ecorp/easy/installer/threads/FlashThread.java b/src/main/java/ecorp/easy/installer/threads/FlashThread.java index e6677dbc..e0daa5ad 100644 --- a/src/main/java/ecorp/easy/installer/threads/FlashThread.java +++ b/src/main/java/ecorp/easy/installer/threads/FlashThread.java @@ -290,23 +290,29 @@ public class FlashThread extends Thread { while(nextCommandKey != null ){ currentStepCode = nextCommandKey; final Command cmd = commands.get(nextCommandKey); - - updateParameters(); + //UpdateUI - doBeforeToRunCommand(); - final String stepType = cmd.getNewUIValues().getType(); - if( stepType.equals(AppConstants.USER_ACTION_KEY) - || stepType.equals(AppConstants.LOAD_KEY) ) - { - logger.debug("Run(), Command = "+cmd.getCommand()); - cmd.execAndReadOutput(); - success = handleResult(cmd); + doBeforeToRunCommand(); + if( cmd.hasScript() ){ + + updateParameters(); + final String stepType = cmd.getNewUIValues().getType(); + if( stepType.equals(AppConstants.USER_ACTION_KEY) + || stepType.equals(AppConstants.LOAD_KEY) ) + { + logger.debug("Run(), Command = "+cmd.getCommand()); + cmd.execAndReadOutput(); + success = handleResult(cmd); + }else{ + success = true; + } + + doAfterToRunCommand(); }else{ + logger.debug("run a no script step. Waiting for user's validation"); + synchronized(pauseLock){ pauseLock.wait(); } success = true; } - - doAfterToRunCommand(); - nextCommandKey = cmd.getNextCommandKey(); } -- GitLab From 8cf93b109aab1ecbd621f6e074918223c226422b Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 3 Feb 2021 14:44:18 +0100 Subject: [PATCH 48/69] small refactoring --- .../easy/installer/threads/FlashThread.java | 38 +++++++------------ 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/src/main/java/ecorp/easy/installer/threads/FlashThread.java b/src/main/java/ecorp/easy/installer/threads/FlashThread.java index e0daa5ad..a37fdc96 100644 --- a/src/main/java/ecorp/easy/installer/threads/FlashThread.java +++ b/src/main/java/ecorp/easy/installer/threads/FlashThread.java @@ -217,24 +217,13 @@ public class FlashThread extends Thread { } bundle.putString("stepTitle", newUIValues.getTitle()); bundle.putList("stepInstructions", String.class.getSimpleName(), newUIValues.getInstructions()); - } } //Update UI Platform.runLater(()->{ - logger.debug("runLater-> Update UI for"+cmd.getCommand()); application.onStepStart(bundle); }); - - if(stepType.equals(AppConstants.ASK_ACCOUNT_KEY) || stepType.equals(AppConstants.UNLOCK_OEM_KEY)) - { - try{ - synchronized(pauseLock){ pauseLock.wait(); } - }catch (InterruptedException e) { - logger.error("error = "+e.toString()); - } - } } /** @@ -290,23 +279,22 @@ public class FlashThread extends Thread { while(nextCommandKey != null ){ currentStepCode = nextCommandKey; final Command cmd = commands.get(nextCommandKey); - + final String stepType = cmd.getNewUIValues().getType(); + //UpdateUI - doBeforeToRunCommand(); - if( cmd.hasScript() ){ + doBeforeToRunCommand(); + + if( cmd.hasScript() && + ( stepType.equals(AppConstants.USER_ACTION_KEY) || + stepType.equals(AppConstants.LOAD_KEY) ) ) + { updateParameters(); - final String stepType = cmd.getNewUIValues().getType(); - if( stepType.equals(AppConstants.USER_ACTION_KEY) - || stepType.equals(AppConstants.LOAD_KEY) ) - { - logger.debug("Run(), Command = "+cmd.getCommand()); - cmd.execAndReadOutput(); - success = handleResult(cmd); - }else{ - success = true; - } - + + logger.debug("Run(), Command = "+cmd.getCommand()); + cmd.execAndReadOutput(); + success = handleResult(cmd); + doAfterToRunCommand(); }else{ logger.debug("run a no script step. Waiting for user's validation"); -- GitLab From 88678ad3bf91233aff787d3b99a58c8340a32fe4 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 3 Feb 2021 17:27:04 +0100 Subject: [PATCH 49/69] handle 'no script' step in FlashSceneController --- .../subcontrollers/FlashSceneController.java | 35 ++++++++++++++----- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/src/main/java/ecorp/easy/installer/controllers/subcontrollers/FlashSceneController.java b/src/main/java/ecorp/easy/installer/controllers/subcontrollers/FlashSceneController.java index 14db165e..b4e28ea5 100644 --- a/src/main/java/ecorp/easy/installer/controllers/subcontrollers/FlashSceneController.java +++ b/src/main/java/ecorp/easy/installer/controllers/subcontrollers/FlashSceneController.java @@ -300,8 +300,30 @@ public class FlashSceneController extends AbstractSubSteppedController implement parentController.setNextButtonVisible((instructionsFlow.getChildren().size() >1)); - // /!\ LINE BELOW IS TEMPORARY - setNextButtonOnClickListener(); + parentController.setNextButtonOnClickListener((MouseEvent event)->{ + final int instructionsCount = instructionsFlow.getChildren().size(); + + if ( !db.getBoolean("hasScript") + && currentSubStepId == (instructionsCount-1) + && !stopped ) + { + synchronized (pauseLock) { pauseLock.notify(); } + }else{ + onNextButtonClicked(); + } + //If there is a script and this instruction before the last one + if( db.getBoolean("hasScript") + &¤tSubStepId == (instructionsCount-2) + && !stopped ) + { + //hide the button to prevent clicking before the end of the full process + parentController.setNextButtonVisible(false); + }// If there is no script and it's the last instruction: notify flashThread + + + + ++currentSubStepId; + }); //Hide progress Indicator UiUtils.hideNode(loadStepProgressIndicator); @@ -479,8 +501,7 @@ public class FlashSceneController extends AbstractSubSteppedController implement //get previousLabel Label nextSubStepLabel = (Label) children.get(currentSubStepId+1); - //Update the image using instruction key code - + //Update the image using instruction key cod for(String instruction:instructionsKey){ if(i18n.containsKey(instruction) && i18n.getString(instruction).equals(nextSubStepLabel.getText() ) ){ Image img; @@ -495,11 +516,7 @@ public class FlashSceneController extends AbstractSubSteppedController implement break; } } - - if(currentSubStepId == instructionsNumber-2 && !stopped){ - parentController.setNextButtonVisible(false); //TO prevent clicking before the end of the full process - } - + //Deemphase previous instruction and emphasize new current one if(currentSubStepId < instructionsNumber-1){ deemphasizeLabel(currentSubStepLabel); emphasizeLabel(nextSubStepLabel); -- GitLab From 839ada136ec752df8197b9607f9247635dc83a96 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Wed, 3 Feb 2021 17:27:50 +0100 Subject: [PATCH 50/69] add parameter to declare a no script step in flashThread --- src/main/java/ecorp/easy/installer/threads/FlashThread.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/ecorp/easy/installer/threads/FlashThread.java b/src/main/java/ecorp/easy/installer/threads/FlashThread.java index a37fdc96..f38eb4c7 100644 --- a/src/main/java/ecorp/easy/installer/threads/FlashThread.java +++ b/src/main/java/ecorp/easy/installer/threads/FlashThread.java @@ -217,6 +217,7 @@ public class FlashThread extends Thread { } bundle.putString("stepTitle", newUIValues.getTitle()); bundle.putList("stepInstructions", String.class.getSimpleName(), newUIValues.getInstructions()); + bundle.putBoolean("hasScript", cmd.hasScript()); } } -- GitLab From fb7c1090c43e7c733b3bc69729f6a20507e8a014 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Thu, 4 Feb 2021 11:36:55 +0100 Subject: [PATCH 51/69] add script for windows (copied from linux). translate reboot-fastboot.bat in windows script --- ...ock-GS290.bat => gs290-flashingUnlock.bat} | 43 +++--- .../windows/gs290-install-from-bootloader.bat | 139 ++++++++++++++++++ .../gs290-wait-reboot-from-fastboot.bat | 50 +++++++ flash-scripts/windows/reboot-fastboot.bat | 56 +++++++ 4 files changed, 268 insertions(+), 20 deletions(-) rename flash-scripts/windows/{unlock-GS290.bat => gs290-flashingUnlock.bat} (64%) create mode 100644 flash-scripts/windows/gs290-install-from-bootloader.bat create mode 100644 flash-scripts/windows/gs290-wait-reboot-from-fastboot.bat create mode 100644 flash-scripts/windows/reboot-fastboot.bat diff --git a/flash-scripts/windows/unlock-GS290.bat b/flash-scripts/windows/gs290-flashingUnlock.bat similarity index 64% rename from flash-scripts/windows/unlock-GS290.bat rename to flash-scripts/windows/gs290-flashingUnlock.bat index b5fb97fe..34992211 100644 --- a/flash-scripts/windows/unlock-GS290.bat +++ b/flash-scripts/windows/gs290-flashingUnlock.bat @@ -20,31 +20,34 @@ # $2: fastboot folder path # Exit status -# - 0 : flashing unlocked -# - 1 : flashing unlock failed +# - 0 : bootloader locked +# - 1 : unknown error +# - 2 : Flashing unlocked failed # - 101 : $DEVICE_ID missing # - 102 : $FASTBOOT_FOLDER_PATH is missing -set DEVICE_ID="%1" -set FASTBOOT_FOLDER_PATH=%~2 -set FASTBOOT_PATH="%FASTBOOT_FOLDER_PATH%fastboot" -echo "FASTBOOT path:"%FASTBOOT_PATH% +DEVICE_ID=$1 +FASTBOOT_FOLDER_PATH=$2 -if not defined %DEVICE_ID ( - exit /b 101 -) +# check serial number has been provided +if [ -z $DEVICE_ID ] +then + exit 101 +fi -if not defined %FASTBOOT_FOLDER_PATH ( - exit /b 102 -) +# Check fastboot parent folder path has been provided +if [ -z $FASTBOOT_FOLDER_PATH ] +then + exit 102 +fi -%FASTBOOT_PATH% -s %DEVICE_ID% flashing unlock +# Build fastboot path +FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" -if errorLevel 1 ( - echo "flashing unlock fails" - exit /b 1 -) +# Unlock bootloader +if ! "$FASTBOOT_PATH" -s $DEVICE_ID flashing unlock +then + exit 2 +fi -timeout 1 >nul - -exit /b 0 +sleep 1 diff --git a/flash-scripts/windows/gs290-install-from-bootloader.bat b/flash-scripts/windows/gs290-install-from-bootloader.bat new file mode 100644 index 00000000..53fa7ed6 --- /dev/null +++ b/flash-scripts/windows/gs290-install-from-bootloader.bat @@ -0,0 +1,139 @@ +#!/bin/bash + +# Copyright (C) 2020 ECORP SAS - Author: Romain Hunault +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Parameter +# $1: DEVICE_ID device id +# $2: ARCHIVE_PATH path to archive +# $3: fastboot folder path +# $4: Java folder path + + +# Exit status +# - 0 : device flashed +# - 1 : generic error +# - 10: can't unpack system.img +# - 11: can't wipe data +# - 12: can't flash boot +# - 13: can't flash recovery +# - 14: can't flash system +# - 15: can't flash lk +# - 16: can't flash logo +# - 101 : DEVICE_ID missing +# - 102 : ARCHIVE_PATH missing +# - 103 : fastboot folder path missing + +DEVICE_ID=$1 +ARCHIVE_PATH=$2 +FASTBOOT_FOLDER_PATH=$3 +JAVA_FOLDER_PATH=$4 + +# Check serial number has been provided +if [ -z $DEVICE_ID ] +then + exit 101 +fi + +# check path to rom has been provided +if [ -z $ARCHIVE_PATH ] +then + exit 102 +fi + +#check path to adb/fasboot has been provided +if [ -z $FASTBOOT_FOLDER_PATH ] +then + exit 103 +fi + +# Check java folder has been provided +if [ -z JAVA_FOLDER_PATH ] +then + exit 104 +fi + + +# Build fastboot path +FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" + +# Build java jar path +JAR_PATH=${JAVA_FOLDER_PATH}"/bin/jar" + +# Build archive folder path +ARCHIVE_FOLDER_PATH=$(dirname "$1")"/" + +# unzip for system.img +cd "$ARCHIVE_FOLDER_PATH" + +if ! "$JAR_PATH" -x -v -f "$ARCHIVE_PATH" ; +then + exit 10 +fi + +echo "unpacked archive" + +sleep 1 + +# Wipe user data +if ! "$FASTBOOT_PATH" -w ; +then + exit 11 +fi + +echo "user data wiped" + +sleep 5 + + +# Flash the device + +sleep 1 +if !$FASTBOOT_PATH -s $DEVICE_ID flash --disable-verity --disable-verification boot boot.img +then + exit 12 +fi +sleep 1 +echo "Flashed boot" + +if !$FASTBOOT_PATH -s $DEVICE_ID flash recovery recovery-e-latest-GS290.img +then + exit 13 +fi +sleep 1 +echo "Flashed recovery" + +$FASTBOOT_PATH -s $DEVICE_ID flash system system.img +then + exit 14 +fi +sleep 1 +echo "Flashed system" + +$FASTBOOT_PATH -s $DEVICE_ID flash lk lk.img +then + exit 15 +fi +sleep 1 +echo "Flashed lk" + +$FASTBOOT_PATH -s $DEVICE_ID flash logo logo.bin +then + exit 16 +fi +sleep 1 +echo "Flashed logo" + + diff --git a/flash-scripts/windows/gs290-wait-reboot-from-fastboot.bat b/flash-scripts/windows/gs290-wait-reboot-from-fastboot.bat new file mode 100644 index 00000000..0a79a4b4 --- /dev/null +++ b/flash-scripts/windows/gs290-wait-reboot-from-fastboot.bat @@ -0,0 +1,50 @@ +#!/bin/bash + +# Copyright (C) 2020 ECORP SAS - Author: Vincent Bourgmayer +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Parameter + +# $1: ADB_FOLDER_PATH: the path where runnable adb is stored + +# Exit status +# - 0 : success +# - 1 : unknown error +# - 10 : fastboot reboot command failed +# - 101 : no device found in fastboot + +FASTBOOT_FOLDER_PATH=$1 +FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" + +echo "fastboot path: $FASTBOOT_PATH" + +#check that device is in recovery mode +if ! "$FASTBOOT_PATH" devices 2>&1 | grep "fastboot" +then + echo "Device not detected in fastboot" + exit 101 +fi + +# Reboot the device +if ! "$FASTBOOT_PATH" reboot +then + exit 10 +fi + +#Then we wait that it left this state +while [ "$($FASTBOOT_PATH devices | grep -q fastboot; echo $?)" = 0 ] +do + sleep 1s +done \ No newline at end of file diff --git a/flash-scripts/windows/reboot-fastboot.bat b/flash-scripts/windows/reboot-fastboot.bat new file mode 100644 index 00000000..ec3440a5 --- /dev/null +++ b/flash-scripts/windows/reboot-fastboot.bat @@ -0,0 +1,56 @@ +:: Copyright (C) 2021 ECORP SAS - Author: Vincent Bourgmayer +:: +:: This program is free software: you can redistribute it and/or modify +:: it under the terms of the GNU General Public License as published by +:: the Free Software Foundation, either version 3 of the License, or +:: (at your option) any later version. +:: +:: This program is distributed in the hope that it will be useful, +:: but WITHOUT ANY WARRANTY; without even the implied warranty of +:: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +:: GNU General Public License for more details. +:: +:: You should have received a copy of the GNU General Public License +:: along with this program. If not, see . + +:: Parameter +:: $1: serial number of the device +:: $2: The folder where fastboot runnable is stored + +:: Exit status +:: - 0 : Device in fastboot mode detected +:: - 1 : unknown Error +:: - 10: rebooting in bootloader failed +:: - 101: Device ID not provided +:: - 102: Missing path to adb and fastboot + +set DEVICE_ID="%1" +set ADBFASTBOOT_FOLDER_PATH=%~2 + +if not defined %DEVICE_ID ( + exit /b 101 +) + +if not defined %ADBFASTBOOT_FOLDER_PATH ( + exit /b 101 +) + +set FASTBOOT_PATH="%ADBFASTBOOT_FOLDER_PATH%fastboot" +set ADB_PATH="%ADBFASTBOOT_FOLDER_PATH%adb" + + +%ADB_PATH% -s %$DEVICE_ID% reboot bootloader +if errorlevel 1 ( exit /b 10 ) + + +:fastboot_detect +%FASTBOOT_PATH% devices 2>&1 | findstr fastboot +if errorLevel 1 ( + timeout 3 >nul 2>&1 + goto :fastboot_detect +) + +timeout 5 >nul 2>&1 +echo "fastboot mode detected" + +exit /b 0 \ No newline at end of file -- GitLab From 51026c87dac1ba788ad677c929a929ddfd59443c Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Thu, 4 Feb 2021 11:57:03 +0100 Subject: [PATCH 52/69] update reboot-fastboot.bat to call loop and start to translate gs290-wait-reboot-from-fastboot.bat --- .../gs290-wait-reboot-from-fastboot.bat | 76 +++++++++---------- flash-scripts/windows/reboot-fastboot.bat | 4 +- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/flash-scripts/windows/gs290-wait-reboot-from-fastboot.bat b/flash-scripts/windows/gs290-wait-reboot-from-fastboot.bat index 0a79a4b4..93cede44 100644 --- a/flash-scripts/windows/gs290-wait-reboot-from-fastboot.bat +++ b/flash-scripts/windows/gs290-wait-reboot-from-fastboot.bat @@ -1,50 +1,48 @@ -#!/bin/bash - -# Copyright (C) 2020 ECORP SAS - Author: Vincent Bourgmayer -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# Parameter - -# $1: ADB_FOLDER_PATH: the path where runnable adb is stored - -# Exit status -# - 0 : success -# - 1 : unknown error -# - 10 : fastboot reboot command failed -# - 101 : no device found in fastboot - -FASTBOOT_FOLDER_PATH=$1 -FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" +:: Copyright (C) 2021 ECORP SAS - Author: Vincent Bourgmayer +:: +:: This program is free software: you can redistribute it and/or modify +:: it under the terms of the GNU General Public License as published by +:: the Free Software Foundation, either version 3 of the License, or +:: (at your option) any later version. +:: +:: This program is distributed in the hope that it will be useful, +:: but WITHOUT ANY WARRANTY; without even the implied warranty of +:: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +:: GNU General Public License for more details. +:: +:: You should have received a copy of the GNU General Public License +:: along with this program. If not, see . + +:: Parameter +:: $1: ADB_FOLDER_PATH: the path where runnable adb is stored + +:: Exit status +:: - 0 : success +:: - 1 : unknown error +:: - 10 : fastboot reboot command failed +:: - 101 : no device found in fastboot + +set FASTBOOT_FOLDER_PATH=%~1 +set FASTBOOT_PATH="%FASTBOOT_FOLDER_PATH%fastboot" echo "fastboot path: $FASTBOOT_PATH" -#check that device is in recovery mode -if ! "$FASTBOOT_PATH" devices 2>&1 | grep "fastboot" -then + +%FASTBOOT_PATH% devices 2>&1 | findstr fastboot +if errorLevel 1 ( echo "Device not detected in fastboot" - exit 101 -fi + exit /b 101 +) # Reboot the device -if ! "$FASTBOOT_PATH" reboot -then - exit 10 -fi +%FASTBOOT_PATH% reboot +if errorlevel 1 ( exit /b 10 ) + #Then we wait that it left this state while [ "$($FASTBOOT_PATH devices | grep -q fastboot; echo $?)" = 0 ] do sleep 1s -done \ No newline at end of file +done + +exit /b 0 \ No newline at end of file diff --git a/flash-scripts/windows/reboot-fastboot.bat b/flash-scripts/windows/reboot-fastboot.bat index ec3440a5..0578814e 100644 --- a/flash-scripts/windows/reboot-fastboot.bat +++ b/flash-scripts/windows/reboot-fastboot.bat @@ -32,7 +32,7 @@ if not defined %DEVICE_ID ( ) if not defined %ADBFASTBOOT_FOLDER_PATH ( - exit /b 101 + exit /b 102 ) set FASTBOOT_PATH="%ADBFASTBOOT_FOLDER_PATH%fastboot" @@ -50,6 +50,8 @@ if errorLevel 1 ( goto :fastboot_detect ) +call fastboot_detect + timeout 5 >nul 2>&1 echo "fastboot mode detected" -- GitLab From f21a6141fef79f997fb0363f4aa8ff0fab39d4a4 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Thu, 4 Feb 2021 16:22:11 +0100 Subject: [PATCH 53/69] fixed linux script for GS290 thanks to shellcheck.net --- flash-scripts/linux/gs290-flashingUnlock.sh | 6 ++--- .../linux/gs290-install-from-bootloader.sh | 24 ++++++++----------- flash-scripts/linux/reboot-fastboot.sh | 4 ++-- 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/flash-scripts/linux/gs290-flashingUnlock.sh b/flash-scripts/linux/gs290-flashingUnlock.sh index 34992211..9f5a9296 100644 --- a/flash-scripts/linux/gs290-flashingUnlock.sh +++ b/flash-scripts/linux/gs290-flashingUnlock.sh @@ -30,13 +30,13 @@ DEVICE_ID=$1 FASTBOOT_FOLDER_PATH=$2 # check serial number has been provided -if [ -z $DEVICE_ID ] +if [ -z "$DEVICE_ID" ] then exit 101 fi # Check fastboot parent folder path has been provided -if [ -z $FASTBOOT_FOLDER_PATH ] +if [ -z "$FASTBOOT_FOLDER_PATH" ] then exit 102 fi @@ -45,7 +45,7 @@ fi FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" # Unlock bootloader -if ! "$FASTBOOT_PATH" -s $DEVICE_ID flashing unlock +if ! "$FASTBOOT_PATH" -s "$DEVICE_ID" flashing unlock then exit 2 fi diff --git a/flash-scripts/linux/gs290-install-from-bootloader.sh b/flash-scripts/linux/gs290-install-from-bootloader.sh index 53fa7ed6..8cfb01bb 100644 --- a/flash-scripts/linux/gs290-install-from-bootloader.sh +++ b/flash-scripts/linux/gs290-install-from-bootloader.sh @@ -42,25 +42,25 @@ FASTBOOT_FOLDER_PATH=$3 JAVA_FOLDER_PATH=$4 # Check serial number has been provided -if [ -z $DEVICE_ID ] +if [ -z "$DEVICE_ID" ] then exit 101 fi # check path to rom has been provided -if [ -z $ARCHIVE_PATH ] +if [ -z "$ARCHIVE_PATH" ] then exit 102 fi #check path to adb/fasboot has been provided -if [ -z $FASTBOOT_FOLDER_PATH ] +if [ -z "$FASTBOOT_FOLDER_PATH" ] then exit 103 fi # Check java folder has been provided -if [ -z JAVA_FOLDER_PATH ] +if [ -z "$JAVA_FOLDER_PATH" ] then exit 104 fi @@ -76,7 +76,7 @@ JAR_PATH=${JAVA_FOLDER_PATH}"/bin/jar" ARCHIVE_FOLDER_PATH=$(dirname "$1")"/" # unzip for system.img -cd "$ARCHIVE_FOLDER_PATH" +cd "$ARCHIVE_FOLDER_PATH" || exit 104 if ! "$JAR_PATH" -x -v -f "$ARCHIVE_PATH" ; then @@ -94,42 +94,38 @@ then fi echo "user data wiped" - sleep 5 - # Flash the device - -sleep 1 -if !$FASTBOOT_PATH -s $DEVICE_ID flash --disable-verity --disable-verification boot boot.img +if ! $FASTBOOT_PATH -s "$DEVICE_ID" flash --disable-verity --disable-verification boot boot.img then exit 12 fi sleep 1 echo "Flashed boot" -if !$FASTBOOT_PATH -s $DEVICE_ID flash recovery recovery-e-latest-GS290.img +if ! $FASTBOOT_PATH -s "$DEVICE_ID" flash recovery recovery-e-latest-GS290.img then exit 13 fi sleep 1 echo "Flashed recovery" -$FASTBOOT_PATH -s $DEVICE_ID flash system system.img +if ! $FASTBOOT_PATH -s "$DEVICE_ID" flash system system.img then exit 14 fi sleep 1 echo "Flashed system" -$FASTBOOT_PATH -s $DEVICE_ID flash lk lk.img +if ! $FASTBOOT_PATH -s "$DEVICE_ID" flash lk lk.img then exit 15 fi sleep 1 echo "Flashed lk" -$FASTBOOT_PATH -s $DEVICE_ID flash logo logo.bin +if ! $FASTBOOT_PATH -s "$DEVICE_ID" flash logo logo.bin then exit 16 fi diff --git a/flash-scripts/linux/reboot-fastboot.sh b/flash-scripts/linux/reboot-fastboot.sh index 7879d68a..214855bf 100644 --- a/flash-scripts/linux/reboot-fastboot.sh +++ b/flash-scripts/linux/reboot-fastboot.sh @@ -37,7 +37,7 @@ then fi # Check adb and fastboot parent path has been provided -if [ -z "ADBFASTBOOT_FOLDER_PATH" ] +if [ -z "$ADBFASTBOOT_FOLDER_PATH" ] then exit 102 fi @@ -47,7 +47,7 @@ FASTBOOT_PATH=${ADBFASTBOOT_FOLDER_PATH}"fastboot" ADB_PATH=${ADBFASTBOOT_FOLDER_PATH}"adb" # reboot device in bootloader mode -if !"ADB_PATH" -s "$DEVICE_ID" reboot bootloader +if ! "$ADB_PATH" -s "$DEVICE_ID" reboot bootloader then exit 10; fi -- GitLab From 67ba3d2e7635b47f3aed435b19163b4651f236e4 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Thu, 4 Feb 2021 16:22:45 +0100 Subject: [PATCH 54/69] continue to translate script for windows --- .../windows/gs290-install-from-bootloader.bat | 226 +++++++++--------- .../gs290-wait-reboot-from-fastboot.bat | 13 +- 2 files changed, 115 insertions(+), 124 deletions(-) diff --git a/flash-scripts/windows/gs290-install-from-bootloader.bat b/flash-scripts/windows/gs290-install-from-bootloader.bat index 53fa7ed6..98ec32c1 100644 --- a/flash-scripts/windows/gs290-install-from-bootloader.bat +++ b/flash-scripts/windows/gs290-install-from-bootloader.bat @@ -1,139 +1,129 @@ -#!/bin/bash - -# Copyright (C) 2020 ECORP SAS - Author: Romain Hunault -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# Parameter -# $1: DEVICE_ID device id -# $2: ARCHIVE_PATH path to archive -# $3: fastboot folder path -# $4: Java folder path - - -# Exit status -# - 0 : device flashed -# - 1 : generic error -# - 10: can't unpack system.img -# - 11: can't wipe data -# - 12: can't flash boot -# - 13: can't flash recovery -# - 14: can't flash system -# - 15: can't flash lk -# - 16: can't flash logo -# - 101 : DEVICE_ID missing -# - 102 : ARCHIVE_PATH missing -# - 103 : fastboot folder path missing - -DEVICE_ID=$1 -ARCHIVE_PATH=$2 -FASTBOOT_FOLDER_PATH=$3 -JAVA_FOLDER_PATH=$4 - -# Check serial number has been provided -if [ -z $DEVICE_ID ] -then - exit 101 -fi - -# check path to rom has been provided -if [ -z $ARCHIVE_PATH ] -then - exit 102 -fi - -#check path to adb/fasboot has been provided -if [ -z $FASTBOOT_FOLDER_PATH ] -then - exit 103 -fi - -# Check java folder has been provided -if [ -z JAVA_FOLDER_PATH ] -then - exit 104 -fi - - -# Build fastboot path -FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" - -# Build java jar path -JAR_PATH=${JAVA_FOLDER_PATH}"/bin/jar" - -# Build archive folder path -ARCHIVE_FOLDER_PATH=$(dirname "$1")"/" - -# unzip for system.img -cd "$ARCHIVE_FOLDER_PATH" - -if ! "$JAR_PATH" -x -v -f "$ARCHIVE_PATH" ; -then - exit 10 -fi +:: Copyright (C) 2021 ECORP SAS - Author: Vincent Bourgmayer +:: +:: This program is free software: you can redistribute it and/or modify +:: it under the terms of the GNU General Public License as published by +:: the Free Software Foundation, either version 3 of the License, or +:: (at your option) any later version. +:: +:: This program is distributed in the hope that it will be useful, +:: but WITHOUT ANY WARRANTY; without even the implied warranty of +:: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +:: GNU General Public License for more details. +:: +:: You should have received a copy of the GNU General Public License +:: along with this program. If not, see . + +:: Parameter +:: $1: DEVICE_ID device id +:: $2: ARCHIVE_PATH path to archive +:: $3: fastboot folder path +:: $4: Java folder path + + +:: Exit status +:: - 0 : device flashed +:: - 1 : generic error +:: - 10: can't unpack system.img +:: - 11: can't wipe data +:: - 12: can't flash boot +:: - 13: can't flash recovery +:: - 14: can't flash system +:: - 15: can't flash lk +:: - 16: can't flash logo +:: - 101 : DEVICE_ID missing +:: - 102 : ARCHIVE_PATH missing +:: - 103 : fastboot folder path missing + +set DEVICE_ID="%1" +set ARCHIVE_PATH=%~2 +set FASTBOOT_FOLDER_PATH=%~3 +set JAVA_FOLDER_PATH=%~4 + +:: Check serial number has been provided +if not defined %DEVICE_ID ( + exit /b 101 +) + +:: check path to rom has been provided +if not defined %ARCHIVE_PATH + exit /b 102 +) + +::check path to adb/fasboot has been provided +if not defined %FASTBOOT_FOLDER_PATH + exit /b 103 +) + +:: Check java folder has been provided +if not defined %JAVA_FOLDER_PATH + exit /b 104 +) + + +:: Build fastboot path +set FASTBOOT_PATH="%FASTBOOT_FOLDER_PATH%fastboot" + +:: Build java jar path +set JAR_PATH="%JAVA_FOLDER_PATH%/bin/jar" + +:: Build archive folder path +set ARCHIVE_FOLDER_PATH=$(dirname "$1")"/" + +:: get basename of archive +for %%a in ("%ARCHIVE_PATH%") do ( + set "ARCHIVE_FOLDER_PATH=%%~dpa" + echo %ARCHIVE_NAME% +) +:: unzip for system.img +cd ARCHIVE_FOLDER_PATH + +%JAR_PATH% -x -v -f %ARCHIVE_PATH% ; +if errorLevel 1 ( exit /b 10 ) echo "unpacked archive" -sleep 1 +timeout 1 >nul 2>&1 -# Wipe user data -if ! "$FASTBOOT_PATH" -w ; -then - exit 11 -fi +:: Wipe user data +%FASTBOOT_PATH% -w +if errorLevel 1 ( exit /b 11 ) echo "user data wiped" -sleep 5 +timeout 5 >nul 2>&1 -# Flash the device +:: Flash the device -sleep 1 -if !$FASTBOOT_PATH -s $DEVICE_ID flash --disable-verity --disable-verification boot boot.img -then - exit 12 -fi -sleep 1 +%FASTBOOT_PATH% -s %DEVICE_ID% flash --disable-verity --disable-verification boot boot.img +if errorLevel 1 ( exit /b 12 ) + +timeout 1 >nul 2>&1 echo "Flashed boot" -if !$FASTBOOT_PATH -s $DEVICE_ID flash recovery recovery-e-latest-GS290.img -then - exit 13 -fi -sleep 1 +%FASTBOOT_PATH% -s %DEVICE_ID% flash recovery recovery-e-latest-GS290.img +if errorLevel 1 ( exit /b 13 ) + +timeout 1 >nul 2>&1 echo "Flashed recovery" -$FASTBOOT_PATH -s $DEVICE_ID flash system system.img -then - exit 14 -fi -sleep 1 +%FASTBOOT_PATH% -s %DEVICE_ID% flash system system.img +if errorLevel 1 ( exit /b 14 ) + +timeout 1 >nul 2>&1 echo "Flashed system" -$FASTBOOT_PATH -s $DEVICE_ID flash lk lk.img -then - exit 15 -fi -sleep 1 +%FASTBOOT_PATH% -s %DEVICE_ID% flash lk lk.img +if errorLevel 1 ( exit /b 15 ) + +timeout 1 >nul 2>&1 echo "Flashed lk" -$FASTBOOT_PATH -s $DEVICE_ID flash logo logo.bin -then - exit 16 -fi -sleep 1 +%FASTBOOT_PATH% -s %DEVICE_ID% flash logo logo.bin +if errorLevel 1 ( exit /b 16 ) + + +timeout 1 >nul 2>&1 echo "Flashed logo" diff --git a/flash-scripts/windows/gs290-wait-reboot-from-fastboot.bat b/flash-scripts/windows/gs290-wait-reboot-from-fastboot.bat index 93cede44..2702e795 100644 --- a/flash-scripts/windows/gs290-wait-reboot-from-fastboot.bat +++ b/flash-scripts/windows/gs290-wait-reboot-from-fastboot.bat @@ -34,15 +34,16 @@ if errorLevel 1 ( exit /b 101 ) -# Reboot the device %FASTBOOT_PATH% reboot if errorlevel 1 ( exit /b 10 ) +:fastboot_detect +%FASTBOOT_PATH% devices 2>&1 | findstr fastboot +if errorLevel 0 ( + timeout 1 >nul 2>&1 + goto :fastboot_detect +) -#Then we wait that it left this state -while [ "$($FASTBOOT_PATH devices | grep -q fastboot; echo $?)" = 0 ] -do - sleep 1s -done +call fastboot_detect exit /b 0 \ No newline at end of file -- GitLab From d7fbf86782628cafffb2396a18e925e1a6723123 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Thu, 4 Feb 2021 16:44:51 +0100 Subject: [PATCH 55/69] remove unused script --- flash-scripts/linux/fp3_get_oem_unlockcode.sh | 55 ------------------- .../linux/gs290-install-from-bootloader.sh | 4 +- 2 files changed, 1 insertion(+), 58 deletions(-) delete mode 100755 flash-scripts/linux/fp3_get_oem_unlockcode.sh diff --git a/flash-scripts/linux/fp3_get_oem_unlockcode.sh b/flash-scripts/linux/fp3_get_oem_unlockcode.sh deleted file mode 100755 index 6fdd59e2..00000000 --- a/flash-scripts/linux/fp3_get_oem_unlockcode.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/bash - -# Copyright (C) 2020 ECORP SAS - Author: Vincent Bourgmayer -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# Parameter -# $1: The folder where adb runnable is stored -# $2: serial number of device - -# Exit status -# - 0 : OEM unlocked on device -# - 10 : Missing ADB folder path -# - 11 : Missing device ID -# - 12: can't get IMEI - -ADB_FOLDER_PATH=$1 - -DEVICE_ID=$2 -if [ -z "$ADB_FOLDER_PATH" ] -then - exit 10 -fi - -if [ -z "$DEVICE_ID" ] -then - exit 11 -fi - - -ADB_PATH=${ADB_FOLDER_PATH}"adb" -echo "ADB path: $ADB_PATH" - -# get Imei -DEVICE_IMEI=$($ADB_PATH shell "service call iphonesubinfo 1 | cut -c 52-66 | tr -d '.[:space:]'") -if [ -z "$DEVICE_IMEI" ] -then - exit 12 -fi - -URL="https://factory.fairphone.com/api/unlock-codes/$DEVICE_IMEI/$DEVICE_ID" -RESULT=$(curl -X POST $URL) - -echo "${RESULT:9:8}" \ No newline at end of file diff --git a/flash-scripts/linux/gs290-install-from-bootloader.sh b/flash-scripts/linux/gs290-install-from-bootloader.sh index 8cfb01bb..6934537a 100644 --- a/flash-scripts/linux/gs290-install-from-bootloader.sh +++ b/flash-scripts/linux/gs290-install-from-bootloader.sh @@ -130,6 +130,4 @@ then exit 16 fi sleep 1 -echo "Flashed logo" - - +echo "Flashed logo" \ No newline at end of file -- GitLab From fa2b695e808e2c049bb47dd68b6b5adb1d082f93 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Thu, 4 Feb 2021 16:45:27 +0100 Subject: [PATCH 56/69] finish to translate gs290-install-from-bootloader.bat --- .../windows/fp3_install-from-fastboot.bat | 2 +- .../windows/gs290-install-from-bootloader.bat | 23 ++++--------------- 2 files changed, 6 insertions(+), 19 deletions(-) diff --git a/flash-scripts/windows/fp3_install-from-fastboot.bat b/flash-scripts/windows/fp3_install-from-fastboot.bat index b441f049..9d9c4dc6 100644 --- a/flash-scripts/windows/fp3_install-from-fastboot.bat +++ b/flash-scripts/windows/fp3_install-from-fastboot.bat @@ -129,4 +129,4 @@ echo "flashed vbmeta" timeout 1 >nul 2>&1 -exit /b 0 +exit /b 0 \ No newline at end of file diff --git a/flash-scripts/windows/gs290-install-from-bootloader.bat b/flash-scripts/windows/gs290-install-from-bootloader.bat index 98ec32c1..ce988193 100644 --- a/flash-scripts/windows/gs290-install-from-bootloader.bat +++ b/flash-scripts/windows/gs290-install-from-bootloader.bat @@ -39,17 +39,14 @@ set ARCHIVE_PATH=%~2 set FASTBOOT_FOLDER_PATH=%~3 set JAVA_FOLDER_PATH=%~4 -:: Check serial number has been provided if not defined %DEVICE_ID ( exit /b 101 ) -:: check path to rom has been provided if not defined %ARCHIVE_PATH exit /b 102 ) -::check path to adb/fasboot has been provided if not defined %FASTBOOT_FOLDER_PATH exit /b 103 ) @@ -59,23 +56,18 @@ if not defined %JAVA_FOLDER_PATH exit /b 104 ) - -:: Build fastboot path set FASTBOOT_PATH="%FASTBOOT_FOLDER_PATH%fastboot" -:: Build java jar path + set JAR_PATH="%JAVA_FOLDER_PATH%/bin/jar" :: Build archive folder path -set ARCHIVE_FOLDER_PATH=$(dirname "$1")"/" - -:: get basename of archive for %%a in ("%ARCHIVE_PATH%") do ( - set "ARCHIVE_FOLDER_PATH=%%~dpa" - echo %ARCHIVE_NAME% + set ARCHIVE_FOLDER_PATH=%%~dpa" + echo %ARCHIVE_FOLDER_PATH% ) :: unzip for system.img -cd ARCHIVE_FOLDER_PATH +cd "%ARCHIVE_FOLDER_PATH%" %JAR_PATH% -x -v -f %ARCHIVE_PATH% ; if errorLevel 1 ( exit /b 10 ) @@ -84,7 +76,6 @@ echo "unpacked archive" timeout 1 >nul 2>&1 -:: Wipe user data %FASTBOOT_PATH% -w if errorLevel 1 ( exit /b 11 ) @@ -92,9 +83,6 @@ echo "user data wiped" timeout 5 >nul 2>&1 - -:: Flash the device - %FASTBOOT_PATH% -s %DEVICE_ID% flash --disable-verity --disable-verification boot boot.img if errorLevel 1 ( exit /b 12 ) @@ -125,5 +113,4 @@ if errorLevel 1 ( exit /b 16 ) timeout 1 >nul 2>&1 echo "Flashed logo" - - +exit /b 0 \ No newline at end of file -- GitLab From d1e8a796edfc80ab8d542bb86de892a47b7e1369 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Thu, 4 Feb 2021 16:52:24 +0100 Subject: [PATCH 57/69] update year of the copyright for linux script --- flash-scripts/linux/gs290-flashingUnlock.sh | 2 +- flash-scripts/linux/gs290-install-from-bootloader.sh | 2 +- flash-scripts/linux/gs290-wait-reboot-from-fastboot.sh | 2 +- flash-scripts/linux/reboot-fastboot.sh | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/flash-scripts/linux/gs290-flashingUnlock.sh b/flash-scripts/linux/gs290-flashingUnlock.sh index 9f5a9296..f37b0f61 100644 --- a/flash-scripts/linux/gs290-flashingUnlock.sh +++ b/flash-scripts/linux/gs290-flashingUnlock.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright (C) 2020 ECORP SAS - Author: Romain Hunault +# Copyright (C) 2021 ECORP SAS - Author: Vincent Bourgmayer # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/flash-scripts/linux/gs290-install-from-bootloader.sh b/flash-scripts/linux/gs290-install-from-bootloader.sh index 6934537a..020cf5d6 100644 --- a/flash-scripts/linux/gs290-install-from-bootloader.sh +++ b/flash-scripts/linux/gs290-install-from-bootloader.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright (C) 2020 ECORP SAS - Author: Romain Hunault +# Copyright (C) 2021 ECORP SAS - Author: Romain Hunault # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/flash-scripts/linux/gs290-wait-reboot-from-fastboot.sh b/flash-scripts/linux/gs290-wait-reboot-from-fastboot.sh index 0a79a4b4..17621c17 100644 --- a/flash-scripts/linux/gs290-wait-reboot-from-fastboot.sh +++ b/flash-scripts/linux/gs290-wait-reboot-from-fastboot.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright (C) 2020 ECORP SAS - Author: Vincent Bourgmayer +# Copyright (C) 2021 ECORP SAS - Author: Vincent Bourgmayer # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/flash-scripts/linux/reboot-fastboot.sh b/flash-scripts/linux/reboot-fastboot.sh index 214855bf..8f11b149 100644 --- a/flash-scripts/linux/reboot-fastboot.sh +++ b/flash-scripts/linux/reboot-fastboot.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright (C) 2020 - Author: Ingo +# Copyright (C) 2021 - Author: Vincent Bourgmayer # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by -- GitLab From cb7953fbe40bb2301208e09fb766eb95583db1e5 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Thu, 4 Feb 2021 16:52:54 +0100 Subject: [PATCH 58/69] translate gs290-flashingUnlock.bat to windows batch --- .../windows/gs290-flashingUnlock.bat | 97 +++++++++---------- 1 file changed, 44 insertions(+), 53 deletions(-) diff --git a/flash-scripts/windows/gs290-flashingUnlock.bat b/flash-scripts/windows/gs290-flashingUnlock.bat index 34992211..f5a65467 100644 --- a/flash-scripts/windows/gs290-flashingUnlock.bat +++ b/flash-scripts/windows/gs290-flashingUnlock.bat @@ -1,53 +1,44 @@ -#!/bin/bash - -# Copyright (C) 2020 ECORP SAS - Author: Romain Hunault -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# Parameter -# $1: device id -# $2: fastboot folder path - -# Exit status -# - 0 : bootloader locked -# - 1 : unknown error -# - 2 : Flashing unlocked failed -# - 101 : $DEVICE_ID missing -# - 102 : $FASTBOOT_FOLDER_PATH is missing - -DEVICE_ID=$1 -FASTBOOT_FOLDER_PATH=$2 - -# check serial number has been provided -if [ -z $DEVICE_ID ] -then - exit 101 -fi - -# Check fastboot parent folder path has been provided -if [ -z $FASTBOOT_FOLDER_PATH ] -then - exit 102 -fi - -# Build fastboot path -FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" - -# Unlock bootloader -if ! "$FASTBOOT_PATH" -s $DEVICE_ID flashing unlock -then - exit 2 -fi - -sleep 1 +:: Copyright (C) 2021 ECORP SAS - Author: Vincent Bourgmayer +:: +:: This program is free software: you can redistribute it and/or modify +:: it under the terms of the GNU General Public License as published by +:: the Free Software Foundation, either version 3 of the License, or +:: (at your option) any later version. +:: +:: This program is distributed in the hope that it will be useful, +:: but WITHOUT ANY WARRANTY; without even the implied warranty of +:: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +:: GNU General Public License for more details. +:: +:: You should have received a copy of the GNU General Public License +:: along with this program. If not, see . + +:: Parameter +:: $1: device id +:: $2: fastboot folder path + +:: Exit status +:: - 0 : bootloader locked +:: - 1 : unknown error +:: - 2 : Flashing unlocked failed +:: - 101 : $DEVICE_ID missing +:: - 102 : $FASTBOOT_FOLDER_PATH is missing + +set DEVICE_ID="%1" +set FASTBOOT_FOLDER_PATH=%~2 + +if not defined %DEVICE_ID ( + exit /b 101 +) + +if not defined %FASTBOOT_FOLDER_PATH + exit /b 102 +) + +set FASTBOOT_PATH="%FASTBOOT_FOLDER_PATH%fastboot" + +%$FASTBOOT_PATH% -s %DEVICE_ID% flashing unlock +if errorLevel 1 ( exit /b 2 ) + +timeout 1 >nul 2>&1 +exit /b 0 \ No newline at end of file -- GitLab From 7ac65eaf178be08abb23f60a82206cea84537fad Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Thu, 4 Feb 2021 18:07:11 +0100 Subject: [PATCH 59/69] add images for OEM unlocking of GS290 and add entry for GS290 in deviceHelper --- .../easy/installer/helpers/DeviceHelper.java | 1 + .../images/gs290_allowOEMUnlocking.png | Bin 0 -> 41919 bytes .../images/gs290_enableOEMUnlocking.png | Bin 0 -> 46427 bytes .../resources/images/gs290_pressVolUp.png | Bin 0 -> 14903 bytes src/main/resources/images/gs290_searchOEM.png | Bin 0 -> 24835 bytes src/main/resources/images/gs290_settings.png | Bin 0 -> 34799 bytes .../imageName_en_EN_0009.properties | 20 ++++++++++++++++++ 7 files changed, 21 insertions(+) create mode 100644 src/main/resources/images/gs290_allowOEMUnlocking.png create mode 100644 src/main/resources/images/gs290_enableOEMUnlocking.png create mode 100644 src/main/resources/images/gs290_pressVolUp.png create mode 100644 src/main/resources/images/gs290_searchOEM.png create mode 100644 src/main/resources/images/gs290_settings.png create mode 100644 src/main/resources/instructions/imageName_en_EN_0009.properties diff --git a/src/main/java/ecorp/easy/installer/helpers/DeviceHelper.java b/src/main/java/ecorp/easy/installer/helpers/DeviceHelper.java index 5e74e67e..8471578e 100644 --- a/src/main/java/ecorp/easy/installer/helpers/DeviceHelper.java +++ b/src/main/java/ecorp/easy/installer/helpers/DeviceHelper.java @@ -32,6 +32,7 @@ public class DeviceHelper { put("dream2lte", "0006"); put("dreamlte", "0007"); put("FP3", "0008"); + put("GS290", "0009"); }}; diff --git a/src/main/resources/images/gs290_allowOEMUnlocking.png b/src/main/resources/images/gs290_allowOEMUnlocking.png new file mode 100644 index 0000000000000000000000000000000000000000..04079705b390056e9b0161bbe27f0e58342cfaac GIT binary patch literal 41919 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

aF58@0*kf~ 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/images/gs290_searchOEM.png b/src/main/resources/images/gs290_searchOEM.png new file mode 100644 index 0000000000000000000000000000000000000000..0df5b59b6784b6955c782870ad4acd038a73b2f2 GIT binary patch literal 24835 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/instructions/imageName_en_EN_0009.properties b/src/main/resources/instructions/imageName_en_EN_0009.properties new file mode 100644 index 00000000..d960a90e --- /dev/null +++ b/src/main/resources/instructions/imageName_en_EN_0009.properties @@ -0,0 +1,20 @@ +# Copyright 2019-2020 - ECORP SAS + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +install_instr_openSettings=gs290_settings.png +install_instr_searchOEM=gs290_searchOEM.png +install_instr_enableOEMUnlocking=gs290_enableOEMUnlocking.png +install_instr_acceptOEMUnlockWarning=gs290_allowOEMUnlocking.png +install_instr_pressVolUpToAcceptOEMUnlocking=gs290_pressVolUp.png \ No newline at end of file -- GitLab From 99a67dd64260145816085317d751122295c9a7b7 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Fri, 5 Feb 2021 11:51:23 +0100 Subject: [PATCH 60/69] add missing images for gs290 --- .../resources/images/gs290_settingsSystem.png | Bin 0 -> 40877 bytes .../images/gs290_settingsSystemUpdate.png | Bin 0 -> 28613 bytes .../resources/images/gs290_systemUpdate.png | Bin 0 -> 44099 bytes .../imageName_en_EN_0009.properties | 5 ++++- 4 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/images/gs290_settingsSystem.png create mode 100644 src/main/resources/images/gs290_settingsSystemUpdate.png create mode 100644 src/main/resources/images/gs290_systemUpdate.png diff --git a/src/main/resources/images/gs290_settingsSystem.png b/src/main/resources/images/gs290_settingsSystem.png new file mode 100644 index 0000000000000000000000000000000000000000..17d580f9317ceaa5886c78b6a782eb2a8cd90bd1 GIT binary patch literal 40877 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

e4^~|$%B2&(IZBpU9J3qa* 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 f+3=9mOu6{1-oD!M Date: Fri, 5 Feb 2021 12:11:54 +0100 Subject: [PATCH 61/69] fix typos --- src/main/resources/yaml/GS290_fs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/yaml/GS290_fs.yml b/src/main/resources/yaml/GS290_fs.yml index 31480a2b..c0e2c7f9 100644 --- a/src/main/resources/yaml/GS290_fs.yml +++ b/src/main/resources/yaml/GS290_fs.yml @@ -33,7 +33,7 @@ sources: flash: f1: ui: - cd type: action + type: action title: stepTitle_checkDeviceUptodate instruction: - install_instr_connectTowifi -- GitLab From 3fa1cf9142bb6a3bb0b1b1fdd97ed357cb4cfc6f Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Mon, 8 Feb 2021 11:18:02 +0100 Subject: [PATCH 62/69] add missing execution permission on script --- flash-scripts/linux/gs290-flashingUnlock.sh | 0 .../linux/gs290-install-from-bootloader.sh | 0 .../linux/gs290-wait-reboot-from-fastboot.sh | 0 flash-scripts/linux/reboot-fastboot.sh | 0 flash-scripts/windows/COPYING.md | 675 ++++++++++++++++++ .../windows/fp3_install-from-fastboot.bat | 0 flash-scripts/windows/fp3_oem-unlock.bat | 0 .../windows/gs290-flashingUnlock.bat | 0 .../windows/gs290-install-from-bootloader.bat | 0 .../gs290-wait-reboot-from-fastboot.bat | 0 .../windows/install-from-bootloader-GS290.bat | 0 flash-scripts/windows/reboot-fastboot.bat | 0 .../windows/wait-fastboot-unlocked.bat | 0 flash-scripts/windows/wait-fastboot.bat | 0 .../windows/wait-reboot-from-fastboot.bat | 0 15 files changed, 675 insertions(+) mode change 100644 => 100755 flash-scripts/linux/gs290-flashingUnlock.sh mode change 100644 => 100755 flash-scripts/linux/gs290-install-from-bootloader.sh mode change 100644 => 100755 flash-scripts/linux/gs290-wait-reboot-from-fastboot.sh mode change 100644 => 100755 flash-scripts/linux/reboot-fastboot.sh create mode 100644 flash-scripts/windows/COPYING.md mode change 100644 => 100755 flash-scripts/windows/fp3_install-from-fastboot.bat mode change 100644 => 100755 flash-scripts/windows/fp3_oem-unlock.bat mode change 100644 => 100755 flash-scripts/windows/gs290-flashingUnlock.bat mode change 100644 => 100755 flash-scripts/windows/gs290-install-from-bootloader.bat mode change 100644 => 100755 flash-scripts/windows/gs290-wait-reboot-from-fastboot.bat mode change 100644 => 100755 flash-scripts/windows/install-from-bootloader-GS290.bat mode change 100644 => 100755 flash-scripts/windows/reboot-fastboot.bat mode change 100644 => 100755 flash-scripts/windows/wait-fastboot-unlocked.bat mode change 100644 => 100755 flash-scripts/windows/wait-fastboot.bat mode change 100644 => 100755 flash-scripts/windows/wait-reboot-from-fastboot.bat diff --git a/flash-scripts/linux/gs290-flashingUnlock.sh b/flash-scripts/linux/gs290-flashingUnlock.sh old mode 100644 new mode 100755 diff --git a/flash-scripts/linux/gs290-install-from-bootloader.sh b/flash-scripts/linux/gs290-install-from-bootloader.sh old mode 100644 new mode 100755 diff --git a/flash-scripts/linux/gs290-wait-reboot-from-fastboot.sh b/flash-scripts/linux/gs290-wait-reboot-from-fastboot.sh old mode 100644 new mode 100755 diff --git a/flash-scripts/linux/reboot-fastboot.sh b/flash-scripts/linux/reboot-fastboot.sh old mode 100644 new mode 100755 diff --git a/flash-scripts/windows/COPYING.md b/flash-scripts/windows/COPYING.md new file mode 100644 index 00000000..2fb2e74d --- /dev/null +++ b/flash-scripts/windows/COPYING.md @@ -0,0 +1,675 @@ +### GNU GENERAL PUBLIC LICENSE + +Version 3, 29 June 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. + + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +### Preamble + +The GNU General Public License is a free, copyleft license for +software and other kinds of works. + +The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom +to share and change all versions of a program--to make sure it remains +free software for all its users. We, the Free Software Foundation, use +the GNU General Public License for most of our software; it applies +also to any other work released this way by its authors. You can apply +it to your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + +To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you +have certain responsibilities if you distribute copies of the +software, or if you modify it: responsibilities to respect the freedom +of others. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + +Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + +Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the +manufacturer can do so. This is fundamentally incompatible with the +aim of protecting users' freedom to change the software. The +systematic pattern of such abuse occurs in the area of products for +individuals to use, which is precisely where it is most unacceptable. +Therefore, we have designed this version of the GPL to prohibit the +practice for those products. If such problems arise substantially in +other domains, we stand ready to extend this provision to those +domains in future versions of the GPL, as needed to protect the +freedom of users. + +Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish +to avoid the special danger that patents applied to a free program +could make it effectively proprietary. To prevent this, the GPL +assures that patents cannot be used to render the program non-free. + +The precise terms and conditions for copying, distribution and +modification follow. + +### TERMS AND CONDITIONS + +#### 0. Definitions. + +"This License" refers to version 3 of the GNU General Public License. + +"Copyright" also means copyright-like laws that apply to other kinds +of works, such as semiconductor masks. + +"The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + +To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of +an exact copy. The resulting work is called a "modified version" of +the earlier work or a work "based on" the earlier work. + +A "covered work" means either the unmodified Program or a work based +on the Program. + +To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + +To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user +through a computer network, with no transfer of a copy, is not +conveying. + +An interactive user interface displays "Appropriate Legal Notices" to +the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + +#### 1. Source Code. + +The "source code" for a work means the preferred form of the work for +making modifications to it. "Object code" means any non-source form of +a work. + +A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + +The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + +The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can +regenerate automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same +work. + +#### 2. Basic Permissions. + +All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, +without conditions so long as your license otherwise remains in force. +You may convey covered works to others for the sole purpose of having +them make modifications exclusively for you, or provide you with +facilities for running those works, provided that you comply with the +terms of this License in conveying all material for which you do not +control copyright. Those thus making or running the covered works for +you must do so exclusively on your behalf, under your direction and +control, on terms that prohibit them from making any copies of your +copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the +conditions stated below. Sublicensing is not allowed; section 10 makes +it unnecessary. + +#### 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + +When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such +circumvention is effected by exercising rights under this License with +respect to the covered work, and you disclaim any intention to limit +operation or modification of the work as a means of enforcing, against +the work's users, your or third parties' legal rights to forbid +circumvention of technological measures. + +#### 4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + +#### 5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these +conditions: + +- a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. +- b) The work must carry prominent notices stating that it is + released under this License and any conditions added under + section 7. This requirement modifies the requirement in section 4 + to "keep intact all notices". +- c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. +- d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + +A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + +#### 6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms of +sections 4 and 5, provided that you also convey the machine-readable +Corresponding Source under the terms of this License, in one of these +ways: + +- a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. +- b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the Corresponding + Source from a network server at no charge. +- c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. +- d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. +- e) Convey the object code using peer-to-peer transmission, + provided you inform other peers where the object code and + Corresponding Source of the work are being offered to the general + public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + +A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, +family, or household purposes, or (2) anything designed or sold for +incorporation into a dwelling. In determining whether a product is a +consumer product, doubtful cases shall be resolved in favor of +coverage. For a particular product received by a particular user, +"normally used" refers to a typical or common use of that class of +product, regardless of the status of the particular user or of the way +in which the particular user actually uses, or expects or is expected +to use, the product. A product is a consumer product regardless of +whether the product has substantial commercial, industrial or +non-consumer uses, unless such uses represent the only significant +mode of use of the product. + +"Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to +install and execute modified versions of a covered work in that User +Product from a modified version of its Corresponding Source. The +information must suffice to ensure that the continued functioning of +the modified object code is in no case prevented or interfered with +solely because modification has been made. + +If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + +The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or +updates for a work that has been modified or installed by the +recipient, or for the User Product in which it has been modified or +installed. Access to a network may be denied when the modification +itself materially and adversely affects the operation of the network +or violates the rules and protocols for communication across the +network. + +Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + +#### 7. Additional Terms. + +"Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders +of that material) supplement the terms of this License with terms: + +- a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or +- b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or +- c) Prohibiting misrepresentation of the origin of that material, + or requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or +- d) Limiting the use for publicity purposes of names of licensors + or authors of the material; or +- e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or +- f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions + of it) with contractual assumptions of liability to the recipient, + for any liability that these contractual assumptions directly + impose on those licensors and authors. + +All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; the +above requirements apply either way. + +#### 8. Termination. + +You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + +#### 9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run +a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + +#### 10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + +An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + +#### 11. Patents. + +A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims owned +or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + +In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + +If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + +A patent license is "discriminatory" if it does not include within the +scope of its coverage, prohibits the exercise of, or is conditioned on +the non-exercise of one or more of the rights that are specifically +granted under this License. You may not convey a covered work if you +are a party to an arrangement with a third party that is in the +business of distributing software, under which you make payment to the +third party based on the extent of your activity of conveying the +work, and under which the third party grants, to any of the parties +who would receive the covered work from you, a discriminatory patent +license (a) in connection with copies of the covered work conveyed by +you (or copies made from those copies), or (b) primarily for and in +connection with specific products or compilations that contain the +covered work, unless you entered into that arrangement, or that patent +license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + +#### 12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under +this License and any other pertinent obligations, then as a +consequence you may not convey it at all. For example, if you agree to +terms that obligate you to collect a royalty for further conveying +from those to whom you convey the Program, the only way you could +satisfy both those terms and this License would be to refrain entirely +from conveying the Program. + +#### 13. Use with the GNU Affero General Public License. + +Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + +#### 14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions +of the GNU General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in +detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies that a certain numbered version of the GNU General Public +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that numbered version or +of any later version published by the Free Software Foundation. If the +Program does not specify a version number of the GNU General Public +License, you may choose any version ever published by the Free +Software Foundation. + +If the Program specifies that a proxy can decide which future versions +of the GNU General Public License can be used, that proxy's public +statement of acceptance of a version permanently authorizes you to +choose that version for the Program. + +Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + +#### 15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT +WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE +DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR +CORRECTION. + +#### 16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR +CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT +NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR +LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM +TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER +PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +#### 17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS + +### How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + +To do so, attach the following notices to the program. It is safest to +attach them to the start of each source file to most effectively state +the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper +mail. + +If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands \`show w' and \`show c' should show the +appropriate parts of the General Public License. Of course, your +program's commands might be different; for a GUI interface, you would +use an "about box". + +You should also get your employer (if you work as a programmer) or +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. For more information on this, and how to apply and follow +the GNU GPL, see . + +The GNU General Public License does not permit incorporating your +program into proprietary programs. If your program is a subroutine +library, you may consider it more useful to permit linking proprietary +applications with the library. If this is what you want to do, use the +GNU Lesser General Public License instead of this License. But first, +please read . diff --git a/flash-scripts/windows/fp3_install-from-fastboot.bat b/flash-scripts/windows/fp3_install-from-fastboot.bat old mode 100644 new mode 100755 diff --git a/flash-scripts/windows/fp3_oem-unlock.bat b/flash-scripts/windows/fp3_oem-unlock.bat old mode 100644 new mode 100755 diff --git a/flash-scripts/windows/gs290-flashingUnlock.bat b/flash-scripts/windows/gs290-flashingUnlock.bat old mode 100644 new mode 100755 diff --git a/flash-scripts/windows/gs290-install-from-bootloader.bat b/flash-scripts/windows/gs290-install-from-bootloader.bat old mode 100644 new mode 100755 diff --git a/flash-scripts/windows/gs290-wait-reboot-from-fastboot.bat b/flash-scripts/windows/gs290-wait-reboot-from-fastboot.bat old mode 100644 new mode 100755 diff --git a/flash-scripts/windows/install-from-bootloader-GS290.bat b/flash-scripts/windows/install-from-bootloader-GS290.bat old mode 100644 new mode 100755 diff --git a/flash-scripts/windows/reboot-fastboot.bat b/flash-scripts/windows/reboot-fastboot.bat old mode 100644 new mode 100755 diff --git a/flash-scripts/windows/wait-fastboot-unlocked.bat b/flash-scripts/windows/wait-fastboot-unlocked.bat old mode 100644 new mode 100755 diff --git a/flash-scripts/windows/wait-fastboot.bat b/flash-scripts/windows/wait-fastboot.bat old mode 100644 new mode 100755 diff --git a/flash-scripts/windows/wait-reboot-from-fastboot.bat b/flash-scripts/windows/wait-reboot-from-fastboot.bat old mode 100644 new mode 100755 -- GitLab From f2f9443eee0e793eb4a1b06a35a77cd9c79d5d71 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Mon, 8 Feb 2021 15:50:45 +0100 Subject: [PATCH 63/69] add missing quotes in script for GS290 --- flash-scripts/linux/gs290-install-from-bootloader.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/flash-scripts/linux/gs290-install-from-bootloader.sh b/flash-scripts/linux/gs290-install-from-bootloader.sh index 020cf5d6..54574980 100755 --- a/flash-scripts/linux/gs290-install-from-bootloader.sh +++ b/flash-scripts/linux/gs290-install-from-bootloader.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright (C) 2021 ECORP SAS - Author: Romain Hunault +# Copyright (C) 2021 ECORP SAS - Author: Vincent Bourgmayer # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -97,35 +97,35 @@ echo "user data wiped" sleep 5 # Flash the device -if ! $FASTBOOT_PATH -s "$DEVICE_ID" flash --disable-verity --disable-verification boot boot.img +if ! "$FASTBOOT_PATH" -s "$DEVICE_ID" flash --disable-verity --disable-verification boot boot.img then exit 12 fi sleep 1 echo "Flashed boot" -if ! $FASTBOOT_PATH -s "$DEVICE_ID" flash recovery recovery-e-latest-GS290.img +if ! "$FASTBOOT_PATH" -s "$DEVICE_ID" flash recovery recovery-e-latest-GS290.img then exit 13 fi sleep 1 echo "Flashed recovery" -if ! $FASTBOOT_PATH -s "$DEVICE_ID" flash system system.img +if ! "$FASTBOOT_PATH" -s "$DEVICE_ID" flash system system.img then exit 14 fi sleep 1 echo "Flashed system" -if ! $FASTBOOT_PATH -s "$DEVICE_ID" flash lk lk.img +if ! "$FASTBOOT_PATH" -s "$DEVICE_ID" flash lk lk.img then exit 15 fi sleep 1 echo "Flashed lk" -if ! $FASTBOOT_PATH -s "$DEVICE_ID" flash logo logo.bin +if ! "$FASTBOOT_PATH" -s "$DEVICE_ID" flash logo logo.bin then exit 16 fi -- GitLab From ee7f1f567a27a6081cff2e4e13a6dd1d88e9f065 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Mon, 8 Feb 2021 16:03:14 +0100 Subject: [PATCH 64/69] fix error in param for gs290-install-from-fastboot.sh --- flash-scripts/linux/gs290-install-from-bootloader.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flash-scripts/linux/gs290-install-from-bootloader.sh b/flash-scripts/linux/gs290-install-from-bootloader.sh index 54574980..a80410cb 100755 --- a/flash-scripts/linux/gs290-install-from-bootloader.sh +++ b/flash-scripts/linux/gs290-install-from-bootloader.sh @@ -73,7 +73,7 @@ FASTBOOT_PATH=${FASTBOOT_FOLDER_PATH}"fastboot" JAR_PATH=${JAVA_FOLDER_PATH}"/bin/jar" # Build archive folder path -ARCHIVE_FOLDER_PATH=$(dirname "$1")"/" +ARCHIVE_FOLDER_PATH=$(dirname "$ARCHIVE_PATH")"/" # unzip for system.img cd "$ARCHIVE_FOLDER_PATH" || exit 104 -- GitLab From 7367d9bd06e0039be5052c915fc55a763d6dc102 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Mon, 8 Feb 2021 17:02:50 +0100 Subject: [PATCH 65/69] fix white page at third step because of missing title translation --- src/main/resources/lang/translation.properties | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/resources/lang/translation.properties b/src/main/resources/lang/translation.properties index 7e74c649..302b7811 100644 --- a/src/main/resources/lang/translation.properties +++ b/src/main/resources/lang/translation.properties @@ -269,4 +269,5 @@ stepTitle_StartInFastbootFP3 = Start device in Fastboot mode stepTitle_checkDeviceUptodate= Check device is up-to-date stepTitle_enableOemUnlock= Enable OEM unlocking stepTitle_beforeInstallation= Before installation -stepTitle_rebootDevice= Reboot device \ No newline at end of file +stepTitle_rebootDevice= Reboot device +stepTitle_rebootBootloader = "Rebooting in bootloader mode" \ No newline at end of file -- GitLab From c3d2b9fca43e4557405cd106503c7472a67224db Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Tue, 9 Feb 2021 10:40:00 +0100 Subject: [PATCH 66/69] remove forgotten '$' in batch script --- flash-scripts/windows/gs290-flashingUnlock.bat | 2 +- flash-scripts/windows/gs290-wait-reboot-from-fastboot.bat | 2 +- flash-scripts/windows/reboot-fastboot.bat | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/flash-scripts/windows/gs290-flashingUnlock.bat b/flash-scripts/windows/gs290-flashingUnlock.bat index f5a65467..3a9709cf 100755 --- a/flash-scripts/windows/gs290-flashingUnlock.bat +++ b/flash-scripts/windows/gs290-flashingUnlock.bat @@ -37,7 +37,7 @@ if not defined %FASTBOOT_FOLDER_PATH set FASTBOOT_PATH="%FASTBOOT_FOLDER_PATH%fastboot" -%$FASTBOOT_PATH% -s %DEVICE_ID% flashing unlock +%FASTBOOT_PATH% -s %DEVICE_ID% flashing unlock if errorLevel 1 ( exit /b 2 ) timeout 1 >nul 2>&1 diff --git a/flash-scripts/windows/gs290-wait-reboot-from-fastboot.bat b/flash-scripts/windows/gs290-wait-reboot-from-fastboot.bat index 2702e795..7e1fe0e7 100755 --- a/flash-scripts/windows/gs290-wait-reboot-from-fastboot.bat +++ b/flash-scripts/windows/gs290-wait-reboot-from-fastboot.bat @@ -25,7 +25,7 @@ set FASTBOOT_FOLDER_PATH=%~1 set FASTBOOT_PATH="%FASTBOOT_FOLDER_PATH%fastboot" -echo "fastboot path: $FASTBOOT_PATH" +echo "fastboot path: %FASTBOOT_FOLDER_PATH%" %FASTBOOT_PATH% devices 2>&1 | findstr fastboot diff --git a/flash-scripts/windows/reboot-fastboot.bat b/flash-scripts/windows/reboot-fastboot.bat index 0578814e..b425fac7 100755 --- a/flash-scripts/windows/reboot-fastboot.bat +++ b/flash-scripts/windows/reboot-fastboot.bat @@ -39,7 +39,7 @@ set FASTBOOT_PATH="%ADBFASTBOOT_FOLDER_PATH%fastboot" set ADB_PATH="%ADBFASTBOOT_FOLDER_PATH%adb" -%ADB_PATH% -s %$DEVICE_ID% reboot bootloader +%ADB_PATH% -s %DEVICE_ID% reboot bootloader if errorlevel 1 ( exit /b 10 ) -- GitLab From c68392afd03fd996cbee75120e941dd9053d6de4 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Tue, 9 Feb 2021 11:47:30 +0100 Subject: [PATCH 67/69] add missing '(' in windows batch script for gs290 --- flash-scripts/windows/gs290-flashingUnlock.bat | 4 ++-- flash-scripts/windows/gs290-install-from-bootloader.bat | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/flash-scripts/windows/gs290-flashingUnlock.bat b/flash-scripts/windows/gs290-flashingUnlock.bat index 3a9709cf..4036966b 100755 --- a/flash-scripts/windows/gs290-flashingUnlock.bat +++ b/flash-scripts/windows/gs290-flashingUnlock.bat @@ -31,14 +31,14 @@ if not defined %DEVICE_ID ( exit /b 101 ) -if not defined %FASTBOOT_FOLDER_PATH +if not defined %FASTBOOT_FOLDER_PATH ( exit /b 102 ) set FASTBOOT_PATH="%FASTBOOT_FOLDER_PATH%fastboot" %FASTBOOT_PATH% -s %DEVICE_ID% flashing unlock -if errorLevel 1 ( exit /b 2 ) +if errorlevel 1 ( exit /b 2 ) timeout 1 >nul 2>&1 exit /b 0 \ No newline at end of file diff --git a/flash-scripts/windows/gs290-install-from-bootloader.bat b/flash-scripts/windows/gs290-install-from-bootloader.bat index ce988193..832cab9a 100755 --- a/flash-scripts/windows/gs290-install-from-bootloader.bat +++ b/flash-scripts/windows/gs290-install-from-bootloader.bat @@ -43,16 +43,16 @@ if not defined %DEVICE_ID ( exit /b 101 ) -if not defined %ARCHIVE_PATH +if not defined %ARCHIVE_PATH ( exit /b 102 ) -if not defined %FASTBOOT_FOLDER_PATH +if not defined %FASTBOOT_FOLDER_PATH ( exit /b 103 ) :: Check java folder has been provided -if not defined %JAVA_FOLDER_PATH +if not defined %JAVA_FOLDER_PATH ( exit /b 104 ) -- GitLab From 1b80e041f7f70e1fba6e69972e3f084c13dbef19 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Tue, 9 Feb 2021 16:28:05 +0100 Subject: [PATCH 68/69] fix bug in Command class --- .../ecorp/easy/installer/models/Command.java | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/main/java/ecorp/easy/installer/models/Command.java b/src/main/java/ecorp/easy/installer/models/Command.java index 4db83466..5b191d38 100644 --- a/src/main/java/ecorp/easy/installer/models/Command.java +++ b/src/main/java/ecorp/easy/installer/models/Command.java @@ -138,28 +138,33 @@ public class Command { ProcessBuilder pb; if(AppConstants.isWindowsOs()) { - //pb = new ProcessBuilder(); - String[] commandArray= new String[parameters.size()+3]; - commandArray[0] = "cmd.exe"; - commandArray[1] = "/c"; - commandArray[2] = "\"\""+command+"\""; + //@TODO REWRITE THIS PART AND MOVE IT TO getFinalCmd() + final int cmdArraySize = parameters.size()+3; + String[] commandArray= new String[cmdArraySize]; + + int cmdArrayIndex = 0; + commandArray[cmdArrayIndex++] = "cmd.exe"; + commandArray[cmdArrayIndex++] = "/c"; + + commandArray[cmdArrayIndex++] = "\"\""+command+(parameters.isEmpty() ? "\"\"":"\""); + //if empty param: commandArray[2] = ""scriptFolder/scriptname.bat"" + //else : commandArray[2] = ""scriptFolder/scriptname.bat" - int i = 2; for(String param : parameters.values()){ String quotedParam = "\""+param+"\""; - if(i+1 == parameters.size()-1){ - quotedParam += "\""; + //If this is the last parameter in the list + if(cmdArrayIndex == cmdArraySize-1){ + quotedParam += "\""; //add a closing <<">> } - commandArray[++i] = quotedParam; + //add the quoted param in the cmdArray + commandArray[cmdArrayIndex++] = quotedParam; } pb = new ProcessBuilder(commandArray); logger.debug("command: {}", pb.command()); - //pb.directory(new File(AppConstants.getRootPath().substring(0, AppConstants.getRootPath().length()-2))); - //logger.debug("Pb dir: {}", pb.directory()); - //pb.command(commandArray); }else{ - pb = new ProcessBuilder(getFinalCmd()); + pb = new ProcessBuilder(getFinalCmd()); } + pb.redirectErrorStream(true); pc= pb.start(); logger.info("Command's Process started"); -- GitLab From fecfc6476cd50b31360d1abd00da23662af80440 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Thu, 11 Feb 2021 10:45:01 +0100 Subject: [PATCH 69/69] fix typos in script for GS290 --- flash-scripts/windows/gs290-install-from-bootloader.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flash-scripts/windows/gs290-install-from-bootloader.bat b/flash-scripts/windows/gs290-install-from-bootloader.bat index 832cab9a..97f45c82 100755 --- a/flash-scripts/windows/gs290-install-from-bootloader.bat +++ b/flash-scripts/windows/gs290-install-from-bootloader.bat @@ -69,7 +69,7 @@ for %%a in ("%ARCHIVE_PATH%") do ( :: unzip for system.img cd "%ARCHIVE_FOLDER_PATH%" -%JAR_PATH% -x -v -f %ARCHIVE_PATH% ; +%JAR_PATH% -x -v -f "%ARCHIVE_PATH%" if errorLevel 1 ( exit /b 10 ) echo "unpacked archive" -- GitLab