diff options
Diffstat (limited to 'app')
| -rw-r--r-- | app/controllers/config_snom_controller.rb | 5 | ||||
| -rw-r--r-- | app/controllers/config_yealink_controller.rb | 310 | ||||
| -rw-r--r-- | app/models/phone.rb | 51 | ||||
| -rw-r--r-- | app/views/config_snom/_snom_phone_directory.xml.haml | 37 | ||||
| -rw-r--r-- | app/views/config_yealink/_phone_directory.xml.haml | 14 | ||||
| -rw-r--r-- | app/views/config_yealink/_phone_menu.xml.haml | 6 | ||||
| -rw-r--r-- | app/views/config_yealink/show.text.haml | 41 | ||||
| -rw-r--r-- | app/views/gateways/show.xml.haml | 4 |
8 files changed, 450 insertions, 18 deletions
diff --git a/app/controllers/config_snom_controller.rb b/app/controllers/config_snom_controller.rb index 1cac4b2..5b31064 100644 --- a/app/controllers/config_snom_controller.rb +++ b/app/controllers/config_snom_controller.rb @@ -63,7 +63,10 @@ class ConfigSnomController < ApplicationController if !params[:phone].blank? @phone = Phone.where({ :id => params[:phone].to_i }).first if !params[:sip_account].blank? - @sip_account = @phone.sip_accounts.where({ :id => params[:sip_account].to_i }).first + @sip_account = @phone.sip_accounts.where({ :id => params[:sip_account].to_i }).first || + if !@sip_account && @phone.fallback_sip_account && @phone.fallback_sip_account.id == params[:sip_account].to_i + @sip_account = @phone.fallback_sip_account + end end end diff --git a/app/controllers/config_yealink_controller.rb b/app/controllers/config_yealink_controller.rb new file mode 100644 index 0000000..0efcec0 --- /dev/null +++ b/app/controllers/config_yealink_controller.rb @@ -0,0 +1,310 @@ +class ConfigYealinkController < ApplicationController + + MAX_SIP_ACCOUNTS = 5 + MAX_HANDSETS = 5 + MAX_PHONEBOOK_ENTRIES = 1000 + IGNORE_PHONEBOOK_EXCEEDING = 500 + SIP_DEFAULT_PORT = 5060 + + before_filter { + @mac_address = params[:mac_address].to_s.upcase.gsub(/[^0-9A-F]/,'') + } + + def show + if @mac_address + @phone = Phone.where(:mac_address => @mac_address).first + end + + if ! @phone && GsParameter.get('PROVISIONING_AUTO_ADD_PHONE') + tenant = Tenant.where(:id => GsParameter.get('PROVISIONING_AUTO_TENANT_ID')).first + if ! tenant + render( + :status => 404, + :layout => false, + :content_type => 'text/plain', + :text => "<!-- Tenant not found -->", + ) + return + end + + @phone = tenant.phones.build + @phone.mac_address = @mac_address + @phone.hot_deskable = true + @phone.tenant = tenant + @phone.http_user = 'admin' + + if !GsParameter.get('PROVISIONING_SET_HTTP_PASSWORD').nil? && @phone.http_password.blank? + if GsParameter.get('PROVISIONING_SET_HTTP_PASSWORD').class == Fixnum + @phone.update_attributes({ :http_password => SecureRandom.hex(GsParameter.get('PROVISIONING_SET_HTTP_PASSWORD')) }) + elsif GsParameter.get('PROVISIONING_SET_HTTP_PASSWORD').class == String + @phone.update_attributes({ :http_password => GsParameter.get('PROVISIONING_SET_HTTP_PASSWORD') }) + end + end + + phone_model = nil + if request.env['HTTP_USER_AGENT'].index('W52P') + phone_model = PhoneModel.where(:name => 'Yealink W52P').first + end + + if ! phone_model + render( + :status => 404, + :layout => false, + :content_type => 'text/plain', + :text => "<!-- Phone Model not found in: \"#{request.env['HTTP_USER_AGENT']}\" -->", + ) + return + end + + @phone.phone_model = phone_model + if ! @phone.save + render( + :status => 500, + :layout => false, + :content_type => 'text/plain', + :text => "<!-- #{@phone.errors.messages.inspect} -->", + ) + return + end + + if ! GsParameter.get('PROVISIONING_AUTO_ADD_SIP_ACCOUNT') + return + end + + caller_name_index = 0 + sip_account_last = tenant.sip_accounts.where('caller_name LIKE ?', "#{GsParameter.get('PROVISIONING_AUTO_SIP_ACCOUNT_CALLER_PREFIX')}%").sort { |item1, item2| + item1.caller_name.gsub(/[^0-9]/, '').to_i <=> item2.caller_name.gsub(/[^0-9]/, '').to_i + }.last + + if sip_account_last + caller_name_index = sip_account_last.caller_name.gsub(/[^0-9]/, '').to_i + end + caller_name_index = caller_name_index + 1 + + @sip_account = tenant.sip_accounts.build + @sip_account.caller_name = "#{GsParameter.get('PROVISIONING_AUTO_SIP_ACCOUNT_CALLER_PREFIX')}#{caller_name_index}" + @sip_account.call_waiting = GsParameter.get('CALL_WAITING') + @sip_account.clir = GsParameter.get('DEFAULT_CLIR_SETTING') + @sip_account.clip = GsParameter.get('DEFAULT_CLIP_SETTING') + @sip_account.voicemail_pin = random_pin + @sip_account.hotdeskable = false + loop do + @sip_account.auth_name = SecureRandom.hex(GsParameter.get('DEFAULT_LENGTH_SIP_AUTH_NAME')) + break unless SipAccount.exists?(:auth_name => @sip_account.auth_name) + end + @sip_account.password = SecureRandom.hex(GsParameter.get('DEFAULT_LENGTH_SIP_PASSWORD')) + + if ! @sip_account.save + render( + :status => 500, + :layout => false, + :content_type => 'text/plain', + :text => "<!-- #{@sip_account.errors.messages.inspect} -->", + ) + return + end + + @phone.fallback_sip_account = @sip_account + if ! @phone.save + render( + :status => 500, + :layout => false, + :content_type => 'text/plain', + :text => "<!-- #{@phone.errors.messages.inspect} -->", + ) + return + end + end + + if ! @phone + render( + :status => 404, + :layout => false, + :content_type => 'text/plain', + :text => "<!-- Phone not found -->", + ) + return false + end + + if @phone.sip_accounts.any? + sip_accounts = @phone.sip_accounts + else + sip_accounts = [@phone.fallback_sip_account] + end + + base_url = "#{request.protocol}#{request.host_with_port}/config_yealink/#{@phone.id}/#{sip_accounts.first.id}/" + @phonebook_url = base_url + 'phone_book.xml' + + @sip_accounts = Array.new(MAX_SIP_ACCOUNTS) {|index| + sip_account = sip_accounts[index] + sip_account_entry = sip_account_defaults + + if sip_account + sip_account_entry['enable'] = '1' + sip_account_entry['label'] = sip_account.caller_name + sip_account_entry['auth_name'] = sip_account.auth_name + sip_account_entry['password'] = sip_account.password + sip_account_entry['user_name'] = sip_account.auth_name + sip_account_entry['sip_server_host'] = sip_account.sip_domain + sip_account_entry['outbound_host'] = sip_account.sip_domain + sip_account_entry['sip_listen_port'] = 5060 + (index*2) + end + + sip_account_entry + } + + @handsets = Array.new(MAX_HANDSETS) {|index| + handset = {} + sip_account = sip_accounts[index] + if sip_account + handset['name'] = sip_account.caller_name + else + handset['name'] = "Handset #{index+1}" + end + + handset + } + + @provisioning_url = "#{request.protocol}#{request.host_with_port}" + + if ! request.env['HTTP_USER_AGENT'].index('Yealink') + Rails.logger.info "---> User-Agent indicates not a Yealink phone (#{request.env['HTTP_USER_AGENT'].inspect})" + else + Rails.logger.info "---> Phone #{@mac_address.inspect}, IP address #{request_remote_ip.inspect}" + @phone.update_attributes({ :ip_address => request_remote_ip }) + end + end + + def phone_book + @phone = Phone.where({ :id => params[:phone].to_i }).first + if ! @phone + render( + :status => 404, + :layout => false, + :content_type => 'text/plain', + :text => "<!-- Phone not found -->", + ) + return false + end + + if @phone.sip_accounts.any? + sip_accounts = @phone.sip_accounts + else + sip_accounts = [@phone.fallback_sip_account] + end + + base_url = "#{request.protocol}#{request.host_with_port}/config_yealink/#{@phone.id}/#{sip_accounts.first.id}" + @phonebook_url = "#{base_url}/phone_book.xml" + + @phone_books = Array.new() + tenant = nil + phone_book_ids = {} + if @phone.phoneable.class == User + @phone.phoneable.phone_books.each do |phone_book| + if @phone_books.count >= MAX_PHONEBOOK_ENTRIES + break + end + if phone_book.phone_book_entries.count > IGNORE_PHONEBOOK_EXCEEDING + next + end + + @phone_books << {:name => phone_book.name, :url => "#{base_url}/#{phone_book.id}/phone_book.xml"} + phone_book_ids[phone_book.id] + end + tenant = @phone.phoneable.current_tenant + elsif @phone.phoneable.class == Tenant + tenant = @phone.phoneable + end + + if tenant + tenant.phone_books.each do |phone_book| + if @phone_books.count >= MAX_PHONEBOOK_ENTRIES + break + end + if phone_book.phone_book_entries.count > IGNORE_PHONEBOOK_EXCEEDING + next + end + + @phone_books << {:name => phone_book.name, :url => "#{base_url}/#{phone_book.id}/phone_book.xml"} + phone_book_ids[phone_book.id] + end + end + + phone_book_id = params[:phone_book].to_i + if @phone_books.any? && phone_book_ids[phone_book_id] + @phone_book = PhoneBook.where(:id => phone_book_id).first + end + + @phone_book = PhoneBook.where(:id => phone_book_id).first + + if @phone_book + respond_to { |format| + format.any { + self.formats = [ :xml ] + render :action => '_phone_directory' + } + } + else + respond_to { |format| + format.any { + self.formats = [ :xml ] + render :action => '_phone_menu' + } + } + end + + end + + private + def sip_account_defaults + sip_account_entry = { + 'enable' => '0', + 'label' => '', + 'display_name' => 'Call', + 'auth_name' => '', + 'password' => '', + 'user_name' => '', + 'sip_server_host' => '', + 'sip_server_port' => SIP_DEFAULT_PORT, + 'outbound_proxy_enable' => '1', + 'outbound_host' => '', + 'outbound_port' => SIP_DEFAULT_PORT, + 'transport' => '0', + 'backup_outbound_host' => '', + 'backup_outbound_port' => '', + 'anonymous_call' => '0', + 'anonymous_call_oncode' => '', + 'anonymous_call_offcode' => '', + 'reject_anonymous_call' => '0', + 'anonymous_reject_oncode' => '', + 'anonymous_reject_offcode' => '', + 'sip_listen_port' => '', + 'expires' => '', + '100rel_enable' => '', + 'precondition' => '', + 'subscribe_register' => '', + 'subscribe_mwi' => '1', + 'subscribe_mwi_expires' => '', + 'cid_source' => '', + 'session_timer.enable' => '', + 'session_timer.expires' => '', + 'session_timer.refresher' => '', + 'enable_user_equal_phone' => '', + 'srtp_encryption' => '', + 'ptime' => '', + 'subscribe_mwi_to_vm' => '1', + 'register_mac' => '', + 'register_line' => '', + 'reg_fail_retry_interval' => '', + 'enable_signal_encode' => '', + 'signal_encode_key' => '', + 'dtmf.type' => '1', + 'dtmf.dtmf_payload' => '', + 'dtmf.info_type' => '', + 'dnd.enable' => '0', + 'dnd.on_code' => '', + 'dnd.off_code' => '', + } + end + +end diff --git a/app/models/phone.rb b/app/models/phone.rb index 93553a2..a11a400 100644 --- a/app/models/phone.rb +++ b/app/models/phone.rb @@ -113,6 +113,57 @@ class Phone < ActiveRecord::Base rescue return false end + elsif self.phone_model.manufacturer.ieee_name == 'XIAMEN YEALINK NETWORK TECHNOLOGY CO.,LTD' + if !sip_account + self.sip_accounts.where(:sip_accountable_type => self.phoneable_type).each do |sip_account_associated| + if sip_account_associated.registration + sip_account = sip_account_associated + break + end + end + end + + if ! sip_account or ! sip_account.registration + require 'open-uri' + begin + if open("http://#{self.ip_address}/cgi-bin/ConfigManApp.com?key=Reboot", :http_basic_authentication=>['admin', self.http_password], :proxy => nil) + return true + end + rescue + return false + end + end + + require 'freeswitch_event' + event = FreeswitchEvent.new("NOTIFY") + event.add_header("profile", "gemeinschaft") + event.add_header("event-string", "check-sync;reboot=#{reboot.to_s}") + event.add_header("user", sip_account.auth_name) + event.add_header("host", sip_account.sip_domain.host) + event.add_header("content-type", "application/simple-message-summary") + return event.fire() + elsif self.phone_model.manufacturer.ieee_name == 'Polycom' + if !sip_account + self.sip_accounts.where(:sip_accountable_type => self.phoneable_type).each do |sip_account_associated| + if sip_account_associated.registration + sip_account = sip_account_associated + break + end + end + end + + if ! sip_account or ! sip_account.registration + return false + end + + require 'freeswitch_event' + event = FreeswitchEvent.new("NOTIFY") + event.add_header("profile", "gemeinschaft") + event.add_header("event-string", "check-sync;reboot=#{reboot.to_s}") + event.add_header("user", sip_account.auth_name) + event.add_header("host", sip_account.sip_domain.host) + event.add_header("content-type", "application/simple-message-summary") + return event.fire() end return false diff --git a/app/views/config_snom/_snom_phone_directory.xml.haml b/app/views/config_snom/_snom_phone_directory.xml.haml index 698f2e5..776e504 100644 --- a/app/views/config_snom/_snom_phone_directory.xml.haml +++ b/app/views/config_snom/_snom_phone_directory.xml.haml @@ -1,19 +1,22 @@ !!! XML -%SnomIPPhoneDirectory{:speedselect => 'off'} - %Title= @phone_xml_object[:title] - %Prompt= @phone_xml_object[:prompt] - - @phone_xml_object[:entries].each do |entry| - %DirectoryEntry{:sel => entry[:selected].to_s} - %Name= entry[:text] - %Telephone= entry[:number] +- cache(['snom_phone_directory', @sip_account.id, @phone_xml_object]) do + %SnomIPPhoneDirectory{:speedselect => 'off'} + %Title= @phone_xml_object[:title] + %Prompt= @phone_xml_object[:prompt] + - cache(['snom_phone_directory_table', @sip_account.id, @phone_xml_object[:entries]]) do + - @phone_xml_object[:entries].each do |entry| + - cache(['yealink_phone_directory_table_tr', @sip_account.id, entry]) do + %DirectoryEntry{:sel => entry[:selected].to_s} + %Name= entry[:text] + %Telephone= entry[:number] - - if @phone_xml_object[:softkeys] - - @phone_xml_object[:softkeys].each do |softkey| - %SoftKeyItem - %Name= softkey[:name] - - if ! softkey[:label].blank? - %Label= softkey[:label] - - if ! softkey[:url].blank? - %URL= softkey[:url] - - if ! softkey[:softkey].blank? - %URL= softkey[:softkey] + - if @phone_xml_object[:softkeys] + - @phone_xml_object[:softkeys].each do |softkey| + %SoftKeyItem + %Name= softkey[:name] + - if ! softkey[:label].blank? + %Label= softkey[:label] + - if ! softkey[:url].blank? + %URL= softkey[:url] + - if ! softkey[:softkey].blank? + %URL= softkey[:softkey] diff --git a/app/views/config_yealink/_phone_directory.xml.haml b/app/views/config_yealink/_phone_directory.xml.haml new file mode 100644 index 0000000..50d6561 --- /dev/null +++ b/app/views/config_yealink/_phone_directory.xml.haml @@ -0,0 +1,14 @@ +%YealinkIPPhoneDirectory + - cache(['yealink_phone_directory_table', @phone_book.id, @phone_book.phone_book_entries]) do + - @phone_book.phone_book_entries.each do |phone_book_entry| + - cache(['yealink_phone_directory_table_tr', @phone_book.id, phone_book_entry]) do + - phone_numbers = phone_book_entry.phone_numbers + - if !phone_book_entry.to_s.blank? && phone_numbers.any? + - mobile_phone = phone_numbers.where(:name => 'mobile').first + - phone = (phone_numbers - [mobile_phone]).first + %DirectoryEntry + %Name= phone_book_entry.to_s + - if phone + %Telephone= phone.number + - if mobile_phone + %Telephone= mobile_phone.number diff --git a/app/views/config_yealink/_phone_menu.xml.haml b/app/views/config_yealink/_phone_menu.xml.haml new file mode 100644 index 0000000..4ed41ec --- /dev/null +++ b/app/views/config_yealink/_phone_menu.xml.haml @@ -0,0 +1,6 @@ +%YealinkIPPhoneMenu + %Title Gemeinschaft + - @phone_books.each do |phone_book| + %MenuItem + %Name= phone_book[:name] + %URL= phone_book[:url] diff --git a/app/views/config_yealink/show.text.haml b/app/views/config_yealink/show.text.haml new file mode 100644 index 0000000..a654e19 --- /dev/null +++ b/app/views/config_yealink/show.text.haml @@ -0,0 +1,41 @@ += '#!version:1.0.0.1' + += 'lang.wui = English' += 'call_waiting.enable = 1' += 'voice.tone.country = Germany' += 'auto_provision.pnp_enable = 1' += 'auto_provision.mode = 1' += 'auto_provision.repeat.enable = 0' += 'auto_provision.repeat.minutes = 3600' += 'auto_provision.weekly.enalbe = 0' += 'auto_provision.weekly.mask = 0123456' += 'auto_provision.weekly.begin_time = 00:00' += 'auto_provision.weekly.end_time = 00:00' += 'auto_provision.server.url = ' + @provisioning_url += 'auto_provision.server.username = ' += 'auto_provision.server.password = ' += 'local_time.time_zone = +1' += 'local_time.time_zone_name = Germany(Berlin)' += 'local_time.summer_time = 2' += 'local_time.dst_time_type = 1' += 'local_time.start_time = ' += 'local_time.end_time = ' += 'local_time.offset_time = 60' + += 'local_time.ntp_server1 = ' += 'local_time.ntp_server2 = ' += 'security.user_password = admin:' + (@phone.http_password.blank? ? '0000' : @phone.http_password.to_s) + + +- @sip_accounts.each_with_index do |sip_account, index| + - i = index + 1 + - sip_account.each_pair do |key, value| + = "account.#{i}.#{key} = #{value}" + +- @handsets.each_with_index do |handset, index| + - i = index + 1 + - handset.each_pair do |key, value| + = "handset.#{i}.#{key} = #{value}" + += "remote_phonebook.data.1.url = #{@phonebook_url}" += 'remote_phonebook.data.1.name = Gemeinschaft' diff --git a/app/views/gateways/show.xml.haml b/app/views/gateways/show.xml.haml index e0ff21a..1642ccc 100644 --- a/app/views/gateways/show.xml.haml +++ b/app/views/gateways/show.xml.haml @@ -5,6 +5,10 @@ - @gateway.gateway_settings.each do |setting| %setting{ :name => setting.name, :value => setting.value, :class_type => setting.class_type, :description => setting.description } + %gateway_headers{ :count => @gateway.gateway_headers.count } + - @gateway.gateway_headers.each do |header| + %header{ :header_type => header.header_type, :constraint => header.constraint_value, :name => header.name, :value => header.value, :description => header.description } + %gateway_parameters{ :count => @gateway.gateway_parameters.count } - @gateway.gateway_parameters.each do |parameter| %parameter{ :name => parameter.name, :value => parameter.value, :class_type => parameter.class_type, :description => parameter.description } |
