ldumbd 0.1.1 → 0.1.2
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/NEWS +5 -0
- data/README.md +2 -0
- data/contrib/import-ldif-data.rb +131 -0
- data/ldumbd.gemspec +5 -4
- data/lib/ldumbd/version.rb +1 -1
- metadata +8 -23
data/NEWS
CHANGED
data/README.md
CHANGED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'sequel'
|
|
4
|
+
|
|
5
|
+
if ARGV.size != 3
|
|
6
|
+
program_name = File.basename($PROGRAM_NAME)
|
|
7
|
+
puts <<EOS
|
|
8
|
+
usage: #{program_name} USERFILE GROUPFILE DATABASE_URL
|
|
9
|
+
|
|
10
|
+
Examples:
|
|
11
|
+
#{program_name} users.ldif groups.ldif sqlite:///var/lib/ldumbd/ldumbd.sqlite3
|
|
12
|
+
#{program_name} users.ldif groups.ldif postgres://user:password@host:port/ldumbd
|
|
13
|
+
#{program_name} users.ldif groups.ldif mysql2://user:password@host:port/ldumbd
|
|
14
|
+
EOS
|
|
15
|
+
exit false
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
USER_FILE=ARGV[0]
|
|
19
|
+
GROUP_FILE=ARGV[1]
|
|
20
|
+
DATABASE_URL=ARGV[2]
|
|
21
|
+
|
|
22
|
+
def empty_line?(line)
|
|
23
|
+
line.empty? || line.start_with?('#')
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def attribute_value(ldif_line)
|
|
27
|
+
unless /\A(?<attribute>\w+):\s*(?<value>.*)\z/ =~ ldif_line
|
|
28
|
+
fail %Q{Invalid LDIF line: "#{ldif_line}"}
|
|
29
|
+
end
|
|
30
|
+
return attribute, value
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def ldif_hash(filename)
|
|
34
|
+
hash = {}
|
|
35
|
+
last_dn = nil
|
|
36
|
+
File.readlines(filename).each do |line|
|
|
37
|
+
line.chomp!
|
|
38
|
+
next if empty_line?(line)
|
|
39
|
+
|
|
40
|
+
attribute, value = attribute_value(line)
|
|
41
|
+
if attribute == 'dn'
|
|
42
|
+
last_dn = value
|
|
43
|
+
else
|
|
44
|
+
fail "Invalid DN" if last_dn.nil?
|
|
45
|
+
hash[last_dn] ||= {}
|
|
46
|
+
hash[last_dn][attribute] ||= []
|
|
47
|
+
hash[last_dn][attribute] << value
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
hash
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def users_from_ldif(user_file)
|
|
54
|
+
ldif_hash(user_file).map do |dn, avs|
|
|
55
|
+
{
|
|
56
|
+
id: avs['uidNumber'].first.to_i,
|
|
57
|
+
name: avs['uid'].first,
|
|
58
|
+
realname: avs['cn'].first,
|
|
59
|
+
shell: avs['loginShell'].first,
|
|
60
|
+
homedir: avs['homeDirectory'].first,
|
|
61
|
+
group_id: avs['gidNumber'].first.to_i,
|
|
62
|
+
# mail: avs['mail'].first
|
|
63
|
+
}
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def groups_from_ldif(group_file)
|
|
68
|
+
ldif_hash(group_file).map do |dn, avs|
|
|
69
|
+
{
|
|
70
|
+
name: avs['cn'].first,
|
|
71
|
+
id: avs['gidNumber'].first.to_i,
|
|
72
|
+
members: avs['memberUid'] || []
|
|
73
|
+
}
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def skip(reason)
|
|
78
|
+
$stderr.puts "#{reason}, skipping..."
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def add_groups(groups, database)
|
|
82
|
+
groups.each do |group|
|
|
83
|
+
puts %Q{Adding group "#{group[:name]}..."}
|
|
84
|
+
database[:groups].insert(group.reject { |k, v| k == :members })
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def add_users(users, database)
|
|
89
|
+
users.each do |user|
|
|
90
|
+
gid = user[:group_id]
|
|
91
|
+
name = user[:name]
|
|
92
|
+
unless database[:groups].where(id: gid).any?
|
|
93
|
+
skip %Q{Invalid gid #{gid} for user "#{name}"}
|
|
94
|
+
next
|
|
95
|
+
end
|
|
96
|
+
puts %Q{Adding user "#{name}"...}
|
|
97
|
+
database[:users].insert(user.reject { |k, v| k == :mail })
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def add_group_members(groups, database)
|
|
102
|
+
groups.each do |group|
|
|
103
|
+
group[:members].each do |member|
|
|
104
|
+
unless database[:users].where(name: member).any?
|
|
105
|
+
skip %Q{Invalid member "#{member}" for group "#{group[:name]}"}
|
|
106
|
+
next
|
|
107
|
+
end
|
|
108
|
+
uid = database[:users].where(name: member).first[:id]
|
|
109
|
+
gid = group[:id]
|
|
110
|
+
database[:groups_users].insert(group_id: gid, user_id: uid)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
begin
|
|
116
|
+
users = users_from_ldif(USER_FILE)
|
|
117
|
+
groups = groups_from_ldif(GROUP_FILE)
|
|
118
|
+
|
|
119
|
+
database = Sequel.connect(DATABASE_URL)
|
|
120
|
+
connected = database.test_connection
|
|
121
|
+
|
|
122
|
+
database.transaction do
|
|
123
|
+
add_groups(groups, database)
|
|
124
|
+
add_users(users, database)
|
|
125
|
+
add_group_members(groups, database)
|
|
126
|
+
end
|
|
127
|
+
rescue => e
|
|
128
|
+
$stderr.puts e
|
|
129
|
+
$stderr.puts 'Reverted database to previous state.' if connected
|
|
130
|
+
exit false
|
|
131
|
+
end
|
data/ldumbd.gemspec
CHANGED
|
@@ -26,17 +26,18 @@ EOS
|
|
|
26
26
|
'Rakefile',
|
|
27
27
|
'README.md',
|
|
28
28
|
'TODO.org',
|
|
29
|
-
'{bin,
|
|
29
|
+
'{bin,contrib,db,lib,spec}/**/*']
|
|
30
30
|
spec.executables = ['ldumbd']
|
|
31
31
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
32
32
|
|
|
33
|
+
spec.required_ruby_version = '>= 1.9.3'
|
|
34
|
+
|
|
33
35
|
spec.add_dependency 'ruby-ldapserver', '~> 0.5.0'
|
|
34
|
-
spec.add_dependency 'sequel', '~> 4.
|
|
36
|
+
spec.add_dependency 'sequel', '~> 4.8.0'
|
|
35
37
|
|
|
36
38
|
spec.add_development_dependency 'sqlite3', '~> 1.3.9'
|
|
37
39
|
spec.add_development_dependency 'pg', '~> 0.17.1'
|
|
38
40
|
spec.add_development_dependency 'mysql2', '~> 0.3.15'
|
|
39
|
-
spec.add_development_dependency 'rake', '~> 10.
|
|
40
|
-
spec.add_development_dependency 'net-ldap', '~> 0.3.1'
|
|
41
|
+
spec.add_development_dependency 'rake', '~> 10.1.1'
|
|
41
42
|
spec.add_development_dependency 'minitest', '~> 5.3.0'
|
|
42
43
|
end
|
data/lib/ldumbd/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ldumbd
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.2
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2014-03-
|
|
12
|
+
date: 2014-03-24 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: ruby-ldapserver
|
|
@@ -34,7 +34,7 @@ dependencies:
|
|
|
34
34
|
requirements:
|
|
35
35
|
- - ~>
|
|
36
36
|
- !ruby/object:Gem::Version
|
|
37
|
-
version: 4.
|
|
37
|
+
version: 4.8.0
|
|
38
38
|
type: :runtime
|
|
39
39
|
prerelease: false
|
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -42,7 +42,7 @@ dependencies:
|
|
|
42
42
|
requirements:
|
|
43
43
|
- - ~>
|
|
44
44
|
- !ruby/object:Gem::Version
|
|
45
|
-
version: 4.
|
|
45
|
+
version: 4.8.0
|
|
46
46
|
- !ruby/object:Gem::Dependency
|
|
47
47
|
name: sqlite3
|
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -98,7 +98,7 @@ dependencies:
|
|
|
98
98
|
requirements:
|
|
99
99
|
- - ~>
|
|
100
100
|
- !ruby/object:Gem::Version
|
|
101
|
-
version: 10.
|
|
101
|
+
version: 10.1.1
|
|
102
102
|
type: :development
|
|
103
103
|
prerelease: false
|
|
104
104
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -106,23 +106,7 @@ dependencies:
|
|
|
106
106
|
requirements:
|
|
107
107
|
- - ~>
|
|
108
108
|
- !ruby/object:Gem::Version
|
|
109
|
-
version: 10.
|
|
110
|
-
- !ruby/object:Gem::Dependency
|
|
111
|
-
name: net-ldap
|
|
112
|
-
requirement: !ruby/object:Gem::Requirement
|
|
113
|
-
none: false
|
|
114
|
-
requirements:
|
|
115
|
-
- - ~>
|
|
116
|
-
- !ruby/object:Gem::Version
|
|
117
|
-
version: 0.3.1
|
|
118
|
-
type: :development
|
|
119
|
-
prerelease: false
|
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
-
none: false
|
|
122
|
-
requirements:
|
|
123
|
-
- - ~>
|
|
124
|
-
- !ruby/object:Gem::Version
|
|
125
|
-
version: 0.3.1
|
|
109
|
+
version: 10.1.1
|
|
126
110
|
- !ruby/object:Gem::Dependency
|
|
127
111
|
name: minitest
|
|
128
112
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -158,6 +142,7 @@ files:
|
|
|
158
142
|
- TODO.org
|
|
159
143
|
- bin/ldumbd
|
|
160
144
|
- config.yml.sample
|
|
145
|
+
- contrib/import-ldif-data.rb
|
|
161
146
|
- db/migrations/001_create_users.rb
|
|
162
147
|
- db/migrations/002_create_groups.rb
|
|
163
148
|
- db/migrations/003_add_user_group_id.rb
|
|
@@ -189,7 +174,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
189
174
|
requirements:
|
|
190
175
|
- - ! '>='
|
|
191
176
|
- !ruby/object:Gem::Version
|
|
192
|
-
version:
|
|
177
|
+
version: 1.9.3
|
|
193
178
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
194
179
|
none: false
|
|
195
180
|
requirements:
|