vigetlabs-amazon-ec2 0.0.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/LICENSE +20 -0
- data/Manifest +19 -0
- data/README +39 -0
- data/Rakefile +51 -0
- data/TODO +6 -0
- data/bin/dockit +17 -0
- data/lib/dockit.rb +42 -0
- data/lib/export.rb +104 -0
- metadata +87 -0
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2007 Viget Labs
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Manifest
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
config
|
2
|
+
config/users.yml
|
3
|
+
lib
|
4
|
+
lib/dockit.rb
|
5
|
+
lib/export.rb
|
6
|
+
lib/tony.pitale.ics
|
7
|
+
LICENSE
|
8
|
+
pkg
|
9
|
+
Rakefile
|
10
|
+
rawresponse.txt
|
11
|
+
README
|
12
|
+
script
|
13
|
+
script/destroy
|
14
|
+
script/generate
|
15
|
+
spec
|
16
|
+
spec/dockit_spec.rb
|
17
|
+
spec/spec_helper.rb
|
18
|
+
TODO
|
19
|
+
Manifest
|
data/README
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
dockit
|
2
|
+
=================
|
3
|
+
|
4
|
+
A rack application daemon that creates an iCal subscription file from exchange calendars.
|
5
|
+
|
6
|
+
Install
|
7
|
+
-----------------
|
8
|
+
sudo gem install dockit # if you've cloned from github
|
9
|
+
|
10
|
+
# else
|
11
|
+
|
12
|
+
sudo gem install vigetlabs-dockit -s http://gems.github.com
|
13
|
+
|
14
|
+
Configure
|
15
|
+
-----------------
|
16
|
+
|
17
|
+
Simply set up a file, .dockit, in your home directory with your username, domain, and the
|
18
|
+
url of your exchange server. Leave the domain blank if your login for exchange is NOT your
|
19
|
+
email address. If you leave domain blank, change the resulting url to simply reflect your
|
20
|
+
username, with the @domain.com. The port too, if not 2000, should be changed.
|
21
|
+
|
22
|
+
Example .dockit Configuration
|
23
|
+
-----------------
|
24
|
+
|
25
|
+
default:
|
26
|
+
username: john.doe
|
27
|
+
domain: example.com
|
28
|
+
password: password
|
29
|
+
remote_uri: http://mail.example.com/exchange/john.doe@example.com/
|
30
|
+
local_port: 2000
|
31
|
+
|
32
|
+
The resulting url for subscribing in iCal when running this daemon on the localhost would be:
|
33
|
+
http://localhost:2000/john.doe.ics
|
34
|
+
|
35
|
+
Starting the Daemon
|
36
|
+
-----------------
|
37
|
+
Given the yaml file defined example, the command would be:
|
38
|
+
|
39
|
+
dockit default (or in the case of default, just dockit)
|
data/Rakefile
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake/gempackagetask'
|
3
|
+
|
4
|
+
GEM = "dockit"
|
5
|
+
VERSION = "0.1"
|
6
|
+
AUTHOR = "Tony Pitale @ Viget Labs"
|
7
|
+
EMAIL = "tony.pitale@viget.com"
|
8
|
+
HOMEPAGE = "http://www.viget.com/extend/"
|
9
|
+
SUMMARY = "A rack application daemon that creates an iCal subscription file from exchange calendars."
|
10
|
+
|
11
|
+
# spec = Gem::Specification.new do |s|
|
12
|
+
# s.name = GEM
|
13
|
+
# s.version = VERSION
|
14
|
+
# s.platform = Gem::Platform::RUBY
|
15
|
+
# s.has_rdoc = true
|
16
|
+
# s.extra_rdoc_files = ["README", "LICENSE", 'TODO']
|
17
|
+
# s.summary = SUMMARY
|
18
|
+
# s.description = s.summary
|
19
|
+
# s.author = AUTHOR
|
20
|
+
# s.email = EMAIL
|
21
|
+
# s.homepage = HOMEPAGE
|
22
|
+
#
|
23
|
+
# # Uncomment this to add a dependency
|
24
|
+
# # s.add_dependency "foo"
|
25
|
+
# s.add_dependency "rexchange", ">= 0.3.4"
|
26
|
+
# s.add_dependency "rack", ">= 0.3.0"
|
27
|
+
# s.add_dependency "chronic", ">= 0.2.3"
|
28
|
+
#
|
29
|
+
# s.executables = ['dockit']
|
30
|
+
#
|
31
|
+
# s.require_path = 'lib'
|
32
|
+
# s.autorequire = GEM
|
33
|
+
# s.files = %w(LICENSE README Rakefile TODO Manifest ) + Dir.glob("{lib,specs}/**/*")
|
34
|
+
# end
|
35
|
+
|
36
|
+
spec_file = ""
|
37
|
+
File.open("dockit.gemspec", "r") do |f|
|
38
|
+
while line = f.gets
|
39
|
+
spec_file << line
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
spec = eval(spec_file)
|
44
|
+
|
45
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
46
|
+
pkg.gem_spec = spec
|
47
|
+
end
|
48
|
+
|
49
|
+
task :install => [:package] do
|
50
|
+
sh %{sudo gem install pkg/#{GEM}-#{VERSION}}
|
51
|
+
end
|
data/TODO
ADDED
data/bin/dockit
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by RubyGems.
|
4
|
+
#
|
5
|
+
# The application 'dockit' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'rubygems'
|
10
|
+
require 'dockit'
|
11
|
+
# require "optparse"
|
12
|
+
|
13
|
+
config = ARGV.first || 'default'
|
14
|
+
|
15
|
+
Dockit.new(config).run
|
16
|
+
|
17
|
+
# TODO start/stop daemon
|
data/lib/dockit.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rack'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
require "export"
|
6
|
+
|
7
|
+
class String
|
8
|
+
def blank?
|
9
|
+
self.nil? || self.strip.empty?
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class NilClass
|
14
|
+
def blank?
|
15
|
+
true
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class Dockit
|
20
|
+
include Export
|
21
|
+
|
22
|
+
def initialize(config)
|
23
|
+
# Get configuration information
|
24
|
+
config_file = YAML.load_file(File.join(ENV['HOME'], ".dockit"))
|
25
|
+
@user = config_file && config_file.has_key?(config) ?
|
26
|
+
config_file[config] : config_file['default']
|
27
|
+
|
28
|
+
raise "No users.yml found for user #{ARGV.first}!" unless @user
|
29
|
+
end
|
30
|
+
|
31
|
+
def run
|
32
|
+
local_port = @user.fetch("local_port", 2000)
|
33
|
+
|
34
|
+
pid = fork do
|
35
|
+
Rack::Handler::Mongrel.run(rack_process(@user), :Port => local_port)
|
36
|
+
end
|
37
|
+
|
38
|
+
Process.detach(pid)
|
39
|
+
|
40
|
+
puts "Use sudo kill #{pid} to stop this process."
|
41
|
+
end
|
42
|
+
end
|
data/lib/export.rb
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'rexchange'
|
2
|
+
require 'chronic'
|
3
|
+
|
4
|
+
module Export
|
5
|
+
def rack_process(user)
|
6
|
+
lambda do |env|
|
7
|
+
# puts user.inspect
|
8
|
+
exchange(user)
|
9
|
+
|
10
|
+
Rack::File.new('.').call(env)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def exchange(user)
|
15
|
+
username = user.fetch("username", ENV['USER'])
|
16
|
+
domain = user.fetch("domain", 'localhost')
|
17
|
+
email = "#{username}@#{domain}"
|
18
|
+
password = user.fetch("password", 'password')
|
19
|
+
remote_uri = user.fetch("remote_uri", "http://localhost/#{email}/")
|
20
|
+
|
21
|
+
# puts "User: #{username}@#{domain}, #{password}, #{remote_uri}"
|
22
|
+
|
23
|
+
RExchange::open(remote_uri, email, password) do |mailbox|
|
24
|
+
|
25
|
+
# create ics file, clearing any old one
|
26
|
+
file = File.new("#{username}.ics", "w")
|
27
|
+
raise "Failed to create file #{username}.ics" unless file
|
28
|
+
|
29
|
+
file.puts "BEGIN:VCALENDAR"
|
30
|
+
file.puts "CALSCALE:GREGORIAN"
|
31
|
+
file.puts "PRODID:-//Apple Computer\, Inc//iCal 2.0//EN"
|
32
|
+
file.puts "VERSION:2.0"
|
33
|
+
file.puts "X-WR-CALNAME:#{username}"
|
34
|
+
|
35
|
+
# itemcount = 0
|
36
|
+
|
37
|
+
# Loop through all calendar events, making VEVENTS
|
38
|
+
mailbox.calendar.each do |event|
|
39
|
+
|
40
|
+
file.puts "BEGIN:VEVENT"
|
41
|
+
|
42
|
+
# Set some properties for this event
|
43
|
+
file.puts "DTSTAMP:#{dformat(event.created_at)}"
|
44
|
+
file.puts "DTSTART:#{dformat(event.start_at)}"
|
45
|
+
file.puts "DTEND:#{dformat(event.end_at)}"
|
46
|
+
file.puts "LAST-MODIFIED:#{dformat(event.modified_at)}"
|
47
|
+
|
48
|
+
file.puts "SUMMARY:" + (event.subject.blank? ? "Unknown Subject" : event.subject)
|
49
|
+
|
50
|
+
description = event.body.blank? ? "" : event.body.gsub!("\n","\\n").gsub("^\n","")
|
51
|
+
# ?? add event.href+"?Cmd=accept" or "decline" or "tentative"
|
52
|
+
# description += event.href+"?Cmd=accept"
|
53
|
+
# description += event.href+"?Cmd=decline"
|
54
|
+
# description += event.href+"?Cmd=tentative"
|
55
|
+
|
56
|
+
file.puts "DESCRIPTION:" + description
|
57
|
+
|
58
|
+
file.puts "UID:" + event.uid if event.uid
|
59
|
+
|
60
|
+
if event.reminder_offset && event.reminder_offset.to_i > 60
|
61
|
+
# ouput valarm details. reminder_offset is in seconds
|
62
|
+
ro_min = event.reminder_offset.to_i / 60
|
63
|
+
file.puts "BEGIN:VALARM"
|
64
|
+
file.puts "TRIGGER:-PT#{ro_min}M"
|
65
|
+
# item.puts "DESCRIPTION:Påminnelse om aktivitet"
|
66
|
+
file.puts "ACTION:DISPLAY"
|
67
|
+
file.puts "END:VALARM"
|
68
|
+
end
|
69
|
+
|
70
|
+
#add event to calendar
|
71
|
+
file.puts "END:VEVENT"
|
72
|
+
|
73
|
+
# itemcount += 1
|
74
|
+
end
|
75
|
+
|
76
|
+
# puts mailbox.inspect
|
77
|
+
# puts
|
78
|
+
# puts mailbox.methods
|
79
|
+
|
80
|
+
# Loop through all todos, creating VTODOS
|
81
|
+
# Loop through all journals, creating VJOURNAL
|
82
|
+
# Loop through all free/busy time, creating VFREEBUSY
|
83
|
+
# event.busy_status
|
84
|
+
|
85
|
+
#close ical file
|
86
|
+
file.puts "END:VCALENDAR"
|
87
|
+
file.close
|
88
|
+
|
89
|
+
# p "Done! Wrote #{itemcount} appointment items"
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def dformat(t)
|
95
|
+
# month = s[4..6]
|
96
|
+
# day = s[8..9].to_i
|
97
|
+
# hour = s[11..12].to_i
|
98
|
+
# minute = s[14..15].to_i
|
99
|
+
# second = s[17..18].to_i
|
100
|
+
# year = s[23..27].to_i
|
101
|
+
# Time.local(year, month, day, hour, minute, second).strftime('%Y%m%dT%H%M%S')
|
102
|
+
t.strftime('%Y%m%dT%H%M%S')
|
103
|
+
end
|
104
|
+
end
|
metadata
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: vigetlabs-amazon-ec2
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Glenn Rempe
|
8
|
+
autorequire: amazon-ec2
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-05-14 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rexchange
|
17
|
+
version_requirement:
|
18
|
+
version_requirements: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 0.3.4
|
23
|
+
version:
|
24
|
+
- !ruby/object:Gem::Dependency
|
25
|
+
name: rack
|
26
|
+
version_requirement:
|
27
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
|
+
requirements:
|
29
|
+
- - ">="
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: 0.3.0
|
32
|
+
version:
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: chronic
|
35
|
+
version_requirement:
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.2.3
|
41
|
+
version:
|
42
|
+
description: An interface library that allows Ruby applications to easily connect to the HTTP 'Query API' for the Amazon Web Services Elastic Compute Cloud (EC2) and manipulate cloud servers.
|
43
|
+
email: glenn.rempe@gmail.com
|
44
|
+
executables:
|
45
|
+
- dockit
|
46
|
+
extensions: []
|
47
|
+
|
48
|
+
extra_rdoc_files:
|
49
|
+
- README
|
50
|
+
- LICENSE
|
51
|
+
- TODO
|
52
|
+
files:
|
53
|
+
- LICENSE
|
54
|
+
- README
|
55
|
+
- Rakefile
|
56
|
+
- TODO
|
57
|
+
- Manifest
|
58
|
+
- lib/dockit.rb
|
59
|
+
- lib/export.rb
|
60
|
+
has_rdoc: true
|
61
|
+
homepage: http://github.com/grempe/amazon-ec2/
|
62
|
+
post_install_message:
|
63
|
+
rdoc_options: []
|
64
|
+
|
65
|
+
require_paths:
|
66
|
+
- lib
|
67
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: "0"
|
72
|
+
version:
|
73
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: "0"
|
78
|
+
version:
|
79
|
+
requirements: []
|
80
|
+
|
81
|
+
rubyforge_project:
|
82
|
+
rubygems_version: 1.0.1
|
83
|
+
signing_key:
|
84
|
+
specification_version: 2
|
85
|
+
summary: An interface library that allows Ruby applications to easily connect to the HTTP 'Query API' for the Amazon Web Services Elastic Compute Cloud (EC2) and manipulate cloud servers.
|
86
|
+
test_files: []
|
87
|
+
|