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.pm268
1 files changed, 268 insertions, 0 deletions
diff --git a/perl-install/network/isdn.pm b/perl-install/network/isdn.pm
new file mode 100644
index 000000000..25c18cebf
--- /dev/null
+++ b/perl-install/network/isdn.pm
@@ -0,0 +1,268 @@
+package network::isdn;
+
+#use network::tools;
+use modules;
+use common qw(:file);
+use vars qw(@ISA @EXPORT);
+
+@ISA = qw(Exporter);
+@EXPORT = qw(isdn_write_config isdn_write_config_backend get_info_providers_backend isdn_ask_info isdn_ask_protocol isdn_ask isdn_detect isdn_detect_backend isdn_get_list isdn_get_info);
+
+sub configure {
+ my ($netcnx, $netc) = @_;
+ isdn_step_1:
+ defined $netc->{autodetect}{isdn}{id} and goto intern_pci;
+ $::isInstall and $in->set_help('configureNetworkISDN');
+ my $e = $in->ask_from_list_(_("Network Configuration Wizard"),
+ _("What kind is your ISDN connection?"), [ __("Internal ISDN card"), __("External ISDN modem")]
+ ) or return;
+ if ($e =~ /card/) {
+ intern_pci:
+ $netcnx->{type}='isdn_internal';
+ $netcnx->{isdn_internal}={};
+ $netcnx->{isdn_internal}{$_} = $netc->{autodetect}{isdn}{$_} foreach ('description', 'vendor', 'id', 'driver', 'card_type', 'type');
+ isdn_detect($netcnx->{isdn_internal}, $netc) or return;
+ } else {
+ $netcnx->{type}='isdn_external';
+ $netcnx->{isdn_external}={};
+ $netcnx->{isdn_external}{device}=$netc->{autodetect}{modem};
+ $netcnx->{isdn_external}{special_command}='AT&F&O2B40';
+ pppConfig($netcnx->{isdn_external}, $mouse, $netc) or goto isdn_step_1;
+ }
+ 1;
+}
+
+sub isdn_write_config {
+ my ($isdn) = @_;
+ isdn_write_config_step_1:
+ my $e = $in->ask_from_list_(_("Network Configuration Wizard"),
+ _("Which ISDN configuration do you prefer?
+
+* The full configuration uses isdn4net. It contains powerfull tools, but is tricky to configure for a newbie, and not standard.
+
+* The light configuration is easier to understand, more standard, but with less tools.
+
+We recommand the light configuration.
+
+"), [ __("Light configuration"), __("Full configuration (isdn4net)")]
+ ) or return;
+ $install->($e =~ /Light/ ? 'isdn-light' : 'isdn4net', 'isdn4k-utils');
+ isdn_write_config_backend($isdn, $e =~ /Light/);
+ $::isStandalone and ask_connect_now($isdn, 'ippp0');
+ 1;
+}
+
+#- isdn_write_config_backend : write isdn info, only for ippp0 -> ask_connect_now
+#- input :
+#- $isdn
+#- $light : boolean : if yes : uses the isdn-light package, if not, isdn4net
+#- $isdn input:
+#- $isdn->{login} $isdn->{passwd} $isdn->{phone_in} $isdn->{phone_out} $isdn->{dialing_mode}
+#- $isdn->{driver} $isdn->{type} $isdn->{irq} $isdn->{mem} $isdn->{io} $isdn->{io0} $isdn->{io1}
+sub isdn_write_config_backend {
+ my ($isdn, $light) = @_;
+ if ($light) {
+ any::setup_thiskind($in, 'isdn', !$::expert, 1);
+ foreach my $f ('ioptions1B', 'ioptions2B') {
+ substInFile { s/^name .*\n//; $_ .= "name $isdn->{login}\n" if eof } "$prefix/etc/ppp/$f";
+ chmod 0600, $f;
+ }
+ foreach my $f ('isdn1B.conf', 'isdn2B.conf') {
+ substInFile {
+ s/EAZ = .*\n/EAZ = $isdn->{phone_in}/;
+ s/PHONE_OUT = .*\n/PHONE_OUT = $isdn->{phone_out}/;
+ } "$prefix/etc/isdn/$f";
+ chmod 0600, $f;
+ }
+ } else {
+ my $f = "$prefix/etc/isdn/profile/link/myisp";
+ output $f,
+ qq(
+I4L_USERNAME="$isdn->{login}"
+I4L_SYSNAME=""
+I4L_LOCALMSN="$isdn->{phone_in}"
+I4L_REMOTE_OUT="$isdn->{phone_out}"
+I4L_DIALMODE="$isdn->{dialing_mode}"
+);
+ chmod 0600, $f;
+
+ output "$prefix/etc/isdn/profile/card/mycard",
+ qq(
+I4L_MODULE="$isdn->{driver}"
+I4L_TYPE="$isdn->{type}"
+I4L_IRQ="$isdn->{irq}"
+I4L_MEMBASE="$isdn->{mem}"
+I4L_PORT="$isdn->{io}"
+I4L_IO0="$isdn->{io0}"
+I4L_IO1="$isdn->{io1}"
+);
+
+ output "$prefix/etc/ppp/ioptions",
+ "lock
+usepeerdns
+defaultroute
+";
+ system "$prefix/etc/rc.d/init.d/isdn4linux restart";
+ }
+ write_secret_backend($isdn->{login}, $isdn->{passwd});
+
+ output "$prefix$connect_file",
+ "#!/bin/bash
+/sbin/route del default
+/sbin/ifup ippp0
+/sbin/isdnctrl dial ippp0
+";
+
+ output "$prefix$disconnect_file",
+ "#!/bin/bash
+/sbin/isdnctrl hangup ippp0
+/sbin/ifdown ippp0
+";
+ chmod 0755, "$prefix$disconnect_file";
+ chmod 0755, "$prefix$connect_file";
+ 1;
+}
+
+#- get_info_isdn_backend : fills the infos from the line of the tree returned into $isdn and $netc
+#- input :
+#- $isdn
+#- $netc
+#- $name : the line choosen in the tree of ISP : string : /^(.*)\|(.*)\|(.*)$/ with $1=Land $2=City $3=ISP_name
+#- $file : 1st location of the file : ISDN_DB_FILE
+#- $file2 : 2nd location of the file : ISDN_DB_FILE
+#- $isdn ouput
+#- $isdn->{user_name}, $isdn->{phone_out}, $netc->{DOMAINNAME2}, $netc->{dnsServer2}, $netc->{dnsServer3},
+#- $netc output
+#- $netc->{DOMAINNAME2}, $netc->{dnsServer2}, $netc->{dnsServer3}
+sub get_info_providers_backend {
+ my ($isdn, $netc, $name, $file) = @_;
+ $name eq 'Unlisted - edit manually' and return;
+ foreach (catMaybeCompressed($file)) {
+ chop;
+ my ($name_, $phone, $real, $dns1, $dns2) = split '=>';
+ if ($name eq $name_) {
+ @{$isdn}{qw(user_name phone_out DOMAINNAME2 dnsServer3 dnsServer2)} =
+ ((split(/\|/, $name_))[2], $phone, $real, $dns1, $dns2);
+ }
+ }
+}
+
+sub isdn_ask_info {
+ my ($isdn, $netc) = @_;
+ my $f = "$ENV{SHARE_PATH}/ldetect-lst/isdn.db";
+ $f = "$prefix$f" if !-e $f;
+ my $str= $in->ask_from_treelist( _("ISDN Configuration"), _("Select your provider.\n If it's not in the list, choose Unlisted"),
+ '|', ['Unlisted - edit manually',
+ netconnect::read_providers_backend($f)], 'Unlisted - edit manually')
+ or return;
+ get_info_providers_backend($isdn, $netc, $str || 'Unlisted - edit manually', $f);
+ $isdn->{$_} ||= '' foreach qw(phone_in phone_out dialing_mode login passwd passwd2 idl);
+ add2hash($netc, { dnsServer2 => '', dnsServer3 => '', DOMAINNAME2 => '' });
+ ask_info2($isdn, $netc);
+}
+
+sub isdn_ask_protocol {
+ my @toto=(
+ { description => $::expert ? _("Europe (EDSS1)") : _("Europe"),
+ protokol => 2},
+ { description => $::expert ? _("Rest of the world \n no D-Channel (leased lines)") : _("Rest of the world"),
+ protokol => 3}
+ );
+ my $e = $in->ask_from_listf(_("ISDN Configuration"),
+ _("Which protocol do you want to use ?"),
+ sub { $_[0]{description} },
+ \@toto ) or return 0;
+ $e->{protokol};
+}
+
+sub isdn_ask {
+ my ($isdn, $netc, $label) = @_;
+ isdn_ask_step_1:
+ my $e = $in->ask_from_list_(_("ISDN Configuration"),
+ $label . "\n" . _("What kind of card do you have?"),
+ [ __("ISA / PCMCIA"), __("PCI"), __("I don't know") ]
+ ) or return;
+ if ($e =~ /PCI/) {
+ $isdn->{card_type} = 'pci';
+ } else {
+ $in->ask_from_list_(_("ISDN Configuration"),
+ _("
+If you have an ISA card, the values on the next screen should be right.\n
+If you have a PCMCIA card, you have to know the irq and io of your card.
+"),
+ [ __("Continue"), __("Abort") ]) eq 'Continue' or goto isdn_ask_step_1;
+ $isdn->{card_type} = 'isa';
+ }
+
+ isdn_ask_step_2:
+ $e = $in->ask_from_listf(_("ISDN Configuration"),
+ _("Which is your ISDN card ?"),
+ sub { $_[0]{description} },
+ [ grep {$_->{card} eq $isdn->{card_type}; } @isdndata ] ) or goto isdn_ask_step_1;
+ $isdn->{driver}='hisax';
+ $e->{$_} and $isdn->{$_} = $e->{$_} foreach qw(type mem io io0 io1 irq);
+
+ isdn_ask_step_3:
+ $isdn->{protocol} = isdn_ask_protocol() or goto isdn_ask_step_2;
+ isdn_ask_step_4:
+ isdn_ask_info($isdn, $netc) or goto isdn_ask_step_3;
+ isdn_write_config($isdn) or goto isdn_ask_step_4;
+ 1;
+}
+
+sub isdn_detect {
+ my ($isdn, $netc) = @_;
+ if ($isdn->{id}) {
+ log::l("found isdn card : $isdn->{description}; vendor : $isdn->{vendor};id : $isdn->{id}; driver : $isdn->{driver}\n");
+ $isdn->{description} =~ s/\|/ -- /;
+ if ($isdn->{type} eq '') {
+ isdn_ask($isdn, $netc, _("I have detected an ISDN PCI Card, but I don't know the type. Please select one PCI card on the next screen.")) or return;
+ } else {
+ isdn_detect_step_1:
+ $isdn->{protocol}=isdn_ask_protocol() or return;
+ isdn_detect_step_2:
+ isdn_ask_info($isdn, $netc) or goto isdn_detect_step_1;
+ isdn_write_config($isdn) or goto isdn_detect_step_2;
+ }
+ } else {
+ isdn_ask($isdn, $netc, _("No ISDN PCI card found. Please select one on the next screen.")) or return;
+ }
+ $netc->{$_}='ippp0' foreach 'NET_DEVICE', 'NET_INTERFACE';
+ 1;
+}
+
+#- isdn_detect_backend : detects isdn pci card and fills the infos in $isdn : only detects one card
+#- input
+#- $isdn
+#- $isdn output:
+#- $isdn->{description} $isdn->{vendor} $isdn->{id} $isdn->{driver} $isdn->{card_type} $isdn->{type}
+
+sub isdn_detect_backend {
+ my ($isdn) = @_;
+ if (my ($c) = (modules::get_that_type('isdn'))) {
+ $isdn->{$_} = $c->{$_} foreach qw(description vendor id driver options);
+ $isdn->{$_} = sprintf("%0x", $isdn->{$_}) foreach ('vendor', 'id');
+ $isdn->{card_type} = 'pci';
+ $isdn->{type} = $isdnid2type{$isdn->{vendor} . $isdn->{id}}; #If the card is not listed, type is void. You have to ask it then.
+ }
+}
+
+#- isdn_get_list : return isdn cards descriptions list. This function is not use internally.
+#- output : descriptions : list of strings
+
+sub isdn_get_list {
+ map { $_->{description} } @isdndata;
+}
+
+#- isdn_get_info : return isdn card infos. This function is not use internally.
+#- input : the description of the card (see isdn_get_list)
+#- output : a reference on the decription of the card. : ref on a hash(description,type,irq,mem,io,io0,io1card,)
+
+sub isdn_get_info {
+ my ($desc) = @_;
+ foreach (@isdndata) {
+ return $_ if ($_->{description} eq $desc);
+ }
+}
+
+1;