pinokiod 7.2.11 → 7.2.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/kernel/environment.js +22 -3
- package/kernel/index.js +57 -1
- package/package.json +1 -1
- package/server/index.js +10 -0
package/kernel/environment.js
CHANGED
|
@@ -72,7 +72,7 @@ const managedCacheEnvDefaults = () => {
|
|
|
72
72
|
return defaults
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
const ensureCachePreflightDir = async (key, targetPath) => {
|
|
75
|
+
const ensureCachePreflightDir = async (key, targetPath, options = {}) => {
|
|
76
76
|
logCachePreflight(`${key}: target=${targetPath}`)
|
|
77
77
|
try {
|
|
78
78
|
await fs.promises.mkdir(targetPath, { recursive: true })
|
|
@@ -95,7 +95,26 @@ const ensureCachePreflightDir = async (key, targetPath) => {
|
|
|
95
95
|
logCachePreflight(`${key}: repair delete ok`)
|
|
96
96
|
} catch (error) {
|
|
97
97
|
logCachePreflight(`${key}: repair delete failed ${formatCachePreflightError(error)}`)
|
|
98
|
-
|
|
98
|
+
if (typeof options.elevatedRepair !== "function") {
|
|
99
|
+
return { key, path: targetPath, repaired: false, ok: false, step: "repair delete", error }
|
|
100
|
+
}
|
|
101
|
+
logCachePreflight(`${key}: elevated repair start path=${targetPath}`)
|
|
102
|
+
let elevatedRepair
|
|
103
|
+
try {
|
|
104
|
+
elevatedRepair = await options.elevatedRepair(targetPath, logCachePreflight)
|
|
105
|
+
} catch (repairError) {
|
|
106
|
+
elevatedRepair = { ok: false, error: repairError }
|
|
107
|
+
}
|
|
108
|
+
if (!elevatedRepair || !elevatedRepair.ok) {
|
|
109
|
+
return { key, path: targetPath, repaired: false, elevated: true, ok: false, step: "elevated repair", error: elevatedRepair && elevatedRepair.error ? elevatedRepair.error : error }
|
|
110
|
+
}
|
|
111
|
+
const elevatedProbe = await probeCacheDir(targetPath)
|
|
112
|
+
if (elevatedProbe.ok) {
|
|
113
|
+
logCachePreflight(`${key}: elevated repair probe ok`)
|
|
114
|
+
return { key, path: targetPath, repaired: true, elevated: true, ok: true }
|
|
115
|
+
}
|
|
116
|
+
logCachePreflight(`${key}: elevated repair probe failed step="${elevatedProbe.step}" ${formatCachePreflightError(elevatedProbe.error)}`)
|
|
117
|
+
return { key, path: targetPath, repaired: true, elevated: true, ok: false, step: elevatedProbe.step, error: elevatedProbe.error }
|
|
99
118
|
}
|
|
100
119
|
|
|
101
120
|
try {
|
|
@@ -140,7 +159,7 @@ const ensurePinokioCacheDirs = async (kernel, options = {}) => {
|
|
|
140
159
|
|
|
141
160
|
for (const key of CACHE_PREFLIGHT_KEYS) {
|
|
142
161
|
const targetPath = path.resolve(cacheRoot, key)
|
|
143
|
-
const result = await ensureCachePreflightDir(key, targetPath)
|
|
162
|
+
const result = await ensureCachePreflightDir(key, targetPath, options)
|
|
144
163
|
results.push(result)
|
|
145
164
|
if (!result.ok) {
|
|
146
165
|
errors.push(result)
|
package/kernel/index.js
CHANGED
|
@@ -44,6 +44,7 @@ const WatchManager = require('./watch')
|
|
|
44
44
|
const { DownloaderHelper } = require('node-downloader-helper');
|
|
45
45
|
const { ProxyAgent } = require('proxy-agent');
|
|
46
46
|
const fakeUa = require('fake-useragent');
|
|
47
|
+
const sudo = process.platform === "win32" ? require("sudo-prompt-programfiles-x86") : null
|
|
47
48
|
//const kill = require('./tree-kill');
|
|
48
49
|
const kill = require('kill-sync')
|
|
49
50
|
const ejs = require('ejs');
|
|
@@ -55,6 +56,34 @@ const VARS = {
|
|
|
55
56
|
}
|
|
56
57
|
}
|
|
57
58
|
|
|
59
|
+
const powershellSingleQuote = (value) => {
|
|
60
|
+
return `'${String(value).replace(/'/g, "''")}'`
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const windowsCacheRepairCommand = (targetPath) => {
|
|
64
|
+
const psPath = powershellSingleQuote(targetPath)
|
|
65
|
+
return [
|
|
66
|
+
"powershell.exe",
|
|
67
|
+
"-NoProfile",
|
|
68
|
+
"-ExecutionPolicy Bypass",
|
|
69
|
+
"-Command",
|
|
70
|
+
`"`,
|
|
71
|
+
"$ErrorActionPreference = 'Stop';",
|
|
72
|
+
`$p = ${psPath};`,
|
|
73
|
+
"$account = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name;",
|
|
74
|
+
"$grant = $account + ':(OI)(CI)F';",
|
|
75
|
+
"if (Test-Path -LiteralPath $p) {",
|
|
76
|
+
" & takeown.exe /F $p /R /D Y;",
|
|
77
|
+
" & icacls.exe $p /reset /T /C;",
|
|
78
|
+
" & icacls.exe $p /grant $grant /T /C;",
|
|
79
|
+
" Remove-Item -LiteralPath $p -Recurse -Force;",
|
|
80
|
+
"}",
|
|
81
|
+
"New-Item -ItemType Directory -Force -Path $p | Out-Null;",
|
|
82
|
+
"& icacls.exe $p /grant $grant /T /C;",
|
|
83
|
+
`"`
|
|
84
|
+
].join(" ")
|
|
85
|
+
}
|
|
86
|
+
|
|
58
87
|
//const memwatch = require('@airbnb/node-memwatch');
|
|
59
88
|
class Kernel {
|
|
60
89
|
schema = "<=7.0.0"
|
|
@@ -465,6 +494,30 @@ class Kernel {
|
|
|
465
494
|
return ''
|
|
466
495
|
}
|
|
467
496
|
}
|
|
497
|
+
async elevatedCacheRepair(targetPath, log = console.log) {
|
|
498
|
+
if (this.platform !== "win32" || !sudo) {
|
|
499
|
+
return { ok: false, error: new Error("Elevated cache repair is only available on Windows") }
|
|
500
|
+
}
|
|
501
|
+
const command = windowsCacheRepairCommand(targetPath)
|
|
502
|
+
log(`elevated repair command=${command}`)
|
|
503
|
+
return new Promise((resolve) => {
|
|
504
|
+
sudo.exec(command, { name: "Pinokio" }, (error, stdout, stderr) => {
|
|
505
|
+
if (stdout && stdout.trim()) {
|
|
506
|
+
log(`elevated repair stdout ${stdout.trim()}`)
|
|
507
|
+
}
|
|
508
|
+
if (stderr && stderr.trim()) {
|
|
509
|
+
log(`elevated repair stderr ${stderr.trim()}`)
|
|
510
|
+
}
|
|
511
|
+
if (error) {
|
|
512
|
+
log(`elevated repair failed ${error.message || error}`)
|
|
513
|
+
resolve({ ok: false, error, stdout, stderr })
|
|
514
|
+
} else {
|
|
515
|
+
log(`elevated repair ok path=${targetPath}`)
|
|
516
|
+
resolve({ ok: true, stdout, stderr })
|
|
517
|
+
}
|
|
518
|
+
})
|
|
519
|
+
})
|
|
520
|
+
}
|
|
468
521
|
async ensureRouterMode() {
|
|
469
522
|
const domain = await this.resolvePinokioDomain()
|
|
470
523
|
const shouldUseCustom = domain.length > 0
|
|
@@ -1053,7 +1106,10 @@ class Kernel {
|
|
|
1053
1106
|
|
|
1054
1107
|
// 2. mkdir all the folders if not already created
|
|
1055
1108
|
await Environment.init_folders(this.homedir, this)
|
|
1056
|
-
await Environment.ensurePinokioCacheDirs(this
|
|
1109
|
+
await Environment.ensurePinokioCacheDirs(this, {
|
|
1110
|
+
throwOnFailure: true,
|
|
1111
|
+
elevatedRepair: this.elevatedCacheRepair.bind(this)
|
|
1112
|
+
})
|
|
1057
1113
|
|
|
1058
1114
|
// if key.json doesn't exist, create an empty json file
|
|
1059
1115
|
let ee = await this.exists(this.homedir, "key.json")
|
package/package.json
CHANGED
package/server/index.js
CHANGED
|
@@ -5707,6 +5707,16 @@ class Server {
|
|
|
5707
5707
|
|
|
5708
5708
|
needsManagedRefresh = true
|
|
5709
5709
|
console.log("[TRY] Updating to the new version")
|
|
5710
|
+
let envPath = path.resolve(home, "ENVIRONMENT")
|
|
5711
|
+
let envExists = await this.kernel.exists(envPath)
|
|
5712
|
+
if (!envExists) {
|
|
5713
|
+
let str = await Environment.ENV("system", home, this.kernel)
|
|
5714
|
+
await fs.promises.writeFile(envPath, str)
|
|
5715
|
+
}
|
|
5716
|
+
await Environment.ensurePinokioCacheDirs(this.kernel, {
|
|
5717
|
+
throwOnFailure: true,
|
|
5718
|
+
elevatedRepair: this.kernel.elevatedCacheRepair.bind(this.kernel)
|
|
5719
|
+
})
|
|
5710
5720
|
this.kernel.store.set("version", this.version.pinokiod)
|
|
5711
5721
|
console.log("[DONE] Updating to the new version")
|
|
5712
5722
|
console.log("not up to date. update py.")
|