socialcast 1.0.0.beta1 → 1.0.0.beta3

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/config/ldap.yml ADDED
@@ -0,0 +1,44 @@
1
+ ---
2
+ # LDAP connection information
3
+ connections:
4
+ example_connection_1:
5
+ username: "cn=Directory Manager"
6
+ password: "password"
7
+ host: ldap.yourdomain.com
8
+ port: 389
9
+ basedn: "ou=smallpeople,ou=qa,dc=socialcast,dc=com"
10
+ filter: "(mail=*)"
11
+ example_connection_2:
12
+ username: "cn=Directory Manager"
13
+ password: "password"
14
+ host: ldap.yourdomain.com
15
+ port: 389
16
+ basedn: "ou=tinypeople,ou=qa,dc=yourdomain,dc=com"
17
+ filter: "(mail=*)"
18
+ example_encrypted_connection:
19
+ username: "cn=Directory Manager"
20
+ password: "password"
21
+ host: ldap.yourdomain.com
22
+ port: 389
23
+ basedn: "ou=largepeople,ou=qa,dc=yourdomain,dc=com"
24
+ filter: "(mail=*)"
25
+ encryption: simple_tls
26
+
27
+ # LDAP attribute mappings
28
+ mappings:
29
+ first_name: givenName
30
+ last_name: sn
31
+ email: mail
32
+ #only use employee_number if the email is unknown
33
+ #employee_number: emp_id
34
+ #only use unique_identifier if you do not wish to use email as the main user identification method
35
+ #unique_identifier: samaccountname
36
+
37
+ delete_users_file: false
38
+ # test being true implies that you wish to skip_emails
39
+ test: true
40
+ skip_emails: true
41
+
42
+ # (optional) http_proxy setting
43
+ # only needed if the script must connect to Socialcast through a proxy
44
+ # http_proxy: "http://username:password@proxy.company.com:3128"
data/lib/socialcast.rb CHANGED
@@ -20,4 +20,7 @@ module Socialcast
20
20
  raise 'Unknown Socialcast credentials. Run `socialcast authenticate` to initialize' unless File.exist?(credentials_file)
21
21
  YAML.load_file(credentials_file)
22
22
  end
23
+ def grab_value(entry)
24
+ entry.is_a?(Array) ? entry.first : entry
25
+ end
23
26
  end
@@ -5,11 +5,14 @@ require 'highline'
5
5
  require 'socialcast'
6
6
  require 'socialcast/message'
7
7
 
8
+ require 'zlib'
9
+ require 'builder'
10
+ require 'net/ldap'
11
+
8
12
  module Socialcast
9
13
  class CLI < Thor
10
14
  include Thor::Actions
11
15
  include Socialcast
12
- default_task :share
13
16
 
14
17
  desc "authenticate", "Authenticate using your Socialcast credentials"
15
18
  method_option :user, :type => :string, :aliases => '-u', :desc => 'email address for the authenticated user'
@@ -63,5 +66,95 @@ module Socialcast
63
66
 
64
67
  say "Message has been shared"
65
68
  end
69
+
70
+ desc 'provision', 'provision users from ldap compatible user repository'
71
+ method_option :setup, :default => false
72
+ method_option :config, :default => 'ldap.yml', :aliases => '-c'
73
+ method_option :output, :default => 'users.xml.gz', :aliases => '-o'
74
+ method_option :delete_users_file, :default => true
75
+ def provision
76
+ config_file = File.join Dir.pwd, options[:config]
77
+
78
+ if options[:setup]
79
+ create_file config_file do
80
+ File.read File.join(File.dirname(__FILE__), '..', '..', 'config', 'ldap.yml')
81
+ end
82
+ return
83
+ end
84
+
85
+ config = YAML.load_file config_file
86
+ required_mappings = %w{email first_name last_name}
87
+ required_mappings.each do |field|
88
+ unless config["mappings"].has_key? field
89
+ fail "Missing required mapping: #{field}"
90
+ end
91
+ end
92
+
93
+ output_file = File.join Dir.pwd, options[:output]
94
+ Zlib::GzipWriter.open(output_file) do |gz|
95
+ xml = Builder::XmlMarkup.new(:target => gz, :indent => 1)
96
+ xml.instruct!
97
+ xml.export do |export|
98
+ export.users(:type => "array") do |users|
99
+ config["connections"].each_pair do |key, connection|
100
+ say "Connecting to #{key} at #{[connection["host"], connection["port"]].join(':')} with filter #{connection["basedn"]}"
101
+
102
+ ldap = Net::LDAP.new :host => connection["host"], :port => connection["port"], :base => connection["basedn"]
103
+ ldap.encryption connection['encryption'].to_sym if connection['encryption']
104
+ ldap.auth connection["username"], connection["password"]
105
+ say "Connected"
106
+ say "Searching..."
107
+ count = 0
108
+ ldap.search(:return_result => false, :filter => connection["filter"], :base => connection["basedn"]) do |entry|
109
+ next if grab_value(entry[config["mappings"]["email"]]).blank? || (config["mappings"].has_key?("unique_identifier") && grab_value(entry[config["mappings"]["unique_identifier"]]).blank?)
110
+ users.user do |user|
111
+ primary_attributes = %w{unique_identifier first_name last_name employee_number}
112
+ primary_attributes.each do |attribute|
113
+ next unless config['mappings'].has_key?(attribute)
114
+ user.tag! attribute, grab_value(entry[config["mappings"][attribute]])
115
+ end
116
+ contact_attributes = %w{email location cell_phone office_phone}
117
+ user.tag! 'contact-info' do |contact_info|
118
+ contact_attributes.each do |attribute|
119
+ next unless config['mappings'].has_key?(attribute)
120
+ contact_info.tag! attribute, grab_value(entry[config["mappings"][attribute]])
121
+ end
122
+ end
123
+ custom_attributes = config['mappings'].keys - (primary_attributes + contact_attributes)
124
+ user.tag! 'custom-fields', :type => "array" do |custom_fields|
125
+ custom_attributes.each do |attribute|
126
+ custom_fields.tag! 'custom-field' do |custom_field|
127
+ custom_field.id(attribute)
128
+ custom_field.value(grab_value(entry[config["mappings"][attribute]]))
129
+ end
130
+ end
131
+ end
132
+ end # user
133
+ count += 1
134
+ say "Scanned #{count} users..." if ((count % 100) == 0)
135
+ end # search
136
+ end # connections
137
+ end # users
138
+ end # export
139
+ end # gzip
140
+
141
+ say "Finished Scanning"
142
+ say "Sending to Socialcast"
143
+
144
+ RestClient.log = Logger.new(STDOUT)
145
+ RestClient.proxy = config["http_proxy"] if config["http_proxy"]
146
+ url = ['https://', credentials[:domain], '/api/users/provision'].join
147
+ private_resource = RestClient::Resource.new url, :user => credentials[:username], :password => credentials[:password], :timeout => 660
148
+ File.open(output_file, 'r') do |file|
149
+ request_params = {:file => file}
150
+ request_params[:skip_emails] = "true" if config["skip_emails"]
151
+ request_params[:test] = "true" if config["test"]
152
+ private_resource.post request_params
153
+ end
154
+
155
+ File.delete(output_file) if options[:delete_users_file]
156
+
157
+ say "Finished"
158
+ end
66
159
  end
67
160
  end
@@ -1,3 +1,3 @@
1
1
  module Socialcast
2
- VERSION = "1.0.0.beta1"
2
+ VERSION = "1.0.0.beta3"
3
3
  end
data/socialcast.gemspec CHANGED
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
19
19
  s.add_runtime_dependency 'json', '>= 1.4.6'
20
20
  s.add_runtime_dependency 'thor', '>= 0.14.6'
21
21
  s.add_runtime_dependency 'highline', '>= 1.6.2'
22
+ s.add_runtime_dependency 'scashin133-net-ldap', '>= 0.1.4'
22
23
 
23
24
  s.files = `git ls-files`.split("\n")
24
25
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: socialcast
3
3
  version: !ruby/object:Gem::Version
4
- hash: 62196353
4
+ hash: 62196357
5
5
  prerelease: 6
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
9
  - 0
10
10
  - beta
11
- - 1
12
- version: 1.0.0.beta1
11
+ - 3
12
+ version: 1.0.0.beta3
13
13
  platform: ruby
14
14
  authors:
15
15
  - Ryan Sonnek
@@ -18,7 +18,7 @@ autorequire:
18
18
  bindir: bin
19
19
  cert_chain: []
20
20
 
21
- date: 2011-06-22 00:00:00 Z
21
+ date: 2011-06-30 00:00:00 Z
22
22
  dependencies:
23
23
  - !ruby/object:Gem::Dependency
24
24
  name: shoulda
@@ -98,6 +98,22 @@ dependencies:
98
98
  version: 1.6.2
99
99
  type: :runtime
100
100
  version_requirements: *id005
101
+ - !ruby/object:Gem::Dependency
102
+ name: scashin133-net-ldap
103
+ prerelease: false
104
+ requirement: &id006 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ hash: 19
110
+ segments:
111
+ - 0
112
+ - 1
113
+ - 4
114
+ version: 0.1.4
115
+ type: :runtime
116
+ version_requirements: *id006
101
117
  description: publish messages to your stream from a command line interface
102
118
  email:
103
119
  - ryan@socialcast.com
@@ -116,6 +132,7 @@ files:
116
132
  - README.md
117
133
  - Rakefile
118
134
  - bin/socialcast
135
+ - config/ldap.yml
119
136
  - lib/socialcast.rb
120
137
  - lib/socialcast/cli.rb
121
138
  - lib/socialcast/message.rb