public static function dropdown($data, $selected = NULL, $extra = '') { // standardize the $data as an array, strings default to the class_type if (!is_array($data)) { $data = array('name' => $data); } // add in all the defaults if they are not provided $defaults = array('null_option' => FALSE, 'default_first' => TRUE, 'unauth_before_auth' => FALSE); $data = arr::merge($defaults, $data); $options = array(); $sipinterfaces = Doctrine::getTable('SipInterface')->findAll(); foreach ($sipinterfaces as $sipinterface) { if (!($id = arr::get($sipinterface, 'sipinterface_id')) or !($name = arr::get($sipinterface, 'name'))) { continue; } if ($data['unauth_before_auth'] and !$sipinterface['auth'] or !$data['unauth_before_auth'] and $sipinterface['auth']) { arr::unshift_assoc($options, $id, $name); continue; } $options[$id] = $name; } if ($data['default_first'] and $default_sipinterface = SipInterface::get_default()) { unset($options[$default_sipinterface['sipinterface_id']]); arr::unshift_assoc($options, $default_sipinterface['sipinterface_id'], $default_sipinterface['name']); } if ($data['null_option']) { arr::unshift_assoc($options, 0, $data['null_option']); } $data = array_diff($data, $defaults); // use kohana helper to generate the markup return form::dropdown($data, $options, $selected, $extra); }
/** * Indicate we support FreeSWITCH */ public static function set($base) { if ($base instanceof Location) { $alias_sipinterface_id = arr::get($base, 'plugins', 'sipinterface', 'sipinterface_id'); self::update_aliases($base['location_id'], $alias_sipinterface_id); } if (!$base instanceof SipInterface) { return TRUE; } $allow_seperate_media_ip = kohana::config('sipinterface.allow_seperate_media_ip'); // Reference to our XML document $xml = Telephony::getDriver()->xml; // The section we are working with is <document><section name="configuration"><configuration name="conference.conf"> FreeSwitch::setSection('sofia', 'sipinterface_' . $base['sipinterface_id']); $xml->deleteNode('/domains'); // Turn off session timers, they are irritating and cause all sorts of issues $xml->update('/settings/param[@name="enable-timer"]{@value="false"}'); if ($user_agent = kohana::config('sipinterface.user_agent')) { $xml->update('/settings/param[@name="user-agent-string"]{@value="' . kohana::config('sipinterface.user_agent') . '"}'); } else { $xml->deleteNode('/settings/param[@name="user-agent-string"]'); } $xml->update('/settings/param[@name="rtp-timer-name"]{@value="soft"}'); $xml->update('/settings/param[@name="codec-prefs"]{@value="$${global_codec_prefs}"}'); $xml->update('/settings/param[@name="inbound-codec-negotiation"]{@value="generous"}'); $xml->update('/settings/param[@name="inbound-reg-force-matching-username"]{@value="true"}'); $xml->update('/settings/param[@name="nonce-ttl"]{@value="86400"}'); $xml->update('/settings/param[@name="rfc2833-pt"]{@value="101"}'); $xml->update('/settings/param[@name="manage-presence"]{@value="true"}'); $xml->update('/settings/param[@name="enable-timer"]{@value="false"}'); $xml->update('/settings/param[@name="auth-calls"]{@value="' . ($base['auth'] ? 'true' : 'false') . '"}'); // Set our internal IPs for SIP. This also defines what interface we bind to. if ($ip_address = arr::get($base, 'ip_address')) { $xml->update('/settings/param[@name="sip-ip"]{@value="' . $ip_address . '"}'); } else { $xml->update('/settings/param[@name="sip-ip"]{@value="$${local_ip_v4}"}'); } // If we are seperating the media and sip IPs then get the current // media internal IP otherwise use the same as SIP if ($allow_seperate_media_ip) { $ip_address = arr::get($base, 'registry', 'media_ip_address'); } // Set our internal IPs for RTP. This also defines what interface we bind to. if ($ip_address) { $xml->update('/settings/param[@name="rtp-ip"]{@value="' . $ip_address . '"}'); } else { $xml->update('/settings/param[@name="rtp-ip"]{@value="$${local_ip_v4}"}'); } // If the user has a port defined then use it otherwise use 5060 if ($port = arr::get($base, 'port')) { $xml->update('/settings/param[@name="sip-port"]{@value="' . $port . '"}'); } else { $xml->update('/settings/param[@name="sip-port"]{@value="5060"}'); } // check if multiple-registrations per credintial should be enabled if (arr::get($base, 'multiple')) { $xml->update('/settings/param[@name="multiple-registrations"]{@value="true"}'); } else { $xml->deleteNode('/settings/param[@name="multiple-registrations"]'); } // should we ping registered devices? if (arr::get($base, 'registry', 'options_ping')) { $xml->update('/settings/param[@name="nat-options-ping"]{@value="true"}'); $xml->update('/settings/param[@name="all-reg-options-ping"]{@value="true"}'); } else { $xml->deleteNode('/settings/param[@name="nat-options-ping"]'); $xml->deleteNode('/settings/param[@name="all-reg-options-ping"]'); } // Set our external IPs for SIP & RTP if ($ext_ip_address = arr::get($base, 'ext_ip_address')) { if ($base['nat_type']) { // Force external IP w/ auto-nat $xml->update('/settings/param[@name="ext-sip-ip"]{@value="autonat:' . $ext_ip_address . '"}'); } else { // Force static external IP $xml->update('/settings/param[@name="ext-sip-ip"]{@value="' . $ext_ip_address . '"}'); } } elseif ($base['nat_type'] == 1) { // Automatically detect NAT and external IP using various strategies built into FS $xml->update('/settings/param[@name="ext-sip-ip"]{@value="auto-nat"}'); } elseif ($base['nat_type'] == 2) { // No IP defined and no auto-nat set... Just try to use stun to auto-detect $xml->update('/settings/param[@name="ext-sip-ip"]{@value="stun:stun.freeswitch.org"}'); } else { $xml->deleteNode('/settings/param[@name="ext-sip-ip"]'); } // if we are allowing sip and rtp to be on different IPs then get the // external address of the media, otherwise use the same as SIP if ($allow_seperate_media_ip) { $ext_ip_address = arr::get($base, 'registry', 'media_ext_ip_address'); } // Set our external IPs for RTP if ($ext_ip_address) { if ($base['nat_type']) { $xml->update('/settings/param[@name="ext-rtp-ip"]{@value="autonat:' . $ext_ip_address . '"}'); } else { $xml->update('/settings/param[@name="ext-rtp-ip"]{@value="' . $ext_ip_address . '"}'); } } elseif ($base['nat_type'] == 1) { // Automatically detect NAT and external IP using various strategies built into FS $xml->update('/settings/param[@name="ext-rtp-ip"]{@value="auto-nat"}'); } elseif ($base['nat_type'] == 2) { // No IP defined and no auto-nat set... Just try to use stun to auto-detect $xml->update('/settings/param[@name="ext-rtp-ip"]{@value="stun:stun.freeswitch.org"}'); } else { $xml->deleteNode('/settings/param[@name="ext-rtp-ip"]'); } // NAT detection settings for registrations if (arr::get($base, 'registry', 'detect_nat_on_registration')) { $xml->update('/settings/param[@name="aggressive-nat-detection"]{@value="true"}'); } else { $xml->deleteNode('/settings/param[@name="aggressive-nat-detection"]'); } // NDLB / forced rport for crappy devices/setups if (arr::get($base, 'registry', 'force_rport')) { $xml->update('/settings/param[@name="NDLB-force-rport"]{@value="true"}'); } else { $xml->deleteNode('/settings/param[@name="NDLB-force-rport"]'); } // Enable log auth failures by default. if (arr::get($base, 'registry', 'log_auth_failures')) { $xml->update('/settings/param[@name="log-auth-failures"]{@value="true"}'); } else { $xml->deleteNode('/settings/param[@name="log-auth-failures"]'); } // Enable compact headers by default. With all the Codecs FS now supports we see lots of // bad behavior re: UDP packets that are too large and get fragmented if (arr::get($base, 'registry', 'compact_headers')) { $xml->update('/settings/param[@name="enable-compact-headers"]{@value="true"}'); } else { $xml->deleteNode('/settings/param[@name="enable-compact-headers"]'); } // Find the context id that we should direct unauthed calls to if ($context_id = arr::get($base, 'context_id')) { $xml->update('/settings/param[@name="context"]{@value="context_' . $context_id . '"}'); } else { $xml->update('/settings/param[@name="context"]{@value="' . FreeSwitch::AUTO_ROUTE_CONTEXT . '"}'); } // If there is a forced domain set it up now if ($force_domain = arr::get($base, 'registry', 'force_register_domain')) { $force_location = '$${location_' . $force_domain . '}'; $xml->update('/settings/param[@name="force-register-domain"]{@value="$${location_' . $force_domain . '}"}'); $xml->update('/settings/param[@name="force-register-db-domain"]{@value="$${location_' . $force_domain . '}"}'); } else { $xml->deleteNode('/settings/param[@name="force-register-domain"]'); $xml->deleteNode('/settings/param[@name="force-register-db-domain"]'); } if ($protocol = arr::get($base, 'registry', 'protocol')) { $xml->update('/settings/param[@name="contact-params"]{@value="tport=' . $protocol . '"}'); $xml->update('/settings/param[@name="register-transport"]{@value="' . $protocol . '"}'); $xml->update('/settings/param[@name="bind-params"]{@value="transport=' . $protocol . '"}'); } else { $xml->deleteNode('/settings/param[@name="contact-params"]'); $xml->deleteNode('/settings/param[@name="register-transport"]'); $xml->deleteNode('/settings/param[@name="bind-params"]'); } // Set relevant ACLs if ($aclList = netlists::getListName($base['nat_net_list_id'])) { $xml->update('/settings/param[@name="apply-nat-acl"]{@value="' . $aclList . '"}'); } else { $xml->deleteNode('/settings/param[@name="apply-nat-acl"]'); } if ($aclList = netlists::getListName($base['inbound_net_list_id'])) { $xml->update('/settings/param[@name="apply-inbound-acl"]{@value="' . $aclList . '"}'); } else { $xml->deleteNode('/settings/param[@name="apply-inbound-acl"]'); } if ($aclList = netlists::getListName($base['register_net_list_id'])) { $xml->update('/settings/param[@name="apply-register-acl"]{@value="' . $aclList . '"}'); } else { $xml->deleteNode('/settings/param[@name="apply-register-acl"]'); } $locations = Doctrine::getTable('Location')->findAll(); foreach ($locations as $location) { $alias_sipinterface_id = arr::get($location, 'plugins', 'sipinterface', 'sipinterface_id'); self::update_aliases($location['location_id'], $alias_sipinterface_id); } if ($default_sipinterface_id = SipInterface::get_default('sipinterface_id')) { $xml = FreeSwitch::setSection('sofia', 'sipinterface_' . $default_sipinterface_id); $xp = new DOMXPath($xml); $elements = $xp->query($xml->preUpdate('')); if (count($elements) == 1 and $node = $elements->item(0)) { $node = $elements->item(0); $parentNode = $node->parentNode; $parentNode->removeChild($node); $parentNode->appendChild($node); $xml->update('/domains/domain[@name="all"][@alias="true"][@parse="false"]'); } } }
<?php echo form::open_section('Interface Management'); ?> <div class="field"> <?php echo form::label('Bind to Interface:'); $options = array('name' => 'sipinterface[sipinterface_id]'); if ($base == 'trunk') { $options += array('default_first' => FALSE, 'unauth_before_auth' => TRUE); } else { if ($base == 'location') { $options['null_option'] = 'Default (' . SipInterface::get_default('name') . ')'; } } echo sipinterfaces::dropdown($options); ?> </div> <?php echo form::close_section();