mirror of
https://github.com/xroche/httrack.git
synced 2026-06-25 03:27:22 +03:00
Review of the array refactor flagged one behaviour divergence: splitting PATH with `IFS=: read -ra` keeps empty fields (from doubled or leading colons) as "" elements, where the old `echo $PATH | tr : ' '` word-split dropped them, so the search loop would probe /htsserver. Skip the empty fields to restore exact parity. Also reflow the CI SHELL_SCRIPTS list as a folded block scalar, one entry per line and sorted, so it reads cleanly; the folded value is the same space-separated string. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Signed-off-by: Xavier Roche <roche@httrack.com>
144 lines
5.3 KiB
Bash
Executable File
144 lines
5.3 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# WebHTTrack launcher script
|
|
# Initializes the htsserver GUI frontend and launch the default browser
|
|
|
|
BROWSEREXE=
|
|
SRCHBROWSEREXE=(x-www-browser www-browser iceape mozilla firefox-developer-edition firefox icecat iceweasel abrowser firebird galeon konqueror midori opera google-chrome chrome chromium chromium-browser netscape firefox-developer-edition)
|
|
# shellcheck disable=SC2153 # BROWSER is the standard freedesktop env var, not a typo
|
|
if test -n "${BROWSER}"; then
|
|
# sensible-browser will f up if BROWSER is not set
|
|
SRCHBROWSEREXE=(xdg-open sensible-browser "${SRCHBROWSEREXE[@]}")
|
|
fi
|
|
# Patch for Darwin/Mac by Ross Williams
|
|
if test "$(uname -s)" == "Darwin"; then
|
|
# Darwin/Mac OS X uses a system 'open' command to find
|
|
# the default browser. The -W flag causes it to wait for
|
|
# the browser to exit
|
|
BROWSEREXE="/usr/bin/open -W"
|
|
fi
|
|
BINWD=$(dirname "$0")
|
|
SRCHPATH=("$BINWD" /usr/local/bin /usr/share/bin /usr/bin /usr/lib/httrack /usr/local/lib/httrack /usr/local/share/httrack /opt/local/bin /sw/bin "${HOME}/usr/bin" "${HOME}/bin")
|
|
IFS=':' read -ra pathdirs <<<"$PATH"
|
|
for d in "${pathdirs[@]}"; do
|
|
# drop empty PATH fields, matching the old echo|tr word-split
|
|
test -n "$d" && SRCHPATH+=("$d")
|
|
done
|
|
SRCHDISTPATH=("$BINWD/../share" "$BINWD/.." /usr/share /usr/local /usr /local /usr/local/share "${HOME}/usr" "${HOME}/usr/share" /opt/local/share /sw "${HOME}/usr/local" "${HOME}/usr/share")
|
|
|
|
###
|
|
# And now some famous cuisine
|
|
|
|
function log {
|
|
echo "$0($$): $*" >&2
|
|
return 0
|
|
}
|
|
|
|
function launch_browser {
|
|
log "Launching $1"
|
|
browser=$1
|
|
url=$2
|
|
log "Spawning browser.."
|
|
${browser} "${url}"
|
|
# note: browser can hiddenly use the -remote feature of
|
|
# mozilla and therefore return immediately
|
|
log "Browser (or helper) exited"
|
|
}
|
|
|
|
# First ensure that we can launch the server
|
|
BINPATH=
|
|
for i in "${SRCHPATH[@]}"; do
|
|
! test -n "${BINPATH}" && test -x "${i}/htsserver" && BINPATH="${i}"
|
|
done
|
|
for i in "${SRCHDISTPATH[@]}"; do
|
|
! test -n "${DISTPATH}" && test -f "${i}/httrack/lang.def" && DISTPATH="${i}/httrack"
|
|
done
|
|
test -n "${BINPATH}" || ! log "Could not find htsserver" || exit 1
|
|
test -n "${DISTPATH}" || ! log "Could not find httrack directory" || exit 1
|
|
test -f "${DISTPATH}/lang.def" || ! log "Could not find ${DISTPATH}/lang.def" || exit 1
|
|
test -f "${DISTPATH}/lang.indexes" || ! log "Could not find ${DISTPATH}/lang.indexes" || exit 1
|
|
test -d "${DISTPATH}/lang" || ! log "Could not find ${DISTPATH}/lang" || exit 1
|
|
test -d "${DISTPATH}/html" || ! log "Could not find ${DISTPATH}/html" || exit 1
|
|
|
|
# Locale
|
|
HTSLANG="${LC_MESSAGES}"
|
|
! test -n "${HTSLANG}" && HTSLANG="${LC_ALL}"
|
|
! test -n "${HTSLANG}" && HTSLANG="${LANG}"
|
|
HTSLANG="$(echo "$LANG" | cut -f1 -d'.' | cut -f1 -d'_')"
|
|
LANGN=$(grep -E "^${HTSLANG}:" "${DISTPATH}/lang.indexes" | cut -f2 -d':')
|
|
! test -n "${LANGN}" && LANGN=1
|
|
|
|
# Find the browser
|
|
# note: not all systems have sensible-browser or www-browser alternative
|
|
# thefeore, we have to find a bit more if sensible-browser could not be found
|
|
|
|
for i in "${SRCHBROWSEREXE[@]}"; do
|
|
for j in "${SRCHPATH[@]}"; do
|
|
if test -x "${j}/${i}"; then
|
|
BROWSEREXE="${j}/${i}"
|
|
fi
|
|
test -n "$BROWSEREXE" && break
|
|
done
|
|
test -n "$BROWSEREXE" && break
|
|
done
|
|
test -n "$BROWSEREXE" || ! log "Could not find any suitable browser" || exit 1
|
|
|
|
# "browse" command
|
|
if test "$1" = "browse"; then
|
|
if test -f "${HOME}/.httrack.ini"; then
|
|
INDEXF=$(tr '\r' '\n' <"${HOME}/.httrack.ini" | grep -E "^path=" | cut -f2- -d'=')
|
|
if test -n "${INDEXF}" -a -d "${INDEXF}" -a -f "${INDEXF}/index.html"; then
|
|
INDEXF="${INDEXF}/index.html"
|
|
else
|
|
INDEXF=""
|
|
fi
|
|
fi
|
|
if ! test -n "$INDEXF"; then
|
|
INDEXF="${HOME}/websites/index.html"
|
|
fi
|
|
launch_browser "${BROWSEREXE}" "file://${INDEXF}"
|
|
exit $?
|
|
fi
|
|
|
|
# Create a temporary filename
|
|
TMPSRVFILE="$(mktemp "${TMPDIR:-/tmp}/.webhttrack.XXXXXXXX")" || ! log "Could not create the temporary file ${TMPSRVFILE}" || exit 1
|
|
# Launch htsserver binary and setup the server
|
|
(
|
|
"${BINPATH}/htsserver" "${DISTPATH}/" --ppid "$$" path "${HOME}/websites" lang "${LANGN}" "$@"
|
|
echo SRVURL=error
|
|
) >"${TMPSRVFILE}" &
|
|
# Find the generated SRVURL
|
|
SRVURL=
|
|
MAXCOUNT=60
|
|
while ! test -n "$SRVURL"; do
|
|
MAXCOUNT=$((MAXCOUNT - 1))
|
|
test $MAXCOUNT -gt 0 || exit 1
|
|
test $MAXCOUNT -lt 50 && echo "waiting for server to reply.."
|
|
SRVURL=$(grep -E URL= "${TMPSRVFILE}" | cut -f2- -d=)
|
|
test ! "$SRVURL" = "error" || ! log "Could not spawn htsserver" || exit 1
|
|
test -n "$SRVURL" || sleep 1
|
|
done
|
|
|
|
# Cleanup function
|
|
# shellcheck disable=SC2120 # $1 is an optional "signal caught" marker; bare calls are intentional
|
|
function cleanup {
|
|
test -n "$1" && log "Nasty signal caught, cleaning up.."
|
|
# Do not kill if browser exited (chrome bug issue) ; server will die itself
|
|
test -n "$1" && test -f "${TMPSRVFILE}" && SRVPID=$(grep -E PID= "${TMPSRVFILE}" | cut -f2- -d=)
|
|
test -n "${SRVPID}" && kill -9 "${SRVPID}"
|
|
test -f "${TMPSRVFILE}" && rm "${TMPSRVFILE}"
|
|
test -n "$1" && log "..Done"
|
|
return 0
|
|
}
|
|
|
|
# Cleanup in case of emergency
|
|
trap "cleanup now; exit" HUP INT QUIT ILL TRAP ABRT BUS FPE SEGV PIPE ALRM TERM STKFLT XCPU XFSZ
|
|
|
|
# Got SRVURL, launch browser
|
|
launch_browser "${BROWSEREXE}" "${SRVURL}"
|
|
|
|
# That's all, folks!
|
|
trap "" HUP INT QUIT ILL TRAP ABRT BUS FPE SEGV PIPE ALRM TERM STKFLT XCPU XFSZ
|
|
cleanup
|
|
exit 0
|