patchlevel.sh 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #!/sbin/sh
  2. SCRIPTNAME="PatchLevel"
  3. LOGFILE=/tmp/recovery.log
  4. TEMPSYS=/s
  5. BUILDPROP=system/build.prop
  6. DEFAULTPROP=prop.default
  7. syspath="/dev/block/by-name/system$(getprop ro.boot.slot_suffix)"
  8. venbin="vendor/bin"
  9. SETFINGERPRINT=true
  10. log_info() {
  11. echo "I:$SCRIPTNAME:$1" >> "$LOGFILE"
  12. }
  13. log_error() {
  14. echo "E:$SCRIPTNAME:$1" >> "$LOGFILE"
  15. }
  16. temp_mount() {
  17. mkdir "$1"
  18. if [ -d "$1" ]; then
  19. log_info "Temporary $2 folder created at $1."
  20. else
  21. log_error "Unable to create temporary $2 folder."
  22. finish_error
  23. fi
  24. mount -t ext4 -o ro "$3" "$1"
  25. if [ -n "$(ls -A "$1" 2>/dev/null)" ]; then
  26. log_info "$2 mounted at $1."
  27. else
  28. log_error "Unable to mount $2 to temporary folder."
  29. finish_error
  30. fi
  31. }
  32. relink() {
  33. log_info "Looking for $1 to update linker path..."
  34. if [ -f "$1" ]; then
  35. fname=$(basename "$1")
  36. target="/sbin/$fname"
  37. log_info "File found! Relinking $1 to $target..."
  38. sed 's|/system/bin/linker|///////sbin/linker|' "$1" > "$target"
  39. chmod 755 "$target"
  40. else
  41. log_info "File not found. Proceeding without relinking..."
  42. fi
  43. }
  44. finish() {
  45. umount "$TEMPSYS"
  46. rmdir "$TEMPSYS"
  47. touch /sbin/patchlevel_set
  48. log_info "Script complete. Device ready for decryption."
  49. exit 0
  50. }
  51. finish_error() {
  52. umount "$TEMPSYS"
  53. rmdir "$TEMPSYS"
  54. log_error "Script run incomplete. Device not ready for decryption."
  55. exit 0
  56. }
  57. osver_orig=$(getprop ro.build.version.release_orig)
  58. patchlevel_orig=$(getprop ro.build.version.security_patch_orig)
  59. osver=$(getprop ro.build.version.release)
  60. patchlevel=$(getprop ro.build.version.security_patch)
  61. device=$(getprop ro.product.device)
  62. fingerprint=$(getprop ro.build.fingerprint)
  63. product=$(getprop ro.build.product)
  64. log_info "Running patchlevel pre-decrypt script for TWRP..."
  65. for file in $(find $venbin -type f); do
  66. relink "$file"
  67. done
  68. temp_mount "$TEMPSYS" "system" "$syspath"
  69. if [ -f "$TEMPSYS/$BUILDPROP" ]; then
  70. log_info "Current system is Oreo or above. Proceed with setting OS version and security patch level..."
  71. log_info "Build.prop exists! Setting system properties from build.prop"
  72. log_info "Current OS version: $osver"
  73. osver=$(grep -i 'ro.build.version.release' "$TEMPSYS/$BUILDPROP" | cut -f2 -d'=' -s)
  74. if [ -n "$osver" ]; then
  75. resetprop ro.build.version.release "$osver"
  76. sed -i "s/ro.build.version.release=.*/ro.build.version.release=""$osver""/g" "/$DEFAULTPROP" ;
  77. log_info "New OS Version: $osver"
  78. fi
  79. log_info "Current security patch level: $patchlevel"
  80. patchlevel=$(grep -i 'ro.build.version.security_patch' "$TEMPSYS/$BUILDPROP" | cut -f2 -d'=' -s)
  81. if [ -n "$patchlevel" ]; then
  82. resetprop ro.build.version.security_patch "$patchlevel"
  83. sed -i "s/ro.build.version.security_patch=.*/ro.build.version.security_patch=""$patchlevel""/g" "/$DEFAULTPROP" ;
  84. log_info "New security patch level: $patchlevel"
  85. fi
  86. # Only needed for some devices (for stock OTA capability), so set "SETFINGERPRINT" variable to "false" if your device isn't one of them
  87. if [ "$SETFINGERPRINT" = "true" ]; then
  88. log_info "Current fingerprint: $fingerprint"
  89. fingerprint=$(grep -i 'ro.build.fingerprint' "$TEMPSYS/$BUILDPROP" | cut -f2 -d'=' -s)
  90. if [ -n "$fingerprint" ]; then
  91. resetprop ro.build.fingerprint "$fingerprint"
  92. sed -i "s/ro.build.fingerprint=.*/ro.build.fingerprint=""$fingerprint""/g" "/$DEFAULTPROP" ;
  93. log_info "New fingerprint: $fingerprint"
  94. fi
  95. fi
  96. else
  97. if [ -n "$osver_orig" ]; then
  98. log_info "Original OS version: $osver_orig"
  99. log_info "Current OS version: $osver"
  100. log_info "Setting OS Version to $osver_orig"
  101. osver=$osver_orig
  102. resetprop ro.build.version.release "$osver"
  103. sed -i "s/ro.build.version.release=.*/ro.build.version.release=""$osver""/g" "/$DEFAULTPROP" ;
  104. else
  105. log_info "No Original OS Version found. Proceeding with existing value."
  106. log_info "Current OS version: $osver"
  107. fi
  108. if [ -n "$patchlevel_orig" ]; then
  109. log_info "Original security patch level: $patchlevel_orig"
  110. log_info "Current security patch level: $patchlevel"
  111. log_info "Setting security patch level to $patchlevel_orig"
  112. patchlevel=$patchlevel_orig
  113. resetprop ro.build.version.security_patch "$patchlevel"
  114. sed -i "s/ro.build.version.security_patch=.*/ro.build.version.security_patch=""$patchlevel""/g" "/$DEFAULTPROP" ;
  115. else
  116. log_info "No Original security patch level found. Proceeding with existing value."
  117. log_info "Current security patch level: $patchlevel"
  118. fi
  119. fi
  120. finish