Адобе Екпериенце Манагер (АЕМ) пакети су неопевани хероји управљања садржајем — моћни контејнери који спајају све, од кода и конфигурација до критичног садржаја. Али хајде да се суочимо са тим: ручно креирање, конфигурисање и преузимање ових пакета може изгледати као досадан плес кликова. Шта ако бисте могли да аутоматизујете овај процес са неколико притисака на тастере, обезбеђујући доследност, брзину, поузданост и мање подизање терета? Показаћу вам Басх скрипту која преокреће скрипту (намера речи!) о томе како АЕМ програмери и администратори раде са АПИ менаџера пакета. Размислите о изради пакета за неколико секунди, кројењу филтера у ходу и прављењу резервних копија са хируршком прецизношћу — све пре него што се ваша кафа охлади до температуре за испијање. ☕ савршене : 🕳 Пре него што заронимо, кратка напомена Овај чланак је детаљан , детаљно детаљан и технички без извињења. Размотрићемо логику скрипте, истражити замршености АЕМ АПИ-ја и решити ивичне случајеве. За програмере који желе да ускоче директно у код, можете скочити на дно чланка. Али ако сте овде да разумете како и зашто стоји иза аутоматизације, причврстите се – идемо скроз доле до зечје рупе. 1. Преглед скрипте скрипта аутоматизује интеракције са АЕМ-овим АПИ менаџера пакета, нудећи структурирани приступ креирању, конфигурацији и дистрибуцији пакета. Дизајниран за програмере и администраторе, замењује ручне токове посла процесом вођеним командном линијом који наглашава доследност и поузданост. create-remote-aem-pkg.sh 1.1 Основне функције : Проверава постојеће пакете да би се избегла редундантност пре него што започне креирање. Валидација пакета : Програмски дефинише путање садржаја (нпр. , ) које треба укључити у пакет. Убацивање динамичког филтера /content/dam /apps : Покреће компилацију пакета и преузима излаз у одређени директоријум, додајући временску ознаку именима датотека за контролу верзија. Аутоматизација изградње : Потврђује ХТТП одговоре, путање фасцикли и аутентификацију да би се пружиле повратне информације које се могу предузети током неуспеха. Руковање грешкама : Подржава основну¹ аутентификацију засновану на акредитивима преко . Аутентификација curl 1.2 Кључне предности : Смањује ручне кораке потребне за креирање, конфигурацију и преузимање пакета. Ефикасност : Осигурава униформне структуре пакета и конвенције именовања у свим окружењима. Конзистентност : Детаљно евидентирање у свакој фази (креирање, филтрирање, изградња, преузимање) помаже у ревизији и решавању проблема. Следљивост 1.3 Практичне примене : Интегришите се са црон пословима да бисте редовно архивирали путање критичног садржаја. Планиране резервне копије : Реплицирајте конфигурације или садржај између АЕМ инстанци током имплементације. Синхронизација окружења : Снимите стабилна стања или пре примене системских ажурирања. Снимци пре ажурирања /etc /apps 1.4 Предуслови Приступ АЕМ инстанци (акредитиви, сервер, порт). Основно познавање Басх скриптовања и АЕМ-овог менаџера пакета. Дозвола за креирање и преузимање пакета преко АЕМ АПИ-ја. 1.5 Пример употребе ./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 2. Разбијање скрипте Хајде да сецирамо скрипту (можете је пронаћи на дну чланка) да бисмо разумели како она организује управљање АЕМ пакетима. Фокусираћемо се на његову структуру, кључне функције и логику тока посла—идеално за програмере који желе да прилагоде или отклоне грешке у алату. create-remote-aem-pkg.sh 2.1 Основне функције : Услужна функција која порукама ставља префикс са временским ознакама за јасне трагове ревизије. _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 } : Спречава тихе грешке заустављањем извршавања критичних грешака као што су проблеми са аутентификацијом или неважеће путање. Зашто је то важно 2.2 Улазни параметри Скрипта прихвата седам позиционих аргумената праћених динамичким филтерима: 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 2.3 Валидација и креирање пакета : Замењује размаке у са доњим цртама да би се избегли проблеми са УРЛ-ом. Санитизе Намес 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 2.4 Конфигурација динамичког филтера Конструише ЈСОН низ филтера од улазних путања: 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 2.5 Ток рада изградње и преузимања : Покреће компилацију помоћу АЕМ-ове команде : Направи пакет 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" ... 3. Руковање грешкама, безбедносне напомене и евидентирање Робусно руковање грешкама и евидентирање су критични за ненадзиране скрипте као што је , обезбеђујући да се грешке рано ухвате и јасно евидентирају. Ево како скрипта штити од неочекиваних проблема и пружа корисне увиде. create-remote-aem-pkg.sh 3.1 Механизам евидентирања : Функција ставља префикс сваке поруке временском ознаком , стварајући ревизијски траг за отклањање грешака: Евиденције са временским ознакама _log [YYYY.MM.DD-HH:MM:SS] _log "Starting backup process..." # Output: [2023.10.25-14:30:45] Starting backup process... : Временске ознаке помажу у повезивању активности скрипте са евиденцијама АЕМ сервера или спољним догађајима (нпр. распореди црон послова). Зашто је то важно : Критични кораци, попут креирања пакета, ажурирања филтера и преузимања, се експлицитно евидентирају да би се пратио напредак. Опширни излаз 3.2 Ток рада валидације грешке : Провере пре лета Потврђује постојање фасцикле резервне копије ( ) пре него што наставите: 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 3.4 Уобичајени сценарији кварова Неважећи акредитиви: хвата одговоре и излази са јасном поруком о грешци. check_last_exec 401 Unauthorized Неважећа путања филтера: АЕМ АПИ враћа , скрипта бележи „Грешка при додавању филтера“ и завршава се. success:false Диск пун: не успева да се упише , проверава величину датотеке са заставицом и упозорава пре изласка. BK_FILE -s АЕМ инстанца је недоступна: излази са кодом који није нула, скрипта бележи „Грешка у изградњи пакета“. curl 3.5 Безбедносна разматрања : Скрипта користи ради једноставности, која прескаче ССЛ верификацију. : Замените са да бисте навели ЦА пакет. Заобилажење ССЛ сертификата curl -k Препорука за производњу --cacert : акредитиви се прослеђују као аргументи, који се могу појавити у евиденцији процеса. : Користите променљиве окружења или тајни трезор (нпр. ). Лозинке отвореног текста Ублажавање $AEM_PASSWORD 3.6 Савети за отклањање грешака : Привремено додајте на почетку скрипте да бисте одштампали извршене команде. Омогући детаљан излаз set -x : Изолујте проблеме покретањем критичних команди ван скрипте Тестирајте АПИ позиве ручно curl : Преусмерите излаз скрипте у датотеку за каснију анализу: Прегледајте евиденције ./create-remote-aem-pkg.sh ... >> /var/log/aem_backup.log 2>&1 4. Прилагођавање алата вашем току рада Скрипта је дизајнирана да буде почетна тачка—основа коју можете да измените да бисте ускладили са потребама вашег тима. Испод су уобичајена прилагођавања, заједно са упутствима за имплементацију, како би се проширила његова функционалност или прилагодила специфичним случајевима употребе. create-remote-aem-pkg.sh 4.1 Подешавање формата имена датотеке резервне копије Подразумевано име датотеке користи временску ознаку ( ). Измените ово да бисте укључили имена окружења, ИД-ове пројекта или семантичко верзионисање: $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" : Уверите се да формати датума/времена избегавају знакове забрањене у називима датотека (нпр. двотачке на Виндовс-у). Савет : 4.2 Проширивање или измена филтера Скрипта прихвата динамичке путање као филтере, али такође можете хардкодирати често коришћене путање или додати изузетке: # 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/*\"}]}" 4.3 Повећање безбедности : Избегавајте лозинке отвореног текста Користите променљиве окружења или менаџер тајни да бисте убацили акредитиве: # 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" ... 4.4 Додавање радњи након изградње Проширите скрипту да бисте покренули низводне процесе након успешног преузимања: # 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 {} \; 4.5 Додавање обавештења упозорења Обавестите тимове о успеху/неуспеху путем Слацк-а, е-поште или алата за праћење: # 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 admin@mycompany.com fi 5. Закључак Управљање АЕМ пакетима не мора да буде ручни посао склон грешкама. Помоћу скрипте можете трансформисати креирање пакета, филтрирање и дистрибуцију у поједностављен, поновљив процес. Овај алат није само уштеда времена, већ и омогућавање доследности, поузданости и скалабилности у вашим АЕМ операцијама. create-remote-aem-pkg.sh Кеи Такеаваис : Елиминишући понављајуће ГУИ интеракције, скрипта смањује људску грешку и ослобађа тимове да се фокусирају на задатке веће вредности. Аутоматизација побеђује : Било да прави резервну копију критичног садржаја, синхронизује окружења или се припрема за ажурирања, скрипта се прилагођава различитим случајевима коришћења уз минимално подешавање. Флексибилност је важна : Уграђено евидентирање, провере грешака и безбедносна разматрања обезбеђују да се скрипта понаша предвидљиво, чак и када ствари иду у страну. Отпорност је кључна Сјајни алати се рађају из изазова у стварном свету. Ова скрипта је полазна тачка; размислите о томе као о темељу на којем ћете се надограђивати како потребе вашег тима расту. Без обзира да ли сте соло програмер или део великог ДевОпс тима, оваква аутоматизација показује како мала улагања у код могу донети огромне поврате у продуктивности и безбрижности. Спремни за следећи корак? 🛠 : Прилагодите скрипту користећи као водич. Прилагодите одељак 6 🔍 : Прегледајте своје постојеће АЕМ радне токове ради могућности аутоматизације. Ревизија 🤝 : Менторирајте свој тим или напишите блог о својим модификацијама. Подели Хвала вам што пратите – сада идите и аутоматизујте се! 🚀 Додатак Комплетан код #!/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 [²] Званична документација АЕМ менаџера пакета