Wednesday, July 31, 2013

How to host Adobe Dynamic Tag Management System files in CQ dispatcher

Use Case: You often have situation where for marketing and analytics purpose you have to reply on dev team to push tracking code or tag management code or inclusion of any third party client side library. Satellite Search and Discovery provide great way to abstract client side tracking or tagging changes for marketing and analytics with development.
Documentation on Tag Management can be found here


1) Update to CQ could happen out side dev cycle. For this make sure that satellite changes are completely tested before using it in production.
2) Since Satellite is similar to SAS service, changes in satellite could also cause some module not to work as expected. For that you can keep track of changes in satellite side and test that module.
3) Some time satellite load is slow if it is loaded from there hosted service. For this you can host satellite code on dispatcher and use some script to update it every time there is any change.

Include satellite script to CQ:

You can simply use,

<script type="text/javascript" src="SOME-PATH.js" ></script>
you can also use run mode specific configuration to include dev or prod specific script to your side.
Set<String> runModes = sling.getService(SlingSettingsService.class).getRunModes();
if(!runModes.contains("author")) { 
             //Include prod satellite code
            //Include dev satellite code

Host satellite Script on Dispatcher:

For performance you can host satellite on dispatcher itself and then include it in your file. For this satellite provide a feature for deploy Hook. Deploy hook URL is called every time there is a change in any configuration or any rules are published. 

If you want to host satellite files on dispatcher then you can give this deploy hook URL as your production server URL path that you want to call every time there is any change. For example I want call a servlet or any script on change and update change in dispatcher and all other publish and author instance.

Here I am using python script to make this update,  Process is like this,
  • Changes made in satellite
  • Satellite call a dispatcher URL
  • Dispatcher URL invoke python script (You need rewrite rule to do that)
  • Python script checks if this is staging or production server
  • Based on that it get corresponding satellite files which is in zip fomat
  • Script unzip file, remove existing files from dispatcher if present and put it in dispatcher in certain location
  • Then it calls other dispatchers to update files as well
  • Then it issue upload request to upload changed file to author
  • After that it issue tree activation request to update these files on all publish. (This step is required in case some one clear dispatcher cache).
  • In order to avoid infinite loop within all dispatchers, one dispatcher call other dispatcher with a URL param indicating not to call other dispatcher.
  • for UID:PWD you can use non admin users that only have access to satellite files, make sure that they have activation rights as well.

You can use 

Note: I am using old version of python, You can reduce code with latest version.

import urllib2
import shutil
import urlparse
import os
import sys
import zipfile
import cgitb; cgitb.enable()
import cgi
import socket
import urllib
#import pwd
#import grp
#Global Var
#Read URL from path
#Staging IP List contain list of IP for Stage
staging_IP_list = ["X.X.X.X","X.X.X.X"]
#Production IP list
production_IP_list = ["Y.Y.Y.Y","Y.Y.Y.Y","Y.Y.Y.Y","Y.Y.Y.Y"]
#This is required to avoid circular loop
form = cgi.FieldStorage()
checked = form.getvalue("checked")
addr = socket.gethostbyname(socket.gethostname())
#This folder path is required to avoid permission issue.
rootFolder = "../some/folder/in/dispatcher"
#Need to create rewrite mapping for this to work.
pingUrl = "/some/path/for/dispatcher?checked=true"
author_content_subfolder="SUBFOLDER NAME GIVEN BY SATELLITE /"
#Destination Path
print "Content-type: text/html; charset=iso-8859-1\n\n"
print '''<HTML>'''
print '''<TITLE>Satellite Ping Check</TITLE><body>'''
#print '''<br>url I got host as''',addr

#This method override url open to make just head request
class HeadRequest(urllib2.Request):
def get_method(self):
return "HEAD"

#Method to ping URL to another server
def pingURL(customURL):
response = urllib2.urlopen(HeadRequest(customURL))
print '''<br>We failed to reach a server.'''

#Method that will ping other server based on IP address
def pingOtherServer():
for eachIp in staging_IP_list:
if eachIp==addr:
for eachIp2 in staging_IP_list:
if eachIp2!=addr:
resp = pingURL("http://"+eachIp2+pingUrl)
for eachIp in production_IP_list:
if eachIp==addr:
for eachIp2 in production_IP_list:
if eachIp2!=addr:
resp = pingURL("http://"+eachIp2+pingUrl)

#This is required to keep those files to author
def pingauthorServer():
filepath = rootFolder+"/"+author_content_subfolder+satellite_js_file_name
#Curl command to upload satellite file
os.system('curl -u UID:PWD -F@TypeHint="nt:file" -Ftype="file" --upload-file '+filepath+' '+curl_ping_url+author_content_folder+author_content_subfolder)
#Curl command to upload selectors.js file
os.system('curl -u UID:PWD -F@TypeHint="nt:file" -Ftype="file" --upload-file '+filepath+' '+curl_ping_url+author_content_folder)
for script_file in script_file_list:
os.system('curl -u UID:PWD -F@TypeHint="nt:file" -Ftype="file" --upload-file '+filepath+' '+curl_ping_url+author_content_folder+author_content_subfolder+"scripts/")
#Curl command to activate files to publish instance
os.system('curl -u UID:PWD -Fcmd=activate -Fignoredeactivated=true -Fonlymodified=false -Fpath='+author_content_folder+' '+curl_ping_url+'/etc/replication/treeactivation.html')

#Method to delete existing folder before extracting new one
def deleteFileOrFolder(directory):
    if os.path.exists(directory):
            if os.path.isdir(directory):
                print '''<br>removing folder<b>''',directory
                print '''<br>Creating''',directory
                print '''<br>removing file<b>''',directory
            print '''<br>Ecxeption''',str(sys.exc_info())
        print '''<br>not found''',directory
        print '''<br>Creating''',directory

#Method to set satellite url based on IP address. If this is production server then set URL as production
def seturl():
for eachIp in production_IP_list:
if eachIp==addr:
global url
global satellite_js_file_name
global curl_ping_url

def extract():
zip_file = zipfile.ZipFile(fileName, 'r')
#print '''file name is ''',fileName
for files in zip_file.namelist():
print '''<br>files in zip''',files
#print '''<br> Yogesh ''',myfile_path
if myfile_path.endswith("/"):
#print '''<br>I am in if and myfile_path is ''',myfile_path
if not os.path.exists(myfile_path):
if files.find("/scripts/") != -1:
#print '''<b> found script file with name <br>''',rootFolder+"/"+author_content_subfolder+"scripts/"+files.split('/')[-1]
#print '''<br>I am here and myfile_path is ''',myfile_path
data =
myfile = open(myfile_path, "w+")

#Setting URL to production if this is production server. By default it is always staging server
#print '''<br>url I got is''',url
fileName = url.split('/')[-1].split('#')[0].split('?')[0]
print '''<br>filename I got is''',fileName
#Delete all file and folder before creating them
r = urllib2.urlopen(urllib2.Request(url))
fileName = rootFolder+"/"+fileName
f=open(fileName, 'wb')
#zfile = zipfile.ZipFile(fileName)
#os.system('jar -xvf '+fileName)
#Do it only from one server
if checked is None:

print '''</body>'''
print '''</HTML>'''

Happy tagging and tracking. Let me know if you have any question.

AEM 6 provide this feature OOTB for that go to http://HOST:PORT/miscadmin#/etc/cloudservices/dynamictagmanagement and enter your DTM info

Note: Please note that there could be other tools that are capable of doing similar things. You can use similar approach there as well. This post has no mean to say that you should use satellite search and discovery for similar use case.


  1. Update to CQ could happen out side dev cycle. For this make sure that satellite changes are completely tested before using it in production. Hosted Lync Providers

  2. Nơi gặp gỡ thiet ke noi that chung cu giao lưu, hay bàn công việc không còn bó hẹp trong không gian trường học thiet ke noi that can ho hay văn phòng nữa, mà người thiet ke noi that van phong ta đã tìm thiet ke chung cu thấy một nơi lý thú hơn đó thiet ke noi that phong khach ... Mỗi nhà phố ra đời đều có một nội thất khác nhau, muôn hình muôn vẻ nhà thiet ke noi that shop đã góp phần làm giàu thêm nội thất thiet ke noi that showroom nhà phố Việt Nam. Nếu như bàn nhựa, bàn sắt thiet ke noi that biet thu cho ta nha dep 2016 thấy được sự tiện dụng thì bàn gỗ thiet ke noi that nha ong tự nhiên lại mang đến cảm giác gần gũi, ấm áp. Gạch là những gì chân chất nhất mà người Việt Nam vốn có. Biết bao công trình kiến trúc ra đời dựa trên chất liệu hiện đại mà mộc mạc ấy góp ... thiet ke noi that phong ngu

  3. Cách nấu chè hoc nau an o dau cốm ngon ai cũng có bun rieu cua thể làm được. Học cách nấu chè cốm ngon bùi, xanh mướt để cả cach lam banh trang tron gia đình thưởng thức nhé khi thu banh bao chien về cùng Đào Tạo Vua Bếp bạn nhé! Tại các thành phố vit nau chao lớn những căn hộ đa phần thiết kế suon xao chua ngot nhiều tầng tăng diện tích ngược lại lối thiết kế vit om sau đó ngôi nhà khiêm nhường trả không gian cach lam banh bong lan cho thiên nhiên. Cửa phòng khách 4 cánh mở rộng giống lời mời chào khách cach lam pate gan

  4. Relocation with comfort by hiring Packers and Movers

  5. đồng tâm
    game mu
    cho thuê nhà trọ
    cho thuê phòng trọ
    nhac san cuc manh
    số điện thoại tư vấn pháp luật miễn phí
    văn phòng luật
    tổng đài tư vấn pháp luật
    dịch vụ thành lập công ty trọn gói

    Hắn dừng lại, đi đi đi lại, lẩm bẩm: "Một người là La thị gia tộc, một người là Kỷ thị gia tộc, một người là Cố thị gia tộc... Trung Tam Thiên tam đại gia tộc... Hừ hừ, Sở diêm vương lộ ra phong thanh, đến lúc đó, nhất định sẽ theo chân bọn hắn cùng đi! Bởi vì có thể nhìn ra, giao tình giữa hắn và mấy thiếu niên công tử kia không cạn...."

    "Mà Sở diêm vương hiện tại không có thực lực, nếu muốn đối phó chúng ta, thì chỉ có cách mượn lực... Mà nói tới mượn lực, ừm, nếu giao tình bọn không cạn, thì mấy người này hẳn sẽ giúp hắn chiếu cố. Nhưng người của Trung Tam Thiên không thể nhúng tay vào chuyện Hạ Tam Thiên, mấy người bọn hắn cũng không thể hỗ trợ rõ ràng... Nhưng nếu chúng ta chủ động trêu chọc vào bọn hắn, thì đó lại là chuyện khác...."

    "Nếu như Sở Dương phối hợp với sự trợ giúp của bọn hắn, lại tranh thủ châm ngòi ly gián.. Thì chẳng khác gì Kim Mã Kỵ Sỹ đường chúng ta vừa mới náo loạn với Hắc Ma gia tộc một hồi liền quay sang đối đầu với tam đại gia tộc... Đây chính là chiêu tá lực đả lực của Sở diêm vương?"

    Đệ Ngũ Khinh Nhu nhẹ nhàng day day trán, lẩm bẩm: "Lần này có phải là cái bẫy lớn mà Sở diêm vương giăng ra?"

    Hắn nghĩ đi nghĩ lại, trong mắt dần dần lộ ra một sắc thái lợi hại, nói: "Nếu như đồng thời chống lại cả tam đại gia tộc... Kim Mã Kỵ Sỹ đường chúng thật sự gặp phải nguy hiểm rồi...."

    Hàn Bố Sở, Trình Vân Hạc, Cao Thăng, Cảnh Mộng Hồn, Âm Vô Thiên lẳng lặng nghe Đệ Ngũ Khinh Nhu phân tích từng điểm từng điểm, cho đến khi phân tích ra tình thế nguy hiểm của Kim Mã Kỵ Sỹ đường, ai nấy đều cảm thấy sống lưng lạnh toát.

  6. Often, products and goods tend to get damaged or broken in transit. In such a case, some companies offer warrantees, other offer replacements, while yet other companies offer reimbursements. However, there are some moving companies that do not assume responsibility for such damages that occur during transit. In order to fully be prepared for any such incident, it is necessary to read the fine print and understand the terms and conditions of the agreement clearly before hiring a moving company.

    Please Follow Our Link:
    packers and movers bangalore
    packers and movers hyderabad

  7. In your blog I was happy to see your article, better than last time, and have made great progress, I am very pleased. I am looking forward to your article will become better and better.
    agario skins | mahjong connect | minecraft games |pac man | geometry dash lite | sniper games | agar io |halloween

  8. Thank you for your post, I look for such article along time, today i find it finally. this post give me lots of advise it is very useful for me
    friv , girlsgogames , games2girls , play happy wheels , happy wheels 2 , game zombie tsunami , retrica apk , retrica download , happy wheels demo , agario