ps-voodoo 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +7 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +14 -0
- data/LICENSE.txt +20 -0
- data/README.md +61 -0
- data/Rakefile +1 -0
- data/bin/voodoo +149 -0
- data/lib/voodoo.rb +96 -0
- data/lib/voodoo/commands.rb +98 -0
- data/lib/voodoo/commands/add.rb +24 -0
- data/lib/voodoo/commands/build.rb +26 -0
- data/lib/voodoo/commands/compare.rb +37 -0
- data/lib/voodoo/commands/config.rb +15 -0
- data/lib/voodoo/commands/list.rb +17 -0
- data/lib/voodoo/commands/migrate.rb +74 -0
- data/lib/voodoo/commands/remove.rb +19 -0
- data/lib/voodoo/commands/run.rb +32 -0
- data/lib/voodoo/commands/show.rb +23 -0
- data/lib/voodoo/migration.rb +58 -0
- data/lib/voodoo/peopletools.rb +83 -0
- data/lib/voodoo/peopletools/appdesigner.rb +147 -0
- data/lib/voodoo/peopletools/appengine.rb +22 -0
- data/lib/voodoo/peopletools/datamover.rb +33 -0
- data/lib/voodoo/peopletools/sqr.rb +112 -0
- data/lib/voodoo/version.rb +3 -0
- data/ps-voodoo.gemspec +23 -0
- metadata +94 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 JR
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
VooDoo
|
2
|
+
===========
|
3
|
+
|
4
|
+
VooDoo is a command line application to help automate some PeopleSoft administration activities. I originally wrote it as a way to automate migration of PeopleSoft projects between environments, but it has since been expanded to include additional functionality.
|
5
|
+
|
6
|
+
Features
|
7
|
+
--------
|
8
|
+
|
9
|
+
* TODO
|
10
|
+
|
11
|
+
Commands
|
12
|
+
--------
|
13
|
+
|
14
|
+
Requirements
|
15
|
+
------------
|
16
|
+
|
17
|
+
* Ruby 1.9.2
|
18
|
+
* Working installation of PeopleSoft Application Designer, DataMover, SQR, Appengine
|
19
|
+
* Windows XP or higher (Developed using Windows 7, tested on XP)
|
20
|
+
|
21
|
+
Install
|
22
|
+
-------
|
23
|
+
|
24
|
+
* TODO
|
25
|
+
|
26
|
+
Miscellaneous
|
27
|
+
-------------
|
28
|
+
|
29
|
+
* TODO
|
30
|
+
|
31
|
+
Author
|
32
|
+
------
|
33
|
+
|
34
|
+
Original author: JR Bing
|
35
|
+
|
36
|
+
|
37
|
+
License
|
38
|
+
-------
|
39
|
+
|
40
|
+
(The MIT License)
|
41
|
+
|
42
|
+
Copyright (c) 2011 JR Bing
|
43
|
+
|
44
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
45
|
+
a copy of this software and associated documentation files (the
|
46
|
+
'Software'), to deal in the Software without restriction, including
|
47
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
48
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
49
|
+
permit persons to whom the Software is furnished to do so, subject to
|
50
|
+
the following conditions:
|
51
|
+
|
52
|
+
The above copyright notice and this permission notice shall be
|
53
|
+
included in all copies or substantial portions of the Software.
|
54
|
+
|
55
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
56
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
57
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
58
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
59
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
60
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
61
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
data/bin/voodoo
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.expand_path(
|
4
|
+
File.join(File.dirname(__FILE__), %w[.. lib voodoo]))
|
5
|
+
require 'rubygems'
|
6
|
+
require 'commander/import'
|
7
|
+
|
8
|
+
program :name, 'Voodoo'
|
9
|
+
program :version, Voodoo::VERSION
|
10
|
+
program :description, 'Black Magic Utility for PeopleSoft Administration'
|
11
|
+
|
12
|
+
command :add do |c|
|
13
|
+
c.syntax = 'voodoo add [environment name]'
|
14
|
+
c.summary = 'adds an environment to the configuration file'
|
15
|
+
c.description = 'Prompts for environment information and saves it to the environment configuration file'
|
16
|
+
c.example 'Prompt for setup values before adding VDDMO to the configuration file', 'voodoo add VDDMO'
|
17
|
+
c.action do |args|
|
18
|
+
Voodoo::Commands.add(args)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
command :remove do |c|
|
23
|
+
c.syntax = 'voodoo remove [environment name]'
|
24
|
+
c.summary = 'removes an environment from the configuration file'
|
25
|
+
c.description = 'Deletes the specified environment from the configuration file'
|
26
|
+
c.example 'Removes the environment VDDMO from the configuration file', 'voodoo remove VDDMO'
|
27
|
+
c.action do |args|
|
28
|
+
Voodoo::Commands.remove(args)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
command :list do |c|
|
33
|
+
c.syntax = 'voodoo list'
|
34
|
+
c.summary = 'Outputs a list of configured environments'
|
35
|
+
c.description = 'Shows a list of all environments in the configuration file'
|
36
|
+
c.example 'List all environments', 'voodoo list'
|
37
|
+
c.action do |args|
|
38
|
+
c.when_called Voodoo::Commands.list
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
command :show do |c|
|
43
|
+
c.syntax = 'voodoo show [environment name]'
|
44
|
+
c.summary = 'shows configuration details for an environment'
|
45
|
+
c.description = 'Outputs a table containing information about the specified environment'
|
46
|
+
c.example 'Show information about VDDMO', 'voodoo show VDDMO'
|
47
|
+
c.action do |args|
|
48
|
+
Voodoo::Commands.show(args)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
command :config do |c|
|
53
|
+
c.syntax = 'voodoo config'
|
54
|
+
c.summary = 'create global configuration settings'
|
55
|
+
c.description = 'Prompts for global configuration information and saves it to the configuration file'
|
56
|
+
c.action do |args, options|
|
57
|
+
c.when_called Voodoo::Commands.config
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
command :compare do |c|
|
62
|
+
c.syntax = 'voodoo compare [project] [source] [target]'
|
63
|
+
c.summary = 'create a compare report for the specified project'
|
64
|
+
c.description = 'Creates an HTML compare report for the specified project and opens it in the default browser'
|
65
|
+
c.example 'Create a compare report between two environments', 'voodoo compare EXAMPLE_PROJECT VDDEV VDTEST'
|
66
|
+
c.action do |args|
|
67
|
+
Voodoo::Commands.compare(args)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
command :build do |c|
|
72
|
+
c.syntax = 'voodoo build [project] [environment]'
|
73
|
+
c.summary = 'builds a project definition in the specified environment'
|
74
|
+
c.description = 'Builds a project definition script for the specified project using AppDesigner and executes it in the target database'
|
75
|
+
c.example 'Build specified project', 'voodoo build EXAMPLE_PROJECT VDTEST'
|
76
|
+
c.action do |args|
|
77
|
+
Voodoo::Commands.build(args)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
command :migrate do |c|
|
82
|
+
c.syntax = 'voodoo migrate [project] [source] [target]'
|
83
|
+
c.summary = 'migrates a project between environments'
|
84
|
+
c.description = 'Migrates a project between two environments after running a compare report and copying the objects to file'
|
85
|
+
c.example 'Migrate project between environments', 'voodoo migrate EXAMPLE_PROJECT --source VDDEV --target VDTEST'
|
86
|
+
c.action do |args|
|
87
|
+
Voodoo::Commands.migrate(args)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# command :'run sqr' do |c|
|
92
|
+
# c.syntax = 'voodoo run sqr [sqr name] [environment]'
|
93
|
+
# c.summary = 'runs the specified sqr locally'
|
94
|
+
# c.description = 'Run the specified SQR locally using the sqr bin specified in the environment configuration.'
|
95
|
+
# c.example 'Run SQR', 'voodoo run sqr SETSPACE.sqr VDDEV'
|
96
|
+
# c.action do |args|
|
97
|
+
# Voodoo::Commands.run_sqr(args)
|
98
|
+
# end
|
99
|
+
# end
|
100
|
+
|
101
|
+
# command :'run appengine' do |c|
|
102
|
+
# c.syntax = 'voodoo run appengine [appengine name] [environment]'
|
103
|
+
# c.summary = 'runs the specified appengine locally'
|
104
|
+
# c.description = 'Run the specified AppEngine locally.'
|
105
|
+
# c.example 'Run AppEngine', 'voodoo run appengine XXXXX VDDEV'
|
106
|
+
# c.action do |args|
|
107
|
+
# Voodoo::Commands.run_appengine(args)
|
108
|
+
# end
|
109
|
+
# end
|
110
|
+
|
111
|
+
# command :shell do |c|
|
112
|
+
# c.syntax = 'voodoo shell'
|
113
|
+
# c.summary = 'start Voodoo in and interactive console mode'
|
114
|
+
# c.description = 'Starts Voodoo in a mode for entering multiple commands'
|
115
|
+
# c.action do
|
116
|
+
# loop do
|
117
|
+
# choose("") do |menu|
|
118
|
+
# menu.layout = ''
|
119
|
+
# # menu.layout = :menu_only
|
120
|
+
# menu.prompt = '>>> '
|
121
|
+
# menu.shell = true
|
122
|
+
|
123
|
+
# menu.choice(:list, "List configured environments") do |command, arguments|
|
124
|
+
# Voodoo::Commands.list
|
125
|
+
# end
|
126
|
+
|
127
|
+
# menu.choice(:show, "Show environment details") do |command, arguments|
|
128
|
+
# args = arguments.scan(/\w+/)
|
129
|
+
# Voodoo::Commands.show(args)
|
130
|
+
# end
|
131
|
+
|
132
|
+
# menu.choice(:quit, "Exit voodoo") { exit }
|
133
|
+
|
134
|
+
# end
|
135
|
+
# end
|
136
|
+
# end
|
137
|
+
# end
|
138
|
+
|
139
|
+
# command :test do |c|
|
140
|
+
# c.syntax = 'voodoo setup [options]'
|
141
|
+
# c.summary = ''
|
142
|
+
# c.description = ''
|
143
|
+
# c.example 'description', 'command example'
|
144
|
+
# c.option '--some-switch', 'Some switch that does something'
|
145
|
+
# c.action do |args, options|
|
146
|
+
# c.when_called Voodoo::Commands.test(args, options)
|
147
|
+
# end
|
148
|
+
# end
|
149
|
+
|
data/lib/voodoo.rb
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
require 'yaml'
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
module Voodoo
|
6
|
+
|
7
|
+
extend self
|
8
|
+
|
9
|
+
LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
|
10
|
+
PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
|
11
|
+
|
12
|
+
# Log settings
|
13
|
+
LOG = Logger.new(STDOUT)
|
14
|
+
LOG.level = Logger::DEBUG
|
15
|
+
|
16
|
+
def self.libpath( *args )
|
17
|
+
rv = args.empty? ? LIBPATH : ::File.join(LIBPATH, args.flatten)
|
18
|
+
if block_given?
|
19
|
+
begin
|
20
|
+
$LOAD_PATH.unshift LIBPATH
|
21
|
+
rv = yield
|
22
|
+
ensure
|
23
|
+
$LOAD_PATH.shift
|
24
|
+
end
|
25
|
+
end
|
26
|
+
return rv
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.path( *args )
|
30
|
+
rv = args.empty? ? PATH : ::File.join(PATH, args.flatten)
|
31
|
+
if block_given?
|
32
|
+
begin
|
33
|
+
$LOAD_PATH.unshift PATH
|
34
|
+
rv = yield
|
35
|
+
ensure
|
36
|
+
$LOAD_PATH.shift
|
37
|
+
end
|
38
|
+
end
|
39
|
+
return rv
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.require_all_libs_relative_to( fname, dir = nil )
|
43
|
+
dir ||= ::File.basename(fname, '.*')
|
44
|
+
search_me = ::File.expand_path(
|
45
|
+
::File.join(::File.dirname(fname), dir, '**', '*.rb'))
|
46
|
+
|
47
|
+
Dir.glob(search_me).sort.each {|rb| require rb}
|
48
|
+
end
|
49
|
+
|
50
|
+
def home
|
51
|
+
@home ||= (ENV['HOME'] || ENV['USERPROFILE']) + '/.voodoo'
|
52
|
+
unless File.exists?(@home)
|
53
|
+
Dir.mkdir(@home)
|
54
|
+
end
|
55
|
+
return @home
|
56
|
+
end
|
57
|
+
|
58
|
+
def config_file
|
59
|
+
filename = File.join(Voodoo.home, 'configuration.yml')
|
60
|
+
File.open(filename, File::CREAT|File::RDWR)
|
61
|
+
end
|
62
|
+
|
63
|
+
def configuration
|
64
|
+
@configuration = YAML.load_file(Voodoo.config_file)
|
65
|
+
end
|
66
|
+
|
67
|
+
def write_config_file(settings)
|
68
|
+
Voodoo.config_file.write(settings.to_yaml)
|
69
|
+
end
|
70
|
+
|
71
|
+
def env_file
|
72
|
+
filename = File.join(Voodoo.home, 'environments.yml')
|
73
|
+
File.open(filename, File::CREAT|File::RDWR)
|
74
|
+
return filename
|
75
|
+
end
|
76
|
+
|
77
|
+
def environments
|
78
|
+
list = YAML.load_file(Voodoo.env_file)
|
79
|
+
if list
|
80
|
+
@environments = list
|
81
|
+
else
|
82
|
+
@environments = {}
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def write_env_file
|
87
|
+
environment_file = File.open(Voodoo.env_file, 'w')
|
88
|
+
LOG.info("Writing environment configuration file.")
|
89
|
+
environment_file.write(ENVIRONMENTS.to_yaml)
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
Voodoo.require_all_libs_relative_to(__FILE__)
|
95
|
+
ENVIRONMENTS = Voodoo.environments
|
96
|
+
CONFIGURATION = OpenStruct.new(Voodoo.configuration)
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'terminal-table/import'
|
2
|
+
Voodoo.require_all_libs_relative_to(__FILE__)
|
3
|
+
|
4
|
+
module Voodoo
|
5
|
+
|
6
|
+
module Commands
|
7
|
+
extend self
|
8
|
+
|
9
|
+
def setup?
|
10
|
+
if CONFIGURATION.ps_home == nil
|
11
|
+
LOG.warnA("Global configuration not defined...use <voodoo config>")
|
12
|
+
exit
|
13
|
+
end
|
14
|
+
|
15
|
+
if ENVIRONMENTS.empty?
|
16
|
+
puts "No environments defined....use <voodoo add [environment]>"
|
17
|
+
exit
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
def get_project
|
23
|
+
ask("Project name: ")
|
24
|
+
end
|
25
|
+
|
26
|
+
def get_env(name)
|
27
|
+
#TODO: fix this to throw an error message and exit if the environment isn't listed
|
28
|
+
OpenStruct.new(ENVIRONMENTS[name])
|
29
|
+
end
|
30
|
+
|
31
|
+
def get_source
|
32
|
+
choose("Environments") do |menu|
|
33
|
+
menu.index = :letter
|
34
|
+
menu.index_suffix = ") "
|
35
|
+
menu.prompt = "Specify the source environment: "
|
36
|
+
ENVIRONMENTS.keys.each do |x|
|
37
|
+
menu.choice(x) do |i|
|
38
|
+
env = OpenStruct.new(ENVIRONMENTS[i])
|
39
|
+
env.name = i
|
40
|
+
env.app_password = get_app_password(i)
|
41
|
+
return env
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def get_target
|
48
|
+
choose("Environments") do |menu|
|
49
|
+
menu.index = :letter
|
50
|
+
menu.index_suffix = ") "
|
51
|
+
menu.prompt = "Specify the target environment: "
|
52
|
+
ENVIRONMENTS.keys.each do |x|
|
53
|
+
menu.choice(x) do |i|
|
54
|
+
env = OpenStruct.new(ENVIRONMENTS[i])
|
55
|
+
env.name = i
|
56
|
+
env.app_password = get_app_password(i)
|
57
|
+
return env
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def get_migration
|
64
|
+
folder_name = ask("Name for output folder: ")
|
65
|
+
Migration.new(folder_name)
|
66
|
+
end
|
67
|
+
|
68
|
+
#TODO: validate that the SQR name and path is valid
|
69
|
+
def get_sqr
|
70
|
+
ask("SQR name: ")
|
71
|
+
end
|
72
|
+
|
73
|
+
#TODO: validate that the appengine name and path is valid
|
74
|
+
def get_appengine
|
75
|
+
ask("Appengine name: ")
|
76
|
+
end
|
77
|
+
|
78
|
+
def get_path(prompt)
|
79
|
+
ask("#{prompt}: ") do |q|
|
80
|
+
q.validate = %r=^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w ]*))=
|
81
|
+
q.responses[:not_valid] = "Please enter a valid folder path."
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def dttm
|
86
|
+
Time.now.strftime("%m/%d/%Y %H:%M:%S") + " >>> "
|
87
|
+
end
|
88
|
+
|
89
|
+
private
|
90
|
+
|
91
|
+
def get_app_password(name)
|
92
|
+
ask("Password for #{name}: ") { |q| q.echo = "*" }
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
module Voodoo
|
3
|
+
|
4
|
+
module Commands
|
5
|
+
|
6
|
+
def self.add(args=nil)
|
7
|
+
settings = {}
|
8
|
+
if args.first.nil?
|
9
|
+
name = ask("Database name: ").upcase
|
10
|
+
else
|
11
|
+
name = args.first.upcase
|
12
|
+
end
|
13
|
+
settings['db_type'] = ask("Database type: ", %w{Oracle}) { |q| q.default = "Oracle" }
|
14
|
+
settings['app_username'] = ask("Application username: ")
|
15
|
+
settings['db_username'] = ask("Database username: ") { |q| q.default = "sysadm" }
|
16
|
+
settings['migration_archive'] = get_path("Archive destination")
|
17
|
+
new_env = {name => settings}
|
18
|
+
LOG.info("Adding #{name} to the list of configured environments")
|
19
|
+
ENVIRONMENTS.merge!(new_env)
|
20
|
+
Voodoo.write_env_file
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
module Voodoo
|
3
|
+
|
4
|
+
module Commands
|
5
|
+
extend self
|
6
|
+
|
7
|
+
def build(args=nil)
|
8
|
+
if args.first.nil?
|
9
|
+
project = get_project
|
10
|
+
else
|
11
|
+
project = args.first
|
12
|
+
end
|
13
|
+
|
14
|
+
source = get_source
|
15
|
+
migration = get_migration
|
16
|
+
|
17
|
+
ad = Voodoo::AppDesigner.new
|
18
|
+
dm = Voodoo::DataMover.new
|
19
|
+
|
20
|
+
ad.build_project(project, migration, source)
|
21
|
+
dm.run(migration, source, "PSBUILD.sql")
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
|
2
|
+
module Voodoo
|
3
|
+
|
4
|
+
module Commands
|
5
|
+
extend self
|
6
|
+
|
7
|
+
def compare(args=nil)
|
8
|
+
setup?
|
9
|
+
|
10
|
+
if args.first.nil?
|
11
|
+
project = get_project
|
12
|
+
else
|
13
|
+
project = args.first
|
14
|
+
end
|
15
|
+
|
16
|
+
if args[1].nil?
|
17
|
+
source = get_source
|
18
|
+
else
|
19
|
+
source = args[1].upcase
|
20
|
+
end
|
21
|
+
|
22
|
+
if args[2].nil?
|
23
|
+
target = get_target
|
24
|
+
else
|
25
|
+
target = args[2].upcase
|
26
|
+
end
|
27
|
+
|
28
|
+
migration = get_migration
|
29
|
+
|
30
|
+
ad = Voodoo::AppDesigner.new
|
31
|
+
ad.compare(project, migration, source, target)
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
|
2
|
+
module Voodoo
|
3
|
+
|
4
|
+
module Commands
|
5
|
+
|
6
|
+
def self.config
|
7
|
+
settings = {}
|
8
|
+
settings[:ps_home] = get_path("Local tools installation directory")
|
9
|
+
settings[:migration_output_dir] = get_path("Output directory for migration data")
|
10
|
+
Voodoo.write_config_file(settings)
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Voodoo
|
2
|
+
|
3
|
+
module Commands
|
4
|
+
|
5
|
+
# TODO: add an error message if there are no environments configured
|
6
|
+
def self.list
|
7
|
+
env_table = table
|
8
|
+
env_table.headings = ['Configured Environments']
|
9
|
+
Voodoo.environments.keys.each do |env|
|
10
|
+
env_table << [env]
|
11
|
+
end
|
12
|
+
puts env_table
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
|
2
|
+
module Voodoo
|
3
|
+
|
4
|
+
module Commands
|
5
|
+
extend self
|
6
|
+
|
7
|
+
def migrate(args=nil)
|
8
|
+
setup?
|
9
|
+
|
10
|
+
if args.first.nil?
|
11
|
+
project = get_project
|
12
|
+
else
|
13
|
+
project = args.first
|
14
|
+
end
|
15
|
+
|
16
|
+
if args[1].nil?
|
17
|
+
source = get_source
|
18
|
+
else
|
19
|
+
source = args[1].upcase
|
20
|
+
end
|
21
|
+
|
22
|
+
if args[2].nil?
|
23
|
+
target = get_target
|
24
|
+
else
|
25
|
+
target = args[2].upcase
|
26
|
+
end
|
27
|
+
|
28
|
+
# Check for source and target being the same
|
29
|
+
if source == target
|
30
|
+
says("Source and target cannot be the same")
|
31
|
+
exit
|
32
|
+
end
|
33
|
+
|
34
|
+
migration = get_migration
|
35
|
+
ad = Voodoo::AppDesigner.new
|
36
|
+
|
37
|
+
# Compare source to target
|
38
|
+
ad.compare(project, migration, source, target)
|
39
|
+
migration.continue?
|
40
|
+
|
41
|
+
# Copy source to file
|
42
|
+
ad.copy_to_file(project, migration, source)
|
43
|
+
|
44
|
+
# Copy definition only to database
|
45
|
+
ad.migrate_project_definition(project, migration, source, target)
|
46
|
+
|
47
|
+
# Copy target to file
|
48
|
+
ad.copy_to_file(project, migration, target)
|
49
|
+
|
50
|
+
# Copy full project
|
51
|
+
ad.migrate_full_project(project, migration, source, target)
|
52
|
+
|
53
|
+
# Run second compare report
|
54
|
+
ad.compare(project, migration, target,source)
|
55
|
+
|
56
|
+
# Build project in target database
|
57
|
+
if agree("Build project in target database? ") == true
|
58
|
+
dm = Voodoo::DataMover.new
|
59
|
+
ad.build_project(project, migration, target)
|
60
|
+
dm.run(migration, target, "PSBUILD.sql")
|
61
|
+
end
|
62
|
+
|
63
|
+
# Move output files to archive folder for the target
|
64
|
+
if agree("Copy output files to archive folder for #{target.name}? ") == true
|
65
|
+
migration.copy_to_archive(target.migration_archive)
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
|
2
|
+
module Voodoo
|
3
|
+
|
4
|
+
module Commands
|
5
|
+
|
6
|
+
def self.remove(args=nil)
|
7
|
+
if args[0].nil?
|
8
|
+
source = get_source
|
9
|
+
else
|
10
|
+
source = args[0].upcase
|
11
|
+
end
|
12
|
+
LOG.info("Removing #{source} from the list of configured environments")
|
13
|
+
ENVIRONMENTS.delete(source)
|
14
|
+
Voodoo.write_env_file
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Voodoo
|
2
|
+
|
3
|
+
module Commands
|
4
|
+
extend self
|
5
|
+
|
6
|
+
def run_sqr(sqr_name=nil)
|
7
|
+
if sqr_name.nil?
|
8
|
+
sqr_name = get_sqr
|
9
|
+
end
|
10
|
+
|
11
|
+
target = get_target
|
12
|
+
migration = get_migration
|
13
|
+
|
14
|
+
instance = Voodoo::Sqr.new
|
15
|
+
instance.run(migration, target)
|
16
|
+
end
|
17
|
+
|
18
|
+
def run_appengine(ae_name=nil)
|
19
|
+
if ae_name.nil?
|
20
|
+
ae_name = get_appengine
|
21
|
+
end
|
22
|
+
|
23
|
+
target = get_target
|
24
|
+
migration = get_migration
|
25
|
+
|
26
|
+
instance = Voodoo::AppEngine.new
|
27
|
+
instance.run(migration, target)
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
|
2
|
+
module Voodoo
|
3
|
+
|
4
|
+
module Commands
|
5
|
+
|
6
|
+
def self.show(args=nil)
|
7
|
+
if args[0].nil?
|
8
|
+
source = ask("Environment name: ").upcase
|
9
|
+
else
|
10
|
+
source = args[0].upcase
|
11
|
+
end
|
12
|
+
env = Voodoo.environments[source]
|
13
|
+
user_table = table
|
14
|
+
user_table.headings = source.upcase, ' '
|
15
|
+
env.each do |key, value|
|
16
|
+
user_table << [key, value]
|
17
|
+
end
|
18
|
+
puts user_table
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
|
2
|
+
module Voodoo
|
3
|
+
|
4
|
+
class Migration
|
5
|
+
|
6
|
+
def initialize(name)
|
7
|
+
@migration_folder = create_folder(File.join(CONFIGURATION.migration_output_dir, name))
|
8
|
+
end
|
9
|
+
|
10
|
+
def log_folder
|
11
|
+
@log_folder = create_folder(File.join(@migration_folder, 'logs'))
|
12
|
+
end
|
13
|
+
|
14
|
+
def archive_folder
|
15
|
+
@archive_folder = create_folder(File.join(@migration_folder, 'archive'))
|
16
|
+
end
|
17
|
+
|
18
|
+
def sql_folder
|
19
|
+
@sql_folder = create_folder(File.join(@migration_folder, 'sql'))
|
20
|
+
end
|
21
|
+
|
22
|
+
def compare_folder(source, target)
|
23
|
+
create_folder(File.join(compare_base_folder, "#{source}_to_#{target}"))
|
24
|
+
end
|
25
|
+
|
26
|
+
def export_folder(source)
|
27
|
+
create_folder(File.join(project_folder, source))
|
28
|
+
end
|
29
|
+
|
30
|
+
def continue?
|
31
|
+
if agree("Continue? ") == false
|
32
|
+
exit
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def copy_to_archive(archive_folder)
|
37
|
+
FileUtils.cp_r(@migration_folder, archive_folder, :verbose => true)
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def project_folder
|
43
|
+
@project_folder = create_folder(File.join(@migration_folder, 'project'))
|
44
|
+
end
|
45
|
+
|
46
|
+
def compare_base_folder
|
47
|
+
@compare_base_folder = create_folder(File.join(@migration_folder, 'compares'))
|
48
|
+
end
|
49
|
+
|
50
|
+
def create_folder(folder_path)
|
51
|
+
Dir.mkdir(folder_path) unless File.exists?(folder_path)
|
52
|
+
return folder_path
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'win32/registry'
|
3
|
+
|
4
|
+
module Voodoo
|
5
|
+
|
6
|
+
class PeopleTools
|
7
|
+
|
8
|
+
attr_accessor :command_line_options, :executable
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
set_base_parameters
|
12
|
+
@tools_bin = File.join(Voodoo.configuration[:ps_home], %w{bin client winx86}).gsub!(File::SEPARATOR, File::ALT_SEPARATOR)
|
13
|
+
LOG.debug("Tools bin is set to #{@tools_bin}")
|
14
|
+
end
|
15
|
+
|
16
|
+
def append(args)
|
17
|
+
args.each_pair do |k, v|
|
18
|
+
@command_line_options.push case
|
19
|
+
when k == :db_type
|
20
|
+
'-CT ' + v
|
21
|
+
when k == :env_name
|
22
|
+
'-CD ' + v
|
23
|
+
when k == :env_username
|
24
|
+
'-CO ' + v
|
25
|
+
when k == :env_password
|
26
|
+
'-CP ' + v
|
27
|
+
when k == :compare_project
|
28
|
+
'-PJM ' + v
|
29
|
+
when k == :archive_project
|
30
|
+
'-PJTF ' + v
|
31
|
+
when k == :copy_project
|
32
|
+
'-PJC ' + v
|
33
|
+
when k == :build_project
|
34
|
+
'-PJB ' + v
|
35
|
+
when k == :target_name
|
36
|
+
'-TD ' + v
|
37
|
+
when k == :target_username
|
38
|
+
'-TO ' + v
|
39
|
+
when k == :target_password
|
40
|
+
'-TP ' + v
|
41
|
+
when k == :log_file
|
42
|
+
'-LF ' + v
|
43
|
+
when k == :tgt
|
44
|
+
'-TGT ' + v
|
45
|
+
when k == :cmxml
|
46
|
+
'-CMXML ' + v
|
47
|
+
when k == :compare_folder
|
48
|
+
'-ROD ' + v
|
49
|
+
when k == :exp
|
50
|
+
'-EXP ' + v
|
51
|
+
when k == :obj
|
52
|
+
'-OBJ ' + v
|
53
|
+
when k == :r
|
54
|
+
'-R ' + v
|
55
|
+
when k == :ae_name
|
56
|
+
'-AI ' + v
|
57
|
+
when k == :output_folder
|
58
|
+
'-FP ' + v
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def call_executable
|
64
|
+
LOG.debug("Executable is set to #{@executable}")
|
65
|
+
LOG.debug("Command line options are set to #{@command_line_options.join(" ")}")
|
66
|
+
f = IO.popen(@executable + " " + @command_line_options.join(" "))
|
67
|
+
f.readlines.each { |line| LOG.info("#{line}")}
|
68
|
+
f.close
|
69
|
+
@command_line_options.clear
|
70
|
+
set_base_parameters
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
def set_base_parameters
|
76
|
+
@command_line_options = [].push("-HIDE -QUIET -SS NO")
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
Voodoo.require_all_libs_relative_to(__FILE__)
|
@@ -0,0 +1,147 @@
|
|
1
|
+
|
2
|
+
module Voodoo
|
3
|
+
|
4
|
+
class AppDesigner < PeopleTools
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
super
|
8
|
+
@executable = File.join(@tools_bin, %w{pside.exe}).gsub!(File::SEPARATOR, File::ALT_SEPARATOR)
|
9
|
+
end
|
10
|
+
|
11
|
+
def compare(project, migration, source, target)
|
12
|
+
begin
|
13
|
+
LOG.info("Creating compare reports for #{project} between #{source.name} and #{target.name}")
|
14
|
+
append(:db_type => source.db_type)
|
15
|
+
append(:env_name => source.name)
|
16
|
+
append(:env_username => source.app_username)
|
17
|
+
append(:env_password => source.app_password)
|
18
|
+
append(:compare_project => project)
|
19
|
+
append(:target_name => target.name)
|
20
|
+
append(:target_username => target.app_username)
|
21
|
+
append(:target_password => target.app_password)
|
22
|
+
append(:log_file => File.join(migration.log_folder, "Compare_#{source.name}_to_#{target.name}.log"))
|
23
|
+
append(:tgt => '1')
|
24
|
+
append(:compare_folder => migration.compare_folder(source.name, target.name))
|
25
|
+
append(:cmxml => '1')
|
26
|
+
call_executable
|
27
|
+
view_compare_report(migration.compare_folder(source.name, target.name))
|
28
|
+
rescue
|
29
|
+
LOG.error("Compare report creation failed")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def copy_to_file(project, migration, source)
|
34
|
+
begin
|
35
|
+
LOG.info("Copying #{project} from #{source.name} to file")
|
36
|
+
append(:db_type => source.db_type)
|
37
|
+
append(:env_name => source.name)
|
38
|
+
append(:env_username => source.app_username)
|
39
|
+
append(:env_password => source.app_password)
|
40
|
+
append(:archive_project => project)
|
41
|
+
append(:output_folder => migration.export_folder(source.name))
|
42
|
+
append(:log_file => File.join(migration.log_folder, "Copy_#{source.name}_to_file.log"))
|
43
|
+
call_executable
|
44
|
+
LOG.info("Project copied to file successfully")
|
45
|
+
rescue
|
46
|
+
LOG.error("Project file copy failed")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def migrate_full_project(project, migration, source, target)
|
51
|
+
begin
|
52
|
+
LOG.info("Copying #{project} from #{source.name} to #{target.name}")
|
53
|
+
append(:db_type => source.db_type)
|
54
|
+
append(:env_name => source.name)
|
55
|
+
append(:env_username => source.app_username)
|
56
|
+
append(:env_password => source.app_password)
|
57
|
+
append(:copy_project => project)
|
58
|
+
append(:target_name => target.name)
|
59
|
+
append(:target_username => target.app_username)
|
60
|
+
append(:target_password => target.app_password)
|
61
|
+
append(:log_file => File.join(migration.log_folder, "Copy_project_#{project}_from_#{source.name}_to_#{target.name}.log"))
|
62
|
+
call_executable
|
63
|
+
LOG.info("Project migrated successfully")
|
64
|
+
rescue
|
65
|
+
LOG.error("Project migration failed")
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def migrate_project_definition(project, migration, source, target)
|
70
|
+
begin
|
71
|
+
LOG.info("Copying #{project} definition from #{source.name} to #{target.name}")
|
72
|
+
append(:db_type => source.db_type)
|
73
|
+
append(:env_name => source.name)
|
74
|
+
append(:env_username => source.app_username)
|
75
|
+
append(:env_password => source.app_password)
|
76
|
+
append(:copy_project => project)
|
77
|
+
append(:target_name => target.name)
|
78
|
+
append(:target_username => target.app_username)
|
79
|
+
append(:target_password => target.app_password)
|
80
|
+
append(:log_file => File.join(migration.log_folder, "Copy_project_definition_#{project}_from_#{source.name}_to_#{target.name}.log"))
|
81
|
+
append(:exp => '1')
|
82
|
+
append(:obj => '16')
|
83
|
+
call_executable
|
84
|
+
LOG.info("Project migrated successfully")
|
85
|
+
rescue
|
86
|
+
LOG.error("Project definition migration failed")
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def build_project(project, migration, source)
|
91
|
+
begin
|
92
|
+
LOG.info("Creating build SQL for #{project}")
|
93
|
+
append(:db_type => source.db_type)
|
94
|
+
append(:env_name => source.name)
|
95
|
+
append(:env_username => source.app_username)
|
96
|
+
append(:env_password => source.app_password)
|
97
|
+
append(:build_project => project)
|
98
|
+
update_build_settings(File.join(migration.log_folder, "PSBUILD.log"), File.join(migration.sql_folder, "PSBUILD.sql"))
|
99
|
+
call_executable
|
100
|
+
LOG.info("Project build SQL created successfully")
|
101
|
+
rescue
|
102
|
+
LOG.error("Project SQL build failed")
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
|
107
|
+
private
|
108
|
+
|
109
|
+
def view_compare_report(folder)
|
110
|
+
`start #{folder + "\\CompareViewer.html"}`
|
111
|
+
end
|
112
|
+
|
113
|
+
def update_build_settings(log_file, sql_file)
|
114
|
+
Win32::Registry::HKEY_CURRENT_USER.open('Software\PeopleSoft\PeopleTools\Release8.40\RDM Build Settings', Win32::Registry::KEY_WRITE) do |reg|
|
115
|
+
reg['AlterAdds', Win32::Registry::REG_DWORD] = 1
|
116
|
+
reg['AlterByTableRename', Win32::Registry::REG_DWORD] = 1
|
117
|
+
reg['AlterChanges', Win32::Registry::REG_DWORD] = 1
|
118
|
+
reg['AlterDeletes', Win32::Registry::REG_DWORD] = 1
|
119
|
+
reg['AlterDropOption', Win32::Registry::REG_DWORD] = 1
|
120
|
+
reg['AlterRenames', Win32::Registry::REG_DWORD] = 1
|
121
|
+
reg['AlterTables', Win32::Registry::REG_DWORD] = 1
|
122
|
+
reg['AlterTruncateOption', Win32::Registry::REG_DWORD] = 1
|
123
|
+
reg['AlwaysOverwrite', Win32::Registry::REG_DWORD] = 1
|
124
|
+
reg['CreateIndexes', Win32::Registry::REG_DWORD] = 1
|
125
|
+
reg['CreateTables', Win32::Registry::REG_DWORD] = 1
|
126
|
+
reg['CreateTrigger', Win32::Registry::REG_DWORD] = 1
|
127
|
+
reg['CreateViews', Win32::Registry::REG_DWORD] = 1
|
128
|
+
reg['ExecuteOption', Win32::Registry::REG_DWORD] = 2
|
129
|
+
reg['ForceAlterOption', Win32::Registry::REG_DWORD] = 1
|
130
|
+
reg['IndexOption', Win32::Registry::REG_DWORD] = 0
|
131
|
+
reg['LogComments', Win32::Registry::REG_DWORD] = 1
|
132
|
+
reg['LogErrors', Win32::Registry::REG_DWORD] = 1
|
133
|
+
reg['LogFilename', Win32::Registry::REG_SZ] = log_file
|
134
|
+
reg['LogSettings', Win32::Registry::REG_DWORD] = 1
|
135
|
+
reg['LogToScript', Win32::Registry::REG_DWORD] = 1
|
136
|
+
reg['LogToWindow', Win32::Registry::REG_DWORD] = 1
|
137
|
+
reg['OutputToSingleFile', Win32::Registry::REG_DWORD] = 1
|
138
|
+
reg['OutputToSingleFilename', Win32::Registry::REG_SZ] = sql_file
|
139
|
+
reg['TableOption', Win32::Registry::REG_DWORD] = 2
|
140
|
+
reg['UnicodeScript', Win32::Registry::REG_DWORD] = 0
|
141
|
+
reg['ViewOption', Win32::Registry::REG_DWORD] = 1
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
|
2
|
+
module Voodoo
|
3
|
+
|
4
|
+
class AppEngine < PeopleTools
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
super
|
8
|
+
@executable = File.join(@tools_bin, %w{psae.exe})
|
9
|
+
end
|
10
|
+
|
11
|
+
def run(target, appengine_name)
|
12
|
+
append(:db_type => target.db_type)
|
13
|
+
append(:env_name => target.name)
|
14
|
+
append(:env_username => target.app_username)
|
15
|
+
append(:env_password => target.app_password)
|
16
|
+
append(:r => '1')
|
17
|
+
append(:ae_name => appengine_name)
|
18
|
+
call_executable
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
|
2
|
+
module Voodoo
|
3
|
+
|
4
|
+
class DataMover < PeopleTools
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
super
|
8
|
+
@executable = File.join(@tools_bin, %w{psdmtx.exe})
|
9
|
+
end
|
10
|
+
|
11
|
+
def run(migration, source, script_name)
|
12
|
+
append(:db_type => source.db_type)
|
13
|
+
append(:env_name => source.name)
|
14
|
+
append(:env_username => source.app_username)
|
15
|
+
append(:env_password => source.app_password)
|
16
|
+
append(:output_folder => File.join(migration.sql_folder, script_name).gsub!(File::SEPARATOR, File::ALT_SEPARATOR))
|
17
|
+
update_dms_settings(migration.sql_folder, migration.log_folder)
|
18
|
+
call_executable
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def update_dms_settings(io, logs)
|
24
|
+
Win32::Registry::HKEY_LOCAL_MACHINE.open('SOFTWARE\PeopleSoft\PeopleTools\Release8.40\Profiles\Default\Data Mover', Win32::Registry::KEY_WRITE) do |reg|
|
25
|
+
reg['InputDir', Win32::Registry::REG_SZ] = io
|
26
|
+
reg['OutputDir', Win32::Registry::REG_SZ] = io
|
27
|
+
reg['LogDir', Win32::Registry::REG_SZ] = logs
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
|
2
|
+
module Voodoo
|
3
|
+
|
4
|
+
class Sqr
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@sqr_bin = File.join(Voodoo.configuration[:ps_home], %w{bin sqr ORA BINW}).gsub!(File::SEPARATOR, File::ALT_SEPARATOR)
|
8
|
+
@executable = File.join(@tools_bin, %w{sqrw.exe})
|
9
|
+
end
|
10
|
+
|
11
|
+
def run(target, sqr_name)
|
12
|
+
append(:db_type => target.db_type)
|
13
|
+
append(:env_name => target.name)
|
14
|
+
append(:env_username => target.app_username)
|
15
|
+
append(:env_password => target.app_password)
|
16
|
+
append(:r => '1')
|
17
|
+
append(:sqr_name => sqr_name)
|
18
|
+
call_executable
|
19
|
+
end
|
20
|
+
|
21
|
+
# def run_sqr(executable_path, sqrbin_path, sqr_name, db_username, db_password, db_name, output_directory)
|
22
|
+
# executable = 'sqrw.exe'
|
23
|
+
|
24
|
+
# if File.exists?(sqrbin_path + sqr_name)
|
25
|
+
# s.run_sqr(SQR_BIN, database["ps_home"] + "\\sqr\\isc\\", sqr_name, database["db_username"], database["db_password"], db, BASE_DIRECTORY + "\\" + output_directory)
|
26
|
+
# elsif File.exists?(database["ps_home"] + "\\sqr\\" + sqr_name)
|
27
|
+
# s.run_sqr(SQR_BIN, database["ps_home"] + "\\sqr\\", sqr_name, database["db_username"], database["db_password"], db, BASE_DIRECTORY + "\\" + output_directory)
|
28
|
+
# else
|
29
|
+
# say("SQR not found...")
|
30
|
+
# end
|
31
|
+
# arguments = Array.new
|
32
|
+
# arguments << executable_path + executable
|
33
|
+
# arguments << sqrbin_path + sqr_name
|
34
|
+
# arguments << db_username + '/' + db_password + '@' + db_name
|
35
|
+
# arguments << '-I' + sqrbin_path
|
36
|
+
# arguments << '-F' + output_directory
|
37
|
+
# arguments << '-ZIF' + sqrbin_path + 'pssqr.ini'
|
38
|
+
# arguments << '-PRINTER:PD'
|
39
|
+
# Dir.mkdir(output_directory) unless File.exists?(output_directory)
|
40
|
+
# executable_string = arguments.join(" ")
|
41
|
+
# puts executable_string
|
42
|
+
# # `#{executable_string}`
|
43
|
+
# f = IO.popen(executable_string)
|
44
|
+
# f.readlines.each { |line| print "#{line}"}
|
45
|
+
# f.close
|
46
|
+
# end
|
47
|
+
|
48
|
+
def append(args)
|
49
|
+
args.each_pair do |k, v|
|
50
|
+
@command_line_options.push case
|
51
|
+
when k == :db_type
|
52
|
+
'-CT ' + v
|
53
|
+
when k == :env_name
|
54
|
+
'-CD ' + v
|
55
|
+
when k == :env_username
|
56
|
+
'-CO ' + v
|
57
|
+
when k == :env_password
|
58
|
+
'-CP ' + v
|
59
|
+
when k == :compare_project
|
60
|
+
'-PJM ' + v
|
61
|
+
when k == :archive_project
|
62
|
+
'-PJTF ' + v
|
63
|
+
when k == :copy_project
|
64
|
+
'-PJC ' + v
|
65
|
+
when k == :build_project
|
66
|
+
'-PJB ' + v
|
67
|
+
when k == :target_name
|
68
|
+
'-TD ' + v
|
69
|
+
when k == :target_username
|
70
|
+
'-TO ' + v
|
71
|
+
when k == :target_password
|
72
|
+
'-TP ' + v
|
73
|
+
when k == :log_file
|
74
|
+
'-LF ' + v
|
75
|
+
when k == :tgt
|
76
|
+
'-TGT ' + v
|
77
|
+
when k == :cmxml
|
78
|
+
'-CMXML ' + v
|
79
|
+
when k == :compare_folder
|
80
|
+
'-ROD ' + v
|
81
|
+
when k == :exp
|
82
|
+
'-EXP ' + v
|
83
|
+
when k == :obj
|
84
|
+
'-OBJ ' + v
|
85
|
+
when k == :r
|
86
|
+
'-R ' + v
|
87
|
+
when k == :ae_name
|
88
|
+
'-AI ' + v
|
89
|
+
when k == :output_folder
|
90
|
+
'-FP ' + v
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def call_executable
|
96
|
+
LOG.debug("Executable is set to #{@executable}")
|
97
|
+
LOG.debug("Command line options are set to #{@command_line_options.join(" ")}")
|
98
|
+
f = IO.popen(@executable + " " + @command_line_options.join(" "))
|
99
|
+
f.readlines.each { |line| LOG.info("#{line}")}
|
100
|
+
f.close
|
101
|
+
@command_line_options.clear
|
102
|
+
set_base_parameters
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
def set_base_parameters
|
108
|
+
@command_line_options = [].push("-HIDE -QUIET -SS NO")
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
data/ps-voodoo.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "voodoo/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "ps-voodoo"
|
7
|
+
s.version = Voodoo::VERSION
|
8
|
+
s.authors = ["JR Bing"]
|
9
|
+
s.email = ["jrbing@gmail.com"]
|
10
|
+
s.homepage = "https://github.com/jrbing/ps-voodoo"
|
11
|
+
s.summary = %q{Black magic utility for PeopleSoft administration}
|
12
|
+
s.description = %q{A small command line utility for helping with PeopleSoft administration}
|
13
|
+
|
14
|
+
s.add_dependency("commander", [">= 4.0.4"])
|
15
|
+
s.add_dependency("terminal-table", [">= 1.4.2"])
|
16
|
+
|
17
|
+
s.rubyforge_project = "ps-voodoo"
|
18
|
+
|
19
|
+
s.files = `git ls-files`.split("\n")
|
20
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
21
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
22
|
+
s.require_paths = ["lib"]
|
23
|
+
end
|
metadata
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ps-voodoo
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- JR Bing
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-06-13 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: commander
|
16
|
+
requirement: &15634116 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 4.0.4
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *15634116
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: terminal-table
|
27
|
+
requirement: &15633804 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.4.2
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *15633804
|
36
|
+
description: A small command line utility for helping with PeopleSoft administration
|
37
|
+
email:
|
38
|
+
- jrbing@gmail.com
|
39
|
+
executables:
|
40
|
+
- voodoo
|
41
|
+
extensions: []
|
42
|
+
extra_rdoc_files: []
|
43
|
+
files:
|
44
|
+
- .gitignore
|
45
|
+
- Gemfile
|
46
|
+
- Gemfile.lock
|
47
|
+
- LICENSE.txt
|
48
|
+
- README.md
|
49
|
+
- Rakefile
|
50
|
+
- bin/voodoo
|
51
|
+
- lib/voodoo.rb
|
52
|
+
- lib/voodoo/commands.rb
|
53
|
+
- lib/voodoo/commands/add.rb
|
54
|
+
- lib/voodoo/commands/build.rb
|
55
|
+
- lib/voodoo/commands/compare.rb
|
56
|
+
- lib/voodoo/commands/config.rb
|
57
|
+
- lib/voodoo/commands/list.rb
|
58
|
+
- lib/voodoo/commands/migrate.rb
|
59
|
+
- lib/voodoo/commands/remove.rb
|
60
|
+
- lib/voodoo/commands/run.rb
|
61
|
+
- lib/voodoo/commands/show.rb
|
62
|
+
- lib/voodoo/migration.rb
|
63
|
+
- lib/voodoo/peopletools.rb
|
64
|
+
- lib/voodoo/peopletools/appdesigner.rb
|
65
|
+
- lib/voodoo/peopletools/appengine.rb
|
66
|
+
- lib/voodoo/peopletools/datamover.rb
|
67
|
+
- lib/voodoo/peopletools/sqr.rb
|
68
|
+
- lib/voodoo/version.rb
|
69
|
+
- ps-voodoo.gemspec
|
70
|
+
homepage: https://github.com/jrbing/ps-voodoo
|
71
|
+
licenses: []
|
72
|
+
post_install_message:
|
73
|
+
rdoc_options: []
|
74
|
+
require_paths:
|
75
|
+
- lib
|
76
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
77
|
+
none: false
|
78
|
+
requirements:
|
79
|
+
- - ! '>='
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
requirements: []
|
89
|
+
rubyforge_project: ps-voodoo
|
90
|
+
rubygems_version: 1.8.5
|
91
|
+
signing_key:
|
92
|
+
specification_version: 3
|
93
|
+
summary: Black magic utility for PeopleSoft administration
|
94
|
+
test_files: []
|