summaryrefslogtreecommitdiffstats
path: root/lib/network/connection/cellular.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/network/connection/cellular.pm')
-rw-r--r--lib/network/connection/cellular.pm99
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;