Subversion Repositories DevTools

Rev

Rev 4456 | Rev 5300 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1038 dpurdie 1
#! /usr/bin/perl
2
########################################################################
3
# Copyright (C) 2011 Vix-ERG Limited, All rights reserved
4
#
5
# Module name   : blatDaemon.pl
6
# Module type   :
7
# Compiler(s)   : Perl
8
# Environment(s):
9
#
10
# Description   :
11
#
12
# Usage         :   ARGV[0] - Path to config file for this instance
13
#
14
#......................................................................#
15
 
16
require 5.008_002;
17
use strict;
18
use warnings;
19
use Getopt::Long;
20
use File::Basename;
1040 dpurdie 21
use Data::Dumper;
22
use File::Spec::Functions;
1038 dpurdie 23
use POSIX ":sys_wait_h";
24
use File::Temp qw/tempfile/;
25
 
26
use FindBin;                                    # Determine the current directory
27
use lib "$FindBin::Bin/lib";                    # Allow local libraries
28
 
29
use Utils;
30
use StdLogger;                                  # Log to sdtout
31
use Logger;                                     # Log to file
32
 
33
#
34
#   Database interface
35
#   Pinched from jats and modified so that this software is not dependent on JATS
36
#
37
use IO::Handle;
38
use JatsRmApi;
39
use DBI;
40
 
41
#
42
#   Globals
43
#
44
my $logger = StdLogger->new();                  # Stdout logger. Only during config
45
my $name = basename( $ARGV[0]);
46
   $name =~ s~.conf$~~;
47
my $now = 0;
3515 dpurdie 48
my $tar = 'tar';
49
my $gzip = 'gzip';
1038 dpurdie 50
my $tagDirTime = 0;
51
my $lastDirScan = 0;
52
my $lastReleaseScan = 0;
1040 dpurdie 53
my $releaseScanMode = 0;
54
my $lastTagListScan = 0;
1038 dpurdie 55
my $transferred;
56
my $mtimeConfig = 0;
57
my $conf;
58
my $extraPkgs;
1040 dpurdie 59
my $excludePkgs;
60
my %releaseData;
3515 dpurdie 61
my $comError = 0;
1038 dpurdie 62
 
63
#
64
#   Describe config uration parameters
65
#
66
my %cdata = (
67
    '.ignore'         => {'pkg\.(.+)' => 'pkgs' },
1048 dpurdie 68
    'piddir'          => {'mandatory' => 1      , 'fmt' => 'dir'},
69
    'sleep'           => {'default'   => 5      , 'fmt' => 'period'},
70
    'dpkg_archive'    => {'mandatory' => 1      , 'fmt' => 'dir'},
71
    'logfile'         => {'mandatory' => 1      , 'fmt' => 'vfile'},
72
    'logfile.size'    => {'default'   => '1M'   , 'fmt' => 'size'},
73
    'logfile.count'   => {'default'   => 9      , 'fmt' => 'int'},
74
    'verbose'         => {'default'   => 0      , 'fmt' => 'int'},
75
    'user'            => {'mandatory' => 1      , 'fmt' => 'text'},
76
    'hostname'        => {'mandatory' => 1      , 'fmt' => 'text'},
3847 dpurdie 77
    'sshport'         => {'default'   => 0      , 'fmt' => 'int'},
1048 dpurdie 78
    'identity'        => {'mandatory' => 1      , 'fmt' => 'file'},
79
    'bindir'          => {'mandatory' => 1      , 'fmt' => 'text'},
80
    'tagdir'          => {'mandatory' => 1      , 'fmt' => 'dir'},
81
    'forcedirscan'    => {'default'   => 100    , 'fmt' => 'period'},
82
    'tagage'          => {'default'   => '10m'  , 'fmt' => 'period'},
83
    'tagListUpdate'   => {'default'   => '1h'   , 'fmt' => 'period'},
84
    'synctime'        => {'default'   => '2h'   , 'fmt' => 'period'},
85
    'syncretry'       => {'default'   => '5m'   , 'fmt' => 'period'},
86
    'allProjects'     => {'default'   => 0      , 'fmt' => 'bool'},
4456 dpurdie 87
    'allArchive'      => {'default'   => 0      , 'fmt' => 'bool'},
1048 dpurdie 88
    'project'         => {'mandatory' => 0      , 'fmt' => 'int_list'},
89
    'release'         => {'mandatory' => 0      , 'fmt' => 'int_list'},
90
    'writewindow'     => {'default'   => '3h'   , 'fmt' => 'period'},
91
    'maxpackages'     => {'default'   => 5      , 'fmt' => 'int'},
92
    'deletePackages'  => {'default'   => 0      , 'fmt' => 'bool'},
93
    'deleteImmediate' => {'default'   => 0      , 'fmt' => 'bool'},
94
    'deleteAge'       => {'default'   => 0      , 'fmt' => 'period'},
95
    'packageFilter'   => {'default'   => undef  , 'fmt' => 'text'},
96
    'active'          => {'default'   => 1      , 'fmt' => 'bool'},
1038 dpurdie 97
);
98
 
99
 
100
#
101
#   Read in the configuration
102
#       Set up a logger
103
#       Write a pidfile - thats not used
104
readConfig();
105
Utils::writepid($conf);
106
$logger->logmsg("Starting...");
107
sighandlers($conf);
108
 
109
#
110
#   Main processing loop
111
#   Will exit when terminated by parent
112
#
3847 dpurdie 113
while (1 )
1038 dpurdie 114
{
115
    $logger->verbose3("Processing");
116
    $now = time();
1040 dpurdie 117
 
1038 dpurdie 118
    $transferred = {};
119
    readConfig();
1048 dpurdie 120
    if ( $conf->{'active'} )
121
    {
122
        processReleaseList();
123
        processTags();
124
        maintainTagList();
125
    }
1040 dpurdie 126
    %releaseData = ();
127
 
1038 dpurdie 128
    sleep( $conf->{'sleep'} );
1050 dpurdie 129
 
130
    #
131
    #   Reap any and all dead children
132
    #
133
    my $kid;
134
    do {
135
        $kid = waitpid(-1, WNOHANG);
136
    } while ( $kid > 0 );
3847 dpurdie 137
 
138
    #   If my PID file ceases to be, then exit the daemon
139
    #   Used to force daemon to restart
140
    #
141
    unless ( -f $conf->{'pidfile'} )
142
    {
143
        $logger->logmsg("Terminate. Pid file removed");
144
        last;
145
    }
1038 dpurdie 146
}
147
$logger->logmsg("Child End");
148
exit 0;
149
 
150
#-------------------------------------------------------------------------------
151
# Function        : readConfig
152
#
153
# Description     : Re read the config file if it modification time has changed
154
#
155
# Inputs          : Nothing
156
#
1289 dpurdie 157
# Returns         : 0       - Config not read
158
#                   1       - Config read
159
#                             Config file has changed
1038 dpurdie 160
#
161
sub readConfig
162
{
163
    my ($mtime) = Utils::mtime($ARGV[0]);
1289 dpurdie 164
    my $rv = 0;
165
 
1038 dpurdie 166
    if ( $mtimeConfig != $mtime )
167
    {
168
        $logger->logmsg("Reading config file: $ARGV[0]");
169
        $mtimeConfig = $mtime;
170
        my $errors;
171
        ($conf, $errors) = Utils::readconf ( $ARGV[0], \%cdata );
172
        if ( scalar @{$errors} > 0 )
173
        {
174
            warn "$_\n" foreach (@{$errors});
175
            die ("Config contained errors\n");
176
        }
177
 
178
        #
179
        #   Reset some information
180
        #   Create a new logger
181
        #
182
        $logger = Logger->new($conf);
183
        $conf->{logger} = $logger;
184
        $conf->{'pidfile'} = $conf->{'piddir'} . '/' . $name . '.pid';
185
        $logger->verbose("Log Levl: $conf->{verbose}");
186
 
187
        #
188
        #   Extract extra package config
189
        #
190
        $extraPkgs = {};
1040 dpurdie 191
        $excludePkgs = {};
1038 dpurdie 192
        while (my($key, $data) = each ( %{$conf->{pkgs}} ))
193
        {
3846 dpurdie 194
            if ( $data eq 'EXCLUDE' ) {
1040 dpurdie 195
                $excludePkgs->{$key} = 1;
196
                $logger->verbose("Exclude Pkg: $key");
3846 dpurdie 197
 
198
            } elsif ( $data eq 'ALL' ) {
199
                foreach my $pver (getPackageVersions($key))
200
                {
201
                    $extraPkgs->{$key}{$pver} = 1;
202
                    $logger->verbose("Extra Pkg: $key -> $pver");
203
                }
204
            } else {
1040 dpurdie 205
                $extraPkgs->{$key}{$data} = 1;
206
                $logger->verbose("Extra Pkg: $key -> $data");
207
            }
1038 dpurdie 208
        }
1046 dpurdie 209
 
1048 dpurdie 210
        $logger->verbose("Filter Packages: " . $conf->{'packageFilter'})
211
            if ( defined $conf->{'packageFilter'} );
212
 
3847 dpurdie 213
        $logger->warn("Non standard ssh port: " . $conf->{'sshport'})
214
            if ( $conf->{'sshport'} );
215
 
1048 dpurdie 216
        $logger->warn("Transfer session configured as not active")
217
            unless ( $conf->{'active'} );
218
 
219
        $logger->warn("Transfer all projects packages")
1050 dpurdie 220
            if ( $conf->{'allProjects'} );
4456 dpurdie 221
        $logger->warn("Transfer entire package archive")
222
            if ( $conf->{'allArchive'} );
1048 dpurdie 223
 
4456 dpurdie 224
 
1046 dpurdie 225
        #
226
        #   When config is read force some actions
227
        #       - Force tagList to be created
1050 dpurdie 228
        #       - Force release scan
1048 dpurdie 229
        $lastTagListScan = 0;
1050 dpurdie 230
        $lastReleaseScan = 0;
1289 dpurdie 231
        $rv = 1;
1038 dpurdie 232
    }
1289 dpurdie 233
    return $rv;
1038 dpurdie 234
}
235
 
236
 
237
#-------------------------------------------------------------------------------
238
# Function        : processReleaseList
239
#
240
# Description     : Process the release list
241
#                       Determine if its time to process release list
242
#                       Determine release list
243
#                       Determine release content
244
#                       Determine new items
245
#
246
# Inputs          : None
247
#
248
# Returns         : Nothing
249
#
250
sub processReleaseList
251
{
252
    #
1044 dpurdie 253
    #   Is Release List Processing active
254
    #   Can configure blat to disable release sync
255
    #   This will then allow 'new' packages to be sent
256
    #
257
    if ( $conf->{maxpackages} == 0 || $conf->{'synctime'} <= 0)
258
    {
259
        $logger->verbose2("processReleaseList disabled");
260
        return;
261
    }
262
 
263
    #
1038 dpurdie 264
    #   Time to perform the scan
265
    #   Will do at startup and every time period there after
266
    #
1040 dpurdie 267
    my $wtime = $releaseScanMode ? $conf->{'syncretry'} : $conf->{'synctime'};
268
    return unless ( $now > ($lastReleaseScan + $wtime ));
1038 dpurdie 269
    $logger->verbose("processReleaseList");
270
    $lastReleaseScan = $now;
1040 dpurdie 271
    $releaseScanMode = 1;                                   # Assume error
1038 dpurdie 272
 
273
    #
274
    #   Get list of packages from Remote site
275
    #   Invoke a program on the remote site and parse the results
276
    #
277
    #   Returned data looks like:
1042 dpurdie 278
    #   1141792602 GMT(Wed Mar  8 04:36:42 2006) [DL] ishieldmodules/11.5.0.cots
1038 dpurdie 279
    #   
280
    #
281
    my $remotePkgList;
282
    my $ph;
1040 dpurdie 283
    my $tgt_cmd = "$conf->{'bindir'}/get_plist.pl";
3515 dpurdie 284
    my $ssh_cmd = sshCmd($tgt_cmd);
1038 dpurdie 285
 
286
    $logger->verbose2("processReleaseList:ssh_cmd:$ssh_cmd");
287
    open ($ph, "$ssh_cmd |");
288
    while ( <$ph> )
289
    {
290
        chomp;
1042 dpurdie 291
        if ( parsePkgList($_, \%{$remotePkgList} ) )
1038 dpurdie 292
        {
293
            $logger->verbose2("processReleaseList:Data: $_");
294
        }
295
        else
296
        {
297
            $logger->warn("processReleaseList:Bad Data: $_");
298
        }
299
    }
300
    close ($ph);
301
    $logger->verbose("processReleaseList:End: $?");
3515 dpurdie 302
    LogTxError ($?);
1038 dpurdie 303
    if ( $? != 0 )
304
    {
305
        $logger->warn("Cannot retrieve package list: $?");
306
        return;
307
    }
3515 dpurdie 308
 
1042 dpurdie 309
#Utils::DebugDumpData ("remotePkgList", $remotePkgList);
4456 dpurdie 310
 
1038 dpurdie 311
    #
312
    #   Determine the set of packages in the releases to be transferred
4456 dpurdie 313
    # 
314
    my $pkgList;
315
    if ( $conf->{'allArchive'} )
1040 dpurdie 316
    {
4456 dpurdie 317
        #   Examine entire archive
318
        #
319
        $pkgList = getArchiveList();
1040 dpurdie 320
    }
4456 dpurdie 321
    else
322
    {
323
        #   Examine Releases
324
        #
325
        my @rlist = getReleaseList();
326
        unless ( @rlist )
327
        {
328
            $logger->verbose2("No Releases to Process");
329
            return;
330
        }
331
        $pkgList = getPkgList(@rlist);
332
    }
1038 dpurdie 333
 
334
    #
335
    #   Append extra packages
336
    #   These are packages that are specifically named by the user
337
    #
338
    #   Note: If there are symbolic links, then the target of the
339
    #         link is treated used as the package name
340
    #
341
    #         Symlink MUST be within the same directory
3846 dpurdie 342
    #           Used to transfer jats2_current
1038 dpurdie 343
    #
344
    my $pkgLink;
345
    while ( (my ($pname, $pvers)) = each %{$extraPkgs} ) {
346
        while ( (my ($pver, $pdata) ) = each %{$pvers} ) {
347
 
1040 dpurdie 348
            my $epath = catfile( $conf->{'dpkg_archive'} , $pname, $pver );
1038 dpurdie 349
            if ( -l $epath )
350
            {
351
                my $lver = readlink( $epath );
352
                if ( ! defined $lver )
353
                {
3846 dpurdie 354
                    $logger->warn("Can't resolve symlink: $pname, $pver");
1038 dpurdie 355
                    next;
356
                }
357
 
358
                if ( $lver =~ m ~/~ )
359
                {
360
                    $logger->warn("Won't resolve symlink: $pname, $pver, $lver");
361
                    next;
362
                }
363
                $pkgLink->{$pname}{$pver} = $lver;
364
                $pdata = $pver;
365
                $pver = $lver;
366
            }
367
 
368
            $logger->verbose2("Add extra package: $pname, $pver, $pdata");
369
            $pkgList->{$pname}{$pver} = $pdata;
370
        }
371
    }
372
 
1040 dpurdie 373
    #
374
    #   If there are no packages to process, then assume that this is an error
375
    #   condition. Retry the operation soon.
376
    #
377
    unless ( keys %{$pkgList} )
378
    {
379
 
380
        $logger->verbose2("No packages to process");
381
        return;
382
    }
383
 
1038 dpurdie 384
#    while ( (my ($pname, $pvers)) = each %{$pkgList} )
385
#    {
386
#        while ( (my ($pver, $ptime) ) = each %{$pvers} )
387
#        {
388
#            print "L-- $pname, $pver, $ptime \n";
389
#
390
#        }
391
#    }
392
 
393
    #
1040 dpurdie 394
    #   Delete Excess Packages
1038 dpurdie 395
    #       Packages not required on the target
1042 dpurdie 396
    #           KLUDGE: Don't delete links to packages
397
    #           Don't delete packages marked for deletion
1038 dpurdie 398
    #
399
    my $excessPkgList;
1048 dpurdie 400
    my $excessPkgListCount = 0;
1038 dpurdie 401
    if ( $conf->{deletePackages} )
402
    {
403
        while ( (my ($pname, $pvers)) = each %{$remotePkgList} )
404
        {
405
            while ( (my ($pver, $pdata) ) = each %{$pvers} )
406
            {
407
                if ( !exists $pkgList->{$pname}{$pver} )
408
                {
409
                    if ( exists $pkgLink->{$pname}{$pver} )
410
                    {
411
                        $logger->verbose2("Keep Excess package-link: ${pname}/${pver}");
412
                        next;
413
                    }
1040 dpurdie 414
 
415
                    if ( exists $excludePkgs->{$pname} )
416
                    {
417
                        $logger->verbose2("Keep Excluded package: ${pname}");
418
                        next;
419
                    }
420
 
1042 dpurdie 421
                    if ( exists $pdata->{deleted} )
422
                    {
423
                        if ( $conf->{deleteAge} )
424
                        {
425
                            if ( $pdata->{deleted} <= $conf->{deleteAge} )
426
                            {
427
                                $logger->verbose2("Already marked for future age deletion: ${pname}/${pver}, $pdata->{deleted}");
428
                                next;
429
                            }
430
                            $pdata->{FORCEDELETE} = 1;
431
                        }
432
 
433
                        if ( !$conf->{deleteImmediate} )
434
                        {
435
                            $logger->verbose2("Already marked for deletion: ${pname}/${pver}");
436
                            next;
437
                        }
438
                    }
439
 
440
                    #
441
                    #   Force deletion
442
                    #       deleteImmediate mode
443
                    #       target is a broken link
444
                    #
445
                    $pdata->{FORCEDELETE} = 1
446
                        if ($conf->{deleteImmediate} || $pdata->{broken});
447
 
1038 dpurdie 448
                    $excessPkgList->{$pname}{$pver} = $pdata;
1048 dpurdie 449
                    $excessPkgListCount++;
1038 dpurdie 450
                    $logger->verbose("Excess package: ${pname}/${pver}");
451
                }
1050 dpurdie 452
#                else
453
#                {
454
#                        $logger->verbose3("Retain package: ${pname}/${pver}");
455
#                }
1038 dpurdie 456
            }
457
        }
458
    }
459
 
460
    #
461
    #   Process the remote list and the local list
462
    #   The remote time-stamp is the modification time of the packages descpkg file
463
    #
464
    #   Mark for transfer packages that
1040 dpurdie 465
    #       Are in the local set but not the remote set
1038 dpurdie 466
    #       Have a different time stamp
467
    #
468
    #   Ignore packages not in the local archive
469
    #   Ignore packages that don't have a descpkg
470
    #   Ignore packages that are writable - still being formed
471
    #
472
    my $needPkgList;
1048 dpurdie 473
    my $needPkgListCount = 0;
474
    my $filteredCount = 0;
475
    my $missingCount = 0;
476
    my $writableCount = 0;
477
    my $excludeCount = 0;
1038 dpurdie 478
    while ( (my ($pname, $pvers)) = each %{$pkgList} )
479
    {
1040 dpurdie 480
        #
481
        #   Ignore excluded packages
482
        #
1048 dpurdie 483
        if ( exists $excludePkgs->{$pname} )
484
        {
485
            $excludeCount++;
486
            next;
487
        }
1040 dpurdie 488
 
1048 dpurdie 489
        #
490
        #   Ignore packages that are filtered out
491
        #
492
        if ( defined $conf->{'packageFilter'} )
493
        {
494
            unless ( $pname =~ m~$conf->{'packageFilter'}~ )
495
            {
496
                $logger->verbose3("Filtering out: ${pname}");
497
                $filteredCount++;
498
                next;
499
            }
500
        }
501
 
1038 dpurdie 502
        while ( (my ($pver, $pdata) ) = each %{$pvers} )
503
        {
1042 dpurdie 504
            my $tmtime = $remotePkgList->{$pname}{$pver}{time} || 0;
1038 dpurdie 505
 
506
            # Package is present in both list
1040 dpurdie 507
            my ($mtime, $mode) = Utils::mtime( catfile( $conf->{'dpkg_archive'} , $pname, $pver, 'descpkg' ));
1038 dpurdie 508
            if ( $mtime == 0 )
509
            {
510
                # PackageVersion not in local archive (at least the descpkg file is not)
511
                # Skip now - will pick it up later
512
                $logger->verbose("Package not in dpkg_archive: $pname, $pver");
1048 dpurdie 513
                $missingCount++;
1038 dpurdie 514
                next;
515
            }
516
 
517
            if ( $mode & 0222 )
518
            {
519
                # Descpkg file is writable
520
                # Package may be in the process of being created
1048 dpurdie 521
                # If the package has been writable for a long time, then
1038 dpurdie 522
                # consider for transfer
523
                my $age = $now - $mtime;
524
                if ( $age < ($conf->{'writewindow '} || 600) )
525
                {
526
                    $logger->verbose("Package is writable: $pname, $pver, ", $now - $mtime);
1048 dpurdie 527
                    $writableCount++;
1038 dpurdie 528
                    next;
529
                }
530
            }
531
 
532
            if ( $mtime != $tmtime )
533
            {
534
                # Package not present on target, or timestamps differ
535
                $logger->verbose("Package Needs to be transferred: $pname, $pver, $mtime, $tmtime");
536
                $needPkgList->{$pname}{$pver} = $pdata;
1048 dpurdie 537
                $needPkgListCount++;
1038 dpurdie 538
                next;
539
            }
540
        }
541
    }
542
 
1048 dpurdie 543
 
1038 dpurdie 544
    #
545
    #   Debug output only
546
    #   Display what we need to transfer
547
    #
548
    if ( $conf->{verbose} > 2 )
549
    {
550
        while ( (my ($pname, $pvers)) = each %{$needPkgList} )
551
        {
552
            while ( (my ($pver, $pdata) ) = each %{$pvers} )
553
            {
554
                $logger->verbose("Need to transfer: $pname, $pver, $pdata");
555
            }
556
        }
557
    }
1048 dpurdie 558
    if ( $conf->{verbose}  )
559
    {
560
        $logger->verbose("Packages to transfer: $needPkgListCount");
561
        $logger->verbose("Packages to delete: $excessPkgListCount");
562
        $logger->verbose("Packages filtered out: $filteredCount");
563
        $logger->verbose("Packages missing: $missingCount");
564
        $logger->verbose("Packages still writable: $writableCount");
565
        $logger->verbose("Packages excluded: $excludeCount");
566
    }
1038 dpurdie 567
 
568
    #
569
    #   Time to do the real work
570
    #   Transfer packages and delete excess packages
571
    #   Note: Perform the transfers first
572
    #         Limit the number of packages processed in one pass
573
    #
574
    my $txcount = $conf->{maxpackages};
575
 
576
    #
577
    #   Transfer packages that we have identified
578
    #
579
    send_pkgs:
580
    while ( (my ($pname, $pvers)) = each %{$needPkgList} )
581
    {
582
        while ( (my ($pver, $pdata) ) = each %{$pvers} )
583
        {
584
            if ( --$txcount <= 0 )
585
            {
1050 dpurdie 586
                $logger->warn("Max transfer count exceeded: $needPkgListCount transfer remaining");
1038 dpurdie 587
                $lastReleaseScan = 0;
588
                last send_pkgs;
589
            }
1289 dpurdie 590
 
591
            if ( readConfig() )
592
            {
593
                $logger->warn("Config file changed");
594
                $lastReleaseScan = 0;
595
                $txcount = 0;
596
                last send_pkgs;
597
            }
598
 
1044 dpurdie 599
            transferPackage ($pname, $pver, $pdata);
1048 dpurdie 600
            $needPkgListCount--;
1038 dpurdie 601
        }
602
    }
603
 
604
    #
605
    #   Delete packages that have been identified as excess
606
    #
607
    delete_pkgs:
608
    while ( (my ($pname, $pvers)) = each %{$excessPkgList} )
609
    {
610
        while ( (my ($pver, $pdata) ) = each %{$pvers} )
611
        {
612
            if ( --$txcount <= 0 )
613
            {
1050 dpurdie 614
                $logger->warn("Max transfer count exceeded: $excessPkgListCount deletion remaining");
1038 dpurdie 615
                $lastReleaseScan = 0;
616
                last delete_pkgs;
617
            }
1289 dpurdie 618
 
619
            if ( readConfig() )
620
            {
621
                $logger->warn("Config file changed");
622
                $lastReleaseScan = 0;
623
                $txcount = 0;
624
                last send_pkgs;
625
            }
626
 
1044 dpurdie 627
            deletePackage ($pname, $pver, $pdata);
1048 dpurdie 628
            $excessPkgListCount--;
1038 dpurdie 629
        }
630
    }
631
 
632
    #
633
    #   Send package list to the target
634
    #
635
    sendPackageList ($pkgList);
1040 dpurdie 636
 
637
    #
638
    #   On a successful transfer
639
    #       Force tag processing
640
    #       Set scan Mode to normal
641
    #
642
    $tagDirTime = 0;
643
    $releaseScanMode = 0;
1038 dpurdie 644
}
645
 
646
#-------------------------------------------------------------------------------
647
# Function        : sendPackageList
648
#
649
# Description     : Transfer package list to the target
650
#
651
# Inputs          : $pkgList            - Ref to hash of package names and versions
652
#
1040 dpurdie 653
# Returns         : Nothing
654
#                   Don't really care about any errors from this process
655
#                   Its not essential
1038 dpurdie 656
#
657
sub sendPackageList
658
{
659
    my ($pkgList) = @_;
660
    my ($fh, $filename) = tempfile( "/tmp/blat.$$.XXXX", SUFFIX => '.txt');
661
    $logger->verbose("sendPackageList:TmpFile: $filename");
662
 
663
    #
664
    #   Create a temp file with data
665
    #
666
    foreach my $pname ( sort keys %{$pkgList} )
667
    {
668
        foreach my $pver ( sort keys %{$pkgList->{$pname}} )
669
        {
670
            print $fh "$pname/$pver\n";
671
        }
672
    }
673
    close $fh;
674
 
675
    #
676
    #   Transfer to target
677
    #   Create the process pipe to transfer the file
678
    #   gzip the file and pipe the result through a ssh session to the target machine
3515 dpurdie 679
    #   gzip -c filename |  ssh  ... "./receive_file filename"
1038 dpurdie 680
    #
681
    my $ph;
3515 dpurdie 682
    my $gzip_cmd = "$gzip --no-name -c \"$filename\"";
1040 dpurdie 683
    my $tgt_cmd = "$conf->{'bindir'}/receive_file \"ArchiveList\"";
3515 dpurdie 684
    my $ssh_cmd = sshCmd($tgt_cmd);
1038 dpurdie 685
 
686
    $logger->verbose2("sendPackageList:gzip_cmd:$gzip_cmd");
687
    $logger->verbose2("sendPackageList:tgt_cmd:$tgt_cmd");
688
    $logger->verbose2("sendPackageList:ssh_cmd:$ssh_cmd");
689
 
690
    open ($ph, "$gzip_cmd | $ssh_cmd |");
691
    while ( <$ph> )
692
    {
693
        chomp;
694
        $logger->verbose2("sendPackageList:Data: $_");
695
    }
696
    close ($ph);
3515 dpurdie 697
    unlink $filename;
1038 dpurdie 698
    $logger->verbose("sendPackageList:End: $?");
3515 dpurdie 699
    LogTxError ($?);
1038 dpurdie 700
}
701
 
702
 
703
#-------------------------------------------------------------------------------
704
# Function        : getPkgList
705
#
706
# Description     : Determine a set of package versions within the list
707
#                   of provided releases
708
#
709
# Inputs          : @rlist              - A list of releases to examine
710
#
711
# Returns         : Ref to a hask of package versions
712
#
713
sub getPkgList
714
{
715
    my %pdata;
716
    my $RM_DB;
717
    connectRM(\$RM_DB);
718
    $logger->verbose("getPkgList");
719
 
720
    #
721
    #   Determine the releases that are in this project
722
    #   Build up an sql query
723
    #
724
    my @m_rlist;
725
    push @m_rlist,"rc.RTAG_ID=$_" foreach ( @_ );
726
    my $m_rlist = join ' OR ', @m_rlist;
1048 dpurdie 727
    my $m_sqlstr = "SELECT DISTINCT pv.PV_ID, pkg.PKG_NAME, pv.PKG_VERSION, pv.IS_DEPLOYABLE" .
1038 dpurdie 728
                    " FROM RELEASE_MANAGER.RELEASE_CONTENT rc, RELEASE_MANAGER.PACKAGE_VERSIONS pv, RELEASE_MANAGER.PACKAGES pkg" .
729
                    " WHERE ( $m_rlist ) AND rc.PV_ID = pv.PV_ID AND pv.PKG_ID = pkg.PKG_ID" .
730
                    " ORDER by PKG_NAME DESC";
731
    $logger->verbose3("getPkgList:Sql:$m_sqlstr");
732
 
733
    my $sth = $RM_DB->prepare($m_sqlstr);
734
    if ( defined($sth) )
735
    {
736
        if ( $sth->execute( ) )
737
        {
738
            if ( $sth->rows )
739
            {
740
                while (my @row = $sth->fetchrow_array )
741
                {
742
                    $logger->verbose2("getPkgList:Data:@row");
743
                    $pdata{$row[1]}{$row[2]} = 1;
744
                }
745
            }
746
            $sth->finish();
747
        }
748
    }
749
    else
750
    {
751
        $logger->warn("getPkgList: SQL Prepare failure");
752
    }
1050 dpurdie 753
 
754
   disconnectRM(\$RM_DB);
1038 dpurdie 755
   return \%pdata;
756
}
757
 
758
 
759
#-------------------------------------------------------------------------------
760
# Function        : getReleaseList
761
#
762
# Description     : Determine the list of releases to be proccessed
1040 dpurdie 763
#                   From:
764
#                       Convert projects to a list of releases
765
#                       Configured list of releases
1038 dpurdie 766
#
767
# Inputs          : None
768
#
769
# Returns         : A list of releases to be processed
770
#
771
sub getReleaseList
772
{
773
    my $RM_DB;
774
    my %rlist;
1048 dpurdie 775
    my $m_sqlstr;
1038 dpurdie 776
    $logger->verbose("getReleaseList");
777
 
778
    #
1040 dpurdie 779
    #   Cache data
780
    #   Only for one cycle of the main loop
781
    #
782
    if ( exists $releaseData{getReleaseList} )
783
    {
784
        $logger->verbose3("getReleaseList:Cache hit");
785
        return @{$releaseData{getReleaseList}};
786
    }
787
 
788
    #
1048 dpurdie 789
    #   All projects
1038 dpurdie 790
    #
1048 dpurdie 791
    if ( $conf->{'allProjects'} )
1038 dpurdie 792
    {
1048 dpurdie 793
        $m_sqlstr = "SELECT rt.RTAG_ID" .
794
                    " FROM RELEASE_MANAGER.RELEASE_TAGS rt" .
1050 dpurdie 795
                    " WHERE rt.OFFICIAL != 'A'";
796
                    #" AND rt.OFFICIAL != 'Y'";
1048 dpurdie 797
    }
798
    else
799
    {
1038 dpurdie 800
        #
1048 dpurdie 801
        #   Convert list of projects into a list of releases
1038 dpurdie 802
        #
1048 dpurdie 803
        my @plist = split /[,\s]+/, $conf->{'project'} || '';
804
        if ( @plist )
805
        {
806
            #
807
            #   Determine the releases that are in this project
808
            #   Build up an sql query
809
            #
810
            my @m_plist;
811
            push @m_plist,"PROJ_ID=$_" foreach ( @plist );
812
            my $m_plist = join ' OR ', @m_plist;
813
            $m_sqlstr = "SELECT rt.RTAG_ID" .
814
                        " FROM RELEASE_MANAGER.RELEASE_TAGS rt" .
815
                        " WHERE ( $m_plist ) AND rt.OFFICIAL != 'A' AND rt.OFFICIAL != 'Y'";
816
        }
817
    }
1038 dpurdie 818
 
1048 dpurdie 819
    if ( defined $m_sqlstr )
820
    {
1038 dpurdie 821
        $logger->verbose3("getReleaseList:Sql:$m_sqlstr");
1048 dpurdie 822
        connectRM(\$RM_DB);
1038 dpurdie 823
        my $sth = $RM_DB->prepare($m_sqlstr);
824
        if ( defined($sth) )
825
        {
826
            if ( $sth->execute( ) )
827
            {
828
                if ( $sth->rows )
829
                {
830
                    while (my @row = $sth->fetchrow_array )
831
                    {
832
                        $logger->verbose2("getReleaseList:Data:@row");
833
                        $rlist{$row[0]} = 1;
834
                    }
835
                }
836
                $sth->finish();
837
            }
838
        }
839
        else
840
        {
841
            $logger->warn("getReleaseList: SQL Prepare failure");
842
        }
1050 dpurdie 843
        disconnectRM(\$RM_DB);
1038 dpurdie 844
    }
845
 
846
    #
847
    #   Add in the user specified list of releases
848
    #
849
    my @rlist = split /[,\s]+/, $conf->{'release'} || '';
850
    $rlist{$_} = 1 foreach(@rlist);
851
 
852
    #
853
    #   Sort for pretty display only
854
    #
1040 dpurdie 855
    @{$releaseData{getReleaseList}} = sort {$a <=> $b} keys %rlist;
856
 
857
    return @{$releaseData{getReleaseList}};
1038 dpurdie 858
}
859
 
1040 dpurdie 860
#-------------------------------------------------------------------------------
3846 dpurdie 861
# Function        : getPackageVersions
862
#
863
# Description     : Get the list of package-versions available in the package
864
#                   store.
865
#
866
# Inputs          : pkgName             - The package name
867
#
868
# Returns         : Array of versions
869
#
870
sub getPackageVersions
871
{
872
    my ($pkgName) = @_;
873
    my @versionList;
874
 
875
    my $pkgDir = catfile($conf->{'dpkg_archive'} , $pkgName );
876
    my $dh;
877
 
878
    unless (opendir($dh, $pkgDir))
879
    {
880
        $logger->warn ("Can't opendir $pkgDir: $!");
881
        return @versionList;
882
    }
883
 
884
    #
885
    #   Process each entry
886
    #   Ignore those that start with a .
887
    #
888
    while (my $version = readdir($dh) )
889
    {
890
        next if ( $version =~ m~^\.~ );
891
        my $file = catfile($pkgDir, $version);
892
 
893
        next unless ( -d $file );
894
 
895
        push @versionList, $version;
896
        $logger->verbose3("getPackageVersions: $pkgName, $version");
897
    }
898
    closedir $dh;
899
    return @versionList;
900
}
901
 
902
#-------------------------------------------------------------------------------
4456 dpurdie 903
# Function        : getArchiveList 
904
#
905
# Description     : Get the entire set of package versions in the archive
906
#
907
# Inputs          : 
908
#
909
# Returns         : Ref to a hask of package versions
910
#
911
sub getArchiveList
912
{
913
    my $pkgDir = $conf->{'dpkg_archive'};
914
    my %archiveList;
915
    my $dh;
916
    my @pkgList;
917
 
918
    unless (opendir($dh, $pkgDir))
919
    {
920
        $logger->warn ("Can't opendir $pkgDir: $!");
921
        return \%archiveList;
922
    }
923
 
924
    #
925
    #   Process each entry
926
    #   Ignore those that start with a .
927
    #   Ignore files
928
    #
929
    while (my $pkgName = readdir($dh) )
930
    {
931
        next if ( $pkgName =~ m~^\.~ );
932
        my $file = catfile($pkgDir, $pkgName);
933
 
934
        next unless ( -d $file );
935
        $logger->verbose3("getArchiveList: $pkgName");
936
        push @pkgList, $pkgName;
937
    }
938
    closedir $dh;
939
 
940
    #   Now get the package versions
941
    #       Sort for pretty display
942
    foreach my $pname (sort @pkgList)
943
    {
944
        foreach my $pver (getPackageVersions($pname))
945
        {
946
            $archiveList{$pname}{$pver} = 1;
947
        }
948
    }
949
 
950
    return \%archiveList;
951
}
952
 
953
#-------------------------------------------------------------------------------
1040 dpurdie 954
# Function        : maintainTagList
955
#
956
# Description     : Maintain a data structure for the maintenance of the
957
#                   tags directory
958
#
959
# Inputs          : None
960
#
961
# Returns         : Nothing
962
#
963
sub maintainTagList
964
{
965
    #
966
    #   Time to perform the scan
967
    #   Will do at startup and every time period there after
968
    #
969
    return unless ( $now > ($lastTagListScan + $conf->{tagListUpdate} ));
970
    $logger->verbose("maintainTagList");
971
    $lastTagListScan = $now;
1038 dpurdie 972
 
1040 dpurdie 973
    #
974
    #   Get list of things
975
    #
976
    my %config;
4457 dpurdie 977
    if ($conf->{'allArchive'} )
978
    {
979
        $config{allArchive} = 1
980
    }
981
    elsif ($conf->{'allProjects'} )
982
    {
983
        $config{allProjects} = 1;
984
    }
985
    else
986
    {
987
        %{$config{projects}} = map { $_ => 1 } split (/[,\s]+/, $conf->{'project'} || '');
988
        %{$config{releases}} = map { $_ => 1 } getReleaseList();
989
    }
1040 dpurdie 990
 
991
    #
992
    #   Save data
993
    #
994
    my $dump =  Data::Dumper->new([\%config], [qw(*config)]);
995
#print $dump->Dump;
996
#$dump->Reset;
997
 
998
    #
999
    #   Save config data
1000
    #
1001
    my $conf_file = catfile( $conf->{'tagdir'},'.config' );
1002
    $logger->verbose3("maintainTagList: Writting $conf_file");
1003
 
1004
    my $fh;
1005
    open ( $fh, '>', $conf_file ) or $logger->err("Can't create $conf_file: $!");
1006
    print $fh $dump->Dump;
1007
    close $fh;
1008
}
1009
 
1010
 
1038 dpurdie 1011
#-------------------------------------------------------------------------------
1012
# Function        : processTags
1013
#
1014
# Description     : Process tags and send marked package versions to the target
1015
#                       Determine if new tags are present
1016
#                       Process each tag
1017
#
1018
# Inputs          : None
1019
#
1020
# Returns         : Nothing
1021
#
1022
sub processTags
1023
{
1024
    #
1025
    #   Determine if new tags are present by examining the time
1026
    #   that the directory was last modified.
1027
    #
1028
    #   Allow for a forced scan to catch packages that did not transfer
1029
    #   on the first attempt
1030
    #
1031
    my ($mtime) = Utils::mtime($conf->{'tagdir'} );
1032
    if ( ($mtime > $tagDirTime) || ($now > ($lastDirScan + $conf->{'forcedirscan'})) )
1033
    {
1042 dpurdie 1034
        $logger->verbose2("processTags: ",$conf->{'tagdir'}, $mtime - $tagDirTime, $now - $lastDirScan);
1038 dpurdie 1035
        $tagDirTime = $mtime;
1036
        $lastDirScan = $now;
1037
 
1038
        my $dh;
1039
        unless (opendir($dh, $conf->{'tagdir'}))
1040
        {
1041
            $logger->warn ("can't opendir $conf->{'tagdir'}: $!");
1042
            return;
1043
        }
1044
 
1045
        #
1046
        #   Process each entry
1047
        #   Ignore those that start with a .
1048
        #
1049
        while (my $tag = readdir($dh) )
1050
        {
1051
            next if ( $tag =~ m~^\.~ );
1052
            my $file = "$conf->{'tagdir'}/$tag";
1042 dpurdie 1053
            $logger->verbose3("processTags: $file");
1054
 
1038 dpurdie 1055
            next unless ( -f $file );
1056
            next if ( $tag  eq 'ReleaseList' );
1057
 
1058
            if ( $tag =~ m~(.+)::(.+)~  )
1059
            {
1060
                my $package = $1;
1061
                my $version = $2;
1062
                if ( transferPackage( $package, $version ))
1063
                {
1064
                    unlink $file;
1065
                }
1066
                else
1067
                {
1068
                    my ($mtime) = Utils::mtime( $file );
1069
                    if ( $now - $mtime > $conf->{'tagage'} )
1070
                    {
1071
                        $logger->warn ("Delete unsatisfied tag: $tag");
1072
                        unlink $file;
1073
                    }
1074
                }
1075
            }
1076
        }
1077
        closedir $dh;
1078
    }
1079
}
1080
 
1081
#-------------------------------------------------------------------------------
1082
# Function        : transferPackage
1083
#
1084
# Description     : Transfer specified package to target system
1085
#
1086
# Inputs          : $pname          - Name of the package
1087
#                   $pver           - Package version
1088
#                   $plink          - (optional) Symlink in same package
1089
#
1090
# Returns         : true    - Package transferred
1091
#                   false   - Package not transferred
1092
#
1093
sub transferPackage
1094
{
1095
    my ($pname, $pver, $plink ) = @_;
1096
    my $rv = 0;
1097
    $logger->logmsg("transferPackage: @_");
1098
 
1099
    #
1040 dpurdie 1100
    #   Do not transfer excluded files
1101
    #
1102
    if ( exists $excludePkgs->{$pname} )
1103
    {
1048 dpurdie 1104
        $logger->warn("transferPackage: Excluded package not transferred: $pname, $pver");
1040 dpurdie 1105
        return 1;
1106
    }
1048 dpurdie 1107
 
1040 dpurdie 1108
    #
1048 dpurdie 1109
    #   Apply package filter
1110
    #
1111
    if ( defined $conf->{'packageFilter'} )
1112
    {
1113
        unless ( $pname =~ m~$conf->{'packageFilter'}~ )
1114
        {
1115
            $logger->warn("transferPackage: Filtered out package not transferred: $pname, $pver");
1116
            return 1;
1117
        }
1118
    }
1119
 
1120
    #
1038 dpurdie 1121
    #   plink of 1 is not a symlink
1122
    #
1123
    $plink = undef if ( defined($plink) && $plink eq '1' );
1124
 
1125
    #
1126
    #   If its been transferred in the current scan, then
1127
    #   indicate that all is well
1128
    #
1129
    if ( $transferred->{$pname}{$pver}  )
1130
    {
1131
        $logger->verbose("transferPackage: Already transferred");
1132
        return 1;
1133
    }
1134
 
1040 dpurdie 1135
    my $sfile = catfile( $conf->{'dpkg_archive'} , $pname, $pver );
1038 dpurdie 1136
    unless ( -d $sfile )
1137
    {
1138
        $logger->warn("transferPackage:Package not found: $pname, $pver");
1139
        return $rv;
1140
    }
1141
 
1142
    #
4456 dpurdie 1143
    #   Create the process pipe to transfer the package
1038 dpurdie 1144
    #   Tar the directory and pipe the result through a ssh session to
1145
    #   the target machine
3515 dpurdie 1146
    #   $tar -czf - -C "$dpkg/${pname}/${pver}" . |  ssh  ... "./receive_package pname pver"
1038 dpurdie 1147
    #
1148
    my $ph;
3515 dpurdie 1149
    my $tar_cmd = "$tar -czf - -C \"$sfile\" .";
1038 dpurdie 1150
    my $tgt_opts = defined($plink) ? "\"-L$plink\"" : '';
1040 dpurdie 1151
    my $tgt_cmd = "$conf->{'bindir'}/receive_package $tgt_opts \"$pname\" \"$pver\"";
3515 dpurdie 1152
    my $ssh_cmd = sshCmd($tgt_cmd);
1038 dpurdie 1153
 
1154
    $logger->verbose2("transferPackage:tar_cmd:$tar_cmd");
1155
    $logger->verbose2("transferPackage:tgt_cmd:$tgt_cmd");
1156
    $logger->verbose2("transferPackage:ssh_cmd:$ssh_cmd");
1157
 
1158
    open ($ph, "$tar_cmd | $ssh_cmd |");
1159
    while ( <$ph> )
1160
    {
1161
        chomp;
1162
        $logger->verbose2("transferPackage:Data: $_");
1163
    }
1164
    close ($ph);
1165
    $logger->verbose("transferPackage:End: $?");
1166
    if ( $? == 0 )
1167
    {
1168
        #
1169
        #   Mark has having been transferred in the current cycle
1170
        #
1171
        $transferred->{$pname}{$pver} = 1;
1172
        $rv = 1;
1173
    }
1174
    else
1175
    {
1176
        $logger->warn("transferPackage:Transfer Error: $pname, $pver, $?");
1177
    }
3515 dpurdie 1178
    LogTxError ($?);
1038 dpurdie 1179
    return $rv;
1180
}
1181
 
1182
#-------------------------------------------------------------------------------
1183
# Function        : deletePackage
1184
#
1185
# Description     : Delete specified package to target system
1186
#
1187
# Inputs          : $pname          - Name of the package
1188
#                   $pver           - Package version
1042 dpurdie 1189
#                   $pdata          - Hash of extra data
1038 dpurdie 1190
#
1191
# Returns         : true    - Package transferred
1192
#                   false   - Package not transferred
1193
#
1194
sub deletePackage
1195
{
1042 dpurdie 1196
    my ($pname, $pver, $pdata ) = @_;
1038 dpurdie 1197
    my $rv = 0;
1042 dpurdie 1198
    $logger->logmsg("deletePackage: $pname, $pver");
1038 dpurdie 1199
 
1200
    #
1201
    #   Create the process pipe to delete the package
3515 dpurdie 1202
    #   ssh  ... "./delete_package ${rx_opts} \"$pname\" \"$pver\""
1038 dpurdie 1203
    #
1204
    my $ph;
1042 dpurdie 1205
    my $flags = $pdata->{FORCEDELETE}  ? '' : ' -T';
1206
    my $tgt_cmd = "$conf->{'bindir'}/delete_package $flags \"$pname\" \"$pver\"";
3515 dpurdie 1207
    my $ssh_cmd = sshCmd($tgt_cmd);
1038 dpurdie 1208
 
1040 dpurdie 1209
    $logger->verbose2("deletePackage:tgt_cmd:$tgt_cmd");
1210
    $logger->verbose2("deletePackage:ssh_cmd:$ssh_cmd");
1038 dpurdie 1211
 
1212
    open ($ph, "$ssh_cmd |");
1213
    while ( <$ph> )
1214
    {
1215
        chomp;
1216
        $logger->verbose2("deletePackage:Data: $_");
1217
    }
1218
    close ($ph);
1219
    $logger->verbose("deletePackage:End: $?");
1220
    if ( $? == 0 )
1221
    {
1222
        $rv = 1;
1223
    }
1224
    else
1225
    {
1226
        $logger->warn("deletePackage:Error: $pname, $pver, $?");
1227
    }
3515 dpurdie 1228
    LogTxError ($?);
1038 dpurdie 1229
    return $rv;
1230
}
1231
 
3515 dpurdie 1232
#-------------------------------------------------------------------------------
1233
# Function        : sshCmd
1234
#
1235
# Description     : Generate a ssh based command
1236
#
1237
# Inputs          : Target command
1238
#
1239
# Returns         : An shh command string
1240
#
1241
sub sshCmd
1242
{
1243
    my ($tgt_cmd) = @_;
3847 dpurdie 1244
    my $sshPort = '';
1245
    $sshPort = "-p $conf->{'sshport'}"
1246
        if ($conf->{'sshport'});
1247
 
1248
    return "ssh -o \"BatchMode yes\" -i $conf->{'identity'} ${sshPort} $conf->{'user'}\@$conf->{'hostname'} \"$tgt_cmd\" 2>&1";
3515 dpurdie 1249
}
1038 dpurdie 1250
 
3515 dpurdie 1251
 
1038 dpurdie 1252
#-------------------------------------------------------------------------------
1042 dpurdie 1253
# Function        : parsePkgList
1254
#
1255
# Description     : Parse one line from a pkgList
1256
#                   Lines are multiple item="data" items
1257
#
1258
# Inputs          : $line                   - Line of data
1259
#                   $hashp                  - Ref to hash to populate
1260
#
1261
# Returns         : A hash of data items
1262
#
1263
sub parsePkgList
1264
{
1265
    my ($line, $hashp) = @_;
1266
    my $rv;
1267
 
1268
    while ( $line =~ m~\s*(.+?)="(.+?)"~ )
1269
    {
1270
        $rv->{$1} = $2;
1271
        $line = $';
1272
    }
1273
#Utils::DebugDumpData ("parsePkgList", $rv);
1274
 
1275
    my $pname = $rv->{pname};
1276
    my $pver =  $rv->{pver};
1277
    return undef unless ( $pname && $pver );
1278
 
1279
    delete $rv->{pname};
1280
    delete $rv->{pver};
1281
    delete $rv->{GMT};
1282
 
1283
    $hashp->{$pname}{$pver} = $rv;
1284
    return $hashp;
1285
}
1286
 
1287
 
1288
#-------------------------------------------------------------------------------
1038 dpurdie 1289
# Function        : sighandlers
1290
#
1291
# Description     : Install signal handlers
1292
#
1293
# Inputs          : $conf           - System config
1294
#
1295
# Returns         : Nothing
1296
#
1297
sub sighandlers
1298
{
1299
	my $conf = shift;
1300
	my $logger = $conf->{logger};
1301
 
1302
	$SIG{TERM} = sub {
1303
		# On shutdown
1304
		$logger->logmsg('Received SIGTERM. Shutting down....' );
1305
		unlink $conf->{'pidfile'} if (-f $conf->{'pidfile'});
1306
		exit 0;
1307
	};
1308
 
1309
	$SIG{HUP} = sub {
1310
		# On logrotate
1311
		$logger->logmsg('Received SIGHUP.');
1312
		$logger->rotatelog();
1313
	};
1314
 
1315
	$SIG{USR1} = sub {
1316
		# On Force Archive Sync
1317
		$logger->logmsg('Received SIGUSR1.');
1046 dpurdie 1318
        $lastReleaseScan = 0;
1319
        $lastTagListScan = 0;
1038 dpurdie 1320
	};
1321
 
1322
    $SIG{__WARN__} = sub { $logger->warn("@_") };
1323
    $SIG{__DIE__} = sub { $logger->err("@_") };
1324
}
1325
 
1326
#-------------------------------------------------------------------------------
3515 dpurdie 1327
# Function        : LogTxError
1328
#
1329
# Description     : Detect restoration of communication and log such
1330
#                   Don't log failures as the user will do that
1331
#
1332
# Inputs          : $state                  - 0 - All is well
1333
#                                           !0  - Error
1334
#
1335
# Returns         : Nothing
1336
#
1337
sub LogTxError
1338
{
1339
    my ($state) = $@;
1340
    if ( $state )
1341
    {
1342
        $comError++;
1343
    }
1344
    elsif ( $comError )
1345
    {
1346
        $logger->warn("Communication Restored");
1347
        $comError = 0;
1348
    }
1349
}
1350
 
1351
 
1352
#-------------------------------------------------------------------------------
1038 dpurdie 1353
# Function        : Error, Verbose, Warning
1354
#
1355
# Description     : Support for JatsRmApi
1356
#
1357
# Inputs          : Message
1358
#
1359
# Returns         : Nothing
1360
#
1361
sub Error
1362
{
1363
    $logger->err("@_");
1364
}
1365
 
1366
sub Verbose
1367
{
1042 dpurdie 1368
    $logger->verbose2("@_");
1038 dpurdie 1369
}
1370
 
1371
sub Warning
1372
{
1373
    $logger->warn("@_");
1374
}
1375
 
1376
 
1377
 
1378