Welcome To Our Shell

Mister Spy & Souheyl Bypass Shell

Current Path : /var/www/web-klick.de/dsh/50_dev2017/1300__perllib/DivBasicF/

Linux ift1.ift-informatik.de 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64
Upload File :
Current File : /var/www/web-klick.de/dsh/50_dev2017/1300__perllib/DivBasicF/AutoRPC.pm

package DivBasicF::AutoRPC;

#  RPC-Modul zum Verbinden mit Qooxdoo

use strict;
use DivBasicF::AutoServer;
use DivBasicF::AutoTest;
use Data::Dumper;
# use CGI::Session;
use File::Copy;
use File::Path;
use DivBasicF::AutoSession;

sub DELIVER { 2 }

#****************************************************************

sub report {

#  Gibt zu einem $testtree Reporting-Informationen zum $testitem aus.

#  Der Befehl:   new,DivBasicF::AutoServer,<testtree>,client,<testitem>,d,<depth>,<archs>
#  schreibt sich jetzt;   report,<testtree>,<testitem>,<depth>,<archs>
   my $self     = shift;
   my $testtree = shift;

#   print STDERR "TESTtree: $testtree\n";

#eval("use Time::HiRes");

#print STDERR "m1 " . sprintf("%16.5f",Time::HiRes::time()) . "\n";
   my $testitem = shift;
   my $depth    = shift;  #  Ausgabetiefe
                          #  wenn der Ausgabetiefe ein Minuszeichen vorangestellt
                          #  wird, dann werden alle Requirements zu einem einzigen
                          #  zusammengefasst, d.h. man bekommt damit dann den
                          #  reinen Test-Tree.
   my $archs    = shift;  #  Liste der Architekturen, kommasepariert
                          #  Wird diese Liste mit einem Punkt angefuehrt, erfolgt der return als String!


# print STDERR "QQQQ:$archs\n";

#   $self->goto_testtree_directory($testtree);


   eval("use DivBasicF::AutoSettings");
   my $dir = DivBasicF::AutoSettings::settings();
   $dir    = $dir->{'R'} || $dir->{'P'};
   $dir    = $dir  . "/" . $testtree;
   $dir    =~ s/([\\\/])[\\\/]*/$1/g;
   chdir($dir);

   if ($archs =~ s/^\s*(.*)\:\s*/$1\:/) {
      if ($testitem =~ /^\s*(.*?)\:\:(.*?)\s*$/) {
         $testitem = $2;
         $archs    = $archs . $1;
      }
   }

#print STDERR "m2 " . sprintf("%16.5f",Time::HiRes::time()) . "\n";
   my $x1;
   if ($main::___PYTHON___) {
      $x1 = DivBasicF::AutoTest->new()->collect_data($testitem,$depth,".".$archs,"");
   } else {
      $x1 = DivBasicF::AutoServer->new(".","client",$testitem,"d",$depth,$archs);
#      $x1 = DivBasicF::AutoServer->new($testtree,"client",$testitem,"d",$depth,$archs);
   }
#print STDERR "m3 " . sprintf("%16.5f",Time::HiRes::time()) . "\n";

#print STDERR "ABC " . Dumper($x1);

   return($x1);

}

#****************************************************************

sub xxserver_proc {

   my $self     = shift;
   my $testtree = shift;
   my $repeats   = shift;
   
   eval("use DivBasicF::AutoSettings");
   my $dir = DivBasicF::AutoSettings::settings();
   $dir    = $dir->{'R'} || $dir->{'P'};
   $dir    = $dir  . "/" . $testtree;
   $dir    =~ s/([\\\/])[\\\/]*/$1/g;
   chdir($dir);

#   print STDERR "calling autoserver->new with testtree: $testtree,client,testitem: $testitem,t\n";
   my $x1 = DivBasicF::AutoServer->new(".","server",$repeats);
#   my $x1 = DivBasicF::AutoServer->new($testtree,"client",$testitem,"t");
   return($x1);

}   

#****************************************************************

sub get_item_text {

   my $self     = shift;
   my $testtree = shift;
   my $testitem = shift;
   
   eval("use DivBasicF::AutoSettings");
   my $dir = DivBasicF::AutoSettings::settings();
   $dir    = $dir->{'R'} || $dir->{'P'};
   $dir    =~ s/([\\\/])[\\\/]*/$1/g;
   chdir($dir);

   $testtree =~ s/([\\\/])[\\\/]*/$1/g;
   $testtree =~ s/[\\\/]$//;
   $testitem =~ s/([\\\/])[\\\/]*/$1/g;
   $testitem =~ s/[\\\/]$//;
#say STDERR "GET1 : testtree = ".$testtree." testitem = ".$testitem;
   
   my $x1;
   if ($main::___PYTHON___) {
      print STDERR "getting item text of $testitem in $testtree\n";
      if (!(open(FFILE,"<".$testtree."/".$testitem))) {
         $testtree =~ s/^(.*)[\\\/](.*)$/$1/;
         if (!(open(FFILE,"<".$testtree."/".$testitem."/item.py"))) {
            if (!(open(FFILE,"<".$testtree."/".$testitem."/item.pm"))) {
               return("___NO_ITEM_TEXT_FOUND___");
            }
         }
      }
#say STDERR "GET2 : testtree = ".$testtree." testitem = ".$testitem;
      
      $x1 = join("",<FFILE>);
      close(FFILE);
   } else {
      print STDERR "calling autoserver->new with testtree: $testtree,client,testitem: $testitem,t\n";
      $x1 = DivBasicF::AutoServer->new(".","client",$testitem,"t");
#      $x1 = DivBasicF::AutoServer->new($testtree,"client",$testitem,"t");
   }
   return($x1);

}   

#****************************************************************

sub run_item {

   my $self     = shift;
   my $testtree = shift;
   my $testitem = shift;
   my $mode     = shift;
   my $arch     = shift;
   my $user     = shift;

#   if ($^O eq 'MSWin32') {
#          my @vars =  split('/', $testtree);
#      my $testproj =  @vars[2];
#      chdir "../test_projects/$testproj/";
#      #..\\..\\..\\..\\perl\\bin\\perl p DivBasicF::AutoServer::server
#      DivBasicF::ProcessServer->startProcess($testproj, "start_server.bat","");
#      print STDERR "calling autoserver->run_item with testtree: $testtree,client,testitem: $testitem, testproj: $testproj \n";
#   }

   eval("use DivBasicF::AutoSettings");
   my $dir = DivBasicF::AutoSettings::settings();
   $dir    = $dir->{'R'} || $dir->{'P'};
   $dir    =~ s/([\\\/])[\\\/]*/$1/g;
   chdir($dir);
   
   $testtree =~ s/([\\\/])[\\\/]*/$1/g;
   $testtree =~ s/[\\\/]$//;
   $testitem =~ s/([\\\/])[\\\/]*/$1/g;
   $testitem =~ s/[\\\/]$//;

   my @params = ();
   if ($arch) {
      push(@params,"ARCH_" . $arch);
      push(@params,1);
   }
   if ($user) {
      push(@params,"USER_" . $user);
      push(@params,1);
   }
   
   my $x1;
   if ($main::___PYTHON___) {
      print STDERR "running the testitem $testitem with mode $mode\n";
      $testtree =~ s/^(.*)[\\\/](.*)$/$1/;
      $testitem = $testitem . "/item.py" if ($testitem !~ /\.p[ym]$/);
      if ($mode eq 'r'){
         open(FFILE,">>wakelist.run");
         print FFILE "$testtree/$testitem  ___RUN___  " . join(" ",@params) . "\n";
         close(FFILE);
         $x1 = "___ITEM_RUN___";
      }
      elsif ($mode eq 'c'){
         open(FFILE,"<$testtree/$testitem");
         my $text = join("",<FFILE>);
         close(FFILE);
         if ($text =~ s/\:REMARK\:( *)SLEEP\d+/\:REMARK\:$1SLEEP0/){
            open(FFILE,">$testtree/$testitem");
            print FFILE $text;
            close(FFILE);
         }
      }   
   } else {
      print STDERR "running the testitem $testitem with mode $mode\n";
      $x1 = DivBasicF::AutoServer->new(".","client",$testitem,$mode,@params);
#      $x1 = DivBasicF::AutoServer->new($testtree,"client",$testitem,"r");
#   return("OK");
   }

   return($x1);

}   

#****************************************************************

sub store_item_text {

   my $self     = shift;
   my $testtree = shift;
   my $testitem = shift;
   my $text     = shift;
   my $sleep0   = shift;  #  for continuing a test item by setting back the sleep time
   
   my $x1 = "1";
   if ($sleep0) {
      $text =~ s/(RESULT\: +SLEEP)(\d+)/$1$x1/;
   }

   eval("use DivBasicF::AutoSettings");
   my $dir = DivBasicF::AutoSettings::settings();
   $dir    = $dir->{'R'} || $dir->{'P'};
   $dir    =~ s/([\\\/])[\\\/]*/$1/g;
   chdir($dir);

   $testtree =~ s/([\\\/])[\\\/]*/$1/g;
   $testtree =~ s/[\\\/]$//;
   $testitem =~ s/([\\\/])[\\\/]*/$1/g;
   $testitem =~ s/[\\\/]$//;

#   $testtree = "/test_projects";
#say STDERR "STORE1 : testtree = ".$testtree." testitem = ".$testitem;
   if ($main::___PYTHON___) {
      print STDERR "storing item text of $testitem in $testtree\n";
      if (-f "$testtree/$testitem") {
         open(FFILE,">".$testtree."/".$testitem);
      } else {
         $testtree =~ s/^(.*)[\\\/](.*)$/$1/;
         if (-f "$testtree/$testitem/item.py") {
            open(FFILE,">$testtree/$testitem/item.py");
         }
         elsif (-f "$testtree/$testitem/item.pm") {
            open(FFILE,">$testtree/$testitem/item.pm");
         }
         else {
            return("___ITEM_NOT_FOUND_TO_STORE___");
         }
      }
#say STDERR "STORE2 : testtree = ".$testtree." testitem = ".$testitem;
      print FFILE $text;
      close(FFILE);
      $x1 = "___ITEM_STORED___";
   } else {
      print STDERR "calling autoserver->new with testtree: $testtree,client,testitem: $testitem,e, text...\n";
      $x1 = DivBasicF::AutoServer->new(".","client",$testitem,"e",$text);
#      $x1 = DivBasicF::AutoServer->new($testtree,"client",$testitem,"e",$text);
   }
   return($x1);

}   

#****************************************************************

sub xxtesttrees {

   my $self     = shift;
   my $user     = shift;

   my $password = shift;

   eval("use DivBasicF::AutoSettings");
   return("ERROR 100 " . $@) if ($@);
   my $settings = DivBasicF::AutoSettings::settings();
   
   my $o  = $settings->{'USER:'.$user};
   my $o1 = "";
   if ($o =~ s/^(.+?)\,//) {
      $o1 = $1;
   }
   
   return("ERROR101") if (!$o1);              #  Fehler: User nicht gefunden;
   return("ERROR102") if ($o1 ne $password);  #  Fehler: Passwort falsch
   
   print STDERR "PASSWORD\n";
   
   my $erg = [];
   foreach $o1 (split(/\,/,$o)) {
      $o1 = [split(/\,/,$settings->{'TREE:'.$o1})];
      next if (!@$o1);
      push(@$erg,$o1);
   }

   return($erg);
   
}

#****************************************************************

#   Hier werden Informationen zu Testprojekten bzw. zu in Ordnern
#   befindlichen Testprojekten ausgegeben und ggfs. upgedated.
#
#   Ausserdem werden hier User-Management Operationen ermoeglicht.

sub manage_testtrees {
   
   my $self       = shift;
   my $rel_aktpath  = shift;   #   Generell der aktuelle Pfad im Projektverzeichnis, der zu behandeln ist
   my $user       = shift;   #   User, unter dem die Operation auszufuehren ist.
   my $changes    = shift;   #   Aenderungs-String
   my $password   = shift;
#  1.  Die Datei AutoSettings wird ausgelesen
   
   eval("use DivBasicF::AutoSettings");
   return("ERROR100 AutoSettings has errors") if ($@);
   my $users     = DivBasicF::AutoSettings::settings();
   my $recursive = 0;
   my $o         = $users->{'R'};
   $recursive    = 1 if ($o);
   $o            = $o || $users->{'P'};
   return("ERROR101 Path of projects not found") if (!$o);
   $o =~ s/[\\\/]$//;
   delete ($users->{'R'});
   delete ($users->{'P'});
   my $o1; my $mode; my $u;
   my $static_users = [keys %$users];

#  2.   Password-Operationen

#  Diese werden durch spezielle Schluesselwoerter in $rel_aktpath angesteuert,
#  naemlich  ___password_check___  bzw.  ___password_change___
#
#  Man kann User und das entsprechende Passwort statisch setzen in
#  der AutoSettings.pm. Ausserdem besteht die Moeglichkeit, User
#  und die zugehoerigen Passwoerter in der Datei accounts.txt im
#  Testprojekte-Verzeichnis abzulegen, dort als einfache Text-Datei,
#  deren Eintraege Zeilen der Form sind:   <user>[.:]password.
#   . bedeutet: einfacher User,
#   : bedeutet: Admin-User, darf an den User-Einstellungen Aenderungen machen

   my $erg = {};
   my $text;
   open (MYFILE, "$o/accounts.txt");
   while (<MYFILE>) {
      my $line = $_;
      if ($line =~ s/\s*(\w+)\s*(.|:)\s*(\w+)//){
         $users->{$1} = $2.$3;
      }
   }
   my $user_is_admin = ($users->{$user} =~ /^\:/);

   if ($rel_aktpath eq "___password_check___") {
      return("OK") if (substr($users->{$user},1) eq $changes);
      return("ERROR104 Wrong password") if exists ($users->{$user});
      return("ERROR103 User $user does not exist");
   }
   
   if ($rel_aktpath eq "___password_change___") {
      my $target_user = $changes;
      return("ERROR Invalid password!") if $password !~ /\w/;
      
      unless (exists $users->{$target_user}){
         return("ERROR: user ".$target_user." doesn't exists!");
      }
      
      my $target_is_admin = ($users->{$target_user} =~ /^\:/);
      $password =  $target_is_admin ? ":" : "." . $password;
      
      if ($user !~ $target_user){
         return("ERROR Insufficient permissions to change password of other users") unless $user_is_admin;
         $users->{$target_user} = $password;
      } else{
         $users->{$target_user} = $password;
      }
   }
   
   if ($rel_aktpath eq "___password_newuser___") {
      if (exists $users->{$changes}){
         return("ERROR: user already exists!");
      }
      if ($users->{$user} =~ /^\./) {
         return("ERROR105 Not granted to create new user");
      }
      $users->{$changes} = $password;  # Name als erstes, Passwort als zweites Array-Element
   }

   if ($rel_aktpath eq "___password_deleteuser___") {
      if ($users->{$user} =~ /^\./) {
         return("ERROR106 Not granted to delete user");
      }
      delete ($users->{$changes});
   }

   if ($rel_aktpath =~ /^___password_(.*?)___/) {  # wenn Passwort-Operationen auszufuehren sind
      open(FFILE,">$o/accounts.txt");
      foreach $o (keys %$users) {
         next if ($users->{$o} !~ /^[\.\:]/);
         print FFILE $o . $users->{$o} . "\n";
      }
      close(FFILE);
      
      return("OK");
   }

#   Nach Passwort-Operationen wird diese Funktion spaetestens HIER verlassen!

#------------------------------------------------------------


#  2. Testtree-Operationen
   my $aktpath = "";
   if ($rel_aktpath !~ s/^\#//) {
      $aktpath = $o . "/" . $rel_aktpath;
      $aktpath =~ s/([\\\/])[\\\/]*/$1/g;   #   doppelte Slashes zur Sicherheit beseitigen
      chdir($aktpath);    #  zunaechst wird in das aktuelle Verzeichnis gewechselt
   }
      
   if (-f "testtree.db" and $changes !~ /^\;/) {  #  wenn es sich um ein Testprojekt handelt ...
      if ($main::___PYTHON___) {
         open(FFILE,"<testtree.db");
         $text = join("",<FFILE>);
         close(FFILE);
         foreach $o1 (split(/,/,$changes)) {
            next if ($o1 !~ /(.|:)(\w+)/);
            $mode = $1;
            $u    = $2;
            return("ERROR entry already exists") if ($text =~ /(^|\n)$o1/);  #  Eintrag ist schon vorhanden
            if ($text =~ /(^|\n)\:$user\n/) {  #  Administrator-Operation
               if ($mode eq "=") {   #  Loeschen eines Eintrags
                  $text =~ s/(^|\n)[\.\:]$u\n/$1/s;
               }
               elsif ($text !~ s/(^|\n)[\.\:]$u\n/$1$mode$u\n/s) {  #  Eintrag aendern
                  $text = "$mode$u\n" . $text;                      #  Eintrag hinzufuegen
               }
            }
         }
         open(FFILE,">testtree.db");
         print FFILE $text;
         close(FFILE);
         $o = [];
         while ($text =~ s/(^|\n)([\.\:].*?)\n/\n/) {
            push(@$o,$2) if exists $users->{substr $2 , 1}; # only return users that are also stored in accounts.txt
         }
      } else {
         $o = DivBasicF::AutoServer->new(".","client","0","u",$user,$changes);
         $o = [ map { $o->{$_} . $_ } keys %$o];
      }
      return($o);
   }

   if (-f "accounts.txt" and $aktpath) {  #  wenn es sich um den Testprojekte-Ordner handelt ...
      open (MYFILE, "accounts.txt");
      my $root_accounts = {};
      while (<MYFILE>) {
         my $line = $_;
         if ($line =~ s/\s*(\w+)\s*(.|:)\s*(\w+)//){
            $root_accounts->{$1} = $2;
            $erg->{$2.$1} = "#";
         }
      }
   }
   opendir(DDIR,".");       # wenn es sich um ein sonstiges Verzeichnis handelt
   while (0 == 0) {
      $o = readdir(DDIR);
      last if (!$o);
      next if ($o =~ /^\./);
      next if (!(-d($o)));
      if (-f "$o/testtree.db") {
         chdir($o);
         if ($main::___PYTHON___) {
            open(FFILE,"<testtree.db");
            $text = join("",<FFILE>) . "\n";
            close(FFILE);
            $mode = {};
            while ($text =~ s/(^|\r?\n)([\.\:])(.*?)\r?\n/\n/s) {
               $mode->{$3} = $2;
            }
         } else {
            $mode = DivBasicF::AutoServer->new(".","client","0","u",$user);
         }
         if (($mode->{$user}) eq ":") {
            $erg->{$o} = "+";   # Admin-granted Testproject
         }
         if (($mode->{$user}) eq ".") {
            $erg->{$o} = "*";  #  User-granted Testproject
         }
         chdir("..");
      }
      elsif ($recursive) {  #  nur Unterverzeichnisse anzeigen, wenn
         $erg->{$o} = "-";  #  Rekursiv-Flag gesetzt ist.
      }
   }
   closedir(DDIR);

   foreach $o (split(/,/,$changes)) {

      $mode = substr($o,0,1);
      $o    = substr($o,1);
      
#print STDERR "make directory: $aktpath $o ---  $erg->{$o}\n";
      
      if    ($mode eq "+" and $erg->{$o} eq "+") {       #  ist und bleibt ein Testprojekt
         1;
      }
      elsif ($mode eq "+" and $erg->{$o} eq "*") {       #  Aenderung eines User-Testprojekts
         1;                                              #  in ein Admin-Testprojekt ist nicht moeglich
      }
      elsif ($mode eq "+" and $erg->{$o} eq "-") {       #  Aenderung eines Testprojekts in ein
         1;                                              #  normales Verzeichnis ist nicht moeglich
      }
      elsif ($mode eq "+" and (!(exists $erg->{$o}))) {  #  neues Testprojekt anlegen
#print STDERR "QQQ: $o\n";
         mkdir($o);
         chdir($o);
#system("chmod a+rwx .");
         if ($main::___PYTHON___) {

            open(FFILE,">testtree.db");
            print FFILE ":" . $user . "\n";
            close(FFILE);
            open(FFILE,">__init__.py");
            print FFILE "";
            close(FFILE);  
                                   
            my $backendPath = DivBasicF::AutoSettings::settings()->{'C'};
            my $newProjPath = $aktpath."/".$o;
            chdir($backendPath);
            
            $newProjPath =~ s&(.*)\.\/\/(.*)&$1$2&;   # ".//" beseitigen
            use Config;
            if ($Config{osname} eq 'linux'){
               system("\.\/or item.py > \"$newProjPath/item.py\"");
            } else {
               system("or item.py > \"$newProjPath/item.py\"");
            }
            chdir($newProjPath);
            
         } else {

            open(FFILE,">$o.pm");
            print FFILE "package " . $o . "\;\n" . <<'TEXT_ENDE';

use strict;
use vars qw(@ISA);
use DivBasicF::AutoItem;
@ISA = qw(DivBasicF::AutoItem);

sub result { 1    }
sub remark { "OK" }
sub user   { ""   }
sub requ   { [ "Standard" => 0.01 ] }

1;

TEXT_ENDE
            close(FFILE);
#  system("chmod a+rwx $o.pm");   #  ist (doch nicht ...) wichtig, wenn das abgeschaltet ist, kann man die Testprojekte nicht mnerh sehen
            DivBasicF::AutoServer->new(".","client",$o,"i");
#  system("chmod a+rwx testtree.db");   #  ist (doch nicht...) wichtig, wenn das abgeschaltet ist, kann man die Testprojekte nicht mnerh sehen
            DivBasicF::AutoServer->new(".","client","0","u",$o,":".$user);  #  Default-User als Admin
            DivBasicF::AutoServer->new(".","client","0","u",$user,"=".$o);  #  Primaer-User loeschen
            $erg->{$o} = "+";

         }
         
         chdir("..");

      }


      elsif ($mode eq "-" and $erg->{$o} eq "+") {       #  Aenderung eines normalen Directories
         1;                                              #  in ein Testprojekt ist nicht moeglich
      }
      elsif ($mode eq "-" and $erg->{$o} eq "*") {       #  Aenderung eines normalen Directories
         1;                                              #  in ein Testprojekt ist nicht moeglich
      }
      elsif ($mode eq "-" and $erg->{$o} eq "-") {       #  ist und bleibt ein Directory
         1;
      }
      elsif ($mode eq "-" and (!(exists $erg->{$o}))) {  #  Anlegen eines Directory
         mkdir ($o);
         if (-d $o) { $erg->{$o} = "-"; }     #  im Erfolgsfall
      }


      elsif ($mode eq "=" and $erg->{$o} eq "+") {       #  Loeschen des Testprojekts
         $mode = [localtime(time())];
         rename($o,".".$o."_deleted_at_".               #  Directory wird verschoben
                 sprintf("%04u",$mode->[5]+1900) .
                 sprintf("%02u",$mode->[4]+1) .
                 sprintf("%02u",$mode->[3]) . "_" . 
                 sprintf("%02u",$mode->[2]) .
                 sprintf("%02u",$mode->[1]) .
                 sprintf("%02u",$mode->[0]));
         delete($erg->{$o});
      }
      elsif ($mode eq "=" and $erg->{$o} eq "*") {       #  Loeschen eines User-Testprojekts
         rename($o,".".$o)                               # ist nicht moeglich
      }
      elsif ($mode eq "=" and $erg->{$o} eq "-") {       #  Loeschen des Directory
         opendir(DDIR,$o);
         while (0 == 0) {                  #  erstmal ueberpruefen, ob noch was
            $mode = readdir(DDIR);         #  drin ist im Directory
            last if (!$mode);
            next if ($mode =~ /^\./);      #  zum Loeschen markierte Unterverzeichnisse
            $o = "";                       #  werden uebersprungen
            last;
         }
         closedir(DDIR);
         if ($o) {    #  Wenn nein: Directory wird verschoben
            $mode = [localtime(time())];
            rename($o,".".$o."_deleted_at_". 
                    sprintf("%04u",$mode->[5]+1900) .
                    sprintf("%02u",$mode->[4]+1) .
                    sprintf("%02u",$mode->[3]) . "_" . 
                    sprintf("%02u",$mode->[2]) .
                    sprintf("%02u",$mode->[1]) .
                    sprintf("%02u",$mode->[0]));
            if (!(-d $o)) { delete($erg->{$o});}            #  im Erfolgsfall
         }
      }
      elsif ($mode eq "=" and (!(exists $erg->{$o}))) {  #  Loeschen eines nichtexistenten Elements
         1;                                              #  bleibt unberuecksichtigt
      }

      elsif ($mode eq ";") {       #  Namensaenderung
         if ($aktpath =~ /^(.*)[\/\\](.*)$/) {
            chdir("..");  #  hier ist die einzige Stelle, wo der $aktpath verlassen wird!
            $aktpath = $1;
            rename($2,$o);
            $erg->{$2} = $erg->{$o};
            delete ($erg->{$o});
            $o = DivBasicF::AutoRPC::manage_testtrees($self,"\#".$aktpath,$user);
            return($o);
         }
      }

   }

   return( [ sort map { $erg->{$_} . $_ } keys %$erg ] );
   
}

#********************************************************************************

#  Architekturen-Management:
#  Sind $arch und $remark nicht leer, dann wird die Architektur $arch
#  eingetragen/geupdated mit dem Erlaueterungs-String $remark.
#  Ist $remark = "___DELETE___", dann wird die Architektur geloescht
#  Ist $arch leer, dann geschieht nichts.
#  In jedem Fall wird ein Hash aller Architekturen (Keys) mit
#  den Remarks (Values) zurueckgegeben.


sub architectures {

   my $self      = shift;
   my $testtree  = shift;
   my $arch      = shift;
   my $remark    = shift;


   eval("use DivBasicF::AutoSettings");
   my $dir = DivBasicF::AutoSettings::settings();
   $dir    = $dir->{'R'} || $dir->{'P'};
   $dir    = $dir  . "/" . $testtree;
   $dir    =~ s/([\\\/])[\\\/]*/$1/g;
   chdir($dir);

   my $o; my $o1; my $text; my $archs; my $archs1;
   if ($main::___PYTHON___) {
      open(FFILE,"<testtree.db");
      $text = join("",<FFILE>);
      close(FFILE);
      if ($arch) {
         $remark =~ s/^\s*(.*?)\s*/$1/s;
         if ($remark eq "___DELETE___") {
            $text =~ s/\[$arch\].*?\n(\[|$)//;  #  Loeschen des Architektur-Remark
         }
         elsif ($text !~ s/(\[$arch\]).*?\n(\[|$)/$1\n$remark\n$2/s) {  # Aendern des Architektur-Remark
            $text =~ s/^(.*?)\s*/$1/s;
            $text = $text . "\n\[$arch\]\n$remark\n";  #  Anhaengen einer neuen Architektur
         }
      }
      open(FFILE,">testtree.db");
      print FFILE $text;
      close(FFILE);
      $archs = {};
      while ($text =~ s/\[(\S+)\](.*?)(\[|$)/\n$3/s) {
         $o  = $1;
         $o1 = $2;
         $o1 =~ s/^\s*(.*?)\s*$/$1/s;
         $archs->{$o} = $o1;
      }
      my $backend_dir = DivBasicF::AutoSettings::settings()->{'C'};
      if ($^O=~/Win/){
         $text = `$backend_dir/grep -R ":ARCH:" --include=*.p* .`;
      } else {
         $text = `grep -R ":ARCH:" --include=*.p* .`;
      }
      
      foreach $o (split(/\n/,$text)) {
         next if ($o !~ /^(.*)\:ARCH\: +(\S+)/);
         $archs->{$2} = $archs->{$2};
      }
   } else {
      $archs = DivBasicF::AutoServer->new(".","client","0","z",$arch,$remark);
      if (ref($archs) eq "HASH") {
         my $archs1 = {};
         foreach $o (keys %$archs) {
            $o1 =  $o;
            $o1 =~ s/^ARCH_(.*)//gs;
            $archs1->{$o1} = $archs->{$o};
         }
         return($archs1);
      }
   }
   
   return($archs);
   
#   return( DivBasicF::AutoServer->new($testtree,"client","","z",$arch,$remark) );

}


#********************************************************************************

sub xxstart_item_server {

   my $self     = shift;
   my $testtree = shift;

   eval("use DivBasicF::AutoSettings");
   my $dir = DivBasicF::AutoSettings::settings();
   $dir    = $dir->{'R'} || $dir->{'P'};
   $dir    = $dir  . "/" . $testtree;
   $dir    =~ s/([\\\/])[\\\/]*/$1/g;
   chdir($dir);

   if (!(fork())) {
      DivBasicF::AutoServer(".","server");
   }
   
   return(["Server started"]);
   
}


#********************************************************************************

sub is_logged_in {
        my $self = shift;
        return DivBasicF::AutoSession::is_logged_in();
}

sub get_user_name {
        my $self = shift;
   return DivBasicF::AutoSession::user();
}

sub set_active_project {
   my $self = shift;
   my $project = shift;
   DivBasicF::AutoSession::set_active_project($project);
}

sub get_active_project {
   my $self = shift;
   my $project = shift;
   DivBasicF::AutoSession::get_active_project();
}

sub set_active_node_path {
   my $self = shift;
   my $path = shift;
   DivBasicF::AutoSession::set_active_node_path($path);
}

sub get_active_node_path {
   my $self = shift;
   DivBasicF::AutoSession::get_active_node_path();
}

sub logout {
   DivBasicF::AutoSession::logout();
}

1;

bypass 1.0, Devloped By El Moujahidin (the source has been moved and devloped)
Email: contact@elmoujehidin.net bypass 1.0, Devloped By El Moujahidin (the source has been moved and devloped) Email: contact@elmoujehidin.net