From bbb1aadfefaa2d2a899cffdbd0c30b4bcca3a599 Mon Sep 17 00:00:00 2001 From: remittor Date: Sun, 1 Feb 2026 13:05:00 +0300 Subject: [PATCH] luci: Fix func execAndRead --- .../resources/view/zapret2/tools.js | 78 ++++++++++++------- zapret2/script-exec.sh | 28 +++++-- 2 files changed, 70 insertions(+), 36 deletions(-) diff --git a/luci-app-zapret2/htdocs/luci-static/resources/view/zapret2/tools.js b/luci-app-zapret2/htdocs/luci-static/resources/view/zapret2/tools.js index 01e3844..4dd335e 100644 --- a/luci-app-zapret2/htdocs/luci-static/resources/view/zapret2/tools.js +++ b/luci-app-zapret2/htdocs/luci-static/resources/view/zapret2/tools.js @@ -783,47 +783,78 @@ return baseclass.extend({ const logFile = log; // file for reading: '/tmp/zapret_pkg_install.log' const rcFile = logFile + '.rc'; try { - await fs.exec('/bin/busybox', [ 'rm', '-f', logFile + '*' ], null); - appendLog('Output file cleared!'); + await fs.exec('/bin/busybox', [ 'rm', '-f', logFile ], null); + await fs.exec('/bin/busybox', [ 'rm', '-f', rcFile ], null); + //appendLog('Output file cleared!'); } catch (e) { return callback.call(ctx, 500, 'ERROR: Failed to clear output file'); } - let processStarted = false; + let execRetCode = -1; let opt_list = [ logFile ]; try { opt_list.push(...cmd); //console.log('script-exec.sh ... '+JSON.stringify(opt_list)); - let proc = new Promise((resolve) => { - fs.exec(this.appDir+'/script-exec.sh', opt_list, null) - .then (() => { resolve(); }) - .catch(() => { resolve(); }); + fs.exec(this.appDir+'/script-exec.sh', opt_list, null) + .then( (res) => { + if (execRetCode < 0) { + execRetCode = res.code; + fixLogEnd(); + if (res.code == 0) { + appendLog('Process started....'); + } else { + if (res.stdout) appendLog(res.stdout); + appendLog('ERROR: process not executed! ret_code = '+res.code); + } + } + }).catch( (e) => { + console.log('ERROR: execAndRead: process not exec: '+e.message); + execRetCode = -100; }); } catch (e) { return callback.call(ctx, 520, 'ERROR: Failed on execute process: ' + e.message); } let lastLen = 0; - let retCode = -1; + let retCode = -2; // rc file not found return await new Promise(async (resolve, reject) => { let ticks = 0; async function epoll() { ticks += 1; try { + if (retCode < 0) { + let rc = await fs.exec('/bin/cat', [ rcFile ], null); + if (rc.code != 0) { + if (ticks >= 2) { + console.log('ERROR: execAndRead: '+JSON.stringify(opt_list)); + fixLogEnd(); + resolve(callback.call(ctx, 542, 'ERROR: Failed on read process rc-file: code = ' + rc.code)); + return; + } + console.log('WARN: execAndRead: read rc-file res.code = '+rc.code); + } + if (rc.code == 0) { + if (rc.stdout) { + retCode = parseInt(rc.stdout.trim(), 10); + } else { + retCode = -1; // rc file exists, but empty + } + } + if (retCode <= -2) { + setTimeout(epoll, 500); + return; // skip first step with error + } + } let res = await fs.exec('/bin/cat', [ logFile ], null); if (res.code != 0) { - if (ticks > 1) { - console.log('ERROR: execAndRead: '+JSON.stringify(opt_list)); - resolve(callback.call(ctx, 541, 'ERROR: Failed on read process log: code = ' + res.code)); - return; - } - setTimeout(epoll, 500); - return; // skip first step with error + fixLogEnd(); + resolve(callback.call(ctx, 546, 'ERROR: Failed on read process log: code = ' + res.code)); + return; } - if (!processStarted) { + if (execRetCode < 0) { + execRetCode = 9999; appendLog('Process started...'); - processStarted = true; } - if (res.stdout && res.stdout.length > lastLen) { + if (res.code == 0 && res.stdout && res.stdout.length > lastLen) { let log = res.stdout.slice(lastLen); hide_rows.forEach(re => { log = log.replace(re, ''); @@ -831,17 +862,6 @@ return baseclass.extend({ appendLog(log, ''); lastLen = res.stdout.length; } - if (retCode < 0) { - let rc = await fs.exec('/bin/cat', [ rcFile ], null); - if (rc.code != 0) { - fixLogEnd(); - resolve(callback.call(ctx, 545, 'ERROR: cannot read file "' + rcFile + '"')); - return; - } - if (rc.stdout) { - retCode = parseInt(rc.stdout.trim(), 10); - } - } if (retCode >= 0) { fixLogEnd(); if (retCode == 0 && res.stdout) { diff --git a/zapret2/script-exec.sh b/zapret2/script-exec.sh index 80b0831..a496270 100755 --- a/zapret2/script-exec.sh +++ b/zapret2/script-exec.sh @@ -1,23 +1,37 @@ #!/bin/sh # Copyright (c) 2024 remittor -awk -V PID_FILE=/tmp/zapret-script-exec.pid -[ -f $PID_FILE ] && exit 70 +if [ -f $PID_FILE ]; then + echo "ERROR: file $PID_FILE already exists!" | awk 'NR==1' + exit 70 +fi LOG_FILE=$1 RC_FILE=$1.rc SH_FILE=$2 shift 2 -[ ! -f $SH_FILE ] && exit 71 -: > $LOG_FILE -: > $RC_FILE +if [ ! -e $SH_FILE ]; then + echo "ERROR: script $SH_FILE not found!" | awk 'NR==1' + exit 71 +fi +if [ ! -x $SH_FILE ]; then + echo "ERROR: script $SH_FILE not Found!" | awk 'NR==1' + exit 72 +fi start-stop-daemon -S -b -p $PID_FILE -x /bin/sh -- -c ' LOG_FILE=$1 RC_FILE=$2 SH_FILE=$3 shift 3 - sh $SH_FILE "$@" > $LOG_FILE 2>&1 + printf "" > $LOG_FILE + printf "" > $RC_FILE + $SH_FILE "$@" >> $LOG_FILE 2>&1 RET_CODE=$? - sleep 1 echo $RET_CODE > $RC_FILE ' sh $LOG_FILE $RC_FILE $SH_FILE "$@" +RET_CODE=$? +if [ $RET_CODE != 0 ]; then + echo "ERROR: script $SH_FILE not executed! ret_code = $RET_CODE" | awk 'NR==1' + exit $RET_CODE +fi +echo "Script $SH_FILE running..." | awk 'NR==1' exit 0