cupper 0.0.1 → 0.1.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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +9 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +16 -0
  5. data/Gemfile +18 -0
  6. data/README.md +30 -0
  7. data/Rakefile +6 -0
  8. data/bin/cupper +1 -1
  9. data/cupper.gemspec +28 -0
  10. data/lib/cupper.rb +18 -1
  11. data/lib/cupper/cli.rb +63 -0
  12. data/lib/cupper/collect.rb +51 -0
  13. data/lib/cupper/cookbook.rb +71 -0
  14. data/lib/cupper/cookbook_file.rb +10 -0
  15. data/lib/cupper/cupperfile.rb +22 -0
  16. data/lib/cupper/entity.rb +63 -0
  17. data/lib/cupper/environment.rb +177 -0
  18. data/lib/cupper/errors.rb +84 -0
  19. data/lib/cupper/ohai_plugins.rb +13 -0
  20. data/lib/cupper/platform_collector.rb +40 -0
  21. data/lib/cupper/plugins/cupper/arch.rb +43 -0
  22. data/lib/cupper/plugins/cupper/debian.rb +48 -0
  23. data/lib/cupper/plugins/ohai/dpci.rb +30 -0
  24. data/lib/cupper/plugins/ohai/files.rb +68 -0
  25. data/lib/cupper/plugins/ohai/init_system.rb +14 -0
  26. data/lib/cupper/plugins/ohai/pacman.rb +31 -0
  27. data/lib/cupper/plugins/ohai/pkg_deps.rb +30 -0
  28. data/lib/cupper/plugins/ohai/pkg_manager.rb +31 -0
  29. data/lib/cupper/plugins/ohai/services.rb +20 -0
  30. data/lib/cupper/project.rb +40 -0
  31. data/lib/cupper/recipe.rb +240 -0
  32. data/lib/cupper/templates/CupperFile.erb +1 -0
  33. data/lib/cupper/templates/_cookbook_file.erb +9 -0
  34. data/lib/cupper/templates/_groups.erb +10 -0
  35. data/lib/cupper/templates/_links.erb +10 -0
  36. data/lib/cupper/templates/_package.erb +19 -0
  37. data/lib/cupper/templates/_services.erb +7 -0
  38. data/lib/cupper/templates/_templates.erb +11 -0
  39. data/lib/cupper/templates/_users.erb +10 -0
  40. data/lib/cupper/templates/cookbook_file.erb +1 -0
  41. data/lib/cupper/templates/recipe.erb +7 -0
  42. data/lib/cupper/version.rb +3 -0
  43. data/templates/locales/en.yml +17 -0
  44. metadata +125 -8
@@ -0,0 +1,14 @@
1
+
2
+ Ohai.plugin(:InitSystem) do
3
+ provides 'init_system'
4
+
5
+ def from_cmd(cmd)
6
+ so = shell_out(cmd)
7
+ so.stdout.strip
8
+ end
9
+
10
+ collect_data(:linux) do
11
+ init_system Mash.new
12
+ init_system["init"] = from_cmd("cat /proc/1/comm")
13
+ end
14
+ end
@@ -0,0 +1,31 @@
1
+
2
+ Ohai.plugin(:Pacman) do
3
+ provides 'pacman'
4
+
5
+ def from_cmd(cmd)
6
+ so = shell_out(cmd)
7
+ so.stdout.lines
8
+ end
9
+
10
+ def extract_dependencies(pkg)
11
+ pkg_infos = from_cmd("pacman -Qi #{pkg}")
12
+ infos = pkg_infos.stdout.lines
13
+ infos.each do |info|
14
+ info.slice! /Depends On\s+:/ if info.include? "Depends On"
15
+ end
16
+ info
17
+ end
18
+
19
+ collect_data(:default) do
20
+ pacman Mash.new
21
+ pkgs = from_cmd('pacman -Q')
22
+
23
+ pkgs.each do |pkg|
24
+ name, version = pkg.split
25
+ pacman[name] = {
26
+ "version" => version,
27
+ "dependecies" => info,
28
+ }
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,30 @@
1
+ Ohai.plugin(:PkgDeps) do
2
+ provides 'pkg_deps'
3
+ depends 'platform_family'
4
+
5
+ def from_cmd(cmd)
6
+ so = shell_out(cmd)
7
+ so.stdout.lines
8
+ end
9
+
10
+ def all_packages
11
+ if %w{debian}.include? platform_family
12
+ from_cmd("dpkg-query -W")
13
+ end
14
+ end
15
+
16
+ def extract_dependecies(pkg)
17
+ pkg_infos = from_cmd("apt-cache showpkg #{pkg}")
18
+ pkg_infos.keep_if { |item| item.strip!.match(/^Depends:/)}
19
+ pkg_infos.each { |item| item.slice!("Depends: ") }
20
+ end
21
+
22
+ collect_data(:linux) do
23
+ pkg_deps Mash.new
24
+ if %w{debian}.include? platform_family
25
+ all_packages.each do |pkg|
26
+ pkg_deps[pkg.split.first] = extract_dependecies(pkg.split.first)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,31 @@
1
+
2
+ Ohai.plugin(:PkgManager) do
3
+ provides 'pkg_manager'
4
+
5
+ def return_version(cmd)
6
+ out = shell_out("#{cmd} || true")
7
+ value out.stdout.strip
8
+ value.match(/(\d+\.)(\d+\.)(\d+)/)
9
+ end
10
+
11
+ collect_data(:linux) do
12
+ pkg_manager Mash.new
13
+
14
+ # HACK: it may be a better way to collect the default pkg manages
15
+ DEFAULT_PKG_MANAGES = [
16
+ 'pacman',
17
+ 'dpkg',
18
+ 'apt',
19
+ 'gem',
20
+ 'pip',
21
+ 'pip3',
22
+ ]
23
+
24
+ DEFAULT_PKG_MANAGES.each do |manager|
25
+ pkg_manager[manager] = {
26
+ "version" => return_version("#{manager} --version")
27
+ }
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,20 @@
1
+ Ohai.plugin(:Services) do
2
+ provides 'services'
3
+
4
+ def from_cmd(cmd)
5
+ so = shell_out(cmd)
6
+ so.stdout.lines
7
+ end
8
+
9
+ collect_data(:default) do
10
+ services Mash.new
11
+ srvs from_cmd('systemctl list-units | grep loaded | grep active | grep running')
12
+
13
+ srvs.each do |srv|
14
+ name = srv.split.first
15
+ services[name] = {
16
+ "action" => 'restart',
17
+ }
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,40 @@
1
+ # This module prepare the Cupper project with the
2
+ # defaults files and dirs. All the files created are
3
+ # just samples and must to be changed by the user
4
+ require 'cupper/entity'
5
+
6
+ module Cupper
7
+ class Structure
8
+ include Entity
9
+ def initialize(name,dest_path, erb_file = nil, type = nil)
10
+ super(name, dest_path, erb_file, type)
11
+ end
12
+ end
13
+
14
+ class Project
15
+ attr_reader :name
16
+ attr_reader :dir
17
+
18
+ def initialize(project_name, directory = nil)
19
+ @name = project_name
20
+ @dir = directory.nil? ? Dir.getwd : directory
21
+ @subdirs = [
22
+ 'cookbooks'
23
+ ]
24
+ @files = [
25
+ 'CupperFile'
26
+ ]
27
+ end
28
+
29
+ def create
30
+ # Root project directory
31
+ struct = Structure.new(@name, @dir, nil, Entity::DIR)
32
+ struct.create
33
+
34
+ @subdirs.zip(@files).each do |dir, file|
35
+ Structure.new(dir, "#{@dir}/#{@name}", nil, Entity::DIR).create
36
+ Structure.new(file, "#{@dir}/#{@name}", file).create
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,240 @@
1
+
2
+ module Cupper
3
+ # Represents the recipe of the cookbook
4
+ class Recipe
5
+ include Entity
6
+ def initialize(dest_path, collector, erb_file = nil, recipe_name = 'default', recipe_deps = nil)
7
+ @recipe_deps = recipe_deps
8
+ @packages = Array.new
9
+ @services = Array.new
10
+ @templates = Array.new
11
+ @users = Array.new
12
+ @groups = Array.new
13
+ @execute = Array.new
14
+ @links = Array.new
15
+ @directories = Array.new
16
+ @files = Array.new
17
+ @collector = collector
18
+ super(recipe_name, dest_path, erb_file, nil, '.rb')
19
+ end
20
+
21
+ def create
22
+ @sources_list = expand_sources_list(@collector.extract 'files')
23
+ @packages = expand_packages(@collector.extract 'packages')
24
+ @services = expand_services(@collector.extract 'services')
25
+ @users = expand_users(@collector.extract 'users')
26
+ @groups = expand_groups(@collector.extract 'groups')
27
+ @links = expand_links(@collector.extract 'files')
28
+ @files = expand_files(@collector.extract 'files')
29
+ super
30
+ end
31
+
32
+ def expand_sources_list(files)
33
+ att = Array.new
34
+ files.each do |attr|
35
+ # TODO: Doesn't works for arch, this should be a plugin responsability
36
+ if attr[0].include?("/etc/apt/sources.list") and (convert_mode(attr[1]['mode']) != 'Unknown') and text_type?(attr)
37
+ path = attr[0]
38
+ group = attr[1]['group']
39
+ mode = attr[1]['mode']
40
+ owner = attr[1]['owner']
41
+ att.push(new_file(group, mode, owner, path))
42
+ end
43
+ end
44
+ att
45
+ end
46
+
47
+ def expand_packages(packages)
48
+ att = Array.new
49
+ packages.each do |attr|
50
+ pkg = attr[0]
51
+ version = attr[1]['version']
52
+
53
+ att.push(new_package(pkg,version))
54
+ end
55
+ att
56
+ end
57
+
58
+ def link_type?(file)
59
+ (file[1]['type'].split.first(2).join(' ').match('symbolic link'))
60
+ end
61
+
62
+ def dir_type?(file)
63
+ file[1]['type'].match('directory')
64
+ end
65
+
66
+ def text_type?(file)
67
+ file[1]['type'].match('text') or file[1]['type'].match('ASCII')
68
+ end
69
+
70
+ # TODO: this should be on ohai plugin
71
+ def convert_mode(mode)
72
+ return 'ERROR' if not mode
73
+ result = case mode.split('').last(9).join # Common modes
74
+ when 'rwxrwxrwx' then '777'
75
+ when 'rwxr-xr-x' then '755'
76
+ when 'rwx------' then '700'
77
+ when 'rw-rw-rw-' then '666'
78
+ when 'rw-r--r--' then '644'
79
+ when 'rw-------' then '600'
80
+ else 'Unknown'
81
+ end
82
+ result
83
+ end
84
+
85
+ def expand_services(services)
86
+ att = Array.new
87
+ services.each do |attr|
88
+ srv = attr[0]
89
+ action = attr[1]['action']
90
+
91
+ att.push(new_service(srv,action))
92
+ end
93
+ att
94
+ end
95
+
96
+ def expand_links(links)
97
+ att = Array.new
98
+ links.each do |attr|
99
+ if link_type?(attr)
100
+ target = attr[0]
101
+ to = attr[1]['type'].split.last(1).join
102
+ group = attr[1]['group']
103
+ mode = attr[1]['mode']
104
+ owner = attr[1]['owner']
105
+
106
+ att.push(new_link(group, mode, owner, target, to))
107
+ end
108
+ end
109
+ att
110
+ end
111
+
112
+ def expand_users(users)
113
+ att = Array.new
114
+ users.each do |attr|
115
+ usr = attr[0]
116
+ uid = attr[1]['uid']
117
+ gid = attr[1]['gid']
118
+ dir = attr[1]['dir']
119
+ shell = attr[1]['shell']
120
+
121
+ att.push(new_user(usr, uid, gid, dir, shell))
122
+ end
123
+ att
124
+ end
125
+
126
+ def expand_groups(groups)
127
+ att = Array.new
128
+ groups.each do |attr|
129
+ grp = attr[0]
130
+ gid = attr[1]['gid']
131
+ members = attr[1]['members']
132
+
133
+ att.push(new_group(grp, gid, members))
134
+ end
135
+ att
136
+ end
137
+
138
+ def expand_files(files)
139
+ att = Array.new
140
+ files.each do |attr|
141
+ if text_type?(attr) and !(attr[1]['related'].nil?)
142
+ path = attr[0]
143
+ group = attr[1]['group']
144
+ mode = attr[1]['mode']
145
+ owner = attr[1]['owner']
146
+
147
+ att.push(new_file(group, mode, owner, path))
148
+ end
149
+ end
150
+ att
151
+ end
152
+
153
+ # Every attribute object is created dynamic
154
+ def new_package(name, version)
155
+ package = Attribute.new
156
+ class << package
157
+ attr_accessor :name
158
+ attr_accessor :version
159
+ end
160
+ package.name = name
161
+ package.version = version
162
+ package
163
+ end
164
+
165
+ def new_service(name, action)
166
+ service = Attribute.new
167
+ class << service
168
+ attr_accessor :name
169
+ attr_accessor :action
170
+ end
171
+ service.name = name
172
+ service.action = action
173
+ service
174
+ end
175
+
176
+ def new_link(group, mode, owner, target_file, to)
177
+ link = Attribute.new
178
+ class << link
179
+ attr_accessor :group
180
+ attr_accessor :mode
181
+ attr_accessor :owner
182
+ attr_accessor :target_file
183
+ attr_accessor :to
184
+ end
185
+ link.group = group
186
+ link.mode = convert_mode(mode)
187
+ link.owner = owner
188
+ link.target_file = target_file
189
+ link.to = to
190
+ link
191
+ end
192
+
193
+ def new_user(name, uid, gid, dir, shell)
194
+ user = Attribute.new
195
+ class << user
196
+ attr_accessor :name
197
+ attr_accessor :uid
198
+ attr_accessor :gid
199
+ attr_accessor :dir
200
+ attr_accessor :shell
201
+ end
202
+ user.name = name
203
+ user.uid = uid
204
+ user.gid = gid
205
+ user.dir = dir
206
+ user.shell = shell
207
+ user
208
+ end
209
+
210
+ def new_group(name, gid, members)
211
+ group = Attribute.new
212
+ class << group
213
+ attr_accessor :name
214
+ attr_accessor :gid
215
+ attr_accessor :members
216
+ end
217
+ group.name = name
218
+ group.gid = gid
219
+ group.members = members
220
+ group
221
+ end
222
+
223
+ def new_file(group, mode, owner, path, source='')
224
+ file = Attribute.new
225
+ class << file
226
+ attr_accessor :path
227
+ attr_accessor :source
228
+ attr_accessor :group
229
+ attr_accessor :mode
230
+ attr_accessor :owner
231
+ end
232
+ file.path = path
233
+ file.source = source
234
+ file.group = group
235
+ file.mode = convert_mode(mode)
236
+ file.owner = owner
237
+ file
238
+ end
239
+ end
240
+ end
@@ -0,0 +1 @@
1
+ # Cupper config file
@@ -0,0 +1,9 @@
1
+ # Cookbook_file Session
2
+
3
+ <% for @cbf in @files %>
4
+ cookbook_file '<%= @cbf.path %>'
5
+ owner '<%= @cbf.owner %>'
6
+ group '<%= @cbf.group %>'
7
+ mode '<%= @cbf.mode %>'
8
+ end
9
+ <% end %>
@@ -0,0 +1,10 @@
1
+ # Group session
2
+
3
+ <% for @group in @groups %>
4
+ group '<%= @group.name%>' do
5
+ action :create
6
+ gid '<%= @group.gid%>'
7
+ members <%= @group.members%>
8
+ append true
9
+ end
10
+ <% end %>
@@ -0,0 +1,10 @@
1
+ # Links Session
2
+
3
+ <% for @link in @links %>
4
+ link '<%= @link.target_file %>' do
5
+ group '<%= @link.group %>'
6
+ mode '<%= @link.mode %>'
7
+ owner '<%= @link.owner %>'
8
+ to '<%= @link.to %>'
9
+ end
10
+ <% end %>