# # (c) Jan Gehring <jan.gehring@gmail.com> # # vim: set ts=2 sw=2 tw=0: # vim: set expandtab: package Rex::Interface::Fs::HTTP; use strict; use warnings; our $VERSION = '1.7.0'; # VERSION use Rex::Commands; use Rex::Interface::Exec; use Rex::Interface::Fs::Base; use Data::Dumper; BEGIN { use Rex::Require; MIME::Base64->use; } use base qw(Rex::Interface::Fs::Base); sub new { my $that = shift; my $proto = ref($that) || $that; my $self = $proto->SUPER::new(@_); bless( $self, $proto ); return $self; } sub ls { my ( $self, $path ) = @_; my $resp = connection->post( "/fs/ls", { path => $path } ); if ( $resp->{ok} ) { return @{ $resp->{ls} }; } } sub is_dir { my ( $self, $path ) = @_; my $resp = connection->post( "/fs/is_dir", { path => $path } ); return $resp->{ok}; } sub is_file { my ( $self, $file ) = @_; my $resp = connection->post( "/fs/is_file", { path => $file } ); return $resp->{ok}; } sub unlink { my ( $self, @files ) = @_; my $ok = 0; for my $file (@files) { my $resp = connection->post( "/fs/unlink", { path => $file } ); $ok = $resp->{ok}; } return $ok; } sub mkdir { my ( $self, $dir ) = @_; my $resp = connection->post( "/fs/mkdir", { path => $dir } ); return $resp->{ok}; } sub stat { my ( $self, $file ) = @_; my $resp = connection->post( "/fs/stat", { path => $file } ); if ( $resp->{ok} ) { return %{ $resp->{stat} }; } return undef; ## no critic ProhibitExplicitReturnUndef } sub is_readable { my ( $self, $file ) = @_; my $resp = connection->post( "/fs/is_readable", { path => $file } ); return $resp->{ok}; } sub is_writable { my ( $self, $file ) = @_; my $resp = connection->post( "/fs/is_writable", { path => $file } ); return $resp->{ok}; } sub readlink { my ( $self, $file ) = @_; my $resp = connection->post( "/fs/readlink", { path => $file } ); if ( $resp->{ok} ) { return $resp->{link}; } } sub rename { my ( $self, $old, $new ) = @_; my $resp = connection->post( "/fs/rename", { old => $old, new => $new } ); return $resp->{ok}; } sub glob { my ( $self, $glob ) = @_; my $resp = connection->post( "/fs/glob", { glob => $glob } ); if ( $resp->{ok} ) { return @{ $resp->{glob} }; } } sub upload { my ( $self, $source, $target ) = @_; my $resp = connection->upload( [ content => [$source], path => $target ] ); return $resp->{ok}; } sub download { my ( $self, $source, $target ) = @_; my $resp = connection->post( "/fs/download", { path => $source } ); if ( $resp->{ok} ) { open( my $fh, ">", $target ) or die($!); print $fh decode_base64( $resp->{content} ); close($fh); return 1; } return 0; } sub ln { my ( $self, $from, $to ) = @_; Rex::Logger::debug("Symlinking files: $to -> $from"); my $resp = connection->post( "/fs/ln", { from => $from, to => $to } ); return $resp->{ok}; } sub rmdir { my ( $self, @dirs ) = @_; Rex::Logger::debug( "Removing directories: " . join( ", ", @dirs ) ); my $ok = 0; for my $dir (@dirs) { my $resp = connection->post( "/fs/rmdir", { path => $dir } ); $ok = $resp->{ok}; } return $ok; } sub chown { my ( $self, $user, $file, @opts ) = @_; my $resp = connection->post( "/fs/chown", { user => $user, path => $file, options => {@opts}, } ); return $resp->{ok}; } sub chgrp { my ( $self, $group, $file, @opts ) = @_; my $resp = connection->post( "/fs/chgrp", { group => $group, path => $file, options => {@opts}, } ); return $resp->{ok}; } sub chmod { my ( $self, $mode, $file, @opts ) = @_; my $resp = connection->post( "/fs/chmod", { mode => $mode, path => $file, options => {@opts}, } ); return $resp->{ok}; } sub cp { my ( $self, $source, $dest ) = @_; my $resp = connection->post( "/fs/cp", { source => $source, dest => $dest, } ); return $resp->{ok}; } 1;