import { fullScreen, exec, toast } from './kernelsu.js' import { setNewLanguage, getTranslations } from './language.js' export function setError(place, issue) { const fullErrorLog = setErrorData(`${place}: ${issue}`) document.getElementById('errorh_panel').innerHTML = fullErrorLog toast(`${place}: ${issue}`) } export function setLangData(mode) { localStorage.setItem('/system/language', mode) return localStorage.getItem('/system/language') } export function setErrorData(errorLog) { const getPrevious = localStorage.getItem('/system/error') const finalLog = getPrevious && getPrevious.length !== 0 ? getPrevious + `\n` + errorLog : errorLog localStorage.setItem('/system/error', finalLog) return finalLog } (async () => { const EXPECTED = 1 const UNEXPECTED_FAIL = 2 fullScreen(true) let sys_lang = localStorage.getItem('/system/language') if (!sys_lang) sys_lang = setLangData('en_US') if (sys_lang !== 'en_US') await setNewLanguage(sys_lang, true) const translations = await getTranslations(sys_lang) const loading_screen = document.getElementById('loading_screen') const rootCss = document.querySelector(':root') const rezygisk_state = document.getElementById('rezygisk_state') const rezygisk_icon_state = document.getElementById('rezygisk_icon_state') const code_version = document.getElementById('version_code') const root_impl = document.getElementById('root_impl') const zygote64_div = document.getElementById('zygote64') const zygote32_div = document.getElementById('zygote32') const daemon64_div = document.getElementById('daemon64') const daemon32_div = document.getElementById('daemon32') const zygote32_status_div = document.getElementById('zygote32_status') const zygote64_status_div = document.getElementById('zygote64_status') const modules_32 = [] const modules_64 = [] let zygote64_status = EXPECTED let zygote32_status = EXPECTED const ptrace64Cmd = await exec('/data/adb/modules/zygisksu/bin/zygisk-ptrace64 info') if (ptrace64Cmd.errno === 0) { const [ version_line, _, process_line, daemon_running_or_root_impl_line, daemon_running_line, module_amount_line ] = ptrace64Cmd.stdout.split('\n') let modules_amount = module_amount_line.split(': ')[1] /* INFO: Root implementation and ReZygisk version parsing */ if (daemon_running_line) { code_version.innerHTML = version_line.split('Tracer ')[1].split('-')[0] root_impl.innerHTML = daemon_running_or_root_impl_line.split(': ')[1] if (daemon_running_line.split(': ')[1] === 'yes') { zygote64_status_div.innerHTML = translations.page.home.info.zygote.injected } else { zygote64_status_div.innerHTML = translations.page.home.info.zygote.notInjected zygote64_status = UNEXPECTED_FAIL } } else { zygote64_status_div.innerHTML = translations.page.home.info.zygote.notInjected zygote64_status = UNEXPECTED_FAIL } const lines = ptrace64Cmd.stdout.split('\n') if (modules_amount !== 'N/A') { modules_amount = parseInt(modules_amount) for (let i = 0; i < modules_amount; i++) { const module = lines[6 + i].split(' - ')[1] modules_32.push(module) } document.getElementById('modules_list_not_avaliable').style.display = 'none' } } else if (ptrace64Cmd.stderr.includes('cannot execute binary file: Exec format error')) { zygote64_div.style.display = 'none' daemon64_div.style.display = 'none' } else { setError('ptrace64', `Error while executing zygisk-ptrace64 (${ptrace64Cmd.errno}): ${ptrace64Cmd.stderr}`) zygote64_status = UNEXPECTED_FAIL } const ptrace32Cmd = await exec('/data/adb/modules/zygisksu/bin/zygisk-ptrace32 info') if (ptrace32Cmd.errno === 0) { const [ version_line, _, process_line, daemon_running_or_root_impl_line, daemon_running_line, module_amount_line ] = ptrace32Cmd.stdout.split('\n') let modules_amount = module_amount_line.split(': ')[1] /* INFO: Root implementation and ReZygisk version parsing -- Necessary if 64-bit fails */ if (daemon_running_line) { code_version.innerHTML = version_line.split('Tracer ')[1].split('-')[0] root_impl.innerHTML = daemon_running_or_root_impl_line.split(': ')[1] if (daemon_running_line.split(': ')[1] === 'yes') { zygote32_status_div.innerHTML = translations.page.home.info.zygote.injected } else { zygote32_status_div.innerHTML = translations.page.home.info.zygote.notInjected zygote32_status = UNEXPECTED_FAIL } } else { zygote32_status_div.innerHTML = translations.page.home.info.zygote.notInjected zygote32_status = UNEXPECTED_FAIL } const lines = ptrace32Cmd.stdout.split('\n') if (modules_amount !== 'N/A') { modules_amount = parseInt(modules_amount) for (let i = 0; i < modules_amount; i++) { const module = lines[6 + i].split(' - ')[1] modules_64.push(module) } document.getElementById('modules_list_not_avaliable').style.display = 'none' } } else if (ptrace32Cmd.stderr.includes('not executable: 32-bit ELF file')) { zygote32_div.style.display = 'none' daemon32_div.style.display = 'none' } else { setError('ptrace32', `Error while executing zygisk-ptrace32 (${ptrace32Cmd.errno}): ${ptrace32Cmd.stderr}`) zygote32_status = UNEXPECTED_FAIL } if (zygote32_status === EXPECTED && zygote64_status === EXPECTED) { rezygisk_state.innerHTML = translations.page.home.status.ok rootCss.style.setProperty('--bright', '#3a4857') rezygisk_icon_state.innerHTML = '' } else if (zygote64_status === EXPECTED ^ zygote32_status.innerHTML === EXPECTED) { rezygisk_state.innerHTML = translations.page.home.status.partially rootCss.style.setProperty('--bright', '#766000') rezygisk_icon_state.innerHTML = '' } else { rezygisk_state.innerHTML = translations.page.home.status.notWorking } const modules_64_32 = [] modules_64.forEach((module) => modules_64_32.push({ name: module, bitsUsed: [ '64 bit' ] })) modules_32.forEach((module) => { const module_index = modules_64_32.findIndex((module_64_32) => module_64_32.name === module) if (module_index !== -1) modules_64_32[module_index].bitsUsed.push('32 bit') else modules_64_32.push({ name: module, bitsUsed: [ '32 bit' ] }) }) const modules_list = document.getElementById('modules_list') /* INFO: This hides the throbber screen */ loading_screen.style.display = 'none' modules_64_32.forEach((module) => { modules_list.innerHTML += `
${module.name}
${translations.page.modules.arch}
${module.bitsUsed.join(' / ')}
` }) })().catch((err) => setError('WebUI', err.stack ? err.stack : err.message))