chiark / gitweb /
Reject non-option args to u-d-mi
[ypp-sc-tools.db-test.git] / yarrg / update-master-info
1 #!/usr/bin/perl -w
2
3 use strict (qw(vars));
4 use DBI;
5 use Commods;
6
7
8 sub full ($) {
9     my ($ocean) = @_;
10     quick($ocean);
11     print "## updating topology of $ocean\n";
12     system('./yppedia-chart-parser',$ocean); die $? if $?;
13 }
14
15 sub quick ($) {
16     my ($ocean) = @_;
17     print STDERR "## updating schema and commodities for $ocean\n";
18     system('./db-idempotent-populate',$ocean); die $? if $?;
19 }
20
21 my $rsyncdir;
22
23 sub update_master_info () {
24     my $sfn= 'source-info.txt';
25
26     foreach my $v (1..$masterinfoversion) {
27         my $dfnl= sprintf "master-info%s.txt", ($v>1 ? "-v$v" : '');
28         print STDERR "installing new $dfnl...\n";
29     
30         my $dfn= "$rsyncdir/$dfnl";
31         my $sf= new IO::File $sfn or die "$sfn $!";
32         my $df= new IO::File "$dfn.tmp", 'w' or die "$dfn.tmp $!";
33
34         my $h;
35         while (<$sf>) {
36             chomp; s/\s+$//;
37             next if m/^\s*\#/ || !m/\S/;
38             if (m/^\S.*/) {
39                 $h= $&;
40             }
41             die "$_ ?" unless defined $h;
42             if ($h =~ m/^commods|^\%[a-z]\b/) {
43                 s/\t.*//;
44             }
45             if ($v<2) {
46                 next if $h =~ m/^nocommods/;
47             }
48             print $df $_, "\n" or die $!;
49         }
50
51         $sf->error and die $!;
52         close $df or die $!;
53         rename "$dfn.tmp", "$dfn" or die $!;
54     }
55
56 }
57
58
59 my @specoceans;
60 my $alloceans;
61
62 sub optarg () {
63     return $_ if length;
64     die unless @ARGV;
65     return scalar shift @ARGV;
66 }
67
68 while (@ARGV && $ARGV[0] =~ m/^-/) {
69     $_= shift @ARGV;
70     last if m/^--?$/;
71     while (m/^-./) {
72         if (s/^-d//) { $rsyncdir= optarg(); }
73         elsif (s/^-O//) { push @specoceans, optarg(); }
74         elsif (s/^-a//) { $alloceans=1; }
75         else { die "$_ ?"; }
76     }
77 }
78 die if @ARGV;
79
80 die if @specoceans && $alloceans;
81
82 parse_info_serverside();
83
84 if (@specoceans) {
85     print "### full update of specified oceans ...\n";
86     foreach my $ocean (@specoceans) {
87         die "$ocean ?" unless defined $oceans{$ocean};
88         full($ocean);
89     }
90 } elsif ($alloceans) {
91     print "### full (inc.topology) update of all oceans ...\n";
92     foreach my $ocean (sort keys %oceans) {
93         full($ocean);
94     }
95 } else {
96     print "### quick (no topology) update only (of all oceans) ...\n";
97     foreach my $ocean (sort keys %oceans) {
98         quick($ocean);
99     }
100 }
101
102 if (defined $rsyncdir) {
103     print "### master-info update ...\n";
104     update_master_info();
105 }