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 CHANGED
@@ -1,4 +1,9 @@
1
1
  * ldumbd NEWS
2
+ ** 0.1.2 (2014-03-24)
3
+
4
+ - Add import-ldif-data.rb to contrib
5
+ - Update dependencies
6
+
2
7
  ** 0.1.1 (2014-03-21)
3
8
 
4
9
  - Require ldumbd/version in bin/ldumbd
data/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ [![Build Status](https://travis-ci.org/sometimesfood/ldumbd.svg?branch=master)](https://travis-ci.org/sometimesfood/ldumbd)
2
+
1
3
  ldumbd
2
4
  ======
3
5
 
@@ -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
@@ -26,17 +26,18 @@ EOS
26
26
  'Rakefile',
27
27
  'README.md',
28
28
  'TODO.org',
29
- '{bin,lib,db,spec}/**/*']
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.7.0'
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.0.4'
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
@@ -1,3 +1,3 @@
1
1
  module Ldumbd
2
- VERSION = '0.1.1'
2
+ VERSION = '0.1.2'
3
3
  end
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.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-21 00:00:00.000000000 Z
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.7.0
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.7.0
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.0.4
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.0.4
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: '0'
177
+ version: 1.9.3
193
178
  required_rubygems_version: !ruby/object:Gem::Requirement
194
179
  none: false
195
180
  requirements: