foreman_templates 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -0
- data/lib/foreman_templates/engine.rb +2 -0
- data/lib/foreman_templates/version.rb +1 -1
- data/lib/templates.rake +128 -76
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: acae354280dfe45ef7fffd417add76632686f5c6
|
4
|
+
data.tar.gz: 64324ccdd05c546ff663fa2eb2f2059a0f809e54
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a96282ae4f045fc3642df1f532cfa113c93bd7960b0ad8a1b79a8eb5d022d1908174231c0834fd338dbeca4d9248cf28a7786c8f755faf9afb8a1e3e2390abab
|
7
|
+
data.tar.gz: 0c30b8e9eb049e4c8f510efd7e97b795b5b4d17445697bb6a58bc1f2b7b57af9baf4a8b2931516d62d784b9a607b1118a7891b7010f8973de1b681809439a575
|
data/README.md
CHANGED
@@ -44,6 +44,7 @@ template will be automatically associated with the OS
|
|
44
44
|
|
45
45
|
* verbose => Print extra information during the run [false]
|
46
46
|
* repo => Sync templates from a different Git repo [https://github.com/theforeman/community-templates]
|
47
|
+
* branch => Branch in Git repo [default branch]
|
47
48
|
* prefix => The string all imported templates should begin with [Community]
|
48
49
|
* dirname => The directory within the git tree containing the templates [/]
|
49
50
|
* filter => Import names matching this regex (case-insensitive; snippets are not filtered)
|
data/lib/templates.rake
CHANGED
@@ -1,114 +1,166 @@
|
|
1
|
-
require '
|
1
|
+
require 'yaml'
|
2
|
+
require 'diffy'
|
3
|
+
|
4
|
+
class NoKindError < Exception ; end
|
5
|
+
|
6
|
+
def map_oses
|
7
|
+
oses = if @metadata['oses']
|
8
|
+
@metadata['oses'].map do |os|
|
9
|
+
@db_oses.map { |db| db.to_label =~ /^#{os}/ ? db : nil}
|
10
|
+
end.flatten.compact
|
11
|
+
else
|
12
|
+
[]
|
13
|
+
end
|
14
|
+
puts " Operatingsystem Associations: #{oses.map(&:fullname).join(',')}" if verbose
|
15
|
+
return oses
|
16
|
+
end
|
17
|
+
|
18
|
+
def update_template
|
19
|
+
# Get template type
|
20
|
+
unless kind = TemplateKind.find_by_name(@metadata['kind'])
|
21
|
+
puts " Error: Unknown template type '#{@metadata['kind']}'"
|
22
|
+
raise NoKindError
|
23
|
+
end
|
24
|
+
|
25
|
+
db_template = ConfigTemplate.find_or_initialize_by_name(@name)
|
26
|
+
data = {
|
27
|
+
:template => @text,
|
28
|
+
:snippet => false,
|
29
|
+
:template_kind_id => kind.id
|
30
|
+
}
|
31
|
+
|
32
|
+
if db_template.new_record?
|
33
|
+
data[:operatingsystem_ids] = map_oses.map(&:id)
|
34
|
+
string = "Created"
|
35
|
+
else
|
36
|
+
string = "Updated"
|
37
|
+
end
|
38
|
+
|
39
|
+
if @text == db_template.template
|
40
|
+
puts " No change to Template #{ ( 'id' + db_template.id ) rescue ''}:#{@name}"
|
41
|
+
else
|
42
|
+
update = Diffy::Diff.new(db_template.template, @text, :include_diff_info => true).to_s(:color)
|
43
|
+
db_template.update_attributes(data)
|
44
|
+
puts " #{string} Template #{ 'id' + db_template.id rescue ''}:#{@name}"
|
45
|
+
puts update if !db_template.new_record? and verbose
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def update_ptable
|
50
|
+
oses = map_oses
|
51
|
+
|
52
|
+
db_ptable = Ptable.find_or_initialize_by_name(@name)
|
53
|
+
data = { :layout => @text }
|
54
|
+
if db_ptable.new_record?
|
55
|
+
data[:os_family] = oses.map(&:family).uniq.first
|
56
|
+
#no idea why this fails...
|
57
|
+
#data[:operatingsystems] = oses,
|
58
|
+
string = "Created"
|
59
|
+
else
|
60
|
+
string = "Updated"
|
61
|
+
end
|
62
|
+
|
63
|
+
if @text == db_ptable.layout
|
64
|
+
puts " No change to Ptable #{ ( 'id' + db_ptable.id ) rescue ''}:#{@name}"
|
65
|
+
else
|
66
|
+
update = Diffy::Diff.new(db_ptable.layout, @text, :include_diff_info => true).to_s(:color)
|
67
|
+
db_ptable.update_attributes(data)
|
68
|
+
puts " #{string} Ptable #{ ( 'id' + db_ptable.id ) rescue ''}:#{@name}"
|
69
|
+
puts update if !db_ptable.new_record? and verbose
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
def update_snippet
|
75
|
+
db_snippet = ConfigTemplate.find_or_initialize_by_name(@name)
|
76
|
+
data = {
|
77
|
+
:template => @text,
|
78
|
+
:snippet => true
|
79
|
+
}
|
80
|
+
string = db_snippet.new_record? ? "Created" : "Updated"
|
81
|
+
|
82
|
+
if @text == db_snippet.template
|
83
|
+
puts " No change to Snippet #{ 'id' + db_snippet.id rescue ''}:#{@name}" if verbose
|
84
|
+
else
|
85
|
+
update = Diffy::Diff.new(db_snippet.template, @text, :include_diff_info => true).to_s(:color)
|
86
|
+
db_snippet.update_attributes(data)
|
87
|
+
puts " #{string} Snippet #{ ('id' + db_snippet.id) rescue ''}:#{@name}" if verbose
|
88
|
+
puts update if !db_snippet.new_record? and verbose
|
89
|
+
end
|
90
|
+
end
|
2
91
|
|
3
92
|
desc <<-END_DESC
|
4
93
|
Synchronize templates from a git repo
|
5
94
|
END_DESC
|
6
95
|
namespace :templates do
|
7
96
|
task :sync => :environment do
|
8
|
-
|
9
97
|
# Available options:
|
10
98
|
#* verbose => Print extra information during the run [false]
|
11
99
|
#* repo => Sync templates from a different Git repo [https://github.com/theforeman/community-templates]
|
100
|
+
#* branch => Branch in Git repo [default branch]
|
12
101
|
#* prefix => The string all imported templates should begin with [Community]
|
13
102
|
#* dirname => The directory within the git tree containing the templates [/]
|
14
103
|
#* filter => Import names matching this regex (case-insensitive; snippets are not filtered)
|
15
104
|
|
16
105
|
verbose = ( ENV['verbose'] and ENV['verbose'] != 'false' ) ? true : false
|
17
106
|
repo = ENV['repo'] ? ENV['repo'] : "https://github.com/theforeman/community-templates.git"
|
107
|
+
branch = ENV['branch'] ? "-b #{ENV['branch']}" : ""
|
18
108
|
prefix = ENV['prefix'] ? ENV['prefix'] : 'Community'
|
19
109
|
dirname = ENV['dirname'] ? ENV['dirname'] : '/'
|
20
110
|
filter = ENV['filter'] ? ENV['filter'] : nil
|
21
111
|
|
22
112
|
# Check out the community templates to a temp location
|
23
113
|
dir = Dir.mktmpdir
|
24
|
-
command = "git clone #{repo} #{dir}"
|
114
|
+
command = "git clone #{branch} #{repo} #{dir}"
|
25
115
|
|
26
116
|
status = `#{command}`
|
27
117
|
puts "#{status}" if verbose
|
28
118
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
rescue
|
42
|
-
[]
|
43
|
-
end.delete_if {|o| !(o.major =~ /#{release}/i or o.release_name =~ /#{release}/i )}
|
44
|
-
|
45
|
-
osfamily = oses.map{|o|o.type}.uniq.first
|
46
|
-
|
47
|
-
db_template = ConfigTemplate.find_or_initialize_by_name(name)
|
48
|
-
data = {
|
49
|
-
:template => File.read(template),
|
50
|
-
:snippet => false,
|
51
|
-
:template_kind_id => kind.id
|
52
|
-
}
|
53
|
-
if db_template.new_record?
|
54
|
-
data[:operatingsystem_ids] = oses.map {|o| o.id}
|
55
|
-
string = "Created"
|
119
|
+
# Cache the list of OSes
|
120
|
+
@db_oses = Operatingsystem.all
|
121
|
+
|
122
|
+
# Build a list of ERB files to parse
|
123
|
+
Dir["#{dir}#{dirname}/**/*.erb"].each do |template|
|
124
|
+
# Parse Metadata in the template
|
125
|
+
options=""
|
126
|
+
strip_metadata=""
|
127
|
+
File.readlines(template).each do |line|
|
128
|
+
if line =~ /^#/
|
129
|
+
strip_metadata += line
|
130
|
+
options += line[1..-1]
|
56
131
|
else
|
57
|
-
|
132
|
+
break
|
58
133
|
end
|
59
|
-
|
60
|
-
puts "#{string} Template id #{db_template.id || "new"}:#{name}" if verbose
|
61
|
-
db_template.update_attributes(data)
|
62
134
|
end
|
63
|
-
|
135
|
+
@metadata = options == "" ? {} : YAML.load(options)
|
136
|
+
@text = File.read(template).gsub(/#{strip_metadata}/,'')
|
64
137
|
|
65
|
-
|
66
|
-
|
67
|
-
release = File.expand_path('..',ptable).split('/').last.capitalize
|
68
|
-
filename = ptable.split('/').last
|
138
|
+
# Get the name and filter
|
139
|
+
filename = template.split('/').last
|
69
140
|
title = filename.split('.').first
|
70
|
-
name
|
141
|
+
@name = @metadata ['name'] || "#{prefix} #{title}"
|
71
142
|
next if filter and not name.match(/#{filter}/i)
|
72
143
|
|
73
|
-
|
74
|
-
by_type = Operatingsystem.find_all_by_type(os)
|
75
|
-
by_type.empty? ? Operatingsystem.where("name LIKE ?", os) : by_type
|
76
|
-
rescue
|
77
|
-
[]
|
78
|
-
end.delete_if {|o| !(o.major =~ /#{release}/i or o.release_name =~ /#{release}/i )}
|
79
|
-
|
80
|
-
osfamily = oses.map{|o|o.type}.uniq.first
|
81
|
-
|
82
|
-
db_ptable = Ptable.find_or_initialize_by_name(name)
|
83
|
-
data = { :layout => File.read(ptable) }
|
84
|
-
if db_ptable.new_record?
|
85
|
-
data[:os_family] = osfamily
|
86
|
-
data[:operatingsystems] = oses
|
87
|
-
string = "Created"
|
88
|
-
else
|
89
|
-
string = "Updated"
|
90
|
-
end
|
144
|
+
puts "Parsing: " + template.gsub(/#{dir}#{dirname}/,'') if verbose
|
91
145
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
Dir["#{dir}#{dirname}/snippets/*.erb"].each do |snippet|
|
97
|
-
name = snippet.split('/').last.gsub(/.erb$/,'')
|
98
|
-
|
99
|
-
db_snippet = ConfigTemplate.find_or_initialize_by_name(name)
|
100
|
-
data = {
|
101
|
-
:template => File.read(snippet),
|
102
|
-
:snippet => true
|
103
|
-
}
|
104
|
-
string = db_snippet.new_record? ? "Created" : "Updated"
|
146
|
+
unless @metadata['kind']
|
147
|
+
puts " Error: Must specify template kind"
|
148
|
+
next
|
149
|
+
end
|
105
150
|
|
106
|
-
|
107
|
-
|
151
|
+
case @metadata['kind']
|
152
|
+
when 'ptable'
|
153
|
+
update_ptable
|
154
|
+
when 'snippet'
|
155
|
+
update_snippet
|
156
|
+
else
|
157
|
+
begin
|
158
|
+
update_template
|
159
|
+
rescue NoKindError
|
160
|
+
next
|
161
|
+
end
|
162
|
+
end
|
108
163
|
end
|
109
164
|
|
110
|
-
# TODO do this in ruby
|
111
|
-
`rm -rf #{dir}`
|
112
|
-
|
113
165
|
end
|
114
166
|
end
|
metadata
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreman_templates
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Greg Sutcliffe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-08-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: diffy
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - '>='
|
@@ -59,7 +59,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
59
59
|
version: '0'
|
60
60
|
requirements: []
|
61
61
|
rubyforge_project:
|
62
|
-
rubygems_version: 2.0.
|
62
|
+
rubygems_version: 2.0.3
|
63
63
|
signing_key:
|
64
64
|
specification_version: 4
|
65
65
|
summary: Template-syncing engine for Foreman
|