#!/usr/bonsaitools/bin/perl -w # -*- Mode: perl; indent-tabs-mode: nil -*- # The contents of this file are subject to the Mozilla Public License # Version 1.0 (the "License"); you may not use this file except in # compliance with the License. You may obtain a copy of the License at # http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS IS" # basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the # License for the specific language governing rights and limitations # under the License. # # The Original Code is the Despot Account Administration System. # # The Initial Developer of the Original Code is Netscape Communications # Corporation. Portions created by Netscape are Copyright (C) 1998 # Netscape Communications Corporation. All Rights Reserved. # # Contributor(s): Terry Weissman # $F::debug = 1; $cvs = "/opt/cvs-tools/bin/cvs"; $dontcommit = 0; $usertoblame = ""; for ($i=0 ; $i<@ARGV ; $i++) { if ($ARGV[$i] eq "-n") { $dontcommit = 1; } if ($ARGV[$i] eq "-user") { $usertoblame = $ARGV[++$i]; } } $srcdir = $0; $srcdir =~ s:/[^/]*$::; # Remove last word, and slash before it. if ($srcdir eq "") { $srcdir = "."; } chdir $srcdir || die "Couldn't chdir to $srcdir"; use Mysql; require 'utils.pl'; $db = Mysql->Connect("localhost", "mozusers") || die "Can't connect to database server"; $db = $db; # Make -w shut up. ($mylogin = `/usr/ucb/whoami`) || ($mylogin = `/bin/whoami`); chop($mylogin); $hostname = 'unknown'; if (open(HOST, "/bin/hostname|")) { $hostname = ; chop($hostname); close(HOST); } $ENV{"HOME"} = glob("~$mylogin"); # CVS wants this. $curdir = `pwd`; chop($curdir); $ENV{"CVS_PASSFILE"} = "$curdir/.cvspass"; if ($usertoblame eq "") { $usertoblame = $mylogin; } $boilerplate = ""; open(BOILERPLATE, ") { if ( /^#/ ) { # Strip out comments from the boilerplate. Might as well; the # faster our generated perl script runs, the better. next; } $boilerplate .= $_; } close BOILERPLATE; open(BOILERPLATE, ") { push @ownersplate, $_; } close BOILERPLATE; my @grouplist = ('cvs', 'gila'); # Mailing group list. Should really query # for this list rom the db ... ### $repquery = Query("select id,name,cvsroot,ownersrepository,ownerspath,domailing from repositories order by name"); while (@reprow = $repquery->fetchrow()) { ($repid,$repname,$reproot,$ownersrepository,$ownerspath,$domailing) = (@reprow); $query = Query("select email,passwd,${repname}_group,neednewpassword,disabled from users where ${repname}_group != 'None' and passwd != '' order by email"); $tmpdir = "/tmp/syncit-$repname.$$"; mkdir $tmpdir, 0777; chdir $tmpdir; $ENV{CVSROOT} = $reproot; my @filelist = ('passwd', 'commitcheck.pl'); if ($domailing) { foreach my $g (@grouplist) { push @filelist, "${g}_list"; } } system "$cvs co " . join(' ', grep(s@^@CVSROOT/@, @filelist)) || die "Couldn't checkout files."; if ($domailing) { foreach my $group (@grouplist) { $outfile = "CVSROOT/${group}_list"; open(MAILLIST, ">$outfile") || die "Can't open $outfile"; print MAILLIST "# DO NOT EDIT THIS FILE! This file is created\n"; print MAILLIST "# by despot, and is used by /etc/aliases.\n"; my $q = Query("select email from users where ${group}_group != 'None' and passwd != '' and disabled != 'Yes' order by email"); while (@r = $q->fetchrow()) { print MAILLIST $r[0]. "\n"; } close MAILLIST; } } $outfile = "CVSROOT/passwd"; open(PASSWD, ">$outfile") || die "Can't open $outfile"; print PASSWD "# DO NOT EDIT THIS FILE! You must instead go to http://warp/mozilla.org, and\n"; print PASSWD "# tweak things from there.\n"; while (@row = $query->fetchrow()) { ($email,$password,$group,$neednew,$disabled) = @row; if ($neednew eq "Yes" || $disabled eq "Yes") { next; } $login = $email; $login =~ s/@/%/g; print PASSWD "$login:$password:$group\n"; } close PASSWD; # system "$cvs co CVSROOT/commitcheck.pl" || die "Couldn't checkout passwd file."; $outfile = "CVSROOT/commitcheck.pl"; open(COMMITCHECK, ">$outfile") || die "Can't open $outfile"; print COMMITCHECK "#!/tools/ns/bin/perl5.004 --\n"; print COMMITCHECK "# DO NOT EDIT THIS FILE! You must instead go to http://cvs-mirror.mozilla.org/webtools/despot, and\n"; print COMMITCHECK "# tweak things from there.\n\n"; $query = Query("select partitions.id,partitions.name,state,branches.name from partitions,branches where repositoryid = '$repid' and branches.id=branchid order by partitions.name"); $founddefault = 0; while (@row = $query->fetchrow()) { ($id,$name,$state,$branch) = (@row); $d = "\$"; print COMMITCHECK $d . "mode{'$id'} = '$state';\n"; print COMMITCHECK $d . "branch{'$id'} = '$branch';\n"; print COMMITCHECK $d . "fullname{'$id'} = '$name';\n"; if ($name eq 'default') { print COMMITCHECK $d . "defaultid = '$id';\n"; $founddefault = 1; } if ($state ne "Open") { foreach $n ("blessed", "super") { print COMMITCHECK $d . "$n" . "{'$id'} = ["; $eq = "="; if ($n eq "super") { $eq = "!="; } $q2 = Query("select email from members,users where partitionid = $id and class $eq 'Member' and users.id = userid"); while (@r2 = $q2->fetchrow()) { my $n = $r2[0]; $n =~ s/@/%/; print COMMITCHECK "'$n',"; } print COMMITCHECK "];\n"; } } } if (!$founddefault) { print COMMITCHECK $d . "defaultid = 'none';\n"; } print COMMITCHECK "sub GetT {\n"; print COMMITCHECK '($b,$_) = (@_);' . "\n"; $query = Query("select branches.name,partitions.id from partitions,branches where repositoryid = '$repid' and branches.id = branchid order by branches.name"); $lastbranch = ""; while (@row = $query->fetchrow()) { ($branchname,$partid) = (@row); if ($branchname ne $lastbranch) { if ($lastbranch ne "") { print COMMITCHECK "}\n"; } print COMMITCHECK "if (" . $d . "b eq '$branchname') {\n"; $lastbranch = $branchname; } $q2 = Query("select pattern from files where partitionid=$partid order by pattern"); while (@r2 = $q2->fetchrow()) { my $regexp = $r2[0]; $regexp =~ s/\./\\./g; $regexp =~ s:\*$:.*:; $regexp =~ s:\%$:[^/]*:; $regexp = '^' . $regexp . "\$"; print COMMITCHECK "if (m:$regexp:) {return '$partid';}\n"; } } if ($lastbranch ne "") { print COMMITCHECK "}\n"; } print COMMITCHECK "return '';\n"; print COMMITCHECK "}\n"; print COMMITCHECK $boilerplate; close COMMITCHECK; chdir "CVSROOT"; if ($dontcommit) { system "$cvs diff -c passwd"; system "$cvs diff -c commitcheck.pl"; # system "$cvs commit -m 'Pseudo-automatic update of changes made by $usertoblame.' commitcheck.pl"; } else { system "$cvs commit -m 'Pseudo-automatic update of changes made by $usertoblame.'"; } if (defined $ownersrepository && $ownersrepository > 0 && defined $ownerspath && $ownerspath ne "") { $query = Query("select cvsroot from repositories where id = $ownersrepository"); $ENV{CVSROOT} = ($query->fetchrow())[0]; $tdir = "$tmpdir/ownerstuff"; mkdir $tdir, 0777; chdir $tdir; system "$cvs co $ownerspath" || die "Couldn't checkout $ownerspath"; open(OWNERS, ">$ownerspath") || die "Can't open $ownerspath"; print OWNERS "\n"; foreach (@ownersplate) { if ($_ !~ m/^%%DATA%%/) { print OWNERS $_; next; } $query = Query("select id,name,description,newsgroups,doclinks from partitions where repositoryid = '$repid' order by name"); while (@row = $query->fetchrow()) { ($id,$name,$desc,$newsgroups,$doclinks) = (@row); if ($name eq "default" || $name eq "despotaccess") { next; } my $fullname = $name; if (defined $desc && $desc ne "") { $fullname .= " ($desc)"; } $q2 = Query("select class,email,realname from members,users where partitionid = $id and class != 'Member' and users.id = userid"); my @owners; my @ownernames; my @peers; my @peernames; while (@r2 = $q2->fetchrow()) { if ($r2[0] eq "Owner") { push @owners, $r2[1]; push @ownernames, $r2[2]; } else { push @peers, $r2[1]; push @peernames, $r2[2]; } } my $maillist = "mailto:" . join(',', @owners); if (@peers > 0) { $maillist .= "?cc=" . join(',', @peers); } print OWNERS "
Module: $fullname
Owner:" . join(', ', @ownernames) . "
Source:"; $q2 = Query("select pattern from files where partitionid=$id order by pattern"); my @filelist; while (@r2 = $q2->fetchrow()) { my $name = $r2[0]; $name =~ s/\*$//; $name =~ s/%$//; $name =~ s:/$::; $name =~ s:^mozilla/::; push @filelist, "$name"; } print OWNERS join(', ', @filelist); print OWNERS "
Newsgroup:"; my @grouplist; if (!defined $newsgroups) { $newsgroups = ""; } foreach $i (split(/,/, $newsgroups)) { my $base = "news:"; if ($i =~ /^netscape\.public/) { $base = "news://news.mozilla.org/"; } push @grouplist, "$i"; } print OWNERS join(', ', @grouplist); print OWNERS "
Peers:"; my @peerlist; foreach $i (@peers) { push @peerlist, "" . shift(@peernames) . ""; } print OWNERS join(', ', @peerlist); print OWNERS "
Documents:"; my @doclist; if (!defined $doclinks) { $doclinks = ""; } foreach $i (split(/,/, $doclinks)) { push @doclist, "$i"; } print OWNERS join(', ', @doclist); print OWNERS "
"; } } close OWNERS; system "$cvs commit -m 'Pseudo-automatic update of changes made by $usertoblame.'"; } chdir "/"; system "rm -rf $tmpdir"; } Query("delete from syncneeded");