diff options
Diffstat (limited to 'perl-install/network/isdn.pm')
| -rw-r--r-- | perl-install/network/isdn.pm | 89 |
1 files changed, 64 insertions, 25 deletions
diff --git a/perl-install/network/isdn.pm b/perl-install/network/isdn.pm index e4f0ac49a..8c50d400c 100644 --- a/perl-install/network/isdn.pm +++ b/perl-install/network/isdn.pm @@ -10,18 +10,13 @@ use log; use network::tools; use MDK::Common::Globals "network", qw($in); use MDK::Common::File; +use services; +use list_modules; sub write_config { - my ($isdn, $netc) = @_; + my ($isdn) = @_; $in->do_pkgs->install('isdn4net', if_($isdn->{speed} =~ /128/, 'ibod'), 'isdn4k-utils'); - write_config_backend($isdn, $netc); - 1; -} - -sub write_config_backend { - my ($isdn, $netc, $o_netcnx) = @_; - defined $o_netcnx and $netc->{isdntype} = $o_netcnx->{type}; output_with_perm("$::prefix/etc/isdn/profile/link/myisp", 0600, qq( @@ -51,28 +46,49 @@ I4L_PROTOCOL="$isdn->{protocol}" usepeerdns defaultroute "; - system "$::prefix/etc/rc.d/init.d/isdn4linux restart"; - - substInFile { s/^FIRMWARE.*\n//; $_ .= qq(FIRMWARE="$isdn->{firmware}"\n) if eof } "$::prefix/etc/sysconfig/network-scripts/ifcfg-ippp0"; - # we start the virtual interface at boot (we dial only on demand. - substInFile { s/^ONBOOT.*\n//; $_ .= qq(ONBOOT=yes\n) if eof } "$::prefix/etc/sysconfig/network-scripts/ifcfg-ippp$isdn->{intf_id}"; + services::stop("isdn4linux"); #- to be stopped before capi is loaded + if ($isdn->{driver} eq "capidrv") { + setup_capi_conf(get_capi_card($isdn)); + services::start_service_on_boot("capi4linux"); + services::start("capi4linux"); + } else { + services::stop("capi4linux"); + services::do_not_start_service_on_boot("capi4linux"); + } + services::start_service_on_boot("isdn4linux"); + services::start("isdn4linux"); write_secret_backend($isdn->{login}, $isdn->{passwd}); - set_cnx_script($netc, "isdn", join('', -"/sbin/route del default -modprobe $isdn->{driver}", if_($isdn->{type}, " type=$isdn->{type}"), -" -/usr/sbin/isdnctrl dial ippp0 -", if_($isdn->{speed} =~ /128/, "service ibod restart -")), -"/usr/sbin/isdnctrl hangup ippp0 -" . if_($isdn->{speed} =~ /128/, "service ibod stop -"), $netc->{isdntype}); 1; } + +sub setup_capi_conf { + my ($capi_card) = @_; + + $in->do_pkgs->ensure_is_installed('isdn4k-utils', "/etc/rc.d/init.d/capi4linux"); #- capi4linux service + is_module_installed($capi_card->{driver}) or $in->do_pkgs->install(@{$capi_card->{packages}}); + if ($capi_card->{firmware} && ! -f "$::prefix/usr/lib/isdn/$capi_card->{firmware}") { + $in->do_pkgs->install("$capi_card->{driver}-firmware"); + } + + #- stop capi4linux before new config is written so that it can unload the driver + services::stop("capi4linux"); + + my $capi_conf; + my $firmware = $capi_card->{firmware} || '-'; + if ($capi_card->{driver} eq "fcclassic") { + $capi_conf = "fcclassic - - 0x300 5 - -\n# adjust IRQ and IO !! ^^^^^ ^^^\n"; + } elsif ($capi_card->{driver} eq "fcpnp") { + $capi_conf = "fcpnp - - 0x300 5 - -\n# adjust IRQ and IO !! ^^^^^ ^^^\n"; + } else { + $capi_conf = "$capi_card->{driver} $firmware - - - - -\n"; + } + output("$::prefix/etc/capi.conf", $capi_conf); +} + sub read_config { my ($isdn) = @_; @@ -120,7 +136,8 @@ sub get_info_providers_backend { sub read_providers_backend() { map { /(.*?)=>/ } catMaybeCompressed($file) } -sub detect_backend() { +sub detect_backend { + my ($modules_conf) = @_; my @isdn; require detect_devices; each_index { @@ -132,7 +149,7 @@ sub detect_backend() { $isdn->{description} =~ s/.*\|//; # $c->{options} !~ /id=HiSax/ && $isdn->{driver} eq "hisax" and $c->{options} .= " id=HiSax"; if ($c->{options} !~ /protocol=/ && $isdn->{protocol} =~ /\d/) { - modules::set_options($c->{driver}, $c->{options} . " protocol=" . $isdn->{protocol}); + $modules_conf->set_options($c->{driver}, $c->{options} . " protocol=" . $isdn->{protocol}); } $c->{options} =~ /protocol=(\d)/ and $isdn->{protocol} = $1; push @isdn, $isdn; @@ -159,4 +176,26 @@ sub get_cards() { } +sub is_module_installed { + my ($driver) = @_; + find { m!/\Q$driver\E\.k?o! } cat_($::prefix . '/lib/modules/' . c::kernel_version() . '/modules.dep'); +} + + +sub get_capi_card { + my ($isdn) = @_; + + my $capi_card = find { + hex($isdn->{vendor}) == $_->{vendor} && hex($isdn->{id}) == $_->{id} + } @isdn_capi or return; + + #- check if the capi driver is available + unless (is_module_installed($capi_card->{driver}) || ($capi_card->{packages} = $in->do_pkgs->check_kernel_module_packages("$capi_card->{driver}-kernel"))) { + log::explanations("a capi driver ($capi_card->{driver}) exists to replace $isdn->{driver}, but it isn't installed and no packages provide it"); + return; + } + + $capi_card; +} + 1; |
