summaryrefslogtreecommitdiffstats
path: root/lib/network/adsl.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/network/adsl.pm')
-rw-r--r--lib/network/adsl.pm336
1 files changed, 336 insertions, 0 deletions
diff --git a/lib/network/adsl.pm b/lib/network/adsl.pm
new file mode 100644
index 0000000..3768c17
--- /dev/null
+++ b/lib/network/adsl.pm
@@ -0,0 +1,336 @@
+package network::adsl; # $Id$
+
+use common;
+use run_program;
+use network::tools;
+use modules;
+use vars qw(@ISA @EXPORT);
+
+@ISA = qw(Exporter);
+@EXPORT = qw(adsl_conf_backend);
+
+sub adsl_probe_info {
+ my ($net) = @_;
+ my $pppoe_file = "$::prefix/etc/ppp/pppoe.conf";
+ my $login;
+ foreach (qw(/etc/ppp/peers/ppp0 /etc/ppp/options /etc/ppp/options.adsl)) {
+ ($login) = map { if_(/^user\s+"([^"]+)"/, $1) } cat_("$::prefix/$_") if !$login && -r "$::prefix/$_";
+ }
+ my %pppoe_conf; %pppoe_conf = getVarsFromSh($pppoe_file) if (!exists $net->{adsl}{method} || $net->{adsl}{method} eq 'pppoe') && -f $pppoe_file;
+ $login ||= $pppoe_conf{USER};
+ my $passwd = network::tools::passwd_by_login($login);
+ if (!$net->{adsl}{vpi} && !$net->{adsl}{vci}) {
+ ($net->{adsl}{vpi}, $net->{adsl}{vci}) =
+ (map { if_(/^.*-vpi\s+(\d+)\s+-vci\s+(\d+)/, map { sprintf("%x", $_) } $1, $2) } cat_("$::prefix/etc/ppp/peers/ppp0"));
+ }
+ $pppoe_conf{DNS1} ||= '';
+ $pppoe_conf{DNS2} ||= '';
+ add2hash($net->{resolv}, { dnsServer2 => $pppoe_conf{DNS1}, dnsServer3 => $pppoe_conf{DNS2}, DOMAINNAME2 => '' });
+ add2hash($net->{adsl}, { login => $login, passwd => $passwd });
+}
+
+sub adsl_detect() {
+ require list_modules;
+ require detect_devices;
+ my @modules = list_modules::category2modules('network/usb_dsl');
+ # return an hash compatible with what drakconnect expect us to return:
+ my %compat = (
+ 'speedtch' => 'speedtouch',
+ 'eagle-usb' => 'sagem',
+ );
+
+ return {
+ bewan => [ detect_devices::getBewan() ],
+ eci => [ detect_devices::getECI() ],
+ map { $compat{$_} || $_ => [ detect_devices::matching_driver($_) ] } @modules,
+ };
+}
+
+sub sagem_set_parameters {
+ my ($net) = @_;
+ my %l = map { $_ => sprintf("%08s", $net->{adsl}{$_}) } qw(vci vpi Encapsulation);
+
+ my $static_ip = $net->{adsl}{method} eq 'static' && $net->{ifcfg}{sagem}{IPADDR};
+ foreach my $cfg_file (qw(/etc/analog/adiusbadsl.conf /etc/eagle-usb/eagle-usb.conf)) {
+ substInFile {
+ s/Linetype=.*\n/Linetype=0000000A\n/; #- use CMVs
+ s/VCI=.*\n/VCI=$l{vci}\n/;
+ s/VPI=.*\n/VPI=$l{vpi}\n/;
+ s/Encapsulation=.*\n/Encapsulation=$l{Encapsulation}\n/;
+ s/ISP=.*\n/ISP=$net->{adsl}{provider_id}\n/;
+ s/STATIC_IP=.*\n//;
+ s!</eaglectrl>!STATIC_IP=$static_ip\n</eaglectrl>! if $static_ip;
+ } "$::prefix$cfg_file";
+ }
+ #- create CMV symlinks for both POTS and ISDN lines
+ foreach my $type (qw(p i)) {
+ my $cmv;
+ my ($country) = $net->{adsl}{provider_id} =~ /^([a-zA-Z]+)\d+$/;
+ #- try to find a CMV for this specific ISP
+ $cmv = "$::prefix/etc/eagle-usb/CMVe${type}$net->{adsl}{provider_id}.txt" if $net->{adsl}{provider_id};
+ #- if not found, try to found a CMV for the country
+ -f $cmv or $cmv = "$::prefix/etc/eagle-usb/CMVe${type}${country}.txt";
+ #- fallback on the generic CMV if no other matched
+ -f $cmv or $cmv = "$::prefix/etc/eagle-usb/CMVe${type}WO.txt";
+ symlinkf($cmv, "$::prefix/etc/eagle-usb/CMVe${type}.txt");
+ }
+ #- remove this otherwise eaglectrl won't start
+ unlink("$::prefix/etc/eagle-usb/eagle-usb_must_be_configured");
+}
+
+sub adsl_conf_backend {
+ my ($in, $modules_conf, $net) = @_;
+
+ my $bewan_module;
+ $bewan_module = $net->{adsl}{bus} eq 'PCI' ? 'unicorn_pci_atm' : 'unicorn_usb_atm' if $net->{adsl}{device} eq "bewan";
+
+ my $adsl_type = $net->{adsl}{method};
+ my $adsl_device = $net->{adsl}{device};
+
+ # all supported modems came with their own pppoa module, so no need for "plugin pppoatm.so"
+ my %modems =
+ (
+ bewan =>
+ {
+ start => qq(
+# ActivationMode=1
+modprobe $bewan_module
+# wait for the modem to be set up:
+sleep 10
+),
+ stop => qq(modprobe -r $bewan_module),
+ plugin => {
+ pppoa => "pppoatm.so " . join('.', hex($net->{adsl}{vpi}), hex($net->{adsl}{vci}))
+ },
+ ppp_options => qq(
+default-asyncmap
+hide-password
+noaccomp
+nobsdcomp
+nodeflate
+novj novjccomp
+lcp-echo-interval 20
+lcp-echo-failure 3
+sync
+),
+ },
+
+ speedtouch =>
+ {
+ modules => [ qw(speedtch) ],
+ start => '/usr/bin/speedtouch-start --nocall',
+ overide_script => 1,
+ server => {
+ pppoa => qq("/usr/sbin/pppoa3 -c")
+ },
+ plugin => {
+ pppoa => "pppoatm.so " . join('.', hex($net->{adsl}{vpi}), hex($net->{adsl}{vci})),
+ },
+ ppp_options => qq(
+sync
+noaccomp),
+ aliases => [
+ ['char-major-108', 'ppp_generic'],
+ ['tty-ldisc-3', 'ppp_async'],
+ ['tty-ldisc-13', 'n_hdlc'],
+ ['tty-ldisc-14', 'ppp_synctty'],
+ ['ppp-compress-21', 'bsd_comp'],
+ ['ppp-compress-24', 'ppp_deflate'],
+ ['ppp-compress-26', 'ppp_deflate']
+ ],
+ },
+
+ sagem =>
+ {
+ modules => [ qw(eagle-usb) ],
+ start => '/sbin/eaglectrl -i >/dev/null 2>/dev/null || /sbin/eaglectrl -d',
+ stop => "/usr/bin/killall pppoa",
+ get_intf => '/sbin/eaglectrl -i',
+ server => {
+ pppoa => q("/sbin/fctStartAdsl -t 1 -i"),
+ },
+ ppp_options => qq(
+mru 1492
+mtu 1492
+nobsdcomp
+nodeflate
+noaccomp -am
+novjccomp),
+ aliases => [
+ ['char-major-108', 'ppp_generic'],
+ ['tty-ldisc-3', 'ppp_async'],
+ ['tty-ldisc-13', 'n_hdlc'],
+ ['tty-ldisc-14', 'ppp_synctty']
+ ],
+ },
+
+ eci =>
+ {
+ start => '/usr/bin/startmodem',
+ server => {
+ pppoe => qq("/usr/bin/pppoeci -v 1 -vpi $net->{adsl}{vpi} -vci $net->{adsl}{vci}"),
+ },
+ ppp_options => qq(
+noipdefault
+sync
+noaccomp
+linkname eciadsl
+lcp-echo-interval 0)
+ },
+
+ pptp_modem =>
+ {
+ server => {
+ pptp => qq("/usr/sbin/pptp 10.0.0.138 --nolaunchpppd"),
+ },
+ },
+
+ capi_modem =>
+ {
+ ppp_options => qq(
+connect /bin/true
+ipcp-accept-remote
+ipcp-accept-local
+
+sync
+noauth
+lcp-echo-interval 5
+lcp-echo-failure 3
+lcp-max-configure 50
+lcp-max-terminate 2
+
+noccp
+noipx
+mru 1492
+mtu 1492),
+ plugin => {
+ capi => qq(capiplugin.so
+avmadsl)
+ },
+ },
+ );
+
+ my %generic =
+ (
+ pppoe =>
+ {
+ server => '"pppoe -I ' . (exists $modems{$adsl_device}{get_intf} ? "`$modems{$adsl_device}{get_intf}`" : $net->{adsl}{ethernet_device}) . '"',
+ ppp_options => qq(default-asyncmap
+mru 1492
+mtu 1492
+noaccomp
+noccp
+nobsdcomp
+novjccomp
+nodeflate
+lcp-echo-interval 20
+lcp-echo-failure 3
+),
+ }
+ );
+
+ if ($adsl_type =~ /^pp|^capi$/) {
+ mkdir_p("$::prefix/etc/ppp");
+ $in->do_pkgs->install('ppp');
+ my %packages = (
+ pppoa => [ qw(ppp-pppoatm) ],
+ pppoe => [ qw(ppp-pppoe rp-pppoe) ],
+ pptp => [ qw(pptp-linux) ],
+ capi => [ qw(isdn4k-utils) ], #- capi4linux service
+ );
+ $in->do_pkgs->install(@{$packages{$adsl_type}});
+
+ my $pty_option =
+ exists $modems{$adsl_device}{server}{$adsl_type} ? "pty $modems{$adsl_device}{server}{$adsl_type}" :
+ exists $generic{$adsl_type}{server} ? "pty $generic{$adsl_type}{server}" :
+ "";
+ my $plugin = exists $modems{$adsl_device}{plugin}{$adsl_type} && "plugin $modems{$adsl_device}{plugin}{$adsl_type}";
+ my $noipdefault = $adsl_type eq 'pptp' ? '' : 'noipdefault';
+ my $ppp_options =
+ exists $modems{$adsl_device}{ppp_options} ? $modems{$adsl_device}{ppp_options} :
+ exists $generic{$adsl_type}{ppp_options} ? $generic{$adsl_type}{ppp_options} :
+ "";
+ output("$::prefix/etc/ppp/peers/ppp0",
+qq(lock
+persist
+noauth
+usepeerdns
+defaultroute
+$noipdefault
+$ppp_options
+kdebug 1
+nopcomp
+noccp
+novj
+holdoff 4
+maxfail 25
+$pty_option
+$plugin
+user "$net->{adsl}{login}"
+));
+
+ network::tools::write_secret_backend($net->{adsl}{login}, $net->{adsl}{passwd});
+
+ my $ethernet_device = $net->{adsl}{ethernet_device};
+ if ($ethernet_device =~ /^eth/) {
+ $net->{ifcfg}{$ethernet_device} = {
+ DEVICE => $ethernet_device,
+ BOOTPROTO => 'none',
+ NETMASK => '255.255.255.0',
+ NETWORK => '10.0.0.0',
+ BROADCAST => '10.0.0.255',
+ MII_NOT_SUPPORTED => 'yes',
+ ONBOOT => 'yes',
+ };
+ }
+ }
+
+ #- FIXME: ppp0 and ippp0 are hardcoded
+ my $metric = network::tools::get_default_metric("adsl"); #- FIXME, do not override if already set
+ put_in_hash($net->{ifcfg}{ppp0} ||= {}, {
+ DEVICE => 'ppp0',
+ TYPE => 'ADSL',
+ METRIC => $metric,
+ }) unless member($adsl_type, qw(static dhcp));
+ #- don't overwrite ONBOOT setting, it may have been handled earlier in netconnect
+ $net->{ifcfg}{ppp0}{ONBOOT} ||= 'yes';
+
+ #- remove file used with sagem for dhcp/static connections
+ unlink("$::prefix/etc/sysconfig/network-scripts/ifcfg-sagem");
+
+ #- set vpi, vci and encapsulation parameters for sagem
+ $adsl_device eq 'sagem' and sagem_set_parameters($net);
+
+ #- set aliases
+ if (exists $modems{$adsl_device}{aliases}) {
+ $modules_conf->set_alias($_->[0], $_->[1]) foreach @{$modems{$adsl_device}{aliases}};
+ $::isStandalone and $modules_conf->write;
+ }
+ #- remove the "speedtch off" alias that was written by Mandrakelinux 10.0
+ $adsl_device eq 'speedtouch' and $modules_conf->remove_alias('speedtch');
+
+ if ($adsl_type eq "capi") {
+ require network::isdn;
+ network::isdn::setup_capi_conf($in, $net->{adsl}{capi_card});
+ services::disable('isdn4linux');
+ services::enable('capi4linux');
+
+ #- install and run drdsl for dsl connections, once capi driver is loaded
+ $in->do_pkgs->ensure_is_installed_if_available("drdsl", "/usr/sbin/drdsl");
+ run_program::rooted($::prefix, "/usr/sbin/drdsl");
+ }
+
+ #- load modules and run modem-specific start programs
+ #- useful during install, or in case the packages have been installed after the device has been plugged
+ my @modules = (@{$modems{$adsl_device}{modules}}, map { $_->[1] } @{$modems{$adsl_device}{aliases}});
+ @modules or @modules = qw(ppp_synctty ppp_async ppp_generic n_hdlc); #- required for pppoe/pptp connections
+ #- pppoa connections need the pppoatm module
+ #- pppd should run "modprobe pppoatm", but it will fail during install
+ push @modules, 'pppoatm' if $adsl_type eq 'pppoa';
+ foreach (@modules) {
+ eval { modules::load($_) } or log::l("failed to load $_ module: $@");
+ }
+ $modems{$adsl_device}{start} and run_program::rooted($::prefix, $modems{$adsl_device}{start});
+}
+
+1;