profig 0.01 → 0.02
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.
- data/lib/profig/config.rb +65 -14
- data/lib/profig/linux.rb +20 -8
- data/lib/profig/main.rb +23 -18
- data/lib/profig/ubuntu.rb +4 -0
- metadata +5 -5
data/lib/profig/config.rb
CHANGED
@@ -3,30 +3,40 @@ require 'yaml'
|
|
3
3
|
module Profig
|
4
4
|
|
5
5
|
|
6
|
-
|
6
|
+
# An individual piece of configuration
|
7
|
+
class Item
|
7
8
|
attr_reader :name
|
8
9
|
attr_reader :opts
|
10
|
+
|
11
|
+
def initialize(name, opts)
|
12
|
+
@name = name
|
13
|
+
@opts = opts
|
14
|
+
end
|
9
15
|
end
|
10
16
|
|
17
|
+
# A group of configuration items that are of the same type and should
|
18
|
+
# be handled at the same time
|
19
|
+
class Section
|
20
|
+
attr_reader :type
|
21
|
+
attr_reader :items
|
11
22
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
merge[name] = items
|
21
|
-
end
|
23
|
+
def initialize(type)
|
24
|
+
@type = type
|
25
|
+
@items = []
|
26
|
+
end
|
27
|
+
|
28
|
+
def <<(item)
|
29
|
+
if not item.instance_of? Item
|
30
|
+
raise 'Unknown item type'
|
22
31
|
end
|
32
|
+
@items << item
|
23
33
|
end
|
24
|
-
return merge
|
25
34
|
end
|
26
35
|
|
27
36
|
|
28
37
|
def self.load_config_yaml(directory)
|
29
|
-
|
38
|
+
# do a stable ordering by alphabetical
|
39
|
+
files = Dir.glob("#{directory}/*").sort
|
30
40
|
confs = []
|
31
41
|
files.each do |f|
|
32
42
|
if File.file?(f)
|
@@ -37,9 +47,50 @@ def self.load_config_yaml(directory)
|
|
37
47
|
end
|
38
48
|
|
39
49
|
|
50
|
+
def self.yaml_items(yitems)
|
51
|
+
yitems.each do |item|
|
52
|
+
if item.instance_of? String
|
53
|
+
name = item
|
54
|
+
opts = nil
|
55
|
+
else
|
56
|
+
name = item.keys[0]
|
57
|
+
opts = item[name]
|
58
|
+
end
|
59
|
+
yield name, opts
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.yaml_sections(yaml)
|
64
|
+
yaml.each do |doc|
|
65
|
+
if not doc.has_key? 'profig'
|
66
|
+
raise 'Invalid configuration format'
|
67
|
+
end
|
68
|
+
|
69
|
+
doc['profig'].each do |yaml_section|
|
70
|
+
type = yaml_section.keys[0]
|
71
|
+
items = yaml_section[type]
|
72
|
+
yield type, items
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.yaml_to_sections(yaml)
|
78
|
+
section_acc = []
|
79
|
+
yaml_sections(yaml) do |type, yitems|
|
80
|
+
section = Section.new(type)
|
81
|
+
yaml_items(yitems) do |name, opts|
|
82
|
+
section << Item.new(name, opts).freeze
|
83
|
+
end
|
84
|
+
section.freeze
|
85
|
+
section_acc << section
|
86
|
+
end
|
87
|
+
return section_acc
|
88
|
+
end
|
89
|
+
|
90
|
+
|
40
91
|
def self.load_config(directory)
|
41
92
|
confs = load_config_yaml(directory)
|
42
|
-
return
|
93
|
+
return yaml_to_sections(confs)
|
43
94
|
end
|
44
95
|
|
45
96
|
|
data/lib/profig/linux.rb
CHANGED
@@ -4,20 +4,32 @@ require 'fileutils'
|
|
4
4
|
module Profig
|
5
5
|
|
6
6
|
|
7
|
+
def self.handle_linux_file(name, opts)
|
8
|
+
src = opts['source']
|
9
|
+
owner, group = split_owner(opts['owner'])
|
10
|
+
mode = opts['mode']
|
11
|
+
|
12
|
+
FileUtils.copy(src, name)
|
13
|
+
FileUtils.chown(owner, group, name)
|
14
|
+
FileUtils.chmod(mode, name) if mode
|
15
|
+
end
|
16
|
+
|
17
|
+
|
7
18
|
def self.handle_linux_dir(name, opts)
|
19
|
+
owner, group = split_owner(opts['owner'])
|
20
|
+
mode = opts['mode']
|
21
|
+
|
8
22
|
FileUtils.mkdir_p(name)
|
9
|
-
|
10
|
-
|
11
|
-
FileUtils.chown(owner, group, name)
|
12
|
-
end
|
13
|
-
if opts.has_key? 'mode'
|
14
|
-
mode = opts['mode']
|
15
|
-
FileUtils.chmod(mode, name)
|
16
|
-
end
|
23
|
+
FileUtils.chown(owner, group, name)
|
24
|
+
FileUtils.chmod(mode, name) if mode
|
17
25
|
end
|
18
26
|
|
19
27
|
|
20
28
|
def self.split_owner(owner_str)
|
29
|
+
if owner_str.nil?
|
30
|
+
return nil, nil
|
31
|
+
end
|
32
|
+
|
21
33
|
split_owner = owner_str.split(':')
|
22
34
|
owner, group = nil, nil
|
23
35
|
if split_owner.length == 1
|
data/lib/profig/main.rb
CHANGED
@@ -4,21 +4,15 @@ require 'profig/ubuntu'
|
|
4
4
|
module Profig
|
5
5
|
|
6
6
|
|
7
|
-
|
7
|
+
# Run all items one at a time
|
8
|
+
def self.run_item_handler(handler, items)
|
8
9
|
items.each do |i|
|
9
|
-
|
10
|
-
name = i
|
11
|
-
opts = nil
|
12
|
-
else
|
13
|
-
name = i.keys[0]
|
14
|
-
opts = i[name]
|
15
|
-
end
|
16
|
-
handler.call(name, opts)
|
10
|
+
handler.call(i.name, i.opts)
|
17
11
|
end
|
18
12
|
end
|
19
13
|
|
20
14
|
|
21
|
-
def self.run(os,
|
15
|
+
def self.run(os, sections)
|
22
16
|
users_groups = `id -G`.split()
|
23
17
|
if not users_groups.include? "0"
|
24
18
|
# this should be made an exception at some point
|
@@ -26,16 +20,27 @@ def self.run(os, config)
|
|
26
20
|
exit
|
27
21
|
end
|
28
22
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
23
|
+
sections.each do |section|
|
24
|
+
type = section.type
|
25
|
+
section_handler_name = "handle_#{type}_section_for_#{os}"
|
26
|
+
#item_handler_name = "handle_#{type}_item_for_#{os}"
|
27
|
+
item_handler_name = "handle_#{os}_#{type}"
|
28
|
+
|
29
|
+
# first check if there's a section handler for this type
|
30
|
+
# a section handler takes all items at once
|
31
|
+
if Profig.respond_to? section_handler_name
|
32
|
+
handler = method(section_handler_name)
|
33
|
+
handler.call(section.items)
|
34
|
+
# second, check if tere's a handler for individual items
|
35
|
+
# this type of handler will process items one at a time
|
36
|
+
elsif Profig.respond_to? item_handler_name
|
37
|
+
handler = method(item_handler_name)
|
38
|
+
run_item_handler(handler, section.items)
|
39
|
+
# if no handlers, complain about it and move on
|
40
|
+
else
|
41
|
+
puts "No #{type} handlers for #{os}"
|
34
42
|
next
|
35
43
|
end
|
36
|
-
|
37
|
-
handler = method(handler_name)
|
38
|
-
run_handler(handler, items)
|
39
44
|
end
|
40
45
|
end
|
41
46
|
|
data/lib/profig/ubuntu.rb
CHANGED
metadata
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: profig
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: "0.
|
8
|
+
- 2
|
9
|
+
version: "0.02"
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Matthew Graham
|
@@ -18,7 +18,7 @@ date: 2010-09-23 00:00:00 -04:00
|
|
18
18
|
default_executable:
|
19
19
|
dependencies: []
|
20
20
|
|
21
|
-
description:
|
21
|
+
description: A YAML-based system configuration manager with no central server
|
22
22
|
email:
|
23
23
|
- mdg149@gmail.com
|
24
24
|
executables:
|
@@ -67,6 +67,6 @@ rubyforge_project:
|
|
67
67
|
rubygems_version: 1.3.7
|
68
68
|
signing_key:
|
69
69
|
specification_version: 3
|
70
|
-
summary:
|
70
|
+
summary: A YAML-based system configuration manager
|
71
71
|
test_files: []
|
72
72
|
|