#!/bin/bash # Copyright: 2023 Virtuozzo International GmbH # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. inherit default exceptor os envinfo user-common; inherit extendperm; VERSION="1"; DEFAULT_ACTION="Usage"; DESCRIPTION="Module for import and export data and configs"; INCLUDE_LIST_FILE="/etc/jelastic/export.conf"; DESTINATION="/var/lib/jelastic/backup/export/"; EXPORT_CONFIGS="no"; EXPORT_DATA="no"; VCS_CONFIG_DIR="/var/lib/jelastic/vcs"; SSL_CONFIG_DIR="/var/lib/jelastic/SSL"; ROOT_CRON_CONFIG="/var/spool/cron/root"; HTTP_SERVICE="simplehttpd"; EXCLUDE_LIST="*.bak *.log *.swp *~ .bash_history .bash_profile /usr/java/* /var/lib/jelastic/backup/*"; EX_PORT=7979; SIMPLEHTTP_CONF="/usr/local/etc/simplehttp.ini" $PROGRAM 'tar'; function doUsage() { showUsageMessage; } function onModLoadCallback(){ local temp=`getopt -o c,d,e:,f:,p: -l configs,data,exportlist:,filename:,port: -- "$@" 2>>"$JEM_CALLS_LOG"` [[ $? != 0 ]] && die -q "Terminating..."; eval set -- "$temp" while true ; do case "${1}" in -c|--configs) EXPORT_CONFIGS="yes"; shift ;; -d|--data) EXPORT_DATA="yes"; shift ;; -e|--exportlist) EX_LIST_CMD="$2"; shift 2; ;; -f|--filename) EX_FILENAME="$2"; shift 2; ;; -p|--port) EX_PORT="$2"; shift 2; ;; --) shift; break; ;; esac; done; echo -e "[simplehttp]\nPORT=${EX_PORT}" > ${SIMPLEHTTP_CONF} return 0 } function describeRunParameters(){ echo "\n\t-e\t\t list of items for export"; echo "\t-c|--configs\t export config files"; echo "\t-d|--data\t export data files"; echo "\t-f|--filename\t file name"; echo "\t-p|--port\t port"; } function doRun() { if [ ! -z "$EX_FILENAME" ] ; then ARCH_FILE_NAME="${EX_FILENAME}.tar.gz"; else ARCH_FILE_NAME="`uuidgen`.tar.gz"; fi ARCH_FILE="${DESTINATION}/${ARCH_FILE_NAME}"; if [ "x$EXPORT_CONFIGS" == "xyes" ] ; then INCLUDE_LIST=""; if [ "x$COMPUTE_TYPE" == "xcartridge" ] ; then INCLUDE_LIST=`find /opt/repo/ -name "*.xml" -o -name "*.cfg" -o -name "*.yaml" -o -name "*.yml" -o -name "*.conf" 2>/dev/null` else [ -f "$INCLUDE_LIST_FILE" ] && { INCLUDE_LIST=`$GREP "${COMPUTE_TYPE} " "$INCLUDE_LIST_FILE" | $AWK '{print $2}' | $SED 's/\;/\n/g'` ; } [ -d "$VCS_CONFIG_DIR" ] && { INCLUDE_LIST="${INCLUDE_LIST}"$'\n'"${VCS_CONFIG_DIR}"; } [ -d "$SSL_CONFIG_DIR" ] && { INCLUDE_LIST="${INCLUDE_LIST}"$'\n'"${SSL_CONFIG_DIR}"; } [ -f "$ROOT_CRON_CONFIG" ] && { INCLUDE_LIST="${INCLUDE_LIST}"$'\n'"${ROOT_CRON_CONFIG}"; } if [[ $COMPUTE_TYPE =~ php$ ]] ; then [ -e /usr/lib64/php/modules ] && modDir=$(readlink -f /usr/lib64/php/modules); INCLUDE_LIST="${INCLUDE_LIST}"$'\n'"${modDir}" fi fi fi if [ ! -z "$EX_LIST_CMD" ] ; then OLDIFS=$IFS IFS=";" for el in $EX_LIST_CMD do INCLUDE_LIST="${INCLUDE_LIST}"$'\n'"${el}"; done IFS=$OLDIFS fi getAppUserInfo ; if [ "x$EXPORT_DATA" == "xyes" ]; then [ ! -z "$DB_DATA_DIR" ] && { INCLUDE_LIST="${INCLUDE_LIST}"$'\n'"${DB_DATA_DIR}"; } [ ! -z "$WEBROOT" ] && { INCLUDE_LIST="${INCLUDE_LIST}"$'\n'"${WEBROOT}"; } [ -d "$VCS_CONFIG_DIR" ] && { INCLUDE_LIST="${INCLUDE_LIST}"$'\n'"${VCS_CONFIG_DIR}"; } if [ "x$COMPUTE_TYPE" == "xcartridge" ] ; then INCLUDE_LIST="${INCLUDE_LIST}"$'\n'"${CARTRIDGE_HOME}"; else INCLUDE_LIST="${INCLUDE_LIST}"$'\n'"${_homedir}"; fi fi [ -z "$INCLUDE_LIST" ] && { echo "Empty export list" >> $ACTIONS_LOG; writeJSONResponseErr "result=>4040" "message=>Export failed" ; return 1; } INCLUDE_LIST="`echo "$INCLUDE_LIST"|sort|uniq`"; PID=$$; EXPORT_LIST_FILE=`mktemp /tmp/export3.${PID}XXXX 2>/dev/null`; exresult=$?; EXCLUDE_LIST_FILE=`mktemp /tmp/exclude3.${PID}XXXX 2>/dev/null`; excluderesult=$?; INCLUDE_LIST1="$INCLUDE_LIST"; while read line do line=$($SED 's/\//\\\//g' <<< $line); [ "x$line" == "x" ] && continue ; INCLUDE_LIST1=$($SED "/^$line.\+/d" <<< "$INCLUDE_LIST1"); done <<< "$INCLUDE_LIST" echo "$INCLUDE_LIST1" >> "$EXPORT_LIST_FILE"; echo "$EXCLUDE_LIST" >> "$EXCLUDE_LIST_FILE"; [ -z "${_homedir}" ] || echo "${_homedir}/.ssh/*" >> "$EXCLUDE_LIST_FILE"; [ ! -d "$DESTINATION" ] && { mkdir -p "$DESTINATION"; } TAR_OPTS=" --warning=none -P --ignore-failed-read" stopService ${SERVICE} > /dev/null 2>&1; $TAR ${TAR_OPTS} -zcvf "$ARCH_FILE" -T "$EXPORT_LIST_FILE" -X "$EXCLUDE_LIST_FILE" >/dev/null 2>>$ACTIONS_LOG arcresult=$?; startServiceSilent ${SERVICE} ; [ -f "$EXCLUDE_LIST_FILE" ] && rm -f "$EXCLUDE_LIST_FILE"; [ -f "$EXPORT_LIST_FILE" ] && rm -f "$EXPORT_LIST_FILE"; if [ $arcresult -eq 0 ] ; then if [ `$TAR -P -tf "$ARCH_FILE" | wc -l` -eq 0 ] ; then echo "Empty archive created" >> $ACTIONS_LOG ; writeJSONResponseErr "result=>4040" "message=>Export failed" ; else chown ${_UID}:${_GUID} -R "${DESTINATION}" 2>>"$JEM_CALLS_LOG"; restartServiceSilent ${HTTP_SERVICE} ; enableService ${HTTP_SERVICE} > /dev/null 2>&1; writeJSONResponseOut "result=>0" "message=>Exported successfully" "name=>${ARCH_FILE_NAME}" ; fi else writeJSONResponseErr "result=>4040" "message=>Export failed" ; return $arcresult ; fi return 0 ; } function describeRun() { echo "Run data export" ; } function postRunCallback(){ ExtendPerm ; } function doRemove() { if [ ! -z "$EX_FILENAME" ] ; then ARCH_FILE_NAME="${EX_FILENAME}"; else writeJSONResponseErr "result=>4038" "message=>Filename is required" ; return 1; fi ARCH_FILE="${DESTINATION}/${ARCH_FILE_NAME}"; if [ -f "$ARCH_FILE" ] ; then rm -rf "$ARCH_FILE"; writeJSONResponseOut "result=>0" "message=>Successfully" ; elif [ -f "$ARCH_FILE.tar.gz" ] ; then rm -rf "$ARCH_FILE.tar.gz"; writeJSONResponseOut "result=>0" "message=>Successfully" ; else writeJSONResponseErr "result=>4039" "message=>File not found" ; return 1; fi } function describeRemove() { echo "Remove exported file" ; } function describeRemoveParameters(){ echo "\n\t-f|--filename\t file name"; }