This commit is contained in:
karl.hudgell 2020-08-28 09:22:57 +01:00
commit 3658fd26aa
12 changed files with 174 additions and 69 deletions

3
.gitignore vendored

@ -4,4 +4,5 @@ data/apps/*.apk
release/ release/
data/*.log data/*.log
logger.lock logger.lock
logger.lock null.log
.gitignore

2
app.js

@ -1,3 +1,3 @@
const pages = require('./pages/pages') const pages = require('./pages/pages')
pages.mainMenu(); pages.connectWatch();

@ -1,22 +1,22 @@
echo What is build number && \ echo What is build number && \
read buildNum && \ read buildNum && \
pkg package.json && \ pkg package.json && \
mv miwatchkleaner2-* ./release && \ mv miwatchkleaner-* ./release && \
mv ./release/miwatchkleaner2-win-* ./release/Windows && \ mv ./release/miwatchkleaner-win-* ./release/Windows && \
mv ./release/miwatchkleaner2-linux-* ./release/Linux && \ mv ./release/miwatchkleaner-linux-* ./release/Linux && \
mv ./release/miwatchkleaner2-macos-* ./release/MacOs && \ mv ./release/miwatchkleaner-macos-* ./release/MacOs && \
cp ./data/xiaomiPackageRemovalList.json ./release/Windows/data/ && \ cp ./data/xiaomiPackageRemovalList.json ./release/Windows/data/ && \
cp ./data/xiaomiPackageRemovalList.json ./release/MacOS/data/ && \ cp ./data/xiaomiPackageRemovalList.json ./release/MacOS/data/ && \
cp ./data/xiaomiPackageRemovalList.json ./release/Linux/data/ && \ cp ./data/xiaomiPackageRemovalList.json ./release/Linux/data/ && \
chmod 0777 ./release/**/adb && \ chmod 0777 ./release/**/adb && \
chmod 0777 ./release/**/miwatchkleaner2-* && \ chmod 0777 ./release/**/miwatchkleaner-* && \
chmod +x ./release/**/adb && \ chmod +x ./release/**/adb && \
chmod +x ./release/**/miwatchkleaner2-* && \ chmod +x ./release/**/miwatchkleaner-* && \
cd release/MacOS/ && \ cd release/MacOS/ && \
tar -pcvzf miwatchkleaner.$buildNum-macos.tar.gz adb data/ miwatchkleaner2-macos-x64 && \ tar -pcvzf miwatchkleaner.$buildNum-macos.tar.gz adb data/ my_apk/ miwatchkleaner-macos-x64 && \
cd .. && \ cd .. && \
cd Linux/ && \ cd Linux/ && \
tar -pcvzf miwatchkleaner.$buildNum-Linux.tar.gz adb data/ miwatchkleaner2-linux-x64 && \ tar -pcvzf miwatchkleaner.$buildNum-Linux.tar.gz adb data/ my_apk/ miwatchkleaner-linux-x64 && \
cd .. && \ cd .. && \
cd Windows/ && \ cd Windows/ && \
zip -r miwatchkleaner.$buildNum-win.zip adb.exe AdbWinApi.dll AdbWinUsbApi.dll data/ miwatchkleaner2-win-x86.exe zip -r miwatchkleaner.$buildNum-win.zip adb.exe AdbWinApi.dll AdbWinUsbApi.dll data/ my_apk/ miwatchkleaner-win-x86.exe

@ -1 +0,0 @@
{"ipAddress":""}

@ -4,7 +4,9 @@ const figlet = require('figlet');
const fs = require('fs') const fs = require('fs')
var pjson = require('../package.json'); var pjson = require('../package.json');
const fetch = require('node-fetch'); const fetch = require('node-fetch');
var shell = require('shelljs');
const globalVariables = require('../lib/globalVars');
module.exports = { module.exports = {
header: (page) => { header: (page) => {
@ -25,18 +27,21 @@ module.exports = {
) )
) )
console.log(chalk.blue(page)) console.log(chalk.blue(page))
module.exports.ipCheck() module.exports.connectionCheck()
console.log(chalk.red('----------')) console.log(chalk.red('----------'))
}, },
pause: async (time) => { pause: async (time) => {
await new Promise(resolve => setTimeout(resolve, time)); await new Promise(resolve => setTimeout(resolve, time));
}, },
ipCheck: async () => { connectionCheck: async () => {
const miwatchData = JSON.parse(fs.readFileSync('./data/MiWatch.json', 'utf8')); if (globalVariables.localUSB === "X") {
if (miwatchData.ipAddress === "") { console.log(chalk.white('MiWatch: ') + chalk.green('Connected via USB'))
console.log(chalk.white('MiWatch IP: ') + chalk.red('Not Connected')) }
} else { if (globalVariables.miWatchIpaddress != "") {
console.log(chalk.white('MiWatch IP: ' + chalk.green(miwatchData.ipAddress))) console.log(chalk.white('MiWatch: ') + chalk.green('Connected via Wifi - ' + chalk.white(globalVariables.miWatchIpaddress)))
}
if (globalVariables.localUSB === "" && globalVariables.miWatchIpaddress === "") {
console.log(chalk.white('MiWatch: ') + chalk.red('Not Connected'))
} }
}, },
downloadFile: async (url, path) => { downloadFile: async (url, path) => {
@ -58,4 +63,7 @@ module.exports = {
.then(res => res.json()) .then(res => res.json())
return response return response
}, },
clearApkFolder: async () => {
await shell.rm('-rf', './data/apps/*.apk');
},
} }

@ -1,5 +1,7 @@
const fs = require('fs'); const fs = require('fs');
const path = require('path'); const path = require('path');
const tiny = require("@peterpanhihi/tiny");
const { resolve } = require('path');
module.exports = { module.exports = {
getCurrentDirectoryBase: () => { getCurrentDirectoryBase: () => {
@ -14,7 +16,7 @@ module.exports = {
ipAddress: value ipAddress: value
} }
try { try {
fs.writeFileSync('./data/MiWatch.json', JSON.stringify(data)) fs.writeFileSync('./data/options.json', JSON.stringify(data))
} catch (err) { } catch (err) {
console.log(err) console.log(err)
} }
@ -27,4 +29,15 @@ module.exports = {
console.log(err) console.log(err)
} }
}, },
renameLocalApk: async (apkList) => {
return new Promise(function (resolve, reject) {
for (let e of apkList) {
a = tiny(e)
fs.rename(e, a, function (err) {
if (err) console.log('ERROR: ' + err);
});
}
resolve(x / y);
}).catch(err => NaN)
}
} }

7
lib/globalVars.js Normal file

@ -0,0 +1,7 @@
class globalVariables {
localUSB = "";
miWatchIpaddress = "";
usersList=[];
}
module.exports = new globalVariables();

@ -11,13 +11,14 @@ module.exports = {
name: "mainMenu", name: "mainMenu",
message: "What do you want to do?", message: "What do you want to do?",
choices: [ choices: [
"Connect to MiWatch via Wifi", // "Connect to MiWatch",
"1-Click Karl0ss Klean", "1-Click Karl0ss Klean",
"Remove Xiaomi Apps", "Remove Xiaomi Apps",
"Restore Xiaomi Apps", "Restore Xiaomi Apps",
"Install Compatible Apps", "Install Compatible Apps",
"Remove Installed Apps",
"Restore ANY app", "Restore ANY app",
"Batch Install APKs",
"Batch Remove Installed Apps",
"Quit" "Quit"
], ],
filter: function (val) { filter: function (val) {
@ -26,6 +27,21 @@ module.exports = {
}, ]; }, ];
return inquirer.prompt(questions); return inquirer.prompt(questions);
}, },
connectionType: () => {
const questions = [{
type: "list",
name: "connection",
message: "How do you want to connect?",
choices: [
"USB",
"Wifi"
],
filter: function (val) {
return val.toLowerCase();
},
}, ];
return inquirer.prompt(questions);
},
connectWifi: () => { connectWifi: () => {
const questions = [{ const questions = [{
type: "input", type: "input",

0
my_apk/.gitkeep Normal file

30
package-lock.json generated

@ -1,6 +1,6 @@
{ {
"name": "miwatchkleaner2.0", "name": "miwatchkleaner",
"version": "2.0.8", "version": "3.0.0",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
@ -40,6 +40,11 @@
"fastq": "^1.6.0" "fastq": "^1.6.0"
} }
}, },
"@peterpanhihi/tiny": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@peterpanhihi/tiny/-/tiny-2.0.0.tgz",
"integrity": "sha512-usAoksj49559JLAsQXmrE5wOV6A055icErp8jpJDCicfojwEVPaSLk5EZ1EXhcgIuqjSNkzCOXu0gSdm3Std+w=="
},
"@types/color-name": { "@types/color-name": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
@ -249,6 +254,14 @@
"assert-plus": "^1.0.0" "assert-plus": "^1.0.0"
} }
}, },
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
},
"deep-is": { "deep-is": {
"version": "0.1.3", "version": "0.1.3",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
@ -867,6 +880,11 @@
"minimist": "^1.2.5" "minimist": "^1.2.5"
} }
}, },
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"multistream": { "multistream": {
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/multistream/-/multistream-2.1.1.tgz", "resolved": "https://registry.npmjs.org/multistream/-/multistream-2.1.1.tgz",
@ -1082,6 +1100,14 @@
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
"integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew=="
}, },
"rename": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/rename/-/rename-1.0.4.tgz",
"integrity": "sha1-oPJQePpBleZQ9zBQx8Esz2ifQws=",
"requires": {
"debug": "^2.5.2"
}
},
"request": { "request": {
"version": "2.88.2", "version": "2.88.2",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",

@ -1,6 +1,6 @@
{ {
"name": "miwatchkleaner2.0", "name": "miwatchkleaner",
"version": "2.0.10", "version": "3.0.0",
"description": "MiWatch Cleaning Tool", "description": "MiWatch Cleaning Tool",
"main": "app.js", "main": "app.js",
"bin": "app.js", "bin": "app.js",
@ -15,6 +15,7 @@
"author": "Karl Hudgell", "author": "Karl Hudgell",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@peterpanhihi/tiny": "^2.0.0",
"chalk": "^4.0.0", "chalk": "^4.0.0",
"clear": "^0.1.0", "clear": "^0.1.0",
"clui": "^0.3.6", "clui": "^0.3.6",

@ -3,12 +3,17 @@ const common = require('../lib/common');
const inquirer = require('../lib/inquirer'); const inquirer = require('../lib/inquirer');
const shellExec = require('shell-exec') const shellExec = require('shell-exec')
const files = require('../lib/files') const files = require('../lib/files')
const fs = require('fs')
const getFilesIn = require('get-files-in') const getFilesIn = require('get-files-in')
var shell = require('shelljs');
let logger = require('perfect-logger'); let logger = require('perfect-logger');
const globalVariables = require('../lib/globalVars');
let adbRun
logger.info(process.platform + " detected")
if (process.platform === 'win32' || process.platform === 'win64') {
adbRun = 'adb'
} else {
adbRun = './adb'
}
logger.initialize('RunTIme', { logger.initialize('RunTIme', {
logLevelFile: 0, // Log level for file logLevelFile: 0, // Log level for file
@ -68,7 +73,7 @@ module.exports = {
const compatibleApps = await common.getCompatibleAppsList() const compatibleApps = await common.getCompatibleAppsList()
const value = await inquirer.compatibleApps(); const value = await inquirer.compatibleApps();
await shell.rm('-rf', './data/apps/*.apk'); await common.clearApkFolder()
for (let element of value.removeAppsList) { for (let element of value.removeAppsList) {
for (let element2 of compatibleApps) { for (let element2 of compatibleApps) {
@ -162,31 +167,34 @@ module.exports = {
logger.info("Restore Apps Complete") logger.info("Restore Apps Complete")
module.exports.mainMenu() module.exports.mainMenu()
}, },
connectWifi: async () => { connectWatch: async () => {
logger.info("Connect Wifi") logger.info("Connect to watch")
const miwatchData = JSON.parse(fs.readFileSync('./data/MiWatch.json', 'utf8')); common.header('Connect to watch')
common.header('Connect Wifi') const value = await inquirer.connectionType()
if (miwatchData.ipAddress !== "") { if (value.connection === "usb") {
await shellExec(adbRun + ' kill-server') await shellExec(adbRun + ' kill-server').then(async function (result) {
console.log('Trying to connect with stored ipAddress') logger.info('Restarting ADB')
shellExec(adbRun + ' connect ' + miwatchData.ipAddress).then(async function (result) { logger.info(result.stdout)
logger.info("Connect Wifi Result " + result.stdout) })
if (result.stdout.includes('already connected') || result.stdout.includes('connected to ')) { await shellExec(adbRun + ' devices').then(async function (result) {
console.log(chalk.green('MiWatch Connected')) console.log(result.stdout)
if (result.stdout.includes('device', 15)) {
console.log(chalk.green('MiWatch Connected via USB'))
await common.pause(3000) await common.pause(3000)
logger.info("Connect Wifi Complete") logger.info("MiWatch connected")
globalVariables.localUSB = "X"
module.exports.mainMenu() module.exports.mainMenu()
} else { } else {
console.log(chalk.red('MiWatch not found')) console.log(chalk.red('MiWatch not found'))
logger.info("MiWatch not found")
await common.pause(2000) await common.pause(2000)
files.writeIpAddress('')
console.log(chalk.white('Try Again')) console.log(chalk.white('Try Again'))
await common.pause(1000) await common.pause(1000)
module.exports.connectWifi() module.exports.connectWatch()
} }
}).catch() })
} else { }
await shellExec(adbRun + ' kill-server') if (value.connection === "wifi") {
const value = await inquirer.connectWifi(); const value = await inquirer.connectWifi();
await shellExec(adbRun + ' kill-server').then(async function (result) { await shellExec(adbRun + ' kill-server').then(async function (result) {
logger.info('Restarting ADB') logger.info('Restarting ADB')
@ -204,8 +212,10 @@ module.exports = {
} else { } else {
if (result.stdout.includes('failed to authenticate')) { if (result.stdout.includes('failed to authenticate')) {
console.log(chalk.redBright('MiWatch not authenticated')) console.log(chalk.redBright('MiWatch not authenticated'))
logger.info('MiWatch not authenticated')
} else { } else {
console.log(chalk.red('MiWatch not found')) console.log(chalk.red(result.stdout))
logger.info(result.stdout)
} }
await common.pause(2000) await common.pause(2000)
console.log(chalk.white('Try Again')) console.log(chalk.white('Try Again'))
@ -235,7 +245,7 @@ module.exports = {
logger.info("Remove Complete") logger.info("Remove Complete")
logger.info("Compatible Apps") logger.info("Compatible Apps")
await shell.rm('-rf', './data/apps/*.apk'); await common.clearApkFolder()
const compatibleApps = await common.getCompatibleAppsList() const compatibleApps = await common.getCompatibleAppsList()
@ -289,18 +299,39 @@ module.exports = {
logger.info("App Restore Complete") logger.info("App Restore Complete")
module.exports.mainMenu() module.exports.mainMenu()
}, },
batchInstallApks: async () => {
logger.info("Batch Install Apks")
common.header('Batch Install Apks')
let apkList = await getFilesIn('./my_apk/', matchFiletypes = ['apk'], checkSubDirectories = false)
await files.renameLocalApk(apkList)
apkList = await getFilesIn('./my_apk/', matchFiletypes = ['apk'], checkSubDirectories = false)
for (let element of apkList) {
console.log('Installing ' + element)
logger.info('Installing ' + element)
await shellExec(adbRun + ' install -r ' + element).then(async function (result) {
if (result.stderr != '') {
logger.info('Error ' + result.stderr);
console.log(chalk.redBright(result.stderr));
}
console.log(element + ' - ' + result.stdout);
logger.info(element + ' - ' + result.stdout);
});
}
console.log(chalk.green('Batch Install Apks Completed'))
logger.info('Batch Install Apks Completed')
await common.pause(2000)
module.exports.mainMenu()
},
mainMenu: async () => { mainMenu: async () => {
common.header('Main Menu') common.header('Main Menu')
if (process.platform === 'win32' || process.platform === 'win64') {
adbRun = 'adb'
} else {
adbRun = './adb'
}
logger.info(process.platform + " detected")
const mainMenuSelection = await inquirer.mainMenu(); const mainMenuSelection = await inquirer.mainMenu();
switch (mainMenuSelection.mainMenu) { switch (mainMenuSelection.mainMenu) {
case 'connect to miwatch via wifi': case 'connect to miwatch':
module.exports.connectWifi() module.exports.connectWatch()
break; break;
case '1-click karl0ss klean': case '1-click karl0ss klean':
module.exports.oneClick() module.exports.oneClick()
@ -314,12 +345,15 @@ module.exports = {
case 'install compatible apps': case 'install compatible apps':
module.exports.compatibleApps() module.exports.compatibleApps()
break; break;
case 'remove installed apps': case 'batch remove installed apps':
module.exports.removeCompatibleApps() module.exports.removeCompatibleApps()
break; break;
case 'restore any app': case 'restore any app':
module.exports.restoreAnyApp() module.exports.restoreAnyApp()
break; break;
case 'batch install apks':
module.exports.batchInstallApks()
break;
case 'quit': case 'quit':
break; break;
default: default: