|
|
Datasrc
Action : tom.datasrc (Category : tom, Name : datasrc, By : kikonf)
Complete Name : tom.datasrc.by.kikonf
Version : 4.0 License : Modified BSD License
Purpose of the tom category :
Easy to customize. This category use in background the Kikonf Repoz tools to create and configure Apache Tomcat ®
root installs and Catalina bases at any level ( server.xml, hosts or defaults).
You can use it to manage the whole Tomcat ® Architecture.
Purpose of this datasrc plugin : This Action configures a JDBC Datasource (JNDI).
The following shows the main Source Code File for the Action : tom.datasrc
Toggle lines
## Copyright (c) 2008, Patrick Germain Placidoux
## All rights reserved.
##
## This file is part of Kikonf Public Software.
##
## Kikonf Public Software is released under the modified BSD License,
## which should accompany it or any part of it in the file "COPYING".
## If you do not have this file you can access the license
## through the WWW at http://www.kikonf.org/license/bsd/license.txt.
##
## Home: http://www.kikonf.org
## Contact: kikonf@gmx.com
DATABASES={
'derby':{
'class_name' : 'org.apache.derby.jdbc.EmbeddedDriver',
'url_pattern' : 'jdbc:derby:Databases/DBNAME'
},
'hsql':{
'class_name' : 'org.hsql.jdbcDriver',
'url_pattern' : 'jdbc:HypersonicSQL:DBNAME'
},
'mysql':{
'class_name' : 'com.mysql.jdbc.Driver',
'url_pattern' : 'jdbc:mysql://HOST:PORT/DBNAME'
},
'psql':{
'class_name' : 'org.postgresql.Driver',
'url_pattern' : 'jdbc:postgresql://HOST:PORT/DBNAME'
},
'oracle':{
'class_name' : 'oracle.jdbc.OracleDriver',
'url_pattern' : 'jdbc:oracle:thin:@HOST:PORT:DBNAME'
},
'db2':{
'class_name' : 'com.ibm.db2.jcc.DB2Driver',
'url_pattern' : 'jdbc:db2://HOST:PORT/DBNAME'
}
}
#-------------------#
# Utility functions #
#-------------------#
def getDriverClassNameFromDbType(node_attrs, dbtype):
if dbtype not in DATABASES:raise xception.kikonfActionSystemException(self_action, 'inject', 'Unsupported dbtype:' + dbtype + ', Supported dbtype are:' + str(DATABASES.keys())[1:-1] + ' !')
return DATABASES[dbtype]['class_name']
def getDriverUrlFromDbType(node_attrs, dbtype, host, port, dbname):
if dbtype not in DATABASES:raise xception.kikonfActionSystemException(self_action, 'inject', 'Unsupported dbtype:' + dbtype + ', Supported dbtype are:' + str(DATABASES.keys())[1:-1] + ' !')
TEMPLATE=DATABASES[dbtype]['url_pattern']
dbname=node_attrs.dbname
host=node_attrs.host
port=node_attrs.port
if (host==None or port==None) and dbtype in ('mysql', 'psql', 'oracle', 'db2'):raise xception.kikonfActionSystemException(self_action, 'inject', 'With resource@dbtype: '+ dbtype + ' resource@host and resource@port are requiered !')
url=TEMPLATE.replace('HOST', host)
url=url.replace('PORT', port)
url=url.replace('DBNAME', dbname)
return url
def rmvLink(name, level=None, indent=None, logFile=None):
verbose('DataSource ResourceLink:' + name + ' Removing.', level=level, ifLevel=4, indent=indent, logFile=logFile)
var name = name
%delete ResourceLink where global = ${name}
if ro!=None:n=len(ro)
else:n=0
if n>0:verbose('DataSource ResourceLink:' + name + ' Removed:' + str(n) + ' configuration Entry.', level=level, ifLevel=3, indent=indent, logFile=logFile)
def rmvDataSrc(name, level=None, indent=None, logFile=None):
verbose('DataSource Resource:' + name + ' Removing.', level=level, ifLevel=4, indent=indent, logFile=logFile)
var name = name
%delete Resource where name = ${name}
if ro!=None:n=len(ro)
else:n=0
if n>0:verbose('DataSource Resource:' + name + ' Removed:' + str(n) + ' configuration Entry.', level=level, ifLevel=3, indent=indent, logFile=logFile)
def injLink(top_node, target_node, level=0, indent=None, logFile=None):
""" Creates a ResourceLink """
datarsc_attrs=top_node.getAttrs()
verbose('DataSource ResourceLink:' + datarsc_attrs.name + ' Creating.', level=level, ifLevel=4, indent=indent, logFile=logFile)
# link node
link_attrs=top_node.getNode('link')[0].getAttrs()
attrs={'global': datarsc_attrs.name, 'name': link_attrs.name, 'type':'javax.sql.DataSource'}
# creates
target_node.newNode('ResourceLink', **attrs)
verbose('DataSource ResourceLink:' + datarsc_attrs.name + ' Created.', level=level, ifLevel=3, indent=indent, logFile=logFile)
def injRsc(top_node, target_node, level=0, indent=None, logFile=None):
""" Creates a DataSource Resource """
datarsc_attrs=top_node.getAttrs()
verbose('DataSource Resource:' + datarsc_attrs.name + ' Creating.', level=level, ifLevel=4, indent=indent, logFile=logFile)
attrs={}
# resource node
resource_node=top_node.getNode('resource')[0]
resource_attrs=resource_node.getAttrs()
#- guess driverClassName
if resource_attrs.driverClassName==None:driverClassName=getDriverClassNameFromDbType(resource_attrs, resource_attrs.dbtype)
else:driverClassName=resource_attrs.driverClassName
#- guess auth
if resource_attrs.auth=='true':auth='Container'
else:auth='Application'
attrs.update({
'name' : datarsc_attrs.name,
'driverClassName' : driverClassName,
'url' : getDriverUrlFromDbType(resource_attrs, resource_attrs.dbtype, resource_attrs.host, resource_attrs.port, resource_attrs.dbname),
'username' : resource_attrs.username,
'password' : resource_attrs.password,
'auth' : auth
})
attrs['type']='javax.sql.DataSource'
# extended node
if resource_node.hasNode('extended'):
extended_node=resource_node.getNode('extended')[0]
#- pool node
if extended_node.hasNode('pool'):
pool_attrs=extended_node.getNode('pool')[0].getdAttrs()
attrs.update(pool_attrs)
#- validation_query node
if extended_node.hasNode('validation_query'):
validation_query_attrs=extended_node.getNode('validation_query')[0].getdAttrs()
attrs.update(validation_query_attrs)
#- evictor_thread node
if extended_node.hasNode('evictor_thread'):
evictor_thread_attrs=extended_node.getNode('evictor_thread')[0].getdAttrs()
attrs.update(evictor_thread_attrs)
#- stale_connections node
if extended_node.hasNode('stale_connections'):
stale_connections_attrs=extended_node.getNode('stale_connections')[0].getdAttrs()
attrs.update(stale_connections_attrs)
#- others node
if extended_node.hasNode('others'):
others_attrs=extended_node.getNode('others')[0].getdAttrs()
attrs.update(others_attrs)
# creates
target_node.newNode('Resource', **attrs)
verbose('DataSource Resource:' + datarsc_attrs.name + ' Created.', level=level, ifLevel=3, indent=indent, logFile=logFile)
#------#
# Main #
#------#
# Stores the Action File's Processor Alias
var source_action_alias=ro['alias']
# Stores the Action File's First Node <=> self_action.getTop()
:ls
source_action_node=ro[0]
try:
## Retreives the Scope
print
print '## Retreives the Scope'
scope_name, scope_attrs, scope=self_action.getScope(parent_node=self_action.getTop(), indent=self_action.getIndent(), context_template=None, global_template='resources.global')
self_action.verbose(scope_name=scope_name, scope_attrs=scope_attrs)
indent=self_action.getIndent() + 3*' '
## Stores the target Scope Processor Alias and mount it
print '## Stores the target Scope Processor Alias and mount it'
var target_scope_alias=scope.pc_ro['alias']
:mount $target_scope_alias
:ls
target_node=ro[0]
# Integrity check
if self_action.getTop().hasNode('link') and not scope.type.startswith('context'):
raise xception.kikonfActionSystemException(self_action, 'inject', 'Bad Scope:' + scope.type + ', When using Tag "link" A Scope "context" is required for this Action !')
if scope.type!='resources.global' and not scope.type.startswith('context'):
raise xception.kikonfActionSystemException(self_action, 'inject', 'Bad Scope:' + scope.type + ',Either a Scope "context" or "resource.global" is required for this Action !')
if not scope_attrs['resources.global']=='true' and self_action.getTop().hasNode('link'):
raise xception.kikonfActionSystemException(self_action, 'inject', 'Bad Scope:' + scope.type + ', When an entry link is used, "resources.global" equal true is required for the Scope !')
datarsc_attrs=self_action.getTop().getAttrs()
## Creates the ResourceLink
print
print '## Creates the DataSource ResourceLink'
if self_action.getTop().hasNode('link'):
rmvLink(datarsc_attrs.name, level=self_action.getVerbose(), indent=indent, logFile=self_action.getLogFile())
injLink(self_action.getTop(), target_node, level=self_action.getVerbose(), indent=indent, logFile=self_action.getLogFile())
## Creates the DataSource Resource
if self_action.getTop().hasNode('resource'):
print
print '## Creates the DataSource Resource'
## print 'resources.global:::', scope_attrs['resources.global']
## print 'start.with.context:::', scope.type.startswith('context')
## print 'scope.typ:::', scope.type
if scope_attrs['resources.global']=='true' and scope.type.startswith('context') and scope.type!= 'context.global': # Changes the target scope to the global resource scope
print '# Changes the target scope to the global resource scope'
var target_root_scope_alias=scope.root_pc_ro['alias']
:mount $target_root_scope_alias
:cd /
:ls
target_node=ro[0]
print 'PASSSSE0'
# Creates GlobalNamingResources if not exists
if target_node.hasNode('GlobalNamingResources'):target_node=target_node.getNode('GlobalNamingResources')[0]
else:target_node=target_node.newNode('GlobalNamingResources')
:cd GlobalNamingResources
rmvDataSrc(datarsc_attrs.name, level=self_action.getVerbose(), indent=indent, logFile=self_action.getLogFile())
injRsc(self_action.getTop(), target_node, level=self_action.getVerbose(), indent=indent, logFile=self_action.getLogFile())
else: # target_scope is the rigth target for resource
if scope_attrs['resources.global']=='true':
:cd /
:ls
target_node=ro[0]
# Creates GlobalNamingResources if not exists
if scope_attrs['resources.global']=='true':
if target_node.hasNode('GlobalNamingResources'):target_node=target_node.getNode('GlobalNamingResources')[0]
else:target_node=target_node.newNode('GlobalNamingResources')
:cd GlobalNamingResources
rmvDataSrc(datarsc_attrs.name, level=self_action.getVerbose(), indent=indent, logFile=self_action.getLogFile())
injRsc(self_action.getTop(), target_node, level=self_action.getVerbose(), indent=indent, logFile=self_action.getLogFile())
except Exception, e:
_e=xception.kikonfActionSystemException(self_action, 'inject', 'An exception occures ! SubException is:' + str(e) + ' !')
_e.setSubException(e)
REPOZ.recordSessionException(self_action.getName(), _e)
if self_action.getVerbose()>=10:raise
# Dont forget to skipt a strict empty line at the end to let the Interpretor to interprete the End of the bloc !
## Copyright (c) 2008, Patrick Germain Placidoux
## All rights reserved.
##
## This file is part of Kikonf Public Software.
##
## Kikonf Public Software is released under the modified BSD License,
## which should accompany it or any part of it in the file "COPYING".
## If you do not have this file you can access the license
## through the WWW at http://www.kikonf.org/license/bsd/license.txt.
##
## Home: http://www.kikonf.org
## Contact: kikonf@gmx.com
DATABASES={
'derby':{
'class_name' : 'org.apache.derby.jdbc.EmbeddedDriver',
'url_pattern' : 'jdbc:derby:Databases/DBNAME'
},
'hsql':{
'class_name' : 'org.hsql.jdbcDriver',
'url_pattern' : 'jdbc:HypersonicSQL:DBNAME'
},
'mysql':{
'class_name' : 'com.mysql.jdbc.Driver',
'url_pattern' : 'jdbc:mysql://HOST:PORT/DBNAME'
},
'psql':{
'class_name' : 'org.postgresql.Driver',
'url_pattern' : 'jdbc:postgresql://HOST:PORT/DBNAME'
},
'oracle':{
'class_name' : 'oracle.jdbc.OracleDriver',
'url_pattern' : 'jdbc:oracle:thin:@HOST:PORT:DBNAME'
},
'db2':{
'class_name' : 'com.ibm.db2.jcc.DB2Driver',
'url_pattern' : 'jdbc:db2://HOST:PORT/DBNAME'
}
}
#-------------------#
# Utility functions #
#-------------------#
def getDriverClassNameFromDbType(node_attrs, dbtype):
if dbtype not in DATABASES:raise xception.kikonfActionSystemException(self_action, 'inject', 'Unsupported dbtype:' + dbtype + ', Supported dbtype are:' + str(DATABASES.keys())[1:-1] + ' !')
return DATABASES[dbtype]['class_name']
def getDriverUrlFromDbType(node_attrs, dbtype, host, port, dbname):
if dbtype not in DATABASES:raise xception.kikonfActionSystemException(self_action, 'inject', 'Unsupported dbtype:' + dbtype + ', Supported dbtype are:' + str(DATABASES.keys())[1:-1] + ' !')
TEMPLATE=DATABASES[dbtype]['url_pattern']
dbname=node_attrs.dbname
host=node_attrs.host
port=node_attrs.port
if (host==None or port==None) and dbtype in ('mysql', 'psql', 'oracle', 'db2'):raise xception.kikonfActionSystemException(self_action, 'inject', 'With resource@dbtype: '+ dbtype + ' resource@host and resource@port are requiered !')
url=TEMPLATE.replace('HOST', host)
url=url.replace('PORT', port)
url=url.replace('DBNAME', dbname)
return url
def rmvLink(name, level=None, indent=None, logFile=None):
verbose('DataSource ResourceLink:' + name + ' Removing.', level=level, ifLevel=4, indent=indent, logFile=logFile)
var name = name
%delete ResourceLink where global = ${name}
if ro!=None:n=len(ro)
else:n=0
if n>0:verbose('DataSource ResourceLink:' + name + ' Removed:' + str(n) + ' configuration Entry.', level=level, ifLevel=3, indent=indent, logFile=logFile)
def rmvDataSrc(name, level=None, indent=None, logFile=None):
verbose('DataSource Resource:' + name + ' Removing.', level=level, ifLevel=4, indent=indent, logFile=logFile)
var name = name
%delete Resource where name = ${name}
if ro!=None:n=len(ro)
else:n=0
if n>0:verbose('DataSource Resource:' + name + ' Removed:' + str(n) + ' configuration Entry.', level=level, ifLevel=3, indent=indent, logFile=logFile)
def injLink(top_node, target_node, level=0, indent=None, logFile=None):
""" Creates a ResourceLink """
datarsc_attrs=top_node.getAttrs()
verbose('DataSource ResourceLink:' + datarsc_attrs.name + ' Creating.', level=level, ifLevel=4, indent=indent, logFile=logFile)
# link node
link_attrs=top_node.getNode('link')[0].getAttrs()
attrs={'global': datarsc_attrs.name, 'name': link_attrs.name, 'type':'javax.sql.DataSource'}
# creates
target_node.newNode('ResourceLink', **attrs)
verbose('DataSource ResourceLink:' + datarsc_attrs.name + ' Created.', level=level, ifLevel=3, indent=indent, logFile=logFile)
def injRsc(top_node, target_node, level=0, indent=None, logFile=None):
""" Creates a DataSource Resource """
datarsc_attrs=top_node.getAttrs()
verbose('DataSource Resource:' + datarsc_attrs.name + ' Creating.', level=level, ifLevel=4, indent=indent, logFile=logFile)
attrs={}
# resource node
resource_node=top_node.getNode('resource')[0]
resource_attrs=resource_node.getAttrs()
#- guess driverClassName
if resource_attrs.driverClassName==None:driverClassName=getDriverClassNameFromDbType(resource_attrs, resource_attrs.dbtype)
else:driverClassName=resource_attrs.driverClassName
#- guess auth
if resource_attrs.auth=='true':auth='Container'
else:auth='Application'
attrs.update({
'name' : datarsc_attrs.name,
'driverClassName' : driverClassName,
'url' : getDriverUrlFromDbType(resource_attrs, resource_attrs.dbtype, resource_attrs.host, resource_attrs.port, resource_attrs.dbname),
'username' : resource_attrs.username,
'password' : resource_attrs.password,
'auth' : auth
})
attrs['type']='javax.sql.DataSource'
# extended node
if resource_node.hasNode('extended'):
extended_node=resource_node.getNode('extended')[0]
#- pool node
if extended_node.hasNode('pool'):
pool_attrs=extended_node.getNode('pool')[0].getdAttrs()
attrs.update(pool_attrs)
#- validation_query node
if extended_node.hasNode('validation_query'):
validation_query_attrs=extended_node.getNode('validation_query')[0].getdAttrs()
attrs.update(validation_query_attrs)
#- evictor_thread node
if extended_node.hasNode('evictor_thread'):
evictor_thread_attrs=extended_node.getNode('evictor_thread')[0].getdAttrs()
attrs.update(evictor_thread_attrs)
#- stale_connections node
if extended_node.hasNode('stale_connections'):
stale_connections_attrs=extended_node.getNode('stale_connections')[0].getdAttrs()
attrs.update(stale_connections_attrs)
#- others node
if extended_node.hasNode('others'):
others_attrs=extended_node.getNode('others')[0].getdAttrs()
attrs.update(others_attrs)
# creates
target_node.newNode('Resource', **attrs)
verbose('DataSource Resource:' + datarsc_attrs.name + ' Created.', level=level, ifLevel=3, indent=indent, logFile=logFile)
#------#
# Main #
#------#
# Stores the Action File's Processor Alias
var source_action_alias=ro['alias']
# Stores the Action File's First Node <=> self_action.getTop()
:ls
source_action_node=ro[0]
try:
## Retreives the Scope
print
print '## Retreives the Scope'
scope_name, scope_attrs, scope=self_action.getScope(parent_node=self_action.getTop(), indent=self_action.getIndent(), context_template=None, global_template='resources.global')
self_action.verbose(scope_name=scope_name, scope_attrs=scope_attrs)
indent=self_action.getIndent() + 3*' '
## Stores the target Scope Processor Alias and mount it
print '## Stores the target Scope Processor Alias and mount it'
var target_scope_alias=scope.pc_ro['alias']
:mount $target_scope_alias
:ls
target_node=ro[0]
# Integrity check
if self_action.getTop().hasNode('link') and not scope.type.startswith('context'):
raise xception.kikonfActionSystemException(self_action, 'inject', 'Bad Scope:' + scope.type + ', When using Tag "link" A Scope "context" is required for this Action !')
if scope.type!='resources.global' and not scope.type.startswith('context'):
raise xception.kikonfActionSystemException(self_action, 'inject', 'Bad Scope:' + scope.type + ',Either a Scope "context" or "resource.global" is required for this Action !')
if not scope_attrs['resources.global']=='true' and self_action.getTop().hasNode('link'):
raise xception.kikonfActionSystemException(self_action, 'inject', 'Bad Scope:' + scope.type + ', When an entry link is used, "resources.global" equal true is required for the Scope !')
datarsc_attrs=self_action.getTop().getAttrs()
## Creates the ResourceLink
print
print '## Creates the DataSource ResourceLink'
if self_action.getTop().hasNode('link'):
rmvLink(datarsc_attrs.name, level=self_action.getVerbose(), indent=indent, logFile=self_action.getLogFile())
injLink(self_action.getTop(), target_node, level=self_action.getVerbose(), indent=indent, logFile=self_action.getLogFile())
## Creates the DataSource Resource
if self_action.getTop().hasNode('resource'):
print
print '## Creates the DataSource Resource'
## print 'resources.global:::', scope_attrs['resources.global']
## print 'start.with.context:::', scope.type.startswith('context')
## print 'scope.typ:::', scope.type
if scope_attrs['resources.global']=='true' and scope.type.startswith('context') and scope.type!= 'context.global': # Changes the target scope to the global resource scope
print '# Changes the target scope to the global resource scope'
var target_root_scope_alias=scope.root_pc_ro['alias']
:mount $target_root_scope_alias
:cd /
:ls
target_node=ro[0]
print 'PASSSSE0'
# Creates GlobalNamingResources if not exists
if target_node.hasNode('GlobalNamingResources'):target_node=target_node.getNode('GlobalNamingResources')[0]
else:target_node=target_node.newNode('GlobalNamingResources')
:cd GlobalNamingResources
rmvDataSrc(datarsc_attrs.name, level=self_action.getVerbose(), indent=indent, logFile=self_action.getLogFile())
injRsc(self_action.getTop(), target_node, level=self_action.getVerbose(), indent=indent, logFile=self_action.getLogFile())
else: # target_scope is the rigth target for resource
if scope_attrs['resources.global']=='true':
:cd /
:ls
target_node=ro[0]
# Creates GlobalNamingResources if not exists
if scope_attrs['resources.global']=='true':
if target_node.hasNode('GlobalNamingResources'):target_node=target_node.getNode('GlobalNamingResources')[0]
else:target_node=target_node.newNode('GlobalNamingResources')
:cd GlobalNamingResources
rmvDataSrc(datarsc_attrs.name, level=self_action.getVerbose(), indent=indent, logFile=self_action.getLogFile())
injRsc(self_action.getTop(), target_node, level=self_action.getVerbose(), indent=indent, logFile=self_action.getLogFile())
except Exception, e:
_e=xception.kikonfActionSystemException(self_action, 'inject', 'An exception occures ! SubException is:' + str(e) + ' !')
_e.setSubException(e)
REPOZ.recordSessionException(self_action.getName(), _e)
if self_action.getVerbose()>=10:raise
# Dont forget to skipt a strict empty line at the end to let the Interpretor to interprete the End of the bloc !
(Source: <KIKONF_INSTALLATION_DIR>/plugins/actions/tom/datasrc/by/kikonf/datasrc.inject.repoz)
- Line 1 to 3 say something , say something , say something
- Line 10 to 17 say something , say something , say something , say something , say something
- Line 20 to 25 say something
Trademarks :
- "IBM", "WebSphere MQ", "Db2" and "AIX" are registred trademarks of International Business Machines Corporation.
- "Oracle", "MySql", "Java" and "JVM" are a registred trademarks of Oracle and/or its affiliates.
- "Linux" is a trademark registred to Linus Torvalds
- "MS SQL Server" is a registred trademark of Microsoft Corporation.
- "Apache", "Apache Tomcat" and "Tomcat" are trademarks of the Apache Software Foundation.
- "Java" and "JVM" are a registred trademarks of Oracle and/or its affiliates.
- Other names may be trademarks of their respective owners.
|