yggdrasil 0.0.7 → 0.0.8
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/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
|