ldumbd 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
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: