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