yggdrasil 0.0.7 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +45 -8
- data/Rakefile +2 -2
- data/bin/ygg +5 -0
- data/bin/yggserve +5 -0
- data/lib/yggdrasil/check.rb +11 -7
- data/lib/yggdrasil/commit.rb +3 -3
- data/lib/yggdrasil/help.rb +7 -33
- data/lib/yggdrasil/init.rb +11 -9
- data/lib/yggdrasil/list.rb +1 -1
- data/lib/yggdrasil/log.rb +2 -2
- data/lib/yggdrasil/update.rb +2 -2
- data/lib/yggdrasil/version.rb +1 -1
- data/lib/yggdrasil.rb +27 -34
- data/lib/yggdrasil_common.rb +13 -8
- data/lib/yggdrasil_server/help.rb +85 -0
- data/lib/yggdrasil_server/{init_server.rb → init.rb} +10 -10
- data/lib/yggdrasil_server/put_result.rb +2 -2
- data/lib/yggdrasil_server/results.rb +3 -3
- data/lib/yggdrasil_server/version.rb +14 -0
- data/lib/yggdrasil_server.rb +43 -10
- data/spec/add_spec.rb +1 -1
- data/spec/check_spec.rb +13 -12
- data/spec/cleanup_spec.rb +6 -6
- data/spec/commit_spec.rb +14 -14
- data/spec/diff_spec.rb +12 -12
- data/spec/help_spec.rb +6 -39
- data/spec/init_spec.rb +14 -14
- data/spec/list_spec.rb +3 -3
- data/spec/log_spec.rb +3 -3
- data/spec/revert_spec.rb +15 -15
- data/spec/server_help_spec.rb +142 -0
- data/spec/{init_server_spec.rb → server_init_spec.rb} +13 -12
- data/spec/{results_spec.rb → server_results_spec.rb} +15 -14
- data/spec/server_spec.rb +42 -41
- data/spec/server_version_spec.rb +25 -0
- data/spec/spec_helper.rb +3 -3
- data/spec/status_spec.rb +7 -7
- data/spec/update_spec.rb +1 -1
- data/spec/version_spec.rb +1 -1
- data/yggdrasil.gemspec +6 -6
- metadata +20 -10
data/README.md
CHANGED
@@ -6,32 +6,69 @@ Yggdrasil is a subversion wrapper to manage server configurations and conditions
|
|
6
6
|
|
7
7
|
$ gem install yggdrasil
|
8
8
|
|
9
|
-
|
9
|
+
subversion needs to be installed:
|
10
10
|
|
11
11
|
(e.g.)$ sudo yum install subversion
|
12
12
|
|
13
|
-
## Usage
|
13
|
+
## Usage: private use(stand alone)
|
14
14
|
|
15
15
|
Prepare subversion repository and initialize Yggdrasil:
|
16
16
|
|
17
|
-
|
18
|
-
$ yggdrasil init --repo file://$HOME/svn-repo
|
17
|
+
$ ygg init --repo private
|
19
18
|
|
20
19
|
You should use svn-server if you have.
|
21
20
|
In that case, the configuration files of
|
22
21
|
all the servers can be managed on the unification.
|
23
22
|
|
24
|
-
Add configuration files:
|
23
|
+
Add configuration files to manage:
|
25
24
|
|
26
|
-
$
|
25
|
+
$ ygg add /etc/hosts /etc/fstab ..etc
|
26
|
+
$ ygg check
|
27
|
+
$ ygg commit /
|
27
28
|
|
28
29
|
Check modify and/or delete:
|
29
30
|
|
30
|
-
$
|
31
|
+
$ vi /etc/hosts ..etc
|
32
|
+
$ ygg check
|
33
|
+
$ ygg commit /etc/hosts ..etc
|
31
34
|
|
32
35
|
Refer Help:
|
33
36
|
|
34
|
-
$
|
37
|
+
$ ygg help
|
38
|
+
|
39
|
+
## Usage: data center management (example)
|
40
|
+
|
41
|
+
Prepare subversion repository and launch server on host:$YGG_SERVER:
|
42
|
+
|
43
|
+
(e.g. $YGG_REPO is anywhere you want)
|
44
|
+
$ svnadmin create $YGG_REPO
|
45
|
+
$ vi $YGG_REPO/conf/svnserve.conf
|
46
|
+
$ svnserve -d
|
47
|
+
|
48
|
+
Prepare yggdrasil server on host:$YGG_SERVER:
|
49
|
+
|
50
|
+
$ yggserve init --repo svn://$YGG_SERVER/$YGG_REPO/{host} --port 4000
|
51
|
+
$ yggserve daemon
|
52
|
+
|
53
|
+
Prepare yggdrasil client to manage config files:
|
54
|
+
|
55
|
+
$ ygg init --server $YGG_SERVER:4000
|
56
|
+
$ ls -al ~/.yggdrasil/checker
|
57
|
+
and add/modify executable script in "checker"
|
58
|
+
$ ygg add /etc/hosts /etc/fstab ..etc
|
59
|
+
$ ygg check
|
60
|
+
$ ygg commit /
|
61
|
+
|
62
|
+
Prepare yggdrasil client to report check results to yggdrasil server, every day:
|
63
|
+
|
64
|
+
$ crontab -e
|
65
|
+
add following line(you should check path by 'which ygg')
|
66
|
+
17 5 * * * $GEMPATH/ygg check
|
67
|
+
|
68
|
+
Check updates of configurations/conditions on host:$YGG_SERVER:
|
69
|
+
|
70
|
+
$ yggserve results --expire 1440
|
71
|
+
CI tool(e.g.Jenkins) may execute this command automatically to daily report/record.
|
35
72
|
|
36
73
|
## Environment
|
37
74
|
|
data/Rakefile
CHANGED
data/bin/ygg
ADDED
data/bin/yggserve
ADDED
data/lib/yggdrasil/check.rb
CHANGED
@@ -13,11 +13,13 @@ class Yggdrasil
|
|
13
13
|
# execute checker
|
14
14
|
`rm -rf #@checker_result_dir`
|
15
15
|
Dir.mkdir @checker_result_dir, 0755
|
16
|
-
|
17
|
-
|
18
|
-
if file
|
19
|
-
|
20
|
-
|
16
|
+
if File.exist?(@checker_dir)
|
17
|
+
Find.find(@checker_dir).each do |file|
|
18
|
+
if File.file?(file) && File.executable?(file)
|
19
|
+
if file =~ %r{^#@checker_dir(.*)$}
|
20
|
+
file_body = $1
|
21
|
+
system3("#{file} > #@checker_result_dir#{file_body}")
|
22
|
+
end
|
21
23
|
end
|
22
24
|
end
|
23
25
|
end
|
@@ -41,15 +43,17 @@ class Yggdrasil
|
|
41
43
|
end
|
42
44
|
check_result.gsub!(/^Status against revision:.*\n/, '')
|
43
45
|
check_result.chomp!
|
44
|
-
if check_result
|
46
|
+
if check_result == ''
|
47
|
+
puts 'yggdrasil check: OK!'
|
48
|
+
else
|
45
49
|
check_result << "\n\n"
|
46
50
|
cmd_arg = "#@svn diff --no-auth-cache --non-interactive -r HEAD"
|
47
51
|
cmd_arg += username_password_options_to_read_repo
|
48
52
|
FileUtils.cd @mirror_dir do
|
49
53
|
check_result << system3(cmd_arg)
|
50
54
|
end
|
55
|
+
puts check_result
|
51
56
|
end
|
52
|
-
puts check_result
|
53
57
|
|
54
58
|
if /^(.+):(\d+)$/ =~ @options[:server]
|
55
59
|
host = $1
|
data/lib/yggdrasil/commit.rb
CHANGED
@@ -26,10 +26,10 @@ class Yggdrasil
|
|
26
26
|
|
27
27
|
message = ''
|
28
28
|
unless @options.has_key?(:message)
|
29
|
-
print
|
29
|
+
print 'Input log message: '
|
30
30
|
loop do
|
31
31
|
input = $stdin.gets
|
32
|
-
error
|
32
|
+
error 'can not input log message' unless input
|
33
33
|
input.chomp!
|
34
34
|
if input =~ /^(.*)\\$/
|
35
35
|
message += $1+"\n"
|
@@ -44,7 +44,7 @@ class Yggdrasil
|
|
44
44
|
input_user_pass
|
45
45
|
FileUtils.cd @mirror_dir do
|
46
46
|
puts system3 "#@svn commit -m '#{@options[:message]}'"\
|
47
|
-
|
47
|
+
' --no-auth-cache --non-interactive'\
|
48
48
|
" --username '#{@options[:username]}' --password '#{@options[:password]}'"\
|
49
49
|
" #{confirmed_updates.join(' ')}"
|
50
50
|
end
|
data/lib/yggdrasil/help.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
class Yggdrasil
|
2
2
|
|
3
|
-
|
4
3
|
# @param [Array] args
|
5
4
|
def help(args)
|
6
5
|
if args.size == 0
|
@@ -17,22 +16,19 @@ Available subcommands:
|
|
17
16
|
diff (di)
|
18
17
|
help (?, h)
|
19
18
|
init
|
20
|
-
init-server
|
21
19
|
list (ls)
|
22
20
|
log
|
23
|
-
results
|
24
21
|
revert
|
25
|
-
server
|
26
22
|
status (stat, st)
|
27
23
|
update
|
28
24
|
version
|
29
25
|
|
30
26
|
Yggdrasil is a subversion wrapper to manage server configurations and conditions.
|
31
|
-
|
27
|
+
At first, you should type '#@base_cmd init' to create config file.
|
32
28
|
|
33
29
|
EOS
|
34
30
|
elsif args.size != 1 then
|
35
|
-
error
|
31
|
+
error 'too many arguments.'
|
36
32
|
else
|
37
33
|
case args[0]
|
38
34
|
when 'add'
|
@@ -51,7 +47,10 @@ usage: #@base_cmd check [OPTIONS...]
|
|
51
47
|
For example, mount status, number of specific process and etc. can be checked
|
52
48
|
by setting up executable files in ~/.yggdrasil/checker/
|
53
49
|
|
54
|
-
|
50
|
+
If the yggdrasil server is registered,
|
51
|
+
this subcommand send the result to yggdrasil server
|
52
|
+
and yggdrasil server record the results for all managed servers.
|
53
|
+
Type 'yggserve help', if you need to know about yggdrasil server.
|
55
54
|
|
56
55
|
Valid options:
|
57
56
|
--username ARG : specify a username ARG
|
@@ -122,22 +121,6 @@ Valid options:
|
|
122
121
|
--server ARG : specify a server address and port
|
123
122
|
e.g. 192.168.1.35:4000
|
124
123
|
|
125
|
-
EOS
|
126
|
-
when 'init-server'
|
127
|
-
puts <<"EOS"
|
128
|
-
init-server: setup server configuration.
|
129
|
-
usage: #@base_cmd init-server [OPTIONS...]
|
130
|
-
|
131
|
-
Valid options:
|
132
|
-
--port ARG : specify a TCP port number ARG
|
133
|
-
--repo ARG : URL of subversion repository
|
134
|
-
ARG can contain {HOST} or a {host}
|
135
|
-
{HOST} is replaced by client hostname with domain
|
136
|
-
{host} is replaced by client hostname without domain
|
137
|
-
e.g. svn://192.168.3.5/servers/{host}/ygg
|
138
|
-
--ro-username ARG : specify a username ARG for read only
|
139
|
-
--ro-password ARG : specify a password ARG for read only
|
140
|
-
|
141
124
|
EOS
|
142
125
|
when 'list', 'ls'
|
143
126
|
puts <<"EOS"
|
@@ -175,15 +158,6 @@ Valid options:
|
|
175
158
|
'COMMITTED' last commit at or before BASE
|
176
159
|
'PREV' revision just before COMMITTED
|
177
160
|
|
178
|
-
EOS
|
179
|
-
when 'results'
|
180
|
-
puts <<"EOS"
|
181
|
-
results: display the result of yggdrasil check command.
|
182
|
-
usage: #@base_cmd results [OPTIONS...]
|
183
|
-
|
184
|
-
Valid options:
|
185
|
-
--limit ARG : minutes from the final report, to judge the host not be alive
|
186
|
-
|
187
161
|
EOS
|
188
162
|
when 'revert'
|
189
163
|
puts <<"EOS"
|
@@ -241,7 +215,7 @@ usage: #@base_cmd version
|
|
241
215
|
|
242
216
|
EOS
|
243
217
|
else
|
244
|
-
error "Unknown subcommand: '#{
|
218
|
+
error "Unknown subcommand: '#{args[0]}'"
|
245
219
|
end
|
246
220
|
end
|
247
221
|
end
|
data/lib/yggdrasil/init.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'socket'
|
2
|
+
|
1
3
|
class Yggdrasil
|
2
4
|
|
3
5
|
# @param [Array] args
|
@@ -19,7 +21,7 @@ class Yggdrasil
|
|
19
21
|
svn = out.chomp
|
20
22
|
|
21
23
|
out = system3 'svn --version'
|
22
|
-
error
|
24
|
+
error 'can not find version string: svn --version' unless /version (\d+\.\d+\.\d+) / =~ out
|
23
25
|
svn_version=$1
|
24
26
|
|
25
27
|
error "already exist config file: #@config_file" if File.exist?(@config_file)
|
@@ -32,14 +34,14 @@ class Yggdrasil
|
|
32
34
|
@options[:repo].chomp!('/')
|
33
35
|
@options[:repo].gsub!(/\{HOST\}/, Socket.gethostname)
|
34
36
|
@options[:repo].gsub!(/\{host\}/, Socket.gethostname.split('.')[0])
|
35
|
-
if @options[:repo] ==
|
37
|
+
if @options[:repo] == 'private'
|
36
38
|
Dir.mkdir @config_dir, 0755 unless File.exist?(@config_dir)
|
37
39
|
repo_dir = "#@config_dir/private_repo"
|
38
40
|
system3 "svnadmin create #{repo_dir}"
|
39
41
|
@options[:repo] = "file://#{repo_dir}"
|
40
42
|
end
|
41
43
|
|
42
|
-
puts
|
44
|
+
puts 'check SVN access...'
|
43
45
|
if @options.has_key?(:ro_username)
|
44
46
|
anon_access = false
|
45
47
|
else
|
@@ -79,9 +81,9 @@ class Yggdrasil
|
|
79
81
|
msg = "not exist directory(s): #{url_parts[url_parts_num...url_parts.size].join('/')}"
|
80
82
|
error msg if @options[:non_interactive?]
|
81
83
|
puts msg
|
82
|
-
print
|
84
|
+
print 'make directory(s)? [Yn]: '
|
83
85
|
input = $stdin.gets
|
84
|
-
error
|
86
|
+
error 'can not gets $stdin' if input.nil?
|
85
87
|
input.chomp!
|
86
88
|
return if input == 'n'
|
87
89
|
break if input == 'Y'
|
@@ -107,7 +109,7 @@ class Yggdrasil
|
|
107
109
|
end
|
108
110
|
|
109
111
|
# make config file
|
110
|
-
File.open(@config_file,
|
112
|
+
File.open(@config_file, 'w') do |f|
|
111
113
|
f.puts "path=#{ENV['PATH']}\n"\
|
112
114
|
"svn=#{svn}\n"\
|
113
115
|
"svn_version=#{svn_version}\n"\
|
@@ -133,16 +135,16 @@ class Yggdrasil
|
|
133
135
|
|
134
136
|
def init_get_repo_interactive
|
135
137
|
loop do
|
136
|
-
print
|
138
|
+
print 'Input svn repo URL: '
|
137
139
|
input = $stdin.gets
|
138
|
-
error
|
140
|
+
error 'can not input svn repo URL' unless input
|
139
141
|
|
140
142
|
if %r{^(http://|https://|file://|svn://|private)} =~ input
|
141
143
|
@options[:repo] = input
|
142
144
|
break
|
143
145
|
end
|
144
146
|
|
145
|
-
puts
|
147
|
+
puts 'ERROR: Invalid URL.'
|
146
148
|
end
|
147
149
|
end
|
148
150
|
end
|
data/lib/yggdrasil/list.rb
CHANGED
@@ -23,7 +23,7 @@ class Yggdrasil
|
|
23
23
|
cmd_arg = "#@svn list --no-auth-cache --non-interactive"
|
24
24
|
cmd_arg += username_password_options_to_read_repo
|
25
25
|
cmd_arg += " -r #{@options[:revision]}" if @options.has_key?(:revision)
|
26
|
-
cmd_arg +=
|
26
|
+
cmd_arg += ' -R' if @options.has_key?(:recursive?)
|
27
27
|
cmd_arg += ' ' + repos.join(' ')
|
28
28
|
FileUtils.cd @mirror_dir do
|
29
29
|
puts system3(cmd_arg)
|
data/lib/yggdrasil/log.rb
CHANGED
@@ -9,7 +9,7 @@ class Yggdrasil
|
|
9
9
|
|
10
10
|
if args.size == 0
|
11
11
|
dir = @mirror_dir + @current_dir
|
12
|
-
error
|
12
|
+
error 'current directory is not managed.' unless File.exist?(dir)
|
13
13
|
args << dir
|
14
14
|
else
|
15
15
|
args.collect! do |arg|
|
@@ -26,7 +26,7 @@ class Yggdrasil
|
|
26
26
|
if @options.has_key?(:revision)
|
27
27
|
cmd_arg += " -r #{@options[:revision]}"
|
28
28
|
else
|
29
|
-
cmd_arg +=
|
29
|
+
cmd_arg += ' -r HEAD:1'
|
30
30
|
end
|
31
31
|
cmd_arg += ' ' + args.join(' ')
|
32
32
|
puts system3(cmd_arg)
|
data/lib/yggdrasil/update.rb
CHANGED
@@ -30,7 +30,7 @@ class Yggdrasil
|
|
30
30
|
confirmed_updates = confirm_updates(matched_updates) do |relative_path|
|
31
31
|
FileUtils.cd @mirror_dir do
|
32
32
|
cmd = "#@svn diff"
|
33
|
-
cmd +=
|
33
|
+
cmd += ' --no-auth-cache --non-interactive'
|
34
34
|
cmd += username_password_options_to_read_repo
|
35
35
|
if @options.has_key?(:revision)
|
36
36
|
cmd += " --old=#{relative_path} --new=#{relative_path}@#{@options[:revision]}"
|
@@ -50,7 +50,7 @@ class Yggdrasil
|
|
50
50
|
if @options.has_key?(:revision)
|
51
51
|
cmd_arg += " -r #{@options[:revision]}"
|
52
52
|
else
|
53
|
-
cmd_arg +=
|
53
|
+
cmd_arg += ' -r HEAD'
|
54
54
|
end
|
55
55
|
cmd_arg += ' ' + confirmed_updates.join(' ')
|
56
56
|
FileUtils.cd @mirror_dir do
|
data/lib/yggdrasil/version.rb
CHANGED
data/lib/yggdrasil.rb
CHANGED
@@ -1,21 +1,20 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
|
3
|
-
require
|
4
|
-
|
5
|
-
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require "yggdrasil/check"
|
3
|
+
require 'yggdrasil_common'
|
4
|
+
|
5
|
+
require 'yggdrasil/version'
|
6
|
+
require 'yggdrasil/help'
|
7
|
+
require 'yggdrasil/init'
|
8
|
+
require 'yggdrasil/add'
|
9
|
+
require 'yggdrasil/commit'
|
10
|
+
require 'yggdrasil/cleanup'
|
11
|
+
require 'yggdrasil/diff'
|
12
|
+
require 'yggdrasil/list'
|
13
|
+
require 'yggdrasil/log'
|
14
|
+
require 'yggdrasil/status'
|
15
|
+
require 'yggdrasil/update'
|
16
|
+
require 'yggdrasil/revert'
|
17
|
+
require 'yggdrasil/check'
|
19
18
|
|
20
19
|
class Yggdrasil
|
21
20
|
|
@@ -38,22 +37,16 @@ class Yggdrasil
|
|
38
37
|
new.commit(args[1..-1])
|
39
38
|
when 'diff', 'di'
|
40
39
|
new.diff(args[1..-1])
|
41
|
-
when 'help', 'h', '?'
|
40
|
+
when 'help', '--help', 'h', '?'
|
42
41
|
new(false).help(args[1..-1])
|
43
42
|
when 'init'
|
44
43
|
new(false).init(args[1..-1])
|
45
|
-
when 'init-server'
|
46
|
-
YggdrasilServer.new(false).init_server(args[1..-1])
|
47
44
|
when 'list', 'ls'
|
48
45
|
new.list(args[1..-1])
|
49
46
|
when 'log'
|
50
47
|
new.log(args[1..-1])
|
51
|
-
when 'results'
|
52
|
-
YggdrasilServer.new.results(args[1..-1])
|
53
48
|
when 'revert'
|
54
49
|
new.revert(args[1..-1])
|
55
|
-
when 'server'
|
56
|
-
YggdrasilServer.new.server(args[1..-1])
|
57
50
|
when 'status', 'stat', 'st'
|
58
51
|
new.status(args[1..-1])
|
59
52
|
when 'update'
|
@@ -69,7 +62,7 @@ class Yggdrasil
|
|
69
62
|
def initialize(exist_config = true)
|
70
63
|
@base_cmd = File::basename($0)
|
71
64
|
@current_dir = `readlink -f .`.chomp
|
72
|
-
@config_dir = "#{ENV[
|
65
|
+
@config_dir = "#{ENV['HOME']}/.yggdrasil"
|
73
66
|
@config_file = "#@config_dir/config"
|
74
67
|
@mirror_dir = "#@config_dir/mirror"
|
75
68
|
@checker_dir = "#@config_dir/checker"
|
@@ -77,9 +70,9 @@ class Yggdrasil
|
|
77
70
|
|
78
71
|
return unless exist_config
|
79
72
|
configs = read_config(@config_file)
|
80
|
-
error
|
81
|
-
error
|
82
|
-
error
|
73
|
+
error 'need "path" in config file' unless (ENV['PATH'] = configs[:path])
|
74
|
+
error 'need "svn" in config file' unless (@svn = configs[:svn])
|
75
|
+
error 'need "repo" in config file' unless (@repo = configs[:repo])
|
83
76
|
@anon_access = (configs[:anon_access] == 'read')
|
84
77
|
@options ||= Hash.new
|
85
78
|
@options[:server] = configs[:server] if configs.has_key?(:server)
|
@@ -106,7 +99,7 @@ class Yggdrasil
|
|
106
99
|
files.each do |file|
|
107
100
|
if !File.exist?("/#{file}")
|
108
101
|
system3 "#@svn delete #{file} --force" +
|
109
|
-
|
102
|
+
' --no-auth-cache --non-interactive'
|
110
103
|
elsif File.file?("/#{file}")
|
111
104
|
if !File.exist?("#@mirror_dir/#{file}")
|
112
105
|
cmd = "#@svn revert #{file}"
|
@@ -168,7 +161,7 @@ class Yggdrasil
|
|
168
161
|
(0...updates.size).each do |i|
|
169
162
|
puts "#{i}:#{updates[i][0]} #{updates[i][1]}"
|
170
163
|
end
|
171
|
-
print
|
164
|
+
print 'OK? [Y|n|<num to diff>]:'
|
172
165
|
res = $stdin.gets
|
173
166
|
return nil unless res
|
174
167
|
res.chomp!
|
@@ -191,7 +184,7 @@ class Yggdrasil
|
|
191
184
|
if @options.has_key?(:ro_password)
|
192
185
|
" --username #{@options[:ro_username]} --password #{@options[:ro_password]}"
|
193
186
|
else
|
194
|
-
|
187
|
+
''
|
195
188
|
end
|
196
189
|
end
|
197
190
|
|
@@ -213,9 +206,9 @@ class Yggdrasil
|
|
213
206
|
# get repo
|
214
207
|
sock = TCPSocket.open(host, port)
|
215
208
|
error "can not connect to server: #{host}:#{port}" if sock.nil?
|
216
|
-
sock.puts
|
209
|
+
sock.puts 'get_repo'
|
217
210
|
rcv = sock.gets
|
218
|
-
error
|
211
|
+
error 'can not get repo from server' if rcv.nil?
|
219
212
|
@options[:repo] = rcv.chomp
|
220
213
|
sock.close
|
221
214
|
end
|
@@ -223,12 +216,12 @@ class Yggdrasil
|
|
223
216
|
#get read-only username/password
|
224
217
|
sock = TCPSocket.open(host, port)
|
225
218
|
error "can not connect to server: #{host}:#{port}" if sock.nil?
|
226
|
-
sock.puts(
|
219
|
+
sock.puts('get_ro_id_pw')
|
227
220
|
username = sock.gets
|
228
221
|
unless username.nil?
|
229
222
|
@options[:ro_username] = username.chomp
|
230
223
|
password = sock.gets
|
231
|
-
error
|
224
|
+
error 'can not get ro_password' if password.nil?
|
232
225
|
@options[:ro_password] = password.chomp
|
233
226
|
end
|
234
227
|
sock.close
|
data/lib/yggdrasil_common.rb
CHANGED
@@ -56,23 +56,23 @@ module YggdrasilCommon
|
|
56
56
|
|
57
57
|
def input_user_pass
|
58
58
|
until @options.has_key?(:username) do
|
59
|
-
error
|
60
|
-
print
|
59
|
+
error 'Can\'t get username or password' if @options.has_key?(:non_interactive?)
|
60
|
+
print 'Input svn username: '
|
61
61
|
input = $stdin.gets
|
62
|
-
error
|
62
|
+
error 'can not input username' unless input
|
63
63
|
input.chomp!
|
64
64
|
return if input.size == 0
|
65
65
|
@options[:username] = @options[:ro_username] = input
|
66
66
|
end
|
67
67
|
until @options.has_key?(:password) do
|
68
|
-
error
|
69
|
-
print
|
68
|
+
error 'Can\'t get username or password' if @options.has_key?(:non_interactive?)
|
69
|
+
print 'Input svn password: '
|
70
70
|
#input = `sh -c 'read -s hoge;echo $hoge'`
|
71
71
|
system3 'stty -echo', false
|
72
72
|
input = $stdin.gets
|
73
73
|
system3 'stty echo', false
|
74
74
|
puts
|
75
|
-
error
|
75
|
+
error 'can not input password' unless input
|
76
76
|
input.chomp!
|
77
77
|
@options[:password] = @options[:ro_password] = input
|
78
78
|
end
|
@@ -85,8 +85,13 @@ module YggdrasilCommon
|
|
85
85
|
|
86
86
|
unless stat.success?
|
87
87
|
return nil unless err_exit
|
88
|
-
|
89
|
-
|
88
|
+
if @options[:debug?]
|
89
|
+
cmd_disp = cmd
|
90
|
+
else
|
91
|
+
cmd_disp = (cmd.split)[0]+' ...'
|
92
|
+
end
|
93
|
+
$stderr.puts "#@base_cmd error: command failure: #{cmd_disp}"
|
94
|
+
$stderr.puts 'command output:'
|
90
95
|
$stderr.puts out
|
91
96
|
exit stat.exitstatus
|
92
97
|
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'yggdrasil_server'
|
2
|
+
|
3
|
+
class YggdrasilServer
|
4
|
+
|
5
|
+
# @param [Array] args
|
6
|
+
def help(args)
|
7
|
+
if args.size == 0
|
8
|
+
puts <<EOS
|
9
|
+
usage: #@base_cmd <subcommand> [options] [args]
|
10
|
+
Yggdrasil version #{Yggdrasil::VERSION}
|
11
|
+
Type '#@base_cmd help <subcommand>' for help on a specific subcommand.
|
12
|
+
|
13
|
+
Available subcommands:
|
14
|
+
daemon
|
15
|
+
debug
|
16
|
+
help (?, h)
|
17
|
+
init
|
18
|
+
results
|
19
|
+
version
|
20
|
+
|
21
|
+
Yggdrasil server is a TCP server
|
22
|
+
to receive/record the yggdrasil check result of all managed servers.
|
23
|
+
|
24
|
+
At first, you should type '#@base_cmd init' to create config file.
|
25
|
+
|
26
|
+
EOS
|
27
|
+
elsif args.size != 1 then
|
28
|
+
error 'too many arguments.'
|
29
|
+
else
|
30
|
+
case args[0]
|
31
|
+
when 'daemon'
|
32
|
+
puts <<"EOS"
|
33
|
+
daemon: launch TCP server by daemon mode.
|
34
|
+
usage: #{File.basename($0)} daemon
|
35
|
+
|
36
|
+
EOS
|
37
|
+
when 'debug'
|
38
|
+
puts <<"EOS"
|
39
|
+
debug: launch TCP server by debug mode.
|
40
|
+
usage: #{File.basename($0)} debug
|
41
|
+
|
42
|
+
EOS
|
43
|
+
when 'help', '?', 'h'
|
44
|
+
puts <<"EOS"
|
45
|
+
help (?,h): Describe the usage of this program or its subcommands.
|
46
|
+
usage: #@base_cmd help [SUBCOMMAND]
|
47
|
+
|
48
|
+
EOS
|
49
|
+
when 'init'
|
50
|
+
puts <<"EOS"
|
51
|
+
init: setup yggdrasil server configuration.
|
52
|
+
usage: #@base_cmd init [OPTIONS...]
|
53
|
+
|
54
|
+
Valid options:
|
55
|
+
--port ARG : specify a TCP port number ARG
|
56
|
+
--repo ARG : URL of subversion repository
|
57
|
+
ARG can contain {HOST} or a {host}
|
58
|
+
{HOST} is replaced by client hostname with domain
|
59
|
+
{host} is replaced by client hostname without domain
|
60
|
+
e.g. svn://192.168.3.5/servers/{host}/ygg
|
61
|
+
--ro-username ARG : specify a username ARG for read only
|
62
|
+
--ro-password ARG : specify a password ARG for read only
|
63
|
+
|
64
|
+
EOS
|
65
|
+
when 'results'
|
66
|
+
puts <<"EOS"
|
67
|
+
results: display the result of yggdrasil check command.
|
68
|
+
usage: #@base_cmd results [OPTIONS...]
|
69
|
+
|
70
|
+
Valid options:
|
71
|
+
--expire ARG : minutes from the final report, to judge the host not be alive
|
72
|
+
|
73
|
+
EOS
|
74
|
+
when 'version', '--version'
|
75
|
+
puts <<"EOS"
|
76
|
+
version: See the program version
|
77
|
+
usage: #@base_cmd version
|
78
|
+
|
79
|
+
EOS
|
80
|
+
else
|
81
|
+
error "Unknown subcommand: '#{subcommand}'"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|