File Coverage

blib/lib/File/SambaMSNRL.pm
Criterion Covered Total %
statement 15 297 5.0
branch 0 58 0.0
condition 0 21 0.0
subroutine 5 22 22.7
pod 17 17 100.0
total 37 415 8.9


line stmt bran cond sub pod time code
1             package File::SambaMSNRL;
2              
3 1     1   27161 use Carp;
  1         2  
  1         63  
4 1     1   5 use warnings;
  1         2  
  1         23  
5 1     1   5 use strict;
  1         5  
  1         28  
6 1     1   861 use File::Copy;
  1         10942  
  1         96  
7              
8             =head1 Module de gestion du fichier de configuration de samba (smb.conf)
9              
10             File::SambaMSNRL - Gestion de la configuration de Samba
11              
12             =head1 VERSION
13              
14             Version 0.02
15              
16             =cut
17              
18              
19 1     1   11 use Exporter ();
  1         2  
  1         4152  
20             our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
21              
22             $VERSION = 0.02;
23              
24             @ISA = qw(Exporter);
25             @EXPORT_OK = qw(
26             new
27             GetGlobal
28             ModifGlobal
29             AddParamGlobal
30             DelParamGlobal
31             ValeurSection
32             ListPartages
33             CreaPartage
34             ListSections
35             CreaSection
36             ModifSection
37             DelPartage
38             DelValue
39             Sauve
40             );
41            
42             =head1 Méthodes Objets
43              
44             =head2 new("fichier_conf_samba");
45              
46             Le fichier indiqué doit correspondre à un fichier de configuration de samba
47             Il doit posséder au minimum une partie [global] et au moins un partage
48              
49             Retourne un nouvel objet
50              
51             Example :
52             my $objet=File::SambaMSNRL->new("/etc/samba/smb.conf);
53              
54             =cut
55              
56             sub new {
57 0     0 1   my $classe = shift;
58 0           my $smbconf = shift;
59 0           my (%global,%det_partages,@partages,%new_partage);
60              
61 0           my $self = {
62             "SMB" => "/etc/samba/smb.conf",
63             "GLOBAL" => \%global,
64             "DET_PARTAGES" => \%det_partages,
65             "PARTAGES" => \@partages,
66             "NEW_PARTAGE" => \%new_partage
67             };
68 0 0         $self->{SMB} = $smbconf if (defined $smbconf);
69            
70 0           bless($self,$classe);
71            
72             ### Chargement du fichier samba
73 0           my @global = $self->TakeGlobal;
74 0           $self->TakePartages;
75              
76 0           return($self);
77             }
78              
79             =head2 GetGlobal
80              
81             Lit et renvoi la partie [global] du fichier smb.conf
82             Le retour se fait sous la forme d'un Hash
83              
84             Params:
85             Aucun
86             Returns:
87             Hash du global
88             Example:
89             my %global = $smb->GetGlobal;
90              
91             =cut
92              
93             sub GetGlobal {
94 0     0 1   my $this = shift;
95 0           my %GLOBAL = %{$this->{GLOBAL}};
  0            
96              
97 0           return (%GLOBAL);
98             };
99              
100             =head2 ModifGlobal([parametre],[nouvelle_valeur]);
101              
102             Modifie l'un des parametres de la partie [global] du smb.conf
103              
104             Params:
105             parametre = Le parametre du global à modifier
106             nouvelle_valeur = la valeur du parametre à modifier
107             Returns:
108             Retourne 1 si la modification a été effectuée
109             Retourne 0 si pas de modification
110             Example:
111             my $retour = $smb->ModifGlobal("workgroup","DOMAINE1");
112             if ($retour == 1) {print("La modification du parametre s'est déroulée avec succés\n");
113              
114             =cut
115              
116             sub ModifGlobal {
117 0     0 1   my $this = shift;
118 0           my $param = shift;
119 0           my $value = shift;
120              
121 0           my $return = 0;
122              
123 0           my %GLOBAL = %{$this->{GLOBAL}};
  0            
124              
125 0           $param = lc($param);
126              
127 0 0         if (exists $GLOBAL{$param}) {
128 0           $GLOBAL{$param} = $value;
129 0           $return = 1;
130             };
131              
132 0           $this->{GLOBAL} = \%GLOBAL;
133            
134 0           return($this,$return);
135             };
136              
137             =head2 AddParamGlobal ([parametre_a_ajouter],[valeur_du_parametre]);
138              
139             Ajoute un nouveau parametre sur la partie [global] du smb.conf
140              
141             Params:
142             parametre_a_ajouter = le nom du parametre à ajouter dans la partie global
143             valeur_du_parametre = la valeur de ce parametre
144             Returns:
145             -
146             Example:
147             $smb->AddParamGlobal("guest ok","Yes");
148              
149             =cut
150              
151             sub AddParamGlobal {
152 0     0 1   my $this = shift;
153 0           my $param = shift;
154 0           my $value = shift;
155              
156 0           $param = lc($param);
157              
158 0           my %GLOBAL = %{$this->{GLOBAL}};
  0            
159              
160 0           $GLOBAL{$param} = $value;
161              
162 0           $this->{GLOBAL} = \%GLOBAL;
163              
164 0           return($this);
165             };
166              
167             =head2 DelParamGlobal([parametre_a_supprimer]);
168              
169             Supprime un parametre dans la partie [global] du smb.conf
170              
171             Params:
172             Nom du parametre à supprimer
173             Returns:
174             Retourne 0 en cas de non suppression
175             Retourne 1 si le parametre a été correctement supprimé
176             Example:
177             my $result = $smb->DelParamGlobal("workgroup");
178              
179             =cut
180              
181             sub DelParamGlobal {
182 0     0 1   my $this = shift;
183 0           my $param = shift;
184              
185 0           my $return = 0;
186              
187 0           $param = lc($param);
188              
189 0           my %GLOBAL = %{$this->{GLOBAL}};
  0            
190              
191              
192 0 0         if (exists $GLOBAL{$param}) {
193 0           delete($GLOBAL{$param});
194 0           $return = 1;
195             };
196              
197 0           $this->{GLOBAL} = \%GLOBAL;
198              
199 0           return($this,$return);
200             };
201              
202             =head2 ValeurSection([nom_de_partage],[nom_de_section])
203              
204             Recherche la valeur d'une section pour un partage donné
205              
206             Params:
207             Nom du partage
208             Nom de la section dont on souhaite la valeur
209             Returns:
210             Valeur de la section d'un partage donné
211             Example:
212             my $valeur = $smb->ValeurSection("data","path");
213              
214             =cut
215              
216             sub ValeurSection {
217 0     0 1   my $this = shift;
218 0           my $partage_section = shift;
219 0           my $nom_section = shift;
220 0           my $value = undef;
221              
222 0           my %details = %{$this->{DET_PARTAGES}};
  0            
223 0           my @partages = @{$this->{PARTAGES}};
  0            
224              
225 0           $partage_section = lc($partage_section);
226 0           $nom_section = lc($nom_section);
227              
228 0 0         if (grep(/$partage_section/,@partages)) {
229 0           my @temp = keys %{$details{$partage_section}};
  0            
230 0 0         if (grep(/$nom_section/,@temp)) {
231 0           $value = $details{$partage_section}{$nom_section};
232             }
233             };
234 0           return($value);
235             };
236              
237             =head2 ListPartages
238              
239             Liste la totalité des partages contenus dans le fichier de configuration de samba
240              
241             Params:
242             Aucun
243             Returns:
244             Tableau contenant la liste des partages
245             Example:
246             my @partages = ListPartages;
247              
248             =cut
249              
250             sub ListPartages {
251 0     0 1   my $this = shift;
252 0           my @partages = @{$this->{PARTAGES}};
  0            
253            
254 0           return (@partages);
255             };
256              
257             =head2 ListSections
258              
259             Liste les différentes sections et leur valeur pour tous les partages samba
260              
261             Params:
262             Aucun
263             Returns:
264             Hash de hash contenant le détail de chaque partage samba
265             Example:
266             my %details = $smb->ListSections;
267             my @part = keys %details;
268             foreach $keys (@part) {
269             my @key2 = keys %{$details{$keys}};
270             foreach my $value (@key2) {
271             my $valeur = $details{$keys}{$value};
272             };
273             };
274              
275             =cut
276              
277             sub ListSections {
278 0     0 1   my $this = shift;
279 0           my %detail = %{$this->{DET_PARTAGES}};
  0            
280              
281 0           return (%detail);
282             };
283              
284             =head2 CreaPartage("nom_du_partage");
285              
286             Permet la creation d'un nouveau partage
287              
288             Params:
289             Le nom du partage à créer
290             Returns:
291             Retourne 1 si le partage a été créé
292             Retourne 0 si le partage n'a pas pu être créé
293             Example:
294             my $result = $smb->CreaPartage("nom_du_partage");
295              
296             =cut
297              
298             sub CreaPartage {
299 0     0 1   my $this = shift;
300 0           my $partage = shift;
301 0           my %detail = %{$this->{NEW_PARTAGE}};
  0            
302 0           my @partages = @{$this->{PARTAGES}};
  0            
303 0           my $result = 1;
304              
305 0           $partage = lc($partage);
306              
307             ### Tester si le nom de partage n'est pas déjà utilisé ###
308 0 0         if (grep /$partage/,@partages) {
309 0           $result = 0;
310             }
311             else {
312             ### Creer le partage ###
313 0           $detail{$partage}{comment}=$partage;
314 0           push(@partages,$partage);
315             };
316 0           $this->{NEW_PARTAGE} = \%detail;
317 0           $this->{PARTAGES} = \@partages;
318 0           return ($this,$result);
319             };
320              
321             =head2 CreaSection([partage],[section],[valeur_de_la_section]);
322              
323             Ajoute une nouvelle section au partage créé précédemment à l'aide de "CreaPartage"
324              
325             Params:
326             partage : Nom du partage sur lequel créer une section
327             Section : Nom de la section à créer
328             Valeur de la section : Valeur à inscrire pour la section indiquée
329              
330             Returns:
331             Retourne 1 si la création s'est déroulée correctement
332             Retourne 0 si la création n'a pas eu lieu
333            
334             Example:
335             my $result = $smb->CreaPartage("Data");
336             $smb->CreaSection("donnees","path","/home/data");
337              
338             =cut
339              
340             sub CreaSection {
341 0     0 1   my $this = shift;
342 0           my $partage = shift;
343 0           my $section = shift;
344 0           my $value = shift;
345              
346 0           $partage = lc($partage);
347 0           $section = lc($section);
348              
349 0           my $result = 1;
350 0           my %new_partage = %{$this->{NEW_PARTAGE}};
  0            
351            
352 0           my @keys = keys(%new_partage);
353              
354 0 0         if (!(grep(/$partage/,@keys))) {
355 0           $result = 0;
356             }
357             else {
358             ### Ajouter la nouvelle section au partage en cours de creation
359 0           $new_partage{$partage}{$section} = $value;
360             };
361              
362 0           return ($this,$result);
363             };
364              
365             =head2 ModifSection([partage],[section],[valeur_de_la_section]);
366              
367             Modifie la valeur d'une section pour un partage donné
368              
369             Params:
370             [partage] : nom du partage sur lequel travailler
371             [section] : nom de la section dans le partage indiqué
372             [valeur_de_la_section] : Valeur de la section
373              
374             Returns:
375             Retourne 1 si la modification a été réalisée
376             Retourne 0 si la modification a échouée
377              
378             Example:
379             my $retour = $smb->ModifSection("games","inherit permissions","No");
380              
381             =cut
382              
383             sub ModifSection {
384 0     0 1   my $this = shift;
385 0           my $partage_modif = shift;
386 0           my $section_modif = shift;
387 0           my $value_modif = shift;
388              
389 0           my $result = 1;
390              
391 0           $partage_modif = lc($partage_modif);
392 0           $section_modif = lc($section_modif);
393              
394 0           my @partages = @{$this->{PARTAGES}};
  0            
395 0           my %detail = %{$this->{DET_PARTAGES}};
  0            
396              
397 0 0         if (grep(/$partage_modif/,@partages)) {
398 0           $detail{$partage_modif}{$section_modif}=$value_modif;
399             }
400 0           else { $result = 0; };
401              
402 0           return ($this,$result);
403             };
404              
405             =head2 DelPartage([@partages]);
406              
407             Supprime un partage du fichier smb.conf
408              
409             Params:
410             Un tableau contenant le nom de chaque partage à supprimer
411             Returns:
412             Retourne une référence sur un tableau contenant le nom des partages supprimés
413             Example:
414             my @partages = ("data","games","mp3","avi");
415             my $RefPartagesSupp = $smb->DelPartage(@partages);
416             my @PartSupp = @$RefPartagesSupp;
417            
418             foreach my $val (@PartSupp) {
419             print("Partage Supprimé : $val\n");
420             };
421              
422             =cut
423              
424             sub DelPartage {
425 0     0 1   my $this = shift;
426 0           my (@partage_del) = @_;
427              
428 0           my @retour;
429             my $part;
430 0           my @partages = @{$this->{PARTAGES}};
  0            
431 0           my %detail = %{$this->{DET_PARTAGES}};
  0            
432              
433 0           foreach $part (@partage_del) {
434 0           $part = lc($part);
435              
436 0 0         if (grep(/$part/,@partages)) {
437 0           delete($detail{$part});
438 0           for (my $i=0;$i<=$#partages;$i++) {
439 0 0         if ($partages[$i] eq $part) {
440 0           splice(@partages,$i,1);
441 0           push (@retour,$part);
442 0           last;
443             };
444             };
445             };
446             };
447              
448 0           $this->{PARTAGES} = \@partages;
449 0           $this->{DET_PARTAGES} = \%detail;
450              
451 0           return ($this,\@retour);
452             };
453              
454             =head2 DelValue([nom_partage],[valeur_a_supprimer]);
455              
456             Suppression d'un parametre dans un partage
457              
458             Params:
459             nom_partage : Nom du partage où le paramètre doit être supprimé
460             valeur_a_supprimer : Le paramètre à supprimer dans ce partage
461             Returns:
462             Retourne 1 si le parametre a été supprimé
463             Retourne 0 si le parametre n'a pas été supprimé
464             Example:
465             my $retour = $smb->DelValue("games","inherit permissions");
466              
467             =cut
468              
469             sub DelValue {
470 0     0 1   my $this = shift;
471 0           my $partage = shift;
472 0           my $value = shift;
473              
474 0           $partage = lc($partage);
475 0           $value = lc($value);
476              
477 0           my $retour = 1;
478              
479 0           my @partages = @{$this->{PARTAGES}};
  0            
480 0           my %detail = %{$this->{DET_PARTAGES}};
  0            
481              
482 0 0         if (grep(/$partage/,@partages)) {
483            
484 0 0         if (exists $detail{$partage}) {
485 0           delete $detail{$partage}{$value};
486 0           $this->{DET_PARTAGES} = \%detail;
487             }
488             else {
489 0           $retour = 0;
490             };
491             }
492             else {
493 0           $retour = 0;
494             };
495              
496 0           return($this,$retour);
497             };
498              
499             =head2 Sauve([nom_du_fichier]);
500              
501             Sauvegarde des modifications effectuées > Ecriture du fichier final
502             Pour que l'enregistrement se passe correctement, il faut au minimum une partie global et un partage.
503              
504             Params:
505             Nom du fichier à sauvegarder. Ce paramêtre est facultatif.
506             S'il n'est pas donné, le fichier est enregistré sous son nom d'origine.
507             Dans ce cas, une sauvegarde de ce fichier est réalisée dans le même répertoire avant l'écriture.
508              
509             Returns:
510             Si sauvegarde avec le nom du fichier d'origine, renvoi le nom du fichier sauvegardé
511             Si sauvegarde avec un nouveau nom, renvoi 1
512              
513             Example:
514             my $retour = $smb->Sauve("/etc/samba/smbnew.conf");
515              
516             =cut
517              
518             sub Sauve {
519 0     0 1   my $this = shift;
520 0           my $fic_sauve = shift;
521              
522 0           my $retour;
523 0           my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
524              
525 0           my %partage_a_sauver = %{$this->{NEW_PARTAGE}};
  0            
526 0           my %det_part = %{$this->{DET_PARTAGES}};
  0            
527 0           my $smb = $this->{SMB};
528 0           my %global = %{$this->{GLOBAL}};
  0            
529 0           $year = $year+1900;
530 0           my $save = "$smb-$mon$year-$hour$min$sec";
531              
532 0 0 0       if ((defined $fic_sauve) and ($smb ne $fic_sauve)) {
533 0           $smb = $fic_sauve;
534 0           $retour = 1;
535             }
536             else {
537             ### Sauvegarde du fichier d'origine ###
538 0           copy("$smb","$save");
539 0           $retour = $save;
540             };
541              
542             ### Integration du nouveau partage dans la liste des partages à enregistrer
543 0           my @keys_new = keys(%partage_a_sauver);
544            
545 0 0         if ($#keys_new >= 0) {
546 0           foreach my $key_new (@keys_new) {
547 0           my @section_new = keys(%{$partage_a_sauver{$key_new}});
  0            
548 0           foreach my $sectio (@section_new) {
549 0           $det_part{$key_new}{$sectio}=$partage_a_sauver{$key_new}{$sectio};
550             };
551             };
552             };
553              
554             ### Mettre le premier caractere en majuscule (uniquement pour Yes ou No)
555 0           my @keys_maj = keys(%det_part);
556              
557 0           foreach my $_key (@keys_maj) {
558 0           my @section_maj = keys(%{$det_part{$_key}});
  0            
559 0           foreach my $_section (@section_maj) {
560 0 0         if ($det_part{$_key}{$_section} =~ /^yes$|^no$/i) {
561 0           $det_part{$_key}{$_section} = ucfirst($det_part{$_key}{$_section});
562             };
563             };
564             };
565              
566             ### Ouverture du fichier en ecriture
567 0 0         open(FICSMB,">",$smb)||croak("Impossible de créer le fichier $smb !!!\n");
568              
569             ### En-tête personnalisé
570 0           print FICSMB (";============================================================================\n");
571 0           print FICSMB (";================== xxxxxxx perl -- SambaMSNRL xxxxxxx ==================\n");
572 0           print FICSMB (";============ xxxx raphael.gommeaux\@gmail.com xxxx ===========\n");
573 0           print FICSMB (";============================================================================\n\n\n");
574            
575             ### Ecriture du global dans le fichier
576 0           my @keys_global = sort(keys(%global));
577 0           my $maj_key;
578              
579 0 0         if ($#keys_global >= 0) {
580 0           print FICSMB ("[global]\n");
581 0           foreach my $key_global (@keys_global) {
582 0           $maj_key = $global{$key_global};
583              
584 0 0         if ($global{$key_global} =~ /^yes$|^no$/i) {
585 0           $maj_key = lc($maj_key);
586 0           $maj_key = ucfirst($maj_key);
587             }
588 0           print FICSMB ("\t$key_global = $maj_key\n");
589             };
590             }
591 0           else { croak("Impossible de trouver la partie global...\n"); };
592              
593             ### Separation entre le global et les partages
594 0           print FICSMB ("\n;=========================================================================\n\n");
595             ### Ecriture des partages dans le fichier
596 0           my @keys_detail_part = sort(keys(%det_part));
597 0 0         if ($#keys_detail_part >= 0) {
598 0           foreach my $key_part (@keys_detail_part) {
599 0           print FICSMB ("\n[$key_part]\n");
600 0           my @section = sort(keys(%{$det_part{$key_part}}));
  0            
601 0           foreach my $sectio (@section) {
602 0           my $det_maj = $det_part{$key_part}{$sectio};
603 0 0         if ($det_maj =~ /^yes$|^no$/i) {
604 0           $det_maj = lc($det_maj);
605 0           $det_maj = ucfirst($det_maj);
606             };
607 0           print FICSMB ("\t$sectio = $det_maj\n");
608             };
609             };
610             }
611 0           else { croak("Pas de partages à enregistrer... surement une erreur...\n");};
612              
613             ### Fermeture du fichier
614 0           close FICSMB;
615              
616 0           return($retour);
617             };
618              
619              
620              
621             =head2 load("nom_du_fichier");
622              
623             Charge un fichier de configuration samba
624              
625             Params:
626             Nom du fichier de configuration
627             Returns:
628             Retourne un tableau contenant le fichier chargé
629            
630             =cut
631              
632             sub load {
633 0     0 1   my $name = shift;
634              
635 0           my @smbconf;
636              
637 0 0         if (-z $name) { croak("Le fichier $name est vide !!!\n");};
  0            
638 0 0         open(FICSMB,$name)||croak("Impossible de lire le fichier $name !!!!!\n");
639 0           my @smb = ;
640 0           close FICSMB;
641              
642 0           return (@smb);
643             };
644              
645             =head2 TakePartages
646              
647             Charge la liste des partages présents dans le fichier de configuration de samba
648              
649             =cut
650              
651             sub TakePartages {
652 0     0 1   my $this = shift;
653 0           my @SHARES;
654             my @SHARES_DET;
655 0           my $share_detail;
656 0           my $fin;
657 0           my %share_detail;
658 0           my $part;
659 0           my $ligne;
660              
661 0           my @SMB = load($this->{SMB});
662              
663 0           for (my $i=0;$i<=$#SMB;$i++) {
664 0           chomp($SMB[$i]);
665 0           $ligne = $SMB[$i];
666            
667 0 0 0       if (($ligne =~ /\[/) and (!($ligne =~ /\[global\]/))) {
    0 0        
668 0           $part = lc($SMB[$i]);
669            
670 0           $part =~ s/\[//;
671 0           $part =~ s/\]//;
672 0           $part =~ s/ //g;
673              
674 0           push(@SHARES,$part);
675             }
676             ### Ne passe pas dans cette boucle si :
677             ### - pas encore trouvé de partage
678             ### - la ligne est vide
679             ### - la ligne commence par un ; ou un #
680             ### - la ligne commence par une ou plusieurs tabulations suivies d'un ; ou d'un #
681             ### - la ligne commence par un ou plusieurs espaces suivis d'un ; ou d'un #
682             elsif (($#SHARES >= 0) and (!($ligne =~ /^\s*$|^;|^\t*;|^\s*;|^#|^\t*#|^\s*#/))) {
683 0           $ligne =~ /(.+)=(.+)/;
684 0           my $section = $1;
685 0           my $valeur = $2;
686              
687 0 0 0       if (($valeur eq "") or ($valeur eq " "))
688             {
689 0           $section = $ligne;
690 0           $section =~ s/=//;
691             }
692              
693 0           $section =~ s/\t//;
694 0           $section =~ s/^ +//;
695 0           $section =~ s/ +$//;
696              
697 0           $section = lc($section);
698              
699 0           $valeur =~ s/\t//;
700 0           $valeur =~ s/^ +//;
701 0           $valeur =~ s/ +$//;
702              
703 0           $share_detail{$part}{$section} = $valeur;
704             };
705             };
706            
707 0           $this->{PARTAGES} = \@SHARES;
708 0           $this->{DET_PARTAGES} = \%share_detail;
709              
710 0           return $this;
711             };
712              
713             =head2 TakeGlobal
714              
715             Charge la partie global du fichier de configuration samba
716              
717             =cut
718              
719             sub TakeGlobal {
720 0     0 1   my $this = shift;
721 0           my @smb = load($this->{SMB});
722 0           my %GLOBAL;
723              
724 0           for (my $i=0;$i<=$#smb;$i++) {
725 0           chomp($smb[$i]);
726 0 0         if ($smb[$i] eq "[global]") {
727 0           for (my $j=$i+1;$j<=$#smb;$j++) {
728 0 0         if (grep (/\[/,$smb[$j])) {
729 0           last;
730             }
731             else {
732 0           chomp($smb[$j]);
733 0 0 0       if ((!($smb[$j] =~ /^;/)) and (!($smb[$j] =~ /^#/)) and (grep (/=/,$smb[$j]))) {
      0        
734             # $smb[$j] =~ /(.*?)=(.*)/;
735 0           $smb[$j] =~ m/([^=]+) = (.+)/x;
736 0           my $section_global = $1;
737 0           my $valeur_section = $2;
738              
739 0 0 0       if (($valeur_section eq "") or ($valeur_section eq " "))
740             {
741 0           $section_global = $smb[$j];
742 0           $section_global =~ s/=//;
743             }
744              
745 0           $section_global =~ s/\t//;
746              
747 0           $section_global =~ s/^ +//;
748 0           $section_global =~ s/ +$//;
749 0           $section_global = lc($section_global);
750 0           $valeur_section =~ s/\t//;
751 0           $valeur_section =~ s/^ +//;
752 0           $valeur_section =~ s/ +$//;
753              
754 0           $GLOBAL{$section_global}=$valeur_section;
755             };
756             };
757             };
758             };
759             };
760 0           $this->{GLOBAL} = \%GLOBAL;
761 0           return (%GLOBAL);
762             };
763              
764              
765             1;