vycap 1.0.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.
- checksums.yaml +7 -0
- data/lib/vycap.rb +5 -0
- data/lib/vycap/plugin.rb +90 -0
- data/lib/vycap/tasks.rb +116 -0
- metadata +45 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 468dd254bbfa3f5b55211230db1b4993a8ae8ad9
|
4
|
+
data.tar.gz: 0fd71f11753e45272bc0825d5e245e7133a6be27
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 90f534638282176ea44da1ea2569ea407d5f3ca40d6394359f0c4faac449fa816b0455a302055a6a9221024c890ea4849329ed0339b622a6a71c354c40558b3e
|
7
|
+
data.tar.gz: 31cc09da24aa8e6461a9fbe2b324dcd563d55069afa01c577a42e9d4b83f6db9c174bf346f8c507c3f43401c097fd46458debec104bacc4b1eeb0bf99aabd61e
|
data/lib/vycap.rb
ADDED
data/lib/vycap/plugin.rb
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'erb'
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
module Vycap
|
5
|
+
module Plugin
|
6
|
+
def generate_config(server, options)
|
7
|
+
template_filename = File.join(
|
8
|
+
options.fetch(:template_dir),
|
9
|
+
options.fetch(:template)
|
10
|
+
)
|
11
|
+
output_filename = File.join(
|
12
|
+
options.fetch(:output_dir),
|
13
|
+
"config.#{server}"
|
14
|
+
)
|
15
|
+
template_filename += ".erb" unless template_filename =~ /\.erb$/
|
16
|
+
|
17
|
+
context = if options[:context].nil?
|
18
|
+
OpenStruct.new
|
19
|
+
elsif options[:context].respond_to?(:call)
|
20
|
+
OpenStruct.new(options[:context].call(server))
|
21
|
+
else
|
22
|
+
OpenStruct.new(options[:context])
|
23
|
+
end
|
24
|
+
|
25
|
+
context.partials = evaluate_partials(options.fetch(:partials_dir), context)
|
26
|
+
|
27
|
+
erb = File.read(template_filename)
|
28
|
+
File.open(output_filename, "w") do |out|
|
29
|
+
out.write ERB.new(erb).result(context.instance_eval { binding })
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def evaluate_partials(partials_dir, context)
|
34
|
+
return @vycap_partials unless @vycap_partials.nil?
|
35
|
+
|
36
|
+
@vycap_partials = {}
|
37
|
+
|
38
|
+
Dir["#{partials_dir}/*.erb"].sort.each do |file|
|
39
|
+
erb = File.read(file)
|
40
|
+
|
41
|
+
@vycap_partials[File.basename(file, ".erb")] = ERB.new(erb).result(context.instance_eval { binding })
|
42
|
+
end
|
43
|
+
|
44
|
+
@vycap_partials
|
45
|
+
end
|
46
|
+
|
47
|
+
def vcmd(cmd)
|
48
|
+
"/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper #{cmd}"
|
49
|
+
end
|
50
|
+
|
51
|
+
def vrun(*cmds)
|
52
|
+
cmds = cmds.flatten
|
53
|
+
if cmds.last.is_a?(Hash)
|
54
|
+
options = cmds.pop
|
55
|
+
else
|
56
|
+
options = {}
|
57
|
+
end
|
58
|
+
|
59
|
+
vcmds = cmds.map do |cmd|
|
60
|
+
vcmd(cmd)
|
61
|
+
end
|
62
|
+
|
63
|
+
sudo_prefix = options.fetch(:sudo, false) ? sudo : ""
|
64
|
+
|
65
|
+
run %Q{#{sudo_prefix} vbash -c '#{vcmds.join(" && ")}'; true}, :eof => true, :shell => false do |ch, stream, data|
|
66
|
+
case stream
|
67
|
+
when :out
|
68
|
+
if data =~ /^enter .* password:$/i
|
69
|
+
password = Capistrano::CLI.password_prompt(data + " ")
|
70
|
+
ch.send_data(password + "\n")
|
71
|
+
elsif data =~ /is not valid/ || data =~ /failed/
|
72
|
+
puts _colorize(data, "\033[31m")
|
73
|
+
else
|
74
|
+
puts data
|
75
|
+
end
|
76
|
+
when :err then warn "[err :: #{ch[:server]}] #{data}"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def vsudo(*cmds)
|
82
|
+
vrun cmds, :sudo => true
|
83
|
+
end
|
84
|
+
|
85
|
+
# borrowed from http://www.codedrop.ca/blog/archives/200
|
86
|
+
def _colorize(text, color_code)
|
87
|
+
"#{color_code}#{text}\033[0m"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
data/lib/vycap/tasks.rb
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
Capistrano::Configuration.instance.load do
|
2
|
+
set :vycap_template_dir, File.expand_path("./vycap/templates/")
|
3
|
+
set :vycap_partials_dir, vycap_template_dir + "/partials"
|
4
|
+
set :vycap_user, nil
|
5
|
+
set :vycap_remote_config, "/config/config.vycap"
|
6
|
+
set :vycap_tmp_dir, "/tmp"
|
7
|
+
set :vycap_template, "config"
|
8
|
+
set :vycap_template_context, {}
|
9
|
+
set :vycap_auth_dir, ""
|
10
|
+
set :vycap_remote_auth_dir, "/config/auth/vycap/"
|
11
|
+
|
12
|
+
namespace :vycap do
|
13
|
+
task :download_config_template do
|
14
|
+
failed_servers = roles[:vyatta].servers.map do |srv|
|
15
|
+
remote_file = SupplyDrop::Rsync.remote_address(vycap_user, srv.host, "/config/config.boot")
|
16
|
+
cmd = SupplyDrop::Rsync.command(
|
17
|
+
remote_file,
|
18
|
+
vycap_template_dir + "/config.#{srv}.erb",
|
19
|
+
:ssh => ssh_options
|
20
|
+
)
|
21
|
+
srv unless system cmd
|
22
|
+
end
|
23
|
+
|
24
|
+
raise "rsync failed on #{failed_servers.inspect}" if failed_servers.any?
|
25
|
+
|
26
|
+
roles[:vyatta].servers.map do |srv|
|
27
|
+
config_template = vycap_template_dir + "/config.#{srv}.erb"
|
28
|
+
|
29
|
+
original = File.read(config_template)
|
30
|
+
File.open(config_template, "w") do |file|
|
31
|
+
original.split("\n").each do |line|
|
32
|
+
file.puts line unless line =~ /\bhw-id\b/
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
namespace :upload do
|
39
|
+
task :default do
|
40
|
+
vycap.upload.config
|
41
|
+
vycap.upload.auth_files unless vycap_auth_dir == ""
|
42
|
+
end
|
43
|
+
|
44
|
+
task :config do
|
45
|
+
failed_servers = roles[:vyatta].servers.map do |srv|
|
46
|
+
vycap_plugin.generate_config(srv, {
|
47
|
+
:template => vycap_template,
|
48
|
+
:template_dir => vycap_template_dir,
|
49
|
+
:partials_dir => vycap_partials_dir,
|
50
|
+
:output_dir => vycap_tmp_dir,
|
51
|
+
:context => vycap_template_context
|
52
|
+
})
|
53
|
+
|
54
|
+
remote_file = SupplyDrop::Rsync.remote_address(vycap_user, srv.host, vycap_remote_config)
|
55
|
+
|
56
|
+
cmd = SupplyDrop::Rsync.command(
|
57
|
+
File.join(vycap_tmp_dir, "config.#{srv}"),
|
58
|
+
remote_file,
|
59
|
+
:ssh => ssh_options
|
60
|
+
)
|
61
|
+
srv unless system cmd
|
62
|
+
end
|
63
|
+
|
64
|
+
raise "rsync failed on #{failed_servers.inspect}" if failed_servers.any?
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
task :auth_files do
|
69
|
+
set :user, vycap_user unless vycap_user.nil?
|
70
|
+
failed_servers = roles[:vyatta].servers.map do |srv|
|
71
|
+
remote_file = SupplyDrop::Rsync.remote_address(vycap_user, srv.host, vycap_remote_auth_dir)
|
72
|
+
auth_dir = vycap_auth_dir
|
73
|
+
|
74
|
+
remote_file += "/" unless remote_file =~ /\/$/
|
75
|
+
auth_dir += "/" unless auth_dir =~ /\/$/
|
76
|
+
|
77
|
+
|
78
|
+
cmd = SupplyDrop::Rsync.command(
|
79
|
+
auth_dir,
|
80
|
+
remote_file,
|
81
|
+
:ssh => ssh_options
|
82
|
+
)
|
83
|
+
success = system cmd
|
84
|
+
run("chmod -R go-rw #{vycap_remote_auth_dir}")
|
85
|
+
srv unless success
|
86
|
+
end
|
87
|
+
|
88
|
+
raise "rsync failed on #{failed_servers.inspect}" if failed_servers.any?
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
namespace :diff do
|
93
|
+
task :show do
|
94
|
+
set :user, vycap_user unless vycap_user.nil?
|
95
|
+
vycap_plugin.vsudo(
|
96
|
+
"begin",
|
97
|
+
"load #{vycap_remote_config}",
|
98
|
+
'show | grep -C 3 -E "^[+->]"',
|
99
|
+
"discard",
|
100
|
+
"end"
|
101
|
+
)
|
102
|
+
end
|
103
|
+
|
104
|
+
task :apply do
|
105
|
+
set :user, vycap_user unless vycap_user.nil?
|
106
|
+
vycap_plugin.vsudo(
|
107
|
+
"begin",
|
108
|
+
"load #{vycap_remote_config}",
|
109
|
+
"commit",
|
110
|
+
"save",
|
111
|
+
"end"
|
112
|
+
)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
metadata
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: vycap
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Patrick Schless
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-04-24 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Tested with vyatta 6.5
|
14
|
+
email: patrick@plainlystated.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- ./lib/vycap.rb
|
20
|
+
- ./lib/vycap/plugin.rb
|
21
|
+
- ./lib/vycap/tasks.rb
|
22
|
+
homepage: https://github.com/plainlystated/vycap
|
23
|
+
licenses: []
|
24
|
+
metadata: {}
|
25
|
+
post_install_message:
|
26
|
+
rdoc_options: []
|
27
|
+
require_paths:
|
28
|
+
- lib
|
29
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
requirements: []
|
40
|
+
rubyforge_project:
|
41
|
+
rubygems_version: 2.2.2
|
42
|
+
signing_key:
|
43
|
+
specification_version: 4
|
44
|
+
summary: Capistrano plugin for managing vyatta servers
|
45
|
+
test_files: []
|