rlogic 0.1.0 → 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.
- data/bin/wlst +22 -21
- data/lib/rlogic.rb +12 -4
- data/lib/rlogic/version.rb +1 -1
- data/lib/wlst/include.py +31 -13
- data/lib/wlst/scripts/control.info +1 -0
- data/lib/wlst/scripts/control.py +32 -0
- data/lib/wlst/scripts/control.yaml +23 -0
- data/lib/wlst/scripts/monitor.py +59 -34
- data/lib/wlst/scripts/monitor.yaml +4 -0
- data/lib/wlst/wlst.rb +29 -4
- metadata +5 -2
data/bin/wlst
CHANGED
@@ -37,7 +37,7 @@ FileUtils::mkdir_p @scripts_dir
|
|
37
37
|
FileUtils::mkdir_p @tmp_dir
|
38
38
|
|
39
39
|
@script_file = "#{@tmp_dir}/wlst.py"
|
40
|
-
@
|
40
|
+
@script_log = "#{@tmp_dir}/out.log"
|
41
41
|
@scrtip_output = "#{@tmp_dir}/out"
|
42
42
|
servers_file = "#{@conf_dir}/servers.yaml"
|
43
43
|
@servers_file = File.expand_path(servers_file)
|
@@ -47,7 +47,8 @@ weblogic[:wl_home] = (ENV["WL_HOME"] or Dir.pwd)
|
|
47
47
|
invokes = {}
|
48
48
|
mappings = {}
|
49
49
|
|
50
|
-
resolver = WLST::ScriptResolver::new :scripts_dir => @scripts_dir
|
50
|
+
resolver = WLST::ScriptResolver::new :scripts_dir => @scripts_dir,
|
51
|
+
:redirect => @script_log
|
51
52
|
|
52
53
|
def load_yaml
|
53
54
|
return Hash::new unless File.exist?(@servers_file)
|
@@ -60,6 +61,7 @@ opts.on('--home PATH', 'Defines the WL_HOME variable') do |home|
|
|
60
61
|
end
|
61
62
|
opts.on('--host HOST', 'Defines the Weblogic host') do |host|
|
62
63
|
weblogic[:host] = host
|
64
|
+
@connect = true
|
63
65
|
end
|
64
66
|
opts.on('--port PORT', 'Defines the Weblogic port') do |port|
|
65
67
|
weblogic[:port] = port
|
@@ -71,6 +73,7 @@ opts.on('--connect SERVER_NAME',
|
|
71
73
|
config.each do |key, value|
|
72
74
|
weblogic[key.to_sym] = value
|
73
75
|
end
|
76
|
+
@connect = true
|
74
77
|
end
|
75
78
|
opts.on('--save SERVER_NAME', "Saves the server configuration in #{servers_file}") do |server|
|
76
79
|
save = (server or 'default')
|
@@ -87,7 +90,7 @@ opts.on('--print', 'Prints the script output') do
|
|
87
90
|
end
|
88
91
|
|
89
92
|
opts.on('--list', 'Lists available scripts') do
|
90
|
-
puts "Available
|
93
|
+
puts "Available scripts:"
|
91
94
|
resolver.scripts.each do |key, script|
|
92
95
|
puts "\t#{key}"
|
93
96
|
end
|
@@ -103,12 +106,14 @@ opts.on('--info SCRIPT', 'Shows info for selected script') do |script_key|
|
|
103
106
|
end
|
104
107
|
exit 0
|
105
108
|
end
|
106
|
-
opts.on('--
|
107
|
-
|
109
|
+
opts.on('--loop INTERVAL', Float, 'Runs the script inside a loop') do |interval|
|
110
|
+
@monitor = true
|
111
|
+
@interval = interval
|
108
112
|
end
|
109
113
|
|
110
114
|
opts.on("-h", "--help", "Shows this help message") do
|
111
|
-
puts opts
|
115
|
+
puts opts
|
116
|
+
exit 0
|
112
117
|
end
|
113
118
|
opts.parse!(ARGV)
|
114
119
|
|
@@ -129,13 +134,6 @@ if save
|
|
129
134
|
end
|
130
135
|
|
131
136
|
@command = WLST::Command::new
|
132
|
-
@command.redirect @scrtip_log, 'false'
|
133
|
-
|
134
|
-
connect = (weblogic[:user] and weblogic[:password] and weblogic[:host] and weblogic[:port])
|
135
|
-
|
136
|
-
if connect
|
137
|
-
@command.connect(weblogic[:user], weblogic[:password], "t3://#{weblogic[:host]}:#{weblogic[:port]}")
|
138
|
-
end
|
139
137
|
|
140
138
|
invokes.each do |id, args|
|
141
139
|
mappings[id]::new(@command).execute *args
|
@@ -152,24 +150,27 @@ unless ARGV.empty?
|
|
152
150
|
:for => weblogic
|
153
151
|
)
|
154
152
|
else
|
153
|
+
if @connect
|
154
|
+
@command.connect(weblogic[:user], weblogic[:password], "t3://#{weblogic[:host]}:#{weblogic[:port]}")
|
155
|
+
end
|
155
156
|
if ARGV.empty?
|
156
157
|
@command.send script
|
157
158
|
else
|
158
159
|
ARGV.each { |arg| @command.send script, *(arg.split /,/) }
|
159
160
|
end
|
161
|
+
if @connect
|
162
|
+
@command.disconnect
|
163
|
+
end
|
160
164
|
end
|
161
165
|
end
|
162
166
|
|
163
|
-
if connect
|
164
|
-
@command.disconnect
|
165
|
-
end
|
166
|
-
|
167
167
|
if @print
|
168
168
|
puts @command.to_s
|
169
169
|
else
|
170
170
|
@command.to_f @script_file
|
171
|
-
runner = WLST::Runner::new weblogic[:wl_home]
|
172
|
-
|
173
|
-
|
174
|
-
|
171
|
+
@runner = WLST::Runner::new :wl_home => weblogic[:wl_home],
|
172
|
+
:script_file => @script_file,
|
173
|
+
:output_file => @scrtip_output,
|
174
|
+
:print => true
|
175
|
+
@runner.run @interval
|
175
176
|
end
|
data/lib/rlogic.rb
CHANGED
@@ -26,8 +26,12 @@ require_relative "wlst/wlst"
|
|
26
26
|
if RUBY_PLATFORM['linux']
|
27
27
|
module WLST
|
28
28
|
class Runner
|
29
|
-
def command
|
30
|
-
". #{@wl_home}/server/bin/setWLSEnv.sh && java weblogic.WLST #{file}"
|
29
|
+
def command
|
30
|
+
". #{@wl_home}/server/bin/setWLSEnv.sh && java weblogic.WLST #{@file}"
|
31
|
+
end
|
32
|
+
|
33
|
+
def clear_screen
|
34
|
+
system("clear")
|
31
35
|
end
|
32
36
|
end
|
33
37
|
class ScriptResolver
|
@@ -39,8 +43,12 @@ if RUBY_PLATFORM['linux']
|
|
39
43
|
elsif RUBY_PLATFORM['mingw'] #Windows
|
40
44
|
module WLST
|
41
45
|
class Runner
|
42
|
-
def command
|
43
|
-
"#{@wl_home}/server/bin/setWLSEnv.cmd && java weblogic.WLST #{file}"
|
46
|
+
def command
|
47
|
+
"#{@wl_home}/server/bin/setWLSEnv.cmd && java weblogic.WLST #{@file}"
|
48
|
+
end
|
49
|
+
|
50
|
+
def clear_screen
|
51
|
+
system("cls")
|
44
52
|
end
|
45
53
|
end
|
46
54
|
class ScriptResolver
|
data/lib/rlogic/version.rb
CHANGED
data/lib/wlst/include.py
CHANGED
@@ -48,25 +48,25 @@ class ConsoleTheme:
|
|
48
48
|
class TableBuilder:
|
49
49
|
def __init__(self, theme=ConsoleTheme()):
|
50
50
|
self.data = []
|
51
|
-
self.
|
51
|
+
self.colors = theme
|
52
52
|
|
53
53
|
def title(self, title):
|
54
|
-
self.titleText = self.
|
54
|
+
self.titleText = self.colors.title(title)
|
55
55
|
|
56
56
|
def header(self, header):
|
57
|
-
self.data.append(self.
|
57
|
+
self.data.append(self.colors.header(header))
|
58
58
|
|
59
59
|
def bad(self, row):
|
60
|
-
self.data.append(self.
|
60
|
+
self.data.append(self.colors.bad(row))
|
61
61
|
|
62
62
|
def good(self, row):
|
63
|
-
self.data.append(self.
|
63
|
+
self.data.append(self.colors.good(row))
|
64
64
|
|
65
65
|
def warn(self, row):
|
66
|
-
self.data.append(self.
|
66
|
+
self.data.append(self.colors.warn(row))
|
67
67
|
|
68
68
|
def normal(self, row):
|
69
|
-
self.data.append(self.
|
69
|
+
self.data.append(self.colors.normal(row))
|
70
70
|
|
71
71
|
def printData(self):
|
72
72
|
print self.titleText
|
@@ -88,12 +88,8 @@ def getRunningServers():
|
|
88
88
|
return cmo.getServers()
|
89
89
|
|
90
90
|
|
91
|
-
def format_num(num):
|
92
|
-
return str(num)
|
93
|
-
|
94
|
-
|
95
91
|
def get_max_width(table, index):
|
96
|
-
return max([len(
|
92
|
+
return max([len(str(row[index])) for row in table])
|
97
93
|
|
98
94
|
|
99
95
|
def pprint_table(out, table):
|
@@ -107,6 +103,28 @@ def pprint_table(out, table):
|
|
107
103
|
print >> out, row[0].ljust(col_paddings[0] + 1),
|
108
104
|
# rest of the cols
|
109
105
|
for i in range(1, len(row)):
|
110
|
-
col =
|
106
|
+
col = str(row[i]).rjust(col_paddings[i] + 2)
|
111
107
|
print >> out, col,
|
112
108
|
print >> out
|
109
|
+
|
110
|
+
|
111
|
+
def getServerNames(arg = "servers"):
|
112
|
+
if not len(args[arg]):
|
113
|
+
serverNames = []
|
114
|
+
servers = getRunningServers()
|
115
|
+
for server in servers:
|
116
|
+
serverNames.append(server.getName())
|
117
|
+
return serverNames
|
118
|
+
else:
|
119
|
+
return args[arg]
|
120
|
+
|
121
|
+
def online():
|
122
|
+
try:
|
123
|
+
connect(weblogic['user'], weblogic['password'], ('t3://' + weblogic['host'] + ':' + weblogic['port']))
|
124
|
+
except:
|
125
|
+
print ConsoleTheme().bad("Unable to find admin server!")
|
126
|
+
|
127
|
+
def offline():
|
128
|
+
disconnect()
|
129
|
+
|
130
|
+
colors = ConsoleTheme()
|
@@ -0,0 +1 @@
|
|
1
|
+
Controls a selected resource
|
@@ -0,0 +1,32 @@
|
|
1
|
+
online()
|
2
|
+
|
3
|
+
theme = ConsoleTheme()
|
4
|
+
|
5
|
+
def controlServer():
|
6
|
+
server = args['server']
|
7
|
+
domainRuntime()
|
8
|
+
cd("/ServerLifeCycleRuntimes/" + server)
|
9
|
+
force = args["force"]
|
10
|
+
if args['start']:
|
11
|
+
print theme.good("Starting " + server)
|
12
|
+
cmo.start()
|
13
|
+
elif args['shutdown']:
|
14
|
+
print theme.good("Shutting down " + server)
|
15
|
+
if force:
|
16
|
+
cmo.forceShutdown()
|
17
|
+
else:
|
18
|
+
cmo.shutdown()
|
19
|
+
elif args['suspend']:
|
20
|
+
print theme.good("Suspending " + server)
|
21
|
+
if force:
|
22
|
+
cmo.forceSuspend()
|
23
|
+
else:
|
24
|
+
cmo.suspend()
|
25
|
+
elif args['resume']:
|
26
|
+
print theme.good("Resuming " + server)
|
27
|
+
cmo.resume()
|
28
|
+
|
29
|
+
if args['server']:
|
30
|
+
controlServer()
|
31
|
+
|
32
|
+
offline()
|
@@ -0,0 +1,23 @@
|
|
1
|
+
server:
|
2
|
+
description: select a service to control
|
3
|
+
type: string
|
4
|
+
start:
|
5
|
+
description: start the resource
|
6
|
+
type: boolean
|
7
|
+
default: false
|
8
|
+
suspend:
|
9
|
+
description: suspend the resource
|
10
|
+
type: boolean
|
11
|
+
default: false
|
12
|
+
resume:
|
13
|
+
description: resume the resource
|
14
|
+
type: boolean
|
15
|
+
default: false
|
16
|
+
shutdown:
|
17
|
+
description: shutdown the resource
|
18
|
+
type: boolean
|
19
|
+
default: false
|
20
|
+
force:
|
21
|
+
description: force the operation (if available)
|
22
|
+
type: boolean
|
23
|
+
default: false
|
data/lib/wlst/scripts/monitor.py
CHANGED
@@ -1,15 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
def getServerNames():
|
4
|
-
if not len(args["servers"]):
|
5
|
-
serverNames = []
|
6
|
-
servers = getRunningServers()
|
7
|
-
for server in servers:
|
8
|
-
serverNames.append(server.getName())
|
9
|
-
return serverNames
|
10
|
-
else:
|
11
|
-
return args["servers"]
|
1
|
+
online()
|
12
2
|
|
3
|
+
threshold = args['threshold']
|
13
4
|
|
14
5
|
def monitorConnectionPool():
|
15
6
|
table = TableBuilder()
|
@@ -20,22 +11,21 @@ def monitorConnectionPool():
|
|
20
11
|
for poolRT in poolrtlist:
|
21
12
|
if len(pools) > 0 and not poolRT.getName() in pools:
|
22
13
|
continue
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
continue
|
14
|
+
name = poolRT.getName()
|
15
|
+
maxCapacity = int(poolRT.getAttribute("MaxCapacity"))
|
16
|
+
activeCurrent = int(poolRT.getAttribute("ActiveConnectionsCurrentCount"))
|
17
|
+
activeHighCount = int(poolRT.getAttribute("ActiveConnectionsHighCount"))
|
18
|
+
waitSecs = int(poolRT.getAttribute("WaitSecondsHighCount"))
|
19
|
+
waitingCount = poolRT.getAttribute("WaitingForConnectionCurrentCount")
|
20
|
+
state = poolRT.getAttribute('State')
|
21
|
+
row = [name, maxCapacity, activeCurrent, activeHighCount, waitSecs, waitingCount,
|
22
|
+
state]
|
23
|
+
if (maxCapacity - activeCurrent) / float(maxCapacity) < threshold:
|
24
|
+
table.bad(row)
|
25
|
+
elif state != "Running":
|
26
|
+
table.bad(row)
|
27
|
+
else:
|
28
|
+
table.good(row)
|
39
29
|
table.printData()
|
40
30
|
|
41
31
|
|
@@ -53,14 +43,14 @@ def monitorJVM():
|
|
53
43
|
totaljvm = float(get('HeapSizeCurrent')) / (1024 * 1024)
|
54
44
|
usedjvm = (totaljvm - freejvm)
|
55
45
|
row = [name,
|
56
|
-
str(int(totaljvm)) + "
|
57
|
-
str(int(usedjvm)) + "
|
58
|
-
str(int(freejvm)) + "
|
46
|
+
str(int(totaljvm)) + "MB",
|
47
|
+
str(int(usedjvm)) + "MB",
|
48
|
+
str(int(freejvm)) + "MB"]
|
59
49
|
if freejvm / totaljvm < threshold:
|
60
50
|
table.bad(row)
|
61
51
|
else:
|
62
52
|
table.good(row)
|
63
|
-
except
|
53
|
+
except:
|
64
54
|
continue
|
65
55
|
table.printData()
|
66
56
|
|
@@ -70,7 +60,10 @@ def monitorThreadPool():
|
|
70
60
|
serverNames = getServerNames()
|
71
61
|
domainRuntime()
|
72
62
|
table.title('Thread Pool')
|
73
|
-
table.header(
|
63
|
+
table.header(
|
64
|
+
['Server', 'Hogging', 'Idle', 'Total', 'Pending', 'Completed', 'Queue', 'Throughput'])
|
65
|
+
table.header(
|
66
|
+
['', 'Threads', 'Threads', 'Threads', 'Requests', 'Requests', 'Length', ''])
|
74
67
|
for name in serverNames:
|
75
68
|
try:
|
76
69
|
cd("/ServerRuntimes/" + name + "/ThreadPoolRuntime/ThreadPoolRuntime")
|
@@ -78,14 +71,40 @@ def monitorThreadPool():
|
|
78
71
|
totalThreads = cmo.getExecuteThreadTotalCount()
|
79
72
|
idleThreads = cmo.getExecuteThreadIdleCount()
|
80
73
|
pendingRequests = cmo.getPendingUserRequestCount()
|
74
|
+
completedRequests = cmo.getCompletedRequestCount()
|
75
|
+
queue = cmo.getQueueLength()
|
81
76
|
throughput = float(cmo.getThroughput())
|
82
77
|
data = [name, hoggingThreads, idleThreads, totalThreads, pendingRequests,
|
83
|
-
round(throughput,4)]
|
78
|
+
completedRequests, queue, round(throughput, 4)]
|
84
79
|
if float(idleThreads) / totalThreads < threshold:
|
85
80
|
table.bad(data)
|
86
81
|
else:
|
87
82
|
table.good(data)
|
88
|
-
except
|
83
|
+
except:
|
84
|
+
continue
|
85
|
+
table.printData()
|
86
|
+
|
87
|
+
|
88
|
+
def monitorServerState():
|
89
|
+
table = TableBuilder()
|
90
|
+
serverNames = getServerNames()
|
91
|
+
domainRuntime()
|
92
|
+
table.title("Server State")
|
93
|
+
table.header(["Server", "State"])
|
94
|
+
for name in serverNames:
|
95
|
+
try:
|
96
|
+
cd("/ServerLifeCycleRuntimes/" + name)
|
97
|
+
serverState = cmo.getState()
|
98
|
+
row = [name, serverState]
|
99
|
+
if serverState == "RUNNING":
|
100
|
+
table.good(row)
|
101
|
+
elif serverState == "STARTING":
|
102
|
+
table.warn(row)
|
103
|
+
elif serverState == "UNKNOWN":
|
104
|
+
table.warn(row)
|
105
|
+
else:
|
106
|
+
table.bad(row)
|
107
|
+
except:
|
89
108
|
continue
|
90
109
|
table.printData()
|
91
110
|
|
@@ -97,3 +116,9 @@ if args['pool'] or args['all']:
|
|
97
116
|
print ''
|
98
117
|
if args['thread'] or args['all']:
|
99
118
|
monitorThreadPool()
|
119
|
+
print ''
|
120
|
+
if args['state'] or args['all']:
|
121
|
+
monitorServerState()
|
122
|
+
print ''
|
123
|
+
|
124
|
+
offline()
|
data/lib/wlst/wlst.rb
CHANGED
@@ -38,6 +38,7 @@ module WLST
|
|
38
38
|
includes.each do |include|
|
39
39
|
@includes << File.join(base_dir, include)
|
40
40
|
end
|
41
|
+
@redirect = params[:redirect]
|
41
42
|
end
|
42
43
|
|
43
44
|
def has_script? key
|
@@ -70,6 +71,9 @@ module WLST
|
|
70
71
|
parser = ArgParser::new script[:definition]
|
71
72
|
params = parser.parse *args
|
72
73
|
content = ""
|
74
|
+
if @redirect
|
75
|
+
content << "redirect('#{@redirect}', 'false')\n"
|
76
|
+
end
|
73
77
|
@includes.each do |include|
|
74
78
|
content << File.read(include)
|
75
79
|
end
|
@@ -172,12 +176,26 @@ module WLST
|
|
172
176
|
|
173
177
|
class Runner
|
174
178
|
|
175
|
-
def initialize
|
176
|
-
@wl_home = wl_home
|
179
|
+
def initialize params = {}
|
180
|
+
@wl_home = params[:wl_home]
|
181
|
+
@output_file = params[:output_file]
|
182
|
+
@file = params[:script_file]
|
183
|
+
@print = params[:print]
|
177
184
|
end
|
178
185
|
|
179
|
-
def run
|
180
|
-
|
186
|
+
def run interval = nil
|
187
|
+
if interval
|
188
|
+
while true
|
189
|
+
process :clear_screen => true
|
190
|
+
sleep interval
|
191
|
+
end
|
192
|
+
else
|
193
|
+
process
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def run_and_get_result
|
198
|
+
result = `#{command}`
|
181
199
|
truncated = ""
|
182
200
|
flag = false
|
183
201
|
result.each_line do |line|
|
@@ -191,6 +209,13 @@ module WLST
|
|
191
209
|
result
|
192
210
|
end
|
193
211
|
|
212
|
+
def process params = {}
|
213
|
+
result = run_and_get_result
|
214
|
+
clear_screen if params[:clear_screen] and @print
|
215
|
+
puts result if @print
|
216
|
+
File.open(@output_file, 'w') { |f| f.write result } if @output_file
|
217
|
+
end
|
218
|
+
|
194
219
|
end
|
195
220
|
|
196
221
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rlogic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-03-
|
12
|
+
date: 2012-03-22 00:00:00.000000000Z
|
13
13
|
dependencies: []
|
14
14
|
description: A tool for dealing with WebLogic Scripting Tool
|
15
15
|
email:
|
@@ -29,6 +29,9 @@ files:
|
|
29
29
|
- lib/wlst/include.py
|
30
30
|
- lib/wlst/include_linux.py
|
31
31
|
- lib/wlst/include_windows.py
|
32
|
+
- lib/wlst/scripts/control.info
|
33
|
+
- lib/wlst/scripts/control.py
|
34
|
+
- lib/wlst/scripts/control.yaml
|
32
35
|
- lib/wlst/scripts/monitor.info
|
33
36
|
- lib/wlst/scripts/monitor.py
|
34
37
|
- lib/wlst/scripts/monitor.yaml
|