qa_robusta 0.1.3
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/.autotest +23 -0
- data/.gemtest +0 -0
- data/History.txt +6 -0
- data/Manifest.txt +101 -0
- data/README.txt +48 -0
- data/Rakefile +18 -0
- data/bin/qa_robusta +14 -0
- data/common/Rakefile +95 -0
- data/common/conf/monkey_patch.yaml +8 -0
- data/common/conf/monkey_patch.yaml.ex +10 -0
- data/common/lib/array.rb +9 -0
- data/common/lib/cache.rb +12 -0
- data/common/lib/constants.rb +35 -0
- data/common/lib/error_defns.rb +13 -0
- data/common/lib/format_html_tmp.html +34 -0
- data/common/lib/formatters.rb +18 -0
- data/common/lib/gem_helpers.rb +29 -0
- data/common/lib/gems/.svn/entries +43 -0
- data/common/lib/gems/cache/.svn/entries +28 -0
- data/common/lib/gems/doc/.svn/entries +28 -0
- data/common/lib/gems/gems/.svn/entries +28 -0
- data/common/lib/gems/installed/.svn/entries +40 -0
- data/common/lib/gems/installed/cache/.svn/entries +28 -0
- data/common/lib/gems/installed/doc/.svn/entries +28 -0
- data/common/lib/gems/installed/gems/.svn/entries +28 -0
- data/common/lib/gems/installed/specifications/.svn/entries +28 -0
- data/common/lib/gems/specifications/.svn/entries +28 -0
- data/common/lib/gen_suite_doc.rb +52 -0
- data/common/lib/load_test_data.rb +18 -0
- data/common/lib/monkey_patch.rb +149 -0
- data/common/lib/navigate_mech.rb +79 -0
- data/common/lib/update_element.rb +12 -0
- data/common/monkey_patches/mechanize.rb +589 -0
- data/common/monkey_patches/table.rb +363 -0
- data/common/monkey_patches/telnet.rb +420 -0
- data/common/monkey_patches/unit.rb +538 -0
- data/demo/demo_site.rb +38 -0
- data/demo/public/javascripts/jquery-1.6.2.min.js +18 -0
- data/demo/views/index.erb +35 -0
- data/lib/monkey_patch.rb +26 -0
- data/lib/qa_robusta.rb +3 -0
- data/mechanize_interface/conf/app.yaml +10 -0
- data/mechanize_interface/lib/agent.rb +18 -0
- data/mechanize_interface/lib/app_require.rb +19 -0
- data/mechanize_interface/lib/get_page.rb +20 -0
- data/mechanize_interface/lib/login.rb +30 -0
- data/mechanize_interface/lib/navigation_paths.rb +12 -0
- data/mechanize_interface/test/lib/mech_unit_test.rb +19 -0
- data/qa_observer/conf/dev_users.yaml +9 -0
- data/qa_observer/conf/development.yaml +3 -0
- data/qa_observer/conf/qa_observer_links.yaml +10 -0
- data/qa_observer/generators/site/site_generator.rb +61 -0
- data/qa_observer/generators/site/templates/base_urls.yaml.erb +6 -0
- data/qa_observer/generators/site/templates/create_flow.rb.erb +54 -0
- data/qa_observer/generators/site/templates/elements.rb.erb +61 -0
- data/qa_observer/generators/site/templates/html_elements.yaml +22 -0
- data/qa_observer/generators/site/templates/navigate.rb +32 -0
- data/qa_observer/generators/site/templates/reports.rb +7 -0
- data/qa_observer/generators/site/templates/users_list.yaml +21 -0
- data/qa_observer/generators/test_case/templates/test_case.rb.erb +62 -0
- data/qa_observer/generators/test_case/test_case_generator.rb +29 -0
- data/qa_observer/lib/doc.rb +103 -0
- data/qa_observer/lib/env_details.rb +2 -0
- data/qa_observer/lib/error_defns.rb +3 -0
- data/qa_observer/lib/form_helpers.rb +52 -0
- data/qa_observer/lib/reports.rb +7 -0
- data/qa_observer/lib/requires.rb +23 -0
- data/qa_observer/lib/system_test.rb +146 -0
- data/qa_observer/lib/test_extention.rb +29 -0
- data/qa_observer/lib/update_element.rb +12 -0
- data/qa_observer/lib/watir.rb +42 -0
- data/qa_observer/script/destroy +14 -0
- data/qa_observer/script/generate +14 -0
- data/qa_observer/sites/demo/conf/base_urls.yaml +6 -0
- data/qa_observer/sites/demo/conf/html_elements.yaml +22 -0
- data/qa_observer/sites/demo/conf/remote_machine.yaml +12 -0
- data/qa_observer/sites/demo/conf/users_list.yaml +21 -0
- data/qa_observer/sites/demo/elements/demo_elements.rb +9 -0
- data/qa_observer/sites/demo/flows/demo_flows.rb +37 -0
- data/qa_observer/sites/demo/helpers/.placeholder +0 -0
- data/qa_observer/sites/demo/lib/navigate.rb +32 -0
- data/qa_observer/sites/demo/lib/reports.rb +7 -0
- data/qa_observer/sites/demo/results/.placeholder +0 -0
- data/qa_observer/sites/demo/results/images/.placeholder +0 -0
- data/qa_observer/sites/demo/test_cases/home_page.rb +106 -0
- data/qa_observer/suites/demo_lg_chrome/lg.yaml +11 -0
- data/qa_observer/suites/demo_md_chrome/md.yaml +11 -0
- data/qa_observer/suites/demo_sm_chrome/sm.yaml +11 -0
- data/qa_observer/suites/init.rb +41 -0
- data/qa_observer/test_runner.rb +125 -0
- data/remote_unix/helpers/constants.rb +8 -0
- data/remote_unix/helpers/out_xforms.rb +48 -0
- data/remote_unix/lib/common.rb +52 -0
- data/remote_unix/lib/error_defn.rb +4 -0
- data/remote_unix/lib/general_unix.rb +308 -0
- data/remote_unix/lib/network_commands.rb +41 -0
- data/remote_unix/lib/network_info.rb +98 -0
- data/remote_unix/lib/postfix_commands.rb +87 -0
- data/remote_unix/lib/postfix_info.rb +30 -0
- data/remote_unix/lib/requires.rb +25 -0
- data/remote_unix/lib/scp.rb +22 -0
- data/remote_unix/lib/ssh.rb +46 -0
- data/test/test_qa_robusta.rb +8 -0
- metadata +219 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
base = File.expand_path(File.dirname(__FILE__))
|
|
2
|
+
require "#{base}/../common/lib/gem_helpers"
|
|
3
|
+
GemHelpers.update_gem_path "#{base}/../common/gems/installed"
|
|
4
|
+
require 'platform_helpers'
|
|
5
|
+
require 'getoptions'
|
|
6
|
+
require 'hpricot'
|
|
7
|
+
require "#{base}/lib/doc"
|
|
8
|
+
|
|
9
|
+
def usage(msg=nil)
|
|
10
|
+
usage = <<-EOF
|
|
11
|
+
Usage: test_runner.rb --site=<site_name>
|
|
12
|
+
--file_name=<ruby test case file>
|
|
13
|
+
--execute_methods=all | list,of,methods,to,execute
|
|
14
|
+
--browser=<ie|firefox>
|
|
15
|
+
--environment=<name such as production|test|dev>
|
|
16
|
+
--format=junit --> this is an optional and used for CI systems
|
|
17
|
+
|
|
18
|
+
where --site_name base directory name to a site defined under qa_observer/sites
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
EOF
|
|
22
|
+
puts usage
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
opt = GetOptions.new(%w(help site=s file_name=s execute_methods=s browser:s environment=s format:s proxy:s))
|
|
26
|
+
|
|
27
|
+
supported_browsers = ['ie', 'firefox', 'chrome']
|
|
28
|
+
|
|
29
|
+
unless opt.site && opt.execute_methods && opt.file_name &&
|
|
30
|
+
opt.environment
|
|
31
|
+
if opt.browser
|
|
32
|
+
supported_browsers.include?(opt.browser)
|
|
33
|
+
raise ArgumentError, usage
|
|
34
|
+
end
|
|
35
|
+
raise ArgumentError, usage
|
|
36
|
+
else
|
|
37
|
+
|
|
38
|
+
if opt.proxy
|
|
39
|
+
tmp_split = opt.proxy.split(':')
|
|
40
|
+
if tmp_split.length != 2
|
|
41
|
+
raise ArgumentError, '--proxy option requires format host:port'
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
PROXY = { :enabled => true,
|
|
45
|
+
:host => tmp_split[0],
|
|
46
|
+
:port => tmp_split[1] }
|
|
47
|
+
else
|
|
48
|
+
PROXY = { :enabled => false,
|
|
49
|
+
:host => nil,
|
|
50
|
+
:port => nil }
|
|
51
|
+
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
base = File.expand_path(File.dirname(__FILE__))
|
|
55
|
+
|
|
56
|
+
$qa_observer_client = base
|
|
57
|
+
$run_on_browser = opt.browser
|
|
58
|
+
$environment = opt.environment.to_sym
|
|
59
|
+
$standalone = false
|
|
60
|
+
TEST_CASE_DIR = "#{base}/sites/#{opt.site}/test_cases"
|
|
61
|
+
|
|
62
|
+
if opt.file_name
|
|
63
|
+
file = "#{TEST_CASE_DIR}/#{opt.file_name}"
|
|
64
|
+
raise ArgumentError, "Could not fine file: #{file} unless" unless File.exists?(file)
|
|
65
|
+
else
|
|
66
|
+
puts "FIXME: need to impl"
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
content = File.readlines(file).to_s
|
|
71
|
+
|
|
72
|
+
method_names = TCDoc.method_names_from_file(content)
|
|
73
|
+
|
|
74
|
+
if opt.execute_methods == 'all'
|
|
75
|
+
$job = {:methods => method_names}
|
|
76
|
+
else
|
|
77
|
+
$job = {:methods => opt.execute_methods.split(',')}
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
if opt.format == 'junit'
|
|
81
|
+
$junit_format = true
|
|
82
|
+
|
|
83
|
+
reqs = <<-EOF
|
|
84
|
+
puts "Calling modified code"
|
|
85
|
+
puts "$qa_observer_client set from test_runner: \#{$qa_observer_client}"
|
|
86
|
+
base = File.expand_path(File.dirname(__FILE__))
|
|
87
|
+
|
|
88
|
+
$qa_observer_client = '#{base}'
|
|
89
|
+
$junit_format = true
|
|
90
|
+
$run_on_browser = '#{opt.browser}'
|
|
91
|
+
$environment = :#{opt.environment.to_sym}
|
|
92
|
+
$standalone = false
|
|
93
|
+
TEST_CASE_DIR = '#{base}/sites/#{opt.site}/test_cases'
|
|
94
|
+
PROXY = #{PROXY.inspect}
|
|
95
|
+
|
|
96
|
+
EOF
|
|
97
|
+
|
|
98
|
+
content = File.read(file)
|
|
99
|
+
|
|
100
|
+
# lets add reqs after base in orig_content
|
|
101
|
+
content.gsub!("base = File.expand_path(File.dirname(__FILE__))", reqs)
|
|
102
|
+
|
|
103
|
+
tmp_file = "#{file}_#{Time.now.tv_sec}"
|
|
104
|
+
|
|
105
|
+
fd = File.open(tmp_file, 'w+')
|
|
106
|
+
fd.puts content.to_s
|
|
107
|
+
fd.close
|
|
108
|
+
results=`ruby #{tmp_file}`
|
|
109
|
+
|
|
110
|
+
FileUtils.rm_f tmp_file
|
|
111
|
+
|
|
112
|
+
else
|
|
113
|
+
load file
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
if $junit_format
|
|
117
|
+
|
|
118
|
+
FileUtils.mkdir 'junit_results' unless File.directory?('junit_results')
|
|
119
|
+
|
|
120
|
+
junit_xml = results.to_s.scan(/<JUNIT>(.*)<\/JUNIT>/m)
|
|
121
|
+
|
|
122
|
+
fd = File.open("junit_results/#{$current_test_class}_#{$current_test_method}_#{Time.to_md5}.xml", 'w+')
|
|
123
|
+
fd.puts junit_xml
|
|
124
|
+
fd.close
|
|
125
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
module RemoteUnix
|
|
2
|
+
# outputer to parse output from echoed commands piped into script/console
|
|
3
|
+
class RailsConsoleOutput
|
|
4
|
+
attr_reader :unparsed
|
|
5
|
+
def initialize(out)
|
|
6
|
+
@unparsed = out
|
|
7
|
+
end
|
|
8
|
+
# given a generic output item from script/console such as:
|
|
9
|
+
# some prior items
|
|
10
|
+
# => [id1, id2, id3]
|
|
11
|
+
# transform the string to array
|
|
12
|
+
|
|
13
|
+
# when we have STDOUT comming back from ssh session in format
|
|
14
|
+
# [1,2,3] translate the string to a ruby Array obj
|
|
15
|
+
def to_a
|
|
16
|
+
unless @unparsed.grep(/.*\[.*\]/).nitems > 0
|
|
17
|
+
raise ArgumentError, "Tried to convert output to_a when not in correct format"
|
|
18
|
+
end
|
|
19
|
+
@unparsed.to_s.split(/\n/).to_s.split('=>').last.gsub(/[\[\]" ]/, '').split('>>').first.split(',')
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def format
|
|
23
|
+
out = @unparsed.to_s.split(/\n/).to_s.split('=>').last.gsub(/[\[\] "]/, '').split('>>')
|
|
24
|
+
|
|
25
|
+
unless out.nitems > 0
|
|
26
|
+
return nil
|
|
27
|
+
end
|
|
28
|
+
# if we get here we found a result to return
|
|
29
|
+
out.first
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
class GenericShellOutput
|
|
34
|
+
# return an array for the output executed excluding any other
|
|
35
|
+
# control information, such as command executed or shell prompt
|
|
36
|
+
def self.to_lines(out, command_executed)
|
|
37
|
+
lines = out.first[command_executed.length..out.first.length].split(/\n/)
|
|
38
|
+
|
|
39
|
+
# empty array elem from stripping out command executed, deleting
|
|
40
|
+
lines.delete_at(0)
|
|
41
|
+
|
|
42
|
+
# last item will be shell prompt, delete
|
|
43
|
+
lines.delete_at(lines.length-1)
|
|
44
|
+
lines
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
module RemoteUnix
|
|
2
|
+
module Common
|
|
3
|
+
def set_platform
|
|
4
|
+
@platform = {}
|
|
5
|
+
nav_path = [
|
|
6
|
+
{:execute => "uname -a",
|
|
7
|
+
:expected_output => /linux/i, :timeout => 1}
|
|
8
|
+
]
|
|
9
|
+
|
|
10
|
+
uname = @ssh.navigate(nav_path).last.grep(/linux/i).first
|
|
11
|
+
uname_split = uname.split(' ')[2].split(".").last
|
|
12
|
+
|
|
13
|
+
# RHEL/CentOS
|
|
14
|
+
if uname_split =~ /el[0-5]/
|
|
15
|
+
@platform[:distro] = 'RH'
|
|
16
|
+
@platform[:prompt] = "]#"
|
|
17
|
+
@platform[:iscsi_packages] = ['iscsi-initiator-utils', 'sg3_utils.i386']
|
|
18
|
+
@platform[:install_iscsi_cmd] = "yum install -y"
|
|
19
|
+
# debian based
|
|
20
|
+
elsif uname =~ /ubuntu/i
|
|
21
|
+
@platform[:distro] = 'DEB'
|
|
22
|
+
@platform[:prompt] = "$"
|
|
23
|
+
@platform[:iscsi_packages] = ['open-iscsi', 'iscsitarget']
|
|
24
|
+
@platform[:install_iscsi_cmd] = "sudo apt-get install -y"
|
|
25
|
+
|
|
26
|
+
# TODO: check for /etc/redhat-release
|
|
27
|
+
# can't detec for SL as custom kernel without RH in uname -a
|
|
28
|
+
else
|
|
29
|
+
@platform[:distro] = 'DEB'
|
|
30
|
+
@platform[:prompt] = "#"
|
|
31
|
+
@platform[:iscsi_packages] = ['open-iscsi', 'iscsitarget']
|
|
32
|
+
@platform[:install_iscsi_cmd] = "apt-get install -y"
|
|
33
|
+
|
|
34
|
+
nav_path = [
|
|
35
|
+
{:execute => "if [ -f /etc/redhat-release ] ; then echo \"RH\"; else echo \"DEB\"; fi",
|
|
36
|
+
:timeout => 2}
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
version = @ssh.navigate(nav_path).last.grep(/linux/i).first
|
|
40
|
+
|
|
41
|
+
if version =~ /RH/
|
|
42
|
+
@platform[:distro] = 'RH'
|
|
43
|
+
elsif version =~ /DEB/
|
|
44
|
+
@platform[:distro] = 'DEB'
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
@expected_prompt = Regexp.escape(@platform[:prompt].to_s)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
end
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
module RemoteUnix
|
|
2
|
+
# commands which return information such as initiator name
|
|
3
|
+
class GeneralUnix
|
|
4
|
+
include Common
|
|
5
|
+
def initialize(params={})
|
|
6
|
+
@host = params[:host]
|
|
7
|
+
@user = params[:user]
|
|
8
|
+
@password = params[:password]
|
|
9
|
+
@ssh = SSH.new(@host, @user, @password)
|
|
10
|
+
set_platform
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def is_alive?(host)
|
|
14
|
+
ping_out = `ping -c 5 #{host}`
|
|
15
|
+
if ping_out =~ /100% packet loss/
|
|
16
|
+
return false
|
|
17
|
+
else
|
|
18
|
+
return true
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def wait_till_alive(host, to=15)
|
|
23
|
+
timeout(to) {
|
|
24
|
+
while !is_alive?(host)
|
|
25
|
+
sleep 0.3
|
|
26
|
+
end
|
|
27
|
+
}
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def wait_till_dead(host, to=15)
|
|
31
|
+
timeout(to) {
|
|
32
|
+
while is_alive?(host)
|
|
33
|
+
sleep 0.3
|
|
34
|
+
end
|
|
35
|
+
}
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# if we don't care about results and just want to exex a remote command
|
|
39
|
+
def exec(cmd)
|
|
40
|
+
nav_path = [{:execute => cmd, :timeout => 1}]
|
|
41
|
+
|
|
42
|
+
begin
|
|
43
|
+
@ssh.navigate(nav_path)
|
|
44
|
+
rescue => e
|
|
45
|
+
puts "IGNORE: #{e}"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def get_num_lines_in_file(file)
|
|
51
|
+
nav_path = [{:execute => "wc -l #{file}", :timeout => 1}]
|
|
52
|
+
|
|
53
|
+
begin
|
|
54
|
+
return GenericShellOutput.to_lines(@ssh.navigate(nav_path),
|
|
55
|
+
nav_path.first[:execute]).pp.split(' ').first.to_i
|
|
56
|
+
rescue => e
|
|
57
|
+
puts "IGNORE: #{e}"
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def ls(item)
|
|
63
|
+
nav_path = [{:execute => "ls #{item}", :timeout => 1}]
|
|
64
|
+
begin
|
|
65
|
+
content = RemoteUnix::GenericShellOutput.to_lines(@ssh.navigate(nav_path), nav_path.first[:execute])
|
|
66
|
+
rescue => e
|
|
67
|
+
puts "IGNORE: #{e}"
|
|
68
|
+
end
|
|
69
|
+
content
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# assumes standard /etc/init.d/* start|stop|restart
|
|
73
|
+
def service(params={})
|
|
74
|
+
valid_commands = ['start', 'stop', 'restart']
|
|
75
|
+
|
|
76
|
+
unless params.has_key?(:name) && params.has_key?(:command)
|
|
77
|
+
raise ArgumentError
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
raise ArgumentError unless valid_commands.include?(params[:command])
|
|
81
|
+
|
|
82
|
+
nav_path = [{:execute => "/etc/init.d/#{params[:name]} #{params[:command]}", :timeout => 2}]
|
|
83
|
+
|
|
84
|
+
begin
|
|
85
|
+
@ssh.navigate(nav_path)
|
|
86
|
+
rescue => e
|
|
87
|
+
puts "IGNORE: #{e}"
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# :ip --> host where the NFS export resides
|
|
93
|
+
# :share
|
|
94
|
+
# :mount_point --> local mount point
|
|
95
|
+
def mount_nfs(params={})
|
|
96
|
+
|
|
97
|
+
unless params.has_key?(:ip) && params.has_key?(:mount_point)
|
|
98
|
+
raise ArgumentError
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
nav_path = [{:execute => "mount #{params[:ip]}:#{params[:share]} #{params[:mount_point]}", :timeout => 1}]
|
|
102
|
+
|
|
103
|
+
begin
|
|
104
|
+
@ssh.navigate(nav_path)
|
|
105
|
+
rescue => e
|
|
106
|
+
puts "IGNORE: #{e}"
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# return an array of content from remote file
|
|
112
|
+
def get_file_content(file)
|
|
113
|
+
unless file_exists?(file)
|
|
114
|
+
raise FileNotFoundError, "Could not find file #{file}"
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
nav_path = [{:execute => "cat #{file}", :timeout => 1}]
|
|
118
|
+
begin
|
|
119
|
+
content = RemoteUnix::GenericShellOutput.to_lines(@ssh.navigate(nav_path), nav_path.first[:execute])
|
|
120
|
+
rescue => e
|
|
121
|
+
puts "IGNORE: #{e}"
|
|
122
|
+
end
|
|
123
|
+
content
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def put_file_content(file, content)
|
|
127
|
+
tmp=''
|
|
128
|
+
|
|
129
|
+
# if content passed in by array, assumes each array elem is a line in a file
|
|
130
|
+
# and add \n
|
|
131
|
+
if content.kind_of?(Array)
|
|
132
|
+
content.each { |i| tmp += "#{i}\n" }
|
|
133
|
+
end
|
|
134
|
+
content = tmp
|
|
135
|
+
|
|
136
|
+
tmp_file = "#{Time.now}"
|
|
137
|
+
fd = File.open(tmp_file, 'w+')
|
|
138
|
+
|
|
139
|
+
fd.puts content
|
|
140
|
+
fd.close
|
|
141
|
+
|
|
142
|
+
SCP::Upload.new(@host, @user, @password, tmp_file, file )
|
|
143
|
+
FileUtils.rm_f tmp_file
|
|
144
|
+
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def flush_iptables
|
|
148
|
+
nav_path = [{:execute => "iptables -X", :timeout => 1},
|
|
149
|
+
{:execute => "iptables -F", :timeout => 1}]
|
|
150
|
+
begin
|
|
151
|
+
@ssh.navigate(nav_path)
|
|
152
|
+
rescue => e
|
|
153
|
+
puts "IGNORE: #{e}"
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
# params[:path] --> path to add to /etc/exports
|
|
159
|
+
# params[:allowed_host] --> string of host to allow access to the share (optional)
|
|
160
|
+
# not impl yet but will be added in future version as well
|
|
161
|
+
# as an additional param for options
|
|
162
|
+
def add_nfs_export(params={})
|
|
163
|
+
raise ArgumentError unless params.has_key?(:path)
|
|
164
|
+
|
|
165
|
+
begin
|
|
166
|
+
content = get_file_content(Constants::NFS::EXPORT_FILE)
|
|
167
|
+
rescue FileNotFoundError => e
|
|
168
|
+
content = []
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
updated_content = []
|
|
172
|
+
ops = '*(rw,sync)'
|
|
173
|
+
|
|
174
|
+
# if content already contains a share path lets delete old and add new
|
|
175
|
+
updated_content = delete_nfs_export(params[:path], content)
|
|
176
|
+
|
|
177
|
+
# append out path to the updated content
|
|
178
|
+
updated_content << "#{params[:path]} #{ops}"
|
|
179
|
+
|
|
180
|
+
# write content to exprts
|
|
181
|
+
put_file_content(Constants::NFS::EXPORT_FILE, updated_content)
|
|
182
|
+
|
|
183
|
+
service(:name => 'nfs', :command => 'restart')
|
|
184
|
+
sleep 0.75
|
|
185
|
+
|
|
186
|
+
# reread exports so it's active
|
|
187
|
+
nav_path = [{:execute => "/usr/sbin/exportfs -ra", :timeout => 1}]
|
|
188
|
+
|
|
189
|
+
begin
|
|
190
|
+
@ssh.navigate(nav_path)
|
|
191
|
+
rescue => e
|
|
192
|
+
puts "IGNORE: #{e}"
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
def delete_nfs_export(path, content=nil)
|
|
198
|
+
content = get_file_content(Constants::NFS::EXPORT_FILE) unless content
|
|
199
|
+
|
|
200
|
+
# if the path exists delete, else no need to perform additional cycles
|
|
201
|
+
if content.pp =~ /#{path}/
|
|
202
|
+
updated_content = []
|
|
203
|
+
ops = '*(rw,sync)'
|
|
204
|
+
|
|
205
|
+
# if content already contains a share path lets delete old and add new
|
|
206
|
+
content.each { |line|
|
|
207
|
+
updated_content << line unless line =~ /#{path}/
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
put_file_content(Constants::NFS::EXPORT_FILE, updated_content)
|
|
211
|
+
|
|
212
|
+
return updated_content
|
|
213
|
+
else
|
|
214
|
+
return content
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def md5sum(file)
|
|
220
|
+
nav_path = [{:execute => "md5sum #{file}", :timeout => 1}]
|
|
221
|
+
begin
|
|
222
|
+
sum = RemoteUnix::GenericShellOutput.to_lines(@ssh.navigate(nav_path), nav_path.first[:execute]).first.split(' ').first
|
|
223
|
+
rescue => e
|
|
224
|
+
puts "IGNORE: #{e}"
|
|
225
|
+
end
|
|
226
|
+
sum
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
def rm_rf(loc)
|
|
230
|
+
nav_path = [{:execute => "rm -rf #{loc}", :timeout => 1}]
|
|
231
|
+
begin
|
|
232
|
+
out = RemoteUnix::GenericShellOutput.to_lines(@ssh.navigate(nav_path), nav_path.first[:execute])
|
|
233
|
+
rescue => e
|
|
234
|
+
puts "IGNORE: #{e}"
|
|
235
|
+
end
|
|
236
|
+
out
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
def reboot
|
|
240
|
+
nav_path = [{:execute => "shutdown -r now", :timeout => 1}]
|
|
241
|
+
begin
|
|
242
|
+
puts RemoteUnix::GenericShellOutput.to_lines(@ssh.navigate(nav_path), nav_path.first[:execute]).pp
|
|
243
|
+
rescue => e
|
|
244
|
+
puts "IGNORE: #{e}"
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
def date
|
|
249
|
+
date = {}
|
|
250
|
+
nav_path = [{:execute => "date", :timeout => 1}]
|
|
251
|
+
begin
|
|
252
|
+
tmp = RemoteUnix::GenericShellOutput.to_lines(@ssh.navigate(nav_path), nav_path.first[:execute]).pp
|
|
253
|
+
|
|
254
|
+
rescue => e
|
|
255
|
+
puts "IGNORE: #{e}"
|
|
256
|
+
end
|
|
257
|
+
Time.parse(tmp)
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
def hostname
|
|
261
|
+
nav_path = [{:execute => "hostname", :timeout => 1}]
|
|
262
|
+
begin
|
|
263
|
+
hostname = RemoteUnix::GenericShellOutput.to_lines(@ssh.navigate(nav_path), nav_path.first[:execute]).pp
|
|
264
|
+
rescue => e
|
|
265
|
+
puts "IGNORE: #{e}"
|
|
266
|
+
end
|
|
267
|
+
hostname
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
def file_exists?(file)
|
|
271
|
+
nav_path = [{:execute => "if [ -f #{file} ] ; then echo 'FOUND'; else echo 'NOT_FOUND'; fi", :timeout => 1}]
|
|
272
|
+
begin
|
|
273
|
+
out = RemoteUnix::GenericShellOutput.to_lines(@ssh.navigate(nav_path), nav_path.first[:execute]).pp
|
|
274
|
+
rescue => e
|
|
275
|
+
puts "IGNORE: #{e}"
|
|
276
|
+
end
|
|
277
|
+
if out == "FOUND"
|
|
278
|
+
return true
|
|
279
|
+
elsif out == "NOT_FOUND"
|
|
280
|
+
return false
|
|
281
|
+
else
|
|
282
|
+
raise ArgumentError, "Couldn't find file #{file}"
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
def redhat_release
|
|
288
|
+
nav_path = [{:execute => "cat /etc/redhat-release", :timeout => 1}]
|
|
289
|
+
begin
|
|
290
|
+
out = RemoteUnix::GenericShellOutput.to_lines(@ssh.navigate(nav_path), nav_path.first[:execute]).pp
|
|
291
|
+
rescue => e
|
|
292
|
+
puts "IGNORE: #{e}"
|
|
293
|
+
end
|
|
294
|
+
out
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
def kernel_version
|
|
298
|
+
nav_path = [{:execute => "uname -a", :timeout => 1}]
|
|
299
|
+
begin
|
|
300
|
+
out = RemoteUnix::GenericShellOutput.to_lines(@ssh.navigate(nav_path), nav_path.first[:execute]).pp
|
|
301
|
+
rescue => e
|
|
302
|
+
puts "IGNORE: #{e}"
|
|
303
|
+
end
|
|
304
|
+
out.split(' ')[2]
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
end
|
|
308
|
+
end
|