imagemaster3000 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.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/.rspec +2 -0
- data/.rubocop.yml +38 -0
- data/.travis.yml +22 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +13 -0
- data/README.md +60 -0
- data/Rakefile +17 -0
- data/bin/imagemaster3000 +4 -0
- data/config/definitions/centos-7.json +29 -0
- data/config/definitions/debian-8.json +33 -0
- data/config/definitions/files/.gitkeep +0 -0
- data/config/definitions/files/centos-cloud.cfg +95 -0
- data/config/definitions/files/debian-cloud.cfg +101 -0
- data/config/definitions/files/serial-getty@ttyS0.service +35 -0
- data/config/definitions/files/ttyS0.conf +22 -0
- data/config/definitions/files/ubuntu-cloud.cfg +111 -0
- data/config/definitions/ubuntu-14.04.json +30 -0
- data/config/definitions/ubuntu-16.04.json +30 -0
- data/config/imagemaster3000.yml +15 -0
- data/imagemaster3000.gemspec +42 -0
- data/lib/imagemaster3000/actions/copy.rb +45 -0
- data/lib/imagemaster3000/actions/remove.rb +24 -0
- data/lib/imagemaster3000/actions.rb +6 -0
- data/lib/imagemaster3000/cli.rb +115 -0
- data/lib/imagemaster3000/definitions/parser.rb +45 -0
- data/lib/imagemaster3000/definitions/schemas/imagemaster3000-definition-schema.json +238 -0
- data/lib/imagemaster3000/definitions.rb +5 -0
- data/lib/imagemaster3000/entities/downloadable.rb +47 -0
- data/lib/imagemaster3000/entities/image.rb +92 -0
- data/lib/imagemaster3000/entities.rb +6 -0
- data/lib/imagemaster3000/errors/action_error.rb +5 -0
- data/lib/imagemaster3000/errors/argument_error.rb +5 -0
- data/lib/imagemaster3000/errors/command_execution_error.rb +5 -0
- data/lib/imagemaster3000/errors/download_error.rb +5 -0
- data/lib/imagemaster3000/errors/parsing_error.rb +5 -0
- data/lib/imagemaster3000/errors/standard_error.rb +5 -0
- data/lib/imagemaster3000/errors/verification_error.rb +5 -0
- data/lib/imagemaster3000/errors.rb +11 -0
- data/lib/imagemaster3000/image_list/generator.rb +25 -0
- data/lib/imagemaster3000/image_list/signer.rb +18 -0
- data/lib/imagemaster3000/image_list/templates/image_list.erb +41 -0
- data/lib/imagemaster3000/image_list.rb +6 -0
- data/lib/imagemaster3000/main_process.rb +22 -0
- data/lib/imagemaster3000/settings.rb +19 -0
- data/lib/imagemaster3000/utils/command_executioner.rb +22 -0
- data/lib/imagemaster3000/utils/crypto.rb +28 -0
- data/lib/imagemaster3000/utils/tmp.rb +24 -0
- data/lib/imagemaster3000/utils.rb +7 -0
- data/lib/imagemaster3000/verification/hash.rb +45 -0
- data/lib/imagemaster3000/verification/signatures/clearsign.rb +16 -0
- data/lib/imagemaster3000/verification/signatures/detached.rb +18 -0
- data/lib/imagemaster3000/verification/signatures.rb +8 -0
- data/lib/imagemaster3000/verification/verifiable.rb +10 -0
- data/lib/imagemaster3000/verification.rb +7 -0
- data/lib/imagemaster3000/version.rb +3 -0
- data/lib/imagemaster3000.rb +18 -0
- metadata +347 -0
@@ -0,0 +1,35 @@
|
|
1
|
+
# This file is part of systemd.
|
2
|
+
#
|
3
|
+
# systemd is free software; you can redistribute it and/or modify it
|
4
|
+
# under the terms of the GNU Lesser General Public License as published by
|
5
|
+
# the Free Software Foundation; either version 2.1 of the License, or
|
6
|
+
# (at your option) any later version.
|
7
|
+
|
8
|
+
[Unit]
|
9
|
+
Description=Serial Getty on %I
|
10
|
+
Documentation=man:agetty(8) man:systemd-getty-generator(8)
|
11
|
+
Documentation=http://0pointer.de/blog/projects/serial-console.html
|
12
|
+
BindsTo=dev-%i.device
|
13
|
+
After=dev-%i.device systemd-user-sessions.service plymouth-quit-wait.service
|
14
|
+
After=rc-local.service
|
15
|
+
|
16
|
+
# If additional gettys are spawned during boot then we should make
|
17
|
+
# sure that this is synchronized before getty.target, even though
|
18
|
+
# getty.target didn't actually pull it in.
|
19
|
+
Before=getty.target
|
20
|
+
IgnoreOnIsolate=yes
|
21
|
+
|
22
|
+
[Service]
|
23
|
+
ExecStart=-/sbin/agetty --autologin root --keep-baud 115200,38400,9600 %I $TERM
|
24
|
+
Type=idle
|
25
|
+
Restart=always
|
26
|
+
UtmpIdentifier=%I
|
27
|
+
TTYPath=/dev/%I
|
28
|
+
TTYReset=yes
|
29
|
+
TTYVHangup=yes
|
30
|
+
KillMode=process
|
31
|
+
IgnoreSIGPIPE=no
|
32
|
+
SendSIGHUP=yes
|
33
|
+
|
34
|
+
[Install]
|
35
|
+
WantedBy=getty.target
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# ttyS0 - getty
|
2
|
+
#
|
3
|
+
# This service maintains a getty on ttyS0 from the point the system is
|
4
|
+
# started until it is shut down again.
|
5
|
+
|
6
|
+
start on stopped rc RUNLEVEL=[2345] and (
|
7
|
+
not-container or
|
8
|
+
container CONTAINER=lxc or
|
9
|
+
container CONTAINER=lxc-libvirt)
|
10
|
+
|
11
|
+
stop on runlevel [!2345]
|
12
|
+
|
13
|
+
pre-start script
|
14
|
+
# getty will not be started if the serial console is not present
|
15
|
+
stty -F /dev/ttyS0 -a 2> /dev/null > /dev/null || { stop ; exit 0; }
|
16
|
+
end script
|
17
|
+
|
18
|
+
respawn
|
19
|
+
script
|
20
|
+
exec /sbin/getty --autologin root -L ttyS0 115200 vt102
|
21
|
+
end script
|
22
|
+
# CLOUD_IMG: This file was created/modified by the Cloud Image build process
|
@@ -0,0 +1,111 @@
|
|
1
|
+
# If this is set, 'root' will not be able to ssh in and they
|
2
|
+
# will get a message to login instead as the above $user (ubuntu)
|
3
|
+
disable_root: False
|
4
|
+
user: root
|
5
|
+
ssh_pwauth: False
|
6
|
+
ssh_deletekeys: True
|
7
|
+
ssh_genkeytypes: ['rsa', 'dsa']
|
8
|
+
ssh_svcname: sshd
|
9
|
+
|
10
|
+
# This will cause the set+update hostname module to not operate (if true)
|
11
|
+
preserve_hostname: false
|
12
|
+
cc_ready_cmd: ['/bin/true']
|
13
|
+
mount_default_fields: [~, ~, 'auto', 'defaults,nofail', '0', '2']
|
14
|
+
syslog_fix_perms: ~
|
15
|
+
manage_etc_hosts: True
|
16
|
+
|
17
|
+
# Update and upgrade system on first boot
|
18
|
+
apt_preserve_sources_list: True
|
19
|
+
package_update: True
|
20
|
+
package_upgrade: True
|
21
|
+
package_reboot_if_required: True
|
22
|
+
|
23
|
+
# work only with OpenNebula, use network based datasource,
|
24
|
+
# so that we can successfully resolve IPv4 based hostname
|
25
|
+
disable_ec2_metadata: True
|
26
|
+
datasource_list: ['OpenNebula']
|
27
|
+
datasource:
|
28
|
+
OpenNebula:
|
29
|
+
dsmode: net
|
30
|
+
|
31
|
+
# The modules that run in the 'init' stage
|
32
|
+
cloud_init_modules:
|
33
|
+
- migrator
|
34
|
+
- seed_random
|
35
|
+
- bootcmd
|
36
|
+
- write-files
|
37
|
+
- growpart
|
38
|
+
- resizefs
|
39
|
+
- set_hostname
|
40
|
+
- update_hostname
|
41
|
+
- update_etc_hosts
|
42
|
+
- ca-certs
|
43
|
+
- rsyslog
|
44
|
+
- users-groups
|
45
|
+
- ssh
|
46
|
+
|
47
|
+
# The modules that run in the 'config' stage
|
48
|
+
cloud_config_modules:
|
49
|
+
# Emit the cloud config ready event
|
50
|
+
# this can be used by upstart jobs for 'start on cloud-config'.
|
51
|
+
- emit_upstart
|
52
|
+
- disk_setup
|
53
|
+
- mounts
|
54
|
+
- ssh-import-id
|
55
|
+
- locale
|
56
|
+
- set-passwords
|
57
|
+
- grub-dpkg
|
58
|
+
- apt-pipelining
|
59
|
+
- apt-configure
|
60
|
+
- package-update-upgrade-install
|
61
|
+
- landscape
|
62
|
+
- timezone
|
63
|
+
- puppet
|
64
|
+
- chef
|
65
|
+
- salt-minion
|
66
|
+
- mcollective
|
67
|
+
- disable-ec2-metadata
|
68
|
+
- runcmd
|
69
|
+
- byobu
|
70
|
+
|
71
|
+
# The modules that run in the 'final' stage
|
72
|
+
cloud_final_modules:
|
73
|
+
- rightscale_userdata
|
74
|
+
- scripts-per-once
|
75
|
+
- scripts-per-boot
|
76
|
+
- scripts-per-instance
|
77
|
+
- scripts-user
|
78
|
+
- ssh-authkey-fingerprints
|
79
|
+
- keys-to-console
|
80
|
+
- phone-home
|
81
|
+
- final-message
|
82
|
+
- power-state-change
|
83
|
+
|
84
|
+
# System and/or distro specific settings
|
85
|
+
# (not accessible to handlers/transforms)
|
86
|
+
system_info:
|
87
|
+
# This will affect which distro class gets used
|
88
|
+
distro: ubuntu
|
89
|
+
# Other config here will be given to the distro class and/or path classes
|
90
|
+
paths:
|
91
|
+
cloud_dir: /var/lib/cloud/
|
92
|
+
templates_dir: /etc/cloud/templates/
|
93
|
+
upstart_dir: /etc/init/
|
94
|
+
package_mirrors:
|
95
|
+
- arches: [i386, amd64]
|
96
|
+
failsafe:
|
97
|
+
primary: http://archive.ubuntu.com/ubuntu
|
98
|
+
security: http://security.ubuntu.com/ubuntu
|
99
|
+
search:
|
100
|
+
primary:
|
101
|
+
- http://%(ec2_region)s.ec2.archive.ubuntu.com/ubuntu/
|
102
|
+
- http://%(availability_zone)s.clouds.archive.ubuntu.com/ubuntu/
|
103
|
+
- http://%(region)s.clouds.archive.ubuntu.com/ubuntu/
|
104
|
+
security: []
|
105
|
+
- arches: [armhf, armel, default]
|
106
|
+
failsafe:
|
107
|
+
primary: http://ports.ubuntu.com/ubuntu-ports
|
108
|
+
security: http://ports.ubuntu.com/ubuntu-ports
|
109
|
+
ssh_svcname: ssh
|
110
|
+
|
111
|
+
# vim:syntax=yaml
|
@@ -0,0 +1,30 @@
|
|
1
|
+
{
|
2
|
+
"name":"METACLOUD-Ubuntu-14.04-x86_64@metacloud-dukan",
|
3
|
+
"url":"https://cloud-images.ubuntu.com/trusty/current/trusty-server-cloudimg-amd64-disk1.img",
|
4
|
+
"verification":{
|
5
|
+
"signature":{
|
6
|
+
"detached":{
|
7
|
+
"signature":"https://cloud-images.ubuntu.com/trusty/current/SHA256SUMS.gpg",
|
8
|
+
"data":"https://cloud-images.ubuntu.com/trusty/current/SHA256SUMS"
|
9
|
+
}
|
10
|
+
},
|
11
|
+
"hash":{
|
12
|
+
"function":"SHA256"
|
13
|
+
}
|
14
|
+
},
|
15
|
+
"distribution":"Ubuntu",
|
16
|
+
"version":"14.04",
|
17
|
+
"actions":{
|
18
|
+
"copy":[
|
19
|
+
{
|
20
|
+
"source":"ubuntu-cloud.cfg",
|
21
|
+
"target":"/etc/cloud/",
|
22
|
+
"name":"cloud.cfg"
|
23
|
+
},
|
24
|
+
{
|
25
|
+
"source":"ttyS0.conf",
|
26
|
+
"target":"/etc/init/"
|
27
|
+
}
|
28
|
+
]
|
29
|
+
}
|
30
|
+
}
|
@@ -0,0 +1,30 @@
|
|
1
|
+
{
|
2
|
+
"name":"METACLOUD-Ubuntu-16.04-x86_64@metacloud-dukan",
|
3
|
+
"url":"https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-disk1.img",
|
4
|
+
"verification":{
|
5
|
+
"signature":{
|
6
|
+
"detached":{
|
7
|
+
"signature":"https://cloud-images.ubuntu.com/xenial/current/SHA256SUMS.gpg",
|
8
|
+
"data":"https://cloud-images.ubuntu.com/xenial/current/SHA256SUMS"
|
9
|
+
}
|
10
|
+
},
|
11
|
+
"hash":{
|
12
|
+
"function":"SHA256"
|
13
|
+
}
|
14
|
+
},
|
15
|
+
"distribution":"Ubuntu",
|
16
|
+
"version":"16.04",
|
17
|
+
"actions":{
|
18
|
+
"copy":[
|
19
|
+
{
|
20
|
+
"source":"ubuntu-cloud.cfg",
|
21
|
+
"target":"/etc/cloud/",
|
22
|
+
"name":"cloud.cfg"
|
23
|
+
},
|
24
|
+
{
|
25
|
+
"source":"serial-getty@ttyS0.service",
|
26
|
+
"target":"/etc/systemd/system/getty.target.wants/"
|
27
|
+
}
|
28
|
+
]
|
29
|
+
}
|
30
|
+
}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
imagemaster3000:
|
2
|
+
definitions-dir: # If set, definitions in this direcotry are used to download and modify images
|
3
|
+
image-dir: /var/spool/imagemaster3000/images/ # Directory where to temporarily store images
|
4
|
+
image-list: /var/spool/imagemaster3000/image-list/imagemaster3000.list # Name and path of generated image list
|
5
|
+
endpoint: http://localhost/ # Endpoint where image list will be available
|
6
|
+
certificate: /etc/grid-security/cert.pem # Certificate to sign image list with
|
7
|
+
key: /etc/grid-security/key.pem # Key to sign image list with
|
8
|
+
group: imagemaster3000 # Group, images will be uploaded to
|
9
|
+
binaries:
|
10
|
+
virt-copy-in: /usr/bin/virt-copy-in # Path to binary needed for 'copy' action
|
11
|
+
guestfish: /usr/bin/guestfish # Path to binary needed for 'remove' action
|
12
|
+
logging:
|
13
|
+
level: ERROR # Logging level
|
14
|
+
file: /var/log/imagemaster3000/imagemaster3000.log # File to write log to. To turn off file logging leave this field empty.
|
15
|
+
debug: false # Debug mode
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
lib = File.expand_path('../lib', __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
require 'imagemaster3000/version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |spec|
|
8
|
+
spec.name = 'imagemaster3000'
|
9
|
+
spec.version = Imagemaster3000::VERSION
|
10
|
+
spec.authors = ['Michal Kimle']
|
11
|
+
spec.email = ['kimle.michal@gmail.com']
|
12
|
+
|
13
|
+
spec.summary = 'Downloading and slight modification of cloud images'
|
14
|
+
spec.description = 'Downloading and slight modification of cloud images'
|
15
|
+
spec.homepage = 'https://github.com/Misenko/imagemaster3000'
|
16
|
+
spec.license = 'Apache License, Version 2.0'
|
17
|
+
|
18
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
19
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
20
|
+
spec.require_paths = ['lib']
|
21
|
+
|
22
|
+
spec.add_development_dependency 'bundler', '~> 1.15'
|
23
|
+
spec.add_development_dependency 'rake', '~> 12.0'
|
24
|
+
spec.add_development_dependency 'rspec', '~> 3.5'
|
25
|
+
spec.add_development_dependency 'rubocop', '~> 0.48'
|
26
|
+
spec.add_development_dependency 'rubocop-rspec', '~> 1.15'
|
27
|
+
spec.add_development_dependency 'simplecov', '~> 0.12'
|
28
|
+
spec.add_development_dependency 'pry', '~> 0.10'
|
29
|
+
spec.add_development_dependency 'vcr', '~> 3.0'
|
30
|
+
spec.add_development_dependency 'webmock', '~> 3.0'
|
31
|
+
|
32
|
+
spec.add_runtime_dependency 'thor', '~> 0.19'
|
33
|
+
spec.add_runtime_dependency 'yell', '~> 2.0'
|
34
|
+
spec.add_runtime_dependency 'settingslogic', '~> 2.0'
|
35
|
+
spec.add_runtime_dependency 'activesupport', '>= 4.0', '< 6.0'
|
36
|
+
spec.add_runtime_dependency 'tilt', '~> 2.0'
|
37
|
+
spec.add_runtime_dependency 'gpgme', '~> 2.0'
|
38
|
+
spec.add_runtime_dependency 'mixlib-shellout', '~> 2.2'
|
39
|
+
spec.add_runtime_dependency 'json-schema', '~> 2.8'
|
40
|
+
|
41
|
+
spec.required_ruby_version = '>= 2.2.0'
|
42
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Imagemaster3000
|
2
|
+
module Actions
|
3
|
+
class Copy
|
4
|
+
attr_accessor :filename, :source, :target, :name
|
5
|
+
|
6
|
+
def initialize(source: nil, target: nil, name: nil)
|
7
|
+
raise Imagemaster3000::Errors::ArgumentError, 'neither source nor target can be nil' if source.empty? || target.empty?
|
8
|
+
|
9
|
+
@filename = source
|
10
|
+
@source = File.join(Imagemaster3000::Settings[:'definitions-dir'], 'files', source)
|
11
|
+
@target = target
|
12
|
+
@name = name
|
13
|
+
logger.debug "Created action #{inspect}"
|
14
|
+
end
|
15
|
+
|
16
|
+
def run(image_file)
|
17
|
+
logger.debug "Running 'copy' action with source #{source.inspect} and target #{target.inspect} on file #{image_file.inspect}"
|
18
|
+
copy image_file
|
19
|
+
rename image_file if name
|
20
|
+
rescue Imagemaster3000::Errors::CommandExecutionError => ex
|
21
|
+
raise Imagemaster3000::Errors::ActionError, ex
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def copy(image_file)
|
27
|
+
Imagemaster3000::Utils::CommandExecutioner.execute Imagemaster3000::Settings[:'binaries-virt-copy-in'],
|
28
|
+
'-a',
|
29
|
+
image_file,
|
30
|
+
source,
|
31
|
+
target
|
32
|
+
end
|
33
|
+
|
34
|
+
def rename(image_file)
|
35
|
+
Imagemaster3000::Utils::CommandExecutioner.execute Imagemaster3000::Settings[:'binaries-guestfish'],
|
36
|
+
'-a',
|
37
|
+
image_file,
|
38
|
+
'-i',
|
39
|
+
'mv',
|
40
|
+
File.join(target, filename),
|
41
|
+
File.join(target, name)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Imagemaster3000
|
2
|
+
module Actions
|
3
|
+
class Remove
|
4
|
+
attr_accessor :file
|
5
|
+
|
6
|
+
def initialize(file)
|
7
|
+
@file = file
|
8
|
+
logger.debug "Created action #{inspect}"
|
9
|
+
end
|
10
|
+
|
11
|
+
def run(image_file)
|
12
|
+
logger.debug "Running 'remove' action with argument #{file.inspect} on file #{image_file.inspect}"
|
13
|
+
Imagemaster3000::Utils::CommandExecutioner.execute Imagemaster3000::Settings[:'binaries-guestfish'],
|
14
|
+
'-a',
|
15
|
+
image_file,
|
16
|
+
'-i',
|
17
|
+
'rm',
|
18
|
+
file
|
19
|
+
rescue Imagemaster3000::Errors::CommandExecutionError => ex
|
20
|
+
raise Imagemaster3000::Errors::ActionError, ex
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'yell'
|
3
|
+
|
4
|
+
module Imagemaster3000
|
5
|
+
class CLI < Thor
|
6
|
+
class_option :'logging-level',
|
7
|
+
required: true,
|
8
|
+
default: Imagemaster3000::Settings['logging']['level'],
|
9
|
+
type: :string,
|
10
|
+
enum: Yell::Severities
|
11
|
+
class_option :'logging-file',
|
12
|
+
default: Imagemaster3000::Settings['logging']['file'],
|
13
|
+
type: :string,
|
14
|
+
desc: 'File to write logs to'
|
15
|
+
class_option :debug,
|
16
|
+
default: Imagemaster3000::Settings['debug'],
|
17
|
+
type: :boolean,
|
18
|
+
desc: 'Runs in debug mode'
|
19
|
+
|
20
|
+
method_option :'definitions-dir',
|
21
|
+
default: Imagemaster3000::Settings['definitions-dir'],
|
22
|
+
type: :string,
|
23
|
+
desc: 'If set, definitions in this direcotry are used to download and modify images'
|
24
|
+
method_option :'image-dir',
|
25
|
+
default: Imagemaster3000::Settings['image-dir'],
|
26
|
+
type: :string,
|
27
|
+
required: true,
|
28
|
+
desc: 'Directory where to temporarily store images'
|
29
|
+
method_option :group,
|
30
|
+
required: true,
|
31
|
+
default: Imagemaster3000::Settings['group'],
|
32
|
+
type: :string,
|
33
|
+
desc: 'Group, images will be uploaded to'
|
34
|
+
method_option :'image-list',
|
35
|
+
required: true,
|
36
|
+
default: Imagemaster3000::Settings['image-list'],
|
37
|
+
type: :string,
|
38
|
+
desc: 'Name and path of generated image list'
|
39
|
+
method_option :endpoint,
|
40
|
+
required: true,
|
41
|
+
default: Imagemaster3000::Settings['endpoint'],
|
42
|
+
type: :string,
|
43
|
+
desc: 'Endpoint where image list will be available'
|
44
|
+
method_option :certificate,
|
45
|
+
required: true,
|
46
|
+
default: Imagemaster3000::Settings['certificate'],
|
47
|
+
type: :string,
|
48
|
+
desc: 'Certificate to sign image list with'
|
49
|
+
method_option :key,
|
50
|
+
required: true,
|
51
|
+
default: Imagemaster3000::Settings['key'],
|
52
|
+
type: :string,
|
53
|
+
desc: 'Key to sign image list with'
|
54
|
+
method_option :'binaries-virt-copy-in',
|
55
|
+
required: true,
|
56
|
+
default: Imagemaster3000::Settings['binaries']['virt-copy-in'],
|
57
|
+
type: :string,
|
58
|
+
desc: 'Path to binary needed for \'copy\' action'
|
59
|
+
method_option :'binaries-guestfish',
|
60
|
+
required: true,
|
61
|
+
default: Imagemaster3000::Settings['binaries']['guestfish'],
|
62
|
+
type: :string,
|
63
|
+
desc: 'Path to binary needed for \'remove\' action'
|
64
|
+
|
65
|
+
desc 'start', 'Downloads images and generates image list'
|
66
|
+
def start
|
67
|
+
initialize_configuration options
|
68
|
+
initialize_logger
|
69
|
+
logger.debug "Imagemaster3000 'start' called with parameters: #{Imagemaster3000::Settings.to_hash.inspect}"
|
70
|
+
|
71
|
+
Imagemaster3000::MainProcess.new.run
|
72
|
+
end
|
73
|
+
|
74
|
+
desc 'version', 'Prints imagemaster3000 version'
|
75
|
+
def version
|
76
|
+
$stdout.puts Imagemaster3000::VERSION
|
77
|
+
end
|
78
|
+
|
79
|
+
default_task :start
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
def initialize_configuration(options)
|
84
|
+
Imagemaster3000::Settings.clear
|
85
|
+
Imagemaster3000::Settings.merge! options.to_hash
|
86
|
+
|
87
|
+
gem_dir = File.realdirpath(File.join(File.dirname(__FILE__), '..', '..'))
|
88
|
+
Imagemaster3000::Settings[:'definitions-dir'] = File.join(gem_dir, 'config', 'definitions') \
|
89
|
+
unless Imagemaster3000::Settings[:'definitions-dir']
|
90
|
+
end
|
91
|
+
|
92
|
+
def initialize_logger
|
93
|
+
Imagemaster3000::Settings[:'logging-level'] = 'DEBUG' if Imagemaster3000::Settings[:debug]
|
94
|
+
|
95
|
+
logging_file = Imagemaster3000::Settings[:'logging-file']
|
96
|
+
logging_level = Imagemaster3000::Settings[:'logging-level']
|
97
|
+
|
98
|
+
Yell.new :stdout, name: Object, level: logging_level.downcase, format: Yell::DefaultFormat
|
99
|
+
Object.send :include, Yell::Loggable
|
100
|
+
|
101
|
+
setup_file_logger(logging_file) if logging_file
|
102
|
+
|
103
|
+
logger.debug 'Running in debug mode...'
|
104
|
+
end
|
105
|
+
|
106
|
+
def setup_file_logger(logging_file)
|
107
|
+
unless (File.exist?(logging_file) && File.writable?(logging_file)) || File.writable?(File.dirname(logging_file))
|
108
|
+
logger.error "File #{logging_file} isn't writable"
|
109
|
+
return
|
110
|
+
end
|
111
|
+
|
112
|
+
logger.adapter :file, logging_file
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|