From 4cd41c43df1ea179a553b0defbef43e5d5bd51b5 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 25 Nov 2018 13:15:55 +1100 Subject: [PATCH 01/18] arup cuurent prod state --- modules/aca/tracking/locate_user.rb | 8 ++- modules/cisco/collaboration_endpoint/sx80.rb | 6 +- modules/dell/projector/s718ql.rb | 61 ++++++++++++++------ modules/extron/recorder/smp300_series.rb | 29 +++++++--- modules/extron/switcher/dtp.rb | 2 +- modules/panasonic/camera/he50.rb | 6 +- modules/panasonic/lcd/rs232.rb | 15 ++--- modules/panasonic/projector/rs232.rb | 3 +- modules/qsc/q_sys_control.rb | 8 +-- 9 files changed, 95 insertions(+), 43 deletions(-) diff --git a/modules/aca/tracking/locate_user.rb b/modules/aca/tracking/locate_user.rb index 8e987e14..cfef4536 100644 --- a/modules/aca/tracking/locate_user.rb +++ b/modules/aca/tracking/locate_user.rb @@ -31,7 +31,8 @@ class Aca::Tracking::LocateUser }, ignore_hostnames: {}, accept_hostnames: {}, - temporary_macs: {} + temporary_macs: {}, + ignore_users: {} }) def on_load @@ -68,6 +69,7 @@ def on_update @accept_hosts = Set.new((setting(:accept_hostnames) || {}).values) @ignore_byod_hosts = Set.new((setting(:ignore_byod_hosts) || {}).values) @accept_byod_hosts = Set.new((setting(:accept_byod_hosts) || {}).values) + @ignore_users = Set.new((setting(:ignore_users) || {}).values.map(&:downcase)) @warnings ||= {} @filters ||= {} end @@ -106,6 +108,7 @@ def clean_up(vendor_mac) def lookup(*ips) ttl = 10.minutes.ago.to_i ips.each do |ip, login, domain, hostname| + next if @ignore_users.include?(login.downcase) perform_lookup(ip, login, domain, hostname, ttl) end end @@ -114,6 +117,7 @@ def lookup(*ips) # Typically from a RADIUS server like MS Network Policy Server def associate(*macs) macs.each do |mac, login, hostname| + next if @ignore_users.include?(login.downcase) begin parts = login.split("\\") login = parts[-1] @@ -232,7 +236,9 @@ def perform_lookup(ip, login, domain, hostname, ttl) # We search the wireless networks in case snooping is enabled on the # port that the wireless controller is connected to if @meraki_enabled + logger.debug { "Wireless check for IP #{ip}" } resp = @scanner.get(path: "/meraki/#{ip}").value + logger.debug { "Wireless check for got #{resp.status.inspect}" } if resp.status == 200 details = JSON.parse(resp.body, symbolize_names: true) diff --git a/modules/cisco/collaboration_endpoint/sx80.rb b/modules/cisco/collaboration_endpoint/sx80.rb index 6d91829d..c671c66e 100644 --- a/modules/cisco/collaboration_endpoint/sx80.rb +++ b/modules/cisco/collaboration_endpoint/sx80.rb @@ -178,7 +178,11 @@ def switch_to(input) if [0, nil, :none, 'none', :blank, 'blank'].include? input presentation_stop else - presentation_start presentation_source: input + if self[:configuration]&.dig(:Video, :Input, :Connector, input, :InputSourceType) == :camera + camera_select connector_id: input + else + presentation_start presentation_source: input + end end end diff --git a/modules/dell/projector/s718ql.rb b/modules/dell/projector/s718ql.rb index 9e2b033d..844a74b9 100755 --- a/modules/dell/projector/s718ql.rb +++ b/modules/dell/projector/s718ql.rb @@ -1,4 +1,4 @@ -require 'protocols/snmp' +require 'protocols/simple_snmp' module Dell; end module Dell::Projector; end @@ -18,7 +18,7 @@ class Dell::Projector::S718ql snmp_timeout: 4000, snmp_options: { version: 'v2c', - community: 'public', + community: 'private', } }) @@ -28,29 +28,40 @@ def on_load # Meta data for inquiring interfaces self[:type] = :projector + + schedule.every('60s') { do_poll } on_update end - def on_update - new_client if @resolved_ip + def on_unload + @client.close end - def on_unload - @transport&.close - @transport = nil - @client&.close - @client = nil + def on_update + #new_client if @resolved_ip + options = setting(:snmp_options) || {} + proxy = Protocols::SimpleSnmp.new(self) + options[:proxy] = proxy + @client = NETSNMP::Client.new(options.to_h.symbolize_keys) end + #def on_unload + # @transport&.close + # @transport = nil + # @client&.close + # @client = nil + #end + def hostname_resolution(ip) @resolved_ip = ip # Create a new client once we know the IP address of the device. # Might have been a hostname in the settings. - new_client + #new_client end def new_client + return @transport&.close @client&.close @@ -65,7 +76,7 @@ def new_client def power(state, opt = nil) if is_affirmative?(state) logger.debug "-- requested to power on" - @client.set(oid: '1.3.6.1.4.1.2699.2.4.1.4.3.0', value: 11) + resp = @client.set(oid: '1.3.6.1.4.1.2699.2.4.1.4.3.0', value: 11) self[:power] = On else logger.debug "-- requested to power off" @@ -74,9 +85,12 @@ def power(state, opt = nil) end end - def power?(options = {}, &block) - state = @client.get(oid: '1.3.6.1.4.1.2699.2.4.1.4.3.0') - logger.debug { "Volume State #{state.inspect}" } + def power? + state = @client.get(oid: '1.3.6.1.4.1.2699.2.4.1.4.2.0') + logger.debug { "Power State #{state.inspect}" } + self[:power] = state == 11 || state == 10 + self[:warming] = state == 10 + self[:cooling] = state == 9 state end @@ -85,7 +99,8 @@ def power?(options = {}, &block) INPUTS = { :hdmi => 5, :hdmi2 => 14, - :hdmi3 => 17 + :hdmi3 => 17, + :network => 16 } INPUTS.merge!(INPUTS.invert) @@ -94,9 +109,9 @@ def switch_to(input) value = INPUTS[input] raise "unknown input '#{value}'" unless value - logger.debug "-- epson LCD, requested to switch to: #{input}" - @client.set(oid: '1.3.6.1.4.1.2699.2.4.1.6.1.1.3.1', value: value) - + logger.debug "Requested to switch to: #{input}" + response = @client.set(oid: '1.3.6.1.4.1.2699.2.4.1.6.1.1.3.1', value: value) + logger.debug "Recieved: #{response}" self[:input] = input # for a responsive UI self[:mute] = false end @@ -161,6 +176,16 @@ def query_error end def do_poll + power? + input? + mute? + end + + protected + def received(data, resolve, command) + # return the data which resolves the request promise. + # the proxy uses fibers to provide this to the NETSNMP client + data end end diff --git a/modules/extron/recorder/smp300_series.rb b/modules/extron/recorder/smp300_series.rb index 7a66f660..4d8c8502 100644 --- a/modules/extron/recorder/smp300_series.rb +++ b/modules/extron/recorder/smp300_series.rb @@ -15,6 +15,7 @@ class Extron::Recorder::SMP300Series < Extron::Base # This should consume the whole copyright message tokenize delimiter: "\r\n", wait_ready: /Copyright.*/i + # NOTE:: The channel arguments are here for compatibility with other recording devices def information(channel = 1) # Responds with "***<437342288>*<00:00:00>*<155:40:43>" @@ -22,7 +23,12 @@ def information(channel = 1) end def record(channel = 1) - do_send("\eY1RCDR", name: :record_action) + do_send("\eY1RCDR", name: :record_action, delay: 5000, delay_on_receive: 5000, wait: true) + end + + def stream(enable = true, channel = 1) + action = enable ? 1 : 0 + do_send("\e#{channel}*#{action}STRC", name: :record_action) end def stop(channel = 1) @@ -37,6 +43,10 @@ def status(channel = 1) do_send("\eYRCDR", name: :status) end + def stream_status(channel = 1) + do_send("\e#{channel}STRC", name: :stream_status) + end + # only works with scheduled recordings def extend(minutes, channel = 1) do_send("\eE#{minutes}RCDR", name: :extend) @@ -58,6 +68,7 @@ def recording_duration def do_poll information status + stream_status end protected @@ -71,21 +82,23 @@ def received(data, resolve, command) return :success end - if data[0] == '<' - parts = data[1..-2].split('>*<') + if data[0..3] == 'Inf*' + parts = data[5..-2].split('>*<') + logger.debug "#{parts.inspect}" self[:recording_channels] = parts[1] self[:recording_to] = parts[2] self[:time_remaining] = parts[-1] - self[:recording_time] = parts[-2] + self[:duration] = parts[-2] self[:free_space] = parts[-3] elsif data.start_with? 'RcdrY' - self[:channel1] = case data[-1].to_i + self[:status] = self[:channel1] = case data[-1].to_i + when 0 clear_recording_poller :idle when 1 if @recording.nil? - @recording = schedule.every(1000) { recording_duration } + @recording = schedule.in(5000) { @recording = schedule.every(1000) { do_poll } } end :recording when 2 @@ -94,7 +107,9 @@ def received(data, resolve, command) end elsif data.start_with? 'Inf35' self[:duration] = data.split('*')[1] - end + elsif data.start_with? 'Strc' + self[:streaming] = (data.split('*')[1] == '1') + end :success end diff --git a/modules/extron/switcher/dtp.rb b/modules/extron/switcher/dtp.rb index 6a5a1c14..56b5a36e 100644 --- a/modules/extron/switcher/dtp.rb +++ b/modules/extron/switcher/dtp.rb @@ -203,7 +203,7 @@ def faders(ids:, level:, **_) def query_fader(groups, type = :volume) Array(groups).each do |group| - do_send("\eG#{group}AU", group_type: type, wait: true) + do_send("\eH#{group}AU", group_type: type, wait: true) end end diff --git a/modules/panasonic/camera/he50.rb b/modules/panasonic/camera/he50.rb index d738564f..7da37063 100644 --- a/modules/panasonic/camera/he50.rb +++ b/modules/panasonic/camera/he50.rb @@ -140,7 +140,7 @@ def pantilt(pan = nil, tilt = nil) # Recall a preset from the database def preset(name) - values = @presets[name.to_sym] + values = @presets[name] if values pantilt(values[:pan], values[:tilt]) zoom(values[:zoom]) @@ -241,7 +241,7 @@ def adjust_zoom(direction) if direction == 'in' speed += 5 elsif direction == 'out' - speed -= 5 + speed -= 30 end manual_zoom(speed) end @@ -283,7 +283,7 @@ def zoom(pos = nil) end def manual_zoom(speed, priority: 50) - speed = in_range(speed.to_i, self[:joy_right], self[:joy_left]).to_s(16).upcase.rjust(3, '0') + speed = in_range(speed.to_i, self[:joy_right], self[:joy_left]).to_s(16).upcase.rjust(2, '0') req('Z', speed, :manual_zoom, priority: priority) do |data, resolve| val = extract(:manual_zoom, data, resolve) diff --git a/modules/panasonic/lcd/rs232.rb b/modules/panasonic/lcd/rs232.rb index a425f60e..2d39ebe7 100644 --- a/modules/panasonic/lcd/rs232.rb +++ b/modules/panasonic/lcd/rs232.rb @@ -69,12 +69,12 @@ def power(state, opt = nil) self[:power_target] = On do_send(:power_on, retries: 10, name: :power, delay: 10000, timeout: 15000) logger.debug "requested to power on" - do_send(:power_query) + power? else self[:power_target] = Off do_send(:power_off, retries: 10, name: :power, delay: 8000) logger.debug "requested to power off" - do_send(:power_query) + power? end end @@ -102,6 +102,7 @@ def switch_to(input) # Projector doesn't automatically unmute unmute if self[:mute] + power(true) if (self[:power] == false) logger.debug { "requested to switch to: #{input}" } do_send(:input, INPUTS[input], retries: 10, delay_on_receive: 2000).then do @@ -111,7 +112,7 @@ def switch_to(input) end def input? - do_send(:current_input) + do_send(:current_inputi, name: :input?) end # @@ -122,7 +123,7 @@ def mute_audio(val = true) logger.debug "requested to mute #{val}" do_send(:audio_mute, actual) # Audio + Video do_poll - end + end alias_method :mute, :mute_audio def unmute_audio @@ -131,12 +132,12 @@ def unmute_audio alias_method :unmute, :unmute_audio def muted? - do_send(:audio_mute_query) + do_send(:audio_mute_query, name: :muted?) end def volume(level) # Unable to query current volume - do_send(:volume, level.to_s.rjust(3, '0')).then { self[:volume] = level.to_i } + do_send(:volume, level.to_s.rjust(3, '0'), name: :volume?).then { self[:volume] = level.to_i } end def volume? @@ -144,7 +145,7 @@ def volume? end def do_poll - power?(priority: 0).then do + power?(priority: 0, name: :power?).then do if self[:power] input? volume? diff --git a/modules/panasonic/projector/rs232.rb b/modules/panasonic/projector/rs232.rb index 59d2593f..548c738b 100644 --- a/modules/panasonic/projector/rs232.rb +++ b/modules/panasonic/projector/rs232.rb @@ -191,7 +191,8 @@ def received(data, resolve, command) # Data is default received as a stri when :power_off self[:power] = false ensure_power_state - else + else + return :success unless command res = data case command[:name] when :power_query diff --git a/modules/qsc/q_sys_control.rb b/modules/qsc/q_sys_control.rb index 66da2024..4c206272 100644 --- a/modules/qsc/q_sys_control.rb +++ b/modules/qsc/q_sys_control.rb @@ -317,9 +317,9 @@ def received(data, resolve, command) case type when :fader - self["fader#{control_id}"] = (value.to_f * 10).to_i + self["#{control_id}"] = (value.to_f * 10).to_i when :mute - self["fader#{control_id}_mute"] = value.to_i == 1 + self["#{control_id}"] = value.to_i == 1 end else value = resp[2] @@ -352,9 +352,9 @@ def received(data, resolve, command) case type when :fader - self["fader#{control_id}"] = (value.to_f * 10).to_i + self["#{control_id}"] = (value.to_f * 10).to_i when :mute - self["fader#{control_id}_mute"] = value == 1 + self["#{control_id}"] = value == 1 end end else From 8b72e72a93eba0463ccd18e0ae3f20c5cde9e1ff Mon Sep 17 00:00:00 2001 From: Viv B Date: Mon, 26 Nov 2018 22:00:10 +1100 Subject: [PATCH 02/18] (panasonic:he50 camera) add support for basic auth --- modules/panasonic/camera/he50.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/panasonic/camera/he50.rb b/modules/panasonic/camera/he50.rb index 7da37063..0911cbbb 100644 --- a/modules/panasonic/camera/he50.rb +++ b/modules/panasonic/camera/he50.rb @@ -49,6 +49,8 @@ def on_update # {near: {zoom: val, pan: val, tilt: val}} @presets = setting(:presets) || {} + @username = setting(:username) + @password = setting(:password) self[:presets] = @presets.keys end @@ -392,6 +394,10 @@ def req(cmd, data, name, options = {}, &blk) else options[:name] = name end + if @password + options[:headers] ||= {} + options[:headers]['authorization'] = [@username, @password] + end request_string = "/cgi-bin/aw_ptz?cmd=%23#{cmd}#{data}&res=1" logger.debug { "requesting #{name}: #{request_string}" } get(request_string, options, &blk) From 5be4d53b6e6c656439790ce83afa9f3c6f3e7df1 Mon Sep 17 00:00:00 2001 From: Cameron Reeves Date: Fri, 30 Nov 2018 16:02:30 +1100 Subject: [PATCH 03/18] [Exchange Bookings] Add sensitivity check --- modules/aca/exchange_booking.rb | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/modules/aca/exchange_booking.rb b/modules/aca/exchange_booking.rb index ca04ef13..2180cba3 100644 --- a/modules/aca/exchange_booking.rb +++ b/modules/aca/exchange_booking.rb @@ -674,7 +674,7 @@ def delete_ews_booking(delete_at) meeting_time = Time.parse(meeting.ews_item[:start][:text]) # Remove any meetings that match the start time provided - if meeting_time.to_i == delete_at + if meeting_time.to_i == delete_at # new_booking = meeting.update_item!({ end: Time.now.utc.iso8601.chop }) meeting.delete!(:recycle, send_meeting_cancellations: 'SendOnlyToAll') @@ -760,6 +760,7 @@ def todays_bookings(first=false, skype_exists=false) self[:skype_meeting_pending] = true end set_skype_url = false + self[:skype_meeting_address] = links[0] system[:Skype].set_uri(links[0]) if skype_exists end end @@ -784,7 +785,12 @@ def todays_bookings(first=false, skype_exists=false) # Prevent connections handing with TIME_WAIT # cli.ews.connection.httpcli.reset_all - subject = item[:subject][:text] + if ["Private", "Confidential"].inculde?(meeting.sensitivity) + subject = meeting.sensitivity + else + subject = item[:subject][:text] + end + { :Start => start, :End => ending, From 5332eacfb0ae67e40c40b8ffd0d4ac73e11cf7a3 Mon Sep 17 00:00:00 2001 From: Cameron Reeves Date: Fri, 30 Nov 2018 16:10:17 +1100 Subject: [PATCH 04/18] [Exchange Bookings] Dont spell like an idiot --- modules/aca/exchange_booking.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/aca/exchange_booking.rb b/modules/aca/exchange_booking.rb index 2180cba3..3658115e 100644 --- a/modules/aca/exchange_booking.rb +++ b/modules/aca/exchange_booking.rb @@ -785,7 +785,7 @@ def todays_bookings(first=false, skype_exists=false) # Prevent connections handing with TIME_WAIT # cli.ews.connection.httpcli.reset_all - if ["Private", "Confidential"].inculde?(meeting.sensitivity) + if ["Private", "Confidential"].include?(meeting.sensitivity) subject = meeting.sensitivity else subject = item[:subject][:text] From 79d672b869d1b836207fcc7ded2e7ecbe79bfac0 Mon Sep 17 00:00:00 2001 From: William Le Date: Mon, 3 Dec 2018 15:21:20 +1100 Subject: [PATCH 05/18] (cisco:ce) Add in_call status to sx80, roomkit --- modules/cisco/collaboration_endpoint/room_kit.rb | 1 + modules/cisco/collaboration_endpoint/sx80.rb | 1 + 2 files changed, 2 insertions(+) diff --git a/modules/cisco/collaboration_endpoint/room_kit.rb b/modules/cisco/collaboration_endpoint/room_kit.rb index e240a459..56664e95 100644 --- a/modules/cisco/collaboration_endpoint/room_kit.rb +++ b/modules/cisco/collaboration_endpoint/room_kit.rb @@ -38,6 +38,7 @@ def connected props[:status] == :Idle || props.include?(:ghost) end self[:calls] = calls + self[:in_call] = calls.present? end end diff --git a/modules/cisco/collaboration_endpoint/sx80.rb b/modules/cisco/collaboration_endpoint/sx80.rb index c671c66e..04c9ae05 100644 --- a/modules/cisco/collaboration_endpoint/sx80.rb +++ b/modules/cisco/collaboration_endpoint/sx80.rb @@ -38,6 +38,7 @@ def connected props[:status] == :Idle || props.include?(:ghost) end self[:calls] = calls + self[:in_call] = calls.present? end end From e2fa635483d4d51d8907de6fb2041d356220128f Mon Sep 17 00:00:00 2001 From: William Le Date: Mon, 3 Dec 2018 15:31:04 +1100 Subject: [PATCH 06/18] (cisoc:ce) fix missing in_call when calls={} --- modules/cisco/collaboration_endpoint/room_kit.rb | 1 + modules/cisco/collaboration_endpoint/sx80.rb | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/cisco/collaboration_endpoint/room_kit.rb b/modules/cisco/collaboration_endpoint/room_kit.rb index 56664e95..ac322243 100644 --- a/modules/cisco/collaboration_endpoint/room_kit.rb +++ b/modules/cisco/collaboration_endpoint/room_kit.rb @@ -32,6 +32,7 @@ def connected end self[:calls] = {} + self[:in_call] = false register_feedback '/Status/Call' do |call| calls = self[:calls].deep_merge call calls.reject! do |_, props| diff --git a/modules/cisco/collaboration_endpoint/sx80.rb b/modules/cisco/collaboration_endpoint/sx80.rb index 04c9ae05..feb7dde0 100644 --- a/modules/cisco/collaboration_endpoint/sx80.rb +++ b/modules/cisco/collaboration_endpoint/sx80.rb @@ -32,6 +32,7 @@ def connected end self[:calls] = {} + self[:in_call] = false register_feedback '/Status/Call' do |call| calls = self[:calls].deep_merge call calls.reject! do |_, props| @@ -87,7 +88,7 @@ def mic_mute(state = On) command 'Call DTMFSend' => :dtmf_send, CallId: (0..65534), DTMFString: String - + command 'Dial' => :dial, Number: String, Protocol_: [:H320, :H323, :Sip, :Spark], @@ -180,7 +181,7 @@ def switch_to(input) presentation_stop else if self[:configuration]&.dig(:Video, :Input, :Connector, input, :InputSourceType) == :camera - camera_select connector_id: input + camera_select connector_id: input else presentation_start presentation_source: input end From 1b2facdc64eafd6bb44ec40ced41e17b71d39aa2 Mon Sep 17 00:00:00 2001 From: William Le Date: Tue, 4 Dec 2018 13:47:08 +1100 Subject: [PATCH 07/18] (lutron) trigger alias from scene to button_press As button_press appears to be the main integration hook according to internet research into automated "Lutron Integation Report" --- modules/lutron/lighting.rb | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/modules/lutron/lighting.rb b/modules/lutron/lighting.rb index 42cbcab6..2223a051 100644 --- a/modules/lutron/lighting.rb +++ b/modules/lutron/lighting.rb @@ -115,6 +115,7 @@ def daylight(area, mode) def button_press(area, button) send_cmd 'DEVICE', area, button, 3 end + alias trigger button_press def led(area, device, state) val = if state.is_a?(Integer) @@ -134,10 +135,6 @@ def led?(area, device) # ============= # COMPATIBILITY # ============= - def trigger(area, scene) - scene(area, scene, @trigger_type) - end - def light_level(area, level, component = nil, fade = 1000) if component level(area, level, fade, component) @@ -217,4 +214,4 @@ def send_query(*command, **options) logger.debug { "Requesting: #{cmd}" } send("#{cmd}\r\n", options) end -end \ No newline at end of file +end From 4aab63cadd456f82847dc83d6a5d60a391d10a12 Mon Sep 17 00:00:00 2001 From: Cameron Reeves Date: Fri, 7 Dec 2018 15:52:26 +1100 Subject: [PATCH 08/18] [Google Driver] Fix syntax errors --- modules/aca/google_refresh_booking.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/aca/google_refresh_booking.rb b/modules/aca/google_refresh_booking.rb index 19a1e589..d6597ef3 100644 --- a/modules/aca/google_refresh_booking.rb +++ b/modules/aca/google_refresh_booking.rb @@ -82,7 +82,7 @@ class Aca::GoogleRefreshBooking ews_room: 'room@email.address', # Optional EWS for creating and removing bookings - google_organiser_location: 'attendees' + google_organiser_location: 'attendees', google_client_id: '', google_secret: '', google_redirect_uri: '', @@ -334,7 +334,7 @@ def fetch_bookings(*args) authorization = Google::Auth::UserRefreshCredentials.new options - Calendar = Google::Apis::CalendarV3 + # Calendar = Google::Apis::CalendarV3 calendar = Calendar::CalendarService.new calendar.authorization = authorization events = calendar.list_events(system.email) From 655566ade1cac558bcc1a97cd1173758cd2d45ef Mon Sep 17 00:00:00 2001 From: Cameron Reeves Date: Fri, 7 Dec 2018 16:24:44 +1100 Subject: [PATCH 09/18] [Exchange Driver] Add name to panel bookings and filter sensitive bookings --- modules/aca/exchange_booking.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/aca/exchange_booking.rb b/modules/aca/exchange_booking.rb index 3658115e..07cfa7c5 100644 --- a/modules/aca/exchange_booking.rb +++ b/modules/aca/exchange_booking.rb @@ -614,10 +614,15 @@ def get_attr(entry, attr_name) def make_ews_booking(user_email: nil, subject: 'On the spot booking', room_email:, start_time:, end_time:) user_email ||= self[:email] # if swipe card used + if subject.empty? + subject = "Quick Book by Display Panel On #{system.name}" + end + booking = { subject: subject, start: start_time, - end: end_time + end: end_time, + location: system.name } if user_email From 59b8617734c353256d6adaa895cfe503586f2a99 Mon Sep 17 00:00:00 2001 From: Viv B Date: Mon, 10 Dec 2018 15:09:48 +1100 Subject: [PATCH 10/18] (panasonic:lcd) add polling enable setting --- modules/panasonic/lcd/protocol2.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/panasonic/lcd/protocol2.rb b/modules/panasonic/lcd/protocol2.rb index 03eefe58..f7c25247 100755 --- a/modules/panasonic/lcd/protocol2.rb +++ b/modules/panasonic/lcd/protocol2.rb @@ -48,6 +48,7 @@ def on_load def on_update @username = setting(:username) || 'dispadmin' @password = setting(:password) || '@Panasonic' + @polling_enabled = setting(:polling_enabled) end def connected @@ -150,7 +151,7 @@ def volume? def do_poll power?(priority: 0).then do - if self[:power] + if self[:power] && @polling_enabled muted? volume? end From e0e6c90521a51146a6ba696099e298654ee2752a Mon Sep 17 00:00:00 2001 From: Cameron Reeves Date: Tue, 11 Dec 2018 14:54:55 +1100 Subject: [PATCH 11/18] [EWS Lib] Access fields in current user by symbol --- lib/microsoft/exchange.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/microsoft/exchange.rb b/lib/microsoft/exchange.rb index f740c43d..9dac4d88 100644 --- a/lib/microsoft/exchange.rb +++ b/lib/microsoft/exchange.rb @@ -296,8 +296,8 @@ def create_booking(room_email:, start_param:, end_param:, subject:, description: booking[:end] = end_object.utc.iso8601.chop # Add the current user passed in as an attendee - mailbox = { email_address: current_user.email } - mailbox[:name] = current_user.name if current_user.name + mailbox = { email_address: current_user[:email] } + mailbox[:name] = current_user[:name] if current_user[:name] booking[:required_attendees] = [{ attendee: { mailbox: mailbox } }] @@ -323,7 +323,7 @@ def create_booking(room_email:, start_param:, end_param:, subject:, description: STDERR.flush if mailbox_location == 'user' - mailbox = current_user.email + mailbox = current_user[:email] elsif mailbox_location == 'room' mailbox = room_email end @@ -378,7 +378,7 @@ def update_booking(booking_id:, room_email:nil, start_param:nil, end_param:nil, booking[:end] = Time.at(end_param.to_i / 1000).utc.iso8601.chop if end_param if mailbox_location == 'user' - mailbox = current_user.email + mailbox = current_user[:email] elsif mailbox_location == 'room' mailbox = room_email end From 8ed741d2271398add28f9c3ce61fde012842fc0a Mon Sep 17 00:00:00 2001 From: Cameron Reeves Date: Mon, 11 Feb 2019 12:11:00 +1100 Subject: [PATCH 12/18] [EWS Panel] Add new setting --- modules/aca/exchange_booking.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/aca/exchange_booking.rb b/modules/aca/exchange_booking.rb index ca04ef13..194d349b 100644 --- a/modules/aca/exchange_booking.rb +++ b/modules/aca/exchange_booking.rb @@ -113,6 +113,7 @@ def on_update self[:last_meeting_started] = setting(:last_meeting_started) self[:cancel_meeting_after] = setting(:cancel_meeting_after) self[:booking_min_duration] = setting(:booking_min_duration) + self[:booking_cancel_timeout] = setting(:booking_cancel_timeout) self[:booking_disable_future] = setting(:booking_disable_future) self[:booking_max_duration] = setting(:booking_max_duration) self[:hide_all_day_bookings] = setting(:hide_all_day_bookings) From 8a5ea29fe83dee7186d32ff528da4d5ee17f5c80 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 25 Feb 2019 12:33:48 +1100 Subject: [PATCH 13/18] panasonic:lcd control updates --- modules/panasonic/lcd/rs232.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/panasonic/lcd/rs232.rb b/modules/panasonic/lcd/rs232.rb index 2d39ebe7..83059a3a 100644 --- a/modules/panasonic/lcd/rs232.rb +++ b/modules/panasonic/lcd/rs232.rb @@ -123,7 +123,7 @@ def mute_audio(val = true) logger.debug "requested to mute #{val}" do_send(:audio_mute, actual) # Audio + Video do_poll - end + end alias_method :mute, :mute_audio def unmute_audio @@ -204,6 +204,7 @@ def received(data, resolve, command) # Data is default received as a stri self[:power] = true ensure_power_state else + return :success unless command res = data.split(':')[1] case command[:name] when :power_query @@ -249,7 +250,8 @@ def do_send(command, param = nil, **options) cmd = "#{COMMANDS[command]}:#{param}" end - full_cmd = hex_to_byte('02') << cmd << hex_to_byte('030D') + full_cmd = "#{hex_to_byte('02')}#{cmd}#{hex_to_byte('030D')}" + logger.debug { "requesting: #{full_cmd}" } # Will only accept a single request at a time. send(full_cmd, options) From 80552186f76fe557e7594f8757302710f80e59fc Mon Sep 17 00:00:00 2001 From: viv Date: Mon, 25 Feb 2019 13:13:36 +1100 Subject: [PATCH 14/18] add booking removal toggle setting --- modules/aca/exchange_booking.rb | 70 +++++++++++++++++---------------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/modules/aca/exchange_booking.rb b/modules/aca/exchange_booking.rb index 07cfa7c5..aea25359 100644 --- a/modules/aca/exchange_booking.rb +++ b/modules/aca/exchange_booking.rb @@ -80,7 +80,8 @@ class Aca::ExchangeBooking 'password', { http_opts: { ssl_verify_mode: 0 } } ], - ews_room: 'room@email.address' + ews_room: 'room@email.address', + ews_booking_can_remove: true }) @@ -119,6 +120,7 @@ def on_update self[:timeout] = setting(:timeout) self[:arrow_direction] = setting(:arrow_direction) self[:icon] = setting(:icon) + self[:ews_booking_can_remove] = setting(:ews_booking_can_remove) @hide_all_day_bookings = Boolean(setting(:hide_all_day_bookings)) @check_meeting_ending = setting(:check_meeting_ending) # seconds before meeting ending @@ -648,47 +650,49 @@ def make_ews_booking(user_email: nil, subject: 'On the spot booking', room_email end def delete_ews_booking(delete_at) - now = Time.now - if @timezone - start = now.in_time_zone(@timezone).midnight - ending = now.in_time_zone(@timezone).tomorrow.midnight - else - start = now.midnight - ending = now.tomorrow.midnight - end + if ews_booking_can_remove + now = Time.now + if @timezone + start = now.in_time_zone(@timezone).midnight + ending = now.in_time_zone(@timezone).tomorrow.midnight + else + start = now.midnight + ending = now.tomorrow.midnight + end - count = 0 + count = 0 - cli = Viewpoint::EWSClient.new(*@ews_creds) + cli = Viewpoint::EWSClient.new(*@ews_creds) - if @use_act_as - # TODO:: think this line can be removed?? - # delete_at = Time.parse(delete_at.to_s).to_i + if @use_act_as + # TODO:: think this line can be removed?? + # delete_at = Time.parse(delete_at.to_s).to_i - opts = {} - opts[:act_as] = @ews_room if @ews_room + opts = {} + opts[:act_as] = @ews_room if @ews_room - folder = cli.get_folder(:calendar, opts) - items = folder.items({:calendar_view => {:start_date => start.utc.iso8601, :end_date => ending.utc.iso8601}}) - else - cli.set_impersonation(Viewpoint::EWS::ConnectingSID[@ews_connect_type], @ews_room) if @ews_room - items = cli.find_items({:folder_id => :calendar, :calendar_view => {:start_date => start.utc.iso8601, :end_date => ending.utc.iso8601}}) - end + folder = cli.get_folder(:calendar, opts) + items = folder.items({:calendar_view => {:start_date => start.utc.iso8601, :end_date => ending.utc.iso8601}}) + else + cli.set_impersonation(Viewpoint::EWS::ConnectingSID[@ews_connect_type], @ews_room) if @ews_room + items = cli.find_items({:folder_id => :calendar, :calendar_view => {:start_date => start.utc.iso8601, :end_date => ending.utc.iso8601}}) + end - items.each do |meeting| - meeting_time = Time.parse(meeting.ews_item[:start][:text]) + items.each do |meeting| + meeting_time = Time.parse(meeting.ews_item[:start][:text]) - # Remove any meetings that match the start time provided - if meeting_time.to_i == delete_at - # new_booking = meeting.update_item!({ end: Time.now.utc.iso8601.chop }) + # any meetings that match the start time provided + if meeting_time.to_i == delete_at + # new_booking = meeting.update_item!({ end: Time.now.utc.iso8601.chop }) - meeting.delete!(:recycle, send_meeting_cancellations: 'SendOnlyToAll') - count += 1 - end - end + meeting.delete!(:recycle, send_meeting_cancellations: 'SendOnlyToAll') + count += 1 + end + end - # Return the number of meetings removed - count + # Return the number of meetings removed + count + end end def todays_bookings(first=false, skype_exists=false) From e3fd537ed26e4cde7d2b4de85e1b5e898cb1769a Mon Sep 17 00:00:00 2001 From: viv Date: Mon, 25 Feb 2019 13:21:50 +1100 Subject: [PATCH 15/18] fix instance variable --- modules/aca/exchange_booking.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/aca/exchange_booking.rb b/modules/aca/exchange_booking.rb index 9dfed533..4f5a0ae8 100644 --- a/modules/aca/exchange_booking.rb +++ b/modules/aca/exchange_booking.rb @@ -121,7 +121,7 @@ def on_update self[:timeout] = setting(:timeout) self[:arrow_direction] = setting(:arrow_direction) self[:icon] = setting(:icon) - self[:ews_booking_can_remove] = setting(:ews_booking_can_remove) + @ews_booking_can_remove = setting(:ews_booking_can_remove) @hide_all_day_bookings = Boolean(setting(:hide_all_day_bookings)) @check_meeting_ending = setting(:check_meeting_ending) # seconds before meeting ending @@ -651,7 +651,7 @@ def make_ews_booking(user_email: nil, subject: 'On the spot booking', room_email end def delete_ews_booking(delete_at) - if ews_booking_can_remove + if @ews_booking_can_remove now = Time.now if @timezone start = now.in_time_zone(@timezone).midnight From 0425f0eb7c41b33ba65c0d4894109c4585e70001 Mon Sep 17 00:00:00 2001 From: viv Date: Mon, 25 Feb 2019 14:08:12 +1100 Subject: [PATCH 16/18] [aca:exchange] remove booking remove toggle --- modules/aca/exchange_booking.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/modules/aca/exchange_booking.rb b/modules/aca/exchange_booking.rb index 4f5a0ae8..6eb2115f 100644 --- a/modules/aca/exchange_booking.rb +++ b/modules/aca/exchange_booking.rb @@ -81,7 +81,6 @@ class Aca::ExchangeBooking { http_opts: { ssl_verify_mode: 0 } } ], ews_room: 'room@email.address', - ews_booking_can_remove: true }) @@ -121,7 +120,6 @@ def on_update self[:timeout] = setting(:timeout) self[:arrow_direction] = setting(:arrow_direction) self[:icon] = setting(:icon) - @ews_booking_can_remove = setting(:ews_booking_can_remove) @hide_all_day_bookings = Boolean(setting(:hide_all_day_bookings)) @check_meeting_ending = setting(:check_meeting_ending) # seconds before meeting ending @@ -651,7 +649,6 @@ def make_ews_booking(user_email: nil, subject: 'On the spot booking', room_email end def delete_ews_booking(delete_at) - if @ews_booking_can_remove now = Time.now if @timezone start = now.in_time_zone(@timezone).midnight @@ -693,7 +690,6 @@ def delete_ews_booking(delete_at) # Return the number of meetings removed count - end end def todays_bookings(first=false, skype_exists=false) From cac1cf3bff8063abb0dae54199351a7d6a16c375 Mon Sep 17 00:00:00 2001 From: viv Date: Mon, 25 Feb 2019 14:30:30 +1100 Subject: [PATCH 17/18] [aca:exchange] remove training comma --- modules/aca/exchange_booking.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/aca/exchange_booking.rb b/modules/aca/exchange_booking.rb index 6eb2115f..34590700 100644 --- a/modules/aca/exchange_booking.rb +++ b/modules/aca/exchange_booking.rb @@ -80,7 +80,7 @@ class Aca::ExchangeBooking 'password', { http_opts: { ssl_verify_mode: 0 } } ], - ews_room: 'room@email.address', + ews_room: 'room@email.address' }) From 6e73f059835ff0a6407956ec22d773a5634a364a Mon Sep 17 00:00:00 2001 From: Stephen von Takach Date: Mon, 25 Feb 2019 13:45:12 +1100 Subject: [PATCH 18/18] (excahnge bookings) add reason for meeting cancel_meeting logs to persisted logs too for easier debugging --- modules/aca/exchange_booking.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/aca/exchange_booking.rb b/modules/aca/exchange_booking.rb index 34590700..a745b7f2 100644 --- a/modules/aca/exchange_booking.rb +++ b/modules/aca/exchange_booking.rb @@ -384,7 +384,7 @@ def start_meeting(meeting_ref) define_setting(:last_meeting_started, meeting_ref) end - def cancel_meeting(start_time) + def cancel_meeting(start_time, reason = "timeout") task { if start_time.class == Integer delete_ews_booking (start_time / 1000).to_i @@ -394,7 +394,7 @@ def cancel_meeting(start_time) delete_ews_booking start_time.to_i end }.then(proc { |count| - logger.debug { "successfully removed #{count} bookings" } + logger.warn { "successfully removed #{count} bookings due to #{reason}" } self[:last_meeting_started] = 0 self[:meeting_pending] = 0 @@ -796,7 +796,7 @@ def todays_bookings(first=false, skype_exists=false) else subject = item[:subject][:text] end - + { :Start => start, :End => ending,