#!/usr/bin/env perl

# Copyright (C) 2007-2009  Joshua Hoblitt, 2010 Chris Waters

use strict;
use warnings FATAL => qw( all );

use vars qw( $VERSION );
$VERSION = '0.03';

use Nebulous::Client;

use Getopt::Long qw( GetOptions :config auto_help auto_version );
use Pod::Usage qw( pod2usage );

my (
    $server,
    $path,
    $column,
);

$server = $ENV{'NEB_SERVER'} unless $server;


GetOptions(
    'server|s=s'    => \$server,
    'path|p'        => \$path,
    'column|c'      => \$column,
) || pod2usage( 2 );

# twiddle column so that it does it by default.

$column = not $column;

my $pattern = shift;

pod2usage( -msg => "Unknown option: @ARGV", -exitval => 2 ) if @ARGV;
pod2usage( -msg => "Required options: --server", -exitval => 2 )
    unless $server;

my $neb = Nebulous::Client->new(
    proxy => "$server",
);

die "can't connected to Nebulous Server: $server"
    unless defined $neb;

# default to listing root
$pattern ||= "/";

my $keys = $neb->find_objects_wildcard($pattern);

if ($path) {
    my @files;
    foreach my $key (@{ $keys }) {
	my $uris = $neb->find_instances($key);
	if (defined $uris) {
	    push @files, URI->new(@$uris[0])->file;
	}
    }
    @{ $keys } = @files;
} 
if ($keys) {
    if ($column) {
	open(COLUMN,"|column") || die "Cannot open column command.";
	print COLUMN join("\n", @{ $keys }), "\n";
	close(COLUMN);
    }
    else {
	print join("\n", @{ $keys }), "\n";
    }
}


__END__

=pod

=head1 NAME

neb-ls - list Nebulous keys

=head1 SYNOPSIS

    neb-ls [--server <URL>] [-c] [-p] <pattern>

=head1 DESCRIPTION

This program list Nebulous keys matched by C<<pattern>>.  Call it with no
arguments is equivalent to searching with the pattern C<neb://>.  SQL like
wildcards are supported to select out certain files.

=head1 OPTIONS

=over 4

=item * --path|-p

Find the disk files corresponding to the keys found.

=item * --column|-c

Disable column formatting, and output results one to a line.

Optional

=item * --server|-s <URL>

URL of the Nebulous server to connect to.

Optional if the appropriate environment variable is set.

=back

=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_SERVER>

Equivalent to --server|-s

=back

=head1 SUPPORT

Please contact the author directly via e-mail.

=head1 AUTHOR

Joshua Hoblitt <jhoblitt@cpan.org>, Chris Waters

=head1 COPYRIGHT

Copyright (C) 2007-2010  Joshua Hoblitt / Chris Waters.  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-addvol>, L<nebdiskd>, L<neb-df>,
L<neb-touch>, C<regex(7)>

=cut
