atl_config 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/Gemfile +4 -0
- data/Guardfile +5 -0
- data/LICENSE.txt +21 -0
- data/README.md +40 -0
- data/Rakefile +10 -0
- data/atl_config.gemspec +36 -0
- data/bin/console +14 -0
- data/bin/guard +16 -0
- data/bin/setup +8 -0
- data/lib/atl_config.rb +11 -0
- data/lib/atl_config/appinfo.rb +36 -0
- data/lib/atl_config/confluencecfg.rb +35 -0
- data/lib/atl_config/jdbcurl.rb +106 -0
- data/lib/atl_config/jiraconfig.rb +35 -0
- data/lib/atl_config/serverxml.rb +41 -0
- data/lib/atl_config/version.rb +3 -0
- metadata +216 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e5d9fad22b62af1a37b9d830676a8f16f49a98c9
|
4
|
+
data.tar.gz: 6bb9de2bdeb897fe017bac9263e046411371678c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 11af36687dbcc5b82210f3f48710627f3122c54d03f52046a32e532000edc5a9d62d9b90b8072935f8a667168afe131039c229981e110f6b1e02c7c02c134650
|
7
|
+
data.tar.gz: f42330367e3f59f1f0bff0bcfdd6e793d39b6b63269e8b57ac267062dbfe6a7e7eb87a2758c3155b72220962d5ca866923c8ede4054ee4f73e0ac83b68251beb
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2016 Red Radish Consulting Australia
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# Atlassian Configuration File Parsers
|
2
|
+
|
3
|
+
Say one wishes to write a Ruby script that pokes around in the JIRA or Confluence database for some reason. The first step would be to infer the database details, configured either in the application (`dbconfig.xml`, `confluence.cfg.xml`) or in the appserver (`conf/server.xml`).
|
4
|
+
|
5
|
+
This library handles the business of figuring out where the database details are stored. Just give the `dbinfo` function the location of the data dir (e.g. `JIRA_HOME`) and application directory.
|
6
|
+
|
7
|
+
|
8
|
+
## Usage
|
9
|
+
|
10
|
+
Sample use:
|
11
|
+
|
12
|
+
|
13
|
+
[1] pry(main)> require 'atl_config'
|
14
|
+
=> true
|
15
|
+
[2] pry(main)> AtlConfig.dbinfo("confluence", "/opt/atlassian/redradish_confluence/current", "/var/atlassian/application-data/redradish_confluence/current")
|
16
|
+
=> #<struct AtlConfig::DBInfo
|
17
|
+
datasource=nil,
|
18
|
+
user="redradish_confluence",
|
19
|
+
password="redradish_confluence",
|
20
|
+
dbtype="postgresql",
|
21
|
+
host="localhost",
|
22
|
+
port=5432,
|
23
|
+
database="redradish_confluence">
|
24
|
+
|
25
|
+
## Development
|
26
|
+
|
27
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
28
|
+
|
29
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
30
|
+
|
31
|
+
## Contributing
|
32
|
+
|
33
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/redradishtech/atl_config.
|
34
|
+
|
35
|
+
This is my first public gem, so please be kind!
|
36
|
+
|
37
|
+
|
38
|
+
## License
|
39
|
+
|
40
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
data/atl_config.gemspec
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'atl_config/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "atl_config"
|
8
|
+
spec.version = AtlConfig::VERSION
|
9
|
+
spec.authors = ["Jeff Turner"]
|
10
|
+
spec.email = ["jeff@redradishtech.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{Code for parsing config files for Atlassian products}
|
13
|
+
spec.description = %q{Handles server.xml, confluence.cfg.xml and dbconfig.xml}
|
14
|
+
spec.homepage = nil
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
+
spec.bindir = "exe"
|
19
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
spec.has_rdoc = 'yard'
|
22
|
+
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.11"
|
24
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
25
|
+
spec.add_development_dependency "minitest", "~> 5.0"
|
26
|
+
spec.add_development_dependency "minitest-reporters"
|
27
|
+
# https://www.smashingmagazine.com/2014/04/how-to-build-a-ruby-gem-with-bundler-test-driven-development-travis-ci-and-coveralls-oh-my/
|
28
|
+
spec.add_development_dependency "guard"
|
29
|
+
spec.add_development_dependency "guard-minitest"
|
30
|
+
spec.add_development_dependency "pry"
|
31
|
+
spec.add_development_dependency "pry-byebug"
|
32
|
+
spec.add_development_dependency "yard"
|
33
|
+
|
34
|
+
spec.add_runtime_dependency "parslet"
|
35
|
+
spec.add_runtime_dependency "nokogiri"
|
36
|
+
end
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "atl_config"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/guard
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'guard' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require "pathname"
|
10
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require "rubygems"
|
14
|
+
require "bundler/setup"
|
15
|
+
|
16
|
+
load Gem.bin_path("guard", "guard")
|
data/bin/setup
ADDED
data/lib/atl_config.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require "atl_config/version"
|
2
|
+
require "atl_config/jdbcurl"
|
3
|
+
require "atl_config/confluencecfg"
|
4
|
+
require "atl_config/jiraconfig"
|
5
|
+
require "atl_config/serverxml"
|
6
|
+
require "atl_config/appinfo"
|
7
|
+
|
8
|
+
module AtlConfig
|
9
|
+
# Struct containing database connection info.
|
10
|
+
DBInfo = Struct.new :datasource, :user, :password, :dbtype, :host, :port, :database
|
11
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# Library for parsing Atlassian product config files.
|
2
|
+
#
|
3
|
+
# Currently contains only the {dbinfo} static function.
|
4
|
+
|
5
|
+
module AtlConfig
|
6
|
+
# Valid values for {dbinfo}
|
7
|
+
KNOWNPRODUCTS = ["confluence", "jira-software", "jira-core"]
|
8
|
+
|
9
|
+
# Get database connection details for a JIRA/Confluence instance.
|
10
|
+
# @param product [String] Either 'confluence', 'jira-software' or 'jira-core'
|
11
|
+
# @param appdir [String] Path to app directory, e.g. '/opt/atlassian/jira'
|
12
|
+
# @param datadir [String] Path to data directory, e.g. '/var/atlassian/application-data/jira'
|
13
|
+
# @return [AtlConfig::DBInfo] object with database details.
|
14
|
+
#
|
15
|
+
def self.dbinfo(product, appdir, datadir)
|
16
|
+
raise "Null appdir" unless appdir
|
17
|
+
raise "Null datadir" unless datadir
|
18
|
+
appdir = Pathname.new(appdir)
|
19
|
+
datadir = Pathname.new(datadir)
|
20
|
+
raise "Product '#{product}' is not one of known products: #{KNOWNPRODUCTS.join(", ")}" unless KNOWNPRODUCTS.member? product
|
21
|
+
raise "Nonexistent appdir '#{appdir.inspect}'" unless appdir.exist?
|
22
|
+
raise "Nonexistent datadir '#{datadir.inspect}'" unless datadir.exist?
|
23
|
+
|
24
|
+
dbinfo = case product
|
25
|
+
when /jira.*/
|
26
|
+
AtlConfig::JIRAConfig.dbinfo(IO.read(datadir + "dbconfig.xml"))
|
27
|
+
when "confluence"
|
28
|
+
AtlConfig::ConfluenceCfg.dbinfo(IO.read(datadir + "confluence.cfg.xml"))
|
29
|
+
end
|
30
|
+
if dbinfo.datasource then
|
31
|
+
AtlConfig::ServerXML.dbinfo(IO.read(appdir + "conf" + "server.xml"), dbinfo.datasource)
|
32
|
+
else
|
33
|
+
dbinfo
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
module AtlConfig
|
3
|
+
class ConfluenceCfg
|
4
|
+
# Extracts database info from Confluence +confluence.cfg.xml+ files.
|
5
|
+
# @param cfgxml [String] XML Text of +confluence.cfg.xml+ file
|
6
|
+
# @return [DBInfo]
|
7
|
+
def self.dbinfo(cfgxml)
|
8
|
+
config = Nokogiri::XML(cfgxml)
|
9
|
+
r = DBInfo.new
|
10
|
+
r.datasource = config.xpath("/confluence-configuration/properties/property[@name='hibernate.connection.datasource']/text()").first&.to_s
|
11
|
+
if !r.datasource then
|
12
|
+
base = config.xpath("/confluence-configuration/properties")
|
13
|
+
r.user = base.xpath("property[@name='hibernate.connection.username']/text()").first&.to_s
|
14
|
+
r.password = base.xpath("property[@name='hibernate.connection.password']/text()").first&.to_s
|
15
|
+
url = base.xpath("property[@name='hibernate.connection.url']/text()").first&.to_s
|
16
|
+
urlparts = AtlConfig::JDBCURL.parse(url)
|
17
|
+
r.dbtype = urlparts[:dbtype]
|
18
|
+
r.host = urlparts[:host]
|
19
|
+
r.port = if urlparts[:port] then urlparts[:port].to_i
|
20
|
+
else
|
21
|
+
case @dbtype
|
22
|
+
when 'postgresql'
|
23
|
+
5432
|
24
|
+
when 'mysql'
|
25
|
+
3306
|
26
|
+
else
|
27
|
+
raise "Unhandled db type #{dbtype}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
r.database = urlparts[:database]
|
31
|
+
end
|
32
|
+
r
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'parslet'
|
2
|
+
require 'pry'
|
3
|
+
require 'pry-byebug'
|
4
|
+
|
5
|
+
module AtlConfig
|
6
|
+
# Parses a JDBC URL in MySQL or Postgres formats.
|
7
|
+
#
|
8
|
+
# Current status: postgres parsing works 100%
|
9
|
+
# mysql parsing works if the url looks like postgres's, but with the support for properties.
|
10
|
+
#
|
11
|
+
# @todo The mysql case doesn't yet handle a blank hostname ('jdbc:mysql:///dbname'), and certainly doesn't handle multiple replication hosts.
|
12
|
+
class JDBCURL
|
13
|
+
|
14
|
+
# Given a JDBC URL, returns its constituent parts.
|
15
|
+
# @param jdbcurl String E.g. +jdbc:mysql://localhost/wombles?foo=bar+ or +jdbc:postgresql://dbserver:5432/mydb+
|
16
|
+
# @return [Hash{:dbtype => String, :host => String, :port => Integer, :database => String, :props => {:propkey => String, :propval => String}]
|
17
|
+
def self.parse(jdbcurl)
|
18
|
+
# first we get a hash with Parslet values, then we to_s each value to prevent our user seeing Parslet stuff.
|
19
|
+
begin
|
20
|
+
stringify(JDBCURLParser.new.parse(jdbcurl))
|
21
|
+
rescue Parslet::ParseFailed => failure
|
22
|
+
raise failure.cause.ascii_tree
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def self.stringify(obj)
|
29
|
+
if !obj then
|
30
|
+
nil
|
31
|
+
elsif obj.kind_of?(Hash) then
|
32
|
+
obj.inject({}) { |h, (k,v)|
|
33
|
+
h[k] = stringify(v)
|
34
|
+
h
|
35
|
+
}
|
36
|
+
elsif obj.kind_of?(Array) then
|
37
|
+
obj.map { |x| stringify(x) }
|
38
|
+
elsif obj.respond_to?(:to_s) then
|
39
|
+
obj.to_s
|
40
|
+
else
|
41
|
+
raise "Unexpected AST from parser: got a #{obj.class}: #{obj}"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
class BaseURLParser < Parslet::Parser
|
49
|
+
rule(:database) { match['^?'].repeat.as(:database) }
|
50
|
+
rule(:ipv6) { str('[') >> match('[^\]]').repeat.as(:host) >> str(']') }
|
51
|
+
rule(:host) { (match[':/'].absent? >> any).repeat(1).as(:host) }
|
52
|
+
rule(:host_or_ip) { (ipv6 | host) }
|
53
|
+
rule(:port) { str(':') >> match('\d').repeat.as(:port) }
|
54
|
+
rule(:propname) { match('[^=]').repeat.as(:propkey) }
|
55
|
+
rule(:propval) { match('[^&]').repeat.as(:propval) }
|
56
|
+
rule(:props) { str('?') >> propname >> str('=') >> propval >> (str('&') >> propname >> str('=') >> propval).repeat(0) }
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
# Per https://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html, format is:
|
61
|
+
# jdbc:mysql://[host1][:port1][,[host2][:port2]]...[/[database]] »
|
62
|
+
# [?propertyName1=propertyValue1[&propertyName2=propertyValue2]...]
|
63
|
+
#
|
64
|
+
# but this is insane, so we only support the subset
|
65
|
+
#
|
66
|
+
# jdbc:mysql://[host1][:port1][/[database]] »
|
67
|
+
# [?propertyName1=propertyValue1[&propertyName2=propertyValue2]...]
|
68
|
+
#
|
69
|
+
class MySQLURLParser < BaseURLParser
|
70
|
+
rule(:expression) { str('jdbc:') >> str('mysql').as(:dbtype) >> str('://') >> host_or_ip.maybe >> port.maybe >> (str('/') >> database) >> props.as(:props).maybe }
|
71
|
+
root :expression
|
72
|
+
#AtlConfig::JDBCURL.parse("jdbc:mysql:///redradish_confluence")
|
73
|
+
end
|
74
|
+
|
75
|
+
# Per https://jdbc.postgresql.org/documentation/80/connect.html, the Postgres formats are:
|
76
|
+
# jdbc:postgresql:database
|
77
|
+
# jdbc:postgresql://host/database
|
78
|
+
# jdbc:postgresql://host:port/database
|
79
|
+
# plus parameters.
|
80
|
+
class PostgreSQLURLParser < BaseURLParser
|
81
|
+
# To specify an IPv6 address your must enclose the host parameter with square brackets, for example: jdbc:postgresql://[::1]:5740/accounting
|
82
|
+
# With Postgres, a '//' indicates a host is definitely present. In MySQL the host may be omitted after the '//'
|
83
|
+
rule(:host_and_port) { str('//') >> host_or_ip >> port.maybe >> str('/') }
|
84
|
+
rule(:expression) { str('jdbc:') >> str('postgresql').as(:dbtype) >> str(':') >> host_and_port.maybe >> database >> props.as(:props).maybe }
|
85
|
+
root :expression
|
86
|
+
def parse(str)
|
87
|
+
begin
|
88
|
+
expression.parse(str)
|
89
|
+
rescue Parslet::ParseFailed => failure
|
90
|
+
raise %q{Invalid Postgres JDBC URL format. Valid formats are:
|
91
|
+
jdbc:postgresql:database
|
92
|
+
jdbc:postgresql://host/database
|
93
|
+
jdbc:postgresql://host:port/database
|
94
|
+
} "\n" + failure.cause.ascii_tree
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
class JDBCURLParser < Parslet::Parser
|
100
|
+
root :expression
|
101
|
+
rule(:expression) { (MySQLURLParser.new | PostgreSQLURLParser.new) }
|
102
|
+
end
|
103
|
+
|
104
|
+
private_constant :JDBCURLParser, :BaseURLParser, :MySQLURLParser, :PostgreSQLURLParser
|
105
|
+
|
106
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
module AtlConfig
|
3
|
+
class JIRAConfig
|
4
|
+
# Extracts database info from JIRA +dbconfig.xml+ files.
|
5
|
+
# @param cfgxml [String] XML Text of +dbconfig.xml+ file
|
6
|
+
# @return [DBInfo]
|
7
|
+
def self.dbinfo(cfgxml)
|
8
|
+
config = Nokogiri::XML(cfgxml)
|
9
|
+
r = DBInfo.new
|
10
|
+
r.datasource = config.xpath("/jira-database-config/jndi-datasource/jndi-name/text()").first&.to_s
|
11
|
+
if !r.datasource then
|
12
|
+
base = config.xpath("/jira-database-config/jdbc-datasource")
|
13
|
+
r.user = base.xpath("username/text()").first&.to_s
|
14
|
+
r.password = base.xpath("password/text()").first&.to_s
|
15
|
+
url = base.xpath("url/text()").first&.to_s
|
16
|
+
urlparts = AtlConfig::JDBCURL.parse(url)
|
17
|
+
r.dbtype = urlparts[:dbtype]
|
18
|
+
r.host = urlparts[:host]
|
19
|
+
r.port = if urlparts[:port] then urlparts[:port].to_i
|
20
|
+
else
|
21
|
+
case r.dbtype
|
22
|
+
when 'postgresql'
|
23
|
+
5432
|
24
|
+
when 'mysql'
|
25
|
+
3306
|
26
|
+
else
|
27
|
+
raise "Unhandled db type #{dbtype}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
r.database = urlparts[:database]
|
31
|
+
end
|
32
|
+
r
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
module AtlConfig
|
3
|
+
|
4
|
+
class ServerXML
|
5
|
+
# Extracts database info from a datasource definition in a Tomcat +server.xml+ files.
|
6
|
+
# @param cfgxml [String] XML Text of +conf/server.xml+ file
|
7
|
+
# @param dsname [String] Name of datasource defined in XML
|
8
|
+
# @return [DBInfo]
|
9
|
+
def self.dbinfo(cfgxml, dsname)
|
10
|
+
config = Nokogiri::XML(cfgxml)
|
11
|
+
dsname = dsname.gsub(/^java:comp\/env\//, '')
|
12
|
+
datasource = config.xpath("/Server/Service/Engine[@name='Standalone']/Host[@name='localhost']/Context/Resource[@name='#{dsname}']").first
|
13
|
+
if datasource then
|
14
|
+
r = DBInfo.new
|
15
|
+
r.user = datasource.xpath("@username")&.to_s
|
16
|
+
r.password = datasource.xpath("@password")&.to_s
|
17
|
+
url = datasource.xpath("@url")&.to_s
|
18
|
+
if url then
|
19
|
+
urlparts = AtlConfig::JDBCURL.parse(url)
|
20
|
+
r.dbtype = urlparts[:dbtype]
|
21
|
+
r.host = urlparts[:host]
|
22
|
+
r.port = if urlparts[:port] then urlparts[:port].to_i
|
23
|
+
else
|
24
|
+
case r.dbtype
|
25
|
+
when 'postgresql'
|
26
|
+
5432
|
27
|
+
when 'mysql'
|
28
|
+
3306
|
29
|
+
else
|
30
|
+
raise "Unhandled db type #{r.dbtype}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
r.database = urlparts[:database]
|
34
|
+
end
|
35
|
+
r
|
36
|
+
else
|
37
|
+
nil
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
metadata
ADDED
@@ -0,0 +1,216 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: atl_config
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jeff Turner
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-03-21 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.11'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.11'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '5.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '5.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: minitest-reporters
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: guard
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: guard-minitest
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: pry
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: pry-byebug
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: yard
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: parslet
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: nokogiri
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :runtime
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
description: Handles server.xml, confluence.cfg.xml and dbconfig.xml
|
168
|
+
email:
|
169
|
+
- jeff@redradishtech.com
|
170
|
+
executables: []
|
171
|
+
extensions: []
|
172
|
+
extra_rdoc_files: []
|
173
|
+
files:
|
174
|
+
- ".gitignore"
|
175
|
+
- Gemfile
|
176
|
+
- Guardfile
|
177
|
+
- LICENSE.txt
|
178
|
+
- README.md
|
179
|
+
- Rakefile
|
180
|
+
- atl_config.gemspec
|
181
|
+
- bin/console
|
182
|
+
- bin/guard
|
183
|
+
- bin/setup
|
184
|
+
- lib/atl_config.rb
|
185
|
+
- lib/atl_config/appinfo.rb
|
186
|
+
- lib/atl_config/confluencecfg.rb
|
187
|
+
- lib/atl_config/jdbcurl.rb
|
188
|
+
- lib/atl_config/jiraconfig.rb
|
189
|
+
- lib/atl_config/serverxml.rb
|
190
|
+
- lib/atl_config/version.rb
|
191
|
+
homepage:
|
192
|
+
licenses:
|
193
|
+
- MIT
|
194
|
+
metadata: {}
|
195
|
+
post_install_message:
|
196
|
+
rdoc_options: []
|
197
|
+
require_paths:
|
198
|
+
- lib
|
199
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
200
|
+
requirements:
|
201
|
+
- - ">="
|
202
|
+
- !ruby/object:Gem::Version
|
203
|
+
version: '0'
|
204
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - ">="
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '0'
|
209
|
+
requirements: []
|
210
|
+
rubyforge_project:
|
211
|
+
rubygems_version: 2.5.1
|
212
|
+
signing_key:
|
213
|
+
specification_version: 4
|
214
|
+
summary: Code for parsing config files for Atlassian products
|
215
|
+
test_files: []
|
216
|
+
has_rdoc: yard
|