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

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

Copyt trusty code

File size: 28.2 KB
Line 
1###############################################################################
2## OCSINVENTORY-NG
3## Copyleft Guillaume PROTET 2010
4## Web : http://www.ocsinventory-ng.org
5##
6## This code is open source and may be copied and modified as long as the source
7## code is always made freely available.
8## Please refer to the General Public Licence http://www.gnu.org/ or Licence.txt
9################################################################################
10
11package Ocsinventory::Agent::Common;
12
13use strict;
14no strict 'refs';
15use warnings;
16
17##################################################################################
18#  Ocsinventory::Agent::Common is use to give common methods to other modules   #
19##################################################################################
20
21sub new {
22  my (undef, $params) = @_;
23
24  my $self = {};
25
26  $self->{logger} = $params->{logger};
27  $self->{config} = $params->{config};
28
29  $self->{xmltags}={};
30
31  bless $self;
32}
33
34=item addController()
35
36Add a controller in the inventory.
37
38=cut
39sub addController {
40  my ($self, $args) = @_; 
41  my $xmltags=$self->{xmltags};
42
43  my $driver = $args->{DRIVER};
44  my $name = $args->{NAME};
45  my $manufacturer = $args->{MANUFACTURER};
46  my $pciid = $args->{PCIID};
47  my $pcislot = $args->{PCISLOT};
48  my $type = $args->{TYPE};
49
50  push @{$xmltags->{CONTROLLERS}},
51  {
52    DRIVER => [$driver?$driver:''],
53    NAME => [$name],
54    MANUFACTURER => [$manufacturer],
55    PCIID => [$pciid?$pciid:''],
56    PCISLOT => [$pcislot?$pcislot:''],
57    TYPE => [$type],
58  };
59}
60
61=item addModem()
62
63Add a modem in the inventory.
64
65=cut
66sub addModem {
67  my ($self, $args) = @_; 
68  my $xmltags=$self->{xmltags};
69
70  my $description = $args->{DESCRIPTION};
71  my $name = $args->{NAME};
72
73  push @{$xmltags->{MODEMS}},
74  {
75
76    DESCRIPTION => [$description],
77    NAME => [$name],
78
79  };
80}
81
82# For compatibiliy
83sub addModems {
84   my $self = shift;
85   my $logger = $self->{logger};
86
87   $logger->debug("please rename addModems to addModem()");
88   $self->addModem(@_);
89}
90
91=item addDrive()
92
93Add a partition in the inventory.
94
95=cut
96sub addDrive {
97  my ($self, $args) = @_; 
98  my $xmltags=$self->{xmltags};
99
100  my $createdate = $args->{CREATEDATE};
101  my $free = $args->{FREE};
102  my $filesystem = $args->{FILESYSTEM};
103  my $label = $args->{LABEL};
104  my $serial = $args->{SERIAL};
105  my $total = $args->{TOTAL};
106  my $type = $args->{TYPE};
107  my $volumn = $args->{VOLUMN};
108
109  push @{$xmltags->{DRIVES}},
110  {
111    CREATEDATE => [$createdate?$createdate:''],
112    FREE => [$free?$free:''],
113    FILESYSTEM => [$filesystem?$filesystem:''],
114    LABEL => [$label?$label:''],
115    SERIAL => [$serial?$serial:''],
116    TOTAL => [$total?$total:''],
117    TYPE => [$type?$type:''],
118    VOLUMN => [$volumn?$volumn:'']
119  };
120}
121# For compatibiliy
122sub addDrives {
123   my $self = shift;
124   my $logger = $self->{logger};
125
126   $logger->debug("please rename addDrives to addDrive()");
127   $self->addDrive(@_);
128}
129
130=item addStorages()
131
132Add a storage system (hard drive, USB key, SAN volume, etc) in the inventory.
133
134=cut
135sub addStorages {
136  my ($self, $args) = @_; 
137  my $xmltags=$self->{xmltags};
138
139  my $description = $args->{DESCRIPTION};
140  my $disksize = $args->{DISKSIZE};
141  my $manufacturer = $args->{MANUFACTURER};
142  my $model = $args->{MODEL};
143  my $name = $args->{NAME};
144  my $type = $args->{TYPE};
145  my $serial = $args->{SERIAL};
146  my $serialnumber = $args->{SERIALNUMBER};
147  my $firmware = $args->{FIRMWARE};
148  my $scsi_coid = $args->{SCSI_COID};
149  my $scsi_chid = $args->{SCSI_CHID};
150  my $scsi_unid = $args->{SCSI_UNID};
151  my $scsi_lun = $args->{SCSI_LUN};
152
153  $serialnumber = $serialnumber?$serialnumber:$serial;
154
155  push @{$xmltags->{STORAGES}},
156  {
157
158    DESCRIPTION => [$description?$description:''],
159    DISKSIZE => [$disksize?$disksize:''],
160    MANUFACTURER => [$manufacturer?$manufacturer:''],
161    MODEL => [$model?$model:''],
162    NAME => [$name?$name:''],
163    TYPE => [$type?$type:''],
164    SERIALNUMBER => [$serialnumber?$serialnumber:''],
165    FIRMWARE => [$firmware?$firmware:''],
166    SCSI_COID => [$scsi_coid?$scsi_coid:''],
167    SCSI_CHID => [$scsi_chid?$scsi_chid:''],
168    SCSI_UNID => [$scsi_unid?$scsi_unid:''],
169    SCSI_LUN => [$scsi_lun?$scsi_lun:''],
170
171  };
172}
173
174# For compatibiliy
175sub addStorage {
176   my $self = shift;
177   my $logger = $self->{logger};
178
179   $logger->debug("please rename addStorages to addStorage()");
180   $self->addStorage(@_);
181}
182
183
184=item addMemory()
185
186Add a memory module in the inventory.
187
188=cut
189sub addMemory {
190  my ($self, $args) = @_; 
191  my $xmltags=$self->{xmltags};
192
193  my $capacity = $args->{CAPACITY};
194  my $speed =  $args->{SPEED};
195  my $type = $args->{TYPE};
196  my $description = $args->{DESCRIPTION};
197  my $caption = $args->{CAPTION};
198  my $numslots = $args->{NUMSLOTS};
199
200  my $serialnumber = $args->{SERIALNUMBER};
201
202  push @{$xmltags->{MEMORIES}},
203  {
204
205    CAPACITY => [$capacity?$capacity:''],
206    DESCRIPTION => [$description?$description:''],
207    CAPTION => [$caption?$caption:''],
208    SPEED => [$speed?$speed:''],
209    TYPE => [$type?$type:''],
210    NUMSLOTS => [$numslots?$numslots:0],
211    SERIALNUMBER => [$serialnumber?$serialnumber:'']
212
213  };
214}
215
216# For compatibiliy
217sub addMemories {
218   my $self = shift;
219   my $logger = $self->{logger};
220
221   $logger->debug("please rename addMemories to addMemory()");
222   $self->addMemory(@_);
223}
224
225=item addPort()
226
227Add a port module in the inventory.
228
229=cut
230sub addPorts{
231  my ($self, $args) = @_; 
232  my $xmltags=$self->{xmltags};
233
234  my $caption = $args->{CAPTION};
235  my $description = $args->{DESCRIPTION};
236  my $name = $args->{NAME};
237  my $type = $args->{TYPE};
238
239
240  push @{$xmltags->{PORTS}},
241  {
242
243    CAPTION => [$caption?$caption:''],
244    DESCRIPTION => [$description?$description:''],
245    NAME => [$name?$name:''],
246    TYPE => [$type?$type:''],
247
248  };
249}
250
251# For compatibiliy
252sub addPort {
253   my $self = shift;
254   my $logger = $self->{logger};
255
256   $logger->debug("please rename addPorts to addPort()");
257   $self->addPort(@_);
258}
259
260=item addSlot()
261
262Add a slot in the inventory.
263
264=cut
265sub addSlot {
266  my ($self, $args) = @_; 
267  my $xmltags=$self->{xmltags};
268
269  my $description = $args->{DESCRIPTION};
270  my $designation = $args->{DESIGNATION};
271  my $name = $args->{NAME};
272  my $status = $args->{STATUS};
273
274
275  push @{$xmltags->{SLOTS}},
276  {
277
278    DESCRIPTION => [$description?$description:''],
279    DESIGNATION => [$designation?$designation:''],
280    NAME => [$name?$name:''],
281    STATUS => [$status?$status:''],
282
283  };
284}
285
286# For compatibiliy
287sub addSlots {
288   my $self = shift;
289   my $logger = $self->{logger};
290
291   $logger->debug("please rename addSlots to addSlot()");
292   $self->addSlot(@_);
293}
294
295=item addSoftware()
296
297Register a software in the inventory.
298
299=cut
300sub addSoftware {
301  my ($self, $args) = @_; 
302  my $xmltags=$self->{xmltags};
303
304  my $comments = $args->{COMMENTS};
305  my $filesize = $args->{FILESIZE};
306  my $folder = $args->{FOLDER};
307  my $from = $args->{FROM};
308  my $installdate = $args->{INSTALLDATE};
309  my $name = $args->{NAME};
310  my $publisher = $args->{PUBLISHER};
311  my $version = $args->{VERSION};
312
313
314  push @{$xmltags->{SOFTWARES}},
315  {
316
317    COMMENTS => [$comments?$comments:''],
318    FILESIZE => [$filesize?$filesize:''],
319    FOLDER => [$folder?$folder:''],
320    FROM => [$from?$from:''],
321    INSTALLDATE => [$installdate?$installdate:''],
322    NAME => [$name?$name:''],
323    PUBLISHER => [$publisher?$publisher:''],
324    VERSION => [$version],
325
326  };
327}
328
329# For compatibiliy
330sub addSoftwares {
331   my $self = shift;
332   my $logger = $self->{logger};
333
334   $logger->debug("please rename addSoftwares to addSoftware()");
335   $self->addSoftware(@_);
336}
337
338=item addMonitor()
339
340Add a monitor (screen) in the inventory.
341
342=cut
343sub addMonitor {
344  my ($self, $args) = @_; 
345  my $xmltags=$self->{xmltags};
346
347  my $base64 = $args->{BASE64};
348  my $caption = $args->{CAPTION};
349  my $description = $args->{DESCRIPTION};
350  my $manufacturer = $args->{MANUFACTURER};
351  my $serial = $args->{SERIAL};
352  my $uuencode = $args->{UUENCODE};
353
354
355  push @{$xmltags->{MONITORS}},
356  {
357
358    BASE64 => [$base64?$base64:''],
359    CAPTION => [$caption?$caption:''],
360    DESCRIPTION => [$description?$description:''],
361    MANUFACTURER => [$manufacturer?$manufacturer:''],
362    SERIAL => [$serial?$serial:''],
363    UUENCODE => [$uuencode?$uuencode:''],
364
365  };
366}
367
368# For compatibiliy
369sub addMonitors {
370   my $self = shift;
371   my $logger = $self->{logger};
372
373   $logger->debug("please rename addMonitors to addMonitor()");
374   $self->addMonitor(@_);
375}
376
377=item addVideo()
378
379Add a video card in the inventory.
380
381=cut
382sub addVideo {
383  my ($self, $args) = @_; 
384  my $xmltags=$self->{xmltags};
385
386  my $chipset = $args->{CHIPSET};
387  my $memory = $args->{MEMORY};
388  my $name = $args->{NAME};
389  my $resolution = $args->{RESOLUTION};
390
391  push @{$xmltags->{VIDEOS}},
392  {
393
394    CHIPSET => [$chipset?$chipset:''],
395    MEMORY => [$memory?$memory:''],
396    NAME => [$name?$name:''],
397    RESOLUTION => [$resolution?$resolution:''],
398
399  };
400}
401
402# For compatibiliy
403sub addVideos {
404   my $self = shift;
405   my $logger = $self->{logger};
406
407   $logger->debug("please rename addVideos to addVideo()");
408   $self->addVideo(@_);
409}
410
411=item addSound()
412
413Add a sound card in the inventory.
414
415=cut
416sub addSound {
417  my ($self, $args) = @_; 
418  my $xmltags=$self->{xmltags};
419
420  my $description = $args->{DESCRIPTION};
421  my $manufacturer = $args->{MANUFACTURER};
422  my $name = $args->{NAME};
423
424  push @{$xmltags->{SOUNDS}},
425  {
426
427    DESCRIPTION => [$description?$description:''],
428    MANUFACTURER => [$manufacturer?$manufacturer:''],
429    NAME => [$name?$name:''],
430
431  };
432}
433
434# For compatibiliy
435sub addSounds {
436   my $self = shift;
437   my $logger = $self->{logger};
438
439   $logger->debug("please rename addSounds to addSound()");
440   $self->addSound(@_);
441}
442
443=item addNetwork()
444
445Register a network in the inventory.
446
447=cut
448sub addNetwork {
449  # TODO IPSUBNET, IPMASK IPADDRESS seem to be missing.
450  my ($self, $args) = @_; 
451  my $xmltags=$self->{xmltags};
452
453  my $description = $args->{DESCRIPTION};
454  my $driver = $args->{DRIVER};
455  my $ipaddress = $args->{IPADDRESS};
456  my $ipdhcp = $args->{IPDHCP};
457  my $ipgateway = $args->{IPGATEWAY};
458  my $ipmask = $args->{IPMASK};
459  my $ipsubnet = $args->{IPSUBNET};
460  my $macaddr = $args->{MACADDR};
461  my $pcislot = $args->{PCISLOT};
462  my $status = $args->{STATUS};
463  my $type = $args->{TYPE};
464  my $virtualdev = $args->{VIRTUALDEV};
465
466
467#  return unless $ipaddress;
468
469  push @{$xmltags->{NETWORKS}},
470  {
471
472    DESCRIPTION => [$description?$description:''],
473    DRIVER => [$driver?$driver:''],
474    IPADDRESS => [$ipaddress?$ipaddress:''],
475    IPDHCP => [$ipdhcp?$ipdhcp:''],
476    IPGATEWAY => [$ipgateway?$ipgateway:''],
477    IPMASK => [$ipmask?$ipmask:''],
478    IPSUBNET => [$ipsubnet?$ipsubnet:''],
479    MACADDR => [$macaddr?$macaddr:''],
480    PCISLOT => [$pcislot?$pcislot:''],
481    STATUS => [$status?$status:''],
482    TYPE => [$type?$type:''],
483    VIRTUALDEV => [$virtualdev?$virtualdev:''],
484
485  };
486}
487# For compatibiliy
488sub addNetworks {
489   my $self = shift;
490   my $logger = $self->{logger};
491
492   $logger->debug("please rename addNetworks to addNetwork()");
493   $self->addNetwork(@_);
494}
495
496
497=item setHardware()
498
499Save global information regarding the machine.
500
501The use of setHardware() to update USERID and PROCESSOR* informations is
502deprecated, please, use addUser() and addCPU() instead.
503
504=cut
505sub setHardware {
506  my ($self, $args, $nonDeprecated) = @_; 
507  my $xmltags=$self->{xmltags};
508
509  my $logger = $self->{logger};
510
511  foreach my $key (qw/USERID OSVERSION PROCESSORN OSCOMMENTS CHECKSUM
512    PROCESSORT NAME PROCESSORS SWAP ETIME TYPE OSNAME IPADDR WORKGROUP
513    DESCRIPTION MEMORY UUID DNS LASTLOGGEDUSER
514    DATELASTLOGGEDUSER DEFAULTGATEWAY VMSYSTEM/) {
515
516    if (exists $args->{$key}) {
517      if ($key eq 'PROCESSORS' && !$nonDeprecated) {
518          $logger->debug("PROCESSORN, PROCESSORS and PROCESSORT shouldn't be set directly anymore. Please use addCPU() method instead.");
519      }
520      if ($key eq 'USERID' && !$nonDeprecated) {
521          $logger->debug("USERID shouldn't be set directly anymore. Please use addCPU() method instead.");
522      }
523
524      $xmltags->{'HARDWARE'}{$key}[0] = $args->{$key};
525    }
526  }
527}
528
529
530=item setBios()
531
532Set BIOS informations.
533
534=cut
535sub setBios {
536  my ($self, $args) = @_; 
537  my $xmltags=$self->{xmltags};
538
539  foreach my $key (qw/SMODEL SMANUFACTURER SSN BDATE BVERSION BMANUFACTURER MMANUFACTURER MSN MMODEL ASSETTAG/) {
540
541    if (exists $args->{$key}) {
542      $xmltags->{'BIOS'}{$key}[0] = $args->{$key};
543    }
544  }
545}
546
547=item addCPU()
548
549Add a CPU in the inventory.
550
551=cut
552sub addCPU {
553  my ($self, $args) = @_; 
554  my $xmltags=$self->{xmltags};
555
556  # The CPU FLAG
557  my $manufacturer = $args->{MANUFACTURER};
558  my $type = $args->{TYPE};
559  my $serial = $args->{SERIAL};
560  my $speed = $args->{SPEED};
561
562  push @{$xmltags->{CPUS}},
563  {
564
565    MANUFACTURER => [$manufacturer],
566    TYPE => [$type],
567    SERIAL => [$serial],
568    SPEED => [$speed],
569
570  };
571
572  # For the compatibility with HARDWARE/PROCESSOR*
573  my $processorn = int @{$xmltags->{CPUS}};
574  my $processors = $xmltags->{CPUS}[0]{SPEED}[0];
575  my $processort = $xmltags->{CPUS}[0]{TYPE}[0];
576
577  $self->setHardware ({
578    PROCESSORN => $processorn,
579    PROCESSORS => $processors,
580    PROCESSORT => $processort,
581  }, 1);
582
583}
584
585=item addUser()
586
587Add an user in the list of logged user.
588
589=cut
590sub addUser {
591  my ($self, $args) = @_; 
592  my $xmltags=$self->{xmltags};
593
594#  my $name  = $args->{NAME};
595#  my $gid   = $args->{GID};
596  my $login = $args->{LOGIN};
597#  my $uid   = $args->{UID};
598
599  return unless $login;
600
601  # Is the login, already in the XML ?
602  foreach my $user (@{$xmltags->{USERS}}) {
603      return if $user->{LOGIN}[0] eq $login;
604  }
605
606  push @{$xmltags->{USERS}},
607  {
608
609#      NAME => [$name],
610#      UID => [$uid],
611#      GID => [$gid],
612      LOGIN => [$login]
613
614  };
615
616  my $userString = $xmltags->{HARDWARE}->{USERID}[0] || "";
617
618  $userString .= '/' if $userString;
619  $userString .= $login;
620
621  $self->setHardware ({
622    USERID => $userString,
623  }, 1);
624
625}
626
627=item addPrinter()
628
629Add a printer in the inventory.
630
631=cut
632sub addPrinter {
633  my ($self, $args) = @_; 
634  my $xmltags=$self->{xmltags};
635
636  my $description = $args->{DESCRIPTION};
637  my $driver = $args->{DRIVER};
638  my $name = $args->{NAME};
639  my $port = $args->{PORT};
640
641  push @{$xmltags->{PRINTERS}},
642  {
643
644    DESCRIPTION => [$description?$description:''],
645    DRIVER => [$driver?$driver:''],
646    NAME => [$name?$name:''],
647    PORT => [$port?$port:''],
648
649  };
650}
651
652# For compatibiliy
653sub addPrinters {
654   my $self = shift;
655   my $logger = $self->{logger};
656
657   $logger->debug("please rename addPrinters to addPrinter()");
658   $self->addPrinter(@_);
659}
660
661=item addVirtualMachine()
662
663Add a Virtual Machine in the inventory.
664
665=cut
666sub addVirtualMachine {
667  my ($self, $args) = @_; 
668  my $xmltags=$self->{xmltags};
669
670  # The CPU FLAG
671  my $memory = $args->{MEMORY};
672  my $name = $args->{NAME};
673  my $uuid = $args->{UUID};
674  my $status = $args->{STATUS};
675  my $subsystem = $args->{SUBSYSTEM};
676  my $vmtype = $args->{VMTYPE};
677  my $vcpu = $args->{VCPU};
678  my $vmid = $args->{VMID};
679
680  push @{$xmltags->{VIRTUALMACHINES}},
681  {
682
683      MEMORY =>  [$memory],
684      NAME => [$name],
685      UUID => [$uuid],
686      STATUS => [$status],
687      SUBSYSTEM => [$subsystem],
688      VMTYPE => [$vmtype],
689      VCPU => [$vcpu],
690      VMID => [$vmid],
691
692  };
693
694}
695
696=item addProcess()
697
698Record a running process in the inventory.
699
700=cut
701sub addProcess {
702  my ($self, $args) = @_; 
703  my $xmltags=$self->{xmltags};
704
705  my $user = $args->{USER};
706  my $pid = $args->{PID};
707  my $cpu = $args->{CPUUSAGE};
708  my $mem = $args->{MEM};
709  my $vsz = $args->{VIRTUALMEMORY};
710  my $tty = $args->{TTY};
711  my $started = $args->{STARTED};
712  my $cmd = $args->{CMD};
713
714  push @{$xmltags->{PROCESSES}},
715  {
716    USER => [$user?$user:''],
717    PID => [$pid?$pid:''],
718    CPUUSAGE => [$cpu?$cpu:''],
719    MEM => [$mem?$mem:''],
720    VIRTUALMEMORY => [$vsz?$vsz:0],
721    TTY => [$tty?$tty:''],
722    STARTED => [$started?$started:''],
723    CMD => [$cmd?$cmd:''],
724  };
725}
726
727
728=item addIpDiscoverEntry()
729
730IpDiscover is used to identify network interface on the local network. This
731is done on the ARP level.
732
733This function adds a network interface in the inventory.
734
735=cut
736sub addIpDiscoverEntry {
737  my ($self, $args) = @_; 
738  my $xmltags=$self->{xmltags};
739
740  my $ipaddress = $args->{IPADDRESS};
741  my $macaddr = $args->{MACADDR};
742  my $name = $args->{NAME};
743
744  if (!$xmltags->{IPDISCOVER}{H}) {
745    $xmltags->{IPDISCOVER}{H} = [];
746  }
747
748  push @{$xmltags->{IPDISCOVER}{H}}, {
749    # If I or M is undef, the server will ingore the host
750    I => [$ipaddress?$ipaddress:""],
751    M => [$macaddr?$macaddr:""],
752    N => [$name?$name:"-"], # '-' is the default value reteurned by ipdiscover
753  };
754}
755
756
757=item setAccessLog()
758
759What is that for? :)
760
761=cut
762sub setAccessLog {
763  my ($self, $args) = @_;
764
765  foreach my $key (qw/USERID LOGDATE/) {
766
767    if (exists $args->{$key}) {
768      $self->{xmlroot}{'CONTENT'}{'ACCESSLOG'}{$key}[0] = $args->{$key};
769    }
770  }
771}
772
773=item flushXMlTags()
774
775Clear the content of $common->{xmltags} (to use after adding it in XML)
776
777=cut
778sub flushXMLTags {
779  my $self= shift;
780  $self->{xmltags} = {};
781}
782
783
784### SNMP specifics subroutines ####
785
786sub getSnmpTable {
787  my ($self,$snmp_table,$baseoid,$snmp_infos) = @_;
788
789  #$snmp_infos is a hash passed for the SNMP informations we want to get
790  #It has to be created like this :
791  #my $hash = {
792  #  INFORMATION => OID,
793  #};
794
795  my $results={};  #The final hash wich will contain one key per SNMP reference
796
797  for my $oid ( keys %$snmp_table ) {
798    if ( $oid =~ /$baseoid\.\d+\.\d+\.(\S+)/ ) {
799      my $reference=$1;    #Getting the last digits of the OID separated by a dot
800
801      #Getting information if one the values from $snmp_infos hash is found for the current OID
802      for my $value (keys %$snmp_infos) {
803        if ($oid =~ /$snmp_infos->{$value}\.$reference/) {
804        $results->{$reference}->{$value}= $snmp_table->{$oid}
805        }
806      }
807    }
808  }
809  return $results;
810}
811
812
813sub setSnmpCommons {
814  my ($self,$args)=@_; 
815  my $xmltags=$self->{xmltags};
816 
817  foreach my $key (qw/IPADDR MACADDR SNMPDEVICEID NAME DESCRIPTION CONTACT LOCATION UPTIME DOMAIN TYPE / ) {
818     if (exists $args->{$key}) {
819        $xmltags->{COMMON}[0]{$key}[0]=$args->{$key};
820     }
821  }
822}
823
824sub setSnmpPrinter {
825  my ($self,$args)=@_;
826  my $xmltags=$self->{xmltags};
827
828  foreach my $key (qw/NAME SERIALNUMBER COUNTER STATUS ERRORSTATE/ ) {
829     if (exists $args->{$key}) {
830        $xmltags->{PRINTERS}[0]{$key}[0]=$args->{$key};
831     }
832  }
833}
834
835
836sub setSnmpSwitchInfos {
837  my ($self,$args)=@_;
838  my $xmltags=$self->{xmltags};
839
840  foreach my $key (qw/TYPE/ ) {
841     if (exists $args->{$key}) {
842        $xmltags->{SWITCHINFOS}[0]{$key}[0]=$args->{$key};
843     }
844  }
845}
846
847sub setSnmpFirewalls {
848  my ($self,$args)=@_; 
849  my $xmltags=$self->{xmltags};
850
851  foreach my $key (qw/SERIALNUMBER SYSTEM/ ) {
852     if (exists $args->{$key}) {
853        $xmltags->{FIREWALLS}[0]{$key}[0]=$args->{$key};
854     }
855  }
856}
857
858
859sub setSnmpLoadBalancer {
860  my ($self,$args)=@_; 
861  my $xmltags=$self->{xmltags};
862
863  foreach my $key (qw/SERIALNUMBER SYSTEM/ ) {
864     if (exists $args->{$key}) {
865        $xmltags->{LOADBALANCERS}[0]{$key}[0]=$args->{$key};
866     }
867  }
868}
869
870sub setSnmpBlade {
871  my ($self,$args)=@_; 
872  my $xmltags=$self->{xmltags};
873
874  foreach my $key (qw/SERIALNUMBER SYSTEM/ ) {
875     if (exists $args->{$key}) {
876        $xmltags->{BLADES}[0]{$key}[0]=$args->{$key};
877     }
878  }
879}
880
881sub setSnmpComputer {
882  my ($self,$args)=@_; 
883  my $xmltags=$self->{xmltags};
884
885  foreach my $key (qw/SYSTEM/ ) {
886     if (exists $args->{$key}) {
887        $xmltags->{COMPUTERS}[0]{$key}[0]=$args->{$key};
888     }
889  }
890}
891
892sub addSnmpPrinterCartridge {
893  my ($self,$args)=@_;
894  my $xmltags=$self->{xmltags};
895  my $content={};
896
897  if ( ! defined ($xmltags->{CARDS})) {
898     $xmltags->{CARTRIDGES}=[];
899  }
900
901  foreach my $key (qw/DESCRIPTION TYPE LEVEL MAXCAPACITY COLOR/) {
902     if (exists $args->{$key}) {
903        $content->{$key}[0]=$args->{$key};
904     }
905  }
906  push @{$xmltags->{CARTRIDGES}},$content;
907
908}
909
910sub addSnmpPrinterTray {
911  my ($self,$args)=@_;
912  my $xmltags=$self->{xmltags};
913  my $content={};
914
915  if ( ! defined ($xmltags->{CARDS})) {
916     $xmltags->{TRAYS}=[];
917  }
918
919  foreach my $key (qw/NAME DESCRIPTION LEVEL MAXCAPACITY/) {
920     if (exists $args->{$key}) {
921        $content->{$key}[0]=$args->{$key};
922     }
923  }
924  push @{$xmltags->{TRAYS}},$content;
925
926}
927
928sub addSnmpNetwork {
929  my ($self,$args)=@_;
930  my $xmltags=$self->{xmltags};
931  my $content={};
932  if ( ! defined ($xmltags->{NETWORKS})) {
933     $xmltags->{NETWORKS}=[];
934  }
935
936  foreach my $key (qw/DESCRIPTION MACADDR DEVICEMACADDR SLOT STATUS SPEED TYPE DEVICEADDRESS DEVICENAME DEVICEPORT DEVICETYPE TYPEMIB IPADDR IPMASK IPGATEWAY IPSUBNET IPDHCP DRIVER VIRTUALDEV/) {
937     if (exists $args->{$key}) {
938        $content->{$key}[0]=$args->{$key};
939     }
940  }
941  #if ( exists $args->{VLAN}) {
942  #     $content->{VLAN}=$args->{VLAN};
943  #}
944  push @{$xmltags->{NETWORKS}},$content;
945}
946
947sub addSnmpCard {
948  my ($self,$args)=@_; 
949  my $xmltags=$self->{xmltags};
950  my $content={};
951
952  if ( ! defined ($xmltags->{CARDS})) {
953     $xmltags->{CARDS}=[];
954  }
955
956  foreach my $key (qw/DESCRIPTION REFERENCE FIRMWARE SOFTWARE REVISION SERIALNUMBER MANUFACTURER TYPE/) {
957     if (exists $args->{$key}) {
958        $content->{$key}[0]=$args->{$key};
959     }
960  }
961  push @{$xmltags->{CARDS}},$content;
962
963}
964
965sub addSnmpFan {
966  my ($self,$args)=@_; 
967  my $xmltags=$self->{xmltags};
968  my $content={};
969
970  if ( ! defined ($xmltags->{FANS})) {
971     $xmltags->{FANS}=[];
972  }
973
974  foreach my $key (qw/DESCRIPTION REFERENCE REVISION SERIALNUMBER MANUFACTURER TYPE/) {
975     if (exists $args->{$key}) {
976        $content->{$key}[0]=$args->{$key};
977     }
978  }
979  push @{$xmltags->{FANS}},$content;
980}
981
982sub addSnmpPowerSupply {
983  my ($self,$args)=@_; 
984  my $xmltags=$self->{xmltags};
985  my $content={};
986
987  if ( ! defined ($xmltags->{POWERSUPPLIES})) {
988     $xmltags->{POWERSUPPLIES}=[];
989  }
990
991  foreach my $key (qw/MANUFACTURER REFERENCE TYPE SERIALNUMBER DESCRIPTION REVISION/ ) {
992     if (exists $args->{$key}) {
993        $content->{$key}[0]=$args->{$key};
994     }
995  }
996  push @{$xmltags->{POWERSUPPLIES}},$content;
997}
998
999sub addSnmpSwitch {
1000  my ($self,$args)=@_; 
1001  my $xmltags=$self->{xmltags};
1002  my $content={};
1003  if ( ! defined ($xmltags->{SWITCHS})) {
1004     $xmltags->{SWITCHS}=[];
1005  }
1006
1007  foreach my $key (qw/MANUFACTURER REFERENCE TYPE SOFTVERSION FIRMVERSION SERIALNUMBER REVISION DESCRIPTION/) {
1008     if (exists $args->{$key}) {
1009        $content->{$key}[0]=$args->{$key};
1010     }
1011  }
1012  push @{$xmltags->{SWITCHS}},$content;
1013}
1014
1015sub addSnmpLocalPrinter {
1016  my ($self,$args)=@_; 
1017  my $xmltags=$self->{xmltags};
1018  my $content={};
1019  if ( ! defined ($xmltags->{LOCALPRINTERS})) {
1020     $xmltags->{LOCALPRINTERS}=[];
1021  }
1022
1023  foreach my $key (qw/NAME/) {
1024     if (exists $args->{$key}) {
1025        $content->{$key}[0]=$args->{$key};
1026     }
1027  }
1028  push @{$xmltags->{LOCALPRINTERS}},$content;
1029
1030}
1031
1032sub addSnmpInput {
1033  my ($self,$args)=@_; 
1034  my $xmltags=$self->{xmltags};
1035  my $content={};
1036  if ( ! defined ($xmltags->{INPUTS})) {
1037     $xmltags->{INPUTS}=[];
1038  }
1039
1040  foreach my $key (qw/DESCRIPTION TYPE/) {
1041     if (exists $args->{$key}) {
1042        $content->{$key}[0]=$args->{$key};
1043     }
1044  }
1045  push @{$xmltags->{INPUTS}},$content;
1046
1047}
1048
1049
1050sub addSnmpCPU {
1051  my ($self,$args)=@_; 
1052  my $xmltags=$self->{xmltags};
1053  my $content={};
1054  if ( ! defined ($xmltags->{CPUS})) {
1055     $xmltags->{CPUS}=[];
1056  }
1057
1058  foreach my $key (qw/MANUFACTURER TYPE SPEED/) {
1059     if (exists $args->{$key}) {
1060        $content->{$key}[0]=$args->{$key};
1061     }
1062  }
1063  push @{$xmltags->{CPUS}},$content;
1064
1065}
1066
1067
1068#Subroutinne to add 0 in 'Sun like' MAC adress if needed
1069sub padSnmpMacAddress {
1070  my ($self,$mac) = @_;
1071
1072  my @splitedAddr = split(':', $mac);
1073
1074  for (@splitedAddr) {
1075    unless ($_ =~ /\w{2}/) {
1076       $_ = sprintf("%02s", $_);
1077    }
1078  }
1079
1080  $mac=join (':', @splitedAddr);
1081  return $mac;
1082}
1083
1084
1085sub cleanXml {
1086  my ($self,$content) = @_;
1087
1088  my $logger = $self->{logger};
1089
1090  my $clean_content;
1091
1092  # To avoid strange breakage I remove the unprintable characters in the XML
1093  foreach (split "\n", $content) {
1094    if (! m/\A(
1095    [\x09\x0A\x0D\x20-\x7E]            # ASCII
1096    | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
1097    |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
1098    | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
1099    |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
1100    |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
1101    | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
1102    |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
1103    )*\z/x) {
1104      s/[[:cntrl:]]//g;
1105      $self->{logger}->debug("non utf-8 '".$_."'");
1106    }
1107
1108    # Is that a good idea. Intent to drop some nasty char
1109    # s/[A-z0-9_\-<>\/:\.,#\ \?="'\(\)]//g;
1110    $clean_content .= $_."\n";
1111  }
1112
1113  return $clean_content;
1114}
1115
1116#Subroutine to read XML structure (returned by XML::Simple::XMLin) and encode content in utf8.
1117sub readXml {
1118  my ($self, $xml, $forcearray) = @_;
1119
1120  my $logger = $self->{logger};
1121  my $content = XML::Simple::XMLin($xml, ForceArray => [@{$forcearray}]);
1122
1123  foreach my $key (keys %$content) {
1124    if (grep(/^$key$/, @{$forcearray})) {  #Forced array in XML parsing
1125      $self->parseXmlArray($content->{$key},$forcearray);
1126    }
1127    else {  #Not a forced array in XML parsing
1128       if (ref ($content->{$key}) =~ /^HASH$/ && !keys %{$content->{$key}}) {  # If empty hash from XMLin()
1129         $content->{$key} = '';
1130       } else { utf8::encode($content->{$key}) }; 
1131    }
1132  }
1133  return $content;
1134}
1135
1136#Subroutine to parse array in XML structure (returned by XML::Simple::XMLin) and encode it in utf8
1137sub parseXmlArray {
1138  my ($self,$array,$forcearray) = @_;
1139
1140  foreach my $hash (@{$array}) {
1141    foreach my $key (keys %$hash) {
1142      if ( grep (/^$key$/,@$forcearray)) {  #Forced array in XML parsing
1143        $self->parseXmlArray($hash->{$key},$forcearray);   
1144      } else {  #Not a forced array in XML parsing
1145          if (ref ($hash->{$key}) =~ /^HASH$/ && !keys %{$hash->{$key}}) {  # If empty hash from XMLin()
1146            $hash->{$key} = ''; 
1147          } else { utf8::encode($hash->{$key}) };
1148      }
1149    }
1150  }
1151}
1152
1153
1154#Subroutine to convert versions to numbers (with icutting or right padding if needed)
1155# We create it because Perl 5.8 does not include version comparison modules or functions
1156sub convertVersion {
1157  my ($self,$version,$length) = @_;
1158
1159  $version =~ s/\.//g;  #We convert to number
1160  my $ver_length = length ($version);
1161
1162  if ($ver_length > $length) {  # We cut the number
1163    $version = substr $version, 0, $length;
1164  } elsif ($ver_length < $length) { #We add 0 to the right
1165   $version = substr($version . (0 x $length), 0, $length);
1166
1167  }
1168  return $version;
1169}
1170
1171#We create this subroutine because MacOSX system_profiler XML output does not give all
1172#the neeeded data (for videos and sounds for example)
1173sub get_sysprofile_devices_names {
1174  my ($self,$type) = @_;
1175
1176  return(undef) unless -r '/usr/sbin/system_profiler';
1177
1178  my $output=`system_profiler $type`;
1179  my $name;
1180  my $names=[];
1181
1182  #Code inspired from Mac::Sysprofile 0.03 from Daniel Muey
1183  for(split /\n/, $output) {
1184    next if m/^\s*$/ || m/^\w/;
1185    if(m/^\s{4}\w/) {
1186      $name = $_;
1187      $name =~ s/^\s+//;
1188      $name =~ s/:.*$//;
1189      push(@$names,$name);
1190    }
1191  }
1192
1193  return $names;
1194}
1195
1196
1197### Generic shared subroutines #####
1198
1199sub can_run {
1200  my $self = shift;
1201  my $binary = shift;
1202
1203  my $logger = $self->{logger};
1204
1205  my $calling_namespace = caller(0);
1206  chomp(my $binpath=`which $binary 2>/dev/null`);
1207  return unless -x $binpath;
1208  $self->{logger}->debug(" - $binary found");
1209  1;
1210}
1211
1212sub can_load {
1213  my $self = shift;
1214  my $module = shift;
1215
1216  my $logger = $self->{logger};
1217
1218  my $calling_namespace = caller(0);
1219  eval "package $calling_namespace; use $module;";
1220  return if $@;
1221  $self->{logger}->debug(" - $module loaded");
1222  1;
1223}
1224
1225
1226sub can_read {
1227  my $self = shift;
1228  my $file = shift;
1229
1230  my $logger = $self->{logger};
1231
1232  return unless -r $file;
1233  $self->{logger}->debug(" - $file can be read");
1234  1;
1235}
1236
1237sub runcmd {
1238  my $self = shift;
1239  my $cmd = shift;
1240
1241  my $logger = $self->{logger};
1242
1243  return unless $cmd;
1244
1245  # $self->{logger}->debug(" - run $cmd");
1246  return `$cmd`;
1247}
1248
1249
1250#### Old subroutines from the former Common.pm used by Download.pm #######
1251
1252sub get_path{
1253   my $self = shift;
1254   my $binary = shift;
1255   my $path;
1256
1257   my @bin_directories  = qw {   /usr/local/sbin/ /sbin/ /usr/sbin/ /bin/ /usr/bin/
1258            /usr/local/bin/ /etc/ocsinventory-client/};
1259
1260   print "\n=> retrieving $binary...\n" if $::debug;
1261   for(@bin_directories){
1262      $path = $_.$binary,last if -x $_.$binary;
1263   }
1264
1265   #For debbuging purposes
1266   if($path){
1267      print "=> $binary is at $path\n\n" if $::debug;
1268   }else{
1269      print "$binary not found (Maybe it is not installed ?) - Some functionnalities may lack !!\n\n";
1270   }
1271
1272   return $path;
1273}
1274
1275sub already_in_array {
1276   my $self = shift;
1277   my $lookfor = shift;
1278   my @array   = @_;
1279   foreach (@array){
1280      if($lookfor eq $_){
1281         return 1 ;
1282      }
1283   }
1284   return 0;
1285}
1286
12871;
Note: See TracBrowser for help on using the repository browser.