#!/sbin/sh
#『酷安：@永恒丶叶子』

echo -e "\n恢复模式的Magisk管理器 (mm)
VR25 @ xda-developers
License: GPLv3+
-------------
- 『酷安:@永恒丶叶子』
- 『版本：2.8』
"


# 默认权限
umask 022


#启动入口
main() {
  #不运行xxx，怕你把手机搞坏
  xxx && magisk
  #都说了是核心功能
  opts
}

# 检测是否处于启动模式
xxx() {
  ps | grep zygote | grep -v grep >/dev/null && BOOTMODE=true || BOOTMODE=false
  $BOOTMODE || ps -A 2>/dev/null | grep zygote | grep -v grep >/dev/null && BOOTMODE=true
  $BOOTMODE || id | grep -q 'uid=0' || BOOTMODE=true

  # 在启动模式下运行时退出
  # BOOTMODE=false
  if $BOOTMODE; then
    echo -e "\n- 我知道你想干嘛..."
    echo "- 这是一个坏主意！"
    echo -e "- 只能在恢复模式下运行。\n"
    exit 1
  fi
}

# 检测magisk环境
magisk() {

  mount /data 2>/dev/null || :
  mount /cache 2>/dev/null || :

  if [ ! -d /data/adb/magisk ]; then
    echo -e "(!) 未安装magisk，或者版本不受支持！\n"
    echo -e "不要再问为什么，已经说的很清楚了！"
    exit 1
  fi
  
  mount -o remount,rw /
  mkdir -p $mountPath

  [ -f $img ] && e2fsck -fy $img 2>/dev/null 1>&2 || :
  mount -o rw $img $mountPath
  cd $mountPath
}

# 枚举模块目录名
mount_path() {
  for mod in $( ls -1 $mountPath | grep -v 'lost+found'; ); do
    if [ -e $mod/module.prop ];then
      echo $mod
    fi
  done
}

# 取模块名称
modname() {
  if [ -e $1/module.prop ]; then
    name=$(cat $1/module.prop | grep 'name')
    echo "${name:5}"
  else
    echo "无效名称"
  fi
}


# 主菜单选项
opts() {
  echo
  echo "  1. 启用/禁用 模块"
  echo "  2. 移除(卸载) 模块"
  echo "  3. 查看 模块"
  echo "  4. 切换 magisk核心功能"
  echo "  5. 备份 magisk模块"
  echo "  6. 还原 magisk模块"
  echo "  ---"
  echo "  x. 退出"
  echo "  q. 退出并重启"
  echo
  
  printf "请输入选项："
  read Input
    case "$Input" in
      1 ) is_mods_e;opts;;
      3 ) is_mods_l;opts;;
      2 ) is_mods_u;opts;;
      x ) exxit;;
      4 ) is_mods_r;opts;;
      5 ) is_mods_bf;opts;;
      6 ) is_mods_hy;opts;;
      q ) exitre;;
      * ) opts;;
    esac
}


# 启用\禁用模块
is_mods_e() {
  echo
  echo "  < 启用/禁用 模块>"
  echo
  num=0
  mods=$(mount_path)
  for mod in $mods; do
    num=$( expr $num + 1)
    name=$(modname $mod)
    [ -e $mod/disable ] && qjmk="-禁用-" || qjmk="(启用)"
    printf "  %02d. %s %s (%s)\n" "${num}" "${qjmk}" "${name}" "${mod}"
  done
  printf "  ------\n  xx. 返回\n"
  printf "  qy. 一键启用\n  jy. 一键禁用\n"
  printf "  q. 退出并重启"
  echo
    
  input=0
  mod="0"
  aass=false
  until [ -z "$input" ]; do
    if $aass; then
      printf "%s" "输入回车确定："
    else
      printf "%s" "输入序号进行操作："
    fi
    read input
    
    if [ -z "$input" ]; then
      break
    fi
    
    if [ "$input" = xx ]  || [ "$input" = x ]; then
      echo "已输入 返回"
      return
    fi
    
    if [ "$input" = qy ]; then
      for mod in $(mount_path); do
        if [ -e $mod/disable ]; then
          rm $mod/disable
        fi
      done
      printf "  已全部切换为启用\n"
      printf "输入回车继续"
      read Input
      is_mods_e
      return
    fi
    if [ "$input" = jy ]; then
      for mod in $(mount_path); do
        if [ ! -e $mod/disable ]; then
          touch $mod/disable
        fi
      done
      printf "  已全部切换为禁用\n"
      printf "输入回车继续"
      read Input
      is_mods_e
      return
    fi
    if [ "$input" = q ]; then
       exitre
       return
    fi
    
    if [ "$input" -ge 1 -a "$input" -le $num ]; then
      aass=true
      input=`expr $input \* 1`
      mod=$(echo "$mods" | sed -n ${input}p)
      name=$(modname $mod)
      [ -e $mod/disable ] && qjmk="-禁用-" || qjmk="(启用)"
      printf "  确定操作 %02d. %s %s (%s)\n" "${input}" "${qjmk}" "${name}" "${mod}"
    else
      aass=false
      echo "输入错误，请重试！"
      mod="0"
    fi
  done
  
  if [ $mod = 0 ]; then
    echo "- 输入错误，已终止！"
  else
    name=$(modname $mod)
    if [ -e $mod/disable ]; then
      printf "  已切换 %s %s (%s) ---> %s\n" "-禁用-" "${name}" "${mod}" "(启用)"
      rm $mod/disable
    else
      printf "  已切换 %s %s (%s) ---> %s\n" "(启用)" "${name}" "${mod}" "-禁用-"
      touch $mod/disable
    fi
    printf "输入回车继续"
    read Input
    is_mods_e
  fi
}

# 查看模块
is_mods_l() {
  echo
  echo "  < 查看 模块>"
  echo
  num=0
  mods=$(mount_path)
  for mod in $mods; do
    num=$( expr $num + 1)
    name=$(modname $mod)
    [ -e $mod/disable ] && qjmk="-禁用-" || qjmk="(启用)"
    [ -e $mod/remove ] && ycmk="-移除-" || ycmk="(存在)"
    printf "  %02d. %s %s %s (%s)\n" "${num}" "${qjmk}" "${ycmk}" "${name}" "${mod}"
  done
  echo
  printf "输入回车继续"
  read Input
}

# 移除模块
is_mods_u() {
  echo
  echo "  < 移除(卸载) 模块>"
  echo
  num=0
  mods=$(mount_path)
  for mod in $mods; do
    num=$( expr $num + 1)
    name=$(modname $mod)
    [ -e $mod/remove ] && qjmk="-移除-" || qjmk="(存在)"
    printf "  %02d. %s %s (%s)\n" "${num}" "${qjmk}" "${name}" "${mod}"
  done
  printf "  ------\n  xx. 返回\n"
  echo
  
  input=0
  mod="0"
  aass=false
  until [ -z "$input" ]; do
    if $aass; then
      printf "%s" "输入回车确定："
    else
      printf "%s" "输入序号进行操作："
    fi
    
    read input
    
    if [ -z "$input" ]; then
      break
    fi
    
    if [ "$input" = xx ]  || [ "$input" = x ]; then
      echo "已输入 返回"
      return
    fi
    if [ "$input" -ge 1 -a "$input" -le $num ]; then
      aass=true
      input=`expr $input \* 1`
      mod=$(echo "$mods" | sed -n ${input}p)
      name=$(modname $mod)
      [ -e $mod/remove ] && qjmk="-移除-" || qjmk="(存在)"
      printf "  确定操作 %02d. %s %s (%s)\n" "${input}" "${qjmk}" "${name}" "${mod}"
    else
      aass=false
      echo "输入错误，请重试！"
      mod="0"
    fi
  done
  
  if [ $mod = 0 ]; then
    echo "- 输入错误，已终止！"
  else
    name=$(modname $mod)
    if [ -e $mod/remove ]; then
      printf "  已切换 %s %s (%s) ---> %s\n" "-移除-" "${name}" "${mod}" "(存在)"
      rm $mod/remove
    else
      printf "  已切换 %s %s (%s) ---> %s\n" "(存在)" "${name}" "${mod}" "-移除-"
      touch $mod/remove
    fi
    printf "输入回车继续"
    read Input
    is_mods_u
  fi
}


# 备份\恢复模块路径
bflj=/sdcard/magisk_yezi.tar

# 备份模块
is_mods_bf() { tar -cf $bflj * && echo "备份完成 文件在 $bflj"; }

# 恢复模块
is_mods_hy() {
  if [ -e "$bflj" ]; then
    echo "正在进行还原..."
    # 对需要恢复的原来模块进行删除
    for mod in $( tar -tf $bflj; ); do
      if [ -d "$mod" ]; then
        rm -rf $mod
      fi
    done
    tar -xf $bflj
    echo "还原模块完成"
  else
    echo "还原文件 $bflj 不存在!"
  fi
}

# 切换magisk核心功能
is_mods_r() {
  if [ -f /cache/.disable_magisk ] || [ -f /data/cache/.disable_magisk ]; then
    rm /data/cache/.disable_magisk /cache/.disable_magisk 2>/dev/null || :
    echo "- magisk核心功能模式 (关闭)"
  else
    touch /data/cache/.disable_magisk /cache/.disable_magisk 2>/dev/null || :
    echo "- magisk核心功能模式 (开启)"
  fi
}


# 退出程序
exxit() {
  # 关闭遇到错误停止运行
  set +euo pipefail
  cd /
  umount -f $mountPath
  rmdir $mountPath
  mount -o remount,ro /
  [ "$1" != "1" ] && exec echo -e "----再见。\n" || exit 1
}

#退出并重启
exitre() {
  set +euo pipefail
  cd /
  umount -f $mountPath
  rmdir $mountPath
  mount -o remount,ro /
  reboot
}

mountPath=/_magisk
img=/data/adb/magisk.img
[ -f $img ] || img=/data/adb/modules

# 开启遇到错误停止运行
set -euo pipefail
#开始运行
main