Index: trunk/Nebulous-Server/bin/neb-cabadd
===================================================================
--- trunk/Nebulous-Server/bin/neb-cabadd	(revision 26292)
+++ trunk/Nebulous-Server/bin/neb-cabadd	(revision 26292)
@@ -0,0 +1,178 @@
+#!/usr/bin/env perl
+
+# Copyright (C) 2005-2008  Joshua Hoblitt
+#
+# $Id: neb-cabadd,v 1.2 2008-10-01 21:05:57 jhoblitt Exp $
+
+use strict;
+use warnings FATAL => qw( all );
+
+use vars qw( $VERSION );
+$VERSION = '0.02';
+
+use DBI;
+use Nebulous::Server::SQL;
+use URI::file;
+use URI;
+
+use Getopt::Long qw( GetOptions :config auto_help auto_version );
+use Pod::Usage qw( pod2usage );
+
+my ($db, $dbhost, $dbuser, $dbpass, $cname, $location);
+
+$db     = $ENV{'NEB_DB'} unless $db;
+$dbhost = $ENV{'NEB_DBHOST'} || 'localhost';
+$dbuser = $ENV{'NEB_USER'} unless $dbuser;
+$dbpass = $ENV{'NEB_PASS'} unless $dbpass;
+
+GetOptions(
+    'db|d=s'            => \$db,
+    'host=s'            => \$dbhost,
+    'pass|p=s'          => \$dbpass,
+    'user|u=s'          => \$dbuser,
+    'cname|n=s'         => \$cname,
+    'location|l=s'      => \$location,
+) || pod2usage( 2 );
+
+pod2usage( -msg => "Unknown option: @ARGV", -exitval => 2 ) if @ARGV;
+pod2usage( -msg => "Required options: --db --user --pass --cname", -exitval => 2 )
+    unless $db && $dbuser && $dbpass && $cname;
+
+my $dbh = DBI->connect(
+    "DBI:mysql:database=$db:host=$dbhost",
+    $dbuser,
+    $dbpass,
+    {
+        RaiseError => 1,
+        PrintError => 0,
+        AutoCommit => 1,
+    },
+);
+
+my $sql = Nebulous::Server::SQL->new();
+
+print "Adding cabinet...";
+
+my $query = $dbh->prepare( $sql->new_cabinet );
+$query->execute( $cname, $location);
+
+print " OK\n";
+
+__END__
+
+=pod
+
+=head1 NAME
+
+neb-cabadd - add a cabinet to a Nebulous server
+
+=head1 SYNOPSIS
+
+    neb-cabadd --cname <cabinet name> --location <cabinet location>
+    [--db <database>] [--user <username>] [--pass <password>] [--host <hostname]
+
+=head1 DESCRIPTION
+
+This program initialize a database for use by L<Nebulous::Server> by creating
+the appropriate set of tables.  Any pre-existing tables with conflicting names
+are first removed.
+
+=head1 OPTIONS
+
+=over 4
+
+=item * --cname <cabinet name>
+
+Symbolic name of cabinet being added.
+
+=item * --location <cabinet location>
+
+Description of the location of the cabinet.
+
+=item * --db|-d <database>
+
+Name of database (C<namespace>) to create tables in.
+
+Optional if the appropriate environment variable is set.
+
+=item * --user|-u <username>
+
+Username to authenticate with.
+
+Optional if the appropriate environment variable is set.
+
+=item * --pass|-p <password>
+
+Password to authenticate with.
+
+Optional if the appropriate environment variable is set.
+
+=item * --host <database host>
+
+Name of host on which the database resides.
+
+Optional.  Defaults to C<localhost>.
+
+=head1 ENVIRONMENT
+
+These environment variables may be used in place of the specified command line
+options.  All command line option will override the corresponding environment
+value.
+
+=over 4
+
+=item * C<NEB_DB>
+
+Equivalent to --db|-d
+
+=item * C<NEB_HOST>
+
+Equivalent to --host
+
+=item * C<NEB_USER>
+
+Equivalent to --user|-u
+
+=item * C<NEB_PASS>
+
+Equivalent to --pass|-p 
+
+=back
+
+=head1 CREDITS
+
+Josh Hoblitt and Chris Waters 
+
+=head1 SUPPORT
+
+Please contact the author directly via e-mail.
+
+=head1 AUTHOR
+
+Joshua Hoblitt <jhoblitt@cpan.org>
+
+=head1 COPYRIGHT
+
+Copyright (C) 2005-2008  Joshua Hoblitt.  All rights reserved.
+
+This program is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free Software
+Foundation; either version 2 of the License, or (at your option) any later
+version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+Place - Suite 330, Boston, MA  02111-1307, USA.
+
+The full text of the license can be found in the L<perlgpl> Pod as supplied
+with Perl 5.8.1 and later.
+
+=head1 SEE ALSO
+
+L<Nebulous::Server>, L<neb-initdb>, L<neb-df>, L<nebdiskd>
+
+=cut
Index: trunk/Nebulous-Server/bin/neb-voladm
===================================================================
--- trunk/Nebulous-Server/bin/neb-voladm	(revision 24842)
+++ trunk/Nebulous-Server/bin/neb-voladm	(revision 26292)
@@ -23,4 +23,5 @@
     $allocate,
     $available,
+    $mounted,
     $db,
     $dbhost,
@@ -31,4 +32,5 @@
     $vname,
     $xattr,
+    $cab_id,
 );
 
@@ -41,4 +43,5 @@
     'allocate=i'        => \$allocate,
     'available=i'       => \$available,
+    'mounted'           => \$mounted,
     'db|d=s'            => \$db,
     'debug'             => \$debug,
@@ -48,4 +51,5 @@
     'vhost=s'           => \$vhost,
     'vname|n=s'         => \$vname,
+    'cab_id|c=i'        => \$cab_id,
     'xattr=i'           => \$xattr,
 ) || pod2usage( 2 );
@@ -56,6 +60,6 @@
 
 # are we listing the volumes or updating?
-if (defined $allocate or defined $available or defined $xattr) {
-    pod2usage( -msg => "Options: --allocate, --available, and --xattr Require options --vhost or --vname", -exitval => 2 )
+if (defined $allocate or defined $available or defined $xattr or defined $cab_id) {
+    pod2usage( -msg => "Options: --allocate, --available, --xattr, and --cab_id Require options --vhost or --vname", -exitval => 2 )
         unless defined $vhost or defined $vname;
     pod2usage( -msg => "Options: --allocate, --available, and --xattr Must be 0 or 1", -exitval => 2)
@@ -84,4 +88,5 @@
 $set{'v.available'} = $available if defined $available;
 $set{'v.xattr'} = $xattr if defined $xattr;
+$set{'v.cab_id'} = $cab_id if defined $cab_id;
 
 if (%set) {
@@ -97,4 +102,17 @@
         die $@;
     }
+    if ($mounted) {
+	eval {
+	    my ($q, @bind) = sql_interp("UPDATE mountedvol AS v SET", \%set, "WHERE", \%constraint);
+	    warn "$q\n" if $debug;
+	    my $query = $dbh->prepare($q);
+	    $query->execute(@bind);
+	    $dbh->commit;
+	};
+	if ($@) {
+	    $dbh->rollback;
+	    die $@;
+	}
+    }
 } 
 
@@ -132,4 +150,5 @@
     neb-voladm [--vname <volume name>] [--vhost <volume host>]
     [--allocate <0|1>] [--available <0|1>] [--xattr <0|1>]
+    [--cab_id <cab_id>]
     [--host <database host> ] [--db <database name>]
     [--user <database username>] [--pass <database password>]
@@ -164,4 +183,10 @@
 
 Enables/Disables these flags on the storage volume.
+
+Requires either the C<--vname> or c<--vhost> options.
+
+=item * --cab_id <cab_id>
+
+Sets the cabinet id for this storage volume.
 
 Requires either the C<--vname> or c<--vhost> options.
Index: trunk/Nebulous-Server/bin/nebdiskd
===================================================================
--- trunk/Nebulous-Server/bin/nebdiskd	(revision 24842)
+++ trunk/Nebulous-Server/bin/nebdiskd	(revision 26292)
@@ -177,5 +177,6 @@
 
     eval {
-        my $r_query = $dbh->prepare_cached("REPLACE INTO mountedvol SELECT *, ?, ? FROM volume WHERE mountpoint = ?");
+        my $r_query = $dbh->prepare_cached("REPLACE INTO mountedvol SELECT vol_id,name,host,path,allocate,available,xattr,mountpoint, ?, ? FROM volume WHERE mountpoint = ?");
+#	my $d_query = $dbh->prepare_cached("UPDATE mountedvol SET allocate = ?, available = ? WHERE mountpoint = ?");
         my $d_query = $dbh->prepare_cached("DELETE FROM mountedvol WHERE mountpoint = ?");
 
@@ -185,5 +186,5 @@
             # there may be multiple vol_ids per mountpoint but we only need to
             # check each mointpont once
-            my $query = $dbh->prepare_cached("SELECT DISTINCT mountpoint FROM volume WHERE available = 1");
+            my $query = $dbh->prepare_cached("SELECT DISTINCT mountpoint FROM volume");
             $query->execute;
             while (my $row = $query->fetchrow_hashref) {
@@ -200,11 +201,13 @@
             # automounter and it fails to mount
             my $tries = 0;
+	    my $valid_mountpoint = 1;
             TEST: eval {
                 $tries++;
                 unless (is_mountpoint($mountpoint)) {
-                    $log->warn("$mnt is not a valid mountpoint");
+                    $log->warn("$mountpoint is not a valid mountpoint ($tries)");
+		    $valid_mountpoint = 0;
                 }
             };
-            if ($@) {
+            if (!$valid_mountpoint) {
                 # try is_mountpoint() again if $retry > 1
                 if ($tries < $retry) {
@@ -212,5 +215,7 @@
                     goto TEST; 
                 }
-                $log->warn($@);
+		$log->warn("Removing $mountpoint from the mountedvol table ($tries > $retry)");
+ #               $log->warn($@);
+
                 $d_query->execute($mountpoint);
                 next;
