Адобе Екпериенце Манагер (АЕМ) пакети су неопевани хероји управљања садржајем — моћни контејнери који спајају све, од кода и конфигурација до критичног садржаја. Али хајде да се суочимо са тим: ручно креирање, конфигурисање и преузимање ових пакета може изгледати као досадан плес кликова.
Шта ако бисте могли да аутоматизујете овај процес са неколико притисака на тастере, обезбеђујући доследност, брзину, поузданост и мање подизање терета?
Показаћу вам Басх скрипту која преокреће скрипту (намера речи!) о томе како АЕМ програмери и администратори раде са АПИ менаџера пакета. Размислите о изради пакета за неколико секунди, кројењу филтера у ходу и прављењу резервних копија са хируршком прецизношћу — све пре него што се ваша кафа охлади до савршене температуре за испијање. ☕
Пре него што заронимо, кратка напомена : Овај чланак је детаљан , детаљно детаљан и технички без извињења. Размотрићемо логику скрипте, истражити замршености АЕМ АПИ-ја и решити ивичне случајеве. За програмере који желе да ускоче директно у код, можете скочити на дно чланка. Али ако сте овде да разумете како и зашто стоји иза аутоматизације, причврстите се – идемо скроз доле до зечје рупе. 🕳
create-remote-aem-pkg.sh
скрипта аутоматизује интеракције са АЕМ-овим АПИ менаџера пакета, нудећи структурирани приступ креирању, конфигурацији и дистрибуцији пакета. Дизајниран за програмере и администраторе, замењује ручне токове посла процесом вођеним командном линијом који наглашава доследност и поузданост.
/content/dam
, /apps
) које треба укључити у пакет.curl
./etc
или /apps
пре примене системских ажурирања. ./create-remote-aem-pkg.sh admin securepass123 localhost 4502 backup-group "Content Backup" /backups /content/dam /etc/clientlibs
Ова команда креира пакет под називом „Резервна копија садржаја“ у оквиру групе backup-group
, укључујући /content/dam
и /etc/clientlibs
, и чува излаз у директоријуму /backups
.
Хајде да сецирамо скрипту create-remote-aem-pkg.sh
(можете је пронаћи на дну чланка) да бисмо разумели како она организује управљање АЕМ пакетима. Фокусираћемо се на његову структуру, кључне функције и логику тока посла—идеално за програмере који желе да прилагоде или отклоне грешке у алату.
_log()
: Услужна функција која порукама ставља префикс са временским ознакама за јасне трагове ревизије. _log () { echo "[$(date +%Y.%m.%d-%H:%M:%S)] $1" }
Зашто је то важно : Обезбеђује да се свака радња (нпр. „Изграђен пакет“) евидентира у контексту, што поједностављује решавање проблема.
check_last_exec()
: Потврђује успех претходних команди провером излазних кодова и АПИ одговора. check_last_exec () { # Checks $? (exit status) and $CURL_OUTPUT for errors if [ "$status" -ne 0 ] || [[ $output =~ .*success\":false* ]]; then _log "Error detected!"; exit 1; fi }
Зашто је то важно : Спречава тихе грешке заустављањем извршавања критичних грешака као што су проблеми са аутентификацијом или неважеће путање.
Скрипта прихвата седам позиционих аргумената праћених динамичким филтерима:
USR="$1" # AEM username PWD="$2" # AEM password SVR="$3" # Server host (eg, localhost) PORT="$4" # Port (eg, 4502) PKG_GROUP="$5" # Package group (eg, "backups") PKG_NAME="$6" # Package name (eg, "dam-backup") BK_FOLDER="$7" # Backup directory (eg, "/backups") shift 7 # Remaining arguments become filters (eg, "/content/dam")
Позициони аргументи обезбеђују једноставност, док shift
флексибилно управља променљивим путањама филтера.
PKG_NAME
са доњим цртама да би се избегли проблеми са УРЛ-ом. PKG_NAME=${PKG_NAME// /_}
curl
за листање пакета преко АЕМ-овог АПИ-ја, избегавајући сувишне креације. if [ $(curl ... | grep "$PKG_NAME.zip" | wc -l) -eq 1 ]; then _log "Package exists—skipping creation." else curl -X POST ... # Creates the package fi
Конструише ЈСОН низ филтера од улазних путања:
FILTERS_PARAM="" for i in "${!FILTERS[@]}"; do FILTERS_PARAM+="{\"root\": \"${FILTERS[$i]}\", \"rules\": []}" # Adds commas between entries, but not after the last done
Пример излаза :
[{"root": "/content/dam"}, {"root": "/apps"}]
Овај ЈСОН се убацује у дефиницију пакета преко АЕМ-ове /crx/packmgr/update.jsp
крајње тачке.
build
: curl -X POST … -F "cmd=build"
Напомена : Скрипта чека да се изградња заврши пре него што настави.
curl
да преузме .zip
и сачува га са временским ознакама имена датотеке: BK_FILE="$PKG_NAME-$(date +%Y%m%d-%H%M%S).zip" curl -o "$BK_FOLDER/$BK_FILE" ...
Робусно руковање грешкама и евидентирање су критични за ненадзиране скрипте као што је create-remote-aem-pkg.sh
, обезбеђујући да се грешке рано ухвате и јасно евидентирају. Ево како скрипта штити од неочекиваних проблема и пружа корисне увиде.
_log
ставља префикс сваке поруке временском ознаком [YYYY.MM.DD-HH:MM:SS]
, стварајући ревизијски траг за отклањање грешака: _log "Starting backup process..." # Output: [2023.10.25-14:30:45] Starting backup process...
Зашто је то важно : Временске ознаке помажу у повезивању активности скрипте са евиденцијама АЕМ сервера или спољним догађајима (нпр. распореди црон послова).
Провере пре лета :
BK_FOLDER
) пре него што наставите: if [ ! -d "$BK_FOLDER" ]; then _log "Backup folder '$BK_FOLDER' does not exist!" && exit 1 fi
PKG_NAME
да би се избегли проблеми са УРЛ-ом (нпр. размаци замењени доњом цртом).
АПИ валидација одговора :
Функција check_last_exec
испитује оба излазна кода ( $?
) и АЕМ АПИ одговоре:
check_last_exec "Error message" "$CURL_OUTPUT" $CURL_STATUS
curl
на мрежи) покрећу тренутне излазе.
success\":false
ЈСОН одговоре или стрингове „ХТТП ГРЕШКА“ у АЕМ излазу.
3.3 ХТТП провера статуса : Приликом преузимања пакета, скрипта проверава статусни код 200
:
if [ "$(curl -w "%{http_code}" ...)" -eq "200" ]; then # Proceed if download succeeds else _log "Error downloading the package!" && exit 1 fi
check_last_exec
хвата 401 Unauthorized
одговоре и излази са јасном поруком о грешци.success:false
, скрипта бележи „Грешка при додавању филтера“ и завршава се.BK_FILE
, проверава величину датотеке са заставицом -s
и упозорава пре изласка.curl
излази са кодом који није нула, скрипта бележи „Грешка у изградњи пакета“.curl -k
ради једноставности, која прескаче ССЛ верификацију. Препорука за производњу : Замените са --cacert
да бисте навели ЦА пакет.
$AEM_PASSWORD
).set -x
на почетку скрипте да бисте одштампали извршене команде.curl
команди ван скрипте ./create-remote-aem-pkg.sh ... >> /var/log/aem_backup.log 2>&1
Скрипта create-remote-aem-pkg.sh
је дизајнирана да буде почетна тачка—основа коју можете да измените да бисте ускладили са потребама вашег тима. Испод су уобичајена прилагођавања, заједно са упутствима за имплементацију, како би се проширила његова функционалност или прилагодила специфичним случајевима употребе.
Подразумевано име датотеке користи временску ознаку ( $PKG_NAME-$(date +%Y%m%d-%H%M%S).zip
). Измените ово да бисте укључили имена окружења, ИД-ове пројекта или семантичко верзионисање:
# Example: Include environment (eg, "dev", "prod") BK_FILE="${PKG_NAME}-${ENV}-$(date +%Y%m%d).zip" # Example: Add Git commit SHA for traceability COMMIT_SHA=$(git rev-parse --short HEAD) BK_FILE="${PKG_NAME}-${COMMIT_SHA}.zip"
Савет : Уверите се да формати датума/времена избегавају знакове забрањене у називима датотека (нпр. двотачке :
на Виндовс-у).
Скрипта прихвата динамичке путање као филтере, али такође можете хардкодирати често коришћене путање или додати изузетке:
# Hardcode essential paths (eg, "/var/audit") DEFAULT_FILTERS=("/content/dam" "/apps" "/var/audit") FILTERS=("${DEFAULT_FILTERS[@]}" "${@}") # Merge with command-line inputs # Add exclusion rules (requires AEM API support) FILTERS_PARAM+="{\"root\": \"${FILTERS[$i]}\", \"rules\": [{\"modifier\": \"exclude\", \"pattern\": \".*/test/*\"}]}"
Избегавајте лозинке отвореног текста :
Користите променљиве окружења или менаџер тајни да бисте убацили акредитиве:
# Fetch password from environment variable PWD="$AEM_PASSWORD" # Use AWS Secrets Manager (example) PWD=$(aws secretsmanager get-secret-value --secret-id aem/prod/password --query SecretString --output text)
Примени ССЛ валидацију :
Замените curl -k
(несигурно) са поузданим ЦА сертификатом:
curl --cacert /path/to/ca-bundle.crt -u "$USR":"$PWD" ...
Проширите скрипту да бисте покренули низводне процесе након успешног преузимања:
# Example: Upload to cloud storage aws s3 cp "$BK_FOLDER/$BK_FILE" s3://my-backup-bucket/ # Example: Validate package integrity CHECKSUM=$(sha256sum "$BK_FOLDER/$BK_FILE" | cut -d ' ' -f 1) _log "SHA-256 checksum: $CHECKSUM" # Example: Clean up old backups (retain last 7 days) find "$BK_FOLDER" -name "*.zip" -mtime +7 -exec rm {} \;
Обавестите тимове о успеху/неуспеху путем Слацк-а, е-поште или алата за праћење:
# Post to Slack on failure curl -X POST -H 'Content-type: application/json' \ --data "{\"text\":\"🚨 AEM backup failed: $(hostname)\"}" \ https://hooks.slack.com/services/YOUR/WEBHOOK/URL # Send email via sendmail if [ $? -ne 0 ]; then echo "Subject: Backup Failed" | sendmail [email protected] fi
Управљање АЕМ пакетима не мора да буде ручни посао склон грешкама. Помоћу скрипте create-remote-aem-pkg.sh
можете трансформисати креирање пакета, филтрирање и дистрибуцију у поједностављен, поновљив процес. Овај алат није само уштеда времена, већ и омогућавање доследности, поузданости и скалабилности у вашим АЕМ операцијама.
Аутоматизација побеђује : Елиминишући понављајуће ГУИ интеракције, скрипта смањује људску грешку и ослобађа тимове да се фокусирају на задатке веће вредности.
Флексибилност је важна : Било да прави резервну копију критичног садржаја, синхронизује окружења или се припрема за ажурирања, скрипта се прилагођава различитим случајевима коришћења уз минимално подешавање.
Отпорност је кључна : Уграђено евидентирање, провере грешака и безбедносна разматрања обезбеђују да се скрипта понаша предвидљиво, чак и када ствари иду у страну.
Сјајни алати се рађају из изазова у стварном свету. Ова скрипта је полазна тачка; размислите о томе као о темељу на којем ћете се надограђивати како потребе вашег тима расту. Без обзира да ли сте соло програмер или део великог ДевОпс тима, оваква аутоматизација показује како мала улагања у код могу донети огромне поврате у продуктивности и безбрижности.
Спремни за следећи корак?
Хвала вам што пратите – сада идите и аутоматизујте се! 🚀
#!/bin/bash set -eo pipefail # The script will create a package thought the package manager api: # - The package is created, if not already present # - Package filters are populated accordingly to specified paths # - Package is builded # - Package is download to the specified folder _log () { echo "[$(date +%Y.%m.%d-%H:%M:%S)] $1" } check_last_exec () { local message="$1" local output="$2" local status=$3 if [ "$status" -ne 0 ]; then echo && echo "$message" && echo exit 1 fi if [[ $output =~ .*success\":false* ]] || [[ $output =~ .*"HTTP ERROR"* ]]; then _log "$message" exit 1 fi } USR="$1" PWD="$2" SVR="$3" PORT="$4" PKG_GROUP="$5" PKG_NAME="$6" BK_FOLDER="$7" shift 7 # The following paths will be included in the package FILTERS=($@) BK_FILE=$PKG_NAME"-"$(date +%Y%m%d-%H%M%S).zip _log "Starting backup process..." echo "AEM instance: '$SVR':'$PORT' AEM User: '$USR' Package group: $PKG_GROUP Package name: '$PKG_NAME' Destination folder: $BK_FOLDER Destination file: '$BK_FILE' Filter paths: " printf '\t%s\n\n' "${FILTERS[@]}" if [ ! -d "$BK_FOLDER" ]; then _log "Backup folder '$BK_FOLDER' does not exist!" && echo exit 1 fi PKG_NAME=${PKG_NAME// /_} check_last_exec "Error replacing white space chars from package name!" "" $? || exit 1 _log "Removed whitespaces from package name: '$PKG_NAME'" BK_FILE=$PKG_NAME.zip _log "Backup file: '$BK_FILE'" _log "Creating the package..." if [ $(curl -k -u "$USR":"$PWD" "$SVR:$PORT/crx/packmgr/service.jsp?cmd=ls" 2>/dev/null | grep "$PKG_NAME.zip" | wc -l) -eq 1 ]; then _log " Package '$PKG_GROUP/$PKG_NAME' is already present: skipping creation." else curl -k --silent -u "$USR":"$PWD" -X POST \ "$SVR:$PORT/crx/packmgr/service/.json/etc/packages/$PKG_GROUP/$PKG_NAME?cmd=create" \ -d packageName="$PKG_NAME" -d groupName="$PKG_GROUP" check_last_exec " Error creating the package!" "" $? _log " Package created" fi # create filters variable FILTERS_PARAM="" ARR_LEN="${#FILTERS[@]}" for i in "${!FILTERS[@]}"; do FILTERS_PARAM=$FILTERS_PARAM"{\"root\": \"${FILTERS[$i]}\", \"rules\": []}" T=$((i+1)) if [ $T -ne $ARR_LEN ]; then FILTERS_PARAM=$FILTERS_PARAM", " fi done # add filters _log "Adding filters to the package..." CURL_OUTPUT=$(curl -k --silent -u "$USR":"$PWD" -X POST "$SVR:$PORT/crx/packmgr/update.jsp" \ -F path=/etc/packages/"$PKG_GROUP"/"$PKG_NAME".zip -F packageName="$PKG_NAME" \ -F groupName="$PKG_GROUP" \ -F filter="[$FILTERS_PARAM]" \ -F "_charset_=UTF-8") CURL_STATUS=$? # Pass the status to the check_last_exec function check_last_exec "Error adding filters to the package!" "$CURL_OUTPUT" $CURL_STATUS _log " Package filters updated successfully." # build package _log "Building the package..." CURL_OUTPUT=$(curl -k -u "$USR":"$PWD" -X POST \ "$SVR:$PORT/crx/packmgr/service/script.html/etc/packages/$PKG_GROUP/$PKG_NAME.zip" \ -F "cmd=build") check_last_exec " Error building the package!" "$CURL_OUTPUT" $? _log " Package built." # download package _log "Downloading the package..." if [ "$(curl -w "%{http_code}" -o "$BK_FOLDER/$BK_FILE" -k --silent -u "$USR":"$PWD" "$SVR:$PORT/etc/packages/$PKG_GROUP/$PKG_NAME.zip")" -eq "200" ]; then if [ -f "$BK_FOLDER/$BK_FILE" ] && [ -s "$BK_FOLDER/$BK_FILE" ]; then _log " Package $BK_FILE downloaded in $BK_FOLDER." exit 0 fi fi _log " Error downloading the package!" exit 1
[¹] Прескакање ССЛ верификације помоћу curl -k
је згодно за тестирање, али ћете желети нешто чвршће у производњи (на пример --cacert
)!