Chef-REST-Client

 view release on metacpan or  search on metacpan

lib/Chef.pm  view on Meta::CPAN

    my ($self,$organization_name) = (@_);
       $self->{ 'ORGANIZATION_NAME' } = $organization_name if defined $organization_name;
    return $self->{ 'ORGANIZATION_NAME' };
  }
  sub hosted_chef {
    my ($self,$hosted_chef) = (@_);
       $self->{ 'HOSTED_CHEF_' } = $hosted_chef if defined $server;;
    return $self->{ 'HOSTED_CHEF' };
  }
  
  sub private_key {
    my ($self,$private_key) = (@_);
           $self->{ 'CHEF_CLIENT_PRIVATE_KEY' } = $private_key if defined $private_key;
    return $self->{ 'CHEF_CLIENT_PRIVATE_KEY' };
  }
}#nwe

__DATA__

=pod

=head1 NAME 

lib/Chef/Encoder.pm  view on Meta::CPAN


1.1

=head1 SYNOPSIS

 use Chef::Encoder;

 my $obj  = new Chef::Encoder
           ( 
             'data'             => $data
           , 'private_key_file' => ../data/private_key.pem
           );
           
    $obj->pki->sign     ( 'data' => $data );
    $obj->sha1->digest  ( 'data' => $data );
    $obj->base64->encode( 'data' => $data );
    $obj->base64->decode( 'data' => $data );
    
=head1 DESCRIPTION

This module imiplements methods that perform the encoding and decoding and signing of the header

lib/Chef/Encoder.pm  view on Meta::CPAN

+------------------------+

=end html    

=head1 METHODS

=head2 Chef::Encoder( %params )

return new object initialzied as per %params.

=head2 private_key_file 

returns $private_key_file 

=head2 private_key

returns $private_key

=head2 data

returns $data

=cut


my @base;
BEGIN {

lib/Chef/Encoder.pm  view on Meta::CPAN

};

sub new {
  my $class = shift;
  my $param = {@_};
  my $self  = {};
  my $_tmp =  pop @base; #lib;  
  bless $self, $class;
    
    $self->{'data'            } = $param->{'data'} if defined $param->{'data'};
    $self->{'private_key_file'} = join '/' , @base , 'data', 'private_key.pem';
    $self->{'private_key_file'} = $param->{'private_key_file'} if defined $param->{'private_key_file'};

    push @base , $_tmp;
     
  return $self;
}

sub private_key_file {
  my $self = shift;
  return $self->{'private_key_file'};
}

sub private_key {
  my $self = shift;
  return $self->{'private_key'};
}

sub execute {
  my ($self , $command) = (@_);
  my $output = undef;
  eval {
  		$output = `$command`;
  		chomp($output);
  };
  return ($@) ? undef : $output;
}

sub data
{ $_[0]->{'data'} = $_[1] if defined $_[1]; return $_[0]->{'data'}; }

=pod

=head2 pki ( %params)

loads L<Chef::Encoder::pki> class and returns new object of class L<Chef::Encoder::pki>
it accepts ( 'private_key_file' => $private_key_file , 'private_key' => $private_key )
if none is provided it will try to use the values initialized from parent class L<Chef::Encoder>

=head3 NAME

Chef::Encoder::pki

=head3 VERSION

1.0

=head3 DESCRIPTION

This class provides siging request as per private key specified.

=head3 METHODS

=head4 B<sign>

returns signed data based on the private_key_file or privete_key

=cut

#----------------------------#
#  class Chef::Encoder::pki  #
#----------------------------#

sub pki {
  my $class = shift;
  my $param = {@_};
  
  package Chef::Encoder::pki;
  use parent qw{ Chef::Encoder };
  use Crypt::OpenSSL::RSA; 
  use File::Slurp;

  my $self = {};
  bless $self, qw { Chef::Encoder::pki };
  
  $self->{'private_key_file'} = (defined($param->{'private_key_file'}))?
                                         $param->{'private_key_file'}  :
                                         $class->private_key_file;
  $self->{'private_key'} = (defined($param->{'private_key'}))?
                                    $param->{'private_key'}  :
                                    $class->private_key;
  return $self;

    sub sign {
      my $self = shift;
      my $param = {@_};
      my $data = $param->{'data'};
      my $private_key = $self->private_key_file;

      return $self->execute("echo -n '$data'| openssl rsautl -sign -inkey $private_key| openssl enc -base64");
    }

    sub rsa_private {
      my $self = shift;
      my $param = {@_};
      $self->{'private_key'} = read_file( $param->{'private_key_file'} ) if
                                 defined( $param->{'private_key_file'} ) ;
                                 
      my $_openssl_rsa_obj;
      eval {
         $_openssl_rsa_obj = Crypt::OpenSSL::RSA->new_private_key( 
      								defined( $param->{'private_key'} ) ?
      								         $param->{'private_key'}   :
      								         $self->private_key 
                             );
      };
      return ($@)? $self : $_openssl_rsa_obj;
    }
    
    sub private_key {
      my $self = shift;

      if( !defined( $self->{'private_key'} ) ){
        $self->{'private_key'} = read_file( $self->private_key_file );
      }

      return $self->{'private_key'};
    }
    
    sub private_key_file {
      my $self = shift;
      return $self->{'private_key_file'};
    }

}# package pki ends

=pod

=head2 sha1 ( %params)

loads L<Chef::Encoder::sha1> class and returns new object of class L<Chef::Encoder::sha1>
it accepts ( 'data' => $data )

lib/Chef/Header.pm  view on Meta::CPAN

  sub header {
    my $class = shift;
    my $param = {@_};
    
    package Chef::Header::header;

    use parent -norequire,qw { Chef::Header };
       
    my $self = new Chef::Header::header();

    $self->_chef_encoder( new Chef::Encoder( 'private_key_file'  => $class->private_key ) );
    
    $self->Method          ($param->{'Method'         });
    $self->HashedPath      ($param->{'Path'           });
    $self->XOpsContentHash ($param->{'Content'        });
    #$self->XOpsTimestamp   ($param->{'X-Ops-Timestamp'  });
    $self->XOpsUserId      ($class->name               );
  
    #default_values
    #$self->Accept          ($param->{'Accept'         });
    $self->Host            ($class->server             );

lib/Chef/REST/Client.pm  view on Meta::CPAN

=head1 VERSION

1.2

=head1 SYNOPSIS

use Chef::REST::Client;

my $obj = new Chef::REST::Client
          ( 'chef_client_name' => $chef_client_name ,
            'chef_client_privaate_key' => $private_key );

   $obj->private_key( $private_key );
   $obj->name( $chef_client_name );
   $obj->roles('vagrant')->details;
   $obj->roles('vagrant','environments')->details
   $obj->roles->list;
   
   $obj->search( 'secrets' , {  q => 'id:centrify', rows => 1 } )->details
   
   $obj->environments(<env_name>,'cookbooks' , <cookbook_name>)->details;

   $obj->environments(<env_name>,'cookbooks_versions'

lib/Chef/REST/Client.pm  view on Meta::CPAN

use parent qw { Chef::REST };
use Mojo::JSON;
use Module::Load;
use vars qw { $AUTOLOAD };

sub new {
  my $class = shift;
  my $param = {@_};
  my $self  = $class->SUPER::new(@_);
     $self->name($param->{'chef_client_name'}) if defined $param->{'chef_client_name'};
     $self->private_key($param->{'chef_client_private_key'}) if defined $param->{'chef_client_private_key'};     
  bless $self, $class;
  return $self;
}

sub name {
  my ($self,$client_name) = (@_);
         $self->{ 'CHEF_CLIENT' } = $client_name if defined $client_name;
  return $self->{ 'CHEF_CLIENT' };
}

t/Chef/Encoder.t  view on Meta::CPAN

  pop @base;
  pop @base;    
  push @INC , join  '/', @base, 'lib';
};

use_ok( 'Chef::Encoder' );

use_ok(  'File::Slurp' );

my $obj = new_ok( 'Chef::Encoder' );
my $pk = join '/' , @base , 'data', 'private_key.pem';

if (  ! -e $pk )
{
   diag " $pk does not exist skipping all tests";
   done_testing;
   exit 0;
}

subtest 'sha1 tests' => sub {
  isa_ok( $obj->sha1 , 'Chef::Encoder::sha1' );

t/Chef/Encoder.t  view on Meta::CPAN

};

subtest 'base64 tests' => sub {
  isa_ok( $obj->base64 , 'Chef::Encoder::base64');
  #ok( $obj->base64( 'data' => 'bhavin' )->encode , 'encoding "bhavin" to base64 ');
};


subtest 'pki tests' => sub {
  isa_ok( $obj->pki , 'Chef::Encoder::pki' );
  ok( $obj->pki->rsa_private( 'private_key_file' => $pk )->sign( 'bhavin' ) , 'sign' );
  ok( $obj->pki
          ->rsa_private( 'private_key_file' => $pk )
          ->verify( 'bhavin',
                    $obj->pki
                        ->rsa_private( 'private_key_file' => $pk )
                        ->sign( 'bhavin' )
                  ),
             "verifying signature" 
          );
};

done_testing;

t/Chef/Header.t  view on Meta::CPAN


use_ok( 'Chef::Header' );
my $obj = new_ok( 'Chef::Header', [
    ]);
ok( $obj->header , 'header' );
ok( $obj->header->hash , 'header has' );
ok( $obj->header->chef_header, 'header chef header' );

subtest 'header verification' => sub {

	my $private_key_file = join '/', @base, 'data', 'private_key.pem';
	my $public_key_file  = join '/', @base, 'data', 'public_key.pem';

	plan skip_all => 'private and public key files not present' 
	unless -e $private_key_file && $public_key_file;

	plan skip_all => 'specific to env';

	use Crypt::OpenSSL::RSA;
	use File::Slurp;

	my $h = $obj->header->chef_header->XOpsAuthorization ;
	my $e = join '', ( $h->{'X-Ops-Authorization-1'} ,
   	                $h->{'X-Ops-Authorization-2'} ,
      	             $h->{'X-Ops-Authorization-3'} ,
         	          $h->{'X-Ops-Authorization-4'} ,
            	       $h->{'X-Ops-Authorization-5'} ,
               	    $h->{'X-Ops-Authorization-6'} );

  	my $public_key = read_file( $public_key_file );
  	my $private_key = read_file ( $private_key_file);
	
	my $rsa_pri = Crypt::OpenSSL::RSA->new_private_key( $private_key );
  
	my $chef_header = $obj->header->chef_header->to_string;
  
  	use Chef::Encoder;
  	my $ce = new Chef::Encoder();
  	my $sign = $rsa_pri->sign( $chef_header );
    
  pass;
};



( run in 0.560 second using v1.01-cache-2.11-cpan-4d50c553e7e )