Syntax Notes |
A Simple (non-syslog) Configuration File |
A Configuration File With Syslog Support |
A Name-Cache File |
1. Whitespace is ignored.
2. All keywords are non-case-sensitive as are all hostnames.
3. The first "pound-sign" ('#') seen anywhere in a line starts a comment to end-of-line.
4. Lines can be concatenated by putting a backslash character ('\') at the end of a line.
5. DBD2 is designed to work with Syslogd2. It therefore "understands" "extra" facilities, and all time-formats used by Syslogd2 output.
6. DBD2 uses the unmarked "global" section at the top of the file to define all inputs and global values.
(a) Each option keyword must start a new line.
(b) Many option keywords can be used more than once.
(c) When conflicts occur, the lowest line-number "wins".
7. DBD2 understands most of the commands and syntax from Syslogd2. This is to simplify configuration via commonalities between the two projects. (It also facilitates code re-use and simplifies concept-transitions between the two projects.). DBD2 does not allow hyphens before the input / global options or multiple options on the same logical line.
(a) Input option (connection-spec)
(b) ThreadMaps option
(c) Defaults option
(d) stderr / logfile (DBD2's "logfile" is an alias for Syslogd2's "stdout")
(e) Enable/Disable options
(f) No quoted values are used anywhere in the configuration file and all equal-signs are options except where specifically indicated otherwise in documentation.
(g) DBD2 fully supports spaces and tabs in all filenames and directory specifications
8. Major differences between DBD2 and Syslogd2 syntax:
(a) DBD2 defaults to TCP (streaming) connections for input and output. This allows for detection of failed connections which is central to the proper operation of the dbcl client code.
(b) DBD2 is new-concept code, therefore no attempt can be made to be "backwards compatible" with anything. DBD2 makes no effort to "merge" file-content and command-line input as was done with Syslogd2 because of the nature of the DBD input values.
(c) DBD2 uses output sections delimited by "[<section-name>]" headers instead of single lines to define output destinations. -- Reasons for this change will become apparent when reviewing an actual configuration file.
(d) DBD2 has far fewer CAP_* options
(e) New global options in DBD2:
(1) var <sql-number> <comma-separated-list-of-names>
[a] The non-negative <sql-number> must be globally unique.
[b] The list of names is used to match against incoming dbcl input.
[c] If the name starts with a dollar-sign ('$'), the name (and <sql-number> refer to an envelope-variable.
(2) $: keyword to define a "system-variable"
(3) timestring: User-customizable string defining time-values. using strftime() format values. (See man page for strftime())
9. Components of an Output Specification:
(a) An output-id to identify this output section. This is a single letter from 'a' to 'z' (non-case-sensitive).
(b) A section-name to use in error-reporting.
(c) An optional description to remind the administrator of the details of this section.
(d) A host-connection-spec to specify how to connect to this database or file. This connection-spec variant includes:
(1) The location (IP hostname/IP address/Linux Socket-path) to the database connection or file.
(2) Protocol to use (stream or datagram).
(3) Threadpool membership and threadcount values.
(4) IP port and address-family (IPv4 or IPv6) if an IP socket connection: Uid, gid and mode if a file specification.
(5) If MySql-type connection-spec: ConnectTimeout, ReadTimeout, WriteTimeout, Charset and <Max-Connection-Count>
(e) A destination-type: one of "file", "mysql" or "dbi".
(f) A database name, user-id and password (Mysql and DBI) output-types only.
(g) An optional log-spec (logfile=) for output-specific logging if output local logging is enabled. If omitted, the global logfile will be used.
(h) A list of templates that specify the sql to use when inserting / updating data in this database.
template = 1 = insert into mytable (f1, f2, f3, f4) values ($1, '$2', '$3', $4);
(1) Each template is assigned a non-negative numeric <template-id>. The <database-letter,template-id> forms a <template-spec> such as "a1" and a string of <template-specs> forms a <template-string> ("a1b1c8")
(2) Each template value is a combination of literal characters and sql-variables ('$<sql-number>') where <sql-number> is keyed into the global var declarations.
(i) Output-spec-specific boolean values to be enable'd or disable'd for this output-specification.
stderr = /Users/ed/Documents/C Projects/nms/dbd/test/derr, uid=ed, gid=staff, mode=666, level = 7 logfile = /Users/ed/Documents/C Projects/nms/dbd/test/dout, uid=ed,gid=staff,level=7,mode=666 # Config file for dbd (database dump) program. '#' in column 1 is a comment # All Global settings go above the database-definition blocks # [<block-name>] # id=# -> must be a postive (non-negative) integer # host=<hostname> # database=<database-name> # port=<port-spec> # where <port-spec> can be file-pathname, host.port,v=46 as per syslogd2 # type=(mysql) # username=<username> # password=<password> defaults = inputfieldcount 8, globalmsgcount 500 # defaults = templatenames = temp;t defaults = spooldir=/var/spool/dbd,maxspoolfilesize=3G,readers = 3,workers = 4,writers = 4,connections = 4, lines=20, outputlines = 20 defaults = domainname=sampledomain, hostname=macbook-pro defaults = configdir=/Users/ed/Documents/C Projects/nms/dbd/test,socketcheckintervals = 30,60,120,300,600,1200,3600,0, cachefile = cachefile.dat # spooldir=/var/spool/dbd,maxspoolfilesize=3G,readers = 4,workers = 8,writers = 2,connections = 4 # configdir=/Users/ed/Documents/C Projects/nms/dbd/test,socketcheckintervals = 30,60,120,300,600,1200,3600,0, cachefile = cachefile.dat threads type=input,id=0,readers=1,q=15; type=worker,id=2,w=1, l=25 ; type=input,id=1,r=1,q=0; type=worker,id=1,l=25 ; type=input,id=3; type =output,connections=1,wowrkers=1,lines=25 threads = type=worker,id=4,w=1, l=25 ; type=output,id=5,writers=1,l=25,c=3 ; type=output,id=6,w=1,l=25,c=1 selfaddress = fec0:2::90 # strftime does not define % values for digits, so digits can be used for my own extensions. # Specifically, there is no default for specifying rfc5424 time format offset of HH:MM rather than %z (HHMM) so a leading modifier of %1 may be assigned to this option. # a prefix of %1 causes a trailing timezone offset field of %z to be modified to HH:MM instead of the default offset display of HHMM. timestring = 100 = Test time 1: %w %b %e %H:%M:%S %Y timestring = 200 = Test time 2: %Y-%b-%dT%H:%M:%SZ timestring = 300 = Test time 3: %Y-%b=%dT%H:%M:%S%z timestring = 400 = %1Test time 4: %Y-%b=%dT%H:%M:%S%z timestring = 500 = Test time 5: %Y%m%d%H%M%S input = 127.0.0.1,port=1025,v=4, q = 2 input = *,port=1036,v=4 , q = 2 input = *,port=1037,v=4, id=7 , q = 5 input = 127.0.0.1,port=1038,v=6, id=3, s input = 192.168.2.50,port=1038,v=6, id=3, s input = localhost,port=1039,v=4, id=3, s input = fec0:2::90,port=1040,v=6, id=3, s input = /Users/ed/Documents/C Projects/nms/dbd/test/inputsocket1 input = /Users/ed/Documents/C Projects/nms/syslog/test/testoutputsocket_01 input = /Users/ed/Documents/C Projects/nms/syslog/test/testoutputsocket_02, id=2, s enable idq # inet, dns, alt-queueing enable inet = yes, dns, log, cache # disable IPv6 extra3.notice a1b2z2 extra17.garbage z1r2 extra17.debug z1r2 extra4.* r3 extra5.* s3 extra6.* r3s3 # The 'var[n]' lines assign identifying names to the variables that are used in the templates. # The 't[n]' lines are the actual template commands (unique to each database type) that accomplish each command. # # In this sample database, the 'start_time' and 'end_time' are the date/time the jobs start and end or when the db_client app was launched to record each start/end # the 'log_start_time' and 'log_end_time' fields are the actual database logging times. the (log_*_time - *_time) values are the # seconds it took for the message to be # transmitted from the cluster client to the database table. # The format for a dynamic variable definition is: # '$' [=] <Column 1> [=] <Column 2 (A comma-separated list)> [=] <Column 3 (A omma-separated list of variable-names)> # # System Variable Name Definitions # Column 1: select a 'field' or 'category' to operate on. # 'time' # 'host' # 'facpri' # 'msg' # 'tempalatekey' # 'RawInput' # # Column 2 (option 'a'): If you selected the 'RawInput' field or the 'templatekey' field, enter 'raw' for 'Column 2' and proceed to Column 3 # # Colmnn 2 (option 'b'): the options selected below will form a comma-separated list that will comprise 'Column 2' # Select a source: # 'source' -- the host that sent us the input-string containing the variable we are defining # 'server' -- the host that is running dbd2 (this host).. # 'syslog' -- field content will be taken from fields in the incoming syslog messages-string. # # Select a data format: # 'raw' : use whatever format uses less processing to obtain. # // for time+server, this will be 'nuermic+GMTTime # // for time+source, this is undefined -- this program cannot determine the time on a remote server. # // for time+syslog, this is whatever is in the message's 'time' field # // for host+server, this will be whatever is returned from gethostname(). (string) # // for host+source, this will be the IP address of the host that sent us this message. (numeric) # // for host+syslog, this will be whatever is in the message's 'hostname' field # // 'facpri' is undefined for all but syslog sources. # // for facpri+syslog, this will be the combined numeric value taken from the syslog message (numeric-facility * 8) + numeric-priority # // 'msg' is undefined for all but syslog sources. # // for msg+syslog, this will be the actual message string taken from the syslog input. No options other than 'raw' are supported. # // 'templatekey' string source is auto-detected based on input msg type and is not dependent on the source of the message. # # -- OR -- # # (select a specific data format) # 'int', 'numeric' : Use numeric values/formats instead of string values/formats. # 'string' : Use string values/formats for display # # If you selected 'time' + 'string', then Select a string sub-format: # # 'db', 'dbTime', 'stringtime': yyyymmddHHMMSS # 'syslog', 'syslogtime : "mmm dd HH:MM:SS yyyy" (Note that true syslog time format omits the year field) # 'rfc', 'rfctime' : rfc 1339 internet time format # # Depending on the selection for Column 1, select additional options: # # Column 1 is 'time': # 'local' : local-time zone # 'gmt' : GMT timezone (zulu time) # # Column 1 is 'host': # if Column2 selected 'string' format: # 'hostonly', 'nodomain' : strip off all domain elements if present (do DNS lookup if required) # 'fqdn' : full hostname.domain format -- do dns lookup if required # # if Column2 selected 'int' or 'numeric' format: # 'ipv4' : display IPv4 address if available, regardless of whether message was received via IPv4 or IPv6. # 'ipv6' : display IPv6 address if available, regardless of whether message was received via IPv4 or IPv6. # Failure to specify an IP family will invoke the global "IPPreference" value of either '4' or '6 to determine which IP Address-family to display if both are available. # # Column 1 is 'facpri': default is to display either the combined numeric value or "<facility-name>.<priority-name>" as a string value. # 'nofacility', 'nofac' : suppress the facility portion of either the number or the string. # 'nopriority', 'nopri' : suppores the priority portion of either the number or the string. Numeric facilities will range from 0 ('kern') to 23 ('local7') or higher for 'extra' facilities. # # Column 3 is simply a comma-separated list of system-variable names. These will be referenced later by the 'var' keyword to create an actual variable from this definition. # #------------------------ # host fields #------------------------ $ host source, string, raw = sourceStrRaw $ host source,string,hostonly = sourceHost $ host source,string,fqdn = sourceFqdn $ host source,int,raw = sourceIntRaw $ host source,int,ipv4 = sourceIPv4 $ host source,numeric,ipv6 = sourceIPv6 $ host server,string,raw = serverStrRaw $ host server,string,nodomain = serverhost $ host server,string,fqdn = serverfqdn $ host server,int,raw = serverIntRaw $ host server,int,ipv4 = serverIPv4 $ host server,numeric,ipv6 = serverIPv6 $ host syslog,string,raw = syslogStrRaw $ host syslog,string,nodomain = sysloghost $ host syslog,string,fqdn = syslogfqdn $ host syslog,int,raw = syslogIntRaw $ host syslog,int,ipv4 = syslogIPv4 $ host syslog,numeric,ipv6 = syslogIPv6 #------------------------ # facpri fields #------------------------ $ facpri int = intfacpri $ facpri int,nopriority = intfac $ facpri int,nofacility = intpri $ facpri int,nofacility,nopriority = nointpri $ facpri string = strfacpri $ facpri string,nopriority = strfac $ facpri string,nofacility= 5= strpri $ facpri string,nofacility,nopriority = nostrpri # $ = time = server,gmttime,int = now, servertime #------------------------ # time fields #------------------------ $ = time = syslog,gmttime,int = timeutc # $ = time = syslog,gmttime,string,db = dbutc $ = time = syslog,gmttime,string = 300 = dbutc #$ time syslog,gmttime,string,rfc = rfcutc $ time syslog,gmttime,string=200 = rfcutc $ time syslog,gmttime,string,syslogtime = syslogutc $ time syslog,local,int = timelocal $ time syslog,local,string,db = dblocal $ time syslog,local,string,rfc = rfclocal $ time syslog,local,string,syslogtime = sysloglocal #------------------------ # raw syslog fields #------------------------ $ facpri syslog,raw = CombinedFacPri $ time syslog,raw = rawtime $ host syslog,raw = RawSyslogHost $ msg syslog,raw = SyslogMsg #------------------------ # raw syslog vs source input #------------------------ $ rawinput syslog,raw = RawSyslogInput $ rawinput = source,raw = rawinput # one entry per logical line -- numeric range is positive integers. # incoming data is "name = value", sql uses $<sql-index> to access <value> # ************************************************************************************************************ # C A U T I O N: If the user-defined sql-index numbers are NOT sequential, processing will fail because: # NULL ptrs in the SQL2VarArray will cause premature end-of-loop # Out-of-squence entries will exceed array boundaries when using sqlIndex as an array-index search-key. # Because sql-indices need not be wequential, a random-access key for sql-index -> array-index mappings cannot be used. # ************************************************************************************************************ # If CAP_SYSLOG is defined and syslog is configured, the 1st 4 fields in this list should be (in order) as follows (variable names and sql values can vary as desired): # This will allow the hardcoded syslog parsed values to work properly and to have their raw values accessible with simple names. # # # To access raw syslog fields, define & assign dynamic variables with source='syslog', options= "rawinpug" # The format for a variable definition is: # 'var' [=] <numeric sql-index> [=] <comma-separated list of variable names> # # To access and use a dynamic-variable definition, prepend a '$' to the dynamic-variable name(s) when specifying the name-list in (column 3). # The <sql-index> field (column 2) is preceded by a '$' in the template field to access the contents of that variable. # # if template string 1 in database z is: "insert into jobs fields (owner,jobid,start_time) values ('$14', $3, '$9');" # and an input string of -t=z1 "user=Tom Jones, start_time=`date \"+%s\"`, job = 156" will result in the following query string being sent to the database: # insert into jobs fields (owner,jobid,start_time) values ('Tome Jones', 156, '<date in numeric format>'); # # The names in column 3 are used to match against incoming <name = value> pairs in incoming data strings. # # To process syslog messages, the selector-string + template key is defined separately. # The selector-string is matched against the message facility+priority values in the message to obtain a template key-string. # A dynamic definition of <field>+"syslog+raw" will access the raw syslog data field components. Other options will provide customized formatting for the contents of those field. # var 14=username, user, uid, owner,o var 3 =jobid, job,id var 11 = member, cluster_member, m var 10 time,t var 9 start_time var 8 end_time var 7 $servertime var 6 $source_fqdn var 5 $server_host var 4 $server_fqdn var 13 $sourceip var 2 $ymdhmslocalintsyslog var 1 $rawinput var 27 $rawsysloghostcalc # var 28 $rawsysloginput var 29 $rawtimecalc var 30 $rfctime var 31 $ymdhmslocalint # ------------------------------------- # Variables declared for testing host variations -- Template z13 # ------------------------------------- # extra0.=debug z13 var 100 $sourceStrRaw var 101 $sourceHost var 102 $sourcefqdn var 105 $sourceIntRaw var 106 $sourceIPv4 var 107 $sourceIPv6 var 110 $serverStrRaw var 111 $serverHost var 112 $serverfqdn var 115 $serverIntRaw var 116 $serverIPv4 var 117 $serverIPv6 var 120 $syslogStrRaw var 121 $syslogHost var 122 $syslogfqdn var 125 $syslogIntRaw var 126 $syslogIPv4 var 127 $syslogIPv6 # ------------------------------------- # Variables declared for testing facpri variations -- Template z11 # ------------------------------------- # extra0.=info z11 var 30 $intfacpri var 31 $intfac var 32 $intpri var 33 $nointpri var 35 $strfacpri var 36 $strfac var 37 $strpri var 38 $nostrpri # ------------------------------------- # Variables declared for testing time manipulation -- Template z10 # ------------------------------------- extra0.=notice z12 var 40 $timeutc var 41 $dbutc var 42 $rfcutc var 43 $syslogutc var 45 $timelocal var 46 $dblocal var 47 $rfclocal var 48 $sysloglocal var 60 $servertimeutc var 61 $serverdbutc var 62 $serverrfcutc var 63 $serversyslogutc var 65 $servertimelocal var 66 $serverdblocal var 67 $serverrfclocal var 68 $serversysloglocal $ time server,gmttime,int = servertimeutc $ time server,gmttime,string,db = servertimedbutc $ time server,gmttime,string,rfc = servertimerfcutc $ time server,gmttime,string,syslogtime = servertimesyslogutc $ time server,local,int = servertimelocal $ time server,local,string,db = servertimedblocal $ time server,local,string,rfc = servertimerfclocal $ time server,local,string,syslogtime = servertimesysloglocal # ------------------------------------- # Variables declared for testing raw syslog fields -- Template z4 # ------------------------------------- # extra0.=warning = z10 # test # $ rawinput syslog,raw = RawSyslogInput var 50 $combinedFacPri var 51 $rawtime var 52 $rawsysloghost var 53 $syslogmsg var 54 $rawsysloginput # ----------------------------------------------------------------------------------------------- [testfile=z] type=file id=1 description = An initial test - and - debug database that writes to an output file for off-line database-insertion. file=/Users/ed/Documents/C Projects/nms/dbd/test/outputFile_z,uid=ed,gid=staff,mode=666 #,filter=demo filter, spoolfilemax=4g,spoolfile, sfa= 1,connections=4 enable = syslog,logfile logfile=/Users/ed/Documents/C Projects/nms/dbd/test/z.log, uid=ed,gid=staff,mode=666,level=3 template 1 insert into jobs (rawinput, dbdate, jobid,server_fqdn,server_host,source_fqdn,servertime,end_time,start_time,time,member,sourcehost,sourceip,owner) values \ ('$1','$2','$3','$4','$5','$6','$7','$8','$9','$10','$11','$12','$13','$14', '$15', [$54]); template 3 insert into jobs (jobid,owner,cluster,member,start_time,log_start_time,log_ip,log_host) values ('$2','$1','$9','$4','$5','$13','$12','$11'); template 2 update jobs set end_time=$5,log_end_time=now() where jobid=$2 and owner=$1 and cluster=$3 and member=$4 and end_time=''; template 10 Raw Syslog template: '$50','$51','$52','$53','$54' '$1' template 11 Facpri Test: [$30] [$31] [$32] [$33] [$34] [$35] [$36] [$37] [$38] [$39] template 12 Time Test: [$40] [$41] [$42] [$43] [$44] [$45] [$46] [$47] [$48] [$49] template 13 Host Test: [$100] [$101] [$102] [$103] [$104] [$105] [$106] [$107] [$108] [$109] -> [$110] [$111] [$112] [$113] [$114] [$115] [$116] [$117] [$118] [$119] -> \ [$120] [$121] [$122] [$123] [$124] [$125] [$126] [$127] [$128] [$129] # ----------------------------------------------------------------------------------------------- [testdb1] destid = r, type = mysql # host=localhost.localdomain,port=3306,version=4, ConnectTimeout = 4, WriteTimeout = 3, sf, charset=utf8 # , connections = 4 username=root # should default to 'A' with an error warning logfile=/Users/ed/Documents/C Projects/nms/dbd/test/r.log, uid=ed,gid=staff,mode=666,level=3 database = test password = root # threadpool = 1 # threads = 6 # qlines = 30 enable log,cache,dns # one entry per logical line template = 1insert into jobs (jobid,owner,cluster,member,start_time,log_start_time,log_ip,log_host) values ('$3','$14','$6','$11','$9','$10','$13','$12') template = 2update jobs set end_time=$5,log_end_time=now() where jobid=$2 and owner=$1 and cluster=$3 and member=$4 and end_time=''; template = 3 insert into test (facility, priority, date, source_host, syslog_host, msg) values ('$36','$37','$47', '$102', '$122', '$53') # client call would be: db_client server-hostname server-port "id=8 t=r1 o=edfrees id=1 member=`hostname -s` t=`date +%s`" # ----------------------------------------------------------------------------------------------- [testdb1.5] destid = s, type = mysql # host=/tmp/mysql.sock, ConnectTimeout = 4, WriteTimeout = 3, sf, charset=utf8 # , connections = 4 # spoolfile=testfile,max=6m,action=1 username=root # should default to 'A' with an error warning logfile=/Users/ed/Documents/C Projects/nms/dbd/test/s.log, uid=ed,gid=staff,mode=666,level=3 database = test password = root # threadpool = 1 # threads = 6 # qlines = 30 enable log,cache,dns # one entry per logical line template = 1insert into jobs (jobid,owner,cluster,member,start_time,log_start_time,log_ip,log_host) values ('$3','$14','$6','$11','$9','$10','$13','$12'); template = 2update jobs set end_time=$5,log_end_time=now() where jobid=$2 and owner=$1 and cluster=$3 and member=$4 and end_time=''; template = 3 insert into test2 (facility, priority, date, source_host, syslog_host, msg) values ('$36','$37','$47', '$102', '$122', '$53') # client call would be: db_client server-hostname server-port "id=8 t=s1 o=edfrees id=1 member=`hostname -s` t=`date +%s`" # ----------------------------------------------------------------------------------------------- [testdb2 = c] id=4 # same as 'threadpool' or 'threadpoolid' # tp 2 database = cms type = mysql socket = /var/lib/mysql/mysql.sock, version=4 username=root password= [testdb3 id=6 type = dbi socket = /var/lib/mysql/mysql.sock username=root password= # ----------------------------------------------------------------------------------------------- Invalid database-type [testdb4] id=9 type = mssql host=localhost.localdomain,port=3306,version=6,username=root password= database = test2 username=AnnMarie password=pwd123 # $source_host is originating cluster template 1 insert into jobs (jobid,owner,source_host,member,time,now, ip,log_start_time=now()) values ($2,'$1$3','$3','$4','$5','$13','$12'); template 2= update jobs set end_time=$5,log_end_time=now() where jobid=$2 and owner=$1 and cluster=$3 and member=$4 and end_time='';Return to top ##A Name-Cache File Return to top
# Syslogd2 and DBD2 use the same cache-file format and can share the same files. # comments follow the first '#' that can be anywhere in the line. # Blank lines or lines containing only whitespace are also considered comments since they are ignored. # The first address listed for each family will be the "official" address used in reporting & logging. Likewise, the first hostname listed will be the "offiical" name for that host. # The only rules are: # (1) every entry must be contained within one 1024-char line # (2) the first hostname in the line will be the 'official' name and the first of v4 or v6 address will be 'official' for that family. All others are CNAMES or aliases. # (3) if any line does NOT contain a hostname, the hostname will become the 1st entry in the line. cixi.sample.com 192.168.15.20 fec4:8:4:892::1049 firewall1.sample.com netscreen1.testsuite.sample.com 10.2.0.40 cixi synack.sample.com 10.1.0.30 fec4:8:4:892::200 UnixHost1.example.sample.com databaseserver.testsuite.localdomain.com synack NetScreen_Firewall2 Feb4:8:4:892::1028 10.1.0.56 10.1.0.24 10.1.0.99 10.1.0.88 fec4:8:4:892::220 NetScreen2.local.com srx3600a sxr3600a 10.1.0.19 unknown_fw.sample.com fec0:0:2:40::20 fec0:3:80:90::50 10.0.20.30 172.17.34.193 unkown_fw_alias unknown_fw6.sample.com fec0:0:2:40::21 fec0:3:80:90::51 unkown_fw_alias6 10.1.0.20 unknown_fw4.sample.com 10.0.20.31 172.17.34.194 unkown_fw_alias4 #---------------------------------------------- # format: # Each line is independent and describes one host. # Whitespace can be anywhere in the line. # Whitespace can be spaces or tabs. # The first name is the "official" (canonical) name used in reporting. All others are recorded as aliases. # The first Ipv4 address is used in reporting & comparisons. All others are recorded as aliases. # The first Ipv6 address is used in reporting & comparisons. All others are recorded as aliases. # Names, IPv4 & IPv6 addresses can be mixed in any order and any quantity. linux1.localdomain linux1 192.168.2.20 fec0:2::14