Acme-Globus
view release on metacpan or search on metacpan
20212223242526272829303132333435363738394041
rather than covering all the capabilities of the Globus CLI. It is
therefore very stubtastic.
This module also relies very much on SSH, and thus the rules of private
and public
keys
. Therefore, using it as a shared tool would be
ill-advised
if
not impossible.
SYNOPSIS
my
$g
= Globus->new(
$username
,
$path_to_ssh_key
) ;
$g
->endpoint_add_shared(
'institution#endpoint'
,
$directory
,
$endpoint_name
) ;
$g
->acl_add(
$endpoint
.
'/'
,
'djacoby@example.com'
) ;
METHODS
BASICS
new
Creates a new Globus object. Takes two options:
727374757677787980818283848586878889909192delete
rm
Currently stubs
scp
transfer
Both commands take a source, or from path (including endpoint), a
destination, or to path (includint endpoint), and a boolean indicating
whether you're copying recursively or not.
FILE MANAGEMENT
ls
Works?
rename
100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177acl_add
acl_list
acl_remove
acl-* is the way that Globus refers to permissions
By the interface, Globus supports adding shares by email address, by
Globus username or by Globus group name. This module sticks to using
email address. acl_add() takes an endpoint, an email address you're
sharing to, and a boolean indicating whether this share is
read
-only or
read
-
write
. acl_add() returns a share id.
acl_remove() uses that share id to identify which shares are to be
removed.
acl_list() returns an array of hashes containing the information about
each
user
with
access to an endpoint, including the share ID and
permissions.
endpoint_add_shared
endpoint_list
endpoint_search
endpoint_remove
endpoint_add_shared() handles the specific case of creating an endpoint
from an existing endpoint, not the general case. It takes the endpoint
where you
're sharing from, the path you'
re sharing, and the endpoint
you
're creating. If you are user '
user' and creating the endpoint
'test'
, the command takes
'test'
, not
'user#test'
.
endpoint_remove and endpoint_list, however, take a full endpoint name,
like
'user#test'
.
Current usage is endpoint_list
for
a list of all
our
shares, and
endpoint_search
for
details of
each
individual share
list_my_endpoints
search_my_endpoints
list_my_endpoints() and search_my_endpoints() were added once I
discovered the failings of existing list and search. These tools
return
a hashref of hashrefs holding the owner, host_endpoint,
host_endpoint_name, credential_status, and most importantly, the id,
legacy_name and display_name.
For older shares, legacy_name will be something like
'purduegcore#hr00001_firstshare'
and display_name will be
'n/a'
,
while
for
newer shares, legacy_name will be
'purduegcore#SAME_AS_ID'
and
display_name will be like older shares' legacy_name,
'purduegcore#hr99999_filled_the_space'
. In both cases, the value you
UUID.
endpoint_activate
endpoint_add
endpoint_deactivate
endpoint_modify
endpoint_rename
Stubs
OTHER
help
history
man
lib/Acme/Globus.pm view on Meta::CPAN
333435363738394041424344454647484950515253rather than covering all the capabilities of the Globus CLI. It is
therefore very stubtastic.
This module also relies very much on SSH, and thus the rules of
private and public
keys
. Therefore, using it as a shared tool would
be ill-advised
if
not impossible.
=head1 SYNOPSIS
my $g = Globus->new($username,$path_to_ssh_key) ;
$g->endpoint_add_shared( 'institution#endpoint', $directory, $endpoint_name ) ;
$g->acl_add( $endpoint . '/', 'djacoby@example.com' ) ;
=head1 METHODS
=head2 BASICS
=head3 B<new>
Creates a new Globus object. Takes two options:
the username and path to the SSH key you use to connect to Globus.
lib/Acme/Globus.pm view on Meta::CPAN
124125126127128129130131132133134135136137138139140141142143144145=head3 B<delete>
=head3 B<rm>
Currently stubs
=head3 B<scp>
=head3 B<transfer>
Both commands take a source, or from path (including endpoint),
a destination, or to path (includint endpoint), and a boolean indicating
whether you're copying recursively or not.
=cut
sub
delete
{ }
sub
rm { }
sub
scp {
my
(
$self
,
$from_path
,
$to_path
,
$recurse
) =
@_
;
$recurse
=
$recurse
?
'-r'
:
''
;
lib/Acme/Globus.pm view on Meta::CPAN
189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360=head3 B<acl_add>
=head3 B<acl_list>
=head3 B<acl_remove>
acl-* is the way that Globus refers to permissions
By the interface, Globus supports adding shares by email address,
by Globus username or by Globus group name. This module sticks to
using email address. acl_add() takes an endpoint, an email address
you're sharing to, and a boolean indicating whether this share is
read-only or read-write. acl_add() returns a share id.
acl_remove() uses that share id to identify which shares are to be
removed.
acl_list() returns an array of hashes containing the information about
each user with access to an endpoint, including the share ID and permissions.
=cut
sub
identity_details {
my
(
$self
,
$identity_id
) =
@_
;
my
$command
=
qq{identity-details $identity_id }
;
my
$result
= _globus_action(
$command
,
$self
->{username},
$self
->{key_path} ) ;
return
{}
unless
$result
=~ m{\w} ;
my
$obj
= decode_json
$result
;
return
wantarray
?
%$obj
:
$obj
;
}
sub
acl_add {
my
(
$self
,
$endpoint
,
,
$rw
) =
@_
;
my
$readwrite
=
'rw'
;
$readwrite
=
'r'
unless
$rw
;
my
$command
=
qq{acl-add $endpoint --identityusername=${email}
--perm
$readwrite
}
;
my
$result
= _globus_action(
$command
,
$self
->{username},
$self
->{key_path} ) ;
my
(
$id
) =
reverse
grep
{m{\w}}
split
m{\s},
$result
;
return
$id
;
}
sub
acl_list {
my
(
$self
,
$endpoint
) =
@_
;
my
$command
=
qq{acl-list $endpoint}
;
my
$result
= _globus_action(
$command
,
$self
->{username},
$self
->{key_path} ) ;
my
$slist
= decode_json
$result
;
my
@list
=
grep
{
$_
->{permissions} ne
'rw'
}
@$slist
;
return
wantarray
?
@list
: \
@list
;
}
sub
acl_remove {
my
(
$self
,
$endpoint_uuid
,
$share_uuid
) =
@_
;
my
$command
=
qq{acl-remove $endpoint_uuid --id $share_uuid}
;
my
$result
= _globus_action(
$command
,
$self
->{username},
$self
->{key_path} ) ;
return
$result
;
}
=head3 B<endpoint_add_shared>
=head3 B<endpoint_list>
=head3 B<endpoint_search>
=head3 B<endpoint_remove>
endpoint_add_shared() handles the specific case of creating an endpoint
from an existing endpoint, not the general case. It takes the endpoint
where you're sharing from, the path you're sharing, and the endpoint
you're creating. If you are user 'user' and creating the endpoint 'test',
the command takes 'test', not 'user#test'.
endpoint_remove and endpoint_list, however, take a full endpoint name, like 'user#test'.
Current usage is endpoint_list for a list of all our shares, and endpoint_search
for details of each individual share
=head3 B<list_my_endpoints>
=head3 B<search_my_endpoints>
list_my_endpoints() and search_my_endpoints() were added once I discovered
the failings of existing list and search. These tools return a hashref
of hashrefs holding the owner, host_endpoint, host_endpoint_name,
credential_status, and most importantly, the id, legacy_name and display_name.
For older shares, legacy_name will be something like 'purduegcore#hr00001_firstshare'
and display_name will be 'n/a', while for newer shares, legacy_name will be
'purduegcore#SAME_AS_ID' and display_name will be like older shares' legacy_name,
'purduegcore#hr99999_filled_the_space'. In both cases, the value you want
to use to get details or to remove a share is the id, which is a UUID.
=cut
sub
endpoint_add_shared {
my
(
$self
,
$sharer_endpoint
,
$path
,
$endpoint
) =
@_
;
# my $command
# = qq{endpoint-add --sharing "$sharer_endpoint$path" $endpoint } ;
# my $command
# = qq{endpoint-add -n $endpoint --sharing "$sharer_endpoint$path" } ;
my
$command
=
join
' '
,
q{endpoint-add}
,
q{--sharing}
,
"$sharer_endpoint$path"
,
q{-n}
,
$endpoint
,
;
my
$result
= _globus_action(
$command
,
$self
->{username},
$self
->{key_path} ) ;
return
$result
;
}
# sub endpoint_list {
# my ( $self, $endpoint ) = @_ ;
# my $command ;
# if ($endpoint) {
# $command = qq{endpoint-list $endpoint } ;
# }
# else {
# $command = qq{endpoint-list} ;
# }
# my $result
# = _globus_action( $command, $self->{username}, $self->{key_path} ) ;
# my @result = map { ( split m{\s}, $_ )[0] } split "\n", $result ;
# return wantarray ? @result : \@result ;
# }
#lists all my endpoint
sub
endpoint_list {
my
(
$self
) =
@_
;
my
$command
=
'endpoint-search --scope=my-endpoints'
;
my
$result
= _globus_action(
$command
,
$self
->{username},
$self
->{key_path} ) ;
my
@result
=
map
{ s{\s}{}g ;
$_
}
map
{ (
reverse
split
m{:} )[0] }
grep
{m{Legacy}}
split
m{\n},
$result
;
return
wantarray
?
@result
: \
@result
;
}
sub
endpoint_search {
my
(
$self
,
$search
) =
@_
;
return
{}
unless
$search
;
my
$command
=
qq{endpoint-search $search --scope=my-endpoints}
;
my
$result
= _globus_action(
$command
,
$self
->{username},
$self
->{key_path} ) ;
my
%result
=
map
{
chomp
;
my
(
$k
,
$v
) =
split
m{\s*:\s},
$_
;
$k
=>
$v
}
split
m{\n},
$result
;
return
wantarray
?
%result
: \
%result
;
}
sub
list_my_endpoints {
my
(
$self
) =
@_
;
my
$command
=
'endpoint-search --scope=my-endpoints'
;
my
$result
= _globus_action(
$command
,
$self
->{username},
$self
->{key_path} ) ;
my
%result
=
map
{
my
$hash
;
%$hash
=
map
{
my
(
$k
,
$v
) =
split
m{\s*:\s*} ;
$k
=~ s{\s+}{_}gmx ;
$k
=
lc
$k
;
$k
=>
$v
}
lib/Acme/Globus.pm view on Meta::CPAN
362363364365366367368369370371372373374375376377378379380381382383384385
my
$id
=
$hash
->{display_name} ne
'n/a'
?
$hash
->{display_name}
:
$hash
->{legacy_name} ;
$id
=>
$hash
;
}
split
m{\n\n},
$result
;
return
wantarray
?
%result
: \
%result
;
}
sub
search_my_endpoints {
my
(
$self
,
$search
) =
@_
;
my
%result
;
my
$command
=
qq{endpoint-search $search --scope=my-endpoints}
;
my
$result
= _globus_action(
$command
,
$self
->{username},
$self
->{key_path} ) ;
%result
=
map
{
my
$hash
;
%$hash
=
map
{
my
(
$k
,
$v
) =
split
m{\s*:\s*} ;
$k
=~ s{\s+}{_}gmx ;
$k
=
lc
$k
;
$k
=>
$v
}
lib/Acme/Globus.pm view on Meta::CPAN
387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
my
$id
=
$hash
->{display_name} ne
'n/a'
?
$hash
->{display_name}
:
$hash
->{legacy_name} ;
$id
=>
$hash
;
}
split
m{\n\n},
$result
;
return
wantarray
?
%result
: \
%result
;
}
sub
endpoint_remove {
my
(
$self
,
$endpoint
) =
@_
;
my
$command
=
qq{endpoint-remove $endpoint}
;
my
$result
= _globus_action(
$command
,
$self
->{username},
$self
->{key_path} ) ;
return
$result
;
}
# Sucks. Use endpoint_search instead
sub
endpoint_details {
my
(
$self
,
$endpoint
) =
@_
;
my
$command
=
qq{endpoint-details $endpoint}
;
my
$result
= _globus_action(
$command
,
$self
->{username},
$self
->{key_path} ) ;
my
%result
=
map
{
chomp
;
my
(
$key
,
$value
) =
split
m{\s*:\s*},
$_
;
$key
=>
$value
}
split
m{\n},
$result
;
return
wantarray
?
%result
: \
%result
;
}
=head3 B<endpoint_activate>
=head3 B<endpoint_add>
=head3 B<endpoint_deactivate>
=head3 B<endpoint_modify>
=head3 B<endpoint_rename>
Stubs
=cut
sub
endpoint_activate { }
sub
endpoint_add { }
sub
endpoint_deactivate { }
sub
endpoint_modify { }
sub
endpoint_rename { }
=head2 OTHER
=head3 B<help>
=head3 B<history>
=head3 B<man>
=head3 B<profile>
( run in 0.618 second using v1.01-cache-2.11-cpan-49f99fa48dc )