diff options
Diffstat (limited to 'app/controllers/config_yealink_controller.rb')
-rw-r--r-- | app/controllers/config_yealink_controller.rb | 310 |
1 files changed, 310 insertions, 0 deletions
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 |