summaryrefslogtreecommitdiffstats
path: root/perl-install/network/isdn.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/network/isdn.pm')
-rw-r--r--perl-install/network/isdn.pm89
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;