Using cURL with AEM

Administrators often need to automate or simplify common tasks within any system. In AEM for example, managing users, installing packages, and managing OSGi bundles are tasks that must be commonly done.

Because of the RESTful nature of the Sling framework upon which AEM is built, most tasks can be done with a URL call. cURL can be used to execute such URL calls and can be a useful tool for AEM administrators.

What is cURL

cURL is an open-source command-line tool used to perform URL manipulations. It supports a wide range of internet protocols including HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, LDAP, DAP, DICT, TELNET, FILE, IMAP, POP3, SMTP, and RTSP.

cURL is a well-established and widely-used tool for getting or sending data using the URL syntax and was originally released in 1997. The name cURL originally meant “see URL.”

Because of the RESTful nature of the Sling framework upon which AEM is built, most tasks can be reduced to a URL call, which can be executed with cURL. Content manipulation tasks such as activating pages, and starting workflows as well as operational tasks such as package management and managing users can be automated using cURL. In addition you can create your own cURL commands for most tasks in AEM.

NOTE

Any AEM command executed through cURL has to be authorized just as any user to AEM. All ACLs and access rights are respected when using cURL to execute an AEM command.

Downloading cURL

cURL is a standard part of macOS and some Linux distros. However it is avaialble for most every operating system. The latest downloads can be found at https://curl.haxx.se/download.html.

cURL’s source repository can be found on GitHub as well.

Building a cURL-Ready AEM Command

cURL commands can be built for most operations in AEM such as triggering workflows, checking OSGi configurations, triggering JMX commands, creating replication agents, and much more.

To find the exact command you need for your particular operation, you need to use the developer tools in your browser to capture the POST call to the server when you execute the AEM command.

The following steps describe how to do this using the creation of a new page within the Chrome browser as an example.

  1. Prepare the action you wish to invoke within AEM. In this case, we have proceded to the end of the Create Page wizard, but have not yet clicked Create.

    chlimage_1-66

  2. Start the developer tools and select the Network tab. Click the Preserve log option before clearing the console.

    chlimage_1-67

  3. Click Create in the Create Page wizard to actually create the workflow.

  4. Right-click on the resulting POST action and select Copy -> Copy as cURL.

    chlimage_1-68

  5. Copy the cURL command to a text editor and remove all headers from the command, which start with -H (highligted in blue in the image below) and add the proper authentication parameter such as -u <user>:<password>.

    chlimage_1-69

  6. Execute the cURL command via the command line and view the response.

    chlimage_1-70

Common Operational AEM cURL Commands

Here is a list of AEM cURL commands for common administrative and operational tasks.

NOTE

The following examples assume that AEM is running on localhost on port 4502 and uses the user admin with password admin. Additional command placeholders are set in angle brackets.

Package Management

List All Installed Packages

curl -u <user>:<password> http://<host>:<port>/crx/packmgr/service.jsp?cmd=ls

Create a Package

curl -u <user>:<password> -X POST http://localhost:4502/crx/packmgr/service/.json/etc/packages/mycontent.zip?cmd=create -d packageName=<name> -d groupName=<name>

Preview a Package

curl -u <user>:<password> -X POST http://localhost:4502/crx/packmgr/service/.json/etc/packages/mycontent.zip?cmd=preview

List Package Content

curl -u <user>:<password> -X POST http://localhost:4502/crx/packmgr/service/console.html/etc/packages/mycontent.zip?cmd=contents

Build a Package

curl -X POST http://localhost:4502/crx/packmgr/service/.json/etc/packages/mycontent.zip?cmd=build

Rewrap a Package

curl -u <user>:<password> -X POST http://localhost:4502/crx/packmgr/service/.json/etc/packages/mycontent.zip?cmd=rewrap

Rename a Package

curl -u <user>:<password> -X POST -Fname=<New Name> http://localhost:4502/etc/packages/<Group Name>/<Package Name>.zip/jcr:content/vlt:definition

Upload a Package

curl -u <user>:<password> -F cmd=upload -F force=true -F package=@test.zip http://localhost:4502/crx/packmgr/service/.json

Install a Package

curl -u <user>:<password> -F cmd=install http://localhost:4502/crx/packmgr/service/.json/etc/packages/my_packages/test.zip

Uninstall a Package

curl -u <user>:<password> -F cmd=uninstall http://localhost:4502/crx/packmgr/service/.json/etc/packages/my_packages/test.zip

Delete a Package

curl -u <user>:<password> -F cmd=delete http://localhost:4502/crx/packmgr/service/.json/etc/packages/my_packages/test.zip

Download a Package

curl -u <user>:<password> http://localhost:4502/etc/packages/my_packages/test.zip

User Management

Create a New User

curl -u <user>:<password> -FcreateUser= -FauthorizableId=hashim -Frep:password=hashim http://localhost:4502/libs/granite/security/post/authorizables

Create a New Group

curl -u <user>:<password> -FcreateGroup=group1 -FauthorizableId=testGroup1 http://localhost:4502/libs/granite/security/post/authorizables

Add a Property to an Existing User

curl -u <user>:<password> -Fprofile/age=25 http://localhost:4502/home/users/h/hashim.rw.html

Create a User with a Profile

curl -u <user>:<password> -FcreateUser=testuser -FauthorizableId=hashimkhan -Frep:password=hashimkhan -Fprofile/gender=male http://localhost:4502/libs/granite/security/post/authorizables

Create a New User as a Member of a Group

curl -u <user>:<password> -FcreateUser=testuser -FauthorizableId=testuser -Frep:password=abc123 -Fmembership=contributor http://localhost:4502/libs/granite/security/post/authorizables

Add a User to a Group

curl -u <user>:<password> -FaddMembers=testuser1 http://localhost:4502/home/groups/t/testGroup.rw.html

Remove a User from a Group

curl -u <user>:<password> -FremoveMembers=testuser1 http://localhost:4502/home/groups/t/testGroup.rw.html

Set a User’s Group Membership

curl -u <user>:<password> -Fmembership=contributor -Fmembership=testgroup http://localhost:4502/home/users/t/testuser.rw.html

Delete a User

curl -u <user>:<password> -FdeleteAuthorizable= http://localhost:4502/home/users/t/testuser

Delete a Group

curl -u <user>:<password> -FdeleteAuthorizable= http://localhost:4502/home/groups/t/testGroup

Backup

See Backup and Restore for details.

OSGi

Starting a Bundle

curl -u <user>:<password> -Faction=start http://localhost:4502/system/console/bundles/<bundle-name>

Stopping a Bundle

curl -u <user>:<password> -Faction=stop http://localhost:4502/system/console/bundles/<bundle-name>

Dispatcher

Invalidate the Cache

curl -H "CQ-Action: Activate" -H "CQ-Handle: /content/test-site/" -H "CQ-Path: /content/test-site/" -H "Content-Length: 0" -H "Content-Type: application/octet-stream" http://localhost:4502/dispatcher/invalidate.cache

Evict the Cache

curl -H "CQ-Action: Deactivate" -H "CQ-Handle: /content/test-site/" -H "CQ-Path: /content/test-site/" -H "Content-Length: 0" -H "Content-Type: application/octet-stream" http://localhost:4502/dispatcher/invalidate.cache

Replication Agent

Check the Status of an Agent

curl -u <user>:<password> "http://localhost:4502/etc/replication/agents.author/publish/jcr:content.queue.json?agent=publish"
http://localhost:4502/etc/replication/agents.author/publish/jcr:content.queue.json?agent=publish

Delete an Agent

curl -X DELETE http://localhost:4502/etc/replication/agents.author/replication99 -u <user>:<password>

Create an Agent

curl -u <user>:<password> -F "jcr:primaryType=cq:Page" -F "jcr:content/jcr:title=new-replication" -F "jcr:content/sling:resourceType=/libs/cq/replication/components/agent" -F "jcr:content/template=/libs/cq/replication/templates/agent" -F "jcr:content/transportUri=http://localhost:4503/bin/receive?sling:authRequestLogin=1" -F "jcr:content/transportUser=admin" -F "jcr:content/transportPassword={DES}8aadb625ced91ac483390ebc10640cdf"http://localhost:4502/etc/replication/agents.author/replication99

Pause an Agent

curl -u <user>:<password> -F "cmd=pause" -F "name=publish"  http://localhost:4502/etc/replication/agents.author/publish/jcr:content.queue.json

Clear an Agent Queue

curl -u <user>:<password> -F "cmd=clear" -F "name=publish"  http://localhost:4502/etc/replication/agents.author/publish/jcr:content.queue.json

Communities

Assign and Revoke Badges

See Communities Scoring and Badges for details.

See Scoring and Badges Essentials for details.

MSRP Reindexing

See MSRP - MongoDB Storage Resource Provider for details.

Security

Enabling and Disabling CRX DE Lite

See Enabling CRXDE Lite in AEM for details.

Data Store Garbage Collection

See Data Store Garbage Collection for details.

Analytics and Target Integration

See Opting Into Adobe Analytics and Adobe Target for details.

Single Sign On

Send Test Header

See Single Sign On for details.

Common Content Manipulation AEM cURL Commands

Here is a list of AEM cURL commands for content manipulation.

NOTE

The following examples assume that AEM is running on localhost on port 4502 and uses the user admin with password admin. Additional command placeholders are set in angle brackets.

Page Management

Page Activation

curl -u <user>:<password> -X POST -F path="/content/path/to/page" -F cmd="activate" http://localhost:4502/bin/replicate.json

Page Deactivation

curl -u <user>:<password> -X POST -F path="/content/path/to/page" -F cmd="deactivate" http://localhost:4502/bin/replicate.json

Tree Activation

curl -u <user>:<password> -F cmd=activate -F ignoredeactivated=true -F onlymodified=true -F path=/content/geometrixx http://localhost:4502/etc/replication/treeactivation.html

Lock Page

curl -u <user>:<password> -X POST -F cmd="lockPage" -F path="/content/path/to/page" -F "_charset_"="utf-8" http://localhost:4502/bin/wcmcommand

Unlock Page

curl -u <user>:<password> -X POST -F cmd="unlockPage" -F path="/content/path/to/page" -F "_charset_"="utf-8" http://localhost:4502/bin/wcmcommand

Copy Page

curl -u <user>:<password> -F cmd=copyPage -F destParentPath=/path/to/destination/parent -F srcPath=/path/to/source/location http://localhost:4502/bin/wcmcommand

Workflows

See Interacting with Workflows Programmatically for details.

Sling Content

Create a Folder

curl -u <user>:<password> -F jcr:primaryType=sling:Folder http://localhost:4502/etc/test

Delete a Node

curl -u <user>:<password> -F :operation=delete http://localhost:4502/etc/test/test.properties

Move a Node

curl -u <user>:<password> -F":operation=move" -F":applyTo=/sourceurl"  -F":dest=/target/parenturl/" https://localhost:4502/content

Copy a Node

curl -u <user>:<password> -F":operation=copy" -F":applyTo=/sourceurl"  -F":dest=/target/parenturl/" https://localhost:4502/content

Upload Files Using Sling PostServlet

curl -u <user>:<password> -F"*=@test.properties"  http://localhost:4502/etc/test

Upload Files Using Sling PostServlet and Specifying Node Name

curl -u <user>:<password> -F"test2.properties=@test.properties"  http://localhost:4502/etc/test

Upload Files Specifying a Content Type

curl -u <user>:<password> -F "*=@test.properties;type=text/plain" http://localhost:4502/etc/test

Asset Manipulation

See Assets HTTP API for details.

On this page