1%{-- 2 - Copyright 2016 SimplifyOps, Inc. (http://simplifyops.com) 3 - 4 - Licensed under the Apache License, Version 2.0 (the "License"); 5 - you may not use this file except in compliance with the License. 6 - You may obtain a copy of the License at 7 - 8 - http://www.apache.org/licenses/LICENSE-2.0 9 - 10 - Unless required by applicable law or agreed to in writing, software 11 - distributed under the License is distributed on an "AS IS" BASIS, 12 - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 - See the License for the specific language governing permissions and 14 - limitations under the License. 15 --}% 16 17<%@ page import="rundeck.Execution; rundeck.ScheduledExecution; rundeck.ExecReport" %> 18<%-- 19 Created by IntelliJ IDEA. 20 User: greg 21 Date: Aug 7, 2008 22 Time: 10:32:26 AM 23--%> 24<g:set var="rkey" value="${g.rkey()}"/> 25<g:if test="${!options}"> 26 <g:set var="options" value="[title:true,message:true,end:true,job:true,author:true,stat:true,out:true,context:true,duration:true,cmdinf:true,node:true,msgsplitsize:60]"/> 27</g:if> 28<% 29 if(!options.msgsplitsize){ 30 options.msgsplitsize=100 31 } 32 def j = 0; 33%> 34<g:set var="maxmsgsize" value="${options.evtmaxsize?options.evtmaxsize:options.msgsplitsize?options.msgsplitsize:-1}"/> 35<g:set var="maxtitlesize" value="${30}"/> 36 <g:set var="sincetime" value="${0}"/> 37 <g:if test="${hiliteSince}"> 38 <g:set var="sincetime" value="${hiliteSince instanceof String? Long.parseLong(hiliteSince) : hiliteSince}"/> 39 </g:if> 40 <g:each in="${reports}"> 41 <g:set var="rpt" value="${it}"/> 42 <g:set var="foundJob" value="${null}"/> 43 <g:set var="execution" value="${null}"/> 44 <g:set var="status" value="${it?.status=='succeed'?'succeeded':'failed'}"/> 45 <g:if test="${rpt?.jcJobId}"> 46 <g:set var="foundJob" value="${ScheduledExecution.getByIdOrUUID(it.jcJobId)}"/> 47 </g:if> 48 <g:if test="${rpt?.jcExecId}"> 49 <g:set var="execution" value="${Execution.get(it.jcExecId)}"/> 50 <g:set var="status" value="${execution.executionState}"/> 51 </g:if> 52 <tr class="link autoclick ${it?.status != 'succeed' ? 'fail' : ''} ${!it.dateCompleted ? 'nowrunning' : ''} ${sincetime && it.dateCompleted.time>sincetime?'newitem':''} " > 53 <g:if test="${!hideEdit}"> 54 <td style="display: none" class="eventicon obs_bulk_edit_enable"> 55 <input type="checkbox" value="${enc(attr:rpt.jcExecId)}" name="bulk_edit" class="_defaultInput bulk_edit"/> 56 </td> 57 </g:if> 58 <g:set var="statusIcon" value="${execution.status == 'scheduled' ? 'time' : !execution.dateCompleted ? 'running' : execution.statusSucceeded() ? 59 'succeed' : execution.cancelled ? 'aborted' :execution.willRetry ? 'failedretry' :execution.timedOut ? 'timedout' : 60 execution.status in ['false','failed']?'fail':execution.status in ['incomplete']?'fail':'other'}"/> 61 <g:set var="statusIcon" value="${[succeeded:'succeed','failed-with-retry':'failedretry',failed:'fail'].get(status)?:status}"/> 62 <td class="eventicon autoclickable"> 63 <i class="exec-status icon " data-execstate="${execution.executionState?.toUpperCase()}" data-statusstring="${execution.customStatusString}"></i> 64 </td> 65 <g:set var="vals" value="${['?','?','?']}"/> 66 <g:if test="${it instanceof ExecReport}"> 67 <g:if test="${it?.node=~/^\d+\/\d+\/\d+$/}"> 68 <g:set var="vals" value="${it.node.split('/') as List}"/> 69 </g:if> 70 <g:else> 71 <g:set var="vals" value="${[it?.status=='succeed'?'1':'0',it?.status=='succeed'?'0':'1','1']}"/> 72 </g:else> 73 </g:if> 74 75 76 <g:set var="hasJobArgs" value="${rpt?.jcJobId && execution && execution.argString}"/> 77 <td class="eventtitle ${rpt?.jcJobId ? 'job' : 'adhoc'} autoclickable" colspan="${hasJobArgs?1:2}"> 78 <g:link controller="execution" action="show" id="${rpt.jcExecId}" class="_defaultAction" 79 params="[project:execution?execution.project:rpt.ctxProject?:params.project]" 80 title="View execution output" absolute="${absoluteLinks}">#<g:enc>${rpt.jcExecId}</g:enc></g:link> 81 <g:if test="${options.summary}"> 82 <g:if test="${rpt?.jcJobId}"> 83 <g:set var="foundJob" value="${ScheduledExecution.getByIdOrUUID(it.jcJobId)}"/> 84 <g:if test="${foundJob}"> 85 <g:enc>${foundJob.groupPath ? foundJob.groupPath+'/':''}${foundJob.jobName}</g:enc> 86 </g:if> 87 <g:else> 88 <span class="text-muted">(<g:message 89 code="domain.ScheduledExecution.title"/> ID <g:enc>${it.jcJobId}</g:enc> has been deleted)</span> 90 </g:else> 91 92 </g:if> 93 <g:else> 94 <g:enc>${rpt.title}</g:enc> 95 </g:else> 96 </g:if> 97 <g:else> 98 <g:if test="${!it.status}"> 99 <g:message code="status.label.${it.status}"/> 100 </g:if> 101 <g:if test="${(status == 'killed')}"> 102 by <g:enc>${it.abortedByUser}</g:enc> 103 </g:if> 104 </g:else> 105 <g:if test="${statusIcon=='other'}"> 106 <span class="exec-status-text custom-status">${execution.status}</span> 107 </g:if> 108 </td> 109 <g:if test="${rpt?.jcJobId && execution && execution.argString}"> 110 <td class="eventargs autoclickable"> 111 <div class="argstring-scrollable"> 112 <g:if test="${execution && execution.argString}"> 113 <g:render template="/execution/execArgString" model="[argString: execution.argString]"/> 114 </g:if> 115 <g:if test="${params.debug}"> 116 <g:enc>${rpt.toMap()}</g:enc> 117 </g:if> 118 </div> 119 </td> 120 </g:if> 121 122 <td style="white-space:nowrap;text-overflow: ellipsis; overflow: hidden" class="right date autoclickable"> 123 <g:if test="${it.dateCompleted}"> 124 %{--<g:relativeDate elapsed="${it?.dateCompleted}" agoClass="timeago"/>--}% 125 <g:unless test="${hideDate}"> 126 <span class="timeabs"><g:formatDate date="${it?.dateCompleted}" formatName="jobslist.date.format"/></span> 127 </g:unless> 128 <g:if test="${it?.dateStarted?.getTime() < it?.dateCompleted?.getTime()}"> 129 <span title="<g:relativeDate atDate='${it?.dateStarted}'/> to <g:relativeDate 130 atDate='${it?.dateCompleted}'/> "> 131 <g:message code="in.of" default="in"/> <g:relativeDate end="${it?.dateCompleted}" start="${it?.dateStarted}"/> 132 </span> 133 </g:if> 134 </g:if> 135 </td> 136 137 <td class=" user autoclickable" style="white-space: nowrap;text-overflow: ellipsis; overflow: hidden" title="by ${it?.author==session.user?'you':it.author}"> 138 <em><g:message code="by" default="by"/></em> 139 <g:username user="${it?.author}"/> 140 </td> 141 142 143 <td class=" user autoclickable" style="white-space: nowrap;text-overflow: ellipsis; overflow: hidden;"> 144 <g:if test="${it?.filterApplied}"> 145 <em><g:message code="activity.jobs.executed.node"/>:</em> 146 ${it?.filterApplied} 147 </g:if> 148 <g:else> 149 <em><g:message code="activity.jobs.executed.local"/></em> 150 </g:else> 151 </td> 152 153 <g:unless test="${hideNodes}"> 154 <td class="${vals[1] != '0' ? 'fail' : 'ok'} nodecount autoclickable "> 155 <g:if test="${vals[1] != '0'}"> 156 <g:enc>${vals[1]}</g:enc> ${options.summary ? '' : 'node'} failed 157 </g:if> 158 <g:else> 159 <g:enc>${vals[0]}</g:enc> ${options.summary ? '' : 'node'} ok 160 </g:else> 161 </td> 162 </g:unless> 163 164 </tr> 165 <% j++; %> 166 </g:each> 167<g:if test="${lastDate}"> 168 <g:set var="checkUpdatedParams" value="${[since: lastDate,project:params.project]}"/> 169 %{ 170 if (filterName) { 171 checkUpdatedParams.filterName = filterName 172 } else { 173 checkUpdatedParams.putAll(paginateParams) 174 } 175 }% 176 <g:set var="checkUpdatedUrl" value="${g.createLink(action: 'since.json', params: checkUpdatedParams)}"/> 177</g:if> 178<g:set var="refreshUrl" 179 value="${g.createLink(action: 'eventsFragment', params: filterName ? [filterName: filterName] : paginateParams)}"/> 180<g:set var="rssUrl" 181 value="${g.createLink(controller: 'feed', action: 'index', params: filterName ? [filterName: filterName] : paginateParams)}"/> 182<g:render template="/common/boxinfo" 183 model="${[name: 'events', model: [total: total, max: max, offset: offset, url: refreshUrl, checkUpdatedUrl: checkUpdatedUrl, rssUrl: rssUrl, lastDate: lastDate]]}"/> 184