Confluence Plugins
Asked by Navadeep:

Hi Atlassians,

We have list of few plugins available in our Confluence. We are using old version of Confluence (5.4.x). I know that we are using oldest version of confluence. Anyway, we are setting up a new environment of confluence(6.10) in couple of weeks.

I need to analyze the list of plugins that are mandatory to have them in our new version as well. Also I need to find whether anyone is using specific plugin(from the user-installed) plugins.

For ex: if I take "Gliffy diagrams for Confluence" plugin, I could see a section as shown in the image below

![Gliffy.JPG](/t5/image/serverpage/image-id/27023i0F34A07011368E0F/image-size/large?v=v2&px=999 "Gliffy.JPG")

I am able to see few Gliffy diagrams created in there. So, this plugin is mandatory as users are using it.

But for few plugins I am not able to see sections like this(ex. Angular JS integration plugin, Bob Swift plugin etc)

Finally, I have 2 questions below.

1. How can we find whether a specific plugin is actively being used by any user ?

2. How can we find which plugins are not needed from the list of plugins available from the "User-installed" addons section.

Thanks a lot !!

Best Regards,

Nav


Answers:
author: Navadeep
body: Thanks a lot for your response Davin. Appreciate your hard work in writing the script as well.

Best Regards,

Nav


author: Davin Studer
body: In the most recent versions of Confluence there is a report in Confluence Administration that can tell you which plugins that have macros that are being used on pages. However, since you are not on a newer version of Confluence you do not have that report. However, I wrote a user macro a few years ago that can give you that kind of report. Here is the code to set it up. Simply create the user macro in ***Confluence Administration -\> User Macros*** and them put the macro on a page.

**Macro Name:**   
macro_usage

**Macro Title:**   
Macro Usage

**Macro Body Processing:**   
No macro body

**Template:**

```
## Developed by: Davin Studer## Date created: 12/17/2014## @param Space:title=Space|type=spacekey|desc=This will restrict the macro usage report to a specific space.#set($containerManagerClass = $content.class.forName('com.atlassian.spring.container.ContainerManager'))#set($getInstanceMethod = $containerManagerClass.getDeclaredMethod('getInstance',null))#set($containerManager = $getInstanceMethod.invoke(null,null))#set($containerContext = $containerManager.containerContext)#set($macroBrowserManager = $containerContext.getComponent('macroBrowserManager'))#set($allMacros = $macroBrowserManager.getMacroSummaries())########################################################################################### This is used for getting around velocity issues when writing jQuery.                ############################################################################################set( $d = '$' )########################################################################################### Populate the macro information into a string that we will use as a JS object array. ############################################################################################set ($i = 0)#set($macroObjects = "")#foreach($macro in $allMacros)  #if($i != 0)    #set($macroObjects = $macroObjects + ",")  #end  #set($macroObjects = $macroObjects + "{title:'" + $macro.getTitle().getKey().replace("'","\'") + "', name:'" + $macro.getMacroName().replace("'","\'") + "'}")#set ($i = $i + 1)#end########################################################################################### Decide which space to search.                                                       ############################################################################################if ($!paramSpace && $!paramSpace != "")    #set ($searchSpace = $!paramSpace)#else    #set ($searchSpace = "conf_all")#end<script type="text/javascript">var queue = {    macros: [$macroObjects],    current: 0,    start: function () {        this.macros.sort(compare);        this.current = 0;        this.next();    },    next: function () {     if (this.current >= this.macros.length) {            AJS.$('#queryStatus span').removeClass('aui-lozenge-current');            AJS.$('#queryStatus span').addClass('aui-lozenge-success');            AJS.$('#queryStatus span').text('Report Complete');            AJS.tablessortable.setTableSortable(AJS.$('#macroUsageReport table'));            return null;  }  else {   this.current += 1;   lookupMacro(this.macros[this.current - 1]);  }    }};function lookupMacro(macro) {    var html = '';    var searchURL = '';        AJS.$('#queryStatus span').text('Getting counts for macro: ' + macro.title);        searchURL = AJS.params.baseUrl + '/rest/searchv3/1.0/search?where=${searchSpace}&spaceSearch=true&queryString=macroName:' + encodeURIComponent(macro.name);    AJS.${d}.ajax(        {            type: 'GET',            url: searchURL,            dataType: "json",            timeout:60000,            success: function(data) {                if(data.total > 0) {                    var spaces = '';                    for(var i = 0; i < data.results.length; i++)                    {                        if(spaces.indexOf(data.results[i].searchResultContainer.name) == -1)                        {                            spaces = spaces == '' ? '' : spaces + ', ';                            spaces = spaces + data.results[i].searchResultContainer.name;                        }                    }                    html = '<tr>';                    html += '   <td class="confluenceTd">' + macro.title + '</td>';                    html += '   <td class="confluenceTd">' + macro.name + '</td>';                    html += '   <td class="confluenceTd">' + data.total + '</td>';                    html += '   <td class="confluenceTd">' + spaces + '</td>';                    html += '   <td class="confluenceTd"><a href="' + AJS.params.baseUrl + '/dosearchsite.action?where=conf_all&spaceSearch=true&queryString=macroName:' + encodeURIComponent(macro.name) + '" target="_blank">macro usage</a></td>';                    html += '</tr>';                }                AJS.$('#macroUsageReport table tbody').append(html);                                queue.next();            },            error: function (x, y, z) {                AJS.$('#queryStatus span').removeClass('aui-lozenge-current');                AJS.$('#queryStatus span').addClass('aui-lozenge-error');                AJS.$('#queryStatus span').text('Error getting counts for macro:' + macro.title);            }        }    );}function compare(a, b) {    if (a.title < b.title) {        return -1;    }    if (a.title > b.title) {        return 1;    }    return 0;}AJS.toInit(function(){    queue.start();    });</script><div id="queryStatus">    <span class="status-macro aui-lozenge aui-lozenge-current"></span></div><div id="macroUsageReport">    <table class="confluenceTable">        <thead>            <tr>                <th>Macro Title</th>                <th>Macro Name</th>                <th>Times Used</th>                <th>Spaces Used In</th>                <th>Pages Used On</th>            </tr>        </thead>        <tbody>        </tbody>    </table></div>
```