install.pl: Updated list of supported OSes and kernels
[~aditr/ofed_scripts.git] / install.pl
1 #!/usr/bin/perl
2 #
3 # Copyright (c) 2016 Mellanox Technologies. All rights reserved.
4 #
5 # This Software is licensed under one of the following licenses:
6 #
7 # 1) under the terms of the "Common Public License 1.0" a copy of which is
8 #    available from the Open Source Initiative, see
9 #    http://www.opensource.org/licenses/cpl.php.
10 #
11 # 2) under the terms of the "The BSD License" a copy of which is
12 #    available from the Open Source Initiative, see
13 #    http://www.opensource.org/licenses/bsd-license.php.
14 #
15 # 3) under the terms of the "GNU General Public License (GPL) Version 2" a
16 #    copy of which is available from the Open Source Initiative, see
17 #    http://www.opensource.org/licenses/gpl-license.php.
18 #
19 # Licensee has the right to choose one of the above licenses.
20 #
21 # Redistributions of source code must retain the above copyright
22 # notice and one of the license notices.
23 #
24 # Redistributions in binary form must reproduce both the above copyright
25 # notice, one of the license notices in the documentation
26 # and/or other materials provided with the distribution.
27
28
29 use strict;
30 use File::Basename;
31 use File::Path;
32 use File::Find;
33 use File::Copy;
34 use Cwd;
35 use Term::ANSIColor qw(:constants);
36 use sigtrap 'handler', \&sig_handler, 'normal-signals';
37
38 $ENV{"LANG"} = "en_US.UTF-8";
39
40 if ($<) {
41     print RED "Only root can run $0", RESET "\n";
42     exit 1;
43 }
44
45 $| = 1;
46 my $LOCK_EXCLUSIVE = 2;
47 my $UNLOCK         = 8;
48 #Setup some defaults
49 my $KEY_ESC=27;
50 my $KEY_CNTL_C=3;
51 my $KEY_ENTER=13;
52
53 my $BASIC = 1;
54 my $ALL = 2;
55 my $CUSTOM = 3;
56
57 my $interactive = 1;
58 my $quiet = 0;
59 my $verbose = 1;
60 my $verbose2 = 0;
61 my $verbose3 = 0;
62
63 my $print_available = 0;
64
65 my $clear_string = `clear`;
66 my $bonding_force_all_os = 0;
67
68 my $vendor_pre_install = "";
69 my $vendor_post_install = "";
70 my $vendor_pre_uninstall = "";
71 my $vendor_post_uninstall = "";
72
73 my $DISTRO = "";
74 my $rpmbuild_flags = "";
75 my $rpminstall_flags = "";
76
77 my $WDIR    = dirname($0);
78 chdir $WDIR;
79 my $CWD     = getcwd;
80 my $TMPDIR  = '/tmp';
81 my $netdir;
82
83 my $config = $CWD . '/ofed.conf';
84 chomp $config;
85 my $config_net;
86
87 my $builddir = "/var/tmp/";
88 chomp $builddir;
89
90 my $PACKAGE     = 'OFED';
91 my $ofedlogs = "/tmp/$PACKAGE.$$.logs";
92 mkpath([$ofedlogs]);
93
94 my $default_prefix = '/usr';
95 chomp $default_prefix;
96 my $prefix = $default_prefix;
97
98 my $build32 = 0;
99 my $arch = `uname -m`;
100 chomp $arch;
101 my $kernel = `uname -r`;
102 chomp $kernel;
103 my $linux_obj = "/lib/modules/$kernel/build";
104 chomp $linux_obj;
105 my $linux = "/lib/modules/$kernel/source";
106 chomp $linux;
107 my $ib_udev_rules = "/etc/udev/rules.d/90-ib.rules";
108
109 # Define RPMs environment
110 my $dist_rpm;
111 my $dist_rpm_ver = 0;
112 my $dist_rpm_rel = 0;
113
114 my $umad_dev_rw = 0;
115 my $config_given = 0;
116 my $config_net_given = 0;
117 my $kernel_given = 0;
118 my $kernel_source_given = 0;
119 my $install_option;
120 my $check_linux_deps = 1;
121 my $force = 0;
122 my $kmp = 1;
123 my $with_xeon_phi = 0;
124 my $libnl = "libnl3";
125 my $libnl_devel = "libnl3-devel";
126 my %disabled_packages;
127
128 while ( $#ARGV >= 0 ) {
129
130    my $cmd_flag = shift(@ARGV);
131
132     if ( $cmd_flag eq "-c" or $cmd_flag eq "--config" ) {
133         $config = shift(@ARGV);
134         $interactive = 0;
135         $config_given = 1;
136     } elsif ( $cmd_flag eq "-n" or $cmd_flag eq "--net" ) {
137         $config_net = shift(@ARGV);
138         $config_net_given = 1;
139     } elsif ( $cmd_flag eq "-l" or $cmd_flag eq "--prefix" ) {
140         $prefix = shift(@ARGV);
141         $prefix =~ s/\/$//;
142     } elsif ( $cmd_flag eq "-k" or $cmd_flag eq "--kernel" ) {
143         $kernel = shift(@ARGV);
144         $kernel_given = 1;
145     } elsif ( $cmd_flag eq "-s" or $cmd_flag eq "--linux" ) {
146         $linux = shift(@ARGV);
147         $kernel_source_given = 1;
148     } elsif ( $cmd_flag eq "-o" or $cmd_flag eq "--linux-obj" ) {
149         $linux_obj = shift(@ARGV);
150         $kernel_source_given = 1;
151     } elsif ( $cmd_flag eq "-p" or $cmd_flag eq "--print-available" ) {
152         $print_available = 1;
153     } elsif ( $cmd_flag eq "--force" ) {
154         $force = 1;
155     } elsif ( $cmd_flag eq "--all" ) {
156         $interactive = 0;
157         $install_option = 'all';
158     } elsif ( $cmd_flag eq "--hpc" ) {
159         $interactive = 0;
160         $install_option = 'hpc';
161     } elsif ( $cmd_flag eq "--basic" ) {
162         $interactive = 0;
163         $install_option = 'basic';
164     } elsif ( $cmd_flag eq "--umad-dev-rw" ) {
165         $umad_dev_rw = 1;
166     } elsif ( $cmd_flag eq "--build32" ) {
167         if (supported32bit()) {
168             $build32 = 1;
169         }
170     } elsif ( $cmd_flag eq "--without-depcheck" ) {
171         $check_linux_deps = 0;
172     } elsif ( $cmd_flag eq "--builddir" ) {
173         $builddir = shift(@ARGV);
174     } elsif ( $cmd_flag eq "-q" ) {
175         $quiet = 1;
176     } elsif ( $cmd_flag eq "-v" ) {
177         $verbose = 1;
178     } elsif ( $cmd_flag eq "-vv" ) {
179         $verbose = 1;
180         $verbose2 = 1;
181     } elsif ( $cmd_flag eq "-vvv" ) {
182         $verbose = 1;
183         $verbose2 = 1;
184         $verbose3 = 1;
185     } elsif ( $cmd_flag eq "--with-xeon-phi" ) {
186         $with_xeon_phi = 1;
187     } elsif ( $cmd_flag =~ /--without|--disable/ ) {
188         my $pckg = $cmd_flag;
189         $pckg =~ s/--without-|--disable-//;
190         $disabled_packages{$pckg} = 1;
191     } else {
192         &usage();
193         exit 1;
194     }
195 }
196
197 if (-f "/etc/issue") {
198     if (-f "/usr/bin/dpkg") {
199         if ( `which rpm` eq ""){
200             print RED "rpm package is not installed. Exiting...", RESET "\n";
201             print RED "Please run 'sudo apt-get install rpm'", RESET "\n";
202             exit 1;
203         }
204         if (-f "/etc/lsb-release") {
205             $dist_rpm  = `lsb_release -s -i`;
206             $dist_rpm_ver = `lsb_release -s -r`;
207         }
208         else {
209             print "lsb_release is required to continue\n";
210             $dist_rpm = "unsupported";
211         }
212     }
213     else {
214         $dist_rpm = `rpm -qf /etc/issue 2> /dev/null | grep -v "is not owned by any package" | head -1`;
215         chomp $dist_rpm;
216         if ($dist_rpm) {
217             $dist_rpm = `rpm -q --queryformat "[%{NAME}]-[%{VERSION}]-[%{RELEASE}]" $dist_rpm`;
218             chomp $dist_rpm;
219             $dist_rpm_ver = get_rpm_ver_inst($dist_rpm);
220             $dist_rpm_rel = get_rpm_rel_inst($dist_rpm);
221         } else {
222             $dist_rpm = "unsupported";
223         }
224     }
225 }
226 else {
227     $dist_rpm = "unsupported";
228 }
229 chomp $dist_rpm;
230
231 my $rpm_distro = '';
232
233 if ($dist_rpm =~ /sles-release-12\.3|SLES.*release-12\.3/) {
234     $DISTRO = "SLES12";
235     $rpm_distro = "sles12sp3";
236 } elsif ($dist_rpm =~ /sles-release-12\.2|SLES.*release-12\.2/) {
237     $DISTRO = "SLES12";
238     $rpm_distro = "sles12sp2";
239 } elsif ($dist_rpm =~ /sles-release-12|SLES.*release-12/) {
240     $DISTRO = "SLES12";
241     $rpm_distro = "sles12sp0";
242 } elsif ($dist_rpm =~ /redhat-release-.*-7.4|sl-release-7.4|centos-release-7-4/) {
243     $DISTRO = "RHEL7.4";
244     $rpm_distro = "rhel7u4";
245 } elsif ($dist_rpm =~ /redhat-release-.*-7.5|sl-release-7.5|centos-release-7-5/) {
246     $DISTRO = "RHEL7.5";
247     $rpm_distro = "rhel7u5";
248 } elsif ($dist_rpm =~ /Ubuntu/) {
249     $DISTRO = "UBUNTU$dist_rpm_ver";
250     $rpm_distro =~ tr/[A-Z]/[a-z]/;
251     $rpm_distro =~ s/\./u/g;
252 } elsif ( -f "/etc/debian_version" ) {
253     $DISTRO = "DEBIAN";
254     $rpm_distro = "debian";
255 } else {
256     $DISTRO = "unsupported";
257     $rpm_distro = "unsupported";
258 }
259
260 my $SRPMS = $CWD . '/' . 'SRPMS/';
261 chomp $SRPMS;
262 my $SRPMS_DISTRO = 'RH';
263 if ($DISTRO =~ /SLES/) {
264         $SRPMS_DISTRO = 'SUSE';
265 }
266 my $RPMS  = $CWD . '/' . 'RPMS' . '/' . $dist_rpm . '/' . $arch;
267 chomp $RPMS;
268 if (not -d $RPMS) {
269     mkpath([$RPMS]);
270 }
271
272 my $target_cpu  = `rpm --eval '%{_target_cpu}'`;
273 chomp $target_cpu;
274
275 my $target_cpu32;
276 if ($arch eq "x86_64") {
277     if (-f "/etc/SuSE-release") {
278         $target_cpu32 = 'i586';
279     }
280     else {
281         $target_cpu32 = 'i686';
282     }
283 }
284 elsif ($arch eq "ppc64") {
285     $target_cpu32 = 'ppc';
286 }
287 elsif ($arch eq "sparc64") {
288     $target_cpu32 = 'sparc';
289 }
290
291 chomp $target_cpu32;
292
293 if ($kernel_given and not $kernel_source_given) {
294     if (-d "/lib/modules/$kernel/build") {
295         $linux_obj = "/lib/modules/$kernel/build";
296     }
297     else {
298         print RED "Provide path to the kernel sources for $kernel kernel.", RESET "\n";
299         exit 1;
300     }
301 }
302
303 my $kernel_rel = $kernel;
304 $kernel_rel =~ s/-/_/g;
305
306 if ($DISTRO eq "DEBIAN") {
307     $check_linux_deps = 0;
308 }
309 if ($DISTRO =~ /UBUNTU.*/) {
310     $rpminstall_flags .= ' --force-debian --nodeps ';
311     $rpmbuild_flags .= ' --nodeps ';
312 }
313
314 if (not $check_linux_deps) {
315     $rpmbuild_flags .= ' --nodeps';
316     $rpminstall_flags .= ' --nodeps';
317 }
318
319 if ($with_xeon_phi) {
320     $rpmbuild_flags .= "--define 'PSM_HAVE_SCIF 1'";
321 }
322
323 my $optflags  = `rpm --eval '%{optflags}'`;
324 chomp $optflags;
325
326 my $mandir      = `rpm --eval '%{_mandir}'`;
327 chomp $mandir;
328 my $sysconfdir  = `rpm --eval '%{_sysconfdir}'`;
329 chomp $sysconfdir;
330 my %main_packages = ();
331 my @selected_packages = ();
332 my @selected_by_user = ();
333 my @selected_modules_by_user = ();
334 my @packages_to_uninstall = ();
335 my @dependant_packages_to_uninstall = ();
336 my %selected_for_uninstall = ();
337 my @selected_kernel_modules = ();
338
339 my @rdma_core_build_deps = ();
340
341 my $gcc = "gcc";
342 my $gcc_cpp = "gcc-c++";
343 my $libstdc = '';
344 my $libgcc = 'libgcc';
345 my $libgfortran = '';
346 my $curl_devel = 'curl-devel';
347 my $libudev_devel = 'libudev-devel';
348 my $pkgconfig = "pkgconfig";
349 my $glibc_devel = 'glibc-devel';
350 my $cmake = 'cmake';
351 my $ninja = '';
352 if ($DISTRO =~ m/SLES11/) {
353     $libstdc = 'libstdc++43';
354     $libgcc = 'libgcc43';
355     $libgfortran = 'libgfortran43';
356     $curl_devel = 'libcurl-devel';
357     if ($rpm_distro eq "sles11sp2") {
358         $libstdc = 'libstdc++46';
359         $libgcc = 'libgcc46';
360         $libgfortran = 'libgfortran46';
361     }
362     $pkgconfig = "pkg-config";
363 } elsif ($DISTRO =~ m/SLES12/) {
364     push (@rdma_core_build_deps, "python3-base");
365     $ninja = 'ninja';
366     $cmake = 'cmake';
367     $libstdc = 'libstdc++6';
368     $libgcc = 'libgcc_s1';
369     $libgfortran = 'libgfortran3';
370     $curl_devel = 'libcurl-devel';
371     $libnl = "libnl3-200";
372     $libnl_devel = "libnl3-devel";
373     $pkgconfig = "pkg-config";
374 } elsif ($DISTRO =~ m/RHEL|OEL|FC/) {
375     $libstdc = 'libstdc++';
376     $libgcc = 'libgcc';
377     $libgfortran = 'gcc-gfortran';
378     if ($DISTRO =~ m/RHEL6|OEL6|FC/) {
379         $curl_devel = 'libcurl-devel';
380     } elsif ($DISTRO =~ m/RHEL7/) {
381         $curl_devel = 'libcurl-devel';
382         $libudev_devel = 'systemd-devel';
383     }
384 } else {
385     $libstdc = 'libstdc++';
386 }
387 my $libstdc_devel = "$libstdc-devel";
388 if ($DISTRO =~ m/SLES12/) {
389     $libstdc_devel = 'libstdc++-devel';
390 }
391
392 push (@rdma_core_build_deps, "systemd-devel");
393 push (@rdma_core_build_deps, "$libudev_devel");
394 push (@rdma_core_build_deps, "$cmake");
395 push (@rdma_core_build_deps, "$ninja");
396 push (@rdma_core_build_deps, "$pkgconfig");
397
398 # Suffix for 32 and 64 bit packages
399 my $is_suse_suff64 = $arch eq "ppc64" && $DISTRO !~ /SLES11|SLES12/;
400 my $suffix_32bit = ($DISTRO =~ m/SLES|openSUSE/ && !$is_suse_suff64) ? "-32bit" : ".$target_cpu32";
401 my $suffix_64bit = ($DISTRO =~ m/SLES|openSUSE/ &&  $is_suse_suff64) ? "-64bit" : "";
402
403 sub usage
404 {
405    print GREEN;
406    print "\n Usage: $0 [-c <packages config_file>|--all|--hpc|--basic] [-n|--net <network config_file>]\n";
407
408    print "\n           -c|--config <packages config_file>. Example of the config file can be found under docs (ofed.conf-example).";
409    print "\n           -n|--net <network config_file>      Example of the config file can be found under docs (ofed_net.conf-example).";
410    print "\n           -l|--prefix          Set installation prefix.";
411    print "\n           -p|--print-available Print available packages for current platform.";
412    print "\n                                And create corresponding ofed.conf file.";
413    print "\n           -k|--kernel <kernel version>. Default on this system: $kernel";
414    print "\n           -s|--linux           <path to the kernel sources>. Default on this system: $linux";
415    print "\n           -o|--linux-obj       <path to the kernel sources>. Default on this system: $linux_obj";
416    print "\n           --build32            Build 32-bit libraries. Relevant for x86_64 and ppc64 platforms";
417    print "\n           --without-depcheck   Skip Distro's libraries check";
418    print "\n           -v|-vv|-vvv          Set verbosity level";
419    print "\n           -q                   Set quiet - no messages will be printed";
420    print "\n           --force              Force uninstall RPM coming with Distribution";
421    print "\n           --builddir           Change build directory. Default: $builddir";
422    print "\n           --umad-dev-rw        Grant non root users read/write permission for umad devices instead of default";
423    print "\n           --with-xeon-phi      Install XEON PHI support";
424    print "\n           --without-<package>  Do not install package";
425    print "\n\n           --all|--hpc|--basic    Install all,hpc or basic packages correspondingly";
426    print RESET "\n\n";
427 }
428
429 my $sysfsutils;
430 my $sysfsutils_devel;
431
432 if ($DISTRO =~ m/SLES|openSUSE/) {
433     $sysfsutils = "sysfsutils";
434     $sysfsutils_devel = "sysfsutils";
435 } elsif ($DISTRO =~ m/RHEL5/) {
436     $sysfsutils = "libsysfs";
437     $sysfsutils_devel = "libsysfs";
438 } elsif ($DISTRO =~ m/RHEL6|RHEL7|OEL6/) {
439     $sysfsutils = "libsysfs";
440     $sysfsutils_devel = "libsysfs";
441 }
442
443 my $kernel_req = "";
444 if ($DISTRO =~ /RHEL|OEL/) {
445     $kernel_req = "redhat-rpm-config";
446 } elsif ($DISTRO =~ /SLES10/) {
447     $kernel_req = "kernel-syms";
448 } elsif ($DISTRO =~ /SLES11|SLES12/) {
449     $kernel_req = "kernel-source";
450 }
451
452 my $network_dir;
453 if ($DISTRO =~ m/SLES/) {
454     $network_dir = "/etc/sysconfig/network";
455 }
456 else {
457     $network_dir = "/etc/sysconfig/network-scripts";
458 }
459
460 my $setpci = '/sbin/setpci';
461 my $lspci = '/sbin/lspci';
462
463 # List of packages that were included in the previous OFED releases
464 # for uninstall purpose
465 my @prev_ofed_packages = (
466                         "mpich_mlx", "ibtsal", "openib", "opensm", "opensm-devel", "opensm-libs", "opensm-libs3",
467                         "mpi_ncsa", "mpi_osu", "thca", "ib-osm", "osm", "diags", "ibadm",
468                         "ib-diags", "ibgdiag", "ibdiag", "ib-management",
469                         "ib-verbs", "ib-ipoib", "ib-cm", "ib-sdp", "ib-dapl", "udapl",
470                         "udapl-devel", "libdat", "libibat", "ib-kdapl", "ib-srp", "ib-srp_target",
471                         "libipathverbs", "libipathverbs-devel",
472                         "libehca", "libehca-devel", "dapl", "dapl-devel",
473                         "libibcm", "libibcm-devel", "libibcommon", "libibcommon-devel",
474                         "libibmad", "libibmad-devel", "libibumad", "libibumad-devel",
475                         "ibsim", "ibsim-debuginfo",
476                         "libibverbs", "libibverbs-devel", "libibverbs-utils",
477                         "libipathverbs", "libipathverbs-devel", "libmthca",
478                         "libmthca-devel", "libmlx4", "libmlx4-devel",
479                         "libsdp", "librdmacm", "librdmacm-devel", "librdmacm-utils", "ibacm",
480                         "openib-diags", "openib-mstflint", "openib-perftest", "openib-srptools", "openib-tvflash",
481                         "openmpi", "openmpi-devel", "openmpi-libs",
482                         "ibutils", "ibutils-devel", "ibutils-libs", "ibutils2", "ibutils2-devel",
483                         "libnes", "libnes-devel", "libi40iw",
484                         "infinipath-psm", "infinipath-psm-devel", "intel-mic-psm", "intel-mic-psm-devel",
485                         "ibpd", "libibscif", "libibscif-devel",
486                         "libvmw_pvrdma",
487                         "libqedr",
488                         "libbnxt_re",
489                         "rdma-core", "rdma-core-devel", "rdma-core-compat",
490                         "mvapich", "openmpi", "mvapich2"
491                         );
492
493
494 my @distro_ofed_packages = (
495                         "libamso", "libamso-devel", "dapl2", "dapl2-devel", "mvapich", "mvapich2", "mvapich2-devel",
496                         "mvapich-devel", "libboost_mpi1_36_0", "boost-devel", "boost-doc", "libmthca-rdmav2", "libcxgb3-rdmav2", "libcxgb4-rdmav2",
497                         "libmlx4-rdmav2", "libnes-rdmav2", "libi40iw-rdmav2", "libqedr-rdmav2", "libbnxt_re-rdmav2", "libvmw_pvrdma-rdmav2",
498                         "libibverbs1", "libibmad1", "libibumad1", "libibcommon1", "ofed", "ofa", "libibdm1", "libibcm1", "libibnetdisc5",
499                         "scsi-target-utils", "rdma-ofa-agent", "libibumad3", "libibmad5", "libibverbs-runtime", "librdmacm1", "libi40iw",
500                         );
501
502 my @mlnx_en_packages = (
503                        "mlnx_en", "mlnx-en-devel", "mlnx_en-devel", "mlnx_en-doc", "mlnx-ofc", "mlnx-ofc-debuginfo"
504                         );
505
506 my @chelsio_uwire_packages = (
507                         "bonding", "chcr", "chelsio-series4-firmware", "chelsio-utils", "chiscsi", "chiwarp",
508                         "csiostor-initiator", "cxgb4", "cxgb4i", "cxgb4toe", "cxgb4vf", "libcxgb4", "libcxgb4-devel",
509                         "libcxgb4_sock", "libcxgb4_sock_debug", "libcxgb4_udp", "libcxgb4_udp_debug", "sniffer",
510                         "cxgb4nic", "cxgb4toe-ipv4", "cxgbit", "oiscsi-utils", "libiwpm", "libiwpm-debuginfo",
511                         "chopenssl", "chopenssl-devel", "chopenssl-doc", "libcxgb4-debuginfo", "cxgb4toe-udpso",
512                         "cxgb4ipv6", "chtrace", "chfilter", "csiostor-target", "cxgb4wdtoe", "libwdtoe", "libwdtoe_dbg",
513                         "bypass", "chelsio-bypass-utils", "chfcoe", "rdma-block-device"
514                         );
515
516 # List of all available packages sorted following dependencies
517 my @kernel_packages = ("compat-rdma", "compat-rdma-devel", "compat-rdma-firmware", "ib-bonding", "ib-bonding-debuginfo");
518 my @basic_kernel_modules = ("core", "mthca", "mlx4", "mlx4_en", "mlx5", "cxgb3", "cxgb4", "nes", "i40iw", "i40e", "ehca", "qib", "ocrdma", "ipoib", "nvme", "nvme-host", "nvme-target", "qedr", "bnxt_re", "vmw_pvrdma");
519 my @ulp_modules = ("sdp", "srp", "srpt", "rds", "qlgc_vnic", "iser", "nfsrdma", "cxgb3i", "cxgb4i");
520 my @xeon_phi_kernel = ("ibscif", "ibp-server", "ibp-debug");
521
522 # kernel modules in "technology preview" status can be installed by
523 # adding "module=y" to the ofed.conf file in unattended installation mode
524 # or by selecting the module in custom installation mode during interactive installation
525 my @tech_preview;
526
527 my @kernel_modules = (@basic_kernel_modules, @ulp_modules);
528
529 my $kernel_configure_options = '';
530 my $user_configure_options = '';
531 my $enable_iwpmd = 0;
532
533 my @misc_packages = ("ofed-docs", "ofed-scripts");
534
535 my @xeon_phi_user = ("ibpd", "libibscif");
536 my @non_xeon_phi_user = ("infinipath-psm", "infinipath-psm-devel");
537 my @rdma_core_packages = ("libibverbs", "libibverbs1", "libibverbs-utils",
538                           "librdmacm", "librdmacm1", "librdmacm-utils",
539                           "libmlx5-1", "libmlx4-1",
540                           "libibumad", "libibumad3", "libibcm", "libibcm1",
541                           "ibacm", "iwpmd", "srp_daemon", "rdma-ndd", "rsocket"
542                          );
543
544 my @user_packages = ("rdma-core", "rdma-core-devel", @rdma_core_packages,
545                      "libibmad", "libibmad-devel", "libibmad-static", "libibmad-debuginfo",
546                      "ibsim", "ibsim-debuginfo",
547                      "opensm", "opensm-libs", "opensm-devel", "opensm-debuginfo", "opensm-static",
548                      "compat-dapl", "compat-dapl-devel",
549                      "dapl", "dapl-devel", "dapl-devel-static", "dapl-utils", "dapl-debuginfo",
550                      "perftest", "mstflint", "libiwpm",
551                      "qlvnictools", "sdpnetstat", "srptools", "rds-tools", "rds-devel",
552                      "ibutils", "infiniband-diags", "qperf", "qperf-debuginfo",
553                      "ofed-docs", "ofed-scripts",
554                      "libfabric", "libfabric-devel", "libfabric-debuginfo",
555                      "fabtests", "fabtests-debuginfo"
556                      );
557
558 my @basic_kernel_packages = ("compat-rdma");
559 my @basic_user_packages = ("rdma-core", "rdma-core-devel", @rdma_core_packages,
560                             "libiwpm", "mstflint", @misc_packages);
561
562 my @hpc_kernel_packages = ("compat-rdma", "ib-bonding");
563 my @hpc_kernel_modules = (@basic_kernel_modules);
564
565 # all_packages is required to save ordered (following dependencies) list of
566 # packages. Hash does not saves the order
567 my @all_packages = (@kernel_packages, @user_packages);
568
569 my %kernel_modules_info = (
570         'core' =>
571             { name => "core", available => 1, selected => 0,
572             included_in_rpm => 0, requires => [], },
573         'firmware' =>
574             { name => "firmware", available => 1, selected => 0,
575             included_in_rpm => 0, requires => [], },
576        'mthca' =>
577             { name => "mthca", available => 0, selected => 0,
578             included_in_rpm => 0, requires => ["core"], },
579         'mlx4' =>
580             { name => "mlx4", available => 1, selected => 0,
581             included_in_rpm => 0, requires => ["core"], },
582         'mlx5' =>
583             { name => "mlx5", available => 1, selected => 0,
584             included_in_rpm => 0, requires => ["core"], },
585         'mlx4_en' =>
586             { name => "mlx4_en", available => 1, selected => 0,
587             included_in_rpm => 0, requires => ["core","mlx4"], },
588         'ehca' =>
589             { name => "ehca", available => 0, selected => 0,
590             included_in_rpm => 0, requires => ["core"], },
591         'ipath' =>
592             { name => "ipath", available => 0, selected => 0,
593             included_in_rpm => 0, requires => ["core"], },
594         'qib' =>
595             { name => "qib", available => 0, selected => 0,
596             included_in_rpm => 0, requires => ["core"], },
597         'cxgb3' =>
598             { name => "cxgb3", available => 1, selected => 0,
599             included_in_rpm => 0, requires => ["core"], },
600         'cxgb4' =>
601             { name => "cxgb4", available => 1, selected => 0,
602             included_in_rpm => 0, requires => ["core"], },
603         'cxgb3i' =>
604             { name => "cxgb3i", available => 0, selected => 0,
605             included_in_rpm => 0, requires => ["core"], },
606         'cxgb4i' =>
607             { name => "cxgb4i", available => 0, selected => 0,
608             included_in_rpm => 0, requires => ["core"], },
609         'nes' =>
610             { name => "nes", available => 1, selected => 0,
611             included_in_rpm => 0, requires => ["core"], },
612         'i40iw' =>
613             { name => "i40iw", available => 0, selected => 0,
614             included_in_rpm => 0, requires => ["core","i40e"], },
615         'i40e' =>
616             { name => "i40e", available => 0, selected => 0,
617             included_in_rpm => 0, requires => ["core"], },
618         'ocrdma' =>
619             { name => "ocrdma", available => 0, selected => 0,
620             included_in_rpm => 0, requires => ["core"], },
621         'ipoib' =>
622             { name => "ipoib", available => 1, selected => 0,
623             included_in_rpm => 0, requires => ["core"], },
624         'sdp' =>
625             { name => "sdp", available => 0, selected => 0,
626             included_in_rpm => 0, requires => ["core", "ipoib"], },
627         'srp' =>
628             { name => "srp", available => 1, selected => 0,
629             included_in_rpm => 0, requires => ["core", "ipoib"], },
630         'srpt' =>
631             { name => "srpt", available => 0, selected => 0,
632             included_in_rpm => 0, requires => ["core"], },
633         'rds' =>
634             { name => "rds", available => 0, selected => 0,
635             included_in_rpm => 0, requires => ["core", "ipoib"], },
636         'iser' =>
637             { name => "iser", available => 1, selected => 0,
638             included_in_rpm => 0, requires => ["core", "ipoib"], ofa_req_inst => [] },
639         'qlgc_vnic' =>
640             { name => "qlgc_vnic", available => 0, selected => 0,
641             included_in_rpm => 0, requires => ["core"], },
642         'nfsrdma' =>
643             { name => "nfsrdma", available => 0, selected => 0,
644             included_in_rpm => 0, requires => ["core", "ipoib"], },
645         'ibscif' =>
646             { name => "ibscif", available => 1, selected => 0,
647             included_in_rpm => 0, requires => ["core"],
648             dist_req_build => ["/lib/modules/$kernel/scif.symvers"], },
649         'ibp-server' =>
650             { name => "ibp-server", available => 1, selected => 0,
651             included_in_rpm => 0, requires => ["core"], },
652         'ibp-debug' =>
653             { name => "ibp-debug", available => 1, selected => 0,
654             included_in_rpm => 0, requires => ["core", "ibp-server"], },
655         'vmw_pvrdma' =>
656             { name => "vmw_pvrdma", available => 1, selected => 0,
657             included_in_rpm => 0, requires => ["core"], },
658         'qed' =>
659             { name => "qed", available => 1, selected => 0,
660             included_in_rpm => 0, requires => ["core"], },
661         'qede' =>
662             { name => "qede", available => 1, selected => 0,
663             included_in_rpm => 0, requires => ["core", "qed", "firmware"], },
664         'qedr' =>
665             { name => "qedr", available => 1, selected => 0,
666             included_in_rpm => 0, requires => ["core", "qed", "qede", "firmware"], },
667         'bnxt_re' =>
668             { name => "bnxt_re", available => 1, selected => 0,
669             included_in_rpm => 0, requires => ["core", "bnxt_en"], },
670         'nvme' =>
671             { name => "nvme", available => 0, selected => 0,
672             included_in_rpm => 0, requires => ["core"], },
673         'nvme-host' =>
674             { name => "nvme-host", available => 0, selected => 0,
675             included_in_rpm => 0, requires => ["core", "nvme"], },
676         'nvme-target' =>
677             { name => "nvme-target", available => 0, selected => 0,
678             included_in_rpm => 0, requires => ["core", "nvme"], },
679         );
680
681 my %packages_info = (
682         # Kernel packages
683         'compat-rdma' =>
684             { name => "compat-rdma", parent => "compat-rdma",
685             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
686             available => 1, mode => "kernel", dist_req_build => ["make", "gcc"],
687             dist_req_inst => [], ofa_req_build => [], ofa_req_inst => ["ofed-scripts"], configure_options => '' },
688         'compat-rdma' =>
689             { name => "compat-rdma", parent => "compat-rdma",
690             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
691             available => 1, mode => "kernel", dist_req_build => ["make", "gcc"],
692             dist_req_inst => ["pciutils"], ofa_req_build => [], ofa_req_inst => ["ofed-scripts"], },
693         'compat-rdma-devel' =>
694             { name => "compat-rdma-devel", parent => "compat-rdma",
695             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
696             available => 1, mode => "kernel", dist_req_build => [],
697             dist_req_inst => [], ofa_req_build => [],
698             ofa_req_inst => ["compat-rdma"], },
699         'compat-rdma-firmware' =>
700             { name => "compat-rdma-firmware", parent => "compat-rdma",
701             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
702             available => 1, mode => "kernel", dist_req_build => [],
703             dist_req_inst => [], ofa_req_build => [],
704             ofa_req_inst => ["compat-rdma"], },
705         'ib-bonding' =>
706             { name => "ib-bonding", parent => "ib-bonding",
707             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
708             available => 0, mode => "kernel", dist_req_build => [],
709             dist_req_inst => [], ofa_req_build => [], ofa_req_inst => [], configure_options => '' },
710         'ib-bonding-debuginfo' =>
711             { name => "ib-bonding-debuginfo", parent => "ib-bonding",
712             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
713             available => 0, mode => "kernel", dist_req_build => [],
714             dist_req_inst => [], ofa_req_build => [], ofa_req_inst => [], },
715         # User space libraries
716         'rdma-core' =>
717             { name => "rdma-core", parent => "rdma-core",
718             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
719             available => 1, mode => "user",
720             dist_req_build =>
721             ($build32 == 1 )?[@rdma_core_build_deps, "$gcc", "$glibc_devel$suffix_64bit","$glibc_devel$suffix_32bit","$libgcc","$libgcc"."$suffix_32bit", "$libnl_devel"."$suffix_64bit", ($DISTRO =~ /SUSE/)?"$libnl_devel"."$suffix_32bit":(($arch =~ /ppc/)?"$libnl_devel":"$libnl_devel.$target_cpu32")]:[@rdma_core_build_deps, "$gcc","$glibc_devel$suffix_64bit","$libgcc", "$libnl_devel"."$suffix_64bit"],
722             dist_req_inst => ( $build32 == 1 )?["$pkgconfig","$libnl"."$suffix_64bit", ($dist_rpm !~ /sles-release-11.1/)?"$libnl"."$suffix_32bit":"$libnl.$target_cpu32"]:["$pkgconfig","$libnl"."$suffix_64bit"] ,
723             ofa_req_build => [],
724             ofa_req_inst => ["ofed-scripts"],
725             install32 => 1, exception => 0 },
726         'rdma-core-devel' =>
727             { name => "rdma-core-devel", parent => "rdma-core",
728             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
729             available => 1, mode => "user", dist_req_build => [],
730             dist_req_inst => [], ofa_req_build => [],
731             ofa_req_inst => ["rdma-core"],
732             install32 => 1, exception => 0, configure_options => '' },
733         'libfabric' =>
734             { name => "libfabric", parent => "libfabric",
735             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
736             available => 1, mode => "user", dist_req_build => ["$libnl_devel"],
737             dist_req_inst => [], ofa_req_build => ["rdma-core"],
738             ofa_req_inst => ["rdma-core"],
739             install32 => 1, exception => 0, configure_options => '' },
740         'libfabric-devel' =>
741             { name => "libfabric-devel", parent => "libfabric",
742             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
743             available => 1, mode => "user", dist_req_build => [],
744             dist_req_inst => [], ofa_req_build => ["libfabric"],
745             ofa_req_inst => ["libfabric"],
746             install32 => 1, exception => 0 },
747         'libfabric-debuginfo' =>
748             { name => "libfabric-debuginfo", parent => "libfabric",
749             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
750             available => 1, mode => "user", dist_req_build => [],
751             dist_req_inst => [], ofa_req_build => ["libfabric"],
752             ofa_req_inst => ["libfabric"],
753             install32 => 0, exception => 0 },
754
755         'fabtests' =>
756             { name => "fabtests", parent => "fabtests",
757             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
758             available => 1, mode => "user", dist_req_build => [],
759             dist_req_inst => [], ofa_req_build => ["libfabric-devel"],
760             ofa_req_inst => ["libfabric"],
761             install32 => 1, exception => 0, configure_options => '' },
762         'fabtests-debuginfo' =>
763             { name => "fabtests-debuginfo", parent => "fabtests",
764             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
765             available => 1, mode => "user", dist_req_build => [],
766             dist_req_inst => [], ofa_req_build => ["fabtests"],
767             ofa_req_inst => ["fabtests"],
768             install32 => 0, exception => 0 },
769
770         'libvmw_pvrdma' =>
771             { name => "libvmw_pvrdma", parent => "libvmw_pvrdma",
772             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
773             available => 1, mode => "user", dist_req_build => [],
774             dist_req_inst => [],ubuntu_dist_req_build => [],
775             ubuntu_dist_req_inst => [], ofa_req_build => ["rdma-core"],
776             ofa_req_inst => ["rdma-core"],
777             install32 => 1, exception => 0, configure_options => '' },
778
779         'libqedr' =>
780             { name => "libqedr", parent => "libqedr",
781             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
782             available => 1, mode => "user", dist_req_build => [],
783             dist_req_inst => [],ubuntu_dist_req_build => [],
784             ubuntu_dist_req_inst => [], ofa_req_build => ["rdma-core"],
785             ofa_req_inst => ["rdma-core"],
786             install32 => 1, exception => 0, configure_options => '' },
787
788         'libbnxt_re' =>
789             { name => "libnxt_re", parent => "libbnxt_re",
790             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
791             available => 1, mode => "user", dist_req_build => [],
792             dist_req_inst => [],ubuntu_dist_req_build => [],
793             ubuntu_dist_req_inst => [], ofa_req_build => ["rdma-core"],
794             ofa_req_inst => ["rdma-core"],
795             install32 => 1, exception => 0, configure_options => '' },
796
797         # Management
798         'libibmad' =>
799             { name => "libibmad", parent => "libibmad",
800             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
801             available => 1, mode => "user", dist_req_build => ["libtool"],
802             dist_req_inst => [],ubuntu_dist_req_build => ["libtool"],ubuntu_dist_req_inst => [], ofa_req_build => ["rdma-core"],
803             ofa_req_inst => ["rdma-core"],
804             install32 => 1, exception => 0, configure_options => '' },
805         'libibmad-devel' =>
806             { name => "libibmad-devel", parent => "libibmad",
807             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
808             available => 1, mode => "user", dist_req_build => [],
809             dist_req_inst => [], ofa_req_build => ["rdma-core"],
810             ofa_req_inst => ["libibmad", "rdma-core"],
811             install32 => 1, exception => 0 },
812         'libibmad-static' =>
813             { name => "libibmad-static", parent => "libibmad",
814             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
815             available => 1, mode => "user", dist_req_build => [],
816             dist_req_inst => [], ofa_req_build => ["rdma-core"],
817             ofa_req_inst => ["libibmad", "rdma-core"],
818             install32 => 1, exception => 0 },
819         'libibmad-debuginfo' =>
820             { name => "libibmad-debuginfo", parent => "libibmad",
821             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
822             available => 1, mode => "user", dist_req_build => [],
823             dist_req_inst => [], ofa_req_build => ["rdma-core"],
824             ofa_req_inst => [],
825             install32 => 0, exception => 0 },
826
827         'libibscif' =>
828             { name => "libibscif", parent => "libibscif",
829             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
830             available => 1, mode => "user", dist_req_build => [],
831             dist_req_inst => [],ubuntu_dist_req_build => [],
832             ubuntu_dist_req_inst => [], ofa_req_build => ["rdma-core"],
833             ofa_req_inst => ["rdma-core"],
834             install32 => 1, exception => 0, configure_options => '' },
835         'libibscif-devel' =>
836             { name => "libibscif-devel", parent => "libibscif",
837             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
838             available => 1, mode => "user", dist_req_build => [],
839             dist_req_inst => [], ofa_req_build => ["rdma-core"],
840             ofa_req_inst => ["rdma-core", "libibscif"],
841             install32 => 1, exception => 0 },
842
843         'ibpd' =>
844             { name => "ibpd", parent => "ibpd",
845             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
846             available => 1, mode => "user", dist_req_build => [],
847             dist_req_inst => [],ubuntu_dist_req_build => [],
848             ubuntu_dist_req_inst => [], ofa_req_build => ["rdma-core"],
849             ofa_req_inst => ["rdma-core"],
850             install32 => 1, exception => 0, configure_options => '' },
851
852         'opensm' =>
853             { name => "opensm", parent => "opensm",
854             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
855             available => 1, mode => "user", dist_req_build => ["bison", "flex"],
856             dist_req_inst => [],ubuntu_dist_req_build => ["bison", "flex"],ubuntu_dist_req_inst => [], ofa_req_build => ["rdma-core-devel"],
857             ofa_req_inst => ["opensm-libs"],
858             install32 => 0, exception => 0, configure_options => '' },
859         'opensm-devel' =>
860             { name => "opensm-devel", parent => "opensm",
861             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
862             available => 1, mode => "user", dist_req_build => [],
863             dist_req_inst => [], ofa_req_build => ["rdma-core"],
864             ofa_req_inst => ["rdma-core", "opensm-libs"],
865             install32 => 1, exception => 0 },
866         'opensm-libs' =>
867             { name => "opensm-libs", parent => "opensm",
868             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
869             available => 1, mode => "user", dist_req_build => ["bison", "flex"],
870             dist_req_inst => [],ubuntu_dist_req_build => ["bison", "flex"],ubuntu_dist_req_inst => [], ofa_req_build => ["rdma-core"],
871             ofa_req_inst => ["rdma-core"],
872             install32 => 1, exception => 0 },
873         'opensm-static' =>
874             { name => "opensm-static", parent => "opensm",
875             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
876             available => 1, mode => "user", dist_req_build => [],
877             dist_req_inst => [], ofa_req_build => ["rdma-core"],
878             ofa_req_inst => ["rdma-core", "opensm-libs"],
879             install32 => 1, exception => 0 },
880         'opensm-debuginfo' =>
881             { name => "opensm-debuginfo", parent => "opensm",
882             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
883             available => 1, mode => "user", dist_req_build => [],
884             dist_req_inst => [], ofa_req_build => ["rdma-core"],
885             ofa_req_inst => [],
886             install32 => 0, exception => 0 },
887
888         'ibsim' =>
889             { name => "ibsim", parent => "ibsim",
890             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
891             available => 1, mode => "user", dist_req_build => [],
892             dist_req_inst => [], ofa_req_build => ["rdma-core", "libibmad-devel"],
893             ofa_req_inst => ["rdma-core", "libibmad"],
894             install32 => 0, exception => 0, configure_options => '' },
895         'ibsim-debuginfo' =>
896             { name => "ibsim-debuginfo", parent => "ibsim",
897             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
898             available => 1, mode => "user", dist_req_build => [],
899             dist_req_inst => [], ofa_req_build => ["rdma-core", "libibmad-devel"],
900             ofa_req_inst => [],
901             install32 => 0, exception => 0, configure_options => '' },
902         'perftest' =>
903             { name => "perftest", parent => "perftest",
904             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
905             available => 1, mode => "user", dist_req_build => [],
906             dist_req_inst => [], ofa_req_build => ["rdma-core-devel"],
907             ofa_req_inst => ["rdma-core"],
908             install32 => 0, exception => 0, configure_options => '' },
909         'perftest-debuginfo' =>
910             { name => "perftest-debuginfo", parent => "perftest",
911             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
912             available => 1, mode => "user", dist_req_build => [],
913             dist_req_inst => [], ofa_req_build => [],
914             ofa_req_inst => [],
915             install32 => 0, exception => 0 },
916
917         'mstflint' =>
918             { name => "mstflint", parent => "mstflint",
919             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
920             available => 1, mode => "user",
921             dist_req_build => ["zlib-devel$suffix_64bit", "$libstdc_devel$suffix_64bit", "gcc-c++"],
922             dist_req_inst => [], ofa_req_build => ["libibmad-devel"],
923             ubuntu_dist_req_build => ["zlib1g-dev", "$libstdc_devel", "gcc","g++","byacc"],ubuntu_dist_req_inst => [],
924             ofa_req_inst => ["libibmad"],
925             install32 => 0, exception => 0, configure_options => '' },
926         'mstflint-debuginfo' =>
927             { name => "mstflint-debuginfo", parent => "mstflint",
928             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
929             available => 1, mode => "user", dist_req_build => [],
930             dist_req_inst => [], ofa_req_build => [],
931             ofa_req_inst => [],
932             install32 => 0, exception => 0 },
933
934         'ibvexdmtools' =>
935             { name => "ibvexdmtools", parent => "qlvnictools",
936             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
937             available => 0, mode => "user", dist_req_build => [],
938             dist_req_inst => [], ofa_req_build => ["rdma-core"],
939             ofa_req_inst => ["rdma-core"],
940             install32 => 0, exception => 0, configure_options => '' },
941         'qlgc_vnic_daemon' =>
942             { name => "qlgc_vnic_daemon", parent => "qlvnictools",
943             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
944             available => 0, mode => "user", dist_req_build => [],
945             dist_req_inst => [], ofa_req_build => [],
946             ofa_req_inst => [],
947             install32 => 0, exception => 0, configure_options => '' },
948         'qlvnictools' =>
949             { name => "qlvnictools", parent => "qlvnictools",
950             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
951             available => 0, mode => "user", dist_req_build => [],
952             dist_req_inst => [], ofa_req_build => ["rdma-core"],
953             ofa_req_inst => ["ibvexdmtools", "qlgc_vnic_daemon", "rdma-core"],
954             install32 => 0, exception => 0, configure_options => '' },
955         'qlvnictools-debuginfo' =>
956             { name => "qlvnictools-debuginfo", parent => "qlvnictools",
957             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
958             available => 0, mode => "user", dist_req_build => [],
959             dist_req_inst => [], ofa_req_build => [],
960             ofa_req_inst => [],
961             install32 => 0, exception => 0 },
962
963         'rnfs-utils' =>
964             { name => "rnfs-utils", parent => "rnfs-utils",
965             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
966             available => 0, mode => "user", dist_req_build => [],
967             dist_req_inst => [], ofa_req_build => [],
968             ofa_req_inst => [],
969             install32 => 0, exception => 0, configure_options => '' },
970         'rnfs-utils-debuginfo' =>
971             { name => "rnfs-utils-debuginfo", parent => "rnfs-utils",
972             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
973             available => 0, mode => "user", dist_req_build => [],
974             dist_req_inst => [], ofa_req_build => [],
975             ofa_req_inst => [],
976             install32 => 0, exception => 0 },
977
978         'rds-tools' =>
979             { name => "rds-tools", parent => "rds-tools",
980             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
981             available => 1, mode => "user", dist_req_build => [],
982             dist_req_inst => [], ofa_req_build => [],
983             ofa_req_inst => [],
984             install32 => 0, exception => 0, configure_options => '' },
985         'rds-devel' =>
986             { name => "rds-devel", parent => "rds-tools",
987             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
988             available => 1, mode => "user", dist_req_build => [],
989             dist_req_inst => [], ofa_req_build => [],
990             ofa_req_inst => ["rds-tools"],
991             install32 => 0, exception => 0, configure_options => '' },
992         'rds-tools-debuginfo' =>
993             { name => "rds-tools-debuginfo", parent => "rds-tools",
994             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
995             available => 1, mode => "user", dist_req_build => [],
996             dist_req_inst => [], ofa_req_build => [],
997             ofa_req_inst => [],
998             install32 => 0, exception => 0 },
999
1000         'qperf' =>
1001             { name => "qperf", parent => "qperf",
1002             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
1003             available => 1, mode => "user", dist_req_build => [],
1004             dist_req_inst => [], ofa_req_build => ["rdma-core"],
1005             ofa_req_inst => ["rdma-core"],
1006             install32 => 0, exception => 0, configure_options => '' },
1007         'qperf-debuginfo' =>
1008             { name => "qperf-debuginfo", parent => "qperf",
1009             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
1010             available => 1, mode => "user", dist_req_build => [],
1011             dist_req_inst => [], ofa_req_build => [],
1012             ofa_req_inst => [],
1013             install32 => 0, exception => 0 },
1014
1015         'ibutils' =>
1016             { name => "ibutils", parent => "ibutils",
1017             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
1018             available => 1, mode => "user", dist_req_build => ["tcl__8.4", "tcl-devel__8.4", "tk", "$libstdc_devel"],
1019             dist_req_inst => ["tcl__8.4", "tk", "$libstdc"], ofa_req_build => ["rdma-core", "opensm-libs", "opensm-devel"],
1020             ofa_req_inst => ["rdma-core", "opensm-libs"],
1021             install32 => 0, exception => 0, configure_options => '' },
1022         'ibutils-debuginfo' =>
1023             { name => "ibutils-debuginfo", parent => "ibutils",
1024             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
1025             available => 1, mode => "user", dist_req_build => [],
1026             dist_req_inst => [], ofa_req_build => [],
1027             ofa_req_inst => [],
1028             install32 => 0, exception => 0 },
1029
1030         'infiniband-diags' =>
1031             { name => "infiniband-diags", parent => "infiniband-diags",
1032             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
1033             available => 1, mode => "user", dist_req_build => ["glib2-devel", "$libudev_devel"],
1034             dist_req_inst => [], ofa_req_build => ["opensm-devel", "libibmad-devel", "rdma-core"],
1035             ofa_req_inst => ["libibumad", "libibmad", "opensm-libs"],
1036             install32 => 0, exception => 0, configure_options => '' },
1037         'infiniband-diags-debuginfo' =>
1038             { name => "infiniband-diags-debuginfo", parent => "infiniband-diags",
1039             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
1040             available => 1, mode => "user", dist_req_build => [],
1041             dist_req_inst => [], ofa_req_build => [],
1042             ofa_req_inst => [],
1043             install32 => 0, exception => 0 },
1044
1045         'compat-dapl' =>
1046             { name => "dapl", parent => "compat-dapl",
1047             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
1048             available => 1, mode => "user", dist_req_build => [],
1049             dist_req_inst => [], ofa_req_build => ["rdma-core"],
1050             ofa_req_inst => ["rdma-core"],
1051             install32 => 1, exception => 0, configure_options => '' },
1052         'compat-dapl-devel' =>
1053             { name => "dapl-devel", parent => "compat-dapl",
1054             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
1055             available => 1, mode => "user", dist_req_build => [],
1056             dist_req_inst => [], ofa_req_build => ["rdma-core"],
1057             ofa_req_inst => ["compat-dapl"],
1058             install32 => 1, exception => 0, configure_options => '' },
1059         'dapl' =>
1060             { name => "dapl", parent => "dapl",
1061             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
1062             available => 1, mode => "user", dist_req_build => [],
1063             dist_req_inst => [], ofa_req_build => ["rdma-core"],
1064             ofa_req_inst => ["rdma-core"],
1065             install32 => 1, exception => 0, configure_options => '' },
1066         'dapl-devel' =>
1067             { name => "dapl-devel", parent => "dapl",
1068             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
1069             available => 1, mode => "user", dist_req_build => [],
1070             dist_req_inst => [], ofa_req_build => ["rdma-core"],
1071             ofa_req_inst => ["dapl"],
1072             install32 => 1, exception => 0, configure_options => '' },
1073         'dapl-devel-static' =>
1074             { name => "dapl-devel-static", parent => "dapl",
1075             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
1076             available => 1, mode => "user", dist_req_build => [],
1077             dist_req_inst => [], ofa_req_build => ["rdma-core"],
1078             ofa_req_inst => ["dapl"],
1079             install32 => 1, exception => 0, configure_options => '' },
1080         'dapl-utils' =>
1081             { name => "dapl-utils", parent => "dapl",
1082             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
1083             available => 1, mode => "user", dist_req_build => [],
1084             dist_req_inst => [], ofa_req_build => ["rdma-core"],
1085             ofa_req_inst => ["dapl"],
1086             install32 => 0, exception => 0, configure_options => '' },
1087         'dapl-debuginfo' =>
1088             { name => "dapl-debuginfo", parent => "dapl",
1089             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
1090             available => 1, mode => "user", dist_req_build => [],
1091             dist_req_inst => [], ofa_req_build => ["rdma-core"],
1092             ofa_req_inst => [],
1093             install32 => 0, exception => 0 },
1094
1095
1096         'ofed-docs' =>
1097             { name => "ofed-docs", parent => "ofed-docs",
1098             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
1099             available => 1, mode => "user", dist_req_build => [],
1100             dist_req_inst => [], ofa_req_build => [],
1101             ofa_req_inst => [],
1102             install32 => 0, exception => 0 },
1103
1104         'ofed-scripts' =>
1105             { name => "ofed-scripts", parent => "ofed-scripts",
1106             selected => 0, installed => 0, rpm_exist => 0, rpm_exist32 => 0,
1107             available => 1, mode => "user", dist_req_build => [],
1108             dist_req_inst => [], ofa_req_build => [],
1109             ofa_req_inst => [],
1110             install32 => 0, exception => 0 },
1111         );
1112
1113
1114 for my $rdma_core_p (@rdma_core_packages) {
1115     $packages_info{$rdma_core_p}{'name'} = $rdma_core_p;
1116     $packages_info{$rdma_core_p}{'parent'} = "rdma-core";
1117     $packages_info{$rdma_core_p}{'selected'} = 0;
1118     $packages_info{$rdma_core_p}{'installed'} = 0;
1119     $packages_info{$rdma_core_p}{'install32'} = 0;
1120     $packages_info{$rdma_core_p}{'rpm_exist'} = 0;
1121     $packages_info{$rdma_core_p}{'rpm_exist32'} = 0;
1122     $packages_info{$rdma_core_p}{'mode'} = "user";
1123     $packages_info{$rdma_core_p}{'exception'} = 0;
1124     $packages_info{$rdma_core_p}{'dist_req_build'} = [];
1125     $packages_info{$rdma_core_p}{'dist_req_inst'} = [];
1126     $packages_info{$rdma_core_p}{'ofa_req_build'} = [];
1127     $packages_info{$rdma_core_p}{'ofa_req_inst'} = [];
1128     $packages_info{$rdma_core_p}{'available'} = 1;
1129 }
1130
1131 my @hidden_packages = ("ibvexdmtools", "qlgc_vnic_daemon");
1132
1133 my $TOPDIR = $builddir . '/' . $PACKAGE . "_topdir";
1134 chomp $TOPDIR;
1135
1136 rmtree ("$TOPDIR");
1137 mkpath([$TOPDIR . '/BUILD' ,$TOPDIR . '/RPMS',$TOPDIR . '/SOURCES',$TOPDIR . '/SPECS',$TOPDIR . '/SRPMS']);
1138
1139 if ($config_given and $install_option) {
1140     print RED "\nError: '-c' option can't be used with '--all|--hpc|--basic'", RESET "\n";
1141     exit 1;
1142 }
1143
1144 if ($config_given and not -e $config) {
1145     print RED "$config does not exist", RESET "\n";
1146     exit 1;
1147 }
1148
1149 if (not $config_given and -e $config) {
1150     move($config, "$config.save");
1151 }
1152
1153 if ($quiet) {
1154     $verbose = 0;
1155     $verbose2 = 0;
1156     $verbose3 = 0;
1157 }
1158
1159 my %ifcfg = ();
1160 if ($config_net_given and not -e $config_net) {
1161     print RED "$config_net does not exist", RESET "\n";
1162     exit 1;
1163 }
1164
1165 my $eth_dev;
1166 if ($config_net_given) {
1167     open(NET, "$config_net") or die "Can't open $config_net: $!";
1168     while (<NET>) {
1169         my ($param, $value) = split('=');
1170         chomp $param;
1171         chomp $value;
1172         my $dev = $param;
1173         $dev =~ s/(.*)_(ib[0-9]+)/$2/;
1174         chomp $dev;
1175
1176         if ($param =~ m/IPADDR/) {
1177             $ifcfg{$dev}{'IPADDR'} = $value;
1178         }
1179         elsif ($param =~ m/NETMASK/) {
1180             $ifcfg{$dev}{'NETMASK'} = $value;
1181         }
1182         elsif ($param =~ m/NETWORK/) {
1183             $ifcfg{$dev}{'NETWORK'} = $value;
1184         }
1185         elsif ($param =~ m/BROADCAST/) {
1186             $ifcfg{$dev}{'BROADCAST'} = $value;
1187         }
1188         elsif ($param =~ m/ONBOOT/) {
1189             $ifcfg{$dev}{'ONBOOT'} = $value;
1190         }
1191         elsif ($param =~ m/LAN_INTERFACE/) {
1192             $ifcfg{$dev}{'LAN_INTERFACE'} = $value;
1193         }
1194         else {
1195             print RED "Unsupported parameter '$param' in $config_net\n" if ($verbose2);
1196         }
1197     }
1198     close(NET);
1199 }
1200
1201 sub sig_handler
1202 {
1203     exit 1;
1204 }
1205
1206 sub getch
1207 {
1208         my $c;
1209         system("stty -echo raw");
1210         $c=getc(STDIN);
1211         system("stty echo -raw");
1212         # Exit on Ctrl+c or Esc
1213         if ($c eq "\cC" or $c eq "\e") {
1214             print "\n";
1215             exit 1;
1216         }
1217         print "$c\n";
1218         return $c;
1219 }
1220
1221 sub get_rpm_name_arch
1222 {
1223     my $ret = `rpm --queryformat "[%{NAME}] [%{ARCH}]" -qp @_ | grep -v Freeing`;
1224     chomp $ret;
1225     return $ret;
1226 }
1227
1228 sub get_rpm_ver
1229 {
1230     my $ret = `rpm --queryformat "[%{VERSION}]\n" -qp @_ | uniq`;
1231     chomp $ret;
1232     return $ret;
1233 }
1234
1235 sub get_rpm_rel
1236 {
1237     my $ret = `rpm --queryformat "[%{RELEASE}]\n" -qp @_ | uniq`;
1238     chomp $ret;
1239     return $ret;
1240 }
1241
1242 # Get RPM name and version of the INSTALLED package
1243 sub get_rpm_ver_inst
1244 {
1245     my $ret;
1246     if ($DISTRO =~ /DEBIAN|UBUNTU/) {
1247         $ret = `dpkg-query -W -f='\${Version}\n' @_ | cut -d ':' -f 2 | uniq`;
1248     }
1249     else {
1250         $ret = `rpm --queryformat '[%{VERSION}]\n' -q @_ | uniq`;
1251     }
1252     chomp $ret;
1253     return $ret;
1254 }
1255
1256 sub get_rpm_rel_inst
1257 {
1258     my $ret = `rpm --queryformat "[%{RELEASE}]\n" -q @_ | uniq`;
1259     chomp $ret;
1260     return $ret;
1261 }
1262
1263 sub get_rpm_info
1264 {
1265     my $ret = `rpm --queryformat "[%{NAME}] [%{VERSION}] [%{RELEASE}] [%{DESCRIPTION}]" -qp @_`;
1266     chomp $ret;
1267     return $ret;
1268 }
1269
1270 sub supported32bit
1271 {
1272     if ($arch =~ /i[0-9]86|ia64/) {
1273         return 0;
1274     }
1275     return 1
1276 }
1277
1278 sub set_cfg
1279 {
1280     my $srpm_full_path = shift @_;
1281
1282     my $info = get_rpm_info($srpm_full_path);
1283     my $name = (split(/ /,$info,4))[0];
1284     my $version = (split(/ /,$info,4))[1];
1285
1286     ( $main_packages{$name}{'name'},
1287       $main_packages{$name}{'version'},
1288       $main_packages{$name}{'release'},
1289       $main_packages{$name}{'description'} ) = split(/ /,$info,4);
1290       $main_packages{$name}{'srpmpath'}   = $srpm_full_path;
1291
1292     print "set_cfg: " .
1293              "name: $name, " .
1294              "original name: $main_packages{$name}{'name'}, " .
1295              "version: $main_packages{$name}{'version'}, " .
1296              "release: $main_packages{$name}{'release'}, " .
1297              "srpmpath: $main_packages{$name}{'srpmpath'}\n" if ($verbose3);
1298
1299 }
1300
1301 # Set packages availability depending OS/Kernel/arch
1302 sub set_availability
1303 {
1304         if ($DISTRO =~ /SLES/) {
1305         $packages_info{'librdmacm'}{'available'} = 0;
1306         $packages_info{'libibumad'}{'available'} = 0;
1307         $packages_info{'libibcm'}{'available'} = 0;
1308         } else {
1309         $packages_info{'libibverbs1'}{'available'} = 0;
1310         $packages_info{'libibcm1'}{'available'} = 0;
1311         $packages_info{'libmlx4-1'}{'available'} = 0;
1312         $packages_info{'libmlx5-1'}{'available'} = 0;
1313         $packages_info{'librdmacm1'}{'available'} = 0;
1314         $packages_info{'libibumad3'}{'available'} = 0;
1315         $packages_info{'rsocket'}{'available'} = 0;
1316         $packages_info{'rdma-ndd'}{'available'} = 0;
1317         }
1318
1319     if ($kernel =~ m/^4\.17/) {
1320             $kernel_modules_info{'rds'}{'available'} = 1;
1321             $packages_info{'rds-tools'}{'available'} = 1;
1322             $packages_info{'rds-devel'}{'available'} = 1;
1323             $packages_info{'rds-tools-debuginfo'}{'available'} = 1;
1324             $kernel_modules_info{'srpt'}{'available'} = 1;
1325             $kernel_modules_info{'i40e'}{'available'} = 1;
1326             $kernel_modules_info{'i40iw'}{'available'} = 1;
1327             $kernel_modules_info{'nvme'}{'available'} = 1;
1328             $kernel_modules_info{'nvme-host'}{'available'} = 1;
1329             $kernel_modules_info{'nvme-target'}{'available'} = 1;
1330     }
1331     if ($rpm_distro =~ /rhel7u4|sles12sp3/) {
1332             $packages_info{'compat-rdma-firmware'}{'available'} = 0;
1333     }
1334     if ($rpm_distro =~ /rhel7u3|sles12sp2/) {
1335             $kernel_modules_info{'nfsrdma'}{'available'} = 1;
1336     }
1337     # libfabric due to dependency on infinipath-psm
1338     if ($arch =~ m/x86_64/) {
1339         $kernel_modules_info{'qib'}{'available'} = 1;
1340         $packages_info{'libfabric'}{'ofa_req_build'} = ["rdma-core"];
1341         $packages_info{'libfabric'}{'ofa_req_inst'} = ["rdma-core"];
1342     }
1343
1344     # require numa stuff where supported inbox
1345     if ($DISTRO =~ /RHEL|OEL|FC|POWERKVM/) {
1346         push(@{$packages_info{'rdma-core'}{'dist_req_build'}}, "numactl-devel$suffix_64bit");
1347         push(@{$packages_info{'rdma-core'}{'dist_req_build'}}, "numactl-devel$suffix_32bit") if ($build32 == 1);
1348
1349         my $numactl = "numactl";
1350         if ($DISTRO =~ /FC19|FC[2-9]|OEL[7-9]|RHEL[7-9]|POWERKVM/) {
1351             $numactl = "numactl-libs";
1352         }
1353         push(@{$packages_info{'rdma-core'}{'dist_req_inst'}}, "${numactl}${suffix_64bit}");
1354         push(@{$packages_info{'rdma-core'}{'dist_req_inst'}}, "${numactl}${suffix_32bit}") if ($build32 == 1);
1355     }
1356
1357     # Disable SRP on ppc64 platform to avoid update of scsi_transport_srp kernel module
1358     # which will prevent in-box ibmvscsi module load and, as a result, kernel panic upon boot
1359     if ($arch =~ m/ppc64/) {
1360         $kernel_modules_info{'srp'}{'available'} = 0;
1361     }
1362
1363     # debuginfo RPM currently are not supported on SuSE
1364     if ($DISTRO =~ m/SLES/ or $DISTRO eq 'DEBIAN') {
1365         for my $package (@all_packages) {
1366             if ($package =~ m/-debuginfo/) {
1367                 $packages_info{$package}{'available'} = 0;
1368             }
1369         }
1370     }
1371
1372     for my $key ( keys %disabled_packages ) {
1373         if (exists $packages_info{$key}) {
1374             $packages_info{$key}{'available'} = 0;
1375         } elsif (exists $kernel_modules_info{$key}) {
1376             $kernel_modules_info{$key}{'available'} = 0;
1377         }
1378     }
1379 }
1380
1381 # Set rpm_exist parameter for existing RPMs
1382 sub set_existing_rpms
1383 {
1384     # Check if the ofed-scripts RPM exist and its prefix is the same as required one
1385     my $scr_rpm = '';
1386     $scr_rpm = <$RPMS/ofed-scripts-*.$target_cpu.rpm>;
1387     if ( -f $scr_rpm ) {
1388         my $current_prefix = `rpm -qlp $scr_rpm | grep ofed_info | sed -e "s@/bin/ofed_info@@"`;
1389         chomp $current_prefix;
1390         print "Found $scr_rpm. Its installation prefix: $current_prefix\n" if ($verbose2);
1391         if (not $current_prefix eq $prefix) {
1392             print "Required prefix is: $prefix\n" if ($verbose2);
1393             print "Going to rebuild RPMs from scratch\n" if ($verbose2);
1394             return;
1395         }
1396     }
1397
1398     for my $binrpm ( <$RPMS/*.rpm> ) {
1399         my ($rpm_name, $rpm_arch) = (split ' ', get_rpm_name_arch($binrpm));
1400         $main_packages{$rpm_name}{'rpmpath'}   = $binrpm;
1401         if ($rpm_name =~ /compat-rdma|ib-bonding/) {
1402             if (($rpm_arch eq $target_cpu) and (get_rpm_rel($binrpm) =~ /$kernel_rel/)) {
1403                 $packages_info{$rpm_name}{'rpm_exist'} = 1;
1404                 print "$rpm_name RPM exist\n" if ($verbose2);
1405             }
1406         }
1407         else {
1408             if ($rpm_arch eq $target_cpu) {
1409                 $packages_info{$rpm_name}{'rpm_exist'} = 1;
1410                 print "$rpm_name RPM exist\n" if ($verbose2);
1411             }
1412             elsif ($rpm_arch eq $target_cpu32) {
1413                 $packages_info{$rpm_name}{'rpm_exist32'} = 1;
1414                 print "$rpm_name 32-bit RPM exist\n" if ($verbose2);
1415             }
1416         }
1417     }
1418 }
1419
1420 sub show_menu
1421 {
1422     my $menu = shift @_;
1423     my $max_inp;
1424
1425     print $clear_string;
1426     if ($menu eq "main") {
1427         print "$PACKAGE Distribution Software Installation Menu\n\n";
1428         print "   1) View $PACKAGE Installation Guide\n";
1429         print "   2) Install $PACKAGE Software\n";
1430         print "   3) Show Installed Software\n";
1431         print "   4) Configure IPoIB\n";
1432         print "   5) Uninstall $PACKAGE Software\n";
1433 #        print "   6) Generate Supporting Information for Problem Report\n";
1434         print "\n   Q) Exit\n";
1435         $max_inp=5;
1436         print "\nSelect Option [1-$max_inp]:"
1437     }
1438     elsif ($menu eq "select") {
1439         print "$PACKAGE Distribution Software Installation Menu\n\n";
1440         print "   1) Basic ($PACKAGE modules and basic user level libraries)\n";
1441         print "   2) All packages\n";
1442         print "   3) Customize\n";
1443         print "\n   Q) Exit\n";
1444         $max_inp=3;
1445         print "\nSelect Option [1-$max_inp]:"
1446     }
1447
1448     return $max_inp;
1449 }
1450
1451 # Select package for installation
1452 sub select_packages
1453 {
1454     my $cnt = 0;
1455     if ($interactive) {
1456         open(CONFIG, ">$config") || die "Can't open $config: $!";;
1457         flock CONFIG, $LOCK_EXCLUSIVE;
1458         my $ok = 0;
1459         my $inp;
1460         my $max_inp;
1461         while (! $ok) {
1462             $max_inp = show_menu("select");
1463             $inp = getch();
1464             if ($inp =~ m/[qQ]/ || $inp =~ m/[Xx]/ ) {
1465                 die "Exiting\n";
1466             }
1467             if (ord($inp) == $KEY_ENTER) {
1468                 next;
1469             }
1470             if ($inp =~ m/[0123456789abcdefABCDEF]/)
1471             {
1472                 $inp = hex($inp);
1473             }
1474             if ($inp < 1 || $inp > $max_inp)
1475             {
1476                 print "Invalid choice...Try again\n";
1477                 next;
1478             }
1479             $ok = 1;
1480         }
1481         if ($inp == $BASIC) {
1482             for my $package (@basic_user_packages, @basic_kernel_packages) {
1483                 next if (not $packages_info{$package}{'available'});
1484                 my $parent = $packages_info{$package}{'parent'};
1485                 next if (not $main_packages{$parent}{'srpmpath'});
1486                 push (@selected_by_user, $package);
1487                 print CONFIG "$package=y\n";
1488                 $cnt ++;
1489             }
1490             for my $module ( @basic_kernel_modules ) {
1491                 next if (not $kernel_modules_info{$module}{'available'});
1492                 push (@selected_modules_by_user, $module);
1493                 print CONFIG "$module=y\n";
1494             }
1495         }
1496         elsif ($inp == $ALL) {
1497             for my $package ( @all_packages, @hidden_packages ) {
1498                 next if (not $packages_info{$package}{'available'});
1499                 my $parent = $packages_info{$package}{'parent'};
1500                 next if (not $main_packages{$parent}{'srpmpath'});
1501                 push (@selected_by_user, $package);
1502                 print CONFIG "$package=y\n";
1503                 $cnt ++;
1504             }
1505             for my $module ( @kernel_modules ) {
1506                 next if (not $kernel_modules_info{$module}{'available'});
1507                 push (@selected_modules_by_user, $module);
1508                 print CONFIG "$module=y\n";
1509             }
1510         }
1511         elsif ($inp == $CUSTOM) {
1512             my $ans;
1513             for my $package ( @all_packages ) {
1514                 next if (not $packages_info{$package}{'available'});
1515                 my $parent = $packages_info{$package}{'parent'};
1516                 next if (not $main_packages{$parent}{'srpmpath'});
1517                 print "Install $package? [y/N]:";
1518                 $ans = getch();
1519                 if ( $ans eq 'Y' or $ans eq 'y' ) {
1520                     print CONFIG "$package=y\n";
1521                     push (@selected_by_user, $package);
1522                     $cnt ++;
1523
1524                     if ($package eq "compat-rdma") {
1525                         # Select kernel modules to be installed
1526                         for my $module ( @kernel_modules, @tech_preview ) {
1527                             next if (not $kernel_modules_info{$module}{'available'});
1528                             print "Install $module module? [y/N]:";
1529                             $ans = getch();
1530                             if ( $ans eq 'Y' or $ans eq 'y' ) {
1531                                 push (@selected_modules_by_user, $module);
1532                                 print CONFIG "$module=y\n";
1533                             }
1534                         }
1535                     }
1536                 }
1537                 else {
1538                     print CONFIG "$package=n\n";
1539                 }
1540             }
1541             if ($arch eq "x86_64" or $arch eq "ppc64") {
1542                 if (supported32bit()) {
1543                     print "Install 32-bit packages? [y/N]:";
1544                     $ans = getch();
1545                     if ( $ans eq 'Y' or $ans eq 'y' ) {
1546                         $build32 = 1;
1547                         print CONFIG "build32=1\n";
1548                     }
1549                     else {
1550                         $build32 = 0;
1551                         print CONFIG "build32=0\n";
1552                     }
1553                 }
1554                 else {
1555                     $build32 = 0;
1556                     print CONFIG "build32=0\n";
1557                 }
1558             }
1559             print "Please enter the $PACKAGE installation directory: [$prefix]:";
1560             $ans = <STDIN>;
1561             chomp $ans;
1562             if ($ans) {
1563                 $prefix = $ans;
1564                 $prefix =~ s/\/$//;
1565             }
1566             print CONFIG "prefix=$prefix\n";
1567         }
1568         flock CONFIG, $UNLOCK;
1569     }
1570     else {
1571         if ($config_given) {
1572             open(CONFIG, "$config") || die "Can't open $config: $!";
1573             while(<CONFIG>) {
1574                 next if (m@^\s+$|^#.*@);
1575                 my ($package,$selected) = (split '=', $_);
1576                 chomp $package;
1577                 chomp $selected;
1578
1579                 print "$package=$selected\n" if ($verbose3);
1580
1581                 if ($package eq "build32") {
1582                     if (supported32bit()) {
1583                         $build32 = 1 if ($selected);
1584                     }
1585                     next;
1586                 }
1587
1588                 if ($package eq "prefix") {
1589                     $prefix = $selected;
1590                     $prefix =~ s/\/$//;
1591                     next;
1592                 }
1593
1594                 if ($package eq "bonding_force_all_os") {
1595                     if ($selected =~ m/[Yy]|[Yy][Ee][Ss]/) {
1596                         $bonding_force_all_os = 1;
1597                     }
1598                     next;
1599                 }
1600
1601                 if (substr($package,0,length("vendor_config")) eq "vendor_config") {
1602                     next;
1603                 }
1604
1605                if ($package eq "vendor_pre_install") {
1606                         if ( -f $selected ) {
1607                         $vendor_pre_install = dirname($selected) . '/' . basename($selected);
1608                     } else {
1609                         print RED "\nVendor script $selected is not found", RESET "\n" if (not $quiet);
1610                         exit 1
1611                     }
1612                     next;
1613                 }
1614
1615                 if ($package eq "vendor_post_install") {
1616                             if ( -f $selected ) {
1617                                     $vendor_post_install = dirname($selected) . '/' . basename($selected);
1618                             } else {
1619                                     print RED "\nVendor script $selected is not found", RESET "\n" if (not $quiet);
1620                                     exit 1
1621                             }
1622                     next;
1623                 }
1624
1625                 if ($package eq "vendor_pre_uninstall") {
1626                     if ( -f $selected ) {
1627                         $vendor_pre_uninstall = dirname($selected) . '/' . basename($selected);
1628                     } else {
1629                         print RED "\nVendor script $selected is not found", RESET "\n" if (not $quiet);
1630                         exit 1
1631                     }
1632                     next;
1633                 }
1634
1635                 if ($package eq "vendor_post_uninstall") {
1636                     if ( -f $selected ) {
1637                         $vendor_post_uninstall = dirname($selected) . '/' . basename($selected);
1638                     } else {
1639                         print RED "\nVendor script $selected is not found", RESET "\n" if (not $quiet);
1640                         exit 1
1641                     }
1642                     next;
1643                 }
1644
1645                 if ($package eq "kernel_configure_options" or $package eq "OFA_KERNEL_PARAMS") {
1646                     $kernel_configure_options = $selected;
1647                     next;
1648                 }
1649
1650                 if ($package eq "user_configure_options") {
1651                     $user_configure_options = $selected;
1652                     next;
1653                 }
1654
1655                 if ($package =~ m/configure_options/) {
1656                     my $pack_name = (split '_', $_)[0];
1657                     $packages_info{$pack_name}{'configure_options'} = $selected;
1658                     next;
1659                 }
1660
1661                 if (not $packages_info{$package}{'parent'}) {
1662                     my $modules = "@kernel_modules @tech_preview";
1663                     chomp $modules;
1664                     $modules =~ s/ /|/g;
1665                     if ($package =~ m/$modules/) {
1666                         if ( $selected eq 'y' ) {
1667                             if (not $kernel_modules_info{$package}{'available'}) {
1668                                 print "$package is not available on this platform\n" if (not $quiet);
1669                             }
1670                             else {
1671                                 push (@selected_modules_by_user, $package);
1672                             }
1673                             next;
1674                         }
1675                     }
1676                     else {
1677                        print "Unsupported package: $package\n" if (not $quiet);
1678                        next;
1679                     }
1680                 }
1681
1682                 if (not $packages_info{$package}{'available'} and $selected eq 'y') {
1683                     print "$package is not available on this platform\n" if (not $quiet);
1684                     next;
1685                 }
1686
1687                 if ( $selected eq 'y' ) {
1688                     my $parent = $packages_info{$package}{'parent'};
1689                     if (not $main_packages{$parent}{'srpmpath'}) {
1690                         print "Unsupported package: $package\n" if (not $quiet);
1691                         next;
1692                     }
1693                     push (@selected_by_user, $package);
1694                     print "select_package: selected $package\n" if ($verbose2);
1695                     $cnt ++;
1696                 }
1697             }
1698         }
1699         else {
1700             open(CONFIG, ">$config") || die "Can't open $config: $!";
1701             flock CONFIG, $LOCK_EXCLUSIVE;
1702             if ($install_option eq 'all') {
1703                 for my $package ( @all_packages ) {
1704                     next if (not $packages_info{$package}{'available'});
1705                     my $parent = $packages_info{$package}{'parent'};
1706                     next if (not $main_packages{$parent}{'srpmpath'});
1707                     push (@selected_by_user, $package);
1708                     print CONFIG "$package=y\n";
1709                     $cnt ++;
1710                 }
1711                 for my $module ( @kernel_modules ) {
1712                     next if (not $kernel_modules_info{$module}{'available'});
1713                     push (@selected_modules_by_user, $module);
1714                     print CONFIG "$module=y\n";
1715                 }
1716             }
1717             elsif ($install_option eq 'basic') {
1718                 for my $package (@basic_user_packages, @basic_kernel_packages) {
1719                     next if (not $packages_info{$package}{'available'});
1720                     my $parent = $packages_info{$package}{'parent'};
1721                     next if (not $main_packages{$parent}{'srpmpath'});
1722                     push (@selected_by_user, $package);
1723                     print CONFIG "$package=y\n";
1724                     $cnt ++;
1725                 }
1726                 for my $module ( @basic_kernel_modules ) {
1727                     next if (not $kernel_modules_info{$module}{'available'});
1728                     push (@selected_modules_by_user, $module);
1729                     print CONFIG "$module=y\n";
1730                 }
1731             }
1732             else {
1733                 print RED "\nUnsupported installation option: $install_option", RESET "\n" if (not $quiet);
1734                 exit 1;
1735             }
1736         }
1737
1738         flock CONFIG, $UNLOCK;
1739     }
1740     close(CONFIG);
1741
1742
1743     return $cnt;
1744 }
1745
1746 sub module_in_rpm
1747 {
1748     my $module = shift @_;
1749     my $ret = 1;
1750
1751     my $name = 'compat-rdma';
1752     my $version = $main_packages{$packages_info{$name}{'parent'}}{'version'};
1753     my $release = $main_packages{$name}{'release'} . '.' . $kernel_rel;
1754
1755     my $package = "$RPMS/$name-$version-$release.$target_cpu.rpm";
1756
1757     if (not -f $package) {
1758         print "is_module_in_rpm: $package not found\n";
1759         return 1;
1760     }
1761
1762     if ($module eq "nfsrdma") {
1763         $module = "rpcrdma";
1764     }
1765
1766     open(LIST, "rpm -qlp $package |") or die "Can't run 'rpm -qlp $package': $!\n";
1767     while (<LIST>) {
1768         if (/$module[a-z_]*.ko/) {
1769             print "is_module_in_rpm: $module $_\n" if ($verbose3);
1770             $ret = 0;
1771             last;
1772         }
1773     }
1774     close LIST;
1775
1776     if ($ret) {
1777         print "$module not in $package\n" if ($verbose2);
1778     }
1779
1780     return $ret;
1781 }
1782
1783 sub mark_for_uninstall
1784 {
1785     my $package = shift @_;
1786     if (not $selected_for_uninstall{$package}) {
1787         push (@dependant_packages_to_uninstall, "$package");
1788         $selected_for_uninstall{$package} = 1;
1789     }
1790 }
1791
1792 sub get_requires
1793 {
1794     my $package = shift @_;
1795
1796     # Strip RPM version
1797     my $pname = `rpm -q --queryformat "[%{NAME}]" $package`;
1798     chomp $pname;
1799
1800     my @what_requires = `/bin/rpm -q --whatrequires $pname 2> /dev/null | grep -v "no package requires" 2> /dev/null`;
1801
1802     for my $pack_req (@what_requires) {
1803         chomp $pack_req;
1804         print "get_requires: $pname is required by $pack_req\n" if ($verbose2);
1805         get_requires($pack_req);
1806         mark_for_uninstall($pack_req);
1807     }
1808 }
1809
1810 sub select_dependent
1811 {
1812     my $package = shift @_;
1813
1814     if ($package eq "infinipath-psm" and $with_xeon_phi) {
1815         $packages_info{$package}{'ofa_req_build'} = ["libibscif-devel"];
1816         $packages_info{$package}{'ofa_req_inst'} = ["libibscif"];
1817     }
1818
1819
1820     if ( (not $packages_info{$package}{'rpm_exist'}) or
1821          ($build32 and not $packages_info{$package}{'rpm_exist32'}) ) {
1822         for my $req ( @{ $packages_info{$package}{'ofa_req_build'} } ) {
1823             next if not $req;
1824             if ($packages_info{$req}{'available'} and not $packages_info{$req}{'selected'}) {
1825                 print "resolve_dependencies: $package requires $req for rpmbuild\n" if ($verbose2);
1826                 select_dependent($req);
1827             }
1828         }
1829     }
1830
1831     for my $req ( @{ $packages_info{$package}{'ofa_req_inst'} } ) {
1832         next if not $req;
1833         if ($packages_info{$req}{'available'} and not $packages_info{$req}{'selected'}) {
1834             print "resolve_dependencies: $package requires $req for rpm install\n" if ($verbose2);
1835             select_dependent($req);
1836         }
1837     }
1838
1839     if (not $packages_info{$package}{'selected'}) {
1840         return if (not $packages_info{$package}{'available'});
1841         # Assume that the requirement is not strict.
1842         my $parent = $packages_info{$package}{'parent'};
1843         return if (not $main_packages{$parent}{'srpmpath'});
1844         $packages_info{$package}{'selected'} = 1;
1845         push (@selected_packages, $package);
1846         print "select_dependent: Selected package $package\n" if ($verbose2);
1847     }
1848
1849 }
1850
1851 sub select_dependent_module
1852 {
1853     my $module = shift @_;
1854
1855     for my $req ( @{ $kernel_modules_info{$module}{'requires'} } ) {
1856         print "select_dependent_module: $module requires $req for rpmbuild\n" if ($verbose2);
1857         if (not $kernel_modules_info{$req}{'selected'}) {
1858             select_dependent_module($req);
1859         }
1860     }
1861     if (not $kernel_modules_info{$module}{'selected'}) {
1862         $kernel_modules_info{$module}{'selected'} = 1;
1863         push (@selected_kernel_modules, $module);
1864         print "select_dependent_module: Selected module $module\n" if ($verbose2);
1865     }
1866 }
1867
1868 sub resolve_dependencies
1869 {
1870     for my $package ( @selected_by_user ) {
1871             # Get the list of dependencies
1872             select_dependent($package);
1873     }
1874
1875     for my $module ( @selected_modules_by_user ) {
1876         select_dependent_module($module);
1877     }
1878
1879     if ($packages_info{'compat-rdma'}{'rpm_exist'}) {
1880         for my $module (@selected_kernel_modules) {
1881             if ($module eq "firmware") {
1882                 if (not $packages_info{'compat-rdma-firmware'}{'rpm_exist'}) {
1883                     $packages_info{'compat-rdma'}{'rpm_exist'} = 0;
1884                     last;
1885                 } else {
1886                     next;
1887                 }
1888             }
1889             if (module_in_rpm($module)) {
1890                 $packages_info{'compat-rdma'}{'rpm_exist'} = 0;
1891                 last;
1892             }
1893         }
1894     }
1895 }
1896
1897 sub check_linux_dependencies
1898 {
1899     my $err = 0;
1900     my $p1 = 0;
1901     my $gcc_32bit_printed = 0;
1902     if (! $check_linux_deps) {
1903         return 0;
1904     }
1905     my $dist_req_build = ($DISTRO =~ m/UBUNTU/)?'ubuntu_dist_req_build':'dist_req_build';
1906     for my $package ( @selected_packages ) {
1907         # Check rpmbuild requirements
1908         if ($package =~ /compat-rdma/) {
1909             if (not $packages_info{$package}{'rpm_exist'}) {
1910                 # Check that required kernel is supported
1911                 if ($kernel !~ /2\.6\.3[0-9]|2\.6\.40|3\.[0-9]|3\.1[0-9]|4\.[0-8]/) {
1912                     print RED "Kernel $kernel is not supported.", RESET "\n";
1913                     print BLUE "For the list of Supported Platforms and Operating Systems see", RESET "\n";
1914                     print BLUE "$CWD/docs/OFED_release_notes.txt", RESET "\n";
1915                     exit 1;
1916                 }
1917                 # kernel sources required
1918                 if ( not -d "$linux_obj/scripts" ) {
1919                     print RED "$linux_obj/scripts is required to build $package RPM.", RESET "\n";
1920                     print RED "Please install the corresponding kernel-source or kernel-devel RPM.", RESET "\n";
1921                     $err++;
1922                 }
1923             }
1924         }
1925
1926         if($DISTRO =~/UBUNTU/){
1927             if(not is_installed_deb("rpm")){
1928                 print RED "rpm is required to build OFED", RESET "\n";
1929             }
1930         }
1931
1932         if ($DISTRO =~ m/RHEL|FC/) {
1933             if (not is_installed("rpm-build")) {
1934                 print RED "rpm-build is required to build OFED", RESET "\n";
1935                 $err++;
1936             }
1937         }
1938
1939         if ($package =~ /debuginfo/ and ($DISTRO =~ m/RHEL|FC/)) {
1940             if (not $packages_info{$package}{'rpm_exist'}) {
1941                 if (not is_installed("redhat-rpm-config")) {
1942                     print RED "redhat-rpm-config rpm is required to build $package", RESET "\n";
1943                     $err++;
1944                 }
1945             }
1946         }
1947
1948         if (not $packages_info{$package}{'rpm_exist'}) {
1949             for my $req ( @{ $packages_info{$package}{$dist_req_build} } ) {
1950                 my ($req_name, $req_version) = (split ('__',$req));
1951                 next if not $req_name;
1952                 print BLUE "check_linux_dependencies: $req_name  is required to build $package", RESET "\n" if ($verbose3);
1953                 my $is_installed_flag = ($DISTRO =~ m/UBUNTU/)?(is_installed_deb($req_name)):(is_installed($req_name));
1954                 if (not $is_installed_flag) {
1955                     print RED "$req_name rpm is required to build $package", RESET "\n";
1956                     $err++;
1957                 }
1958                 if ($req_version) {
1959                     my $inst_version = get_rpm_ver_inst($req_name);
1960                     print "check_linux_dependencies: $req_name installed version $inst_version, required at least $req_version\n" if ($verbose3);
1961                     if ($inst_version lt $req_version) {
1962                         print RED "$req_name-$req_version rpm is required to build $package", RESET "\n";
1963                         $err++;
1964                     }
1965                 }
1966             }
1967                 if ($package eq "compat-rdma") {
1968                     for my $module ( @selected_kernel_modules ) {
1969                         for my $req ( @{ $kernel_modules_info{$module}{'dist_req_build'} } ) {
1970                             if ((substr($req, 0, 1) eq "/" and not -f $req) or
1971                                 (substr($req, 0, 1) ne "/" and not is_installed($req))) {
1972                                 $err++;
1973                                 print RED "$req is required to build $module", RESET "\n";
1974                             }
1975                         }
1976                     }
1977                 }
1978                 if ($build32) {
1979                     if (not -f "/usr/lib/crt1.o") {
1980                         if (! $p1) {
1981                             print RED "glibc-devel 32bit is required to build 32-bit libraries.", RESET "\n";
1982                             $p1 = 1;
1983                             $err++;
1984                         }
1985                     }
1986                     if ($DISTRO =~ m/SLES11/) {
1987                         if (not is_installed("gcc-32bit")) {
1988                             if (not $gcc_32bit_printed) {
1989                                 print RED "gcc-32bit is required to build 32-bit libraries.", RESET "\n";
1990                                 $gcc_32bit_printed++;
1991                                 $err++;
1992                             }
1993                         }
1994                     }
1995                     if ($arch eq "ppc64") {
1996                         my @libstdc32 = </usr/lib/libstdc++.so.*>;
1997                         if ($package eq "mstflint") {
1998                             if (not scalar(@libstdc32)) {
1999                                 print RED "$libstdc 32bit is required to build mstflint.", RESET "\n";
2000                                 $err++;
2001                             }
2002                         }
2003                     }
2004                 }
2005                 if ($package eq "rnfs-utils") {
2006                     if (not is_installed("krb5-devel")) {
2007                         print RED "krb5-devel is required to build rnfs-utils.", RESET "\n";
2008                         $err++;
2009                     }
2010                     if ($DISTRO =~ m/RHEL|FC/) {
2011                         if (not is_installed("krb5-libs")) {
2012                             print RED "krb5-libs is required to build rnfs-utils.", RESET "\n";
2013                             $err++;
2014                         }
2015                         if (not is_installed("libevent-devel")) {
2016                             print RED "libevent-devel is required to build rnfs-utils.", RESET "\n";
2017                             $err++;
2018                         }
2019                         if (not is_installed("nfs-utils-lib-devel")) {
2020                             print RED "nfs-utils-lib-devel is required to build rnfs-utils.", RESET "\n";
2021                             $err++;
2022                         }
2023                         if (not is_installed("openldap-devel")) {
2024                             print RED "openldap-devel is required to build rnfs-utils.", RESET "\n";
2025                             $err++;
2026                         }
2027                     } else {
2028                     if ($DISTRO =~ m/SLES11/) {
2029                         if (not is_installed("libevent-devel")) {
2030                             print RED "libevent-devel is required to build rnfs-utils.", RESET "\n";
2031                             $err++;
2032                         }
2033                         if (not is_installed("nfsidmap-devel")) {
2034                             print RED "nfsidmap-devel is required to build rnfs-utils.", RESET "\n";
2035                             $err++;
2036                         }
2037                         if (not is_installed("libopenssl-devel")) {
2038                             print RED "libopenssl-devel is required to build rnfs-utils.", RESET "\n";
2039                             $err++;
2040                         }
2041                     } elsif ($DISTRO eq "SLES10") {
2042                         if (not is_installed("libevent")) {
2043                             print RED "libevent is required to build rnfs-utils.", RESET "\n";
2044                             $err++;
2045                         }
2046                         if (not is_installed("nfsidmap")) {
2047                             print RED "nfsidmap is required to build rnfs-utils.", RESET "\n";
2048                             $err++;
2049                         }
2050                     }
2051                     if (not is_installed("krb5")) {
2052                         print RED "krb5 is required to build rnfs-utils.", RESET "\n";
2053                         $err++;
2054                     }
2055                     if (not is_installed("openldap2-devel")) {
2056                         print RED "openldap2-devel is required to build rnfs-utils.", RESET "\n";
2057                         $err++;
2058                     }
2059                     if (not is_installed("cyrus-sasl-devel")) {
2060                         print RED "cyrus-sasl-devel is required to build rnfs-utils.", RESET "\n";
2061                         $err++;
2062                     }
2063                 }
2064                         my $blkid_so = ($arch =~ m/x86_64/) ? "/usr/lib64/libblkid.so" : "/usr/lib/libblkid.so";
2065                         my $blkid_pkg = ($DISTRO =~ m/SLES10|RHEL5/) ? "e2fsprogs-devel" : "libblkid-devel";
2066                         $blkid_pkg .= ($arch =~ m/powerpc|ppc64/) ? "-32bit" : "";
2067
2068                         if (not -e $blkid_so) {
2069                             print RED "$blkid_pkg is required to build rnfs-utils.", RESET "\n";
2070                             $err++;
2071                         }
2072                 }
2073         }
2074         my $dist_req_inst = ($DISTRO =~ m/UBUNTU/)?'ubuntu_dist_req_inst':'dist_req_inst';
2075         # Check installation requirements
2076         for my $req ( @{ $packages_info{$package}{$dist_req_inst} } ) {
2077             my ($req_name, $req_version) = (split ('__',$req));
2078             next if not $req_name;
2079             my $is_installed_flag = ($DISTRO =~ m/UBUNTU/)?(is_installed_deb($req_name)):(is_installed($req_name));
2080             if (not $is_installed_flag) {
2081                 print RED "$req_name rpm is required to install $package", RESET "\n";
2082                 $err++;
2083             }
2084             if ($req_version) {
2085                 my $inst_version = get_rpm_ver_inst($req_name);
2086                 print "check_linux_dependencies: $req_name installed version $inst_version, required $req_version\n" if ($verbose3);
2087                 if ($inst_version lt $req_version) {
2088                     print RED "$req_name-$req_version rpm is required to install $package", RESET "\n";
2089                     $err++;
2090                 }
2091             }
2092         }
2093         if ($build32) {
2094             if (not -f "/usr/lib/crt1.o") {
2095                 if (! $p1) {
2096                     print RED "glibc-devel 32bit is required to install 32-bit libraries.", RESET "\n";
2097                     $p1 = 1;
2098                     $err++;
2099                 }
2100             }
2101             if ($arch eq "ppc64") {
2102                 my @libstdc32 = </usr/lib/libstdc++.so.*>;
2103                 if ($package eq "mstflint") {
2104                     if (not scalar(@libstdc32)) {
2105                         print RED "$libstdc 32bit is required to install mstflint.", RESET "\n";
2106                         $err++;
2107                     }
2108                 }
2109             }
2110         }
2111     }
2112     if ($err) {
2113         exit 1;
2114     }
2115 }
2116
2117 # Print the list of selected packages
2118 sub print_selected
2119 {
2120     print GREEN "\nBelow is the list of ${PACKAGE} packages that you have chosen
2121     \r(some may have been added by the installer due to package dependencies):\n", RESET "\n";
2122     for my $package ( @selected_packages ) {
2123         print "$package\n";
2124     }
2125     if ($build32) {
2126         print "32-bit binaries/libraries will be created\n";
2127     }
2128     print "\n";
2129 }
2130
2131 sub build_kernel_rpm
2132 {
2133     my $name = shift @_;
2134     my $cmd;
2135     my $res = 0;
2136     my $sig = 0;
2137     my $TMPRPMS;
2138
2139     $cmd = "rpmbuild --rebuild $rpmbuild_flags --define '_topdir $TOPDIR'";
2140
2141     if ($name eq 'compat-rdma') {
2142         $kernel_configure_options .= " $packages_info{'compat-rdma'}{'configure_options'}";
2143
2144         for my $module ( @selected_kernel_modules ) {
2145             if ($module eq "core") {
2146                 $kernel_configure_options .= " --with-core-mod --with-user_mad-mod --with-user_access-mod --with-addr_trans-mod";
2147             }
2148             elsif ($module eq "ipath") {
2149                 $kernel_configure_options .= " --with-ipath_inf-mod";
2150             }
2151             elsif ($module eq "qib") {
2152                 $kernel_configure_options .= " --with-qib-mod --with-rdmavt-mod";
2153             }
2154             elsif ($module eq "srpt") {
2155                 $kernel_configure_options .= " --with-srp-target-mod";
2156             }
2157             else {
2158                 $kernel_configure_options .= " --with-$module-mod";
2159             }
2160         }
2161
2162         if ($DISTRO eq "DEBIAN") {
2163                 $kernel_configure_options .= " --without-modprobe";
2164         }
2165
2166         # WA for Fedora C12
2167         if ($DISTRO =~ /FC12/) {
2168             $cmd .= " --define '__spec_install_pre %{___build_pre}'";
2169         }
2170
2171         if ($DISTRO =~ /SLES11/) {
2172             $cmd .= " --define '_suse_os_install_post %{nil}'";
2173         }
2174
2175         if ($DISTRO =~ /RHEL5/ and $target_cpu eq "i386") {
2176             $cmd .= " --define '_target_cpu i686'";
2177         }
2178
2179         if ($DISTRO =~ /RHEL6.[34]/) {
2180             $cmd .= " --define '__find_provides %{nil}'";
2181         }
2182         $cmd .= " --nodeps";
2183         $cmd .= " --define '_dist .$rpm_distro'";
2184         $cmd .= " --define 'configure_options $kernel_configure_options'";
2185         $cmd .= " --define 'KVERSION $kernel'";
2186         $cmd .= " --define 'K_SRC $linux'";
2187         $cmd .= " --define 'K_SRC_OBJ $linux_obj'";
2188         $cmd .= " --define '_release $main_packages{'compat-rdma'}{'release'}.$kernel_rel'";
2189         $cmd .= " --define 'network_dir $network_dir'";
2190     }
2191     elsif ($name eq 'ib-bonding') {
2192         $cmd .= " --define 'KVERSION $kernel'";
2193         $cmd .= " --define '_release $kernel_rel'";
2194         $cmd .= " --define 'force_all_os $bonding_force_all_os'";
2195     }
2196
2197     $cmd .= " --define '_prefix $prefix'";
2198     $cmd .= " --define '__arch_install_post %{nil}'";
2199     $cmd .= " $main_packages{$name}{'srpmpath'}";
2200
2201     print "Running $cmd\n" if ($verbose);
2202     system("echo $cmd > $ofedlogs/$name.rpmbuild.log 2>&1");
2203     system("$cmd >> $ofedlogs/$name.rpmbuild.log 2>&1");
2204     $res = $? >> 8;
2205     $sig = $? & 127;
2206     if ($sig or $res) {
2207         print RED "Failed to build $name RPM", RESET "\n";
2208         print RED "See $ofedlogs/$name.rpmbuild.log", RESET "\n";
2209         exit 1;
2210     }
2211
2212     $TMPRPMS = "$TOPDIR/RPMS/$target_cpu";
2213     chomp $TMPRPMS;
2214
2215     print "TMPRPMS $TMPRPMS\n" if ($verbose2);
2216
2217     for my $myrpm ( <$TMPRPMS/*.rpm> ) {
2218         print "Created $myrpm\n" if ($verbose2);
2219         system("/bin/rpm -qlp $myrpm | grep lib.modules | awk -F '/' '{print\$4}' | sort -u >> $RPMS/.supported_kernels");
2220         my ($myrpm_name, $myrpm_arch) = (split ' ', get_rpm_name_arch($myrpm));
2221         move($myrpm, $RPMS);
2222         $packages_info{$myrpm_name}{'rpm_exist'} = 1;
2223     }
2224 }
2225
2226 sub build_rpm_32
2227 {
2228     my $name = shift @_;
2229     my $parent = $packages_info{$name}{'parent'};
2230     my $cmd;
2231     my $res = 0;
2232     my $sig = 0;
2233     my $TMPRPMS;
2234
2235     my $pref_env32;
2236     my $ldflags32;
2237     my $cflags32;
2238     my $cppflags32;
2239     my $cxxflags32;
2240     my $fflags32;
2241     my $ldlibs32;
2242
2243     $ldflags32    .= " -m32 -g -O2 -L/usr/lib";
2244     $cflags32     .= " -m32 -g -O2";
2245     $cppflags32   .= " -m32 -g -O2";
2246     $cxxflags32   .= " -m32 -g -O2";
2247     $fflags32     .= " -m32 -g -O2";
2248     $ldlibs32     .= " -m32 -g -O2 -L/usr/lib";
2249
2250     if ($prefix ne $default_prefix) {
2251         $ldflags32 .= " -L$prefix/lib";
2252         $cflags32 .= " -I$prefix/include";
2253         $cppflags32 .= " -I$prefix/include";
2254     }
2255
2256     $pref_env32 .= " LDFLAGS='$ldflags32'";
2257     $pref_env32 .= " CFLAGS='$cflags32'";
2258     $pref_env32 .= " CPPFLAGS='$cppflags32'";
2259     $pref_env32 .= " CXXFLAGS='$cxxflags32'";
2260     $pref_env32 .= " FFLAGS='$fflags32'";
2261     $pref_env32 .= " LDLIBS='$ldlibs32'";
2262
2263     $cmd = "$pref_env32 rpmbuild --rebuild $rpmbuild_flags --define '_topdir $TOPDIR'";
2264     $cmd .= " --target $target_cpu32";
2265     $cmd .= " --define '_prefix $prefix'";
2266     $cmd .= " --define 'dist %{nil}'";
2267     $cmd .= " --define '_exec_prefix $prefix'";
2268     $cmd .= " --define '_sysconfdir $sysconfdir'";
2269     $cmd .= " --define '_usr $prefix'";
2270     $cmd .= " --define '_lib lib'";
2271     $cmd .= " --define '__arch_install_post %{nil}'";
2272
2273     if ($parent =~ m/dapl/) {
2274         my $def_doc_dir = `rpm --eval '%{_defaultdocdir}'`;
2275         chomp $def_doc_dir;
2276         $cmd .= " --define '_prefix $prefix'";
2277         $cmd .= " --define '_exec_prefix $prefix'";
2278         $cmd .= " --define '_sysconfdir $sysconfdir'";
2279         $cmd .= " --define '_defaultdocdir $def_doc_dir/$main_packages{$parent}{'name'}-$main_packages{$parent}{'version'}'";
2280         $cmd .= " --define '_usr $prefix'";
2281     }
2282
2283     if ($DISTRO =~ m/SLES/) {
2284         $cmd .= " --define '_suse_os_install_post %{nil}'";
2285     }
2286
2287     $cmd .= " $main_packages{$parent}{'srpmpath'}";
2288
2289     print "Running $cmd\n" if ($verbose);
2290     open(LOG, "+>$ofedlogs/$parent.rpmbuild32bit.log");
2291     print LOG "Running $cmd\n";
2292     close LOG;
2293     system("$cmd >> $ofedlogs/$parent.rpmbuild32bit.log 2>&1");
2294     $res = $? >> 8;
2295     $sig = $? & 127;
2296     if ($sig or $res) {
2297         print RED "Failed to build $parent RPM", RESET "\n";
2298         print RED "See $ofedlogs/$parent.rpmbuild32bit.log", RESET "\n";
2299         exit 1;
2300     }
2301
2302     $TMPRPMS = "$TOPDIR/RPMS/$target_cpu32";
2303     chomp $TMPRPMS;
2304     for my $myrpm ( <$TMPRPMS/*.rpm> ) {
2305         print "Created $myrpm\n" if ($verbose2);
2306         my ($myrpm_name, $myrpm_arch) = (split ' ', get_rpm_name_arch($myrpm));
2307         move($myrpm, $RPMS);
2308         $packages_info{$myrpm_name}{'rpm_exist32'} = 1;
2309     }
2310 }
2311
2312 # Build RPM from source RPM
2313 sub build_rpm
2314 {
2315     my $name = shift @_;
2316     my $cmd;
2317     my $res = 0;
2318     my $sig = 0;
2319     my $TMPRPMS;
2320
2321     my $ldflags;
2322     my $cflags;
2323     my $cppflags;
2324     my $cxxflags;
2325     my $fflags;
2326     my $ldlibs;
2327     my $parent = $packages_info{$name}{'parent'};
2328     my $srpmdir;
2329     my $srpmpath_for_distro;
2330
2331     print "Build $name RPM\n" if ($verbose);
2332
2333     my $pref_env = '';
2334
2335     if (not $packages_info{$name}{'rpm_exist'}) {
2336
2337         if ($arch eq "ppc64") {
2338             if ($DISTRO =~ m/SLES/ and $dist_rpm_rel gt 15.2) {
2339                 # SLES 10 SP1
2340                 if ($parent eq "ibutils") {
2341                     $packages_info{'ibutils'}{'configure_options'} .= " LDFLAGS=-L/usr/lib/gcc/powerpc64-suse-linux/4.1.2/64";
2342                 }
2343                 if ($parent eq "rds-tools" or $parent eq "rnfs-utils") {
2344                     $ldflags    = " -g -O2";
2345                     $cflags     = " -g -O2";
2346                     $cppflags   = " -g -O2";
2347                     $cxxflags   = " -g -O2";
2348                     $fflags     = " -g -O2";
2349                     $ldlibs     = " -g -O2";
2350                 }
2351             }
2352             else {
2353                 if ($parent =~ /rds-tools|rnfs-utils/) {
2354                     # Override compilation flags on RHEL 4.0 and 5.0 PPC64
2355                     $ldflags    = " -g -O2";
2356                     $cflags     = " -g -O2";
2357                     $cppflags   = " -g -O2";
2358                     $cxxflags   = " -g -O2";
2359                     $fflags     = " -g -O2";
2360                     $ldlibs     = " -g -O2";
2361                 }
2362                 elsif ($parent !~ /ibutils/) {
2363                     $ldflags    .= " $optflags -m64 -g -O2 -L/usr/lib64";
2364                     $cflags     .= " $optflags -m64 -g -O2";
2365                     $cppflags   .= " $optflags -m64 -g -O2";
2366                     $cxxflags   .= " $optflags -m64 -g -O2";
2367                     $fflags     .= " $optflags -m64 -g -O2";
2368                     $ldlibs     .= " $optflags -m64 -g -O2 -L/usr/lib64";
2369                 }
2370             }
2371         }
2372
2373         if ($ldflags) {
2374             $pref_env   .= " LDFLAGS='$ldflags'";
2375         }
2376         if ($cflags) {
2377             $pref_env   .= " CFLAGS='$cflags'";
2378         }
2379         if ($cppflags) {
2380             $pref_env   .= " CPPFLAGS='$cppflags'";
2381         }
2382         if ($cxxflags) {
2383             $pref_env   .= " CXXFLAGS='$cxxflags'";
2384         }
2385         if ($fflags) {
2386             $pref_env   .= " FFLAGS='$fflags'";
2387         }
2388         if ($ldlibs) {
2389             $pref_env   .= " LDLIBS='$ldlibs'";
2390         }
2391
2392         $cmd = "$pref_env rpmbuild --rebuild $rpmbuild_flags --define '_topdir $TOPDIR'";
2393         $cmd .= " --define 'dist %{nil}'";
2394         $cmd .= " --target $target_cpu";
2395         if ($parent eq "rdma-core" and $DISTRO =~ m/SLES/) {
2396             my $make_jobs = `rpm --eval %make_jobs`;
2397             chomp $make_jobs;
2398             if ($make_jobs eq '%make_jobs') {
2399                 $cmd .= " --define 'make_jobs %ninja_build'";
2400             }
2401         }
2402
2403         if ($parent =~ m/libibmad|opensm|perftest|ibutils|infiniband-diags|qperf/) {
2404             $cmd .= " --nodeps";
2405         }
2406
2407         # Prefix should be defined per package
2408         if ($parent eq "ibutils") {
2409             $packages_info{'ibutils'}{'configure_options'} .= " --with-osm=$prefix";
2410             if ($DISTRO =~ m/SLES12/) {
2411                 my $tklib = `/bin/ls -1d /usr/lib*/tcl/tk8.6 2> /dev/null | head -1`;
2412                 chomp $tklib;
2413                 $packages_info{'ibutils'}{'configure_options'} .= " --with-tk-lib=$tklib" if ($tklib);
2414             }
2415             $cmd .= " --define '_prefix $prefix'";
2416             $cmd .= " --define '_exec_prefix $prefix'";
2417             $cmd .= " --define '_sysconfdir $sysconfdir'";
2418             $cmd .= " --define '_usr $prefix'";
2419             $cmd .= " --define 'build_ibmgtsim 1'";
2420             $cmd .= " --define '__arch_install_post %{nil}'";
2421         }
2422         elsif ($parent =~ m/dapl/) {
2423             my $def_doc_dir = `rpm --eval '%{_defaultdocdir}'`;
2424             chomp $def_doc_dir;
2425             $cmd .= " --define '_prefix $prefix'";
2426             $cmd .= " --define '_exec_prefix $prefix'";
2427             $cmd .= " --define '_sysconfdir $sysconfdir'";
2428             $cmd .= " --define '_defaultdocdir $def_doc_dir/$main_packages{$parent}{'name'}-$main_packages{$parent}{'version'}'";
2429             $cmd .= " --define '_usr $prefix'";
2430         }
2431         else {
2432             $cmd .= " --define '_prefix $prefix'";
2433             $cmd .= " --define '_exec_prefix $prefix'";
2434             $cmd .= " --define '_sysconfdir $sysconfdir'";
2435             $cmd .= " --define '_usr $prefix'";
2436         }
2437
2438         if ($packages_info{$parent}{'configure_options'} or $user_configure_options) {
2439             $cmd .= " --define 'configure_options $packages_info{$parent}{'configure_options'} $user_configure_options'";
2440         }
2441
2442         if ($parent eq "mstflint") {
2443             $cmd .= " --define 'ibmadlib %{nil}'";
2444             $cmd = "config_flags='--disable-inband' $cmd";
2445         }
2446
2447         $cmd .= " $main_packages{$parent}{'srpmpath'}";
2448
2449         print "Running $cmd\n" if ($verbose);
2450         open(LOG, "+>$ofedlogs/$parent.rpmbuild.log");
2451         print LOG "Running $cmd\n";
2452         close LOG;
2453         system("$cmd >> $ofedlogs/$parent.rpmbuild.log 2>&1");
2454         $res = $? >> 8;
2455         $sig = $? & 127;
2456         if ($sig or $res) {
2457             print RED "Failed to build $parent RPM", RESET "\n";
2458             print RED "See $ofedlogs/$parent.rpmbuild.log", RESET "\n";
2459             exit 1;
2460         }
2461
2462         $TMPRPMS = "$TOPDIR/RPMS/$target_cpu";
2463         chomp $TMPRPMS;
2464
2465         print "TMPRPMS $TMPRPMS\n" if ($verbose2);
2466
2467         for my $myrpm ( <$TMPRPMS/*.rpm> ) {
2468             print "Created $myrpm\n" if ($verbose2);
2469             my ($myrpm_name, $myrpm_arch) = (split ' ', get_rpm_name_arch($myrpm));
2470             move($myrpm, $RPMS);
2471             $packages_info{$myrpm_name}{'rpm_exist'} = 1;
2472         }
2473     }
2474
2475     if ($build32 and $packages_info{$name}{'install32'} and
2476         not $packages_info{$name}{'rpm_exist32'}) {
2477         build_rpm_32($name);
2478     }
2479 }
2480
2481 sub install_kernel_rpm
2482 {
2483     my $name = shift @_;
2484     my $cmd;
2485     my $res = 0;
2486     my $sig = 0;
2487
2488     my $version = $main_packages{$packages_info{$name}{'parent'}}{'version'};
2489     my $release = $main_packages{$packages_info{$name}{'parent'}}{'release'} . '.' . $kernel_rel;
2490
2491     my $package = "$RPMS/$name-$version-$release.$target_cpu.rpm";
2492
2493     if (not -f $package) {
2494         print RED "$package does not exist", RESET "\n";
2495         exit 1;
2496     }
2497
2498     $cmd = "rpm -iv $rpminstall_flags";
2499     if ($DISTRO =~ m/SLES/) {
2500         # W/A for ksym dependencies on SuSE
2501         $cmd .= " --nodeps";
2502     }
2503     $cmd .= " $package";
2504
2505     print "Running $cmd\n" if ($verbose);
2506     system("$cmd > $ofedlogs/$name.rpminstall.log 2>&1");
2507     $res = $? >> 8;
2508     $sig = $? & 127;
2509     if ($sig or $res) {
2510         print RED "Failed to install $name RPM", RESET "\n";
2511         print RED "See $ofedlogs/$name.rpminstall.log", RESET "\n";
2512         exit 1;
2513     }
2514
2515     if ($name eq "compat-rdma") {
2516         for my $module (@selected_kernel_modules) {
2517             if ($module eq "i40iw" or $module eq "cxgb4" or $module eq "nes") {
2518                 $enable_iwpmd = 1;
2519             }
2520         }
2521     }
2522 }
2523
2524 sub install_rpm_32
2525 {
2526     my $name = shift @_;
2527     my $cmd;
2528     my $res = 0;
2529     my $sig = 0;
2530     my $package;
2531
2532     my $version = $main_packages{$packages_info{$name}{'parent'}}{'version'};
2533     my $release = $main_packages{$packages_info{$name}{'parent'}}{'release'};
2534
2535     $package = "$RPMS/$name-$version-$release.$target_cpu32.rpm";
2536     if (not -f $package) {
2537         print RED "$package does not exist", RESET "\n";
2538         # exit 1;
2539     }
2540
2541     $cmd = "rpm -iv $rpminstall_flags";
2542     if ($DISTRO =~ m/SLES/) {
2543         $cmd .= " --force";
2544     }
2545
2546     if ($name eq "libmlx4") {
2547         $cmd .= " --nodeps";
2548     }
2549
2550     $cmd .= " $package";
2551
2552     print "Running $cmd\n" if ($verbose);
2553     system("$cmd > $ofedlogs/$name.rpminstall.log 2>&1");
2554     $res = $? >> 8;
2555     $sig = $? & 127;
2556     if ($sig or $res) {
2557         print RED "Failed to install $name RPM", RESET "\n";
2558         print RED "See $ofedlogs/$name.rpminstall.log", RESET "\n";
2559         exit 1;
2560     }
2561 }
2562
2563 # Install required RPM
2564 sub install_rpm
2565 {
2566     my $name = shift @_;
2567     my $tmp_name;
2568     my $cmd;
2569     my $res = 0;
2570     my $sig = 0;
2571     my $package;
2572
2573     my $version = $main_packages{$packages_info{$name}{'parent'}}{'version'};
2574     my $release = $main_packages{$packages_info{$name}{'parent'}}{'release'};
2575
2576     $package = "$RPMS/$name-$version-$release.$target_cpu.rpm";
2577
2578     if (not -f $package) {
2579         print RED "$package does not exist", RESET "\n";
2580         exit 1;
2581     }
2582
2583     if ($name eq "opensm" and $DISTRO eq "DEBIAN") {
2584         $rpminstall_flags .= " --nopost";
2585     }
2586     $cmd = "rpm -iv $rpminstall_flags";
2587
2588     if ($name =~ /rdma-core/) {
2589         $cmd .= " --nodeps";
2590     }
2591
2592     if ($name ~~ @rdma_core_packages and $DISTRO =~ m/SLES/) {
2593         $cmd .= " --nodeps";
2594     }
2595
2596     if ($name =~ m/libibmad|opensm|perftest|ibutils|infiniband-diags|qperf/) {
2597         $cmd .= " --nodeps";
2598     }
2599
2600     if ($name =~ m/infiniband-diags/) {
2601             # Force infiniband-diags installation due to conflict with rdma-core
2602         $cmd .= " --force";
2603     }
2604
2605     $cmd .= " $package";
2606
2607     print "Running $cmd\n" if ($verbose);
2608     system("$cmd > $ofedlogs/$name.rpminstall.log 2>&1");
2609     $res = $? >> 8;
2610     $sig = $? & 127;
2611     if ($sig or $res) {
2612         print RED "Failed to install $name RPM", RESET "\n";
2613         print RED "See $ofedlogs/$name.rpminstall.log", RESET "\n";
2614         exit 1;
2615     }
2616
2617     if ($build32 and $packages_info{$name}{'install32'}) {
2618         install_rpm_32($name);
2619     }
2620 }
2621
2622 sub print_package_info
2623 {
2624     print "\n\nDate:" . localtime(time) . "\n";
2625     for my $key ( keys %main_packages ) {
2626         print "$key:\n";
2627         print "======================================\n";
2628         my %pack = %{$main_packages{$key}};
2629         for my $subkey ( keys %pack ) {
2630             print $subkey . ' = ' . $pack{$subkey} . "\n";
2631         }
2632         print "\n";
2633     }
2634 }
2635
2636 sub is_installed_deb
2637 {
2638     my $res = 0;
2639     my $name = shift @_;
2640     my $result = `dpkg-query -W -f='\${version}' $name`;
2641     if (($result eq "") && ($? == 0) ){
2642         $res = 1;
2643     }
2644     return not $res;
2645 }
2646
2647 sub is_installed
2648 {
2649     my $res = 0;
2650     my $name = shift @_;
2651
2652     if ($DISTRO eq "DEBIAN") {
2653         system("dpkg-query -W -f='\${Package} \${Version}\n' $name > /dev/null 2>&1");
2654     }
2655     else {
2656         system("rpm -q $name > /dev/null 2>&1");
2657     }
2658     $res = $? >> 8;
2659
2660     return not $res;
2661 }
2662
2663 sub count_ports
2664 {
2665     my $cnt = 0;
2666     open(LSPCI, "/sbin/lspci -n|");
2667
2668     while (<LSPCI>) {
2669         if (/15b3:6282/) {
2670             $cnt += 2;  # InfiniHost III Ex mode
2671         }
2672         elsif (/15b3:5e8c|15b3:6274/) {
2673             $cnt ++;    # InfiniHost III Lx mode
2674         }
2675         elsif (/15b3:5a44|15b3:6278/) {
2676             $cnt += 2;  # InfiniHost mode
2677         }
2678         elsif (/15b3:6340|15b3:634a|15b3:6354|15b3:6732|15b3:673c|15b3:6746|15b3:6750|15b3:1003/) {
2679             $cnt += 2;  # connectx
2680         }
2681     }
2682     close (LSPCI);
2683
2684     return $cnt;
2685 }
2686
2687 sub is_valid_ipv4
2688 {
2689     my $ipaddr = shift @_;
2690
2691     if( $ipaddr =~ m/^(\d\d?\d?)\.(\d\d?\d?)\.(\d\d?\d?)\.(\d\d?\d?)/ ) {
2692         if($1 <= 255 && $2 <= 255 && $3 <= 255 && $4 <= 255) {
2693             return 0;
2694         }
2695     }
2696     return 1;
2697 }
2698
2699 sub get_net_config
2700 {
2701     my $interface = shift @_;
2702
2703     open(IFCONFIG, "/sbin/ifconfig $interface |") or die "Failed to run /sbin/ifconfig $interface: $!";
2704     while (<IFCONFIG>) {
2705         next if (not m/inet addr:/);
2706         my $line = $_;
2707         chomp $line;
2708         $ifcfg{$interface}{'IPADDR'} = (split (' ', $line))[1];
2709         $ifcfg{$interface}{'IPADDR'} =~ s/addr://g;
2710         $ifcfg{$interface}{'BROADCAST'} = (split (' ', $line))[2];
2711         $ifcfg{$interface}{'BROADCAST'} =~ s/Bcast://g;
2712         $ifcfg{$interface}{'NETMASK'} = (split (' ', $line))[3];
2713         $ifcfg{$interface}{'NETMASK'} =~ s/Mask://g;
2714         if ($DISTRO =~ /RHEL6|RHEL7/) {
2715             $ifcfg{$interface}{'NM_CONTROLLED'} = "yes";
2716             $ifcfg{$interface}{'TYPE'} = "InfiniBand";
2717         }
2718     }
2719     close(IFCONFIG);
2720 }
2721
2722 sub is_carrier
2723 {
2724     my $ifcheck = shift @_;
2725     open(IFSTATUS, "ip link show dev $ifcheck |");
2726     while ( <IFSTATUS> ) {
2727         next unless m@(\s$ifcheck).*@;
2728         if( m/NO-CARRIER/ or not m/UP/ ) {
2729             close(IFSTATUS);
2730             return 0;
2731         }
2732     }
2733     close(IFSTATUS);
2734     return 1;
2735 }
2736
2737 sub config_interface
2738 {
2739     my $interface = shift @_;
2740     my $ans;
2741     my $dev = "ib$interface";
2742     my $target = "$network_dir/ifcfg-$dev";
2743     my $ret;
2744     my $ip;
2745     my $nm;
2746     my $nw;
2747     my $bc;
2748     my $onboot = 1;
2749     my $found_eth_up = 0;
2750
2751     if ($interactive) {
2752         print "\nDo you want to configure $dev? [Y/n]:";
2753         $ans = getch();
2754         if ($ans =~ m/[nN]/) {
2755             return;
2756         }
2757         if (-e $target) {
2758             print BLUE "\nThe current IPoIB configuration for $dev is:\n";
2759             open(IF,$target);
2760             while (<IF>) {
2761                 print $_;
2762             }
2763             close(IF);
2764             print "\nDo you want to change this configuration? [y/N]:", RESET;
2765             $ans = getch();
2766             if ($ans !~ m/[yY]/) {
2767                 return;
2768             }
2769         }
2770         print "\nEnter an IP Adress: ";
2771         $ip = <STDIN>;
2772         chomp $ip;
2773         $ret = is_valid_ipv4($ip);
2774         while ($ret) {
2775             print "\nEnter a valid IPv4 Adress: ";
2776             $ip = <STDIN>;
2777             chomp $ip;
2778             $ret = is_valid_ipv4($ip);
2779         }
2780         print "\nEnter the Netmask: ";
2781         $nm = <STDIN>;
2782         chomp $nm;
2783         $ret = is_valid_ipv4($nm);
2784         while ($ret) {
2785             print "\nEnter a valid Netmask: ";
2786             $nm = <STDIN>;
2787             chomp $nm;
2788             $ret = is_valid_ipv4($nm);
2789         }
2790         print "\nEnter the Network: ";
2791         $nw = <STDIN>;
2792         chomp $nw;
2793         $ret = is_valid_ipv4($nw);
2794         while ($ret) {
2795             print "\nEnter a valid Network: ";
2796             $nw = <STDIN>;
2797             chomp $nw;
2798             $ret = is_valid_ipv4($nw);
2799         }
2800         print "\nEnter the Broadcast Adress: ";
2801         $bc = <STDIN>;
2802         chomp $bc;
2803         $ret = is_valid_ipv4($bc);
2804         while ($ret) {
2805             print "\nEnter a valid Broadcast Adress: ";
2806             $bc = <STDIN>;
2807             chomp $bc;
2808             $ret = is_valid_ipv4($bc);
2809         }
2810         print "\nStart Device On Boot? [Y/n]:";
2811         $ans = getch();
2812         if ($ans =~ m/[nN]/) {
2813             $onboot = 0;
2814         }
2815
2816         print GREEN "\nSelected configuration:\n";
2817         print "DEVICE=$dev\n";
2818         print "IPADDR=$ip\n";
2819         print "NETMASK=$nm\n";
2820         print "NETWORK=$nw\n";
2821         print "BROADCAST=$bc\n";
2822         if ($DISTRO =~ /RHEL6|RHEL7/) {
2823             print "NM_CONTROLLED=yes\n";
2824             print "TYPE=InfiniBand\n";
2825         }
2826         if ($onboot) {
2827             print "ONBOOT=yes\n";
2828         }
2829         else {
2830             print "ONBOOT=no\n";
2831         }
2832         print "\nDo you want to save the selected configuration? [Y/n]:";
2833         $ans = getch();
2834         if ($ans =~ m/[nN]/) {
2835             return;
2836         }
2837     }
2838     else {
2839         if (not $config_net_given) {
2840             return;
2841         }
2842         print "Going to update $target\n" if ($verbose2);
2843         if ($ifcfg{$dev}{'LAN_INTERFACE'}) {
2844             $eth_dev = $ifcfg{$dev}{'LAN_INTERFACE'};
2845             if (not -e "/sys/class/net/$eth_dev") {
2846                 print "Device $eth_dev is not present\n" if (not $quiet);
2847                 return;
2848             }
2849             if ( is_carrier ($eth_dev) ) {
2850                 $found_eth_up = 1;
2851             }
2852         }
2853         else {
2854             # Take the first existing Eth interface
2855             my @eth_devs = </sys/class/net/eth*>;
2856             for my $tmp_dev ( @eth_devs ) {
2857                 $eth_dev = $tmp_dev;
2858                 $eth_dev =~ s@/sys/class/net/@@g;
2859                 if ( is_carrier ($eth_dev) ) {
2860                     $found_eth_up = 1;
2861                     last;
2862                 }
2863             }
2864         }
2865
2866         if ($found_eth_up) {
2867             get_net_config("$eth_dev");
2868         }
2869
2870         if (not $ifcfg{$dev}{'IPADDR'}) {
2871             print "IP address is not defined for $dev\n" if ($verbose2);
2872             print "Skipping $dev configuration...\n" if ($verbose2);
2873             return;
2874         }
2875         if (not $ifcfg{$dev}{'NETMASK'}) {
2876             print "Netmask is not defined for $dev\n" if ($verbose2);
2877             print "Skipping $dev configuration...\n" if ($verbose2);
2878             return;
2879         }
2880         if (not $ifcfg{$dev}{'NETWORK'}) {
2881             print "Network is not defined for $dev\n" if ($verbose2);
2882             print "Skipping $dev configuration...\n" if ($verbose2);
2883             return;
2884         }
2885         if (not $ifcfg{$dev}{'BROADCAST'}) {
2886             print "Broadcast address is not defined for $dev\n" if ($verbose2);
2887             print "Skipping $dev configuration...\n" if ($verbose2);
2888             return;
2889         }
2890
2891         my @ipib = (split('\.', $ifcfg{$dev}{'IPADDR'}));
2892         my @nmib = (split('\.', $ifcfg{$dev}{'NETMASK'}));
2893         my @nwib = (split('\.', $ifcfg{$dev}{'NETWORK'}));
2894         my @bcib = (split('\.', $ifcfg{$dev}{'BROADCAST'}));
2895
2896         my @ipeth = (split('\.', $ifcfg{$eth_dev}{'IPADDR'}));
2897         my @nmeth = (split('\.', $ifcfg{$eth_dev}{'NETMASK'}));
2898         my @nweth = (split('\.', $ifcfg{$eth_dev}{'NETWORK'}));
2899         my @bceth = (split('\.', $ifcfg{$eth_dev}{'BROADCAST'}));
2900
2901         for (my $i = 0; $i < 4 ; $i ++) {
2902             if ($ipib[$i] =~ m/\*/) {
2903                 if ($ipeth[$i] =~ m/(\d\d?\d?)/) {
2904                     $ipib[$i] = $ipeth[$i];
2905                 }
2906                 else {
2907                     print "Cannot determine the IP address of the $dev interface\n" if (not $quiet);
2908                     return;
2909                 }
2910             }
2911             if ($nmib[$i] =~ m/\*/) {
2912                 if ($nmeth[$i] =~ m/(\d\d?\d?)/) {
2913                     $nmib[$i] = $nmeth[$i];
2914                 }
2915                 else {
2916                     print "Cannot determine the netmask of the $dev interface\n" if (not $quiet);
2917                     return;
2918                 }
2919             }
2920             if ($bcib[$i] =~ m/\*/) {
2921                 if ($bceth[$i] =~ m/(\d\d?\d?)/) {
2922                     $bcib[$i] = $bceth[$i];
2923                 }
2924                 else {
2925                     print "Cannot determine the broadcast address of the $dev interface\n" if (not $quiet);
2926                     return;
2927                 }
2928             }
2929             if ($nwib[$i] !~ m/(\d\d?\d?)/) {
2930                 $nwib[$i] = $nweth[$i];
2931             }
2932         }
2933
2934         $ip = "$ipib[0].$ipib[1].$ipib[2].$ipib[3]";
2935         $nm = "$nmib[0].$nmib[1].$nmib[2].$nmib[3]";
2936         $nw = "$nwib[0].$nwib[1].$nwib[2].$nwib[3]";
2937         $bc = "$bcib[0].$bcib[1].$bcib[2].$bcib[3]";
2938
2939         print GREEN "IPoIB configuration for $dev\n";
2940         print "DEVICE=$dev\n";
2941         print "IPADDR=$ip\n";
2942         print "NETMASK=$nm\n";
2943         print "NETWORK=$nw\n";
2944         print "BROADCAST=$bc\n";
2945         if ($onboot) {
2946             print "ONBOOT=yes\n";
2947         }
2948         else {
2949             print "ONBOOT=no\n";
2950         }
2951         print RESET "\n";
2952     }
2953
2954     open(IF, ">$target") or die "Can't open $target: $!";
2955     if ($DISTRO =~ m/SLES/) {
2956         print IF "BOOTPROTO='static'\n";
2957         print IF "IPADDR='$ip'\n";
2958         print IF "NETMASK='$nm'\n";
2959         print IF "NETWORK='$nw'\n";
2960         print IF "BROADCAST='$bc'\n";
2961         print IF "REMOTE_IPADDR=''\n";
2962         if ($onboot) {
2963             print IF "STARTMODE='onboot'\n";
2964         }
2965         else {
2966             print IF "STARTMODE='manual'\n";
2967         }
2968         print IF "WIRELESS=''\n";
2969     }
2970     else {
2971         print IF "DEVICE=$dev\n";
2972         print IF "BOOTPROTO=static\n";
2973         print IF "IPADDR=$ip\n";
2974         print IF "NETMASK=$nm\n";
2975         print IF "NETWORK=$nw\n";
2976         print IF "BROADCAST=$bc\n";
2977         if ($DISTRO =~ /RHEL6|RHEL7/) {
2978             print IF "NM_CONTROLLED=yes\n";
2979             print IF "TYPE=InfiniBand\n";
2980         }
2981         if ($onboot) {
2982             print IF "ONBOOT=yes\n";
2983         }
2984         else {
2985             print IF "ONBOOT=no\n";
2986         }
2987     }
2988     close(IF);
2989 }
2990
2991 sub ipoib_config
2992 {
2993     if ($interactive) {
2994         print BLUE;
2995         print "\nThe default IPoIB interface configuration is based on DHCP.";
2996         print "\nNote that a special patch for DHCP is required for supporting IPoIB.";
2997         print "\nThe patch is available under docs/dhcp";
2998         print "\nIf you do not have DHCP, you must change this configuration in the following steps.";
2999         print RESET "\n";
3000     }
3001
3002     my $ports_num = count_ports();
3003     for (my $i = 0; $i < $ports_num; $i++ ) {
3004         config_interface($i);
3005     }
3006
3007     if ($interactive) {
3008         print GREEN "IPoIB interfaces configured successfully",RESET "\n";
3009         print "Press any key to continue ...";
3010         getch();
3011     }
3012
3013     if (-f "/etc/sysconfig/network/config") {
3014         my $nm = `grep ^NETWORKMANAGER=yes /etc/sysconfig/network/config`;
3015         chomp $nm;
3016         if ($nm) {
3017             print RED "Please set NETWORKMANAGER=no in the /etc/sysconfig/network/config", RESET "\n";
3018         }
3019     }
3020
3021 }
3022
3023 sub force_uninstall
3024 {
3025     my $res = 0;
3026     my $sig = 0;
3027     my $cnt = 0;
3028     my @other_ofed_rpms = `rpm -qa 2> /dev/null | grep -wE "rdma|ofed|openib|ofa_kernel"`;
3029     my $cmd = "rpm -e --allmatches --nodeps";
3030
3031     for my $package (@all_packages, @hidden_packages, @prev_ofed_packages, @other_ofed_rpms, @distro_ofed_packages, @chelsio_uwire_packages) {
3032         chomp $package;
3033         if (is_installed($package)) {
3034             push (@packages_to_uninstall, $package);
3035             $selected_for_uninstall{$package} = 1;
3036         }
3037         if (is_installed("$package-static")) {
3038             push (@packages_to_uninstall, "$package-static");
3039             $selected_for_uninstall{$package} = 1;
3040         }
3041         if ($suffix_32bit and is_installed("$package$suffix_32bit")) {
3042             push (@packages_to_uninstall,"$package$suffix_32bit");
3043             $selected_for_uninstall{$package} = 1;
3044         }
3045         if ($suffix_64bit and is_installed("$package$suffix_64bit")) {
3046             push (@packages_to_uninstall,"$package$suffix_64bit");
3047             $selected_for_uninstall{$package} = 1;
3048         }
3049     }
3050
3051     for my $package (@packages_to_uninstall) {
3052         get_requires($package);
3053     }
3054
3055     for my $package (@packages_to_uninstall, @dependant_packages_to_uninstall) {
3056         if (is_installed("$package")) {
3057             $cmd .= " $package";
3058             $cnt ++;
3059         }
3060     }
3061
3062     if ($cnt) {
3063         print "\n$cmd\n" if (not $quiet);
3064         open (LOG, "+>$ofedlogs/ofed_uninstall.log");
3065         print LOG "$cmd\n";
3066         close LOG;
3067         system("$cmd >> $ofedlogs/ofed_uninstall.log 2>&1");
3068         $res = $? >> 8;
3069         $sig = $? & 127;
3070         if ($sig or $res) {
3071             print RED "Failed to uninstall the previous installation", RESET "\n";
3072             print RED "See $ofedlogs/ofed_uninstall.log", RESET "\n";
3073             exit 1;
3074         }
3075     }
3076 }
3077
3078 sub uninstall
3079 {
3080     my $res = 0;
3081     my $sig = 0;
3082     my $distro_rpms = '';
3083
3084     my $ofed_uninstall = `which ofed_uninstall.sh 2> /dev/null`;
3085     chomp $ofed_uninstall;
3086     if (-f "$ofed_uninstall") {
3087         print BLUE "Uninstalling the previous version of $PACKAGE", RESET "\n" if (not $quiet);
3088         system("yes | ofed_uninstall.sh >> $ofedlogs/ofed_uninstall.log 2>&1");
3089         $res = $? >> 8;
3090         $sig = $? & 127;
3091         if ($sig or $res) {
3092             system("yes | $CWD/uninstall.sh >> $ofedlogs/ofed_uninstall.log 2>&1");
3093             $res = $? >> 8;
3094             $sig = $? & 127;
3095             if ($sig or $res) {
3096                 # Last try to uninstall
3097                 force_uninstall();
3098             }
3099         } else {
3100             return 0;
3101         }
3102     } else {
3103         force_uninstall();
3104     }
3105 }
3106
3107 sub install
3108 {
3109     # Build and install selected RPMs
3110     for my $package ( @selected_packages ) {
3111         if ($packages_info{$package}{'internal'}) {
3112             my $parent = $packages_info{$package}{'parent'};
3113             if (not $main_packages{$parent}{'srpmpath'}) {
3114                 print RED "$parent source RPM is not available", RESET "\n";
3115                 next;
3116             }
3117         }
3118
3119         if ($packages_info{$package}{'mode'} eq "user") {
3120             if (not $packages_info{$package}{'exception'}) {
3121                 if ( (not $packages_info{$package}{'rpm_exist'}) or
3122                      ($build32 and $packages_info{$package}{'install32'} and
3123                       not $packages_info{$package}{'rpm_exist32'}) ) {
3124                     build_rpm($package);
3125                 }
3126
3127                 if ( (not $packages_info{$package}{'rpm_exist'}) or
3128                      ($build32 and $packages_info{$package}{'install32'} and
3129                       not $packages_info{$package}{'rpm_exist32'}) ) {
3130                     print RED "$package was not created", RESET "\n";
3131                     exit 1;
3132                 }
3133                 print "Install $package RPM:\n" if ($verbose);
3134                 install_rpm($package);
3135             }
3136         }
3137         else {
3138             # kernel modules
3139             if (not $packages_info{$package}{'rpm_exist'}) {
3140                 my $parent = $packages_info{$package}{'parent'};
3141                 print "Build $parent RPM\n" if ($verbose);
3142                 build_kernel_rpm($parent);
3143             }
3144             if (not $packages_info{$package}{'rpm_exist'}) {
3145                 print RED "$package was not created", RESET "\n";
3146                 exit 1;
3147             }
3148             print "Install $package RPM:\n" if ($verbose);
3149             install_kernel_rpm($package);
3150         }
3151     }
3152 }
3153
3154 sub check_pcie_link
3155 {
3156     if (open (PCI, "$lspci -d 15b3: -n|")) {
3157         while(<PCI>) {
3158             my $devinfo = $_;
3159             $devinfo =~ /(15b3:[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])/;
3160             my $devid = $&;
3161             my $link_width = `$setpci -d $devid 72.B | cut -b1`;
3162             chomp $link_width;
3163
3164             print BLUE "Device ($devid):\n";
3165             print "\t" . `$lspci -d $devid`;
3166
3167             if ( $link_width eq "8" ) {
3168                 print "\tLink Width: 8x\n";
3169             }
3170             else {
3171                 print "\tLink Width is not 8x\n";
3172             }
3173             my $link_speed = `$setpci -d $devid 72.B | cut -b2`;
3174             chomp $link_speed;
3175             if ( $link_speed eq "1" ) {
3176                 print "\tPCI Link Speed: 2.5Gb/s\n";
3177             }
3178             elsif ( $link_speed eq "2" ) {
3179                 print "\tPCI Link Speed: 5Gb/s\n";
3180             }
3181             else {
3182                 print "\tPCI Link Speed: Unknown\n";
3183             }
3184             print "", RESET "\n";
3185         }
3186         close (PCI);
3187     }
3188 }
3189
3190 ### MAIN AREA ###
3191 sub main
3192 {
3193     if ($print_available) {
3194         my @list = ();
3195         set_availability();
3196
3197         for my $srcrpm ( <$SRPMS*.rpm>,<$SRPMS$SRPMS_DISTRO/*.rpm> ) {
3198             set_cfg ($srcrpm);
3199         }
3200
3201         if (!$install_option) {
3202             $install_option = 'all';
3203         }
3204
3205         $config = $CWD . "/ofed-$install_option.conf";
3206         chomp $config;
3207         if ($install_option eq 'all') {
3208             @list = (@all_packages, @hidden_packages);
3209         }
3210         elsif ($install_option eq 'basic') {
3211             @list = (@basic_user_packages, @basic_kernel_packages);
3212             @kernel_modules = (@basic_kernel_modules);
3213         }
3214
3215         @selected_by_user = (@list);
3216         if ($with_xeon_phi){
3217             push (@selected_by_user, @xeon_phi_user);
3218         } else { 
3219             push (@selected_by_user, @non_xeon_phi_user);
3220         }
3221
3222         @selected_modules_by_user = (@kernel_modules);
3223         push (@selected_modules_by_user, @xeon_phi_kernel) if ($with_xeon_phi);
3224
3225         resolve_dependencies();
3226         open(CONFIG, ">$config") || die "Can't open $config: $!";;
3227         flock CONFIG, $LOCK_EXCLUSIVE;
3228         print "\nOFED packages: ";
3229         for my $package ( @selected_packages ) {
3230             my $parent = $packages_info{$package}{'parent'};
3231             next if (not $packages_info{$package}{'available'} or not $main_packages{$parent}{'srpmpath'});
3232             print("$package available: $packages_info{$package}{'available'}\n") if ($verbose2);
3233             if ($package =~ /compat-rdma/ and $package !~ /devel/) {
3234                 print "\nKernel modules: ";
3235                 for my $module ( @selected_kernel_modules ) {
3236                     next if (not $kernel_modules_info{$module}{'available'});
3237                     print $module . ' ';
3238                     print CONFIG "$module=y\n";
3239                 }
3240                 print "\nRPMs: ";
3241             }
3242             print $package . ' ';
3243             print CONFIG "$package=y\n";
3244         }
3245         flock CONFIG, $UNLOCK;
3246         close(CONFIG);
3247
3248         if ($DISTRO =~ /RHEL.*/ || $DISTRO =~ /SLES.*/ ) {
3249             print "\nTech Preview: ";
3250             print "xeon-phi ";
3251         }
3252
3253         print "\n";
3254         print GREEN "Created $config", RESET "\n";
3255         exit 0;
3256     }
3257
3258     my $num_selected = 0;
3259
3260     push (@kernel_modules, @xeon_phi_kernel) if ($with_xeon_phi);
3261     if ($with_xeon_phi){
3262         push (@all_packages, @xeon_phi_user);
3263     } else { 
3264         push (@all_packages, @non_xeon_phi_user);
3265     }
3266
3267     if ($interactive) {
3268         my $inp;
3269         my $ok = 0;
3270         my $max_inp;
3271
3272         while (! $ok) {
3273             $max_inp = show_menu("main");
3274             $inp = getch();
3275
3276             if ($inp =~ m/[qQ]/ || $inp =~ m/[Xx]/ ) {
3277                 die "Exiting\n";
3278             }
3279             if (ord($inp) == $KEY_ENTER) {
3280                 next;
3281             }
3282             if ($inp =~ m/[0123456789abcdefABCDEF]/)
3283             {
3284                 $inp = hex($inp);
3285             }
3286             if ($inp < 1 || $inp > $max_inp)
3287             {
3288                 print "Invalid choice...Try again\n";
3289                 next;
3290             }
3291             $ok = 1;
3292         }
3293
3294         if ($inp == 1) {
3295             if (-e "$CWD/docs/${PACKAGE}_Installation_Guide.txt") {
3296                 system("less $CWD/docs/${PACKAGE}_Installation_Guide.txt");
3297             }
3298             elsif (-e "$CWD/README.txt") {
3299                 system("less $CWD/README.txt");
3300             }
3301             else {
3302                 print RED "$CWD/docs/${PACKAGE}_Installation_Guide.txt does not exist...", RESET;
3303             }
3304
3305             return 0;
3306         }
3307         elsif ($inp == 2) {
3308             for my $srcrpm ( <$SRPMS*.rpm>,<$SRPMS$SRPMS_DISTRO/*.rpm> ) {
3309                 set_cfg ($srcrpm);
3310             }
3311
3312             # Set RPMs info for available source RPMs
3313             set_availability();
3314             $num_selected = select_packages();
3315             set_existing_rpms();
3316             resolve_dependencies();
3317             check_linux_dependencies();
3318             if (not $quiet) {
3319                 print_selected();
3320             }
3321         }
3322         elsif ($inp == 3) {
3323             my $cnt = 0;
3324             for my $package ( @all_packages, @hidden_packages) {
3325                 if (is_installed($package)) {
3326                     print "$package\n";
3327                     $cnt ++;
3328                 }
3329             }
3330             if (not $cnt) {
3331                 print "\nThere is no $PACKAGE software installed\n";
3332             }
3333             print GREEN "\nPress any key to continue...", RESET;
3334             getch();
3335             return 0;
3336         }
3337         elsif ($inp == 4) {
3338             ipoib_config();
3339             return 0;
3340         }
3341         elsif ($inp == 5) {
3342             uninstall();
3343             exit 0;
3344         }
3345
3346     }
3347     else {
3348         for my $srcrpm ( <$SRPMS*.rpm>,<$SRPMS$SRPMS_DISTRO/*.rpm> ) {
3349             set_cfg ($srcrpm);