]> &displayName; Change Log ======================== ####By: PhAzE 2017.02.15.1 ------------ - Found new way to grep the current installed version since stdout redirection doesn't appear to capture the proper values 2016.11.30.1 ------------ - Updated Mono to 4.6.2.7 2016.09.17.1 ------------ - Added shortcut from plugins menu to plugin settings page 2016.06.16.1 ------------ - Added SASL dependency for MediaInfo on Unraid 6.2 Beta - Added libx11, libxcb, libxau, libxdmcp dependencies 2016.04.21.1 ------------ - Updated Mono to version 4.2.3.4 - Updated POST to use urlencode and urldecode 2015.11.04.1 ------------ - Fixed jQuery to check if loaded before loading itself in, this fixes stuck loader icon on settings page 2015.09.01.1 ------------ - V3 initial release - Added environment shortcut, Appname-env, so users can access the environment easier from anywhere - Added display for array state and app version number - Added WebUI button instead of having to click on the word 'running' - Added loading screen to display what the app is doing when the plugin page is loading (not working on unRAID 5) - Added new icons for warnings - Added app config sync back to plg config so settings are transfered on app stop - Added plugin logger function, writes to log file in /tmp dir for each plugin - Added activity log button so users can see hostory of plugin controls being used - Added support for HTTPS in any application that allows it and fixed apps that had broken HTTPS - Added ellipsis for version numbers so long hashes don't mess up the UI layout - Updated certs to 2015 version instead of using old 2013 version - Updated plugin to follow array state, disables function if array is offline - Updated all of the PHP code for a newer unified look - Updated for dark theme on unRAID 6 - Updated PHP styles so they are all moved to CSS sheets instead of being all over the place - Updated CSS to standardized and organized layout - Updated all variables to use LOCAL where possible to reduce any variable leakage and reduce RAM usage - Updated plg.old creation and moved it into the .plg file - Changed dependencies independent location codebase so they can be installed in other locations - Changed dependencies so if cache drive is found, they are installed there - Changed dependencies so if no cache drive is found, they are installed in RAM drive like normal - Changed warnings so they are less intrusive and take up less space - Changed RC code so all chown commands and mkdir commands reside in one funtion - Changed 30% of the RC code, has been rewritten for better control of the application - Fixed text that is displayed when starting and stopping app, minimal shown, logged in activity log in detail - Fixed capitalization across all plugins to match on the UI - Moved dependency install out of .plg file into RC file, prior to write export function - Verified all return, break, and exit codes to be used in proper spots to prevent code breakage 2015.07.28.1 ------------ - Fixed glitch in updater that was messing up the entire OS on random occasions 2015.07.23.1 ------------ - Added SSL root certificates for unRAID 5 users - Fixed certificates with Mono so SSL works with Mono apps 2015.07.01.1 ------------ - Updated for unRAID 6 final to comply with changes in OS 2015.05.03.1 ------------ - Fixed remove script so it no longer shows an error on Unraid 5 - Added change log to plugins page on Unraid GUI 2015.02.08.1 ------------ - Fixed removal of old mono files INITIAL RELEASE --------------- - Re-writen from scratch to run with Unraid 6 Plugin Manager - Universal based plugin now downloads appropriate depedencies based on the OS architeture used - Installs from USB copy if no internet connection is found and files exist on USB - Added GUI setting to disable online checks by the plugin on page load - Added dependency section to view main dependency versions and very they are working - Added ability to uninstall the plugin and files from within the plugin GUI - Dependencies now install to a common folder and app starts with a wrapper script - Wrapper script adds environment variables for the common dependency folder upon start - When plugin is uninstalled from PLGMGR or plugin GUI all files even dependencies are removed - Plugin uninstall leaves installdir and configdir, up to user to delete those if they are not needed # ========================================================================= # Logger function - Logs to /var/log/PhAzE-Logs/ and to unRAID display # ========================================================================= app_logger() { # First passed item is the text ($1), secone item is severity ($2 - info, warn, error), third is where to log ($3 - all, log) local PLGLOGFILE="/var/log/PhAzE-Logs/&name;.log" local LOGTEXT=$1 local LOGTYPE=$2 local LOGVAR=$3 local TIMESTAMP=`date +"%Y-%m-%d %T"` # Set the type of log if [ "$LOGTYPE" == "info" ]; then TYPE="[INFO]" elif [ "$LOGTYPE" == "warn" ]; then TYPE="[WARNING]" elif [ "$LOGTYPE" == "error" ]; then TYPE="[ERROR]" fi # If log file doesn't exist, make it if [ ! -f "$PLGLOGFILE" ]; then mkdir -p "/var/log/PhAzE-Logs" touch "$PLGLOGFILE" fi # Echo the text to display and log, or just log file if [ "$LOGVAR" == "all" ]; then echo -e "${LOGTEXT}" echo -e "${TIMESTAMP} ${TYPE}\t${LOGTEXT}" >> "$PLGLOGFILE" elif [ "$LOGVAR" == "log" ]; then echo -e "${TIMESTAMP} ${TYPE}\t${LOGTEXT}" >> "$PLGLOGFILE" fi } # ========================================================================= # Clean up previous files that don't match the known md5 # ========================================================================= # Setup plugin variables CTRLFILES="/boot/config/plugins/&name;/&controlFILE;" CFGFILE="/boot/config/plugins/&name;/&name;.cfg" OLDPNG="nzbdrone_logo.png" OLDNAME="nzbdrone" app_logger "************************** " info log app_logger "Installing &name; plugin " info all app_logger "************************** " info log # Since this is a universal plugin for unraid, check if running 32 bit or 64 bit OS for dependencies ARCHTYPE=$( /usr/bin/uname -m ) if [ "x86_64" == "$ARCHTYPE" ]; then DEPFILES="/boot/config/plugins/&name;/&dependencyFILE64;" DEPMD5="&dependencyMD564;" DEPURL="&dependencyURL64;" MONOFILE="/boot/config/plugins/&name;/&monoFILE64;" MONOMD5="&monoMD564;" MONOURL="&monoURL64;" else DEPFILES="/boot/config/plugins/&name;/&dependencyFILE;" DEPMD5="&dependencyMD5;" DEPURL="&dependencyURL;" MONOFILE="/boot/config/plugins/&name;/&monoFILE;" MONOMD5="&monoMD5;" MONOURL="&monoURL;" echo " " # This makes unraid 5 console a little cleaner fi # Backwards compatibility from older PhAzE plugins, they had lower case folders and extra files in the bundle # Note that it is done this way because Unraid 6 is case insensitive and we only want it to execute if lower case was found DIREXISTS=`find "/boot/config/plugins" -type d -maxdepth 1 | grep -v "_alt" |grep "$OLDNAME"` if [ "$DIREXISTS" == "/boot/config/plugins/$OLDNAME" ]; then app_logger "Converting old plugin style to current standards " info log [ -f "/etc/rc.d/rc.$OLDNAME" ] && "/etc/rc.d/rc.$OLDNAME" stop mv -f "/boot/config/plugins/$OLDNAME" "/boot/config/plugins/&name;-temp" mv -f "/boot/config/plugins/&name;-temp" "/boot/config/plugins/&name;" [ -f "/boot/config/plugins/${OLDNAME}.plg.old" ] && rm -f "/boot/config/plugins/${OLDNAME}.plg.old" [ -f "/boot/config/plugins/${OLDNAME}.64bit.plg.old" ] && rm -f "/boot/config/plugins/${OLDNAME}.64bit.plg.old" [ -f "/boot/config/plugins/&name;/$OLDPNG" ] && rm -f "/boot/config/plugins/&name;/$OLDPNG" [ -f "/boot/config/plugins/&name;/plgver.txt" ] && rm -f "/boot/config/plugins/&name;/plgver.txt" [ -f "/boot/config/plugins/&name;/startcfg.sh" ] && rm -f "/boot/config/plugins/&name;/startcfg.sh" if [ -f "/boot/config/plugins/&name;/${OLDNAME}.cfg" ]; then mv -f "/boot/config/plugins/&name;/${OLDNAME}.cfg" "/boot/config/plugins/&name;/&name;-temp.cfg" mv -f "/boot/config/plugins/&name;/&name;-temp.cfg" "/boot/config/plugins/&name;/&name;.cfg" fi [ -d "/usr/local/emhttp/plugins/$OLDNAME" ] && rm -rf "/usr/local/emhttp/plugins/$OLDNAME" if [ "x86_64" == "$ARCHTYPE" ]; then [ -f "/boot/config/plugins/${OLDNAME}.64bit.plg" ] && /usr/local/sbin/plugin remove "${OLDNAME}.64bit.plg" else if [ -f "/boot/config/plugins/${OLDNAME}.plg" ]; then GETVAR=`grep "ENTITY name" "/boot/config/plugins/${OLDNAME}.plg"` [ "$GETVAR" == "" ] && rm -f "/boot/config/plugins/${OLDNAME}.plg" fi fi app_logger "Conversion OK! " info log fi app_logger "Checking for current bundle files " info all # Verifies plugin control files if they exist, deletes if they are incorrect so new ones can be downloaded if [ -f "$CTRLFILES" ]; then MD5TEST=`echo "&controlMD5; $CTRLFILES" | md5sum --quiet --status -c - && echo "1" || echo "0"` if [ "$MD5TEST" == "0" ]; then app_logger "Control file: Found wrong version, deleting " info all rm -f "$CTRLFILES" else app_logger "Control file: Found correct version " info all fi else app_logger "Control file: Not Found " info all fi # Verifies plugin dependency files if they exist, deletes if they are incorrect so new ones can be downloaded if [ -f "$DEPFILES" ]; then MD5TEST=`echo "$DEPMD5 $DEPFILES" | md5sum --quiet --status -c - && echo "1" || echo "0"` if [ "$MD5TEST" == "0" ]; then app_logger "Dependency file: Found wrong version, deleting " info all rm -f "$DEPFILES" else app_logger "Dependency file: Found correct version " info all fi else app_logger "Dependency file: Not found " info all fi # Verifies Mono dependency file if it exist, deletes if it is incorrect so new ones can be downloaded if [ -f "$MONOFILE" ]; then MD5TEST=`echo "$MONOMD5 $MONOFILE" | md5sum --quiet --status -c - && echo "1" || echo "0"` if [ "$MD5TEST" == "0" ]; then app_logger "Mono file: Found wrong version, deleting " info all rm -f "$MONOFILE" else app_logger "Mono file: Found correct version " info all fi else app_logger "Mono file: Not found " info all fi # Remove previous temp install directory if found [ -d /tmp/&name;-inst ] && rm -fR /tmp/&name;-inst; app_logger "Check OK! " info all # ========================================================================= # Download required plugin files # ========================================================================= # Check for net connectivity to the repo, 5 second timeout then fails NETCHECK=`timeout 5 wget --no-check-certificate -qST4 --spider "https://github.com/PhAzE-Variance" 2>&1 | grep HTTP | tail -1 | cut -f1 | awk '{print $NF}'` [ "$NETCHECK" == "OK" ] && HASNET="yes" || HASNET="no" [ -d "/boot/config/plugins/&name;" ] && chmod -R 777 "/boot/config/plugins/&name;" # Downloads plugin control files if they don't exist, then verify them if [ ! -f "$CTRLFILES" ]; then app_logger "Downloading new control file " info all if [ "$HASNET" == "yes" ]; then mkdir -p "/boot/config/plugins/&name;" wget --no-check-certificate -qO "$CTRLFILES" "&controlURL;" if [ -f "$CTRLFILES" ]; then MD5TEST1=`echo "&controlMD5; $CTRLFILES" | md5sum --quiet --status -c - && echo "1" || echo "0"` if [ "$MD5TEST1" == "1" ]; then app_logger "Download OK: Control file passed MD5 check " info all else app_logger "Install failed: Downloaded control file failed MD5 check " error all rm -f "$CTRLFILES" rm -f "/tmp/&name;-script" exit 1 fi else app_logger "Install failed: Control file download did not complete " error all rm -f "/tmp/&name;-script" exit 1 fi else app_logger "Install failed: Unable to detect internet connection " error all rm -f "/tmp/&name;-script" exit 1 fi fi # Downloads plugin dependency files if they don't exist, then verify them if [ ! -f "$DEPFILES" ] && [ "$DEPMD5" != "" ]; then app_logger "Downloading new dependency file " info all if [ "$HASNET" == "yes" ]; then mkdir -p /boot/config/plugins/&name; wget --no-check-certificate -qO "$DEPFILES" "$DEPURL" if [ -f "$DEPFILES" ]; then MD5TEST2=`echo "$DEPMD5 $DEPFILES" | md5sum --quiet --status -c - && echo "1" || echo "0"` if [ "$MD5TEST2" == "1" ]; then app_logger "Download OK: Dependency file passed MD5 check " info all else app_logger "Install failed: Downloaded dependency file failed MD5 check " error all rm -f "$DEPFILES" rm -f "/tmp/&name;-script" exit 1 fi else app_logger "Install failed: Dependency file download did not complete " error all rm -f "/tmp/&name;-script" exit 1 fi else app_logger "Install failed: Unable to detect internet connection " error all rm -f "/tmp/&name;-script" exit 1 fi fi # Downloads Mono dependency file if it doesn't exist, then verify it if [ ! -f "$MONOFILE" ] && [ "$MONOMD5" != "" ]; then app_logger "Downloading new Mono file " info all if [ "$HASNET" == "yes" ]; then mkdir -p /boot/config/plugins/&name; wget --no-check-certificate -qO "$MONOFILE" "$MONOURL" if [ -f "$MONOFILE" ]; then MD5TEST3=`echo "$MONOMD5 $MONOFILE" | md5sum --quiet --status -c - && echo "1" || echo "0"` if [ "$MD5TEST3" == "1" ]; then app_logger "Download OK: Mono file passed MD5 check " info all else app_logger "Install failed: Downloaded Mono file failed MD5 check " error all rm -f "$MONOFILE" rm -f "/tmp/&name;-script" exit 1 fi else app_logger "Install failed: Mono file download did not complete " error all rm -f "/tmp/&name;-script" exit 1 fi else app_logger "Install failed: Unable to detect internet connection " error all rm -f "/tmp/&name;-script" exit 1 fi fi app_logger "Locating and removing old bundle files " info log # Removes other packages that don't match the version required, leaves out the proper ones if they exist find /boot/config/plugins/&name;/&name;-PhAzE-Control* -type f -not -name "&controlFILE;" 2> /dev/null | xargs rm 2> /dev/null if [ "x86_64" == "$ARCHTYPE" ]; then find /boot/config/plugins/&name;/&name;-PhAzE-Dependency* -type f -not -name "&dependencyFILE64;" 2> /dev/null | xargs rm 2> /dev/null find /boot/config/plugins/&name;/Mono-PhAzE* -type f -not -name "&monoFILE64;" 2> /dev/null | xargs rm 2> /dev/null else find /boot/config/plugins/&name;/&name;-PhAzE-Dependency* -type f -not -name "&dependencyFILE;" 2> /dev/null | xargs rm 2> /dev/null find /boot/config/plugins/&name;/Mono-PhAzE* -type f -not -name "&monoFILE;" 2> /dev/null | xargs rm 2> /dev/null fi # ============================================== # The 'install' script # ============================================== app_logger "Running install script for &displayName; " info all # Verify the elements in the plugin default config file, add any that are missing if [ ! -f "$CFGFILE" ]; then mkdir -p "/boot/config/plugins/&name;" app_logger "Creating default plugin config file " info log echo "# &displayName; configuration:" > "$CFGFILE" fi app_logger "Verifying plugin config file elements " info log [ ! `cat "$CFGFILE" | grep SERVICE` ] && echo "SERVICE=\"disable\"" >> "$CFGFILE" [ ! `cat "$CFGFILE" | grep INSTALLDIR` ] && echo "INSTALLDIR=\"/usr/local/&name;\"" >> "$CFGFILE" [ ! `cat "$CFGFILE" | grep CONFIGDIR` ] && echo "CONFIGDIR=\"/usr/local/&name;/AppData\"" >> "$CFGFILE" [ ! `cat "$CFGFILE" | grep USESSL` ] && echo "USESSL=\"no\"" >> "$CFGFILE" [ ! `cat "$CFGFILE" | grep ^PORT` ] && echo "PORT=\"8989\"" >> "$CFGFILE" [ ! `cat "$CFGFILE" | grep SSLPORT` ] && echo "SSLPORT=\"9898\"" >> "$CFGFILE" [ ! `cat "$CFGFILE" | grep URLBASE` ] && echo "URLBASE=\"\"" >> "$CFGFILE" [ ! `cat "$CFGFILE" | grep RUNAS` ] && echo "RUNAS=\"nobody\"" >> "$CFGFILE" [ ! `cat "$CFGFILE" | grep BRANCH` ] && echo "BRANCH=\"master\"" >> "$CFGFILE" [ ! `cat "$CFGFILE" | grep REPO` ] && echo "REPO=\"&appURL;\"" >> "$CFGFILE" [ ! `cat "$CFGFILE" | grep PLG_STORAGESIZE` ] && echo "PLG_STORAGESIZE=\"yes\"" >> "$CFGFILE" [ ! `cat "$CFGFILE" | grep PLG_DATACHECK` ] && echo "PLG_DATACHECK=\"yes\"" >> "$CFGFILE" [ ! `cat "$CFGFILE" | grep CHECKONLINE` ] && echo "CHECKONLINE=\"yes\"" >> "$CFGFILE" # Force update REPO if it has changed from old plugin versions but only if old one was found TESTREPO=`cat "$CFGFILE" | grep 'REPO=' | sed -n 's!REPO="\(.*\)"!\1!p'` [ "$TESTREPO" == "http://update.nzbdrone.com/repos/apt/debian" ] && sed -i "s!REPO=\".*\"!REPO=\"&appURL;\"!g" "$CFGFILE" [ "$TESTREPO" == "http://update.nzbdrone.com/v2" ] && sed -i "s!REPO=\".*\"!REPO=\"&appURL;\"!g" "$CFGFILE" sed -i 's!\r!!g' "$CFGFILE" app_logger "Verification OK! " info log # Extract and install the plugin support files from the tar.gz file app_logger "Installing control file " info all if [ -f "$CTRLFILES" ]; then mkdir -p "/tmp/&name;-inst" TEMP1="/tmp/&name;-inst/usr/local/emhttp/plugins/&name;" tar -xf "$CTRLFILES" -C "/tmp/&name;-inst" if [ "x86_64" == "$ARCHTYPE" ]; then echo "---" >> "${TEMP1}/&name;.page" echo "<?php include '/usr/local/emhttp/plugins/&name;/styles/&name;6.css';?>" >> "${TEMP1}/&name;.page" echo "<?php include '/usr/local/emhttp/plugins/&name;/include/&name;.php';?>" >> "${TEMP1}/&name;.page" else echo "<?php include '/usr/local/emhttp/plugins/&name;/styles/&name;5.css';?>" > "${TEMP1}/&name;.php" echo "<?php include '/usr/local/emhttp/plugins/&name;/include/&name;.php';?>" >> "${TEMP1}/&name;.php" fi cp -Raf "/tmp/&name;-inst/." / [ -e "/etc/rc.d/rc.&name;" ] && rm -f "/etc/rc.d/rc.&name;" ln -s "/usr/local/emhttp/plugins/&name;/scripts/rc.&name;" "/etc/rc.d/rc.&name;" else app_logger "Install failed: Control file not found " error all rm -f "/tmp/&name;-script" exit 1 fi app_logger "Control file install OK! " info all # Correct any ^M (Windows carriage characters) in the important files app_logger "Removing Windows carriage characters from important files " info log [ -f "/usr/local/emhttp/plugins/&name;/scripts/rc.&name;" ] && sed -i 's!\r!!g' "/usr/local/emhttp/plugins/&name;/scripts/rc.&name;" [ -d "/usr/local/emhttp/plugins/&name;/event" ] && sed -i 's!\r!!g' /usr/local/emhttp/plugins/&name;/event/* # Remove the temp install folder app_logger "Cleaning up temp files and folders" info all rm -Rf "/tmp/&name;-inst" # If plugin already exists and is a different version, make it .old for downgrade purposes if [ -f "/boot/config/plugins/&name;.plg" ]; then CURPLGVER=`grep 'ENTITY plgVersion' "/boot/config/plugins/&name;.plg" | sed -n 's!.*\t"\(.*\)">.*!\1!p'` if [ "$CURPLGVER" != "&plgVersion;" ]; then app_logger "Creating downgrade plugin file with old plugin" info log [ -f "/boot/config/plugins/&name;.plg.old" ] && rm -f "/boot/config/plugins/&name;.plg.old" cp -f "/boot/config/plugins/&name;.plg" "/boot/config/plugins/&name;.plg.old" fi fi app_logger "************************** " info log app_logger "Install complete!" info all app_logger "************************** " info log rm -f "/tmp/&name;-script" # ============================================== # The 'remove' script # ============================================== app_logger() { # First passed item is the text ($1), secone item is severity ($2 - info, warn, error), third is where to log ($3 - all, log) local PLGLOGFILE="/var/log/PhAzE-Logs/&name;.log" local LOGTEXT=$1 local LOGTYPE=$2 local LOGVAR=$3 local TIMESTAMP=`date +"%Y-%m-%d %T"` # Set the type of log if [ "$LOGTYPE" == "info" ]; then TYPE="[INFO]" elif [ "$LOGTYPE" == "warn" ]; then TYPE="[WARNING]" elif [ "$LOGTYPE" == "error" ]; then TYPE="[ERROR]" fi # If log file doesn't exist, make it if [ ! -f "$PLGLOGFILE" ]; then mkdir -p "/var/log/PhAzE-Logs" touch "$PLGLOGFILE" fi # Echo the text to display and log, or just log file if [ "$LOGVAR" == "all" ]; then echo -e "${LOGTEXT}" echo -e "${TIMESTAMP} ${TYPE}\t${LOGTEXT}" >> "$PLGLOGFILE" elif [ "$LOGVAR" == "log" ]; then echo -e "${TIMESTAMP} ${TYPE}\t${LOGTEXT}" >> "$PLGLOGFILE" fi } # Get the arch type to see what version of unraid is running ARCHTYPE=$( /usr/bin/uname -m ) if [ "x86_64" == "$ARCHTYPE" ]; then # Stop the app if the control file exists [ -f "/usr/local/emhttp/plugins/&name;/scripts/rc.&name;" ] && /usr/local/emhttp/plugins/&name;/scripts/rc.&name; stop app_logger "Uninstalling &displayName; plugin..." info all sleep 1 # Check for cache drive and make sure its an actual disk drive PHAZECOMMON="/usr/local/PhAzE-Common" COMMONCHECK="" [ -f "/usr/local/emhttp/plugins/&name;/scripts/rc.&name;" ] && COMMONCHECK=`/usr/local/emhttp/plugins/&name;/scripts/rc.&name; checkcache` [ "$COMMONCHECK" == "true" ] && PHAZECOMMON="/mnt/cache/.PhAzE-Common" # Remove all files and directories pertaining to this plugin [ -d "${PHAZECOMMON}/&name;" ] && rm -fR "${PHAZECOMMON}/&name;" [ "$(find ${PHAZECOMMON} -type f | grep startcfg.sh | wc -l 2> /dev/null)" == "0" ] && rm -Rf "${PHAZECOMMON}" TESTPLG=`grep -H -m1 "ENTITY author" /boot/config/plugins/*.plg 2> /dev/null | grep "PhAzE" | cut -d: -f1 | grep -v "&name;.plg" | wc -l 2> /dev/null` if [ "$TESTPLG" == "0" ]; then [ -f "/usr/local/emhttp/plugins/webGui/PhAzE.page" ] && rm -f "/usr/local/emhttp/plugins/webGui/PhAzE.page" [ -f "/usr/local/emhttp/plugins/webGui/icons/Phaze.png" ] && rm -f "/usr/local/emhttp/plugins/webGui/icons/Phaze.png" fi [ -d "/usr/local/emhttp/plugins/&name;" ] && rm -fR "/usr/local/emhttp/plugins/&name;" [ -e "/etc/rc.d/rc.&name;" ] && rm -f "/etc/rc.d/rc.&name;" [ -f "/usr/bin/&name;-env" ] && rm -f "/usr/bin/&name;-env" [ -f "/var/log/plugins/&name;.plg" ] && rm -f "/var/log/plugins/&name;.plg" [ -d "/boot/config/plugins/&name;" ] && rm -fR "/boot/config/plugins/&name;" [ -f "/boot/config/plugins/&name;.plg.old" ] && rm -f "/boot/config/plugins/&name;.plg.old" if [ "x86_64" != "$ARCHTYPE" ]; then [ -f "/boot/config/plugins/&name;.plg" ] && rm -f "/boot/config/plugins/&name;.plg" fi app_logger "************************** " info log app_logger "Uninstall complete - Reboot to remove remaining dependency files " info all app_logger "************************** " info log sleep 1 fi [ -f "/tmp/&name;-remove" ] && rm -f "/tmp/&name;-remove"