Skip to content

Firmware dumper

Firmware dumper #3791

Workflow file for this run

name: Firmware dumper
on:
workflow_dispatch:
schedule:
- cron: "0 */12 * * *"
push:
jobs:
update:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- model: "SM-N985F"
region: "XSG"
imei: "352682501234560"
steps:
- name: Checkout repo
uses: actions/checkout@master
with:
submodules: true
- name: Compare latest version with current version
id: check
run: |
need_update=0
latest=`curl --retry 5 --retry-delay 5 http://fota-cloud-dn.ospserver.net/firmware/${{ matrix.region }}/${{ matrix.model }}/version.xml | grep latest | sed 's/^[^>]*>//' | sed 's/<.*//'`
latest_short=`echo $latest | cut -d'/' -f1`
current=`cat index/${{ matrix.model }}.${{ matrix.region }}` || need_update=1
[[ $latest != $current ]] && need_update=1
echo "latest_version=$latest" >> $GITHUB_ENV
echo "latest_shortversion=$latest_short" >> $GITHUB_ENV
echo "need_update=$need_update" >> $GITHUB_ENV
- name: Print available space
if: env.need_update == 1
run: |
sudo df -h
- name: Install dependencies
if: env.need_update == 1
run: |
sudo apt-get update
sudo apt-get remove --purge -y "php*" "dotnet*" "mysql*" "nodejs*" "clang*" "google*"
sudo apt-get autoremove -y
sudo apt-get clean
sudo rm -rf /usr/local
sudo apt-get install -y liblz4-tool zip simg2img
sudo wget -O /usr/bin/samfirm https://github.com/ananjaser1211/SamFirm.NET/releases/latest/download/linux-x64 && sudo chmod +x /usr/bin/samfirm
sudo wget -O /usr/bin/lpunpack https://corsica.nu/lpunpack && sudo chmod +x /usr/bin/lpunpack
sudo wget -O /usr/bin/extract-ikconfig https://corsica.nu/extract-ikconfig && sudo chmod +x /usr/bin/extract-ikconfig
sudo wget -O /usr/bin/omc-decoder.jar http://corsica.nu/omc-decoder.jar && sudo chmod +x /usr/bin/omc-decoder.jar
- name: Fetch firmware
if: env.need_update == 1
run: samfirm -m ${{ matrix.model }} -r ${{ matrix.region }} -i ${{ matrix.imei }}
- name: Print directory structure
if: env.need_update == 1
run: ls -la ${{ matrix.model }}_${{ matrix.region }}
- name: Get path of files
if: env.need_update == 1
id: files
run: |
echo "ap=`find -name AP*`" >> $GITHUB_ENV
echo "bl=`find -name BL*`" >> $GITHUB_ENV
echo "cp=`find -name CP*`" >> $GITHUB_ENV
echo "csc=`find -name CSC*`" >> $GITHUB_ENV
- name: Extract images from AP and create zip
if: env.need_update == 1
id: releases
run: |
target_version=${{ env.latest_shortversion }}
basedir=$(pwd)
releasedir=$basedir/$target_version
mkdir -p $releasedir csc
zip -r $releasedir/$target_version-blcp.zip ${{ env.bl }} ${{ env.cp }}
parts=(optics product)
for i in ${parts[@]}; do [[ `tar tvf ${{ env.csc }} | grep $i` ]] && tar xvf ${{ env.csc }} $(echo `tar tvf ${{ env.csc }} | grep $i | awk -F " " '{print $NF}'`); done
for i in `ls | grep lz4`; do lz4 -dm $i ; rm -rf $i; done
for i in `ls | grep img`; do simg2img $i raw_$i ; rm -rf $i; mv raw_$i $i; done
[[ -e optics.img.ext4 ]] && mv optics.img.ext4 optics.img
[[ -e product.img.ext4 ]] && mv product.img.ext4 product.img
if [[ -e optics.img ]]; then sudo mkdir -p optics; sudo mount -o loop,rw,sync optics.img optics; sudo cp -r optics/* csc; sudo umount optics; elif [[ -e product.img ]]; then sudo mkdir -p product; sudo mount -o loop,rw,sync product.img product; sudo cp -r product/* csc; sudo umount product; else sudo cp ${{ env.csc }} csc; fi
sudo find csc -type d -exec chmod 755 {} \;
sudo find csc -type f -exec chmod 644 {} \;
sudo rm -rf csc/HWRDB csc/sipdb `find csc -type f -name *apk`;
sudo java -jar /usr/bin/omc-decoder.jar -i csc -o csc;
zip -r $releasedir/$target_version-csc.zip csc/*;
sudo rm -rf *.img csc
parts=(boot recovery)
for i in ${parts[@]}; do [[ `tar tvf ${{ env.ap }} | grep $i` ]] && tar xvf ${{ env.ap }} $(echo `tar tvf ${{ env.ap }} | grep $i | awk -F " " '{print $NF}'`); done
for i in `ls | grep lz4`; do lz4 -dm $i ; rm -rf $i; done
extract-ikconfig boot.img > $releasedir/$target_version-boot.img_defconfig || echo "# Dummy file to keep workflow alive" > $releasedir/$target_version-boot.img_defconfig;
zip -r $releasedir/$target_version-bootrecovery.zip *.img
rm -rf *.img
mkdir -p fota && echo "# Dummy file to keep workflow alive" > $releasedir/$target_version-dummy;
tar xvf ${{ env.ap }} meta-data/fota.zip --strip-components=1
[[ -e fota.zip ]] && unzip -P fotatest1234 fota.zip -d fota && rm -rf fota/OTA fota/BOOT/kernel fota/RECOVERY/kernel
zip -r $releasedir/$target_version-fota.zip fota
parts=(super system vendor)
for i in ${parts[@]}; do [[ `tar tvf ${{ env.ap }} | grep $i` ]] && tar xvf ${{ env.ap }} $(echo `tar tvf ${{ env.ap }} | grep $i | awk -F " " '{print $NF}'`); done
rm -rf *.tar.md5 *boot* *vbmeta*
for i in `ls | grep lz4`; do lz4 -dm $i ; rm -rf $i; done
for i in `ls | grep img`; do simg2img $i raw_$i ; rm -rf $i; mv raw_$i $i; done
[[ -e super.img ]] && lpunpack --partition=vendor --partition=system super.img && rm -rf super.img
[[ -e system.img.ext4 ]] && mv system.img.ext4 system.img
[[ -e vendor.img.ext4 ]] && mv vendor.img.ext4 vendor.img
[[ -e system.img ]] && sudo mkdir -p system && sudo mount -o loop,rw,sync system.img system && sudo find system -type l -ls | awk '{print $11" "$12" "$13}' | sort > $releasedir/symlinks_system.txt && for i in `sudo find system -not -type l`;do echo -n $(stat -c '%n %C' "$i");if [ -d "$i" ];then echo -n " dir ";else echo -n " file ";fi; echo ""; done | sort > $releasedir/metadata_system.txt && sudo find system -type d -exec sudo chmod 0755 {} \; && sudo find system -type f -exec sudo chmod 0644 {} \;
[[ -e vendor.img ]] && sudo mkdir -p vendor && sudo mount -o loop,rw,sync vendor.img vendor && sudo find vendor -type l -ls | awk '{print $11" "$12" "$13}' | sort > $releasedir/symlinks_vendor.txt && for i in `sudo find vendor -not -type l`;do echo -n $(stat -c '%n %C' "$i");if [ -d "$i" ];then echo -n " dir ";else echo -n " file ";fi; echo ""; done | sort > $releasedir/metadata_vendor.txt && sudo find vendor -type d -exec sudo chmod 0755 {} \; && sudo find vendor -type f -exec sudo chmod 0644 {} \;
misc=(build.prop default.prop floating_feature.xml)
for i in ${misc[@]}; do cat `find vendor -name $i` > $releasedir/vendor-$i; done
misc=(DynamicLockscreen.apk SamsungCamera.apk SmartWidget.apk SecSettings.apk SystemUI.apk framework-res.apk framework.jar services.jar wifi-service.jar telephony-common.jar build.prop floating_feature.xml)
for i in ${misc[@]}; do cat `find system -name $i` > $releasedir/$i; done
[[ -s system/system/build.prop ]] && cd system/system && zip -r $releasedir/$target_version-lib.zip lib* && zip -r $releasedir/$target_version-etc.zip etc && zip -r $releasedir/$target_version-cameradata.zip cameradata && cd $basedir || cd system && zip -r $releasedir/$target_version-lib.zip lib* && zip -r $releasedir/$target_version-etc.zip etc && zip -r $releasedir/$target_version-cameradata.zip cameradata && cd $basedir
if [[ -d vendor ]]; then cd vendor; zip -r $releasedir/$target_version-vendor.zip *; cd $basedir; else cd system/vendor; zip -r $releasedir/$target_version-vendor.zip *; cd $basedir;fi
cd $releasedir && zip -r $target_version-app_frame.zip *apk *jar && zip -r $target_version-txt.zip *.txt *.xml *.prop *defconfig && cd $basedir
props=(ro.build.PDA= ro.build.changelist= ro.build.display.id= ro.build.id= ro.build.version.release= ro.build.version.release_or_codename= ro.build.version.security_patch= ro.build.version.sdk= ro.system.build.fingerprint= ro.build.description= ro.build.version.base_os= ro.vendor.build.id= ro.vendor.build.security_patch= ro.vendor.build.fingerprint= ro.vendor.build.version.release_or_codename= ro.vendor.build.version.sdk= ro.vndk.version= ro.hardware.chipname= ro.product.board= ro.board.platform= ro.security.keystore.keytype= ro.boot.dynamic_partitions= ro.product.first_api_level= ro.build.characteristics= ro.netflix.bsp_rev=)
for file in $releasedir/*.prop; do for prop in ${props[@]}; do echo $(grep $prop $file) >> version.txt; sed -i ':a;N;$!ba;s/\n\n/\n/g' version.txt; done; done
sudo umount system && sudo umount vendor && rm -rf *img
echo "folder=$releasedir" >> $GITHUB_ENV
- name: Generate commit tag
id: tag
run: |
name=$(date +'%Y%m%d%H%M%S')
echo "name=$name" >> $GITHUB_ENV
- name: Update current version
if: env.need_update == 1
run: |
git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com"
git config --local user.name "github-actions[bot]"
git pull origin ${{github.ref}} --ff-only
echo ${{ env.latest_version }} > index/${{ matrix.model }}.${{ matrix.region }}
git add index/${{ matrix.model }}.${{ matrix.region }}
git commit -m "${{ matrix.model }}/${{ matrix.region }}: ${{ env.latest_version }}"
git tag ${{ env.name }}
- name: Push changes to repo
if: env.need_update == 1
uses: ad-m/github-push-action@master
with:
tags: true
github_token: ${{ secrets.TOKEN }}
- name: Upload release assets
if: env.need_update == 1
uses: softprops/action-gh-release@master
env:
GITHUB_TOKEN: ${{ secrets.TOKEN }}
with:
body_path: version.txt
tag_name: ${{ env.name }}
name: "${{ env.latest_shortversion }} - ${{ matrix.model }} - ${{ matrix.region }}"
files: |
${{ env.folder }}/${{ env.latest_shortversion }}-etc.zip
${{ env.folder }}/${{ env.latest_shortversion }}-lib.zip
${{ env.folder }}/${{ env.latest_shortversion }}-txt.zip
${{ env.folder }}/${{ env.latest_shortversion }}-app_frame.zip
${{ env.folder }}/${{ env.latest_shortversion }}-cameradata.zip
${{ env.folder }}/${{ env.latest_shortversion }}-blcp.zip
${{ env.folder }}/${{ env.latest_shortversion }}-vendor.zip
${{ env.folder }}/${{ env.latest_shortversion }}-bootrecovery.zip
${{ env.folder }}/${{ env.latest_shortversion }}-fota.zip
${{ env.folder }}/${{ env.latest_shortversion }}-csc.zip