uberinstaller 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. data/.gitignore +20 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +66 -0
  5. data/Rakefile +7 -0
  6. data/TODO +14 -0
  7. data/bin/uberinstaller +6 -0
  8. data/lib/uberinstaller.rb +24 -0
  9. data/lib/uberinstaller/cli.rb +51 -0
  10. data/lib/uberinstaller/commander.rb +112 -0
  11. data/lib/uberinstaller/config.rb +55 -0
  12. data/lib/uberinstaller/exception.rb +40 -0
  13. data/lib/uberinstaller/exceptions/command_not_processable.rb +13 -0
  14. data/lib/uberinstaller/exceptions/invalid_folder.rb +13 -0
  15. data/lib/uberinstaller/exceptions/invalid_json.rb +13 -0
  16. data/lib/uberinstaller/exceptions/invalid_local_package.rb +13 -0
  17. data/lib/uberinstaller/exceptions/invalid_package.rb +13 -0
  18. data/lib/uberinstaller/exceptions/invalid_ppa.rb +13 -0
  19. data/lib/uberinstaller/exceptions/invalid_url.rb +13 -0
  20. data/lib/uberinstaller/exceptions/json_file_not_found.rb +13 -0
  21. data/lib/uberinstaller/exceptions/json_parse_error.rb +13 -0
  22. data/lib/uberinstaller/exceptions/missing_local_package.rb +13 -0
  23. data/lib/uberinstaller/exceptions/missing_url.rb +13 -0
  24. data/lib/uberinstaller/exceptions/multiple_local_files_not_supported.rb +13 -0
  25. data/lib/uberinstaller/exceptions/multiple_repositories_not_supported.rb +13 -0
  26. data/lib/uberinstaller/exceptions/no_preprocessor_exception.rb +13 -0
  27. data/lib/uberinstaller/exceptions/parser_argument_error.rb +13 -0
  28. data/lib/uberinstaller/exceptions/wrong_architecture.rb +13 -0
  29. data/lib/uberinstaller/exceptions/wrong_version.rb +13 -0
  30. data/lib/uberinstaller/installer.rb +284 -0
  31. data/lib/uberinstaller/logger.rb +113 -0
  32. data/lib/uberinstaller/package_manager.rb +27 -0
  33. data/lib/uberinstaller/package_managers/apt.rb +18 -0
  34. data/lib/uberinstaller/package_managers/base.rb +87 -0
  35. data/lib/uberinstaller/package_managers/dpkg.rb +15 -0
  36. data/lib/uberinstaller/package_managers/git.rb +15 -0
  37. data/lib/uberinstaller/parser.rb +51 -0
  38. data/lib/uberinstaller/platform.rb +103 -0
  39. data/lib/uberinstaller/runner.rb +218 -0
  40. data/lib/uberinstaller/utils.rb +13 -0
  41. data/lib/uberinstaller/version.rb +3 -0
  42. data/uberinstaller.gemspec +35 -0
  43. metadata +243 -0
@@ -0,0 +1,13 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Uberinstaller
4
+ module Exception
5
+
6
+ # When package with :type => :git has no :folder
7
+ class InvalidFolder < Exception
8
+ def initialize(name)
9
+ super "#{name} :folder attribute invalid or missing", false
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Uberinstaller
4
+ module Exception
5
+
6
+ # When package with :type => :git :url attribute does not respond 200 http status on check
7
+ class InvalidJson < Exception
8
+ def initialize(name)
9
+ super "#{name} :json seems to not be a valid string, please check", false
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Uberinstaller
4
+ module Exception
5
+
6
+ # When package with :type => :local :pkg is not valid
7
+ class InvalidLocalPackage < Exception
8
+ def initialize(name)
9
+ super "#{name} :pkg seems not to be a valid local package", false
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Uberinstaller
4
+ module Exception
5
+
6
+ # When package with :type => system has no :pkg specified
7
+ class InvalidPackage < Exception
8
+ def initialize(name)
9
+ super "#{name} has a system installation but invalid :pkg is specified, skipping", false
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Uberinstaller
4
+ module Exception
5
+
6
+ # When package with :type => system has an invalid :ppa
7
+ class InvalidPpa < Exception
8
+ def initialize(name)
9
+ super "#{name} has an invalid ppa, skipping", false
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Uberinstaller
4
+ module Exception
5
+
6
+ # When package with :type => :git :url attribute does not respond 200 http status on check
7
+ class InvalidUrl < Exception
8
+ def initialize(name)
9
+ super "#{name} :url seems to not be a valid repo, please check", false
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Uberinstaller
4
+ module Exception
5
+
6
+ # Error when parsing JSON file
7
+ class JsonFileNotFound < Exception
8
+ def initialize(file)
9
+ super "#{file} can't be found in the correct path"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Uberinstaller
4
+ module Exception
5
+
6
+ # Error when parsing JSON file
7
+ class JsonParseError < Exception
8
+ def initialize(file)
9
+ super "#{file} cannot be parsed as is not valid JSON"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Uberinstaller
4
+ module Exception
5
+
6
+ # When package with :type => :local has no :pkg attribute
7
+ class MissingLocalPackage < Exception
8
+ def initialize(name)
9
+ super "#{name} :pkg seems not to be a valid local package", false
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Uberinstaller
4
+ module Exception
5
+
6
+ # When package with :type => :git has no :url
7
+ class MissingUrl < Exception
8
+ def initialize(name)
9
+ super "#{name} :url attribute is missing", false
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Uberinstaller
4
+ module Exception
5
+
6
+ # When :url for a :type => :git package is not a String
7
+ class MultipleLocalFilesNotSupported < Exception
8
+ def initialize()
9
+ super "Specify multiple local packages for one package is not supported"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Uberinstaller
4
+ module Exception
5
+
6
+ # When :url for a :type => :git package is not a String
7
+ class MultipleRepositoriesNotSupported < Exception
8
+ def initialize(name)
9
+ super "Specify multiple git repositories for one package is not supported"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Uberinstaller
4
+ module Exception
5
+
6
+ # When package with :type => system has no :pkg specified
7
+ class NoPreprocessorException < Exception
8
+ def initialize(name)
9
+ super "Does not exist a valid preprocessor for #{name} type", false
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Uberinstaller
4
+ module Exception
5
+
6
+ # Error when file passed to JSON parser does not exists
7
+ class ParserArgumentError < Exception
8
+ def initialize(file)
9
+ super "Cannot find #{file}, probably a mistyped path?"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Uberinstaller
4
+ module Exception
5
+
6
+ # Architecture in JSON file different from current OS
7
+ class WrongArchitecture < Exception
8
+ def initialize(arch)
9
+ super "Installation file requires #{arch} architecture"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Uberinstaller
4
+ module Exception
5
+
6
+ # OS version in JSON file different from current OS version ( by codename or number )
7
+ class WrongVersion < Exception
8
+ def initialize(version)
9
+ super "Installation file requires a different version. Version required: #{version}"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,284 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'uberinstaller/logger'
4
+ require 'uberinstaller/config'
5
+ require 'uberinstaller/exception'
6
+ require 'uberinstaller/package_manager'
7
+
8
+ require 'octokit'
9
+
10
+ module Uberinstaller
11
+ class Installer
12
+ include Loggable
13
+
14
+ # Initialize the class
15
+ #
16
+ # @param pkg_name [String] the name of the package
17
+ # @param pkg_body [Hash] an Hash containing the parsed information for the package
18
+ def initialize(pkg_name, pkg_body)
19
+ @name = pkg_name
20
+ @body = pkg_body
21
+
22
+ # an Hash containing private processing info for the class
23
+ @meta = Hash.new
24
+ @meta[:installable] = true
25
+
26
+ if @body.has_key? :skip and @body[:skip]
27
+ logger.warn "#{@name} has :skip option active, skipping "
28
+ end
29
+ end
30
+
31
+ # Return if the package is installable
32
+ #
33
+ # @return [bool] true if the package can be installed, false otherwise
34
+ def installable?
35
+ @body[:skip] ? false : true
36
+ end
37
+
38
+ # Perform package validation based upon installation type
39
+ #
40
+ # @param type [String] the installation type
41
+ def validate(type)
42
+ case type
43
+ when 'system' then validate_system
44
+ when 'git' then validate_git
45
+ when 'local' then validate_local
46
+ when 'json' then validate_json
47
+ end
48
+ end
49
+
50
+ # Perform package installation based upon installation type, only if installable? is true
51
+ #
52
+ # @param type [String] the installation type
53
+ def install(type)
54
+ return unless installable?
55
+
56
+ case type
57
+ when 'git' then install_git
58
+ when 'local' then install_local
59
+ when 'system' then install_system
60
+ end
61
+ end
62
+
63
+ # Perform package preprocessing based upon installation type, only if installable? is true
64
+ #
65
+ # @param type [String] the installation type
66
+ def preprocess(type)
67
+ return unless installable?
68
+
69
+ case type
70
+ when 'git' then preprocess_git
71
+ when 'local' then preprocess_local
72
+ when 'system' then preprocess_system
73
+ when 'json' then preprocess_json
74
+ else raise Exception::NoPreprocessorException, type
75
+ end
76
+ end
77
+
78
+ private
79
+
80
+ # The remote package manager object
81
+ #
82
+ # @return [Object] an instance of a PackageManager
83
+ def remote_package_manager
84
+ @remote_package_manager ||= PackageManager.new 'remote'
85
+ end
86
+
87
+ # The local package manager object
88
+ #
89
+ # @return [Object] an instance of a PackageManager
90
+ def local_package_manager
91
+ @local_package_manager ||= PackageManager.new 'local'
92
+ end
93
+
94
+ # The git package manager object
95
+ #
96
+ # @return [Object] an instance of a PackageManager
97
+ def git_package_manager
98
+ @git_package_manager ||= PackageManager.new 'git'
99
+ end
100
+
101
+ # Install a package using the system package manager
102
+ def install_system
103
+ logger.debug 'Sytem type installation'
104
+
105
+ if @body[:system][:pkg].kind_of?(Array)
106
+ @body[:system][:pkg].each { |pkg| remote_package_manager.install pkg }
107
+ elsif @body[:system][:pkg].kind_of?(String)
108
+ remote_package_manager.install @body[:system][:pkg]
109
+ end
110
+ end
111
+
112
+ # Preprocess a system type package.
113
+ #
114
+ # Launch validation and on success add the ppa to the system, if any
115
+ def preprocess_system
116
+ logger.debug 'Sytem type preprocess'
117
+
118
+ begin
119
+ validate 'system'
120
+ rescue Exception => e
121
+ @body[:skip] = true
122
+ raise e
123
+ else
124
+ remote_package_manager.add_repository @body[:system][:ppa] if @body[:system].has_key? :ppa
125
+ end
126
+ end
127
+
128
+ # Validate a system type package
129
+ #
130
+ # Check if package has a :pkg key and if if is valid; check if package has a :ppa key and perform validation on the ppa string.
131
+ #
132
+ # @raise [Uberinstaller::Exception::InvalidPackage] if the package is not valid
133
+ # @raise [Uberinstaller::Exception::InvalidPpa] if the ppa is not valid
134
+ def validate_system
135
+ logger.debug 'Sytem type validation'
136
+
137
+ if !@body[:system].has_key? :pkg or !valid_pkg?
138
+ raise Uberinstaller::Exception::InvalidPackage, @name
139
+ end
140
+
141
+ if @body[:system].has_key? :ppa
142
+ raise Uberinstaller::Exception::InvalidPpa, @name unless valid_repository? @body[:system][:ppa]
143
+ end
144
+ end
145
+
146
+ # Install a package using the Git package manager
147
+ def install_git
148
+ if @body[:git][:url].kind_of?(String)
149
+ git_package_manager.install @body[:git][:url] + " " + @body[:git][:folder]
150
+ else
151
+ raise Exception::MultipleRepositoriesNotSupported
152
+ end
153
+ end
154
+
155
+ # Preprocess a git type package
156
+ #
157
+ # Launch validation
158
+ def preprocess_git
159
+ logger.debug 'Git type preprocess'
160
+ begin
161
+ validate 'git'
162
+ rescue Exception => e
163
+ @body[:skip] = true
164
+ raise e
165
+ end
166
+ end
167
+
168
+ # Validate a git type package
169
+ #
170
+ # Check for :folder and :url keys and perform validation on :url
171
+ #
172
+ # @raise [Uberinstaller::Exception::InvalidFolder] if no :folder is specified
173
+ # @raise [Uberinstaller::Exception::MissingUrl] if no :url is specified
174
+ # @raise [Uberinstaller::Exception::Invalid] if :url is not a valid Github repository
175
+ def validate_git
176
+ logger.debug 'Git type validation'
177
+
178
+ if !@body[:git].has_key? :folder
179
+ raise Uberinstaller::Exception::InvalidFolder, @name
180
+ end
181
+
182
+ if !@body[:git].has_key? :url
183
+ raise Uberinstaller::Exception::MissingUrl, @name
184
+ # else
185
+ # repo_url = @body[:git][:url].split('github.com')[1].split('.git')[0]
186
+ # repo_url[0] = ''
187
+
188
+ # begin
189
+ # Octokit.repo repo_url
190
+ # rescue
191
+ # raise Uberinstaller::Exception::InvalidUrl, @name
192
+ # end
193
+ end
194
+ end
195
+
196
+ # Install a package using the Local package manager
197
+ def install_local
198
+ if @body[:local][:pkg].kind_of?(String)
199
+ if File.extname(@body[:local][:pkg]) == '.deb'
200
+ local_package_manager.install @body[:local][:pkg]
201
+ else
202
+ pkg_path = File.join Config.local_pkg_path, @body[:local][:pkg]
203
+ `sudo ./#{pkg_path}`
204
+ end
205
+ else
206
+ raise Exception::MultipleLocalFilesNotSupported
207
+ end
208
+ end
209
+
210
+ # Preprocess a local type package
211
+ #
212
+ # Launch validation
213
+ def preprocess_local
214
+ logger.debug 'Local type preprocess'
215
+ begin
216
+ validate 'local'
217
+ rescue Exception => e
218
+ @body[:skip] = true
219
+ raise e
220
+ end
221
+ end
222
+
223
+ # Validate local type package
224
+ #
225
+ # @raise [Uberinstaller::Exception::MissingLocalPackage] if the local package has no :pkg
226
+ # @raise [Uberinstaller::Exception::InvalidLocalPackage] if the local package has an invalid :pkg
227
+ def validate_local
228
+ logger.debug 'Local type validation'
229
+
230
+ if !@body[:local].has_key? :pkg
231
+ raise Exception::MissingLocalPackage, @name
232
+ else
233
+ raise Exception::InvalidLocalPackage, @name if !valid_local_pkg?
234
+ end
235
+ end
236
+
237
+ def preprocess_json
238
+ logger.debug 'JSON type validation'
239
+ validate 'json'
240
+ end
241
+
242
+ def validate_json
243
+ if @body[:json].kind_of? String
244
+ file = File.join Config::json_path, @body[:json] + '.json'
245
+ raise Exception::JsonFileNotFound, @body[:json] unless File.exists? file
246
+ else
247
+ raise Exception::InvalidJson, @name
248
+ end
249
+ end
250
+
251
+ ###
252
+
253
+ # Check if the string is a valid repository
254
+ #
255
+ # TODO: chack for repo, not only ppa
256
+ # @param repository [String] a valid string repository/PPA URL
257
+ #
258
+ # @return [bool] true if the string is a valid repository, false otherwise
259
+ def valid_repository?(repository)
260
+ logger.debug 'Validate repository'
261
+ repository =~ /ppa:[a-z0-9-]+(\/[a-z0-9-]+)?/
262
+ end
263
+
264
+ # Check if a system package is valid
265
+ #
266
+ # A package is valid when the :pkg key is a non-empty string or a non-empty array
267
+ #
268
+ # @return [bool] true if the package is valid, false otherwise
269
+ def valid_pkg?
270
+ logger.debug 'Validate :pkg'
271
+ !(@body[:system][:pkg].empty? or @body[:system][:pkg].any? { |a| a.empty? })
272
+ end
273
+
274
+ # Check if a local package is valid
275
+ #
276
+ # A local package is valid when :pkg key is a string corresponding to a existing file path
277
+ #
278
+ # @return [bool] true if the package is validw, false otherwise
279
+ def valid_local_pkg?
280
+ logger.debug 'Validate local pkg'
281
+ File.file?(File.join Uberinstaller::Config.local_pkg_path, @body[:local][:pkg])
282
+ end
283
+ end
284
+ end