PageRenderTime 49ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 1ms

/rundeckapp/grails-app/conf/spring/resources.groovy

http://github.com/dtolabs/rundeck
Groovy | 711 lines | 550 code | 83 blank | 78 comment | 25 complexity | 3848755e3f47e1c6d8b483ee03de2df0 MD5 | raw file
Possible License(s): Apache-2.0
  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. import com.dtolabs.rundeck.app.api.ApiMarshallerRegistrar
  17. import com.dtolabs.rundeck.app.gui.GroupedJobListLinkHandler
  18. import com.dtolabs.rundeck.app.gui.JobListLinkHandlerRegistry
  19. import com.dtolabs.rundeck.app.gui.SystemConfigMenuItem
  20. import com.dtolabs.rundeck.app.gui.SystemReportMenuItem
  21. import com.dtolabs.rundeck.app.gui.UserSummaryMenuItem
  22. import com.dtolabs.rundeck.app.internal.framework.ConfigFrameworkPropertyLookupFactory
  23. import com.dtolabs.rundeck.app.config.RundeckConfig
  24. import com.dtolabs.rundeck.app.internal.framework.FrameworkPropertyLookupFactory
  25. import com.dtolabs.rundeck.app.internal.framework.RundeckFilesystemProjectImporter
  26. import com.dtolabs.rundeck.app.internal.framework.RundeckFrameworkFactory
  27. import com.dtolabs.rundeck.core.Constants
  28. import com.dtolabs.rundeck.core.authorization.AclsUtil
  29. import com.dtolabs.rundeck.core.authorization.Log4jAuthorizationLogger
  30. import com.dtolabs.rundeck.core.authorization.providers.BaseValidatorImpl
  31. import com.dtolabs.rundeck.core.authorization.providers.ValidatorFactory
  32. import com.dtolabs.rundeck.core.authorization.providers.YamlValidator
  33. import com.dtolabs.rundeck.core.cluster.ClusterInfoService
  34. import com.dtolabs.rundeck.core.common.FrameworkFactory
  35. import com.dtolabs.rundeck.core.common.NodeSupport
  36. import com.dtolabs.rundeck.core.execution.logstorage.ExecutionFileManagerService
  37. import com.dtolabs.rundeck.core.plugins.FilePluginCache
  38. import com.dtolabs.rundeck.core.plugins.JarPluginScanner
  39. import com.dtolabs.rundeck.core.plugins.PluginManagerService
  40. import com.dtolabs.rundeck.core.plugins.ScriptPluginScanner
  41. import com.dtolabs.rundeck.core.plugins.WatchingPluginDirProvider
  42. import com.dtolabs.rundeck.core.resources.format.ResourceFormats
  43. import com.dtolabs.rundeck.core.storage.AuthRundeckStorageTree
  44. import com.dtolabs.rundeck.core.storage.KeyStorageContextProvider
  45. import com.dtolabs.rundeck.core.storage.ProjectKeyStorageContextProvider
  46. import com.dtolabs.rundeck.core.storage.StorageTreeFactory
  47. import com.dtolabs.rundeck.core.storage.TreeStorageManager
  48. import com.dtolabs.rundeck.core.utils.GrailsServiceInjectorJobListener
  49. import com.dtolabs.rundeck.core.utils.RequestAwareLinkGenerator
  50. import com.dtolabs.rundeck.plugins.ServiceNameConstants
  51. import com.dtolabs.rundeck.server.plugins.PluginCustomizer
  52. import com.dtolabs.rundeck.server.plugins.RundeckEmbeddedPluginExtractor
  53. import com.dtolabs.rundeck.server.plugins.RundeckPluginRegistry
  54. import com.dtolabs.rundeck.server.plugins.fileupload.FSFileUploadPlugin
  55. import com.dtolabs.rundeck.server.plugins.loader.ApplicationContextPluginFileSource
  56. import com.dtolabs.rundeck.server.plugins.logging.*
  57. import com.dtolabs.rundeck.server.plugins.logs.*
  58. import com.dtolabs.rundeck.server.plugins.logstorage.TreeExecutionFileStoragePlugin
  59. import com.dtolabs.rundeck.server.plugins.logstorage.TreeExecutionFileStoragePluginFactory
  60. import com.dtolabs.rundeck.server.plugins.notification.DummyEmailNotificationPlugin
  61. import com.dtolabs.rundeck.server.plugins.notification.DummyWebhookNotificationPlugin
  62. import com.dtolabs.rundeck.server.plugins.services.*
  63. import com.dtolabs.rundeck.server.plugins.storage.DbStoragePlugin
  64. import com.dtolabs.rundeck.server.plugins.storage.DbStoragePluginFactory
  65. import com.dtolabs.rundeck.server.AuthContextEvaluatorCacheManager
  66. import grails.plugin.springsecurity.SpringSecurityUtils
  67. import grails.util.Environment
  68. import groovy.io.FileType
  69. import org.rundeck.app.AppRestarter
  70. import org.rundeck.app.api.ApiInfo
  71. import org.rundeck.app.authorization.BaseAuthContextEvaluator
  72. import org.rundeck.app.authorization.BaseAuthContextProcessor
  73. import org.rundeck.app.authorization.BaseAuthContextProvider
  74. import org.rundeck.app.authorization.ContextACLStorageFileManagerFactory
  75. import org.rundeck.app.authorization.RundeckAuthorizedServicesProvider
  76. import org.rundeck.app.authorization.TimedAuthContextEvaluator
  77. import org.rundeck.app.authorization.WebAuthContextProcessor
  78. import org.rundeck.app.cluster.ClusterInfo
  79. import org.rundeck.app.components.RundeckJobDefinitionManager
  80. import org.rundeck.app.components.JobXMLFormat
  81. import org.rundeck.app.components.JobYAMLFormat
  82. import org.rundeck.app.services.EnhancedNodeService
  83. import org.rundeck.app.spi.RundeckSpiBaseServicesProvider
  84. import org.rundeck.security.*
  85. import org.rundeck.web.infosec.ContainerPrincipalRoleSource
  86. import org.rundeck.web.infosec.ContainerRoleSource
  87. import org.rundeck.web.infosec.HMacSynchronizerTokensManager
  88. import org.rundeck.web.infosec.PreauthenticatedAttributeRoleSource
  89. import org.springframework.beans.factory.config.MapFactoryBean
  90. import org.springframework.boot.web.servlet.FilterRegistrationBean
  91. import org.springframework.core.task.SimpleAsyncTaskExecutor
  92. import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor
  93. import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler
  94. import org.springframework.security.authentication.dao.DaoAuthenticationProvider
  95. import org.springframework.security.core.session.SessionRegistryImpl
  96. import org.springframework.security.provisioning.InMemoryUserDetailsManager
  97. import org.springframework.security.web.authentication.logout.CookieClearingLogoutHandler
  98. import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider
  99. import org.springframework.security.web.authentication.session.CompositeSessionAuthenticationStrategy
  100. import org.springframework.security.web.authentication.session.ConcurrentSessionControlAuthenticationStrategy
  101. import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy
  102. import org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy
  103. import org.springframework.security.web.jaasapi.JaasApiIntegrationFilter
  104. import org.springframework.security.web.session.ConcurrentSessionFilter
  105. import rundeck.interceptors.DefaultInterceptorHelper
  106. import rundeck.services.DirectNodeExecutionService
  107. import rundeck.services.ExecutionValidatorService
  108. import rundeck.services.LocalJobSchedulesManager
  109. import rundeck.services.PasswordFieldsService
  110. import rundeck.services.QuartzJobScheduleManagerService
  111. import rundeck.services.audit.AuditEventsService
  112. import rundeck.services.jobs.JobQueryService
  113. import rundeck.services.jobs.LocalJobQueryService
  114. import rundeck.services.scm.ScmJobImporter
  115. import rundeckapp.init.ExternalStaticResourceConfigurer
  116. import rundeckapp.init.PluginCachePreloader
  117. import rundeckapp.init.RundeckConfigReloader
  118. import rundeckapp.init.RundeckExtendedMessageBundle
  119. import rundeckapp.init.servlet.JettyServletContainerCustomizer
  120. import javax.security.auth.login.Configuration
  121. beans={
  122. xmlns context: "http://www.springframework.org/schema/context"
  123. // if (Environment.PRODUCTION == Environment.current) {
  124. // log4jConfigurer(org.springframework.beans.factory.config.MethodInvokingFactoryBean) {
  125. // targetClass = "org.springframework.util.Log4jConfigurer"
  126. // targetMethod = "initLogging"
  127. // arguments = ["classpath:log4j.properties"]
  128. // }
  129. // }
  130. if (application.config.rundeck.multiURL?.enabled in ['true',true]) {
  131. Class requestAwareLinkGeneratorClass = RequestAwareLinkGenerator
  132. String serverURL = application.config.grails.serverURL
  133. String contextPath = application.config.server.servlet["context-path"]
  134. if (serverURL && (contextPath && "/" != contextPath)) {
  135. log.info("RequestAwareLinkGenerator using url ${serverURL} and context-path ${contextPath}")
  136. grailsLinkGenerator(requestAwareLinkGeneratorClass, serverURL, contextPath) {}
  137. } else if (serverURL) {
  138. log.info("context-path not set, RequestAwareLinkGenerator using url ${serverURL}")
  139. grailsLinkGenerator(requestAwareLinkGeneratorClass, serverURL) {}
  140. } else {
  141. log.warn("rundeck.multiURL enabled but no grails.serverURL found. This feature will be disabled.")
  142. }
  143. }
  144. defaultGrailsServiceInjectorJobListener(GrailsServiceInjectorJobListener){
  145. name= 'defaultGrailsServiceInjectorJobListener'
  146. services=[grailsApplication: ref('grailsApplication'),
  147. executionService: ref('executionService'),
  148. frameworkService: ref('frameworkService'),
  149. metricRegistry:ref('metricRegistry'),
  150. executionUtilService:ref('executionUtilService'),
  151. jobSchedulerService:ref('jobSchedulerService'),
  152. authContextProvider:ref('rundeckAuthContextProvider'),
  153. jobSchedulesService:ref('jobSchedulesService')]
  154. quartzScheduler=ref('quartzScheduler')
  155. }
  156. def rdeckBase
  157. if (!application.config.rdeck.base) {
  158. //look for system property
  159. rdeckBase = System.getProperty('rdeck.base')
  160. } else {
  161. rdeckBase = application.config.rdeck.base
  162. }
  163. if(!rdeckBase){
  164. System.err.println("rdeck.base was not defined in application config or as a system property")
  165. return
  166. }
  167. rundeckI18nEnhancer(RundeckExtendedMessageBundle, ref("messageSource"),"file:${rdeckBase}/i18n/messages".toString())
  168. if(application.config.rundeck.gui.staticUserResources.enabled in ['true',true]) {
  169. externalStaticResourceConfigurer(ExternalStaticResourceConfigurer) {
  170. resourceUriLocation = application.config.rundeck.gui.staticUserResources.filesystemLocation.isEmpty() ? "file:${rdeckBase}/user-assets/" : application.config.rundeck.gui.staticUserResources.filesystemLocation
  171. }
  172. }
  173. def serverLibextDir = application.config.rundeck?.server?.plugins?.dir?:"${rdeckBase}/libext"
  174. File pluginDir = new File(serverLibextDir)
  175. def serverLibextCacheDir = application.config.rundeck?.server?.plugins?.cacheDir?:"${serverLibextDir}/cache"
  176. File cacheDir= new File(serverLibextCacheDir)
  177. File varDir= new File(Constants.getBaseVar(rdeckBase))
  178. rundeckNodeService(EnhancedNodeService)
  179. if(application.config.rundeck.loadFrameworkPropertiesFromRundeckConfig in ["true",true]) {
  180. frameworkPropertyLookupFactory(ConfigFrameworkPropertyLookupFactory) { }
  181. } else {
  182. frameworkPropertyLookupFactory(FrameworkPropertyLookupFactory){
  183. baseDir=rdeckBase
  184. }
  185. }
  186. frameworkPropertyLookup(frameworkPropertyLookupFactory:'create'){
  187. }
  188. rundeckNodeSupport(NodeSupport){
  189. lookup = ref('frameworkPropertyLookup')
  190. }
  191. frameworkFilesystem(FrameworkFactory,rdeckBase){ bean->
  192. bean.factoryMethod='createFilesystemFramework'
  193. }
  194. //NB: retained for compatibilty for upgrading from <3.4, should be removed after 3.4
  195. filesystemProjectManager(FrameworkFactory,frameworkFilesystem,ref('rundeckNodeService')){ bean->
  196. bean.factoryMethod='createProjectManager'
  197. }
  198. rundeckFilesystemProjectImporter(RundeckFilesystemProjectImporter){
  199. importFilesOption = application.config.rundeck?.projectsStorageImportFilesOption ?: 'known'
  200. importStartupMode = application.config.rundeck?.projectsStorageImportStartupMode ?: 'bootstrap'
  201. }
  202. frameworkFactory(RundeckFrameworkFactory){
  203. frameworkFilesystem=frameworkFilesystem
  204. propertyLookup=ref('frameworkPropertyLookup')
  205. type=application.config.rundeck?.projectsStorageType?:'db'
  206. dbProjectManager=ref('projectManagerService')
  207. pluginManagerService=ref('rundeckServerServiceProviderLoader')
  208. }
  209. rundeckFramework(frameworkFactory:'createFramework'){
  210. }
  211. clusterInfoService(ClusterInfo) {
  212. clusterInfoServiceDelegate = ref('frameworkService')
  213. }
  214. rundeckApiInfoService(ApiInfo)
  215. rundeckSpiBaseServicesProvider(RundeckSpiBaseServicesProvider) {
  216. services = [
  217. (ClusterInfoService) : ref('clusterInfoService'),
  218. (ApiInfo) : ref('rundeckApiInfoService'),
  219. (ExecutionFileManagerService): ref('logFileStorageService'),
  220. (ResourceFormats) : ref('pluginService')
  221. ]
  222. }
  223. directNodeExecutionService(DirectNodeExecutionService)
  224. rundeckAuthorizedServicesProvider(RundeckAuthorizedServicesProvider) {
  225. baseServices = ref('rundeckSpiBaseServicesProvider')
  226. }
  227. authContextEvaluatorCacheManager(AuthContextEvaluatorCacheManager){
  228. enabled = !(grailsApplication.config.rundeck?.auth?.evaluation?.cache?.enabled in ["false", false])
  229. expirationTime = grailsApplication.config.rundeck?.auth?.evaluation?.cache?.expire ?
  230. grailsApplication.config.rundeck?.auth?.evaluation?.cache?.expire?.toLong() : 120
  231. metricService = ref('metricService')
  232. }
  233. baseAuthContextEvaluator(BaseAuthContextEvaluator){
  234. authContextEvaluatorCacheManager = ref('authContextEvaluatorCacheManager')
  235. nodeSupport = ref('rundeckNodeSupport')
  236. }
  237. rundeckAuthContextEvaluator(TimedAuthContextEvaluator){
  238. rundeckAuthContextEvaluator = ref('baseAuthContextEvaluator')
  239. }
  240. rundeckYamlAclValidatorFactory(BaseValidatorImpl){bean->
  241. bean.factoryMethod = 'factory'
  242. }
  243. rundeckYamlAclValidator(YamlValidator)
  244. rundeckAuthContextProvider(BaseAuthContextProvider)
  245. rundeckAuthContextProcessor(BaseAuthContextProcessor){
  246. rundeckAuthContextProvider=ref('rundeckAuthContextProvider')
  247. rundeckAuthContextEvaluator=ref('rundeckAuthContextEvaluator')
  248. }
  249. rundeckWebAuthContextProcessor(WebAuthContextProcessor){
  250. authContextProcessor = ref('rundeckAuthContextProcessor')
  251. }
  252. aclStorageFileManager(ContextACLStorageFileManagerFactory){
  253. systemPrefix = ContextACLStorageFileManagerFactory.ACL_STORAGE_PATH_BASE
  254. projectPattern = ContextACLStorageFileManagerFactory.ACL_PROJECT_STORAGE_PATH_PATTERN
  255. projectsStorageType=application.config.rundeck?.projectsStorageType?:'db'
  256. validatorFactory=ref('rundeckYamlAclValidatorFactory')
  257. }
  258. def configDir = new File(Constants.getFrameworkConfigDir(rdeckBase))
  259. log4jAuthorizationLogger(Log4jAuthorizationLogger)
  260. rundeckFilesystemPolicyAuthorization(AclsUtil, configDir, ref('log4jAuthorizationLogger')){ bean->
  261. bean.factoryMethod='createFromDirectory'
  262. }
  263. rundeckJobScheduleManager(QuartzJobScheduleManagerService){
  264. quartzScheduler=ref('quartzScheduler')
  265. }
  266. rundeckJobSchedulesManager(LocalJobSchedulesManager){
  267. scheduledExecutionService = ref('scheduledExecutionService')
  268. frameworkService = ref('frameworkService')
  269. quartzScheduler = ref('quartzScheduler')
  270. }
  271. executionValidatorService(ExecutionValidatorService)
  272. localJobQueryService(LocalJobQueryService)
  273. jobQueryService(JobQueryService){
  274. localJobQueryService = ref('localJobQueryService')
  275. }
  276. //cache for provider loaders bound to a file
  277. providerFileCache(PluginManagerService) { bean ->
  278. bean.factoryMethod = 'createProviderLoaderFileCache'
  279. }
  280. pluginDirProvider(WatchingPluginDirProvider, pluginDir)
  281. //scan for jar plugins
  282. jarPluginScanner(JarPluginScanner, ref('pluginDirProvider'), cacheDir, ref('providerFileCache'))
  283. //scan for script-based plugins
  284. scriptPluginScanner(ScriptPluginScanner, ref('pluginDirProvider'), cacheDir, ref('providerFileCache'))
  285. //cache for plugins loaded via scanners
  286. filePluginCache(FilePluginCache, ref('providerFileCache')) {
  287. scanners = [
  288. ref('jarPluginScanner'),
  289. ref('scriptPluginScanner')
  290. ]
  291. }
  292. /*
  293. * Define beans for Rundeck core-style plugin loader to load plugins from jar/zip files
  294. */
  295. rundeckServerServiceProviderLoader(PluginManagerService) {
  296. extdir = pluginDir
  297. cachedir = cacheDir
  298. cache = filePluginCache
  299. serviceAliases = [WorkflowNodeStep: 'RemoteScriptNodeStep']
  300. }
  301. /**
  302. * the Job life cycle plugin provider service
  303. */
  304. jobLifecyclePluginProviderService(JobLifecyclePluginProviderService){
  305. rundeckServerServiceProviderLoader=ref('rundeckServerServiceProviderLoader')
  306. }
  307. /**
  308. * the Execution life cycle plugin provider service
  309. */
  310. executionLifecyclePluginProviderService(ExecutionLifecyclePluginProviderService){
  311. rundeckServerServiceProviderLoader=ref('rundeckServerServiceProviderLoader')
  312. }
  313. /**
  314. * the Notification plugin provider service
  315. */
  316. notificationPluginProviderService(NotificationPluginProviderService){
  317. rundeckServerServiceProviderLoader=ref('rundeckServerServiceProviderLoader')
  318. }
  319. /**
  320. * the StreamingLogReader plugin provider service
  321. */
  322. streamingLogReaderPluginProviderService(StreamingLogReaderPluginProviderService){
  323. rundeckServerServiceProviderLoader=ref('rundeckServerServiceProviderLoader')
  324. }
  325. /**
  326. * the StreamingLogReader plugin provider service
  327. */
  328. streamingLogWriterPluginProviderService(StreamingLogWriterPluginProviderService){
  329. rundeckServerServiceProviderLoader=ref('rundeckServerServiceProviderLoader')
  330. }
  331. /**
  332. * the LogFileStorage plugin provider service (rundeck v2.0+)
  333. */
  334. executionFileStoragePluginProviderService(ExecutionFileStoragePluginProviderService) {
  335. rundeckServerServiceProviderLoader = ref('rundeckServerServiceProviderLoader')
  336. // pluginRegistry=ref("rundeckPluginRegistry")
  337. }
  338. logFileTaskExecutor(SimpleAsyncTaskExecutor, "LogFileTask") {
  339. concurrencyLimit = 1 + (application.config.rundeck?.execution?.logs?.fileStorage?.retrievalTasks?.concurrencyLimit ?: 5)
  340. }
  341. logFileStorageTaskExecutor(SimpleAsyncTaskExecutor, "LogFileStorageTask") {
  342. concurrencyLimit = 1 + (application.config.rundeck?.execution?.logs?.fileStorage?.storageTasks?.concurrencyLimit ?: 10)
  343. }
  344. logFileStorageTaskScheduler(ThreadPoolTaskScheduler) {
  345. threadNamePrefix="LogFileStorageScheduledTask"
  346. poolSize= (application.config.rundeck?.execution?.logs?.fileStorage?.scheduledTasks?.poolSize ?: 5)
  347. }
  348. logFileStorageDeleteRemoteTask(ThreadPoolTaskExecutor) {
  349. threadNamePrefix="LogFileStorageDeleteRemoteTask"
  350. maxPoolSize= (application.config.rundeck?.execution?.logs?.fileStorage?.removeTasks?.poolSize ?: 5)
  351. }
  352. nodeTaskExecutor(SimpleAsyncTaskExecutor,"NodeService-SourceLoader") {
  353. concurrencyLimit = (application.config.rundeck?.nodeService?.concurrencyLimit ?: 25) //-1 for unbounded
  354. }
  355. //alternately use ThreadPoolTaskExecutor ...
  356. // nodeTaskExecutor(ThreadPoolTaskExecutor) {
  357. // threadNamePrefix="NodeService-SourceLoader"
  358. // corePoolSize= (application.config.rundeck?.nodeService?.corePoolSize ?: 5)
  359. // maxPoolSize= (application.config.rundeck?.nodeService?.maxPoolSize ?: 40)
  360. // }
  361. pluggableStoragePluginProviderService(PluggableStoragePluginProviderService) {
  362. rundeckServerServiceProviderLoader = ref('rundeckServerServiceProviderLoader')
  363. }
  364. storagePluginProviderService(StoragePluginProviderService) {
  365. pluggableStoragePluginProviderService = ref('pluggableStoragePluginProviderService')
  366. }
  367. storageConverterPluginProviderService(StorageConverterPluginProviderService) {
  368. rundeckServerServiceProviderLoader = ref('rundeckServerServiceProviderLoader')
  369. }
  370. rundeckJobDefinitionManager(RundeckJobDefinitionManager)
  371. rundeckJobXmlFormat(JobXMLFormat)
  372. rundeckJobYamlFormat(JobYAMLFormat) {
  373. trimSpacesFromLines = application.config.getProperty('rundeck.job.export.yaml.trimSpaces', Boolean)
  374. }
  375. scmExportPluginProviderService(ScmExportPluginProviderService) {
  376. rundeckServerServiceProviderLoader = ref('rundeckServerServiceProviderLoader')
  377. }
  378. scmImportPluginProviderService(ScmImportPluginProviderService) {
  379. rundeckServerServiceProviderLoader = ref('rundeckServerServiceProviderLoader')
  380. }
  381. uiPluginProviderService(UIPluginProviderService,rundeckFramework) {
  382. rundeckServerServiceProviderLoader = ref('rundeckServerServiceProviderLoader')
  383. }
  384. auditEventsService(AuditEventsService){
  385. frameworkService = ref('frameworkService')
  386. }
  387. scmJobImporter(ScmJobImporter)
  388. containerPrincipalRoleSource(ContainerPrincipalRoleSource){
  389. enabled=grailsApplication.config.rundeck?.security?.authorization?.containerPrincipal?.enabled in [true,'true']
  390. }
  391. containerRoleSource(ContainerRoleSource){
  392. enabled=grailsApplication.config.rundeck?.security?.authorization?.container?.enabled in [true,'true']
  393. }
  394. preauthenticatedAttributeRoleSource(PreauthenticatedAttributeRoleSource){
  395. enabled=grailsApplication.config.rundeck?.security?.authorization?.preauthenticated?.enabled in [true,'true']
  396. attributeName=grailsApplication.config.rundeck?.security?.authorization?.preauthenticated?.attributeName
  397. delimiter=grailsApplication.config.rundeck?.security?.authorization?.preauthenticated?.delimiter
  398. }
  399. def storageDir= new File(varDir, 'storage')
  400. rundeckStorageTreeFactory(StorageTreeFactory){
  401. frameworkPropertyLookup=ref('frameworkPropertyLookup')
  402. pluginRegistry=ref("rundeckPluginRegistry")
  403. storagePluginProviderService=ref('storagePluginProviderService')
  404. storageConverterPluginProviderService=ref('storageConverterPluginProviderService')
  405. configuration = application.config.rundeck?.storage?.toFlatConfig()
  406. storageConfigPrefix='provider'
  407. converterConfigPrefix='converter'
  408. baseStorageType='file'
  409. baseStorageConfig=['baseDir':storageDir.getAbsolutePath()]
  410. defaultConverters=['StorageTimestamperConverter','KeyStorageLayer']
  411. loggerName='org.rundeck.storage.events'
  412. }
  413. rundeckStorageTree(rundeckStorageTreeFactory:"createTree")
  414. if(!(grailsApplication.config.rundeck?.feature?.projectKeyStorage?.enabled in [false,'false'])) {
  415. rundeckKeyStorageContextProvider(ProjectKeyStorageContextProvider)
  416. }else{
  417. rundeckKeyStorageContextProvider(KeyStorageContextProvider)
  418. }
  419. authRundeckStorageTree(AuthRundeckStorageTree, rundeckStorageTree, rundeckKeyStorageContextProvider)
  420. rundeckConfigStorageTreeFactory(StorageTreeFactory){
  421. frameworkPropertyLookup=ref('frameworkPropertyLookup')
  422. pluginRegistry=ref("rundeckPluginRegistry")
  423. storagePluginProviderService=ref('storagePluginProviderService')
  424. storageConverterPluginProviderService=ref('storageConverterPluginProviderService')
  425. configuration = application.config.rundeck?.config?.storage?.toFlatConfig()
  426. storageConfigPrefix='provider'
  427. converterConfigPrefix='converter'
  428. baseStorageType='db'
  429. baseStorageConfig=[namespace:'config']
  430. defaultConverters=['StorageTimestamperConverter']
  431. loggerName='org.rundeck.config.storage.events'
  432. }
  433. rundeckConfigStorageTree(rundeckConfigStorageTreeFactory:"createTree")
  434. rundeckConfigStorageManager(TreeStorageManager, ref('rundeckConfigStorageTree')){ bean->
  435. bean.factoryMethod='createFromStorageTree'
  436. }
  437. /**
  438. * Define groovy-based plugins as Spring beans, registered in a hash map
  439. */
  440. pluginCustomizer(PluginCustomizer){
  441. pluginRegistry = ref("rundeckPluginRegistryMap")
  442. }
  443. xmlns lang: 'http://www.springframework.org/schema/lang'
  444. appContextEmbeddedPluginFileSource(ApplicationContextPluginFileSource, '/WEB-INF/rundeck/plugins/')
  445. rundeckEmbeddedPluginExtractor(RundeckEmbeddedPluginExtractor) {
  446. pluginTargetDir = pluginDir
  447. rundeckPluginBlocklist = ref("rundeckPluginBlocklist")
  448. }
  449. def pluginRegistry=[:]
  450. if (pluginDir.exists()) {
  451. pluginDir.eachFileMatch(FileType.FILES, ~/.*\.groovy/) { File plugin ->
  452. String beanName = plugin.name.replace('.groovy', '')
  453. lang.groovy(id: beanName, 'script-source': "file:${pluginDir}/${plugin.name}",
  454. 'refresh-check-delay': application.config.plugin.refreshDelay ?: -1,
  455. 'customizer-ref':'pluginCustomizer'
  456. )
  457. }
  458. }
  459. dbStoragePluginFactory(DbStoragePluginFactory)
  460. pluginRegistry[ServiceNameConstants.Storage + ':' + DbStoragePlugin.PROVIDER_NAME]='dbStoragePluginFactory'
  461. storageTreeExecutionFileStoragePluginFactory(TreeExecutionFileStoragePluginFactory)
  462. pluginRegistry[ServiceNameConstants.ExecutionFileStorage + ":" + TreeExecutionFileStoragePlugin.PROVIDER_NAME] = 'storageTreeExecutionFileStoragePluginFactory'
  463. def uploadsDir = new File(varDir, 'upload')
  464. fsFileUploadPlugin(FSFileUploadPlugin) {
  465. basePath = uploadsDir.absolutePath
  466. }
  467. pluginRegistry[ServiceNameConstants.FileUpload + ":" +FSFileUploadPlugin.PROVIDER_NAME] = 'fsFileUploadPlugin'
  468. //list of plugin classes to generate factory beans for
  469. [
  470. //log converters
  471. JsonConverterPlugin,
  472. PropertiesConverterPlugin,
  473. HTMLTableViewConverterPlugin,
  474. MarkdownConverterPlugin,
  475. TabularDataConverterPlugin,
  476. HTMLViewConverterPlugin,
  477. //log filters
  478. MaskPasswordsFilterPlugin,
  479. MaskLogOutputByRegexPlugin,
  480. SimpleDataFilterPlugin,
  481. RenderDatatypeFilterPlugin,
  482. QuietFilterPlugin,
  483. HighlightFilterPlugin
  484. ].each {
  485. "rundeckAppPlugin_${it.simpleName}"(PluginFactoryBean, it)
  486. }
  487. //enable dummy notification plugins for new Notifications UI
  488. [
  489. DummyEmailNotificationPlugin,
  490. DummyWebhookNotificationPlugin,].each {
  491. "rundeckAppPlugin_${it.simpleName}"(PluginFactoryBean, it)
  492. }
  493. //TODO: scan defined plugins:
  494. // context.'component-scan'('base-package': "com.dtolabs.rundeck.server.plugins.logging")
  495. rundeckPluginRegistryMap(MapFactoryBean) {
  496. sourceMap = pluginRegistry
  497. }
  498. rundeckPluginBlocklist(RundeckPluginBlocklist){
  499. blockListFileName= application.config.rundeck?.plugins?.providerBlockListFile?: null
  500. }
  501. /**
  502. * Registry bean contains both kinds of plugin
  503. */
  504. rundeckPluginRegistry(RundeckPluginRegistry){
  505. rundeckEmbeddedPluginExtractor = ref('rundeckEmbeddedPluginExtractor')
  506. pluginRegistryMap = ref('rundeckPluginRegistryMap')
  507. rundeckServerServiceProviderLoader=ref('rundeckServerServiceProviderLoader')
  508. pluginDirectory=pluginDir
  509. pluginCacheDirectory=cacheDir
  510. rundeckPluginBlocklist=ref("rundeckPluginBlocklist")
  511. }
  512. hMacSynchronizerTokensManager(HMacSynchronizerTokensManager){
  513. }
  514. /**
  515. * Track passwords on these plugins
  516. */
  517. obscurePasswordFieldsService(PasswordFieldsService)
  518. resourcesPasswordFieldsService(PasswordFieldsService)
  519. execPasswordFieldsService(PasswordFieldsService)
  520. pluginsPasswordFieldsService(PasswordFieldsService)
  521. fcopyPasswordFieldsService(PasswordFieldsService)
  522. /// XML/JSON custom marshaller support
  523. apiMarshallerRegistrar(ApiMarshallerRegistrar)
  524. //Job List Link Handler
  525. defaultJobListLinkHandler(GroupedJobListLinkHandler)
  526. jobListLinkHandlerRegistry(JobListLinkHandlerRegistry) {
  527. defaultHandlerName = application.config.rundeck?.gui?.defaultJobList?:GroupedJobListLinkHandler.NAME
  528. }
  529. userSummaryMenuItem(UserSummaryMenuItem)
  530. systemReportMenuItem(SystemReportMenuItem)
  531. systemConfigMenuItem(SystemConfigMenuItem)
  532. rundeckUserDetailsService(RundeckUserDetailsService)
  533. rundeckJaasAuthorityGranter(RundeckJaasAuthorityGranter){
  534. rolePrefix=grailsApplication.config.rundeck.security.jaasRolePrefix?.toString()?:''
  535. }
  536. if(!grailsApplication.config.rundeck.logout.expire.cookies.isEmpty()) {
  537. cookieClearingLogoutHandler(CookieClearingLogoutHandler,grailsApplication.config.rundeck.logout.expire.cookies.split(","))
  538. SpringSecurityUtils.registerLogoutHandler("cookieClearingLogoutHandler")
  539. }
  540. if(grailsApplication.config.rundeck.security.enforceMaxSessions in [true,'true']) {
  541. sessionRegistry(SessionRegistryImpl)
  542. concurrentSessionFilter(ConcurrentSessionFilter, sessionRegistry)
  543. registerSessionAuthenticationStrategy(RegisterSessionAuthenticationStrategy, ref('sessionRegistry')) {}
  544. concurrentSessionControlAuthenticationStrategy(
  545. ConcurrentSessionControlAuthenticationStrategy,
  546. ref('sessionRegistry')
  547. ) {
  548. exceptionIfMaximumExceeded = false
  549. maximumSessions = grailsApplication.config.rundeck.security.maxSessions ? grailsApplication.config.rundeck.security.maxSessions.toInteger() : 1
  550. }
  551. sessionFixationProtectionStrategy(SessionFixationProtectionStrategy) {
  552. migrateSessionAttributes = grailsApplication.config.grails.plugin.springsecurity.sessionFixationPrevention.migrate
  553. // true
  554. alwaysCreateSession = grailsApplication.config.grails.plugin.springsecurity.sessionFixationPrevention.alwaysCreateSession
  555. // false
  556. }
  557. sessionAuthenticationStrategy(
  558. CompositeSessionAuthenticationStrategy,
  559. [concurrentSessionControlAuthenticationStrategy, sessionFixationProtectionStrategy, registerSessionAuthenticationStrategy]
  560. )
  561. }
  562. //spring security preauth filter configuration
  563. if(grailsApplication.config.rundeck.security.authorization.preauthenticated.enabled in [true,'true']) {
  564. rundeckPreauthSuccessEventHandler(RundeckPreauthSuccessEventHandler) {
  565. configurationService = ref('configurationService')
  566. }
  567. rundeckPreauthFilter(RundeckPreauthenticationRequestHeaderFilter) {
  568. enabled = grailsApplication.config.rundeck?.security?.authorization?.preauthenticated?.enabled in [true, 'true']
  569. userNameHeader = grailsApplication.config.rundeck?.security?.authorization?.preauthenticated?.userNameHeader
  570. rolesHeader = grailsApplication.config.rundeck?.security?.authorization?.preauthenticated?.userRolesHeader
  571. rolesAttribute = grailsApplication.config.rundeck?.security?.authorization?.preauthenticated?.attributeName
  572. authenticationManager = ref('authenticationManager')
  573. authenticationSuccessHandler = ref("rundeckPreauthSuccessEventHandler")
  574. }
  575. rundeckPreauthFilterDeReg(FilterRegistrationBean) {
  576. filter = ref("rundeckPreauthFilter")
  577. enabled = false
  578. }
  579. }
  580. if(grailsApplication.config.rundeck.security.authorization.preauthenticated.enabled in [true,'true']
  581. || grailsApplication.config.grails.plugin.springsecurity.useX509 in [true,'true']) {
  582. preAuthenticatedAuthProvider(PreAuthenticatedAuthenticationProvider) {
  583. preAuthenticatedUserDetailsService = ref('rundeckUserDetailsService')
  584. }
  585. }
  586. if(grailsApplication.config.rundeck.useJaas in [true,'true']) {
  587. //spring security jaas configuration
  588. jaasApiIntegrationFilter(JaasApiIntegrationFilter)
  589. jaasAuthProvider(RundeckJaasAuthenticationProvider) {
  590. configuration = Configuration.getConfiguration()
  591. loginContextName = grailsApplication.config.rundeck.security.jaasLoginModuleName
  592. authorityGranters = [
  593. ref('rundeckJaasAuthorityGranter')
  594. ]
  595. }
  596. } else {
  597. jettyCompatiblePasswordEncoder(JettyCompatibleSpringSecurityPasswordEncoder)
  598. //if not using jaas for security provide a simple default
  599. Properties realmProperties = new Properties()
  600. realmProperties.load(new File(grailsApplication.config.rundeck.security.fileUserDataSource).newInputStream())
  601. realmPropertyFileDataSource(InMemoryUserDetailsManager, realmProperties)
  602. realmAuthProvider(DaoAuthenticationProvider) {
  603. passwordEncoder = ref("jettyCompatiblePasswordEncoder")
  604. userDetailsService = ref('realmPropertyFileDataSource')
  605. }
  606. }
  607. jettyServletCustomizer(JettyServletContainerCustomizer) {
  608. def configParams = grailsApplication.config.rundeck?.web?.jetty?.servlet?.initParams
  609. initParams = configParams?.toProperties()?.collectEntries {
  610. [it.key.toString(), it.value.toString()]
  611. }
  612. }
  613. rundeckAuthSuccessEventListener(RundeckAuthSuccessEventListener) {
  614. frameworkService = ref('frameworkService')
  615. }
  616. if(grailsApplication.config.rundeck.security.syncLdapUser in [true,'true']) {
  617. rundeckJaasAuthenticationSuccessEventListener(RundeckJaasAuthenticationSuccessEventListener) {
  618. configurationService = ref('configurationService')
  619. }
  620. }
  621. rundeckConfig(RundeckConfig)
  622. if(!Environment.isWarDeployed()) {
  623. appRestarter(AppRestarter)
  624. }
  625. rundeckConfigReloader(RundeckConfigReloader)
  626. pluginCachePreloader(PluginCachePreloader)
  627. interceptorHelper(DefaultInterceptorHelper)
  628. }