Hello community, here is the log from the commit of package collectl for openSUSE:Factory checked in at 2018-09-07 15:40:06 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/collectl (Old) and /work/SRC/openSUSE:Factory/.collectl.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "collectl" Fri Sep 7 15:40:06 2018 rev:32 rq:633503 version:4.3.0 Changes: -------- --- /work/SRC/openSUSE:Factory/collectl/collectl.changes 2018-09-04 22:58:05.473394317 +0200 +++ /work/SRC/openSUSE:Factory/.collectl.new/collectl.changes 2018-09-07 15:40:09.646487436 +0200 @@ -1,0 +2,19 @@ +Tue Sep 4 18:02:00 UTC 2018 - tabra...@suse.com + +- Update to 4.3.0 + + disable -sL, should have been done at same time -sl was + +- Changes from 4.2.0 + + Updated Plotfile docs to explain why you shouldn't leave off the -f + when using -P [thanks Bayard] + + added support for InfiniBand OPA V4 to read start from /sys instead of + having to rely on perfquery for 64 bit counters. [thanks frederic] + + removed previos bug introduced in V4.1.2 that was not properly calculating + disk summaries. If you do have any raw files collected with this version + you WILL be able to play them back properly or create and plot files with + this version + + although I'm stil leaving the lustre code in place because there is so much + of it, I did remove cciss disk types from non-lustre code + + finally removed col2tlviz from kit [thanks tom] + +------------------------------------------------------------------- Old: ---- collectl-4.1.3.src.tar.gz New: ---- collectl-4.3.0.src.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ collectl.spec ++++++ --- /var/tmp/diff_new_pack.qOOqrd/_old 2018-09-07 15:40:10.174486870 +0200 +++ /var/tmp/diff_new_pack.qOOqrd/_new 2018-09-07 15:40:10.174486870 +0200 @@ -17,12 +17,12 @@ Name: collectl -Version: 4.1.3 +Version: 4.3.0 Release: 0 Summary: Collects data that describes the current system status -License: Artistic-1.0 AND GPL-2.0-or-later +License: Artistic-1.0 and GPL-2.0-or-later Group: System/Monitoring -URL: http://collectl.sourceforge.net +Url: http://collectl.sourceforge.net Source0: http://sourceforge.net/projects/collectl/files/collectl/%{name}-%{version}/%{name}-%{version}.src.tar.gz Source1: collectl.service Source2: collectl.sysconfig @@ -31,6 +31,10 @@ BuildArch: noarch %{?systemd_requires} +%if ! %{defined _fillupdir} +%define _fillupdir /var/adm/fillup-templates +%endif + %description Unlike most monitoring tools that either focus on a small set of statistics, format their output in only one way, run either @@ -78,7 +82,11 @@ %service_del_postun %{name}.service %files +%if 0%{?sle_version} <= 120200 +%doc COPYING ARTISTIC GPL +%else %license COPYING ARTISTIC GPL +%endif %doc docs/* README RELEASE-collectl %{_unitdir}/collectl.service %{_fillupdir}/sysconfig.collectl @@ -88,8 +96,8 @@ %{_sbindir}/collectl %{_sbindir}/rccollectl %{_datadir}/collectl -%{_mandir}/man1/collectl.1%{?ext_man} -%{_mandir}/man1/colmux.1%{?ext_man} +%{_mandir}/man1/collectl.1.gz +%{_mandir}/man1/colmux.1.gz %dir %{_var}/log/%{name} %changelog ++++++ collectl-4.1.3.src.tar.gz -> collectl-4.3.0.src.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/collectl-4.1.3/INSTALL new/collectl-4.3.0/INSTALL --- old/collectl-4.1.3/INSTALL 2017-04-10 20:38:40.000000000 +0200 +++ new/collectl-4.3.0/INSTALL 2017-12-15 16:17:37.000000000 +0100 @@ -38,7 +38,6 @@ cp vmstat.ph $SHRDIR cp vnet.ph vmsum.ph $SHRDIR cp client.pl $SHRDIR/util -cp col2tlviz.pl $SHRDIR/util # Force in case redoing the install and files already zipped gzip -f $MANDIR/collectl* diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/collectl-4.1.3/RELEASE-collectl new/collectl-4.3.0/RELEASE-collectl --- old/collectl-4.1.3/RELEASE-collectl 2017-04-10 20:38:40.000000000 +0200 +++ new/collectl-4.3.0/RELEASE-collectl 2017-12-15 16:17:37.000000000 +0100 @@ -27,6 +27,22 @@ COLLECTL CHANGES +4.3.0 Oct 3, 2017 + - disable -sL, should have been done at same time -sl was + +4.2.0 Jun 12, 2017 + - Updated Plotfile docs to explain why you shouldn't leave off the -f + when using -P [thanks Bayard] + - added support for InfiniBand OPA V4 to read start from /sys instead of + having to rely on perfquery for 64 bit counters. [thanks frederic] + - removed previos bug introduced in V4.1.2 that was not properly calculating + disk summaries. If you do have any raw files collected with this version + you WILL be able to play them back properly or create and plot files with + this version + - although I'm stil leaving the lustre code in place because there is so much + of it, I did remove cciss disk types from non-lustre code + - finally removed col2tlviz from kit [thanks tom] + 4.1.3 Apr 10, 2017 - throws 'unit var' building distro on openSUSE diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/collectl-4.1.3/col2tlviz.pl new/collectl-4.3.0/col2tlviz.pl --- old/collectl-4.1.3/col2tlviz.pl 2017-04-10 20:38:40.000000000 +0200 +++ new/collectl-4.3.0/col2tlviz.pl 1970-01-01 01:00:00.000000000 +0100 @@ -1,113 +0,0 @@ -#!/usr/bin/perl -w - -# Copyright 2003-2009 Hewlett-Packard Development Company, L.P. - -# Revision history (some of) -#1.2.0 Convert alphabetic fields to 0s, which at this point are only for DSK and NET - -use Config; -use Getopt::Std; -use File::Basename; -use strict; - -my $Version="1.2.0"; -my $Copyright='Copyright 2003-2008 Hewlett-Packard Development Company, L.P.'; - -my $pcFlag=($Config{"osname"}=~/MSWin32/) ? 1 : 0; -my $SEP=($pcFlag) ? '\\' : '/'; - -our ($opt_h, $opt_i, $opt_o, $opt_v); -my ($inspec, $outdir); -getopts('hi:o:v'); -$inspec=$opt_i if defined($opt_i); -$outdir=$opt_o if defined($opt_o); - -if (defined($opt_v)) -{ - print "col2tlviz V$Version\n"; - print "$Copyright\n"; - exit; -} - -if (defined($opt_h) || !defined($inspec)) -{ - print "usage: col2tlv.pl -i filespec [-o dirname] [-v]\n"; - print "$Copyright\n"; - exit; -} - -error("output directory doesn't exist") if defined($outdir) && !-e $outdir; - -my @files; -my $glob=$inspec; -my $skipped=0; -@files=glob($glob); -foreach my $file (@files) -{ - if ($file!~/tab$|cpu$|dsk$|net$|nfs$/) - { - $skipped++; - next; - } - - open IN, "<$file" or error("Couldn't open '$file'"); - - my $outfile="$file.csv"; - $outfile="$outdir$SEP".basename($outfile) if defined($outdir); - open OUT, ">$outfile" or error("Couldn't create '$outfile'"); - print "Creating: $outfile\n"; - - my $state=0; - my $header=''; - while (my $line=<IN>) - { - if ($line=~/^#Date/) - { - cvtHeader(\$header); - - $state=1; - $line=~s/ /,/g; - $line=~s/#Date,Time(.*),?$/Sample Time$1/; # also get rid of optional trailing comma! - print OUT $line; - next; - } - - if ($state==0) - { - $header.=$line; - next; - } - - my ($date, $time, $therest)=split(/ /, $line, 3); - my $year=substr($date, 0, 4); - my $mon= substr($date, 4, 2); - my $day=substr($date, 6, 2); - - my $month=substr('JanFebMarAprMayJunJulAugSepOctNovDec', ($mon-1)*3, 3); - my $newdate="$day-$month-$year"; - - $therest=~s/ /,/g; - $therest=~s/[a-z].*?,/0,/g; # for DSK and NET files, this will convert instance names to 0's - print OUT "$newdate $time,$therest"; - } -} -print "skipped $skipped file(s) that did not extension(s): tab,cpu,dsk,net,nfs\n" if $skipped; - -sub cvtHeader -{ - my $hdrref=shift; - - $$hdrref=~s/##.*//g; - $$hdrref=~s/#\s+(.*)/"$1",/g; - $$hdrref=~s/[\n\r]+//g; - $$hdrref=~s/,$//; - $$hdrref=~/Host:\s+(\S+)/; - $$hdrref="$1,$$hdrref\n"; - print OUT $$hdrref; -} - -sub error -{ - print "$_[0]\n"; - exit; -} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/collectl-4.1.3/collectl new/collectl-4.3.0/collectl --- old/collectl-4.1.3/collectl 2017-04-10 20:38:40.000000000 +0200 +++ new/collectl-4.3.0/collectl 2017-12-15 16:17:37.000000000 +0100 @@ -111,7 +111,7 @@ $rootFlag=(!$PcFlag && `whoami`=~/root/) ? 1 : 0; $SrcArch= $Config{"archname"}; -$Version= '4.1.3-1'; +$Version= '4.3.0-1'; $Copyright='Copyright 2003-2017 Hewlett-Packard Development Company, L.P.'; $License= "collectl may be copied only under the terms of either the Artistic License\n"; $License.= "or the GNU General Public License, which may be found in the source kit"; @@ -160,6 +160,7 @@ undef %disks; undef @HCAName; undef @HCAPorts; +undef @HCAOpaV4; undef @HCAId; undef %networks; undef @dskIndexAvail; @@ -222,7 +223,7 @@ $DiskMaxValue=-1; # disabled # NOTE - the following line should match what is in collectl.conf. If uncommented there, it will be replaced -$DiskFilter='cciss/c\d+d\d+ |hd[ab] | sd[a-z]+ |dm-\d+ |xvd[a-z] |fio[a-z]+ | vd[a-z]+ |emcpower[a-z]+ |psv\d+ |nvme\d+n\d+ '; +$DiskFilter='hd[ab] | sd[a-z]+ |dm-\d+ |xvd[a-z] |fio[a-z]+ | vd[a-z]+ |emcpower[a-z]+ |psv\d+ |nvme\d+n\d+ '; $DiskFilterFlag=0; # only set when filter set in collectl.conf $ProcReadTest='yes'; @@ -231,7 +232,7 @@ # These aren't user settable but are needed to build the list of ALL valid # subsystems -$SubsysDet= "BCDEFJLMNTXYZ"; +$SubsysDet= "BCDEFJMNTXYZ"; $SubsysExcore='y'; # These are the subsystems allowed in brief mode @@ -1047,7 +1048,6 @@ } undef %diskRemap; -$diskRemap{'cciss\/'}=''; foreach my $remap (split(/,/, $dskRemap)) { my ($pat, $sub) = split(/:/, $remap); @@ -2975,28 +2975,36 @@ # only read if port active if ($HCAPorts[$i][$j]) { - if ($HCAName[$i]=~/hfi/) + # for OPA V4, /sys counters always 64 bits + if ($HCAOpaV4[$i][$j]) + { + my $proc="$SysIB/$HCAName[$i]0/ports/$j/counters"; + getProc(0, "$proc/port_rcv_data", "ib$i-$j:rcvd"); + getProc(0, "$proc/port_xmit_data", "ib$i-$j:xmtd"); + getProc(0, "$proc/port_rcv_packets", "ib$i-$j:rcvp"); + getProc(0, "$proc/port_xmit_packets", "ib$i-$j:xmtp"); + } + + elsif ($HCAName[$i]=~/hfi/) { getExec(5, "/sbin/opapmaquery -h $HCAId[$i] -p $j -o getdatacounters", "ib$i-$j:opa"); } - else + + # non-opa V4 counters but present in /sys, counters come from counters_ext + elsif ($PQopt eq 'sys') { - # 64 bit counters always come from /sys - my $proc="$SysIB/$HCAName[$i]$i/ports/$j/counters_ext"; - if ($PQopt eq 'sys') - { - getProc(0, "$proc/port_rcv_data_64", "ib$i-$j:rcvd"); - getProc(0, "$proc/port_xmit_data_64", "ib$i-$j:xmtd"); - getProc(0, "$proc/port_rcv_packets_64", "ib$i-$j:rcvp"); - getProc(0, "$proc/port_xmit_packets_64", "ib$i-$j:xmtp"); - } - - # we only use perfquery for 32bit counters or 64 when not in - # available in sys and then only if perfquery hasn't been disabled - elsif ( -e $PQuery ) - { - getExec(1, "$PQuery $PQopt -C $HCAId[$i] -P $j", "ib$i-$j:pquery"); - } + my $proc="$SysIB/$HCAName[$i]$i/ports/$j/counters_ext"; + getProc(0, "$proc/port_rcv_data_64", "ib$i-$j:rcvd"); + getProc(0, "$proc/port_xmit_data_64", "ib$i-$j:xmtd"); + getProc(0, "$proc/port_rcv_packets_64", "ib$i-$j:rcvp"); + getProc(0, "$proc/port_xmit_packets_64", "ib$i-$j:xmtp"); + } + + # we only use perfquery for 32bit counters or 64 when not in + # available in sys and then only if perfquery hasn't been disabled + elsif ( -e $PQuery ) + { + getExec(1, "$PQuery $PQopt -C $HCAId[$i] -P $j", "ib$i-$j:pquery"); } } } @@ -3593,7 +3601,7 @@ # $temp1 contains any NEW subsys in current file, so add them to 'last' $lastSubSys.=$temp1; - $preprocErrors{$file}="E:-P and details to terminal not allowed" + $preprocErrors{$file}="E:-P and details to terminal from multiple raw files not allowed." if $lastSubSys=~/[A-Z]/ && $filename eq '' && $plotFlag; return($lastSubSys); # has new sub-systems appended @@ -3898,8 +3906,7 @@ # /proc/diskstats & /proc/partitions # would be nice if we could improve even more since this table can - # get quite large. Note the pattern for cciss MUST match that used - # in formatit.ph!!! + # get quite large. elsif ($type==9) { next if $rawDskIgnore ne '' && $line=~/$rawDskIgnore/; @@ -3909,7 +3916,6 @@ # faster to as separate if statements if (!$DiskFilterFlag) { - if ($line=~/cciss\/c\d+d\d+ /) { record(2, "$tag $line"); next; } if ($line=~/hd[ab] /) { record(2, "$tag $line"); next; } if ($line=~/ sd[a-z]+ /) { record(2, "$tag $line"); next; } if ($line=~/dm-\d+ /) { record(2, "$tag $line"); next; } @@ -6779,6 +6785,10 @@ my $whatsnew=<<EOF6; What's new in collectl in the last year or so? +version 4.2.0 + - fixed bug in disk summary stats introduced in 4.1.2 + - now reads Infiniband 64 bit counters from /sys when present + version 4.1.1 - added support for nvme disks - added packet loss and fast retransmissions for -st and renamed @@ -6805,10 +6815,6 @@ - added en as known network device name - lustre disabled (though code still there but will be removed soon) -Version 4.0 -- added mlx5 as new IB device type -- colmux now part of collectl distro - EOF6 printText($whatsnew); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/collectl-4.1.3/collectl.conf new/collectl-4.3.0/collectl.conf --- old/collectl-4.1.3/collectl.conf 2017-04-10 20:38:40.000000000 +0200 +++ new/collectl-4.3.0/collectl.conf 2017-12-15 16:17:37.000000000 +0100 @@ -142,7 +142,7 @@ # ignored. To change the filter, set the string below to those you want to keep BUT # you need to know what a perl regular expression looks like or you may not get the # desired results. CAUTION - white space is CRITICAL for this to work. -#DiskFilter = /cciss/c\d+d\d+ |hd[ab] | sd[a-z]+ |dm-\d+ |xvd[a-z] |fio[a-z]+ | vd[a-z]+ |emcpower[a-z]+ |psv\d+ |nvme\d+n\d+ / +#DiskFilter = /hd[ab] | sd[a-z]+ |dm-\d+ |xvd[a-z] |fio[a-z]+ | vd[a-z]+ |emcpower[a-z]+ |psv\d+ |nvme\d+n\d+ / # Kernel Efficiency Test # On kernels 2.6.32 forward (and you can't tell how distros patched) there is a read inefficiency diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/collectl-4.1.3/docs/Plotfiles.html new/collectl-4.3.0/docs/Plotfiles.html --- old/collectl-4.1.3/docs/Plotfiles.html 2017-04-10 20:38:41.000000000 +0200 +++ new/collectl-4.3.0/docs/Plotfiles.html 2017-12-15 16:17:37.000000000 +0100 @@ -7,14 +7,16 @@ <body> <center><h1>Plot Files</h1></center> <p> -One of collectl's main features is its ability to generate files in a ready-to-plot format which -is compatible with what gnuplot expects and there are actually 2 main types of files that it +One of collectl's main features is its ability to generate output in a ready-to-plot format +and write that data to one or more files which +are compatible with what gnuplot expects and there are actually 2 main types of files that it generates. The first, which has an extension of <i>tab</i>, represents a table of all the summary data. What makes this file unique is that all data elements are in a fixed set of columns - some columns may get added over time, but for all intents and purposes, the set of data for say CPUs do not change regardless of how many CPUs are in the system. The second type of files deal with detail data, the amount of which changes with the number of instances so a 4 CPU system will have 1/2 -the data an 8 CPU system has. There is one file for each type of detail data. +the data an 8 CPU system has. There is one file for each type of detail data and like raw files you +tell collectl where to put the plot files with -f. <p> Plot files can be generated in 2 ways and each has its own advantages as well as disadvantages. <ul> @@ -24,6 +26,11 @@ for conversion of raw file</li> </ul> +<b>Caution</b> - though one can leave off -f and have collectl write its plot formatted output to the +terminal, this should be avoided unless there is a specific need. In fact, since multiple detail files +from multiple systems can actually contain different numbers of columns, collectl explcitly only allows +generating detail plot data from a single raw file. +<p> At first glance, it sounds like you'd always want to generate plot files directly since you avoid the need for the conversion step, but you should also realize a few things about this methodology: <ul> @@ -183,7 +190,7 @@ can also choose to write a post-processing script that merges these into a single file with zero-filled columns where there is missing data. -<table width=100%><tr><td align=right><i>updated June 4, 2009</i></td></tr></colgroup></table> +<table width=100%><tr><td align=right><i>updated June 9, 2017</i></td></tr></colgroup></table> </body> </html> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/collectl-4.1.3/formatit.ph new/collectl-4.3.0/formatit.ph --- old/collectl-4.1.3/formatit.ph 2017-04-10 20:38:40.000000000 +0200 +++ new/collectl-4.3.0/formatit.ph 2017-12-15 16:17:37.000000000 +0100 @@ -311,8 +311,17 @@ $opaFlag=1; ibCheck(''); } + } + # OPA V4 exposes 64 it counters in /sys, bypassing the need for perfquery so we need to know + # since we can have a mix of montitoring methods for different HCAs we want to at least say once + # if V4 counters present. + my $ibV4Flag=0; + for (my $i=0; $i<$NumHCAs; $i++) + { + $ibV4Flag=1 if $HCAOpaV4[$i][1]; } + print "Found OPA 64 bit counters in /sys\n" if $debug & 1 && $ibV4Flag; disableSubsys('x', 'no interconnect or opa hardware/drivers found') if $mellanoxFlag+$opaFlag==0; # User had ability to turn off in case they don't want destructive monitoring @@ -3314,7 +3323,7 @@ { ($major, $minor, $diskName, @dskFields)=split(/\s+/, $data); - # if using --dskremap (and also noting prepopulated with 'cciss/'), remap disk name + # if using --dskremap, remap disk name $diskName=diskRemapName($diskName); if (!defined($disks{$diskName})) @@ -3383,16 +3392,16 @@ $dskInProg[$dskIndex]=$dskTicks[$dskIndex]=$dskWeighted[$dskIndex]=0; } - # Apply filters to summary totals, explicitly ignoring those we don't want + # Apply filters to summary totals, explicitly ignoring dm and psv devices which we know contain + # duplicates and should never be considered as summary data. We also ignore other devices + # explicitly told to do so with '--dskfilt ^' which means to ignore if ($diskName!~/^dm-|^psv/ && ($dskFilt eq '' || $diskName!~/$dskFiltIgnore/)) { - # if we're not filtering, we want to add all the disks to the summary except - # cciss and nvme disks whose basenames look like partitions and they're not! - # the partitions were already filtered out by the default disk filter. - # if we are filtering, anything that passes the filter will be reported, noting - # to report partition level stats one needs to use --rawdskfilt - if (($dskFiltKeep eq '' && ($diskName=~/c\dd\d$/ || $diskName=~/nvme/)) || - ($dskFiltKeep ne '' && $diskName=~/$dskFiltKeep/)) + # Never include partitions in summary stats and we're using lookbehind to deal with nvme + # perl lookbehind makes my head explode but what we're doing is to ignore nvme partitions + # which is any device name that ends in a digit AND not preceded with 'nvme\dn' in which + # case the digit is part of the device name. whew... + if ($diskName!~/(?<!nvme\dn)\d$/ && ($dskFiltKeep eq '' || $diskName=~/$dskFiltKeep/)) { $dskReadTot+= $dskRead[$dskIndex]; $dskReadMrgTot+= $dskReadMrg[$dskIndex]; @@ -4356,8 +4365,8 @@ # ib stats from /sys ####################### - # as a optimization don't even look for these unless /sys - if ($PQopt eq 'sys') + # as a optimization don't even look for these unless OPA V4 or /sys + if ($HCAOpaV4[$i][$port] || $PQopt eq 'sys') { if ($name eq 'rcvd') { @@ -4675,8 +4684,6 @@ $dskName=$dskOrder[$i]; next if ($dskFiltKeep eq '' && $dskName=~/$dskFiltIgnore/) || ($dskFiltKeep ne '' && $dskName!~/$dskFiltKeep/); - # note I removed remapping of cciss name because it was just discovered I never needed to since - # the cciss/ was dropped when $dskOrder array implemented $temp= "[DSK]Name${SEP}[DSK]Reads${SEP}[DSK]RMerge${SEP}[DSK]RKBytes${SEP}[DSK]WaitR${SEP}"; $temp.="[DSK]Writes${SEP}[DSK]WMerge${SEP}[DSK]WKBytes${SEP}[DSK]WaitW${SEP}[DSK]Request${SEP}"; $temp.="[DSK]QueLen${SEP}[DSK]Wait${SEP}[DSK]SvcTim${SEP}[DSK]Util${SEP}"; @@ -9525,20 +9532,21 @@ $file.="/$devname"; $file.=$devnum; $file.="/ports"; - @ports=ls($file); $maxPorts=scalar(@ports) if scalar(@ports)>$maxPorts; foreach $port (@ports) { $port=~/(\d+)/; $port=$1; + $link=cat("$file/$1/link_layer"); $state=cat("$file/$1/state"); $state=~/.*: *(.+)/; - $portState=($1 eq 'ACTIVE') ? 1 : 0; + $portState=($link="InfiniBand" && $1 eq 'ACTIVE') ? 1 : 0; $HCAPorts[$NumHCAs][$port]=$portState; + $HCAOpaV4[$NumHCAs][$port]=(-e "$file/$port/counters") ? 1 : 0; if ($portState) { - print " OFED Port: $port ID: $HCAId[$NumHCAs]\n" if $debug & 2; + print " IB Device: $devname$devnum OFED Port: $port ID: $HCAId[$NumHCAs] OpaV4: $HCAOpaV4[$NumHCAs][$port]\n" if $debug & 2; $HCANames.=":$port"; $activePorts++; }