summaryrefslogtreecommitdiffstats
path: root/lib/network/modem.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/network/modem.pm')
-rw-r--r--lib/network/modem.pm223
1 files changed, 223 insertions, 0 deletions
diff --git a/lib/network/modem.pm b/lib/network/modem.pm
new file mode 100644
index 0000000..29afb69
--- /dev/null
+++ b/lib/network/modem.pm
@@ -0,0 +1,223 @@
+package network::modem; # $Id$
+
+use strict;
+use common;
+use any;
+use modules;
+use detect_devices;
+use network::network;
+use network::tools;
+
+sub get_user_home() {
+ my $home;
+ if ($ENV{USER} ne "root") {
+ #- kdesu case
+ my $user = find { $_->[0] eq $ENV{USER} } list_passwd();
+ $home = $user->[7] if $user;
+ }
+ $home ||= $ENV{HOME}; #- consolehelper case
+ $home;
+}
+
+sub ppp_read_conf() {
+ my $modem = {};
+ my %l = getVarsFromSh(get_user_home() . "/.kde/share/config/kppprc");
+ add2hash(\%l, { getVarsFromSh("$::prefix/usr/share/config/kppprc") });
+ $l{Authentication} = 4 if $l{Authentication} !~ /\d/;
+ $modem->{$_} ||= $l{$_} foreach qw(Authentication Gateway IPAddr SubnetMask);
+ $modem->{connection} ||= $l{Name};
+ $modem->{domain} ||= $l{Domain};
+ ($modem->{dns1}, $modem->{dns2}) = split(',', $l{DNS});
+
+ foreach (cat_("/etc/sysconfig/network-scripts/chat-ppp0")) {
+ /.*ATDT([\d#*]*)/ and $modem->{phone} ||= $1;
+ }
+ foreach (cat_("/etc/sysconfig/network-scripts/ifcfg-ppp0")) {
+ /NAME=(['"]?)(.*)\1/ and $modem->{login} ||= $2;
+ /^METRIC=(.*)/ and $modem->{METRIC} = $1;
+ }
+ $modem->{login} ||= $l{Username};
+ my $secret = network::tools::read_secret_backend();
+ foreach (@$secret) {
+ $modem->{passwd} ||= $_->{passwd} if $_->{login} eq $modem->{login};
+ }
+ #my $secret = network::tools::read_secret_backend();
+ #my @cnx_list = map { $_->{server} } @$secret;
+ $modem->{$_} ||= '' foreach qw(connection phone login passwd auth domain dns1 dns2);
+ $modem->{auto_gateway} ||= defined $modem->{Gateway} && $modem->{Gateway} ne '0.0.0.0' ? N("Manual") : N("Automatic");
+ $modem->{auto_ip} ||= defined $modem->{IPAddr} && $modem->{IPAddr} ne '0.0.0.0' ? N("Manual") : N("Automatic");
+ $modem->{auto_dns} ||= $modem->{dns1} || $modem->{dns2} ? N("Manual") : N("Automatic");
+ $modem->{device} ||= '/dev/modem';
+ $modem;
+}
+
+#-----modem conf
+sub ppp_configure {
+ my ($net, $in, $modem) = @_;
+ $in->do_pkgs->install('ppp') if !$::testing;
+ $in->do_pkgs->install('kdenetwork-kppp') if !$::testing && $in->do_pkgs->is_installed('kdebase');
+
+ if ($modem->{device} ne "/dev/modem") {
+ my $dev = $modem->{device};
+ $dev =~ s!^/dev/!!;
+ any::devfssymlinkf({ device => $dev }, 'modem');
+ }
+
+ my %toreplace = map { $_ => $modem->{$_} } qw(Authentication AutoName connection dns1 dns2 domain IPAddr login passwd phone SubnetMask);
+ $toreplace{phone} =~ s/[^\d#*]//g;
+ if ($modem->{auto_dns} ne N("Automatic")) {
+ $toreplace{dnsserver} = join ',', map { $modem->{$_} } "dns1", "dns2";
+ $toreplace{dnsserver} .= $toreplace{dnsserver} && ',';
+ }
+
+ #- using peerdns or dns1,dns2 avoid writing a /etc/resolv.conf file.
+ $toreplace{peerdns} = "yes";
+
+ $toreplace{connection} ||= 'DialupConnection';
+ $toreplace{domain} ||= 'localdomain';
+ $toreplace{papname} = $toreplace{login} if member($modem->{Authentication}, 1, 3, 4);
+
+ # handle static/dynamic settings:
+ if ($modem->{auto_ip} eq N("Automatic")) {
+ $toreplace{$_} = '0.0.0.0' foreach qw(IPAddr SubnetMask);
+ } else {
+ $toreplace{$_} = $modem->{$_} foreach qw(IPAddr SubnetMask);
+ }
+ $toreplace{Gateway} = $modem->{auto_gateway} eq N("Automatic") ? '0.0.0.0' : $modem->{Gateway};
+
+ $toreplace{METRIC} = defined($modem->{METRIC}) ? $modem->{METRIC} : network::tools::get_default_metric("modem");
+
+ $net->{ifcfg}{ppp0} = {
+ DEVICE => "ppp0",
+ ONBOOT => "no",
+ USERCTL => "no",
+ MODEMPORT => "/dev/modem",
+ LINESPEED => "115200",
+ PERSIST => "yes",
+ DEFABORT => "yes",
+ DEBUG => "yes",
+ INITSTRING => "ATZ",
+ DEFROUTE => "yes",
+ HARDFLOWCTL => "yes",
+ ESCAPECHARS => "no",
+ PPPOPTIONS => "",
+ PAPNAME => $toreplace{papname},
+ REMIP => "",
+ NETMASK => "",
+ IPADDR => "",
+ MRU => "",
+ MTU => "",
+ DISCONNECTTIMEOUT => "5",
+ RETRYTIMEOUT => "60",
+ BOOTPROTO => "none",
+ PEERDNS => $toreplace{peerdns},
+ METRIC => $toreplace{METRIC},
+ if_($modem->{auto_dns} ne N("Automatic"),
+ map { qq(DNS$_=$toreplace{"dns$_"}\n) } grep { $toreplace{"dns$_"} } 1..2),
+ };
+
+ #- build chat-ppp0.
+ my @chat = <<END;
+'ABORT' 'BUSY'
+'ABORT' 'ERROR'
+'ABORT' 'NO CARRIER'
+'ABORT' 'NO DIALTONE'
+'ABORT' 'Invalid Login'
+'ABORT' 'Login incorrect'
+'' 'ATZ'
+END
+ if ($modem->{special_command}) {
+ push @chat, <<END;
+'OK' '$modem->{special_command}'
+END
+ }
+ push @chat, <<END;
+'OK' 'ATDT$toreplace{phone}'
+'TIMEOUT' '120'
+'CONNECT' ''
+END
+ if (member($modem->{Authentication}, 0, 2)) {
+ push @chat, <<END;
+'ogin:--ogin:' '$toreplace{login}'
+'ord:' '$toreplace{passwd}'
+END
+ }
+ push @chat, <<END;
+'TIMEOUT' '5'
+'~--' ''
+END
+ my $chat_file = "$::prefix/etc/sysconfig/network-scripts/chat-ppp0";
+ output_with_perm($chat_file, 0600, @chat);
+
+ network::tools::write_secret_backend($toreplace{login}, $toreplace{passwd});
+
+ #- install kppprc file according to used configuration.
+ mkdir_p("$::prefix/usr/share/config");
+
+ $toreplace{$_->[0]} = $modem->{$_->[0]} || $_->[1] foreach [ 'Timeout', 60 ], [ 'UseLockFile', 1 ], [ 'Enter', 'CR' ], [ 'Volume', 0 ],
+ [ 'BusyWait', 0 ], [ 'FlowControl', 'CRTSCTS' ], [ 'Speed', 115200 ];
+ output($modem->{kppprc} || "$::prefix/usr/share/config/kppprc", common::to_utf8(<<END));
+# KDE Config File
+
+[Account0]
+ExDNSDisabled=0
+AutoName=$toreplace{AutoName}
+ScriptArguments=
+AccountingEnabled=0
+DialString=ATDT
+Phonenumber=$toreplace{phone}
+IPAddr=$toreplace{IPAddr}
+Domain=$toreplace{domain}
+Name=$toreplace{connection}
+VolumeAccountingEnabled=0
+pppdArguments=
+Password=$toreplace{passwd}
+BeforeDisconnect=
+Command=
+ScriptCommands=
+Authentication=$toreplace{Authentication}
+DNS=$toreplace{dnsserver}
+SubnetMask=$toreplace{SubnetMask}
+AccountingFile=
+DefaultRoute=1
+Username=$toreplace{login}
+Gateway=$toreplace{Gateway}
+StorePassword=1
+DisconnectCommand=
+
+[Modem]
+BusyWait=$toreplace{BusyWait}
+Enter=$toreplace{Enter}
+FlowControl=$toreplace{FlowControl}
+Volume=$toreplace{Volume}
+Timeout=$toreplace{Timeout}
+UseCDLine=0
+UseLockFile=$toreplace{UseLockFile}
+Device=/dev/modem
+Speed=$toreplace{Speed}
+
+[Graph]
+InBytes=0,0,255
+Text=0,0,0
+Background=255,255,255
+Enabled=true
+OutBytes=255,0,0
+
+[General]
+QuitOnDisconnect=0
+ShowLogWindow=0
+DisconnectOnXServerExit=1
+DefaultAccount=$toreplace{connection}
+iconifyOnConnect=1
+Hint_QuickHelp=0
+AutomaticRedial=0
+PPPDebug=0
+NumberOfAccounts=1
+ShowClock=1
+DockIntoPanel=0
+pppdTimeout=30
+END
+ network::network::proxy_configure($::o->{miscellaneous});
+}
+
+1;