source: ocsinventory-agent/trunk/fuentes/lib/Ocsinventory/Agent/Network.pm @ 468

Last change on this file since 468 was 468, checked in by mabarracus, 4 years ago

Copyt trusty code

File size: 6.4 KB
Line 
1package Ocsinventory::Agent::Network;
2# TODO:
3#  - set the correct deviceID and olddeviceID
4use strict;
5use warnings;
6
7use LWP::UserAgent;
8use Socket;
9
10use Ocsinventory::Compress;
11
12sub new {
13  my (undef, $params) = @_;
14
15  my $self = {};
16 
17  $self->{accountconfig} = $params->{accountconfig}; 
18  $self->{accountinfo} = $params->{accountinfo}; 
19  $self->{common} = $params->{common}; 
20
21  my $logger = $self->{logger} = $params->{logger};
22
23  $self->{config} = $params->{config};
24  my $uaserver;
25
26  if ($self->{config}->{server} =~ /^http(|s):\/\//) {
27      $self->{URI} = $self->{config}->{server};
28      $uaserver = $self->{config}->{server};
29      $uaserver =~ s/^http(|s):\/\///;
30      $uaserver =~ s/\/.*//;
31      if ($uaserver !~ /:\d+$/) {
32          $uaserver .= ':443' if $self->{config}->{server} =~ /^https:/;
33          $uaserver .= ':80' if $self->{config}->{server} =~ /^http:/;
34      }
35  } else {
36      $self->{URI} = "http://".$self->{config}->{server}.$self->{config}->{remotedir};
37      $uaserver = $self->{config}->{server};
38  }
39
40
41  $self->{compress} = new Ocsinventory::Compress ({logger => $logger});
42  # Connect to server
43  $self->{ua} = LWP::UserAgent->new(keep_alive => 1);
44  if ($self->{config}->{proxy}) {
45    $self->{ua}->proxy(['http', 'https'], $self->{config}->{proxy});
46  }  else {
47    $self->{ua}->env_proxy;
48  }
49  my $version = 'OCS-NG_unified_unix_agent_v';
50  $version .= exists ($self->{config}->{VERSION})?$self->{config}->{VERSION}:'';
51  $self->{ua}->agent($version);
52    $self->{config}->{user}.",".
53    $self->{config}->{password}."";
54  $self->{ua}->credentials(
55    $uaserver, # server:port, port is needed
56    $self->{config}->{realm},
57    $self->{config}->{user},
58    $self->{config}->{password}
59  );
60
61  bless $self;
62}
63
64
65sub sendXML {
66  my ($self, $args) = @_;
67
68  my $logger = $self->{logger};
69  my $compress = $self->{compress};
70  my $message = $args->{message};
71
72  my $common = $self->{common};
73
74  my $req = HTTP::Request->new(POST => $self->{URI});
75
76  $req->header('Pragma' => 'no-cache', 'Content-type',
77    'application/x-compress');
78
79  $logger->debug ("sending XML");
80
81
82  $logger->debug ("sending: ".$message);
83
84  my $compressed = $compress->compress($message);
85
86  if (!$compressed) {
87    $logger->error ('failed to compress data');
88    return;
89  }
90
91  $req->content($compressed);
92
93  my $res = $self->{ua}->request($req);
94
95  # Checking if connected
96  if(!$res->is_success) {
97    $logger->error ('Cannot establish communication : '.$res->status_line);
98    return;
99  }
100
101  return $res ;
102
103}
104
105sub getXMLResp {
106
107  my ($self, $res, $msgtype) = @_;
108  my $logger = $self->{logger};
109  my $compress = $self->{compress};
110
111  #If no answer from OCS server
112  return unless $res;
113
114  #Reading the XML response from OCS server
115  my $content = $compress->uncompress($res->content);
116
117  if (!$content) {
118    $logger->error ("Deflating problem");
119    return;
120  }
121
122  my $tmp = "Ocsinventory::Agent::XML::Response::".$msgtype;
123  eval "require $tmp";
124  if ($@) {
125      $logger->error ("Can't load response module $tmp: $@");
126  }
127  $tmp->import();
128  my $response = $tmp->new ({
129     accountconfig => $self->{accountconfig},
130     accountinfo => $self->{accountinfo},
131     content => $content,
132     logger => $logger,
133     #origmsg => $message,
134     config => $self->{config},
135     common => $self->{common},
136
137  });
138
139  return $response;
140}
141
142
143sub getHttpFile {
144  my ($self,$uri,$filetoget,$filepath) = @_;
145  my $url = "http://$uri/$filetoget";
146
147  $self->{ua}->mirror($url,$filepath);
148}
149
150sub getHttpsFile {
151  my ($self, $uri, $filetoget, $filepath ,$certfile, $installpath) = @_ ;
152
153  my $logger = $self->{logger};
154  my ($ctx, $ssl, $got);
155
156  if ($self->{common}->can_load('Net::SSLeay')) {
157
158    eval {
159      $| = 1;
160      $logger->debug('Initialize ssl layer...');
161
162      # Initialize openssl
163      if ( -e '/dev/urandom') {
164        $Net::SSLeay::random_device = '/dev/urandom';
165        $Net::SSLeay::how_random = 512;
166      } else {
167        srand (time ^ $$ ^ unpack "%L*", `ps wwaxl | gzip`);
168        $ENV{RND_SEED} = rand 4294967296;
169      }
170
171      Net::SSLeay::randomize();
172      Net::SSLeay::load_error_strings();
173      Net::SSLeay::ERR_load_crypto_strings();
174      Net::SSLeay::SSLeay_add_ssl_algorithms();
175
176      #Create ctx object
177      $ctx = Net::SSLeay::CTX_new() or die_now("Failed to create SSL_CTX $!");
178      Net::SSLeay::CTX_load_verify_locations( $ctx, "$installpath/$certfile", $installpath )
179      or die_now("CTX load verify loc: $!");
180
181      # Tell to SSLeay where to find AC file (or dir)
182      Net::SSLeay::CTX_set_verify($ctx, &Net::SSLeay::VERIFY_PEER,0);
183      Net::SSLeay::die_if_ssl_error('callback: ctx set verify');
184
185      my($server_name,$server_port,$server_dir);
186
187      if($uri =~ /^([^:]+):(\d{1,5})(.*)$/){
188        $server_name = $1;
189        $server_port = $2;
190        $server_dir = $3;
191      } elsif ($uri =~ /^([^\/]+)(.*)$/) {
192        $server_name = $1;
193        $server_dir = $2;
194        $server_port = '443';
195      }
196
197      $server_dir .= '/' unless $server_dir=~/\/$/;
198
199      $server_name = gethostbyname ($server_name) or die;
200      my $dest_serv_params  = pack ('S n a4 x8', &AF_INET, $server_port, $server_name );
201
202      # Connect to server
203      $logger->debug("Connect to server: $uri...");
204      socket  (SOCKET, &AF_INET, &SOCK_STREAM, 0) or die "socket: $!";
205      connect (SOCKET, $dest_serv_params) or die "connect: $!";
206
207      # Flush socket
208      select  (SOCKET); $| = 1; select (STDOUT);
209      $ssl = Net::SSLeay::new($ctx) or die_now("Failed to create SSL $!");
210      Net::SSLeay::set_fd($ssl, fileno(SOCKET));
211
212      # SSL handshake
213      $logger->debug('Starting SSL connection...');
214      Net::SSLeay::connect($ssl);
215      Net::SSLeay::die_if_ssl_error('callback: ssl connect!');
216
217      # Get file
218      my $http_request = "GET /$server_dir/$filetoget HTTP/1.0\n\n";
219      Net::SSLeay::ssl_write_all($ssl, $http_request);
220      shutdown SOCKET, 1;
221
222      $got = Net::SSLeay::ssl_read_all($ssl);
223      $got = (split("\r\n\r\n", $got))[1] or die;
224
225      #Create file on disk
226      open FILE, ">$filepath" or die("Cannot open info file: $!");
227      print FILE $got;
228      close FILE;
229    };
230
231    if($@){
232      $logger->error("Error: SSL hanshake has failed");
233      Net::SSLeay::free ($ssl) if $ssl;
234      Net::SSLeay::CTX_free ($ctx);
235      close SOCKET;
236      return 0; 
237    }
238    else {
239      $logger->debug("Success. :-)");
240      Net::SSLeay::free ($ssl);
241      Net::SSLeay::CTX_free ($ctx);
242      close SOCKET;
243    }
244
245  } else {      #Exit if can't load Net::SSLeay
246    return 0;
247  }
248
249  1;
250}
251
252
2531;
Note: See TracBrowser for help on using the repository browser.