Hi Blues,
I have written a meta-verify utility for Bluequartz.
It is in still development.
***But the basic CODB-meta -> system-OS is working***
The logic for writing meta-verify is because OS and CODB-meta
can be out-of-sync, especially system quota (when corrupted with quotacheck) with CODB.
ps: Gavin, you can use this script to sync BQ-DB with system quotas.
>>>>>>>>>>>>>>>>>>>>>>meta-verify>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#!/usr/bin/perl -w -I/usr/sausalito/perl -I/usr/sausalito/handlers/base/vsite
#
####### meta-verify, version 0.01a
#
#
# system(OS) & database(codb aka meta) verification and integrity
check utility
# for the Cobalt 550 / Bluequartz product family
#
# Patrick Ong Tiong Heng (patricko (at mark) staff.singnet.com.sg)
#
#
#
####### OPERATION
#
# meta-verify -u -q | -s -q | -a | [-v] [-h]
#
# -u user
# -s virtual site
#
# -q quota
# -a all | users + virtual sites
#
# -v verbose
# -h usage help
#
#
#
####### DESCRIPTION
#
#
# Actually, this script should call system-verify as it attempts to
detect and
# repair coherency problems between the state saved in the database
and
# the system configuration state. In order to let cobalt users feel
"at home",
# I decided to retain the name: meta-verify.
#
# - (KIV) Verify and repair virtual sites.
# - (KIV) Verify and repair user accounts.
# - (KIV )Maintain intergrity of the RaQ system configuration files.
# - (Partial - Only Quota) Ensure coherency between System and
Meta/quota backend.
#
#
####### SUPPORTED SYSTEMS
#
# Cobalt 550, Bluequartz
#
#
####### CHANGELOG
#
#
# version 0.01a (Feb 21 2006)
# - initial creation alpha
#
#
#######
BEGIN {
require CCE;
require Quota;
use Getopt::Std;
use vars qw($TITLE $VERSION $AUTHOR $COPYRIGHT);
$TITLE = "meta-verify";
$VERSION = "0.01a";
$AUTHOR = "Patrick Ong Tiong Heng (patricko\ (at mark) staff.singnet.com.sg)";
$COPYRIGHT = "bluequartz.org";
}
use CCE;
use strict;
use Quota;
my $path = "/home";
my $dev;
my $uid = "";
my $uqs = "";
my $uqh = "";
my $siteUID = "";
my $userUID = "";
use vars qw($opt_u $opt_s $opt_q $opt_a $opt_h $Verbose);
# command-line arguments, verbose level
getopts("usqavh");
# usage help
&usage if ($opt_h);
if ($opt_a) {
&meta2system();
}
elsif ($opt_u) {
print "KIV\n";
}
elsif ($opt_s) {
print "KIV\n";
}
elsif ($opt_q) {
print "KIV\n";
}
elsif ($Verbose) {
print "KIV\n";
}
else {
&usage;
}
print "\n" unless ($Verbose);
exit 0;
1;
sub usage ()
{
printf("\n");
printf(" usage: %s [options]\n", $TITLE);
printf("\n");
printf(" -u user\n");
printf(" -s virtual site\n");
printf("\n");
printf(" -q quota\n");
printf(" -a all \| users + virtual sites\n");
printf("\n");
printf(" -v verbose\n");
printf(" -h help\n");
printf("\n");
exit 1;
}
sub meta2system()
{
my $cce = new CCE;
$cce->connectuds();
my @vsites;
my @vsitelist;
my @userlist;
my $hostname=`hostname`;
chomp($hostname);
$dev = Quota::getqcarg($path) || die "$path: $!\n";
### Find Domain records
@vsitelist = $cce->findx('Vsite');
foreach my $vsite (@vsitelist) {
my @userlist;
my $siteNum;
my $userNum;
my $fqdn;
my $domain;
my $vsitequota;
my $vsitequotaExtra;
my $userquota;
my $userquotaExtra;
my ($ok, $object, $old, $new) = $cce->get($vsite);
my ($vDiskok, $vDiskobject, $vDiskold, $vDisknew) = $cce->get($vsite, "Disk");
$siteNum="${%{$object}}{'name'}";
$domain="${%{$object}}{'domain'}";
$fqdn="${%{$object}}{'fqdn'}";
$vsitequota="${%{$vDiskobject}}{'quota'}";
$vsitequota*=1024;
$vsitequotaExtra=$vsitequota;
$vsitequotaExtra+=1024;
$siteUID = `quota -g $siteNum | head -1 | awk -F \"gid \" '{print \$2}' | awk -F \"): \" '{print \$1}'` ;
chomp($siteUID);
$uid = $siteUID;
$uqs = $vsitequota;
$uqh = $vsitequotaExtra;
unless(Quota::setqlim($dev, $uid, $uqs, $uqh, 0, 0)) {
print "Quota set for $uid, $domain, $siteNum, QUOTA\: $vsitequota\n";
}
print $fqdn." ".$siteUID." ".$siteNum." ".$vsitequota." ".$vsitequotaExtra."\n";
### Find User account
@userlist = $cce->findx('User', {"site" => "$siteNum"} );
foreach my $user (@userlist) {
my ($userOK, $userOBJ, $userOLD, $userNEW) = $cce->get($user);
my ($userDiskOK, $userDiskOBJ, $userDiskOLD, $userDiskNEW) = $cce->get($user, "Disk");
#print "${%{$userOBJ}}{name}"." (at mark) "."$domain\n";
$userNum="${%{$userOBJ}}{'name'}";
$userquota="${%{$userDiskOBJ}}{'quota'}";
$userquota*=1024;
$userquotaExtra=$userquota;
$userquotaExtra+=1024;
$userUID = `quota $userNum | head -1 | awk -F \"uid \" '{print \$2}' | awk -F \"): \" '{print \$1}'` ;
chomp($userUID);
$uid = $userUID;
$uqs = $userquota;
$uqh = $userquotaExtra;
unless(Quota::setqlim($dev, $uid, $uqs, $uqh, 0, 0)) {
print "Quota set for $uid, $domain, $userNum, QUOTA\: $userquota\n";
}
print $fqdn." ".$userUID." ".$userNum." ".$userquota." ".$userquotaExtra."\n";
}
}
$cce->bye('SUCCESS');
#exit(0);
exit(1);
}
### Find User account
@userlist = $cce->findx('User', {"site" => "$siteNum"} );
foreach my $user (@userlist) {
my ($userOK, $userOBJ, $userOLD, $userNEW) = $cce->get($user);
my ($userDiskOK, $userDiskOBJ, $userDiskOLD, $userDiskNEW) = $cce->get($user, "Disk");
#print "${%{$userOBJ}}{name}"." (at mark) "."$domain\n";
$userNum="${%{$userOBJ}}{'name'}";
$userquota="${%{$userDiskOBJ}}{'quota'}";
$userquota*=1024;
$userquotaExtra=$userquota;
$userquotaExtra+=1024;
$userUID = `quota $userNum | head -1 | awk -F \"uid \" '{print \$2}' | awk -F \"): \" '{print \$1}'` ;
chomp($userUID);
$uid = $userUID;
$uqs = $userquota;
$uqh = $userquotaExtra;
unless(Quota::setqlim($dev, $uid, $uqs, $uqh, 0, 0)) {
print "Quota set for $uid, $domain, $userNum, QUOTA\: $userquota\n";
}
print $fqdn." ".$userUID." ".$userNum." ".$userquota." ".$userquotaExtra."\n";
}
}
$cce->bye('SUCCESS');
#exit(0);
exit(1);
}
>>>>>>>>>>>>>>>END>>>>>>>meta-verify>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Cheers
patrick
On Wed, 1 Feb 2006 00:59:00 +0800 (SGT)
patricko (at mark) staff.singnet.com.sg wrote:
> Some ideas,
>
> use bluequartz system quota.
> Run a script read out all system quotas and
> re-populate via edquota.
>
>
> or during maintenance night.
> Export all domain out via cmuExport.
>
> then
> try destroy one domain and import it back.
> ~check: quota in tact? if so, continue with others
>
> or else you need to do up another server and move all
> domains over as OS level - quota are broken beyond repair
>
> Cheers
> patrick
>
>
>
>
>
>
>
>
>
>
>
>
> On Tue, 31 Jan 2006, Gavin Nelmes-Crocker wrote:
>
> > Guys
> >
> > I did something very bad
> >
> > /sbin/quotacheck -c -u -g -a -v -f -m
> >
> > The background to this was that I had users showing up using far more disk
> > space that they really were, this used to happen on RaQ4's as well.
> >
> > I started of with /sbin/quotacheck -c -u -g -a -v
> >
> > but it complained that I had to force it so I added -f then it complained
> > that it could mount /home as read only but to force I could add -m and I
> > did.
> >
> > Great - the problem was sorted
> >
> > DISASTER - I go back into the GUI and it looks correct except I see that
> > everyone now has unlimited quota. If I edit a user I see that their
> > original quota amount is still there (presumably from the database) so is
> > there a way to rewrite it all back to the system or do I have to go into
> > each user change their quota and then save.
> >
> > There are several hundred users on the box - so I really don't want to have
> > to edit every single one if I can avoid it :-)
> >
> > I think the mistake was -c I think I should have used /sbin/quotacheck -u
> > -g -a -v -f -m
> >
> > Thanks
> >
> > Gavin
> >
> >
>