socialcast 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/config/ldap.yml CHANGED
@@ -63,5 +63,3 @@ options:
63
63
  # http options for connecting to Socialcast servers
64
64
  http:
65
65
  timeout: 660
66
- # optional setting if script must connect to Socialcast server through a proxy
67
- # proxy: "http://username:password@proxy.company.com:3128"
data/lib/socialcast.rb CHANGED
@@ -2,22 +2,34 @@ require 'yaml'
2
2
  require 'fileutils'
3
3
 
4
4
  module Socialcast
5
- def config_dir
6
- config_dir = File.expand_path '~/.socialcast'
7
- FileUtils.mkdir config_dir, :mode => 0700 unless File.exist?(config_dir)
8
- config_dir
9
- end
10
- def credentials_file
11
- File.join config_dir, 'credentials.yml'
12
- end
13
- def save_credentials(options)
14
- File.open(credentials_file, "w") do |f|
15
- f.write(options.to_yaml)
5
+ class << self
6
+ def config_dir
7
+ config_dir = File.expand_path '~/.socialcast'
8
+ FileUtils.mkdir config_dir, :mode => 0700 unless File.exist?(config_dir)
9
+ config_dir
10
+ end
11
+ def credentials_file
12
+ File.join config_dir, 'credentials.yml'
13
+ end
14
+ def credentials
15
+ fail 'Unknown Socialcast credentials. Run `socialcast authenticate` to initialize' unless File.exist?(credentials_file)
16
+ @@credentials ||= YAML.load_file(credentials_file)
17
+ end
18
+ def credentials=(options)
19
+ File.open(credentials_file, "w") do |f|
20
+ f.write(options.to_yaml)
21
+ end
22
+ File.chmod 0600, credentials_file
23
+ end
24
+ def basic_auth_options
25
+ {:user => credentials[:user], :password => credentials[:password]}
26
+ end
27
+ # configure restclient for api call
28
+ def resource_for_path(path, options = {}, debug = true)
29
+ RestClient.log = Logger.new(STDOUT) if debug
30
+ RestClient.proxy = credentials[:proxy] if credentials[:proxy]
31
+ url = ['https://', credentials[:domain], path].join
32
+ RestClient::Resource.new url, options.merge(basic_auth_options)
16
33
  end
17
- File.chmod 0600, credentials_file
18
- end
19
- def credentials
20
- raise 'Unknown Socialcast credentials. Run `socialcast authenticate` to initialize' unless File.exist?(credentials_file)
21
- YAML.load_file(credentials_file)
22
34
  end
23
35
  end
@@ -1,3 +1,5 @@
1
+ require 'rubygems'
2
+
1
3
  require "thor"
2
4
  require 'json'
3
5
  require 'rest_client'
@@ -14,12 +16,14 @@ require 'net/ldap'
14
16
  module Socialcast
15
17
  class CLI < Thor
16
18
  include Thor::Actions
17
- include Socialcast
19
+
20
+ method_option :trace, :type => :boolean, :aliases => '-v'
21
+ def initialize(*args); super(*args) end
18
22
 
19
23
  desc "authenticate", "Authenticate using your Socialcast credentials"
20
24
  method_option :user, :type => :string, :aliases => '-u', :desc => 'email address for the authenticated user'
21
- method_option :domain, :type => :string, :default => 'api.socialcast.com', :desc => 'socialcast community domain'
22
- method_option :trace, :type => :boolean, :aliases => '-v'
25
+ method_option :domain, :type => :string, :default => 'api.socialcast.com', :desc => 'Socialcast community domain'
26
+ method_option :proxy, :type => :string, :desc => 'HTTP proxy options for connecting to Socialcast server'
23
27
  def authenticate
24
28
  user = options[:user] || ask('Socialcast username: ')
25
29
  password = HighLine.new.ask("Socialcast password: ") { |q| q.echo = false }
@@ -28,19 +32,20 @@ module Socialcast
28
32
  url = ['https://', domain, '/api/authentication.json'].join
29
33
  say "Authenticating #{user} to #{url}"
30
34
  params = {:email => user, :password => password }
31
- resource = RestClient::Resource.new url
32
35
  RestClient.log = Logger.new(STDOUT) if options[:trace]
36
+ RestClient.proxy = options[:proxy] if options[:proxy]
37
+ resource = RestClient::Resource.new url
33
38
  response = resource.post params
34
39
  say "API response: #{response.body.to_s}" if options[:trace]
35
40
  communities = JSON.parse(response.body.to_s)['communities']
36
41
  domain = communities.detect {|c| c['domain'] == domain} ? domain : communities.first['domain']
37
42
 
38
- save_credentials :user => user, :password => password, :domain => domain
43
+ Socialcast.credentials = {:user => user, :password => password, :domain => domain, :proxy => options[:proxy]}
39
44
  say "Authentication successful for #{domain}"
40
45
  end
41
46
 
42
47
  desc "share MESSAGE", "Posts a new message into socialcast"
43
- method_option :url, :type => :string
48
+ method_option :url, :type => :string, :desc => '(optional) url to associate to the message'
44
49
  method_option :attachments, :type => :array, :default => []
45
50
  def share(message = nil)
46
51
  message ||= $stdin.read_nonblock(100_000) rescue nil
@@ -48,10 +53,9 @@ module Socialcast
48
53
  attachment_ids = []
49
54
  options[:attachments].each do |path|
50
55
  Dir[File.expand_path(path)].each do |attachment|
51
- attachment_url = ['https://', credentials[:domain], '/api/attachments.json'].join
52
56
  say "Uploading attachment #{attachment}..."
53
- attachment_uploader = RestClient::Resource.new attachment_url, :user => credentials[:user], :password => credentials[:password]
54
- attachment_uploader.post :attachment => File.new(attachment) do |response, request, result|
57
+ uploader = Socialcast.resource_for_path '/api/attachments.json', {}, options[:trace]
58
+ uploader.post :attachment => File.new(attachment) do |response, request, result|
55
59
  if response.code == 201
56
60
  attachment_ids << JSON.parse(response.body)['attachment']['id']
57
61
  else
@@ -61,10 +65,7 @@ module Socialcast
61
65
  end
62
66
  end
63
67
 
64
- Socialcast::Message.site = ['https://', credentials[:domain], '/api'].join
65
- Socialcast::Message.user = credentials[:user]
66
- Socialcast::Message.password = credentials[:password]
67
-
68
+ Socialcast::Message.configure_from_credentials
68
69
  Socialcast::Message.create :body => message, :url => options[:url], :attachment_ids => attachment_ids
69
70
 
70
71
  say "Message has been shared"
@@ -123,46 +124,8 @@ module Socialcast
123
124
  next if entry.grab(mappings["email"]).blank? || (mappings.has_key?("unique_identifier") && entry.grab(mappings["unique_identifier"]).blank?)
124
125
 
125
126
  users.user do |user|
126
- primary_attributes = %w{unique_identifier first_name last_name employee_number}
127
- primary_attributes.each do |attribute|
128
- next unless mappings.has_key?(attribute)
129
- user.tag! attribute, entry.grab(mappings[attribute])
130
- end
131
-
132
- contact_attributes = %w{email location cell_phone office_phone}
133
- user.tag! 'contact-info' do |contact_info|
134
- contact_attributes.each do |attribute|
135
- next unless mappings.has_key?(attribute)
136
- contact_info.tag! attribute, entry.grab(mappings[attribute])
137
- end
138
- end
139
-
140
- custom_attributes = mappings.keys - (primary_attributes + contact_attributes)
141
- user.tag! 'custom-fields', :type => "array" do |custom_fields|
142
- custom_attributes.each do |attribute|
143
- custom_fields.tag! 'custom-field' do |custom_field|
144
- custom_field.id attribute
145
- custom_field.label attribute
146
- custom_field.value entry.grab(mappings[attribute])
147
- end
148
- end
149
- end
150
-
151
- memberships = entry[membership_attribute]
152
- external_ldap_group = permission_mappings.fetch('account_types', {})['external']
153
- if external_ldap_group && memberships.include?(external_ldap_group)
154
- user.tag! 'account-type', 'external'
155
- else
156
- user.tag! 'account-type', 'member'
157
- if permission_roles_mappings = permission_mappings['roles']
158
- user.tag! 'roles', :type => 'array' do |roles|
159
- permission_roles_mappings.each_pair do |socialcast_role, ldap_group|
160
- roles.role socialcast_role if entry[membership_attribute].include?(ldap_group)
161
- end
162
- end
163
- end
164
- end
165
- end # user
127
+ entry.build_xml_from_mappings user, mappings, permission_mappings
128
+ end
166
129
  count += 1
167
130
  say "Scanned #{count} users..." if ((count % 100) == 0)
168
131
  end # search
@@ -175,15 +138,12 @@ module Socialcast
175
138
  say "Sending to Socialcast"
176
139
 
177
140
  http_config = config.fetch('http', {})
178
- RestClient.log = Logger.new(STDOUT)
179
- RestClient.proxy = http_config['proxy'] if http_config['proxy']
180
- url = ['https://', credentials[:domain], '/api/users/provision'].join
181
- private_resource = RestClient::Resource.new url, :user => credentials[:user], :password => credentials[:password], :timeout => http_config['timeout']
141
+ resource = Socialcast.resource_for_path '/api/users/provision', http_config
182
142
  File.open(output_file, 'r') do |file|
183
143
  request_params = {:file => file}
184
144
  request_params[:skip_emails] = 'true' if (config['options']["skip_emails"] || options[:skip_emails])
185
145
  request_params[:test] = 'true' if (config['options']["test"] || options[:test])
186
- private_resource.post request_params
146
+ resource.post request_params
187
147
  end
188
148
 
189
149
  File.delete(output_file) if (config['options']['delete_users_file'] || options[:delete_users_file])
@@ -2,6 +2,12 @@ require 'active_resource'
2
2
 
3
3
  module Socialcast
4
4
  class Message < ActiveResource::Base
5
+ def self.configure_from_credentials
6
+ Socialcast::Message.site = ['https://', Socialcast.credentials[:domain], '/api'].join
7
+ Socialcast::Message.proxy = credentials[:proxy] if Socialcast.credentials[:proxy]
8
+ Socialcast::Message.user = Socialcast.credentials[:user]
9
+ Socialcast::Message.password = Socialcast.credentials[:password]
10
+ end
5
11
  end
6
12
  end
7
13
 
@@ -7,4 +7,47 @@ class Net::LDAP::Entry
7
7
  def grab(attribute)
8
8
  Array.wrap(self[attribute]).compact.first
9
9
  end
10
+
11
+ def build_xml_from_mappings(user, mappings = {}, permission_mappings = {})
12
+ primary_attributes = %w{unique_identifier first_name last_name employee_number}
13
+ primary_attributes.each do |attribute|
14
+ next unless mappings.has_key?(attribute)
15
+ user.tag! attribute, grab(mappings[attribute])
16
+ end
17
+
18
+ contact_attributes = %w{email location cell_phone office_phone}
19
+ user.tag! 'contact-info' do |contact_info|
20
+ contact_attributes.each do |attribute|
21
+ next unless mappings.has_key?(attribute)
22
+ contact_info.tag! attribute, grab(mappings[attribute])
23
+ end
24
+ end
25
+
26
+ custom_attributes = mappings.keys - (primary_attributes + contact_attributes)
27
+ user.tag! 'custom-fields', :type => "array" do |custom_fields|
28
+ custom_attributes.each do |attribute|
29
+ custom_fields.tag! 'custom-field' do |custom_field|
30
+ custom_field.id attribute
31
+ custom_field.label attribute
32
+ custom_field.value grab(mappings[attribute])
33
+ end
34
+ end
35
+ end
36
+
37
+ membership_attribute = permission_mappings.fetch 'attribute_name', 'memberof'
38
+ memberships = self[membership_attribute]
39
+ external_ldap_group = permission_mappings.fetch('account_types', {})['external']
40
+ if external_ldap_group && memberships.include?(external_ldap_group)
41
+ user.tag! 'account-type', 'external'
42
+ else
43
+ user.tag! 'account-type', 'member'
44
+ if permission_roles_mappings = permission_mappings['roles']
45
+ user.tag! 'roles', :type => 'array' do |roles|
46
+ permission_roles_mappings.each_pair do |socialcast_role, ldap_group|
47
+ roles.role socialcast_role if memberships.include?(ldap_group)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
10
53
  end
@@ -1,3 +1,3 @@
1
1
  module Socialcast
2
- VERSION = "1.0.2"
2
+ VERSION = "1.0.3"
3
3
  end
@@ -48,6 +48,3 @@ options:
48
48
  # http options for connecting to Socialcast servers
49
49
  http:
50
50
  timeout: 660
51
- # optional setting if script must connect to Socialcast server through a proxy
52
- # proxy: "http://username:password@proxy.company.com:3128"
53
-
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: socialcast
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 17
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
- - 2
10
- version: 1.0.2
9
+ - 3
10
+ version: 1.0.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Ryan Sonnek
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2011-07-14 00:00:00 Z
19
+ date: 2011-07-15 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  name: rest-client
@@ -190,7 +190,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
190
190
  requirements: []
191
191
 
192
192
  rubyforge_project: socialcast
193
- rubygems_version: 1.8.1
193
+ rubygems_version: 1.8.5
194
194
  signing_key:
195
195
  specification_version: 3
196
196
  summary: command line interface to socialcast api