Skip to content

Commit

Permalink
Merge branch 'i266' into release-1.3
Browse files Browse the repository at this point in the history
  • Loading branch information
gschueler committed Apr 29, 2011
2 parents 09303ce + c449812 commit 9925bbd
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 19 deletions.
21 changes: 18 additions & 3 deletions packaging/root/etc/rundeck/log4j.properties
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ log4j.additivity.com.dtolabs.rundeck.core.authorization=false
log4j.logger.com.dtolabs.rundeck.remoteservice.http.options=INFO, options
log4j.additivity.com.dtolabs.rundeck.remoteservice.http.options=false

# Enable Job changes logging
log4j.logger.com.dtolabs.rundeck.data.jobs.changes=INFO, jobchanges
log4j.additivity.com.dtolabs.rundeck.data.jobs.changes=false

# Enable this logger to log Hibernate output
# handy to see its database interaction activity
#log4j.logger.org.hibernate=debug,stdout
Expand Down Expand Up @@ -109,13 +113,24 @@ log4j.appender.audit.layout=org.apache.log4j.PatternLayout
log4j.appender.audit.layout.ConversionPattern=%d{ISO8601} - %m%n

#
# audit
#
# Captures all audit events.
# options log
#
# Logs remote HTTP requests for Options JSON data
#
log4j.appender.options=org.apache.log4j.DailyRollingFileAppender
log4j.appender.options.file=/var/log/rundeck/rundeck.options.log
log4j.appender.options.append=true
log4j.appender.options.layout=org.apache.log4j.PatternLayout
log4j.appender.options.layout.ConversionPattern=[%d{ISO8601}] %X{httpStatusCode} %X{contentLength}B %X{durationTime}ms %X{lastModifiedDateTime} [%X{jobName}] %X{url} %X{contentSHA1}%n

#
# job changes log
#
# Logs all Job definition changes
#
log4j.appender.jobchanges=org.apache.log4j.DailyRollingFileAppender
log4j.appender.jobchanges.file=/var/log/rundeck/rundeck.jobs.log
log4j.appender.jobchanges.append=true
log4j.appender.jobchanges.layout=org.apache.log4j.PatternLayout
log4j.appender.jobchanges.layout.ConversionPattern=[%d{ISO8601}] %X{user} %X{change} [%X{id}] %X{project} "%X{groupPath}/%X{jobName}" (%X{method})%n

3 changes: 2 additions & 1 deletion rundeckapp/etc/config-defaults.properties
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,5 @@ default.admin.name=admin
default.admin.password=admin
default.user.name=user
default.user.password=user
logger.options.format=[%d{ISO8601}] %X{httpStatusCode} %X{contentLength}B %X{durationTime}ms %X{lastModifiedDateTime} [%X{jobName}] %X{url} %X{contentSHA1}%n
logger.options.format=[%d{ISO8601}] %X{httpStatusCode} %X{contentLength}B %X{durationTime}ms %X{lastModifiedDateTime} [%X{jobName}] %X{url} %X{contentSHA1}%n
logger.jobchanges.format=[%d{ISO8601}] %X{user} %X{change} [%X{id}] %X{project} "%X{groupPath}/%X{jobName}" (%X{method})%n
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ log4j.additivity.com.dtolabs.rundeck.core.authorization=false
log4j.logger.com.dtolabs.rundeck.remoteservice.http.options=INFO, options
log4j.additivity.com.dtolabs.rundeck.remoteservice.http.options=false

# Enable Job changes logging
log4j.logger.com.dtolabs.rundeck.data.jobs.changes=INFO, jobchanges
log4j.additivity.com.dtolabs.rundeck.data.jobs.changes=false

# Enable this logger to log Hibernate output
# handy to see its database interaction activity
#log4j.logger.org.hibernate=debug,stdout
Expand Down Expand Up @@ -73,3 +77,14 @@ log4j.appender.options.file=${rundeck.log.dir}/rundeck.options.log
log4j.appender.options.append=true
log4j.appender.options.layout=org.apache.log4j.PatternLayout
log4j.appender.options.layout.ConversionPattern=${logger.options.format}

#
# job changes log
#
# Logs all Job definition changes
#
log4j.appender.jobchanges=org.apache.log4j.DailyRollingFileAppender
log4j.appender.jobchanges.file=${rundeck.log.dir}/rundeck.jobs.log
log4j.appender.jobchanges.append=true
log4j.appender.jobchanges.layout=org.apache.log4j.PatternLayout
log4j.appender.jobchanges.layout.ConversionPattern=${logger.jobchanges.format}
Original file line number Diff line number Diff line change
Expand Up @@ -530,8 +530,10 @@ class ScheduledExecutionController {
log.info("ScheduledExecutionController: delete : params: " + params)
def ScheduledExecution scheduledExecution = ScheduledExecution.get( params.id )
if(scheduledExecution) {
def changeinfo=[user:session.user,method:'delete',change:'delete']
def jobname = scheduledExecution.generateJobScheduledName()
def groupname = scheduledExecution.generateJobGroupName()
def jobdata=scheduledExecution.properties
def jobtitle=scheduledExecution.jobName
//unlink any Execution records
def torem=[]
Expand All @@ -545,6 +547,7 @@ class ScheduledExecutionController {
}
scheduledExecution.delete(flush:true)
scheduledExecutionService.deleteJob(jobname,groupname)
logJobChange(changeinfo, jobdata)
flash.message = "Job '${jobtitle}' was successfully deleted."
redirect(action:index, params:[:])
} else {
Expand Down Expand Up @@ -626,8 +629,43 @@ class ScheduledExecutionController {
render(template:'editForm', model:edit(params))
}

static Logger jobChangeLogger = Logger.getLogger("com.dtolabs.rundeck.data.jobs.changes")

private logJobChange(data, jobdata) {
data.keySet().each {k ->
def v = data[k]
if (v instanceof Date) {
//TODO: reformat date
MDC.put(k, v.toString())
MDC.put("${k}Time", v.time.toString())
} else if (v instanceof String) {
MDC.put(k, v ? v : "-")
} else {
final string = v.toString()
MDC.put(k, string ? string : "-")
}
}
['id','jobName','groupPath','project'].each {k ->
final var = jobdata[k]
MDC.put(k, var ? var : '-')
}
final msg = data.user + " " + data.change.toUpperCase() + " [" + jobdata.id + "] "+jobdata.project+" \"" + (jobdata.groupPath ? jobdata.groupPath : '') + "/" + jobdata.jobName + "\" (" + data.method+")"
jobChangeLogger.info(msg)
data.keySet().each {k ->
if (data[k] instanceof Date) {
//reformat date
MDC.remove(k + 'Time')
}
MDC.remove(k)
}
['id', 'jobName', 'groupPath', 'project'].each {k ->
MDC.remove(k)
}
}

def update = {
def result = _doupdate(params)
def changeinfo=[method:'update',change:'modify',user:session.user]
def result = _doupdate(params,changeinfo)
def scheduledExecution=result[1]
def success = result[0]
if(!scheduledExecution){
Expand All @@ -651,16 +689,19 @@ class ScheduledExecutionController {
}else{
flash.savedJob=scheduledExecution
flash.savedJobMessage="Saved changes to Job"
logJobChange(changeinfo,scheduledExecution.properties)
redirect(controller: 'scheduledExecution', action: 'show', params: [id: scheduledExecution.id])
}
}
def _doupdate = { params ->
def _doupdate = { params, changeinfo=[:] ->
log.debug("ScheduledExecutionController: update : attempting to update: "+params.id +
". params: " + params)
Framework framework = frameworkService.getFrameworkFromUserSession(session,request)
def user = (session?.user) ? session.user : "anonymous"
def rolelist = (session?.roles) ? session.roles : []

/**
* stores info about change for logging purposes
*/
if(params.groupPath ){
def re = /^\/*(.+?)\/*$/
def matcher = params.groupPath =~ re
Expand Down Expand Up @@ -752,6 +793,11 @@ class ScheduledExecutionController {
}

def boolean renamed = oldjobname!=scheduledExecution.generateJobScheduledName() || oldjobgroup!=scheduledExecution.generateJobGroupName()
if(renamed){
changeinfo.rename=true
changeinfo.origName=oldjobname
changeinfo.origGroup=oldjobgroup
}


if(!frameworkService.existsFrameworkProject(scheduledExecution.project,framework)){
Expand Down Expand Up @@ -981,7 +1027,7 @@ class ScheduledExecutionController {
}

}
def _doupdateJob = {id, ScheduledExecution params ->
def _doupdateJob = {id, ScheduledExecution params, changeinfo=[:] ->
log.debug("ScheduledExecutionController: update : attempting to update: "+id +
". params: " + params)
Framework framework = frameworkService.getFrameworkFromUserSession(session,request)
Expand Down Expand Up @@ -1326,9 +1372,11 @@ class ScheduledExecutionController {

def saveAndExec = {
log.info("ScheduledExecutionController: saveAndExec : params: " + params)
def scheduledExecution = _dosave(params)
def changeinfo = [user: session.user, change: 'create', method: 'saveAndExec']
def scheduledExecution = _dosave(params,change)
if(scheduledExecution.id){
params.id=scheduledExecution.id
logJobChange(changeinfo, scheduledExecution.properties)
if(!scheduledExecution.scheduled){
return redirect(action:execute,id:scheduledExecution.id)
}else{
Expand Down Expand Up @@ -2078,7 +2126,7 @@ class ScheduledExecutionController {

/**
*/
def _dosave = { params ->
def _dosave = { params, changeinfo=[:]->
log.info("ScheduledExecutionController: save : params: " + params)
Framework framework = frameworkService.getFrameworkFromUserSession(session,request)
def user = (session?.user) ? session.user : "anonymous"
Expand Down Expand Up @@ -2142,10 +2190,12 @@ class ScheduledExecutionController {
}

def save = {
def scheduledExecution = _dosave(params)
def changeinfo=[user:session.user,change:'create',method:'save']
def scheduledExecution = _dosave(params,changeinfo)
if(scheduledExecution.id){
flash.savedJob=scheduledExecution
flash.savedJobMessage="Created new Job"
logJobChange(changeinfo,scheduledExecution.properties)
redirect(controller:'scheduledExecution',action:'show',params:[id:scheduledExecution.id])
}else{
scheduledExecution.errors.allErrors.each { log.warn(it.defaultMessage) }
Expand Down Expand Up @@ -2185,7 +2235,7 @@ class ScheduledExecutionController {
/**
* Given list of imported jobs, create, update or skip them as defined by the dupeOption parameter.
*/
private def loadJobs={ jobset, option ->
private def loadJobs={ jobset, option, changeinfo=[:] ->
def jobs=[]
def jobsi=[]
def i=1
Expand All @@ -2195,6 +2245,7 @@ class ScheduledExecutionController {
jobset.each{ jobdata ->
log.debug("saving job data: ${jobdata}")
def ScheduledExecution scheduledExecution
def jobchange=new HashMap(changeinfo)
if(option=="update" || option=="skip"){
//look for dupe by name and group path and project
def c = ScheduledExecution.createCriteria()
Expand Down Expand Up @@ -2223,19 +2274,22 @@ class ScheduledExecutionController {
else if(option == "update" && scheduledExecution){
def success=false
def errmsg
jobchange.change = 'modify'
try{
def result
if(jobdata instanceof ScheduledExecution){
result = _doupdateJob(scheduledExecution.id,jobdata)
result = _doupdateJob(scheduledExecution.id,jobdata,jobchange)
}else{
jobdata.id=scheduledExecution.id
result = _doupdate(jobdata)
result = _doupdate(jobdata, jobchange)
}

success = result[0]
scheduledExecution=result[1]
if(!success && scheduledExecution && scheduledExecution.hasErrors()){
errmsg=scheduledExecution.errors.allErrors.collect {g.message(error: it)}.join("\n")
}else{
logJobChange(jobchange, scheduledExecution.properties)
}
}catch(Exception e){
errmsg=e.getMessage()
Expand All @@ -2251,9 +2305,12 @@ class ScheduledExecutionController {
}else if(option=="create" || !scheduledExecution){
def errmsg
try{
scheduledExecution = _dosave(jobdata)
jobchange.change='create'
scheduledExecution = _dosave(jobdata, jobchange)
if(scheduledExecution && scheduledExecution.hasErrors()){
errmsg=scheduledExecution.errors.allErrors.collect {g.message(error: it)}.join("\n")
}else{
logJobChange(jobchange, scheduledExecution.properties)
}
}catch(Exception e){
System.err.println("caught exception");
Expand Down Expand Up @@ -2306,8 +2363,8 @@ class ScheduledExecutionController {
}
}
jobset=parseresult.jobset

def loadresults = loadJobs(jobset,params.dupeOption)
def changeinfo = [user: session.user,method:'upload']
def loadresults = loadJobs(jobset,params.dupeOption,changeinfo)

def jobs = loadresults.jobs
def jobsi = loadresults.jobsi
Expand Down Expand Up @@ -2699,8 +2756,8 @@ class ScheduledExecutionController {
return chain(controller: 'api', action: 'error')
}
def jobset = parseresult.jobset

def loadresults = loadJobs(jobset,params.dupeOption)
def changeinfo = [user: session.user,method:'apiJobsImport']
def loadresults = loadJobs(jobset,params.dupeOption,changeinfo)

def jobs = loadresults.jobs
def jobsi = loadresults.jobsi
Expand Down Expand Up @@ -2786,6 +2843,8 @@ class ScheduledExecutionController {
flash.error = g.message(code:"api.error.item.doesnotexist",args:['Job ID',params.id])
return chain(controller: 'api', action: 'error')
}
def changeinfo = [user: session.user, method: 'apiJobDelete', change: 'delete']
def jobdata=scheduledExecution.properties
def jobname = scheduledExecution.generateJobScheduledName()
def groupname = scheduledExecution.generateJobGroupName()
def jobtitle="["+params.id+"] "+scheduledExecution.generateFullName()
Expand All @@ -2801,6 +2860,7 @@ class ScheduledExecutionController {
}
scheduledExecution.delete(flush:true)
scheduledExecutionService.deleteJob(jobname,groupname)
logJobChange(changeinfo,jobdata)
def resmsg= g.message(code:'api.success.job.delete.message',args:[jobtitle])

return new ApiController().success{ delegate->
Expand Down

0 comments on commit 9925bbd

Please sign in to comment.