diff options
Diffstat (limited to 'lib/network/connection/cellular.pm')
-rw-r--r-- | lib/network/connection/cellular.pm | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/lib/network/connection/cellular.pm b/lib/network/connection/cellular.pm new file mode 100644 index 0000000..5bb2259 --- /dev/null +++ b/lib/network/connection/cellular.pm @@ -0,0 +1,99 @@ +package network::connection::cellular; + +use base qw(network::connection::ppp); + +use strict; +use common; + +my $cellular_d = "/etc/sysconfig/network-scripts/cellular.d"; + +sub get_providers { + # manually-defined providers + require network::connection::providers::cellular; + # providers imported from mobile-broadband-provider-info + require network::connection::providers::cellular_extra; + # combine custom providers with m.b.p.i. imported ones, + # filtering out CDMA-only providers which we do not support for now + my %providers = ( + %network::connection::providers::cellular::data, + grep_each{!$::b->{cdma} } %network::connection::providers::cellular_extra::data + ); + (\%providers, '|'); +} + +sub get_cellular_settings_file { + my ($self) = @_; + my $network = $self->get_selected_network or return; + $::prefix . $cellular_d . '/' . $network->{name}; +} + +sub load_cellular_settings { + my ($self) = @_; + my $file = $self->get_cellular_settings_file or return; + -f $file && { getVarsFromSh($file) }; +} + +sub network_is_configured { + my ($self, $_network) = @_; + #- only one network is supported, assume it is configured if settings are available + defined($self->load_cellular_settings); +} + +sub write_cellular_settings { + my ($self) = @_; + my $file = $self->get_cellular_settings_file or return; + setVarsInShMode($file, 0600, { map { (uc($_) => $self->{access}{$_}) } qw(login password apn) }); +} + +sub guess_apn_from_chat { + my ($self) = @_; + my $chat = cat_($::prefix . $self->get_chat_file); + my $chat_apn = $chat =~ /\bAT\+CGDCONT=\d+,"IP","([^"]+)"/ && $1; +} + +sub guess_provider_settings { + my ($self) = @_; + my $settings = $self->load_cellular_settings; + my $apn = $settings && $settings->{APN} || $self->guess_apn_from_chat; + if ($apn) { + my @providers_data = $self->get_providers; + $self->{provider_name} ||= find { $providers_data[0]{$_}{apn} eq $apn } keys %{$providers_data[0]}; + return; + } + $self->SUPER::guess_provider_settings; +} + +sub guess_access_settings { + my ($self, $o_provider_only) = @_; + my $settings = !$o_provider_only && $self->load_cellular_settings || {}; + $self->{access}{$_} = $settings->{uc($_)} || $self->{provider}{$_} foreach qw(login password apn); +} + +sub get_access_settings { + my ($self) = @_; + [ + { label => N("Access Point Name"), val => \$self->{access}{apn} }, + @{$self->SUPER::get_access_settings}, + ]; +} + +sub set_ppp_settings { + my ($self) = @_; + $self->{access}{use_chat} = 1; + $self->{access}{dial_number} = !$self->{access}{no_dial} && "*99***$self->{access}{cid}#"; +} + +sub write_settings { + my ($self) = @_; + $self->write_cellular_settings; + $self->set_ppp_settings; + $self->SUPER::write_settings; +} + +sub apply_network_selection { + my ($self) = @_; + $self->set_ppp_settings; + $self->write_ppp_settings; +} + +1; |