Some minor changes

This commit is contained in:
WolverinDEV 2021-02-12 10:21:53 +01:00
parent 5e6aac77ed
commit ab7da09c25
3 changed files with 48 additions and 50 deletions

View File

@ -129,7 +129,7 @@ export async function write_version(file: string, platform: string, arch: string
}
export async function deploy(platform: string, arch: string, channel: string, version: Version, update_file: string, install_file: string, install_suffix: string) {
await new Promise(resolve => {
const url = (process.env["teaclient_deploy_url"] || "http://clientapi.teaspeak.de/") + "api.php";
const url = (process.env["teaclient_deploy_url"] || "https://clientapi.teaspeak.de/") + "api.php";
console.log("Requesting " + url);
console.log("Uploading update file " + update_file);
console.log("Uploading install file " + install_file);

View File

@ -28,8 +28,6 @@ export type UpdateStatsCallback = (message: string, progress: number) => void;
export type UpdateLogCallback = (type: "error" | "info", message: string) => void;
export function updateServerUrl() : string {
/* FIXME! */
return "https://clientapi.teaspeak.de/";
return processArguments.has_value(...Arguments.SERVER_URL) ? processArguments.value(...Arguments.SERVER_URL) : "https://clientapi.teaspeak.de/";
}
@ -253,51 +251,54 @@ if(typeof(String.prototype.trim) === "undefined")
}
export async function ensureTargetFilesAreWriteable(updateFile: string) : Promise<string[]> {
const original_fs = require('original-fs');
const originalFs = require('original-fs');
if(!fs.existsSync(updateFile)) {
throw "Missing update file (" + updateFile + ")";
}
let parent_path = app.getAppPath();
if(parent_path.endsWith(".asar")) {
parent_path = path.join(parent_path, "..", "..");
parent_path = fs.realpathSync(parent_path);
}
const test_access = async (file: string, mode: number) => {
return await new Promise<NodeJS.ErrnoException>(resolve => original_fs.access(file, mode, resolve));
let parentPath = await fs.realpath(path.dirname(app.getPath("exe")));
const testAccess = async (file: string, mode: number) => {
return await new Promise<NodeJS.ErrnoException>(resolve => originalFs.access(file, mode, resolve));
};
let code = await test_access(updateFile, original_fs.constants.R_OK);
if(code)
let code = await testAccess(updateFile, originalFs.constants.R_OK);
if(code) {
throw "Failed test read for update file. (" + updateFile + " results in " + code.code + ")";
}
const fstream = original_fs.createReadStream(updateFile);
const fstream = originalFs.createReadStream(updateFile);
const tar_stream = tar.extract();
const errors: string[] = [];
const tester = async (header: Headers) => {
const entry_path = path.normalize(path.join(parent_path, header.name));
const entry_path = path.normalize(path.join(parentPath, header.name));
if(header.type == "file") {
if(original_fs.existsSync(entry_path)) {
code = await test_access(entry_path, original_fs.constants.W_OK);
if(code)
if(originalFs.existsSync(entry_path)) {
code = await testAccess(entry_path, originalFs.constants.W_OK);
if(code) {
errors.push("Failed to acquire write permissions for file " + entry_path + " (Code " + code.code + ")");
}
} else {
let directory = path.dirname(entry_path);
while(directory.length != 0 && !original_fs.existsSync(directory))
while(directory.length != 0 && !originalFs.existsSync(directory)) {
directory = path.normalize(path.join(directory, ".."));
}
code = await test_access(directory, original_fs.constants.W_OK);
if(code) errors.push("Failed to acquire write permissions for directory " + entry_path + " (Code " + code.code + ". Target directory " + directory + ")");
code = await testAccess(directory, originalFs.constants.W_OK);
if(code) {
errors.push("Failed to acquire write permissions for directory " + entry_path + " (Code " + code.code + ". Target directory " + directory + ")");
}
}
} else if(header.type == "directory") {
let directory = path.dirname(entry_path);
while(directory.length != 0 && !original_fs.existsSync(directory))
while(directory.length != 0 && !originalFs.existsSync(directory)) {
directory = path.normalize(path.join(directory, ".."));
}
code = await test_access(directory, original_fs.constants.W_OK);
if(code) errors.push("Failed to acquire write permissions for directory " + entry_path + " (Code " + code.code + ". Target directory " + directory + ")");
code = await testAccess(directory, originalFs.constants.W_OK);
if(code) {
errors.push("Failed to acquire write permissions for directory " + entry_path + " (Code " + code.code + ". Target directory " + directory + ")");
}
}
};
@ -324,7 +325,7 @@ export async function ensureTargetFilesAreWriteable(updateFile: string) : Promis
return errors;
}
namespace install_config {
namespace InstallConfig {
export interface LockFile {
filename: string;
timeout: number;
@ -350,9 +351,9 @@ namespace install_config {
}
}
async function createUpdateInstallConfig(sourceRoot: string, targetRoot: string) : Promise<install_config.ConfigFile> {
async function createUpdateInstallConfig(sourceRoot: string, targetRoot: string) : Promise<InstallConfig.ConfigFile> {
console.log("Building update install config for target directory: %s. Update source: %o", targetRoot, sourceRoot);
const result: install_config.ConfigFile = { } as any;
const result: InstallConfig.ConfigFile = { } as any;
result.version = 1;
@ -373,7 +374,7 @@ async function createUpdateInstallConfig(sourceRoot: string, targetRoot: string)
{
"error-id": "main-exe-lock",
filename: app.getPath("exe"),
timeout: 5000
timeout: 10 * 1000
}
];
@ -382,14 +383,14 @@ async function createUpdateInstallConfig(sourceRoot: string, targetRoot: string)
];
const dirWalker = async (relative_path: string) => {
const source_directory = path.join(sourceRoot, relative_path);
const target_directory = path.join(targetRoot, relative_path);
const sourceDirectory = path.join(sourceRoot, relative_path);
const targetDirectory = path.join(targetRoot, relative_path);
let files: string[];
try {
files = await util.promisify(ofs.readdir)(source_directory);
files = await util.promisify(ofs.readdir)(sourceDirectory);
} catch(error) {
console.warn("Failed to iterate over source directory \"%s\": %o", source_directory, error);
console.warn("Failed to iterate over source directory \"%s\": %o", sourceDirectory, error);
return;
}
@ -406,8 +407,8 @@ async function createUpdateInstallConfig(sourceRoot: string, targetRoot: string)
continue;
}
const source_file = path.join(source_directory, file);
const target_file = path.join(target_directory, file);
const source_file = path.join(sourceDirectory, file);
const target_file = path.join(targetDirectory, file);
//TODO check if file content has changed else ignore?
@ -657,25 +658,21 @@ export async function prepareUpdateExecute(targetVersion: UpdateVersion, callbac
callbackStats("Downloading update", status.percent);
}, callbackLog);
/* TODO: Remove this step and let the actual updater so this. If this fails we'll already receiving appropiate error messages. */
/* TODO: Remove this step and let the actual updater so this. If this fails we'll already receiving appropriate error messages. */
if(os.platform() !== "win32") {
callbackLog("info", "Checking file permissions");
callbackStats("Checking file permissions", .25);
/* We must be on a unix based system */
try {
const inaccessiblePaths = await ensureTargetFilesAreWriteable(updateFilePath);
if(inaccessiblePaths.length > 0) {
console.log("Failed to access the following files:");
for(const fail of inaccessiblePaths) {
console.log(" - " + fail);
}
const executeCommand = "sudo " + path.normalize(app.getAppPath()) + " --update-execute";
throw "Failed to access target files.\nPlease execute this app with administrator (sudo) privileges.\nUse the following command:\n" + executeCommand;
const inaccessiblePaths = await ensureTargetFilesAreWriteable(updateFilePath);
if(inaccessiblePaths.length > 0) {
console.log("Failed to access the following files:");
for(const fail of inaccessiblePaths) {
console.log(" - " + fail);
}
} catch(error) {
console.warn("Failed to validate target file accessibility: %o", error);
const executeCommand = "sudo " + path.normalize(app.getPath("exe")) + " --no-sandbox --update-execute";
throw "Failed to access target files.\nPlease execute this app with administrator (sudo) privileges.\nUse the following command:\n" + executeCommand;
}
} else {
/* the windows update already requests admin privileges */
@ -753,8 +750,9 @@ export async function prepareUpdateExecute(targetVersion: UpdateVersion, callbac
return;
}
if(electron.app.hasSingleInstanceLock())
if(electron.app.hasSingleInstanceLock()) {
electron.app.releaseSingleInstanceLock();
}
const ids = child_process.execSync("pgrep TeaClient").toString().split(os.EOL).map(e => e.trim()).reverse().join(" ");
console.log("Executing %s", "kill -9 " + ids);

View File

@ -1,5 +1,5 @@
{
"name": "TeaClient",
"name": "teaspeak_client",
"version": "1.5.0-8",
"description": "",
"main": "main.js",