1#!/bin/sh 2 3# $FreeBSD$ 4 5# A regular expression matching the format of an RFC-5424 log line header, 6# including the timestamp up through the seconds indicator; it does not include 7# the (optional) timezone offset. 8RFC5424_FMT='^<[0-9][0-9]*>1 [0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}' 9 10# A regular expression matching the format of an RFC-3164 (traditional syslog) 11# log line header, including the timestamp. 12RFC3164_FMT='^[A-Z][a-z]{2} [ 0-9][0-9] [0-9]{2}:[0-9]{2}:[0-9]{2}' 13 14COUNT=0 15TMPDIR=$(pwd)/work 16if [ $? -ne 0 ]; then 17 echo "$0: Can't create temp dir, exiting..." 18 exit 1 19fi 20 21# Begin an individual test 22begin() 23{ 24 COUNT=`expr $COUNT + 1` 25 OK=1 26 NAME="$1" 27} 28 29# End an individual test 30end() 31{ 32 local message 33 34 if [ $OK = 1 ] 35 then 36 message='ok ' 37 else 38 message='not ok ' 39 fi 40 41 message="$message $COUNT - $NAME" 42 if [ -n "$TODO" ] 43 then 44 message="$message # TODO $TODO" 45 fi 46 47 echo "$message" 48} 49 50# Make a file that can later be verified 51mkf() 52{ 53 CN=`basename $1` 54 echo "$CN-$CN" >$1 55} 56 57# Verify that the file specified is correct 58ckf() 59{ 60 if [ -f $2 ] && echo "$1-$1" | diff - $2 >/dev/null 61 then 62 ok 63 else 64 notok 65 fi 66} 67 68# Check that a file exists 69ckfe() 70{ 71 if [ -f $1 ] 72 then 73 ok 74 else 75 notok 76 fi 77} 78 79# Verify that the specified file does not exist 80# (is not there) 81cknt() 82{ 83 if [ -r $1 ] 84 then 85 notok 86 else 87 ok 88 fi 89} 90 91# Check if a file is there, depending of if it's supposed to or not - 92# basically how many log files we are supposed to keep vs. how many we 93# actually keep. 94ckntfe() 95{ 96 curcnt=$1 97 keepcnt=$2 98 f=$3 99 100 if [ $curcnt -le $keepcnt ] 101 then 102 #echo Assuming file there 103 ckfe $f 104 else 105 #echo Assuming file NOT there 106 cknt $f 107 fi 108} 109 110# Verify that the specified file has RFC-5424 rotation messages. 111ckrfc5424() 112{ 113 local lc=$(wc -l $1 | cut -w -f2) 114 local rc=$(grep -cE "${RFC5424_FMT}" $1) 115 if [ "$lc" -eq 0 -o "$rc" -eq 0 -o "$lc" -ne "$rc" ] 116 then 117 notok 118 else 119 ok 120 fi 121} 122 123 124# Verify that the specified file has RFC-3164 rotation messages. 125ckrfc3164() 126{ 127 local lc=$(wc -l $1 | cut -w -f2) 128 local rc=$(grep -cE "${RFC3164_FMT}" $1) 129 if [ "$lc" -eq 0 -o "$rc" -eq 0 -o "$lc" -ne "$rc" ] 130 then 131 notok 132 else 133 ok 134 fi 135} 136 137 138# A part of a test succeeds 139ok() 140{ 141 : 142} 143 144# A part of a test fails 145notok() 146{ 147 OK=0 148} 149 150# Verify that the exit code passed is for unsuccessful termination 151ckfail() 152{ 153 if [ $1 -gt 0 ] 154 then 155 ok 156 else 157 notok 158 fi 159} 160 161# Verify that the exit code passed is for successful termination 162ckok() 163{ 164 if [ $1 -eq 0 ] 165 then 166 ok 167 else 168 notok 169 fi 170} 171 172# Check that there are X files which match expr 173chkfcnt() 174{ 175 cnt=$1; shift 176 if [ $cnt -eq `echo "$@" | wc -w` ] 177 then 178 ok 179 else 180 notok 181 fi 182} 183 184# Check that two strings are alike 185ckstr() 186{ 187 if [ "$1" = "$2" ] 188 then 189 ok 190 else 191 notok 192 fi 193} 194 195tmpdir_create() 196{ 197 rm -rf ${TMPDIR}/log ${TMPDIR}/alog 198 mkdir ${TMPDIR}/log ${TMPDIR}/alog 199 cd ${TMPDIR}/log 200} 201 202tmpdir_clean() 203{ 204 cd ${TMPDIR} 205 rm -rf "${TMPDIR}/log" "${TMPDIR}/alog" newsyslog.conf 206} 207 208run_newsyslog() 209{ 210 211 newsyslog -f ../newsyslog.conf -F -r "$@" 212} 213 214tests_normal_rotate() { 215 local dir ext name_postfix newsyslog_args 216 217 ext="$1" 218 dir="$2" 219 220 if [ -n "$dir" ]; then 221 newsyslog_args=" -a ${dir}" 222 name_postfix="${ext} archive dir" 223 else 224 newsyslog_args="" 225 name_postfix="${ext}" 226 fi 227 228 tmpdir_create 229 230 begin "create file ${name_postfix}" -newdir 231 run_newsyslog -C 232 ckfe $LOGFNAME 233 cknt ${dir}${LOGFNAME}.0${ext} 234 end 235 236 begin "rotate normal 1 ${name_postfix}" 237 run_newsyslog $newsyslog_args 238 ckfe ${LOGFNAME} 239 ckfe ${dir}${LOGFNAME}.0${ext} 240 cknt ${dir}${LOGFNAME}.1${ext} 241 end 242 243 begin "rotate normal 2 ${name_postfix}" 244 run_newsyslog $newsyslog_args 245 ckfe ${LOGFNAME} 246 ckfe ${dir}${LOGFNAME}.0${ext} 247 ckfe ${dir}${LOGFNAME}.1${ext} 248 cknt ${dir}${LOGFNAME}.2${ext} 249 end 250 251 begin "rotate normal 3 ${name_postfix}" 252 run_newsyslog $newsyslog_args 253 ckfe ${LOGFNAME} 254 ckfe ${dir}${LOGFNAME}.0${ext} 255 ckfe ${dir}${LOGFNAME}.1${ext} 256 ckfe ${dir}${LOGFNAME}.2${ext} 257 cknt ${dir}${LOGFNAME}.3${ext} 258 end 259 260 begin "rotate normal 4 ${name_postfix}" 261 run_newsyslog $newsyslog_args 262 ckfe ${LOGFNAME} 263 ckfe ${dir}${LOGFNAME}.0${ext} 264 ckfe ${dir}${LOGFNAME}.1${ext} 265 ckfe ${dir}${LOGFNAME}.2${ext} 266 cknt ${dir}${LOGFNAME}.4${ext} 267 end 268 269 begin "rotate normal 5 ${name_postfix}" 270 run_newsyslog $newsyslog_args 271 ckfe ${LOGFNAME} 272 ckfe ${dir}${LOGFNAME}.0${ext} 273 ckfe ${dir}${LOGFNAME}.1${ext} 274 ckfe ${dir}${LOGFNAME}.2${ext} 275 cknt ${dir}${LOGFNAME}.4${ext} 276 end 277 278 # Wait a bit so we can see if the noaction test rotates files 279 sleep 1.1 280 281 begin "noaction ${name_postfix}" 282 ofiles=`ls -Tl ${dir}${LOGFNAME}.*${ext} | tr -d '\n'` 283 run_newsyslog ${newsyslog_args} -n >/dev/null 284 ckfe ${LOGFNAME} 285 ckstr "$ofiles" "`ls -lT ${dir}${LOGFNAME}.*${ext} | tr -d '\n'`" 286 end 287 288 tmpdir_clean 289} 290 291tests_normal_rotate_keepn() { 292 local cnt dir ext name_postfix newsyslog_args 293 294 cnt="$1" 295 ext="$2" 296 dir="$3" 297 298 if [ -n "$dir" ]; then 299 newsyslog_args=" -a ${dir}" 300 name_postfix="${ext} archive dir" 301 else 302 newsyslog_args="" 303 name_postfix="${ext}" 304 fi 305 306 tmpdir_create 307 308 begin "create file ${name_postfix}" -newdir 309 run_newsyslog -C 310 ckfe $LOGFNAME 311 cknt ${dir}${LOGFNAME}.0${ext} 312 end 313 314 begin "rotate normal 1 cnt=$cnt ${name_postfix}" 315 run_newsyslog $newsyslog_args 316 ckfe ${LOGFNAME} 317 ckntfe 1 $cnt ${dir}${LOGFNAME}.0${ext} 318 cknt ${dir}${LOGFNAME}.1${ext} 319 end 320 321 begin "rotate normal 2 cnt=$cnt ${name_postfix}" 322 run_newsyslog $newsyslog_args 323 ckfe ${LOGFNAME} 324 ckntfe 1 $cnt ${dir}${LOGFNAME}.0${ext} 325 ckntfe 2 $cnt ${dir}${LOGFNAME}.1${ext} 326 cknt ${dir}${LOGFNAME}.2${ext} 327 end 328 329 begin "rotate normal 3 cnt=$cnt ${name_postfix}" 330 run_newsyslog $newsyslog_args 331 ckfe ${LOGFNAME} 332 ckntfe 1 $cnt ${dir}${LOGFNAME}.0${ext} 333 ckntfe 2 $cnt ${dir}${LOGFNAME}.1${ext} 334 ckntfe 3 $cnt ${dir}${LOGFNAME}.2${ext} 335 cknt ${dir}${LOGFNAME}.3${ext} 336 end 337 338 begin "rotate normal 3 cnt=$cnt ${name_postfix}" 339 run_newsyslog $newsyslog_args 340 ckfe ${LOGFNAME} 341 ckntfe 1 $cnt ${dir}${LOGFNAME}.0${ext} 342 ckntfe 2 $cnt ${dir}${LOGFNAME}.1${ext} 343 ckntfe 3 $cnt ${dir}${LOGFNAME}.2${ext} 344 ckntfe 4 $cnt ${dir}${LOGFNAME}.3${ext} 345 cknt ${dir}${LOGFNAME}.4${ext} 346 end 347 348 # Wait a bit so we can see if the noaction test rotates files 349 sleep 1.1 350 351 begin "noaction ${name_postfix}" 352 osum=`md5 ${dir}${LOGFNAME} | tr -d '\n'` 353 run_newsyslog ${newsyslog_args} -n >/dev/null 354 ckfe ${LOGFNAME} 355 ckstr "$osum" "`md5 ${dir}${LOGFNAME} | tr -d '\n'`" 356 end 357 358 tmpdir_clean 359} 360 361tests_time_rotate() { 362 local dir ext name_postfix newsyslog_args 363 364 ext="$1" 365 dir="$2" 366 367 if [ -n "$dir" ]; then 368 newsyslog_args="-t DEFAULT -a ${dir}" 369 name_postfix="${ext} archive dir" 370 else 371 newsyslog_args="-t DEFAULT" 372 name_postfix="${ext}" 373 fi 374 375 tmpdir_create 376 377 begin "create file ${name_postfix}" -newdir 378 run_newsyslog -C ${newsyslog_args} 379 ckfe ${LOGFNAME} 380 end 381 382 begin "rotate time 1 ${name_postfix}" 383 run_newsyslog ${newsyslog_args} 384 ckfe ${LOGFNAME} 385 chkfcnt 1 ${dir}${LOGFNAME}.*${ext} 386 end 387 388 sleep 1.1 389 390 begin "rotate time 2 ${name_postfix}" 391 run_newsyslog ${newsyslog_args} 392 ckfe ${LOGFNAME} 393 chkfcnt 2 ${dir}${LOGFNAME}.*${ext} 394 end 395 396 sleep 1.1 397 398 begin "rotate time 3 ${name_postfix}" 399 run_newsyslog ${newsyslog_args} 400 ckfe ${LOGFNAME} 401 chkfcnt 3 ${dir}${LOGFNAME}.*${ext} 402 end 403 404 sleep 1.1 405 406 begin "rotate time 4 ${name_postfix}" 407 run_newsyslog ${newsyslog_args} 408 ckfe ${LOGFNAME} 409 chkfcnt 3 ${dir}${LOGFNAME}.*${ext} 410 end 411 412 begin "noaction ${name_postfix}" 413 ofiles=`ls -1 ${dir}${LOGFNAME}.*${ext} | tr -d '\n'` 414 run_newsyslog ${newsyslog_args} -n >/dev/null 415 ckfe ${LOGFNAME} 416 ckstr "$ofiles" "`ls -1 ${dir}${LOGFNAME}.*${ext} | tr -d '\n'`" 417 end 418 419 tmpdir_clean 420} 421 422tests_rfc5424() { 423 local dir ext name_postfix newsyslog_args 424 425 ext="$1" 426 dir="$2" 427 428 if [ -n "$dir" ]; then 429 newsyslog_args=" -a ${dir}" 430 name_postfix="${ext} archive dir" 431 else 432 newsyslog_args="" 433 name_postfix="${ext}" 434 fi 435 436 tmpdir_create 437 438 begin "RFC-5424 - create file ${name_postfix}" -newdir 439 run_newsyslog -C 440 ckfe $LOGFNAME 441 cknt ${dir}${LOGFNAME}.0${ext} 442 ckfe $LOGFNAME5424 443 cknt ${dir}${LOGFNAME5424}.0${ext} 444 ckrfc3164 ${LOGFNAME} 445 ckrfc5424 ${LOGFNAME5424} 446 end 447 448 begin "RFC-5424 - rotate normal 1 ${name_postfix}" 449 run_newsyslog $newsyslog_args 450 ckfe ${LOGFNAME} 451 ckfe ${dir}${LOGFNAME}.0${ext} 452 ckfe $LOGFNAME5424 453 ckfe ${dir}${LOGFNAME5424}.0${ext} 454 ckrfc3164 ${LOGFNAME} 455 ckrfc3164 ${dir}${LOGFNAME}.0${ext} 456 ckrfc5424 ${LOGFNAME5424} 457 ckrfc5424 ${dir}${LOGFNAME5424}.0${ext} 458 end 459 460 tmpdir_clean 461} 462 463tests_p_flag_rotate() { 464 local ext 465 466 ext="$1" 467 468 tmpdir_create 469 470 begin "create file" 471 run_newsyslog -C 472 ckfe $LOGFNAME 473 cknt ${LOGFNAME}.0 474 cknt ${LOGFNAME}.0${ext} 475 end 476 477 begin "rotate p flag 1 ${ext}" 478 run_newsyslog 479 ckfe $LOGFNAME 480 ckfe ${LOGFNAME}.0 481 cknt ${LOGFNAME}.0${ext} 482 run_newsyslog 483 ckfe $LOGFNAME 484 ckfe ${LOGFNAME}.0 485 cknt ${LOGFNAME}.0${ext} 486 ckfe ${LOGFNAME}.1${ext} 487 run_newsyslog 488 ckfe $LOGFNAME 489 ckfe ${LOGFNAME}.0 490 cknt ${LOGFNAME}.0${ext} 491 ckfe ${LOGFNAME}.1${ext} 492 ckfe ${LOGFNAME}.2${ext} 493 end 494 495 tmpdir_clean 496} 497 498tests_normal_rotate_recompress() { 499 local ext 500 501 ext=".gz" 502 503 tmpdir_create 504 505 begin "create file recompress" 506 run_newsyslog -C 507 ckfe $LOGFNAME 508 cknt ${LOGFNAME}.0${ext} 509 end 510 511 begin "rotate normal 1" 512 run_newsyslog 513 ckfe $LOGFNAME 514 ckfe ${LOGFNAME}.0${ext} 515 cknt ${LOGFNAME}.1${ext} 516 end 517 518 begin "rotate recompress 1" 519 gunzip ${LOGFNAME}.0${ext} 520 ckfe ${LOGFNAME}.0 521 cknt ${LOGFNAME}.0${ext} 522 run_newsyslog 523 ckfe $LOGFNAME 524 ckfe ${LOGFNAME}.0${ext} 525 ckfe ${LOGFNAME}.1${ext} 526 end 527} 528 529echo 1..185 530mkdir -p ${TMPDIR} 531cd ${TMPDIR} 532 533LOGFNAME=foo.log 534LOGFPATH=${TMPDIR}/log/${LOGFNAME} 535 536# Log file for RFC-5424 testing 537LOGFNAME5424=foo5424.log 538LOGFPATH5424=${TMPDIR}/log/${LOGFNAME5424} 539 540# Normal, no archive dir, keep X files 541echo "$LOGFPATH 640 0 * @T00 NC" > newsyslog.conf 542tests_normal_rotate_keepn 0 543 544echo "$LOGFPATH 640 1 * @T00 NC" > newsyslog.conf 545tests_normal_rotate_keepn 1 546 547echo "$LOGFPATH 640 2 * @T00 NC" > newsyslog.conf 548tests_normal_rotate_keepn 2 549 550echo "$LOGFPATH 640 3 * @T00 NC" > newsyslog.conf 551tests_normal_rotate_keepn 3 552 553# Normal, no archive dir, keep X files, gz 554echo "$LOGFPATH 640 0 * @T00 NCZ" > newsyslog.conf 555tests_normal_rotate_keepn 0 ".gz" 556 557echo "$LOGFPATH 640 1 * @T00 NCZ" > newsyslog.conf 558tests_normal_rotate_keepn 1 ".gz" 559 560echo "$LOGFPATH 640 2 * @T00 NCZ" > newsyslog.conf 561tests_normal_rotate_keepn 2 ".gz" 562 563echo "$LOGFPATH 640 3 * @T00 NCZ" > newsyslog.conf 564tests_normal_rotate_keepn 3 ".gz" 565 566# Normal, no archive dir 567echo "$LOGFPATH 640 3 * @T00 NC" > newsyslog.conf 568tests_normal_rotate 569 570echo "$LOGFPATH 640 3 * @T00 NCZ" > newsyslog.conf 571tests_normal_rotate ".gz" 572 573echo "$LOGFPATH 640 3 * @T00 NCJ" > newsyslog.conf 574tests_normal_rotate ".bz2" 575 576echo "$LOGFPATH 640 3 * @T00 NCX" > newsyslog.conf 577tests_normal_rotate ".xz" 578 579echo "$LOGFPATH 640 3 * @T00 NCY" > newsyslog.conf 580tests_normal_rotate ".zst" 581 582# Normal, archive dir 583echo "$LOGFPATH 640 3 * @T00 NC" > newsyslog.conf 584tests_normal_rotate "" "${TMPDIR}/alog/" 585 586echo "$LOGFPATH 640 3 * @T00 NCZ" > newsyslog.conf 587tests_normal_rotate ".gz" "${TMPDIR}/alog/" 588 589echo "$LOGFPATH 640 3 * @T00 NCJ" > newsyslog.conf 590tests_normal_rotate ".bz2" "${TMPDIR}/alog/" 591 592echo "$LOGFPATH 640 3 * @T00 NCX" > newsyslog.conf 593tests_normal_rotate ".xz" "${TMPDIR}/alog/" 594 595echo "$LOGFPATH 640 3 * @T00 NCY" > newsyslog.conf 596tests_normal_rotate ".zst" "${TMPDIR}/alog/" 597 598# Time based, no archive dir 599echo "$LOGFPATH 640 3 * @T00 NC" > newsyslog.conf 600tests_time_rotate 601 602echo "$LOGFPATH 640 3 * @T00 NCZ" > newsyslog.conf 603tests_time_rotate "gz" "" 604 605echo "$LOGFPATH 640 3 * @T00 NCJ" > newsyslog.conf 606tests_time_rotate "bz2" "" 607 608echo "$LOGFPATH 640 3 * @T00 NCX" > newsyslog.conf 609tests_time_rotate "xz" "" 610 611echo "$LOGFPATH 640 3 * @T00 NCY" > newsyslog.conf 612tests_time_rotate "zst" "" 613 614# Time based, archive dir 615echo "$LOGFPATH 640 3 * @T00 NC" > newsyslog.conf 616tests_time_rotate "" "${TMPDIR}/alog/" 617 618echo "$LOGFPATH 640 3 * @T00 NCZ" > newsyslog.conf 619tests_time_rotate "gz" "${TMPDIR}/alog/" 620 621echo "$LOGFPATH 640 3 * @T00 NCJ" > newsyslog.conf 622tests_time_rotate "bz2" "${TMPDIR}/alog/" 623 624echo "$LOGFPATH 640 3 * @T00 NCX" > newsyslog.conf 625tests_time_rotate "xz" "${TMPDIR}/alog/" 626 627echo "$LOGFPATH 640 3 * @T00 NCY" > newsyslog.conf 628tests_time_rotate "zst" "${TMPDIR}/alog/" 629 630# RFC-5424; Normal, no archive dir 631echo "$LOGFPATH5424 640 3 * @T00 NCT" > newsyslog.conf 632echo "$LOGFPATH 640 3 * @T00 NC" >> newsyslog.conf 633tests_rfc5424 634 635echo "$LOGFPATH 640 3 * @T00 NCpZ" > newsyslog.conf 636tests_p_flag_rotate ".gz" 637 638echo "$LOGFPATH 640 3 * @T00 NCZ" > newsyslog.conf 639tests_normal_rotate_recompress 640 641rm -rf "${TMPDIR}" 642