├── mage-bundle.sh ├── mage-dbdump.sh ├── mage-dbpurge.sh ├── mage-install.sh ├── mage-scanner.sh └── mage-watch.sh /mage-bundle.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PWD=$(pwd) 4 | KEY=$(wget -qO - http://pwgen.sonassi.com) 5 | FILENAME="http_$KEY.tgz" 6 | EXCLUDES=( "./var/log/*" "./var/cache/*" "./var/session/*" "./var/*port/*" "./var/tmp/*" "./media" "./errors/*" "./export/*" "./.git" "*.tar" "*.tgz" "*.gz" "*.bz2" "*.zip" "*.sql" "*.pdf" "*.mp3" "*.mp4" "*.mov" "*.avi" "./app/etc/local.xml" "./$FILENAME" ) 7 | 8 | echo -n "Please confirm you want to bundle ($PWD) [y/N]: " 9 | read CONFIRM 10 | [[ ! "$CONFIRM" == "y" ]] && exit 1 11 | 12 | function build_excludes() 13 | { 14 | EXCLUDES_ALL="" 15 | for EXCLUDE in "${EXCLUDES[@]}"; do 16 | EXCLUDES_ALL="--exclude=$EXCLUDE $EXCLUDES_ALL" 17 | done 18 | echo $EXCLUDES_ALL 19 | } 20 | 21 | wget sys.sonassi.com/mage-dbdump.sh 22 | bash mage-dbdump.sh 23 | tar chvfz $PWD/$FILENAME $(build_excludes) . var/db.sql 24 | 25 | cat << EOF 26 | ####################################### 27 | 28 | MYSQL DUMP & TAR COMPLETE 29 | 30 | Backup Location: $FILENAME 31 | 32 | ######################################## 33 | EOF 34 | 35 | cat < prompt 39 | -c Clean log and index tables 40 | 41 | EOF 42 | } 43 | 44 | function error() 45 | { 46 | echo -e "Error: $1" 47 | [[ ! "$2" == "noexit" ]] && exit 1 48 | } 49 | 50 | function getParam() 51 | { 52 | RETVAL=$(grep -Eoh "<$1>()?<\/$1>" $TMP_FILE | sed "s#<$1><\/$1>##g") 53 | if [[ "$2" == "sanitise" ]]; then 54 | RETVAL=$(echo "$RETVAL" | sed 's/"/\\\"/g') 55 | fi 56 | echo -e "$RETVAL" 57 | } 58 | 59 | function compress() 60 | { 61 | while read DATA; do 62 | [[ ! "$OPT_z" == "" ]] && (echo "$DATA" | $GZIP_CMD -) || echo "$DATA" 63 | done 64 | } 65 | 66 | function mysqldumpit() 67 | { 68 | 69 | if [[ "$OPT_f" == "" ]]; then 70 | [[ ! "$OPT_A" == "" ]] && IGNORE_TABLES=( ${IGNORE_TABLES[@]} ${IGNORE_TABLES_AGGRESSIVE[@]} ) 71 | [[ ! "$OPT_B" == "" ]] && IGNORE_TABLES=( ${IGNORE_TABLES[@]} $OPT_B ) 72 | for TABLE in "${IGNORE_TABLES[@]}"; do 73 | IGNORE_STRING="$IGNORE_STRING --ignore-table=$DBNAME.$TABLE_PREFIX$TABLE" 74 | done 75 | fi 76 | 77 | # We use --single-transaction in favour of --lock-tables=false , its slower, but less potential for unreliable dumps 78 | echo "SET SESSION sql_mode='NO_AUTO_VALUE_ON_ZERO';" 79 | ( mysqldump -p"$DBPASS" $MYSQL_ARGS --no-data --routines --triggers --single-transaction; \ 80 | mysqldump -p"$DBPASS" $MYSQL_ARGS $IGNORE_STRING --no-create-db --single-transaction ) | sed 's/DEFINER=[^*]*\*/\*/g' 81 | } 82 | 83 | function question() 84 | { 85 | [[ ! "$OPT_F" == "" ]] && return 0 86 | echo -n "$1 [y/N]: " 87 | read CONFIRM 88 | [[ "$CONFIRM" == "y" ]] || [[ "$CONFIRM" == "Y" ]] && return 0 89 | return 1 90 | } 91 | 92 | function message() 93 | { 94 | STRIP=$(for i in {1..38}; do echo -n "#"; done) 95 | echo -e "$STRIP\n$1\n$STRIP" 96 | } 97 | 98 | function banner() 99 | { 100 | cat </dev/null 2>&1 148 | [ $? -eq 0 ] && TMP_FILE=$(mktemp ./var/local.xml.XXXXX) || TMP_FILE="./var/.tmp.local.xml" 149 | sed -ne '/default_setup/,/\/default_setup/p' $CONFIG_FILE > $TMP_FILE 150 | 151 | which pigz >/dev/null 2>&1 152 | [ $? -eq 0 ] && GZIP_CMD="pigz" || GZIP_CMD="gzip" 153 | 154 | IGNORE_STRING="" 155 | DBHOST=$(getParam "host") 156 | DBUSER=$(getParam "username") 157 | DBPASS=$(getParam "password" "sanitise" ) 158 | DBNAME=$(getParam "dbname") 159 | TABLE_PREFIX=$(getParam "table_prefix") 160 | [ -f $TMP_FILE ] && rm $TMP_FILE 161 | [[ ! "$OPT_z" == "" ]] && DUMP_FILE="$DUMP_FILE"".gz" 162 | 163 | MYSQL_ARGS="-f -h $DBHOST -u $DBUSER $DBNAME" 164 | [[ ! "$OPT_e" == "" ]] && MYSQL_ARGS="$MYSQL_ARGS --extended-insert=FALSE --complete-insert=TRUE" 165 | 166 | if [[ ! "$OPT_r" == "" ]]; then 167 | 168 | [ ! -f "$DUMP_FILE" ] && error "SQL file does not exist" 169 | question "Are you sure you want to restore $DUMP_FILE to $DBNAME?" 170 | if [ $? -eq 0 ]; then 171 | [[ ! "$OPT_z" == "" ]] && $GZIP_CMD -d <$DUMP_FILE | mysql $MYSQL_ARGS -p"$DBPASS" || mysql $MYSQL_ARGS -p"$DBPASS" <$DUMP_FILE 172 | message "MYSQL IMPORT COMPLETE" 173 | banner 174 | fi 175 | exit 0 176 | 177 | elif [[ ! "$OPT_c" == "" ]]; then 178 | 179 | for TABLE in ${TRUNCATE_TABLES[@]}; do 180 | echo "Cleaning $TABLE ..." 181 | mysql $MYSQL_ARGS -p"$DBPASS" -e "TRUNCATE ${TABLE_PREFIX}$TABLE" 182 | done 183 | 184 | elif [[ ! "$OPT_i" == "" ]]; then 185 | 186 | mysql $MYSQL_ARGS -p"$DBPASS" 187 | 188 | elif [[ ! "$OPT_d" == "" ]]; then 189 | 190 | [[ ! "$OPT_z" == "" ]] && mysqldumpit | $GZIP_CMD > $DUMP_FILE || mysqldumpit > $DUMP_FILE 191 | message "MYSQL DUMP COMPLETE" 192 | exit 0 193 | 194 | fi 195 | -------------------------------------------------------------------------------- /mage-dbpurge.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | CONFIG_FILE="./app/etc/local.xml" 4 | TMP_FILE="./var/.tmp.local.xml" 5 | DUMP_STRING="" 6 | 7 | if [ ! -f "$CONFIG_FILE" ]; then 8 | echo "$CONFIG_FILE does not exist" 9 | exit 10 | fi 11 | 12 | sed -ne '/default_setup/,/\/default_setup/p' $CONFIG_FILE > $TMP_FILE 13 | 14 | function getParam() 15 | { 16 | RETVAL=$(grep -Eoh "<$1>()?<\/$1>" $TMP_FILE | sed "s#<$1><\/$1>##g") 17 | if [[ "$2" == "sanitise" ]]; then 18 | RETVAL=$(echo "$RETVAL" | sed 's/"/\\\"/g') 19 | fi 20 | echo -e "$RETVAL" 21 | } 22 | 23 | 24 | DBHOST=$(getParam "host") 25 | DBUSER=$(getParam "username") 26 | DBPASS=$(getParam "password" "sanitise" ) 27 | DBNAME=$(getParam "dbname") 28 | TABLE_PREFIX=$(getParam "table_prefix") 29 | 30 | [ -f $TMP_FILE ] && rm $TMP_FILE 31 | 32 | echo "The database selected is: $DBNAME" 33 | echo -n "Are you sure you want to purge? [y/N]: " 34 | read CONFIRM; if [[ ! "$CONFIRM" == "y" ]]; then echo "You dodged a bullet there!"; exit; fi 35 | 36 | echo -n "Last chance, are you 110% sure you want to purge $DBNAME? [y/N]: " 37 | read CONFIRM; if [[ ! "$CONFIRM" == "y" ]]; then echo "You dodged a bullet there!"; exit; fi 38 | 39 | TABLES=( $(mysql -h$DBHOST -u$DBUSER -p"$DBPASS" $DBNAME -e 'show tables' | awk '{ print $1}' | grep -v '^Tables' ) ) 40 | 41 | for TABLE in ${TABLES[@]}; do 42 | DUMP_STRING="SET FOREIGN_KEY_CHECKS=0; DROP VIEW $TABLE; SET FOREIGN_KEY_CHECKS=1;" 43 | mysql --force -h"$DBHOST" -u"$DBUSER" -p"$DBPASS" $DBNAME -e "$DUMP_STRING" 44 | DUMP_STRING="SET FOREIGN_KEY_CHECKS=0; DROP TABLE $TABLE; SET FOREIGN_KEY_CHECKS=1;" 45 | mysql --force -h"$DBHOST" -u"$DBUSER" -p"$DBPASS" $DBNAME -e "$DUMP_STRING" 46 | done 47 | 48 | cat <&1 | grep -q "Remote file exists" && return 0 39 | return 1 40 | } 41 | 42 | function download_magento() 43 | { 44 | URL="${MAGENTO_REPO}/archive/${RELEASE}.tar.gz" 45 | if ! check_existence $URL ; then 46 | echo "Error: Magento version ${RELEASE} could not be found" 47 | exit 1 48 | fi 49 | wget --no-check-certificate -qO latest-magento.tar.gz "${URL}" 50 | } 51 | 52 | function download_sample_data() 53 | { 54 | URL="${SAMPLE_DATA_REPO}/archive/${SAMPLE_DATA_VERSION}.tar.gz" 55 | if ! check_existence $URL ; then 56 | echo "Error: Magento sample data ${SAMPLE_DATA_VERSION} could not be found" 57 | exit 1 58 | fi 59 | wget --no-check-certificate -qO latest-sample-data.tar.gz "${URL}" 60 | } 61 | 62 | DOWNLOAD_ONLY=0 63 | SAMPLE_DATA=0 64 | FORCE=0 65 | MAGENTO_REPO="https://github.com/sonassi/magento-ce" 66 | SAMPLE_DATA_REPO="https://github.com/sonassi/magento-sample-data" 67 | RELEASE= 68 | DBHOST= 69 | DBUSER= 70 | DBNAME= 71 | DBPASS= 72 | STORE_URL= 73 | ADMIN_EMAIL= 74 | 75 | while getopts "r:e:w:l:n:p:u:dshf" OPTION; do 76 | case $OPTION in 77 | d) 78 | DOWNLOAD_ONLY=1 79 | ;; 80 | r) 81 | RELEASE="$OPTARG" 82 | ;; 83 | l) 84 | DBHOST="$OPTARG" 85 | ;; 86 | u) 87 | DBUSER="$OPTARG" 88 | ;; 89 | n) 90 | DBNAME="$OPTARG" 91 | ;; 92 | p) 93 | DBPASS="$OPTARG" 94 | ;; 95 | w) 96 | STORE_URL="$OPTARG" 97 | ;; 98 | e) 99 | ADMIN_EMAIL="$OPTARG" 100 | ;; 101 | s) 102 | SAMPLE_DATA=1 103 | ;; 104 | f) 105 | FORCE=1 106 | ;; 107 | h) 108 | usage 109 | esac 110 | done 111 | 112 | MYSQL_CONNECT="-h$DBHOST -u$DBUSER -p$DBPASS" 113 | 114 | if [ $DOWNLOAD_ONLY -eq 1 ] && [[ ! "$RELEASE" == "" ]]; then 115 | echo "Downloading Magento ${RELEASE} ..." 116 | download_magento 117 | exit 0 118 | fi 119 | 120 | if [[ "$RELEASE" == "" ]] || 121 | [[ "$DBHOST" == "" ]] 122 | [[ "$DBUSER" == "" ]] 123 | [[ "$DBPASS" == "" ]] 124 | [[ "$DBNAME" == "" ]]; then 125 | echo "Error: Insufficient arguments provided" 126 | exit 1 127 | fi 128 | 129 | # Work out what version of sample data we need 130 | if [[ $RELEASE > 1.9.0.0 ]] || [[ "$RELEASE" == "1.9.0.0" ]]; then 131 | SAMPLE_DATA_VERSION="1.9.0.0-lite" 132 | elif [[ $RELEASE > 1.6.1.0 ]] || [[ "$RELEASE" == "1.6.1.0" ]]; then 133 | SAMPLE_DATA_VERSION="1.6.1.0" 134 | else 135 | SAMPLE_DATA_VERSION="1.2.0" 136 | fi 137 | 138 | # Sanity check MySQL works 139 | MYSQL_VERSION=$(mysql $MYSQL_CONNECT -Nsre "SHOW VARIABLES LIKE 'version';" 2>&1 | grep -Eohm1 '([0-9.]+|ERROR)') 140 | if [[ "$MYSQL_VERSION" == "ERROR"* ]]; then 141 | echo "Error: Could not establish a database connection" 142 | exit 1 143 | fi 144 | 145 | # If MySQL is <5.1 then use a modified version of the sample data 146 | if [[ $MYSQL_VERSION < 5.1 ]] && [[ $SAMPLE_DATA_VERSION == "1.6.1.0" ]] && [ $SAMPLE_DATA -eq 1 ]; then 147 | SAMPLE_DATA_VERSION="${SAMPLE_DATA_VERSION}-fix" 148 | fi 149 | 150 | CURRENT_DIR=$(pwd) 151 | ADMIN_PASS=$(wget -qO- http://pwgen.sonassi.com) 152 | 153 | [ $FORCE -eq 0 ] && read -p "Do you really want to install in $CURRENT_DIR [y/N]: " ANSWER 154 | [[ ! "$ANSWER" == "y" ]] && [ $FORCE -eq 0 ] && exit 1 155 | 156 | echo -e "\nStarting installation, please wait\n" 157 | 158 | # Download Magento 159 | echo -n " >> Downloading Magento $RELEASE ..." 160 | [ -f latest-magento.tar.gz ] || download_magento 161 | ( 162 | tar zxf latest-magento.tar.gz 163 | rsync -a magento-ce-$RELEASE/ $CURRENT_DIR/ --exclude="magento-ce-$RELEASE" 164 | ) & 165 | 166 | # Download sample data 167 | if [ $SAMPLE_DATA -eq 1 ]; then 168 | [ -f latest-sample-data.tar.gz ] || download_sample_data 169 | ( 170 | tar zxf latest-sample-data.tar.gz 171 | rsync -a magento-sample-data-$SAMPLE_DATA_VERSION/media/ $CURRENT_DIR/media/ 172 | mv magento-sample-data-$SAMPLE_DATA_VERSION/*.sql $CURRENT_DIR/data.sql 173 | ) & 174 | fi 175 | 176 | wait 177 | echo " Done" 178 | 179 | chmod -R 775 $CURRENT_DIR 180 | 181 | if [ $SAMPLE_DATA -eq 1 ]; then 182 | echo -n " >> Importing sample data ..." 183 | mysql $MYSQL_CONNECT $DBNAME < data.sql 184 | echo "Done" 185 | fi 186 | 187 | echo -n " >> Setting up Mage ..." 188 | if [[ $RELEASE > 1.5 ]]; then 189 | ./mage mage-setup . >/dev/null 2>&1 190 | else 191 | ./pear mage-setup . >/dev/null 2>&1 192 | ./pear install magento-core/Mage_All_Latest-stable >/dev/null 2>&1 193 | fi 194 | echo " Done" 195 | 196 | echo -n " >> Cleaning up ..." 197 | rm -rf $CURRENT_DIR/magento-ce-$RELEASE \ 198 | $CURRENT_DIR/latest-magento.tar.gz \ 199 | $CURRENT_DIR/magento-sample-data-$SAMPLE_DATA_VERSION \ 200 | $CURRENT_DIR/latest-sample-data.tar.gz \ 201 | $CURRENT_DIR/data.sql \ 202 | $CURRENT_DIR/downloader/pearlib/cache/* \ 203 | $CURRENT_DIR/downloader/pearlib/download/* \ 204 | $CURRENT_DIR/mage-install.sh 205 | echo " Done" 206 | 207 | if [[ ! "$STORE_URL" == "" ]] && 208 | [[ ! "$ADMIN_EMAIL" == "" ]]; then 209 | 210 | echo -n " >> Installing Magento ..." 211 | php -f install.php -- \ 212 | --license_agreement_accepted "yes" \ 213 | --locale "en_GB" \ 214 | --timezone "Europe/London" \ 215 | --default_currency "GBP" \ 216 | --db_host "$DBHOST" \ 217 | --db_name "$DBNAME" \ 218 | --db_user "$DBUSER" \ 219 | --db_pass "$DBPASS" \ 220 | --url "$STORE_URL" \ 221 | --skip_url_validation \ 222 | --use_rewrites "yes" \ 223 | --use_secure "no" \ 224 | --secure_base_url "" \ 225 | --use_secure_admin "no" \ 226 | --admin_firstname "Admin" \ 227 | --admin_lastname "User" \ 228 | --admin_email "$ADMIN_EMAIL" \ 229 | --admin_username "$ADMIN_EMAIL" \ 230 | --admin_password "$ADMIN_PASS" 1>/dev/null 231 | echo " Done" 232 | 233 | echo -n " >> Removing admin notifications ..." 234 | mysql $MYSQL_CONNECT -e "DELETE FROM $DBNAME.adminnotification_inbox;" >/dev/null 2>&1 235 | echo " Done" 236 | 237 | if [ -f "/microcloud/scripts_ro/magerun_install.sh" ]; then 238 | echo -n " >> Installing magerun ..." 239 | /microcloud/scripts_ro/magerun_install.sh >/dev/null 2>&1 240 | . ~/.bash_profile 241 | mr_examplecom index:reindex:all >/dev/null 2>&1 242 | mr_examplecom cache:flush >/dev/null 2>&1 243 | echo "Done" 244 | fi 245 | 246 | cat > .credentials.cnf </dev/null 2>&1 10 | bash mage-install.sh -d -r $MAGE_VERSION 11 | tar zxf latest-magento.tar.gz 12 | 13 | # Disable the compiler 14 | [ -f "includes/config.php" ] && mv includes/config{.php,.disabled.php} 15 | 16 | # Look for common methods used to comprimise a Magento installation 17 | COMPRIMISE_METHODS="eval|ord|chr|gzflate|gzinflate|base64_encode|base64_decode" 18 | COMPRIMISE_METHODS_REV=$(echo "$COMPRIMISE_METHODS" | rev) 19 | SCAN_PATH="app lib" 20 | 21 | CORE_MODIFICATIONS=() 22 | MISSING_FROM_CORE=() 23 | 24 | while read FILE; do 25 | if [ ! -f "magento-ce-$MAGE_VERSION/$FILE" ]; then 26 | MISSING_FROM_CORE+=( "$FILE" ) 27 | else 28 | diff --brief -bB "$FILE" "magento-ce-$MAGE_VERSION/$FILE" >/dev/null 2>&1 || CORE_MODIFICATIONS+=( "$FILE" ) 29 | fi 30 | done < <(grep -lirE "($COMPRIMISE_METHODS|$COMPRIMISE_METHODS_REV|strrev)([\t\n\r ]+)?\(" $SCAN_PATH) 31 | 32 | if [ ${#MISSING_FROM_CORE[@]} -gt 0 ]; then 33 | cat < /dev/null 2>&1; IMGOPT=$? 98 | COMPASS_BIN='/var/lib/gems/1.9.1/bin/compass' 99 | QUALITY=90 100 | #SHARPEN="-unsharp 0x1" 101 | RESIZE_METHOD="-resize" 102 | HOLD=0 103 | 104 | function download_resize_image() 105 | { 106 | image_args "$1" 107 | [ -f "$NEW_FILE" ] && convert "$NEW_FILE" -quality $QUALITY $SHARPEN $RESIZE_METHOD "$SIZE" "$FILE" 108 | echo convert "$NEW_FILE" -quality $QUALITY $SHARPEN $RESIZE_METHOD "$SIZE" "$FILE" 109 | optimise_image "$FILE" 110 | exit 0 111 | } 112 | 113 | function upload_resize_image() 114 | { 115 | echo "$1" | grep -E "@[+-][0-5-]+x" > /dev/null 2>&1 116 | [ $? -eq 0 ] && echo -e "\e[00;31musage error\e[00m you shouldn't upload a file with the +/- syntax, this is only for browsers" && exit 0 117 | 118 | echo "$1" | grep -E "@[0-5-]+x" > /dev/null 2>&1 119 | [ ! $? -eq 0 ] && return 120 | 121 | MV_FILE=$(echo "$1" | sed -E "s#@([0-5])#@+\1#g") 122 | track_image "$MV_FILE" 123 | mv "$1" "$MV_FILE" 124 | optimise_image "$MV_FILE" 125 | image_args "$MV_FILE" invert 126 | convert "$FILE" -quality $QUALITY $SHARPEN $RESIZE_METHOD "$SIZE" "$NEW_FILE" 127 | echo -e "\e[01;36mresizing\e[00m " $(basename $NEW_FILE) "to $SIZE" 128 | track_image "$NEW_FILE" 129 | } 130 | 131 | function image_args() 132 | { 133 | FILE="$1" 134 | FILENAME=$(basename $FILE) 135 | 136 | I_QUALITY=$(echo $FILENAME | grep -Eoh "q=[0-9]([0-9])?\." | sed "s#q=##g;s#\.##g") 137 | QUALITY=${I_QUALITY:-$QUALITY} 138 | 139 | MULTIPLIER=$(echo "$FILENAME" | grep -Eoh "@[-+][0-5](.[0-9])?x") 140 | DIMENSIONS=$(echo "$FILENAME" | grep -Eoh "@[0-9]+x[0-9]+") 141 | 142 | if [[ ! "$MULTIPLIER" == "" ]]; then 143 | RATIO=$(echo $MULTIPLIER | sed -e "s#^@##g;s#^-##g;s#^\+##g;s#x\$##g") 144 | SIZE=$(echo "100/$RATIO" | bc) 145 | NEW_FILE=$(echo "$FILE" | sed "s#$MULTIPLIER##g;s#q=$I_QUALITY.#.#g") 146 | echo "$FILENAME" | grep -Eoh "@[+][0-5]x" > /dev/null 2>&1 147 | [ $? -eq 0 ] && [[ ! "$2" == "invert" ]] && RESIZE_METHOD="-adaptive-resize" && SIZE=$((100*$RATIO)) 148 | SIZE="$SIZE%" 149 | return 150 | elif [[ ! "DIMENSIONS" == "" ]]; then 151 | SIZE=$(echo "$FILE" | grep -Eoh "[0-9]+x[0-9]+") 152 | NEW_FILE=$(echo "$FILE" | sed "s#$DIMENSIONS##g;s#q=$I_QUALITY.#.#g") 153 | return 154 | fi 155 | exit 0 156 | } 157 | 158 | function watch_compass() 159 | { 160 | COMPASS_DIR="$1" 161 | #$compass watch $COMPASS_DIR/../ 162 | ( inotifywait -q -r -m -e modify "$COMPASS_DIR" --format "%w %f %e" ) | while read DIR FILENAME EVENT; do 163 | $COMPASS_BIN compile $COMPASS_DIR/../ 164 | done 165 | } 166 | 167 | function image_key() 168 | { 169 | KEY=$(echo "$1" | md5sum - | cut -f"1" -d" ") 170 | echo "K_$KEY" 171 | } 172 | 173 | function track_image() 174 | { 175 | [[ "$TRACK_LOG" == "" ]] && return 176 | KEY=$(image_key "$1") 177 | OFFSET=${2:-7200} 178 | VAL=$(( $(date +%s) + $OFFSET )) 179 | sed -i "/$KEY*/d" $TRACK_LOG 180 | echo "$KEY $VAL" >> $TRACK_LOG 181 | } 182 | 183 | function optimise_image() 184 | { 185 | [ ! $IMGOPT -eq 0 ] && return 186 | IMG=$( imgopt "$1" 2> /dev/null | sed -e "s#^$DIR##g" ) 187 | echo -e "\e[01;35moptimising\e[00m $IMG" 188 | track_image "$1" 5 189 | } 190 | 191 | function loop_prevent() 192 | { 193 | KEY=$(image_key "$1") 194 | VAL=$(sed -n "/$KEY/p" $TRACK_LOG | cut -f2 -d" ") 195 | VAL=${VAL:-0} 196 | CURRENT_TIME=$(date +%s) 197 | [ $CURRENT_TIME -gt $VAL ] && return 0 198 | return 1 199 | } 200 | 201 | function watch_images() 202 | { 203 | IMAGE_DIR="$1" 204 | 205 | # Image actions 206 | if [ -d "$IMAGE_DIR" ]; then 207 | ( inotifywait -q -r -m -e close_write "$IMAGE_DIR" --format "%w %f %e" --exclude "tmp\." ) | while read DIR FILENAME EVENT; do 208 | local FILE="$DIR$FILENAME" 209 | loop_prevent "$FILE" 210 | [ ! $? -eq 0 ] && continue 211 | track_image "$FILE" 212 | upload_resize_image "$FILE" & 213 | 214 | echo "$FILE" | grep -E "@[0-5-]+x" > /dev/null 2>&1 215 | [ ! $? -eq 0 ] && optimise_image "$FILE" & 216 | done 217 | fi 218 | } 219 | 220 | while getopts "q:c:i:d:ow" OPTION; do 221 | case $OPTION in 222 | \?) 223 | usage 224 | exit 225 | ;; 226 | q) 227 | QUALITY=$OPTARG 228 | ;; 229 | d) 230 | download_resize_image "$OPTARG" 231 | exit 0 232 | ;; 233 | o) 234 | [[ ! "$OPT_i" == "" ]] && [ $IMGOPT -eq 0 ] && imgopt $OPT_i 235 | exit 0 236 | ;; 237 | c) 238 | watch_compass "$OPTARG/sass" & 239 | HOLD=1 240 | ;; 241 | w) 242 | TRACK_LOG=`mktemp -t tmp.XXXXXX` || return 1 243 | [[ ! "$OPT_i" == "" ]] && watch_images "$OPT_i" & 244 | HOLD=1 245 | ;; 246 | *) 247 | [[ "$OPTARG" == "" ]] && OPTARG='"-'$OPTION' 1"' 248 | OPTION="OPT_$OPTION" 249 | eval ${OPTION}=$OPTARG 250 | ;; 251 | esac 252 | done 253 | 254 | [ $# -lt 1 ] && usage 255 | 256 | if [ $HOLD -eq 1 ]; then 257 | trap '{ echo "Closing monitor" ; rm $TRACK_LOG; kill 0; exit 0; }' INT 258 | echo "Running in foreground. Press ctrl+c key to exit ..." 259 | while read LINE; do 260 | [[ "$LINE" == "q" ]] && break 261 | done 262 | fi 263 | --------------------------------------------------------------------------------