#!/bin/bash #external by cuma [ "$EXTERNAL_ENABLED" == "y" ] || error 1 "external is used by make" mkdir -p "${EXTERNAL_MOD_DIR}" #preparation for Downloader outsourcing OUT_DIR="outboard" OUT_CONF="downloader.conf" MESSAGE="EXTERNAL SCRIPT:" if [ "$EXTERNAL_DOWNLOADER" == "y" ]; then if [ -e "$OUT_DIR" ]; then echo1 "\"$(pwd)/$OUT_DIR\" is used as directory for outsourced files" echo1 "all existing files in this directory will be rewritten" else echo1 "creating directory \"$(pwd)/$OUT_DIR\" for outsourced files" mkdir $OUT_DIR [ $? -ne 0 ] && error 1 "$MESSAGE Directory \"$OUT_DIR\" cannot be created" fi if [ -e "$OUT_DIR/$OUT_CONF" ]; then echo1 "removing old Downloader configuration file $OUT_DIR/$OUT_CONF" rm "$OUT_DIR/$OUT_CONF" [ $? -ne 0 ] && error 1 "$MESSAGE $OUT_DIR/$OUT_CONF cannot be deleted" fi echo1 "creating new Downloader configuration file $OUT_DIR/$OUT_CONF" touch "$OUT_DIR/$OUT_CONF" fi #external services for EXTERNAL_SERVICE in $(find make -maxdepth 2 -name external.services); do source $EXTERNAL_SERVICE done #.pkg files echo $EXTERNAL_SERVICES > "${VARTAR_MOD_DIR}/var/mod/etc/external.pkg" if [ "$EXTERNAL_CREATEPAK_DYNAMIC" != "y" ]; then cat "${VARTAR_MOD_DIR}/var/mod/etc/external.pkg" > "${EXTERNAL_MOD_DIR}/external.pkg" else touch "${EXTERNAL_MOD_DIR}/external.pkg" for pkg in $EXTERNAL_SERVICES; do mkdir -p "${EXTERNAL_MOD_DIR}-${pkg}" echo "${pkg}" > "${EXTERNAL_MOD_DIR}-${pkg}/${pkg}.pkg" done fi #dynamic files if [ "$EXTERNAL_DYNAMIC" == "y" ]; then # search files for pkg in $EXTERNAL_SERVICES; do pkg_ver="${pkg}-$(cat "$PACKAGES_DIR/.${pkg}")" # check if along with ${pkg} a package named ${pkg}-cgi is available, for some packages (e.g. openvpn, ppp, transmission) # pkg-files (rc.$pkg, etc.) are provided by the package named ${pkg}-cgi and not by ${pkg}. pkg_files="$(collect_pkg_files ${pkg} ${pkg}-cgi ${pkg}-v2-cgi)" for file in $pkg_files; do case $file in /etc/default.$pkg/*|/etc/init.d/rc.*|/etc/onlinechanged/*|/etc/cron.d/*|/usr/lib/cgi-bin/$pkg*) [ "$EXTERNAL_DYNAMIC_SCRIPTS" != "y" ] && continue ;; esac EXTERNAL_DYNAMIC_FILES+=" $file" done done fi #own files EXTERNAL_FILES="$EXTERNAL_OWN_FILES $EXTERNAL_DYNAMIC_FILES" for EXT_FILE in make/*/external.files make/libs/*/external.files; do if [ "$EXTERNAL_DYNAMIC" == "y" ]; then pkg=$(basename "${EXT_FILE%/external.files}") echo "$EXTERNAL_SERVICES" | grep -qE "(^| )${pkg}( |$)" && continue fi source $EXT_FILE done EXTERNAL_FILES=$(echo $EXTERNAL_FILES | sed -e 's| |\n/|g;s|//\+|/|g' | sort -u) for EXTERNAL_FILE in $EXTERNAL_FILES; do FILENAME=$(basename $EXTERNAL_FILE) if [ -L "${FILESYSTEM_MOD_DIR}$EXTERNAL_FILE" -a "$EXTERNAL_LINKS" != "y" ]; then warn "$MESSAGE ${FILESYSTEM_MOD_DIR}$EXTERNAL_FILE is a symbolic link. It will not be processed" else IS_SCRIPT=n EXTERNAL_LINKSUBDIR="" EXTERNAL_TARGETDIR="${EXTERNAL_MOD_DIR}" #subdir if [ "$EXTERNAL_SUBDIRS" == "y" ]; then EXTERNAL_LINKSUBDIR="$(dirname $EXTERNAL_FILE)" EXTERNAL_TARGETDIR+="$EXTERNAL_LINKSUBDIR" mkdir -p "$EXTERNAL_TARGETDIR" #script case $EXTERNAL_FILE in /etc/cron.d/*|/etc/default.*|/etc/init.d/rc.*|/etc/onlinechanged/*|/usr/lib/cgi-bin/*) IS_SCRIPT=y ;; esac fi #downloader EXTERNAL_TEMP="${FILESYSTEM_MOD_DIR}$EXTERNAL_FILE" if [ "$EXTERNAL_DOWNLOADER" == "y" ]; then [ "$IS_SCRIPT" != "n" ] && continue FILEPERM=$(ls -l $EXTERNAL_TEMP | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf("%0o",k)}') echo2 "packing $FILENAME.gz for Downloader" gzip -c "$EXTERNAL_TEMP" > "$OUT_DIR/$FILENAME.gz" [ $? -ne 0 ] && error 1 "$MESSAGE $OUT_DIR/$FILENAME.gz cannot be created" fi #move file if [ `ls "$EXTERNAL_TEMP" 2>/dev/null | wc -l` -gt 0 ]; then [ -e "$EXTERNAL_TARGETDIR/$FILENAME" ] && error 1 "The file $EXTERNAL_TARGETDIR/$FILENAME already exists" mv "$EXTERNAL_TEMP" "$EXTERNAL_TARGETDIR/" EXTERNAL_MSG="moved" [ "$EXTERNAL_DOWNLOADER" == "y" ] && echo "$FILENAME $FILEPERM /mod/external$EXTERNAL_LINKSUBDIR" >> $OUT_DIR/$OUT_CONF else EXTERNAL_MSG="not found" fi #link file if [ "$IS_SCRIPT" != "n" ]; then EXTERNAL_LINKED="" else EXTERNAL_LINKED=" & linked" ln -s "/mod/external$EXTERNAL_LINKSUBDIR/$FILENAME" "${FILESYSTEM_MOD_DIR}$EXTERNAL_FILE" fi echo2 "$EXTERNAL_FILE ... $EXTERNAL_MSG$EXTERNAL_LINKED." fi done #directory for each service package if [ "$EXTERNAL_CREATEPAK_DYNAMIC" == "y" ]; then for pkg in $EXTERNAL_SERVICES; do pkg_dir="${EXTERNAL_MOD_DIR}-${pkg}" pkg_ver="${pkg}-$(cat "$PACKAGES_DIR/.${pkg}")" # check if along with ${pkg} a package named ${pkg}-cgi is available, for some packages (e.g. openvpn, ppp, transmission) # pkg-files (rc.$pkg, etc.) are provided by the package named ${pkg}-cgi and not by ${pkg}. pkg_files="$(collect_pkg_files ${pkg} ${pkg}-cgi ${pkg}-v2-cgi)" for file in $pkg_files; do [ ! -e "${EXTERNAL_MOD_DIR}$file" ] && continue mkdir -p "${pkg_dir}${file%/*}" mv "${EXTERNAL_MOD_DIR}$file" "${pkg_dir}${file}" done touch "${pkg_dir}/.external" done fi #remove emtpy directories, dynamic leftover for dir in $(echo $EXTERNAL_DYNAMIC_FILES | sort -ru); do rmdir "${FILESYSTEM_MOD_DIR}$dir" "${EXTERNAL_MOD_DIR}$dir" 2>/dev/null while [ "$dir" != "${dir%/*}" ]; do dir="${dir%/*}" rmdir "${FILESYSTEM_MOD_DIR}$dir" "${EXTERNAL_MOD_DIR}$dir" 2>/dev/null done done [ $(find $EXTERNAL_MOD_DIR -type f | wc -l) -gt 0 ] && touch "${EXTERNAL_MOD_DIR}/.external" if [ "$EXTERNAL_DOWNLOADER" == "y" ]; then echo " NOTE: Please upload zipped Downloader files from" echo " \"$(pwd)/$OUT_DIR\" to your http or ftp server" echo " and copy the Downloader configuration from" echo " \"$(pwd)/$OUT_DIR/$OUT_CONF\" into Downloader WEBUI." elif [ "$EXTERNAL_CREATEPAK" != "y" ]; then echo " NOTE: Please copy content of build/modified/external/ to your box." fi