108 lines
2.6 KiB
Ruby
108 lines
2.6 KiB
Ruby
#"aCnPi-aKBsH-ALNWZ-zfAiz-SQYdK"
|
|
require "active_support"
|
|
require "builder"
|
|
require "net/https"
|
|
require "rexml/document"
|
|
require "rexml/xpath"
|
|
require "icalendar"
|
|
require "net-http-report"
|
|
require "time"
|
|
|
|
@user="usr"
|
|
@password="pwd"
|
|
NAMESPACES = { "xmlns:d" => 'DAV:', "xmlns:c" => "urn:ietf:params:xml:ns:caldav" }
|
|
@calendars = ["cal_link_1", "cal_link_2"]
|
|
|
|
@startTime=Time.now
|
|
@endTime=@startTime.next_month(1)
|
|
|
|
def errorhandling response
|
|
#raise AuthenticationError if response.code.to_i == 401
|
|
#raise NotExistError if response.code.to_i == 410
|
|
#raise APIError if response.code.to_i >= 500
|
|
end
|
|
|
|
class ReportVEVENT
|
|
attr_accessor :tstart, :tend
|
|
attr :xml
|
|
|
|
def initialize( tstart=nil, tend=nil )
|
|
@tstart = tstart
|
|
@tend = tend
|
|
@xml = Builder::XmlMarkup.new(:indent => 2)
|
|
@xml.instruct!
|
|
end
|
|
|
|
def to_xml
|
|
xml.c 'calendar-query'.intern, NAMESPACES do
|
|
xml.d :prop do
|
|
xml.d :getetag
|
|
xml.c 'calendar-data'.intern
|
|
end
|
|
xml.c :filter do
|
|
xml.c 'comp-filter'.intern, :name=> 'VCALENDAR' do
|
|
xml.c 'comp-filter'.intern, :name=> 'VEVENT' do
|
|
xml.c 'time-range'.intern, :start=> "#{tstart}Z", :end=> "#{tend}Z"
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def __create_http url
|
|
uri = URI(url)
|
|
@host = uri.host
|
|
@port = uri.port.to_i
|
|
@url = uri.path
|
|
http = Net::HTTP.new(@host, @port)
|
|
http.use_ssl = true
|
|
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
|
http
|
|
end
|
|
|
|
def find_events
|
|
@events = []
|
|
@yaml_events = 'events:
|
|
'
|
|
@calendars.each do |calendar_url|
|
|
result = ""
|
|
events = []
|
|
res = nil
|
|
__create_http(calendar_url).start { |http|
|
|
req = Net::HTTP::Report.new(calendar_url, initheader = {'Content-Type'=>'application/xml','Depth'=>'1'} )
|
|
|
|
req.basic_auth @user, @password
|
|
req.body = ReportVEVENT.new(@startTime.utc.strftime("%Y%m%dT%H%M%S"), @endTime.utc.strftime("%Y%m%dT%H%M%S") ).to_xml
|
|
res = http.request(req)
|
|
}
|
|
errorhandling res
|
|
result = ""
|
|
xml = REXML::Document.new(res.body)
|
|
REXML::XPath.each( xml, '//c:calendar-data/', {"c"=>"urn:ietf:params:xml:ns:caldav"} ){|c| result << c.text}
|
|
r = Icalendar::Calendar.parse(result)
|
|
unless r.empty?
|
|
r.each do |calendar|
|
|
calendar.events.each do |event|
|
|
@events << event
|
|
@yaml_events << ' - name: >-
|
|
' + event.summary + '
|
|
date: ' + event.dtstart.to_s + '
|
|
background: "lightblue"
|
|
'
|
|
puts event.rrule
|
|
end
|
|
end
|
|
end
|
|
end
|
|
if @events.empty?
|
|
return false
|
|
end
|
|
end
|
|
|
|
find_events
|
|
|
|
puts @yaml_events
|
|
File.write('/home/me/dashboard/timeline.yml', @yaml_events)
|
|
|