Subversion Repositories DevTools

Rev

Rev 1046 | Rev 1050 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1046 Rev 1048
Line 60... Line 60...
60
#
60
#
61
#   Describe config uration parameters
61
#   Describe config uration parameters
62
#
62
#
63
my %cdata = (
63
my %cdata = (
64
    '.ignore'         => {'pkg\.(.+)' => 'pkgs' },
64
    '.ignore'         => {'pkg\.(.+)' => 'pkgs' },
65
    'piddir'          => {'mandatory' => 1    , 'fmt' => 'dir'},
65
    'piddir'          => {'mandatory' => 1      , 'fmt' => 'dir'},
66
    'sleep'           => {'default' => 5      , 'fmt' => 'period'},
66
    'sleep'           => {'default'   => 5      , 'fmt' => 'period'},
67
    'dpkg_archive'    => {'mandatory' => 1    , 'fmt' => 'dir'},
67
    'dpkg_archive'    => {'mandatory' => 1      , 'fmt' => 'dir'},
68
    'logfile'         => {'mandatory' => 1    , 'fmt' => 'vfile'},
68
    'logfile'         => {'mandatory' => 1      , 'fmt' => 'vfile'},
69
    'logfile.size'    => {'default' => '1M'   , 'fmt' => 'size'},
69
    'logfile.size'    => {'default'   => '1M'   , 'fmt' => 'size'},
70
    'logfile.count'   => {'default' => 9      , 'fmt' => 'int'},
70
    'logfile.count'   => {'default'   => 9      , 'fmt' => 'int'},
71
    'verbose'         => {'default' => 0      , 'fmt' => 'int'},
71
    'verbose'         => {'default'   => 0      , 'fmt' => 'int'},
72
    'user'            => {'mandatory' => 1    , 'fmt' => 'text'},
72
    'user'            => {'mandatory' => 1      , 'fmt' => 'text'},
73
    'hostname'        => {'mandatory' => 1    , 'fmt' => 'text'},
73
    'hostname'        => {'mandatory' => 1      , 'fmt' => 'text'},
74
    'identity'        => {'mandatory' => 1    , 'fmt' => 'file'},
74
    'identity'        => {'mandatory' => 1      , 'fmt' => 'file'},
75
    'bindir'          => {'mandatory' => 1    , 'fmt' => 'text'},
75
    'bindir'          => {'mandatory' => 1      , 'fmt' => 'text'},
76
    'tagdir'          => {'mandatory' => 1    , 'fmt' => 'dir'},
76
    'tagdir'          => {'mandatory' => 1      , 'fmt' => 'dir'},
77
    'forcedirscan'    => {'default' => 100    , 'fmt' => 'period'},
77
    'forcedirscan'    => {'default'   => 100    , 'fmt' => 'period'},
78
    'tagage'          => {'default' => '10m'  , 'fmt' => 'period'},
78
    'tagage'          => {'default'   => '10m'  , 'fmt' => 'period'},
79
    'tagListUpdate'   => {'default' => '1h'  , 'fmt' => 'period'},
79
    'tagListUpdate'   => {'default'   => '1h'   , 'fmt' => 'period'},
80
    'synctime'        => {'default' => '2h'   , 'fmt' => 'period'},
80
    'synctime'        => {'default'   => '2h'   , 'fmt' => 'period'},
81
    'syncretry'       => {'default' => '5m'   , 'fmt' => 'period'},
81
    'syncretry'       => {'default'   => '5m'   , 'fmt' => 'period'},
-
 
82
    'allProjects'     => {'default'   => 0      , 'fmt' => 'bool'},
82
    'project'         => {'mandatory' => 0    , 'fmt' => 'int_list'},
83
    'project'         => {'mandatory' => 0      , 'fmt' => 'int_list'},
83
    'release'         => {'mandatory' => 0    , 'fmt' => 'int_list'},
84
    'release'         => {'mandatory' => 0      , 'fmt' => 'int_list'},
84
    'writewindow'     => {'default' => '3h'   , 'fmt' => 'period'},
85
    'writewindow'     => {'default'   => '3h'   , 'fmt' => 'period'},
85
    'maxpackages'     => {'default' => 5      , 'fmt' => 'int'},
86
    'maxpackages'     => {'default'   => 5      , 'fmt' => 'int'},
86
    'deletePackages'  => {'default' => 0      , 'fmt' => 'bool'},
87
    'deletePackages'  => {'default'   => 0      , 'fmt' => 'bool'},
87
    'deleteImmediate' => {'default' => 0      , 'fmt' => 'bool'},
88
    'deleteImmediate' => {'default'   => 0      , 'fmt' => 'bool'},
88
    'deleteAge'       => {'default' => 0      , 'fmt' => 'period'},
89
    'deleteAge'       => {'default'   => 0      , 'fmt' => 'period'},
-
 
90
    'packageFilter'   => {'default'   => undef  , 'fmt' => 'text'},
-
 
91
    'active'          => {'default'   => 1      , 'fmt' => 'bool'},
89
);
92
);
90
 
93
 
91
 
94
 
92
#
95
#
93
#   Read in the configuration
96
#   Read in the configuration
Line 107... Line 110...
107
    $logger->verbose3("Processing");
110
    $logger->verbose3("Processing");
108
    $now = time();
111
    $now = time();
109
 
112
 
110
    $transferred = {};
113
    $transferred = {};
111
    readConfig();
114
    readConfig();
-
 
115
    if ( $conf->{'active'} )
-
 
116
    {
112
    processReleaseList();
117
        processReleaseList();
113
    processTags();
118
        processTags();
114
    maintainTagList();
119
        maintainTagList();
-
 
120
    }
115
    %releaseData = ();
121
    %releaseData = ();
116
 
122
 
117
    sleep( $conf->{'sleep'} );
123
    sleep( $conf->{'sleep'} );
118
    waitpid(-1, WNOHANG);                           # Reap dead children
124
    waitpid(-1, WNOHANG);                           # Reap dead children
119
}
125
}
Line 170... Line 176...
170
                $extraPkgs->{$key}{$data} = 1;
176
                $extraPkgs->{$key}{$data} = 1;
171
                $logger->verbose("Extra Pkg: $key -> $data");
177
                $logger->verbose("Extra Pkg: $key -> $data");
172
            }
178
            }
173
        }
179
        }
174
 
180
 
-
 
181
        $logger->verbose("Filter Packages: " . $conf->{'packageFilter'})
-
 
182
            if ( defined $conf->{'packageFilter'} );
-
 
183
 
-
 
184
        $logger->warn("Transfer session configured as not active")
-
 
185
            unless ( $conf->{'active'} );
-
 
186
 
-
 
187
        $logger->warn("Transfer all projects packages")
-
 
188
            unless ( $conf->{'allProjects'} );
-
 
189
 
175
        #
190
        #
176
        #   When config is read force some actions
191
        #   When config is read force some actions
177
        #       - Force tagList to be created
192
        #       - Force tagList to be created
178
            $lastTagListScan = 0;
193
        $lastTagListScan = 0;
179
    }
194
    }
180
}
195
}
181
 
196
 
182
 
197
 
183
#-------------------------------------------------------------------------------
198
#-------------------------------------------------------------------------------
Line 332... Line 347...
332
    #       Packages not required on the target
347
    #       Packages not required on the target
333
    #           KLUDGE: Don't delete links to packages
348
    #           KLUDGE: Don't delete links to packages
334
    #           Don't delete packages marked for deletion
349
    #           Don't delete packages marked for deletion
335
    #
350
    #
336
    my $excessPkgList;
351
    my $excessPkgList;
-
 
352
    my $excessPkgListCount = 0;
337
    if ( $conf->{deletePackages} )
353
    if ( $conf->{deletePackages} )
338
    {
354
    {
339
        while ( (my ($pname, $pvers)) = each %{$remotePkgList} )
355
        while ( (my ($pname, $pvers)) = each %{$remotePkgList} )
340
        {
356
        {
341
            while ( (my ($pver, $pdata) ) = each %{$pvers} )
357
            while ( (my ($pver, $pdata) ) = each %{$pvers} )
Line 380... Line 396...
380
                    #
396
                    #
381
                    $pdata->{FORCEDELETE} = 1
397
                    $pdata->{FORCEDELETE} = 1
382
                        if ($conf->{deleteImmediate} || $pdata->{broken});
398
                        if ($conf->{deleteImmediate} || $pdata->{broken});
383
 
399
 
384
                    $excessPkgList->{$pname}{$pver} = $pdata;
400
                    $excessPkgList->{$pname}{$pver} = $pdata;
-
 
401
                    $excessPkgListCount++;
385
                    $logger->verbose("Excess package: ${pname}/${pver}");
402
                    $logger->verbose("Excess package: ${pname}/${pver}");
386
                }
403
                }
387
            }
404
            }
388
        }
405
        }
389
    }
406
    }
Line 399... Line 416...
399
    #   Ignore packages not in the local archive
416
    #   Ignore packages not in the local archive
400
    #   Ignore packages that don't have a descpkg
417
    #   Ignore packages that don't have a descpkg
401
    #   Ignore packages that are writable - still being formed
418
    #   Ignore packages that are writable - still being formed
402
    #
419
    #
403
    my $needPkgList;
420
    my $needPkgList;
-
 
421
    my $needPkgListCount = 0;
-
 
422
    my $filteredCount = 0;
-
 
423
    my $missingCount = 0;
-
 
424
    my $writableCount = 0;
-
 
425
    my $excludeCount = 0;
404
    while ( (my ($pname, $pvers)) = each %{$pkgList} )
426
    while ( (my ($pname, $pvers)) = each %{$pkgList} )
405
    {
427
    {
406
        #
428
        #
407
        #   Ignore excluded packages
429
        #   Ignore excluded packages
408
        #
430
        #
409
        next if ( exists $excludePkgs->{$pname} );
431
        if ( exists $excludePkgs->{$pname} )
-
 
432
        {
-
 
433
            $excludeCount++;
-
 
434
            next;
-
 
435
        }
-
 
436
 
-
 
437
        #
-
 
438
        #   Ignore packages that are filtered out
-
 
439
        #
-
 
440
        if ( defined $conf->{'packageFilter'} )
-
 
441
        {
-
 
442
            unless ( $pname =~ m~$conf->{'packageFilter'}~ )
-
 
443
            {
-
 
444
                $logger->verbose3("Filtering out: ${pname}");
-
 
445
                $filteredCount++;
-
 
446
                next;
-
 
447
            }
-
 
448
        }
410
 
449
 
411
        while ( (my ($pver, $pdata) ) = each %{$pvers} )
450
        while ( (my ($pver, $pdata) ) = each %{$pvers} )
412
        {
451
        {
413
            my $tmtime = $remotePkgList->{$pname}{$pver}{time} || 0;
452
            my $tmtime = $remotePkgList->{$pname}{$pver}{time} || 0;
414
 
453
 
Line 417... Line 456...
417
            if ( $mtime == 0 )
456
            if ( $mtime == 0 )
418
            {
457
            {
419
                # PackageVersion not in local archive (at least the descpkg file is not)
458
                # PackageVersion not in local archive (at least the descpkg file is not)
420
                # Skip now - will pick it up later
459
                # Skip now - will pick it up later
421
                $logger->verbose("Package not in dpkg_archive: $pname, $pver");
460
                $logger->verbose("Package not in dpkg_archive: $pname, $pver");
-
 
461
                $missingCount++;
422
                next;
462
                next;
423
            }
463
            }
424
 
464
 
425
            if ( $mode & 0222 )
465
            if ( $mode & 0222 )
426
            {
466
            {
427
                # Descpkg file is writable
467
                # Descpkg file is writable
428
                # Package may be in the process of being created
468
                # Package may be in the process of being created
429
                # If the package has been wriatble for a long time, then
469
                # If the package has been writable for a long time, then
430
                # consider for transfer
470
                # consider for transfer
431
                my $age = $now - $mtime;
471
                my $age = $now - $mtime;
432
                if ( $age < ($conf->{'writewindow '} || 600) )
472
                if ( $age < ($conf->{'writewindow '} || 600) )
433
                {
473
                {
434
                    $logger->verbose("Package is writable: $pname, $pver, ", $now - $mtime);
474
                    $logger->verbose("Package is writable: $pname, $pver, ", $now - $mtime);
-
 
475
                    $writableCount++;
435
                    next;
476
                    next;
436
                }
477
                }
437
            }
478
            }
438
 
479
 
439
            if ( $mtime != $tmtime )
480
            if ( $mtime != $tmtime )
440
            {
481
            {
441
                # Package not present on target, or timestamps differ
482
                # Package not present on target, or timestamps differ
442
                $logger->verbose("Package Needs to be transferred: $pname, $pver, $mtime, $tmtime");
483
                $logger->verbose("Package Needs to be transferred: $pname, $pver, $mtime, $tmtime");
443
                $needPkgList->{$pname}{$pver} = $pdata;
484
                $needPkgList->{$pname}{$pver} = $pdata;
-
 
485
                $needPkgListCount++;
444
                next;
486
                next;
445
            }
487
            }
446
        }
488
        }
447
    }
489
    }
448
 
490
 
-
 
491
 
449
    #
492
    #
450
    #   Debug output only
493
    #   Debug output only
451
    #   Display what we need to transfer
494
    #   Display what we need to transfer
452
    #
495
    #
453
    if ( $conf->{verbose} > 2 )
496
    if ( $conf->{verbose} > 2 )
Line 458... Line 501...
458
            {
501
            {
459
                $logger->verbose("Need to transfer: $pname, $pver, $pdata");
502
                $logger->verbose("Need to transfer: $pname, $pver, $pdata");
460
            }
503
            }
461
        }
504
        }
462
    }
505
    }
-
 
506
    if ( $conf->{verbose}  )
-
 
507
    {
-
 
508
        $logger->verbose("Packages to transfer: $needPkgListCount");
-
 
509
        $logger->verbose("Packages to delete: $excessPkgListCount");
-
 
510
        $logger->verbose("Packages filtered out: $filteredCount");
-
 
511
        $logger->verbose("Packages missing: $missingCount");
-
 
512
        $logger->verbose("Packages still writable: $writableCount");
-
 
513
        $logger->verbose("Packages excluded: $excludeCount");
-
 
514
    }
463
 
515
 
464
    #
516
    #
465
    #   Time to do the real work
517
    #   Time to do the real work
466
    #   Transfer packages and delete excess packages
518
    #   Transfer packages and delete excess packages
467
    #   Note: Perform the transfers first
519
    #   Note: Perform the transfers first
Line 477... Line 529...
477
    {
529
    {
478
        while ( (my ($pver, $pdata) ) = each %{$pvers} )
530
        while ( (my ($pver, $pdata) ) = each %{$pvers} )
479
        {
531
        {
480
            if ( --$txcount <= 0 )
532
            if ( --$txcount <= 0 )
481
            {
533
            {
482
                $logger->warn("Max transfer count exceeded");
534
                $logger->warn("Max transfer count exceeded: $needPkgListCount remaining");
483
                $lastReleaseScan = 0;
535
                $lastReleaseScan = 0;
484
                last send_pkgs;
536
                last send_pkgs;
485
            }
537
            }
486
            transferPackage ($pname, $pver, $pdata);
538
            transferPackage ($pname, $pver, $pdata);
-
 
539
            $needPkgListCount--;
487
        }
540
        }
488
    }
541
    }
489
 
542
 
490
    #
543
    #
491
    #   Delete packages that have been identified as excess
544
    #   Delete packages that have been identified as excess
Line 495... Line 548...
495
    {
548
    {
496
        while ( (my ($pver, $pdata) ) = each %{$pvers} )
549
        while ( (my ($pver, $pdata) ) = each %{$pvers} )
497
        {
550
        {
498
            if ( --$txcount <= 0 )
551
            if ( --$txcount <= 0 )
499
            {
552
            {
500
                $logger->warn("Max transfer count exceeded");
553
                $logger->warn("Max transfer count exceeded: $excessPkgListCount remaining");
501
                $lastReleaseScan = 0;
554
                $lastReleaseScan = 0;
502
                last delete_pkgs;
555
                last delete_pkgs;
503
            }
556
            }
504
            deletePackage ($pname, $pver, $pdata);
557
            deletePackage ($pname, $pver, $pdata);
-
 
558
            $excessPkgListCount--;
505
        }
559
        }
506
    }
560
    }
507
 
561
 
508
    #
562
    #
509
    #   Send package list to the target
563
    #   Send package list to the target
Line 597... Line 651...
597
    #   Build up an sql query
651
    #   Build up an sql query
598
    #
652
    #
599
    my @m_rlist;
653
    my @m_rlist;
600
    push @m_rlist,"rc.RTAG_ID=$_" foreach ( @_ );
654
    push @m_rlist,"rc.RTAG_ID=$_" foreach ( @_ );
601
    my $m_rlist = join ' OR ', @m_rlist;
655
    my $m_rlist = join ' OR ', @m_rlist;
602
    my $m_sqlstr = "SELECT DISTINCT pv.PV_ID, pkg.PKG_NAME, pv.PKG_VERSION" .
656
    my $m_sqlstr = "SELECT DISTINCT pv.PV_ID, pkg.PKG_NAME, pv.PKG_VERSION, pv.IS_DEPLOYABLE" .
603
                    " FROM RELEASE_MANAGER.RELEASE_CONTENT rc, RELEASE_MANAGER.PACKAGE_VERSIONS pv, RELEASE_MANAGER.PACKAGES pkg" .
657
                    " FROM RELEASE_MANAGER.RELEASE_CONTENT rc, RELEASE_MANAGER.PACKAGE_VERSIONS pv, RELEASE_MANAGER.PACKAGES pkg" .
604
                    " WHERE ( $m_rlist ) AND rc.PV_ID = pv.PV_ID AND pv.PKG_ID = pkg.PKG_ID" .
658
                    " WHERE ( $m_rlist ) AND rc.PV_ID = pv.PV_ID AND pv.PKG_ID = pkg.PKG_ID" .
605
                    " ORDER by PKG_NAME DESC";
659
                    " ORDER by PKG_NAME DESC";
606
    $logger->verbose3("getPkgList:Sql:$m_sqlstr");
660
    $logger->verbose3("getPkgList:Sql:$m_sqlstr");
607
                    
661
                    
Line 643... Line 697...
643
#
697
#
644
sub getReleaseList
698
sub getReleaseList
645
{
699
{
646
    my $RM_DB;
700
    my $RM_DB;
647
    my %rlist;
701
    my %rlist;
-
 
702
    my $m_sqlstr;
648
    $logger->verbose("getReleaseList");
703
    $logger->verbose("getReleaseList");
649
 
704
 
650
    #
705
    #
651
    #   Cache data
706
    #   Cache data
652
    #   Only for one cycle of the main loop
707
    #   Only for one cycle of the main loop
Line 656... Line 711...
656
        $logger->verbose3("getReleaseList:Cache hit");
711
        $logger->verbose3("getReleaseList:Cache hit");
657
        return @{$releaseData{getReleaseList}};
712
        return @{$releaseData{getReleaseList}};
658
    }
713
    }
659
 
714
 
660
    #
715
    #
661
    #   Convert list of projects into a list of releases
716
    #   All projects
662
    #
717
    #
663
    my @plist = split /[,\s]+/, $conf->{'project'} || '';
718
    if ( $conf->{'allProjects'} )
-
 
719
    {
-
 
720
        $m_sqlstr = "SELECT rt.RTAG_ID" .
-
 
721
                    " FROM RELEASE_MANAGER.RELEASE_TAGS rt" .
-
 
722
                    " WHERE rt.OFFICIAL != 'A' AND rt.OFFICIAL != 'Y'";
-
 
723
    }
664
    if ( @plist )
724
    else
665
    {
725
    {
666
        #
726
        #
667
        #   Determine the releases that are in this project
727
        #   Convert list of projects into a list of releases
668
        #   Build up an sql query
-
 
669
        #
728
        #
-
 
729
        my @plist = split /[,\s]+/, $conf->{'project'} || '';
670
        connectRM(\$RM_DB);
730
        if ( @plist )
-
 
731
        {
-
 
732
            #
-
 
733
            #   Determine the releases that are in this project
-
 
734
            #   Build up an sql query
-
 
735
            #
671
        my @m_plist;
736
            my @m_plist;
672
        push @m_plist,"PROJ_ID=$_" foreach ( @plist );
737
            push @m_plist,"PROJ_ID=$_" foreach ( @plist );
673
        my $m_plist = join ' OR ', @m_plist;
738
            my $m_plist = join ' OR ', @m_plist;
674
        my $m_sqlstr = "SELECT rt.RTAG_ID" .
739
            $m_sqlstr = "SELECT rt.RTAG_ID" .
675
                    " FROM RELEASE_MANAGER.RELEASE_TAGS rt" .
740
                        " FROM RELEASE_MANAGER.RELEASE_TAGS rt" .
676
                    " WHERE ( $m_plist ) AND rt.OFFICIAL != 'A' AND rt.OFFICIAL != 'Y'";
741
                        " WHERE ( $m_plist ) AND rt.OFFICIAL != 'A' AND rt.OFFICIAL != 'Y'";
-
 
742
        }
-
 
743
    }
677
 
744
 
-
 
745
    if ( defined $m_sqlstr )
-
 
746
    {
678
        $logger->verbose3("getReleaseList:Sql:$m_sqlstr");
747
        $logger->verbose3("getReleaseList:Sql:$m_sqlstr");
-
 
748
        connectRM(\$RM_DB);
679
        my $sth = $RM_DB->prepare($m_sqlstr);
749
        my $sth = $RM_DB->prepare($m_sqlstr);
680
        if ( defined($sth) )
750
        if ( defined($sth) )
681
        {
751
        {
682
            if ( $sth->execute( ) )
752
            if ( $sth->execute( ) )
683
            {
753
            {
Line 850... Line 920...
850
    #
920
    #
851
    #   Do not transfer excluded files
921
    #   Do not transfer excluded files
852
    #
922
    #
853
    if ( exists $excludePkgs->{$pname} )
923
    if ( exists $excludePkgs->{$pname} )
854
    {
924
    {
855
        $logger->verbose("transferPackage: Excluded package not transferred");
925
        $logger->warn("transferPackage: Excluded package not transferred: $pname, $pver");
856
        return 1;
926
        return 1;
857
    }
927
    }
-
 
928
 
858
    
929
    #
-
 
930
    #   Apply package filter
-
 
931
    #
-
 
932
    if ( defined $conf->{'packageFilter'} )
-
 
933
    {
-
 
934
        unless ( $pname =~ m~$conf->{'packageFilter'}~ )
-
 
935
        {
-
 
936
            $logger->warn("transferPackage: Filtered out package not transferred: $pname, $pver");
-
 
937
            return 1;
-
 
938
        }
-
 
939
    }
-
 
940
 
859
    #
941
    #
860
    #   plink of 1 is not a symlink
942
    #   plink of 1 is not a symlink
861
    #
943
    #
862
    $plink = undef if ( defined($plink) && $plink eq '1' );
944
    $plink = undef if ( defined($plink) && $plink eq '1' );
863
 
945