#!/usr/bin/perl
use Encode qw( from_to is_utf8 );
my $flag        = $ARGV[0];
my $PackageName = $ARGV[1];
my $version     = ();
if ( defined( $ARGV[2] ) )
{
	$version = $ARGV[2];
}

#$output=`echo "Set flag 1 :$PackageName" >>/tmp/dl-reg.log`;
debug_msg("Set flag 1 :$PackageName");

#$output=`echo "1">/tmp/dl-reg`;
setflag("1");
%PackagesIniData = GetIniFileData("/gsw/rep/packages.ini");
my $NewPackNum = GetUniquePackageNumber(%PackagesIniData);
if ( $NewPackNum == -1 )
{
	debug_msg(
		"Set flag 0: ¯ ª¥â ã¦¥ ãáâ ­®¢«¥­ $PackageName");

#$output=`echo "Set flag 0: ¯ ª¥â ã¦¥ ãáâ ­®¢«¥­ $PackageName" >>/tmp/dl-reg.log`;
#$output=`echo "0">/tmp/dl-reg`;
	setflag("0");
	print
"¥¢®§¬®¦­® § à¥£¨áâà¨à®¢ âì ¯ ª¥â ¢ à¥¯®§¨â®à¨¨";
	exit;
}
if ( $flag =~ /-u|-U/ )
{
	debug_msg("UnregPkg: $PackageName");

	#  $output=`echo "UnregPkg: $PackageName" >>/tmp/dl-reg.log`;
	debug_msg("Set flag 2:$PackageName");

	#  $output=`echo "Set flag 2:$PackageName" >>/tmp/dl-reg.log`;
	setflag("2");

	#$output=`echo "2">/tmp/dl-reg`;

	UnregPkg( $PackageName, $NewPackNum );
	
	debug_msg("Set flag 0 :$PackageName");
	setflag("0");
} else
{
	if ( $flag =~ /-r|-R / )
	{

		#$output=`echo "RegPkg: $PackageName" >>/tmp/dl-reg.log`;
		debug_msg("RegPkg: $PackageName");
		RegPkg( $PackageName, $version, $NewPackNum );
		debug_msg("Set flag 0:$PackageName");

		#$output=`echo "Set flag 0:$PackageName" >>/tmp/dl-reg.log`;
		#    $output=`echo "0">/tmp/dl-reg`;
		setflag("0");
	}
}

sub RegPkg()
{
	my ( $PackageName, $version, $num ) = @_;
	sleep(10);
	my %tmpPackageData = ();
	my @PackInfo       = `dpkg -p $PackageName`;
	for ( $i = 0 ; $i < scalar(@PackInfo) ; $i++ )
	{
		my $tmp = $PackInfo[$i];
		chomp $tmp;
		my ( $param, $value ) = split( ": ", $tmp );
		chomp $value;		
		$_ = $param;
		if (
/(Version|Package|Section|Description|ShortName|ProcessName|StrartProgMode|StartRunMode|Required|AvaibleRemove|Service\d{1,5}|WebminModule\d{1,5}|PermWebminModulesWork|PermWebminModulesProg)/
		  )
		{
			$tmpPackageData{"$1"} = $value;
		}
	}	
	my $flPackageInstalled = 0;
	my $flpackageUpgraded  = 0;
	my $package            = ();
	foreach $pack ( keys %PackagesIniData )
	{
		if ( $PackagesIniData{$pack}{'PackageName'} eq $PackageName )
		{
			if ( $PackagesIniData{$pack}{'Version'} eq $version )
			{
				$flPackageInstalled = 1;
			} else
			{
				$flpackageUpgraded = 1;
			}
			$package = $pack;
			last;
		}
	}
	if ( $flPackageInstalled != ( 1 + 0 ) )
	{
		if ( $flpackageUpgraded ==
			0 )    #ãáâ ­ ¢«¨¢ ¥âáï ­®¢ë© ¯ ª¥â
		{
			$PackagesIniData{ "[PACKAGE" . $num . "]" }{'Title'} =
			  $tmpPackageData{'Description'};
			$PackagesIniData{ "[PACKAGE" . $num . "]" }{'PackageName'} =
			  $tmpPackageData{'Package'};
			$PackagesIniData{ "[PACKAGE" . $num . "]" }{'Type'} =
			  $tmpPackageData{'Section'};
			$PackagesIniData{ "[PACKAGE" . $num . "]" }{'EnableToRemove'} =
			  $tmpPackageData{'AvaibleRemove'};
			$PackagesIniData{ "[PACKAGE" . $num . "]" }{'Version'} =
			  $tmpPackageData{'Version'};
		} else     #®¡­®¢«ï¥¬ ¢¥àá¨î ¯ ª¥â 
		{
			$PackagesIniData{$package}{'Version'} = $tmpPackageData{'Version'};
			$num=$package;
			$num=~s/\[|\]|PACKAGE//g;
		}

#á®åà ­ï¥¬ ¢ packages.ini ¨­ä®à¬ æ¨î ¤«ï à¥£¨áâà æ¨¨ ¬®¤ã«¥© webmin
		foreach $tmppkg ( keys %tmpPackageData )
		{
			if (   ( $tmppkg =~ /WebminModule\d{1,5}/ )
				|| ( $tmppkg =~ /PermWebminModules/ ) )
			{
				if ( $flpackageUpgraded == 0 )
				{
					$PackagesIniData{ "[PACKAGE" . $num . "]" }{$tmppkg} =
					  $tmpPackageData{$tmppkg};
				} else
				{
					$PackagesIniData{$package}{$tmppkg} =
					  $tmpPackageData{$tmppkg};
				}
			}
		}

	 #$output_=`echo "start Save packages.ini: $PackageName" >>/tmp/dl-reg.log`;
		debug_msg("start Save packages.ini: $PackageName");
		Save( \%PackagesIniData, "/gsw/rep/packages.ini" );

	   #$output_=`echo "stop Save  packages.ini:$PackageName">>/tmp/dl-reg.log`;
		debug_msg("stop Save packages.ini: $PackageName");

#ë¯®«­ï¥¬ à¥£¨áâà æ¨î ¬®¤ã«¥© webmin ¥á«¨ â ª®¢ë¥ ¥áâì ¢ ãáâ ­®¢®ç­®¬ ¯ ª¥â¥
		my %data            = %{ $PackagesIniData{ "[PACKAGE" . $num . "]" } };
		my @webmin_acl_work = cat("/etc/webmin/webmin_w.acl");
		my @webmin_acl_prog = cat("/etc/webmin/webmin_p.acl");
		my @webmin_catnames = cat("/etc/webmin/webmin.catnames.ru.UTF-8");
		foreach $pkgdata ( keys %data )
		{
			if ( $pkgdata =~ /WebminModule\d{1,5}/ )
			{
				my @pkg_params = split( ", ", $data{$pkgdata} );

				#¯à®¯¨áë¢ ¥¬áï ¢ ä ©«¥ ª â¥£®à¨©
				my $fl_found   = 0;
				my $tmpcatname = $pkg_params[0] . "=" . $pkg_params[1];
				foreach $catname (@webmin_catnames)
				{
					if ( $catname =~ /$tmpcatname/ )
					{
						$fl_found = 1;
						last;
					}
				}
				if ( $fl_found == 0 )
				{
					push( @webmin_catnames, $tmpcatname );
				}
			} else
			{
			    if ( $pkgdata =~ /PermWebminModulesWork/ )
				{
					my @permpkg = split( ", ", $data{$pkgdata} );
					debug_msg("PermWebminModulesWork");
					for ( $i = 0 ; $i < scalar(@webmin_acl_work) ; $i++ )
					{
						chomp $webmin_acl_work[$i];
						$webmin_acl_work[$i]=~s/\n|\r//g;
						for ( $j = 0 ; $j < scalar(@permpkg) ; $j++ )
						{
							my $permpkg_=$permpkg[$j];
		    				if ( $webmin_acl_work[$i] =~ /\b${permpkg_}\b/ )
							{
								next;
							} else
							{
								$webmin_acl_work[$i] =
								  $webmin_acl_work[$i] . " " . $permpkg[$j];
							}
							debug_msg($webmin_acl_work[$i]);
						}
					}
				} else
				{
					if ( $pkgdata =~ /PermWebminModulesProg/ )
					{
					debug_msg("PermWebminModulesProg");
						my @permpkg = split( ", ", $data{$pkgdata} );
						for ( $i = 0 ; $i < scalar(@webmin_acl_prog) ; $i++ )
						{
							chomp $webmin_acl_prog[$i];
							$webmin_acl_prog[$i]=~s/\n|\r//g;
							debug_msg("before - ".$webmin_acl_prog[$i]);						
							for ( $j = 0 ; $j < scalar(@permpkg) ; $j++ )
							{
								my $permpkg_=$permpkg[$j];
								if (
									$webmin_acl_prog[$i] =~ /\b${permpkg_}\b/ )
								{
									next;
								} else
								{
									$webmin_acl_prog[$i] =
									  $webmin_acl_prog[$i] . " " . $permpkg[$j];
								}
									debug_msg("after - ".$webmin_acl_prog[$i]);
							}
						}
					}
				}
			}
		}
		my $OUTFILE;
		open( OUTFILE, ">/etc/webmin/webmin_w.acl" )
		  or die print "sdfsdfsdfsdf";
		for ( $i = 0 ; $i < scalar(@webmin_acl_work) ; $i++ )
		{
			my $tmp = $webmin_acl_work[$i];
			chomp $tmp;
			$tmp=~s/\s{,}/ /g;
			if ( length($tmp) != 0 )
			{
				print OUTFILE $tmp, "\n";
			}
		}
		close OUTFILE;
		open( OUTFILE, ">/etc/webmin/webmin_p.acl" )
		  or die print "sdfsdfsdfsdf";
		for ( $i = 0 ; $i < scalar(@webmin_acl_prog) ; $i++ )
		{
			my $tmp = $webmin_acl_prog[$i];
			chomp $tmp;
			$tmp=~s/\s{1,}/ /g;			
			if ( length($tmp) != 0 )
			{
				print OUTFILE $tmp . "\n";
			}
		}
		close OUTFILE;
		open( OUTFILE, ">/etc/webmin/webmin.catnames.ru.UTF-8" )
		  or die print "sdfsdfsdfsdf";
		for ( $i = 0 ; $i < scalar(@webmin_catnames) ; $i++ )
		{
			my $tmp = $webmin_catnames[$i];
			chomp $tmp;
			if ( length($tmp) != 0 )
			{
				print OUTFILE $tmp . "\n";
			}
		}
		close OUTFILE;
	} else
	{
		exit;
	}

	#¥£¨áâà¨àã¥¬áï ¢ á«ã¦¡¥  ¢â®§ ¯ãáª 
	my %ServInfo = GetIniFileData("/gsw/settings/services.ini");
	my $srvnum   = GetUniqueServiceNumber(%ServInfo);
	foreach $tmpdata ( keys %tmpPackageData )
	{
		if ( $tmpdata =~ /Service\d{1,5}/ )
		{
			next;
		} else
		{
			delete $tmpPackageData{$tmpdata};
		}
	}
	$ordernum = GetUniqueServiceOrderNumber(%ServInfo);
	foreach $tmpdata (
		sort {
			$a1 = $a;
			$b1 = $b;
			$a1 =~ s/Service//g;
			$b1 =~ s/Service//g;
			$a1 <=> $b1
		} keys %tmpPackageData
	  )
	{
		my @serviceparams = split( "\, ", $tmpPackageData{$tmpdata} );
		if ( scalar(@serviceparams) != ( 7 + 0 ) )
		{
			die("è¨¡ª  ¯à¨ ãáâ ­®¢ª¥ ¯ ª¥â ");
			debug_msg("error setup package:$PackageName");

		   #$output_=`echo "error setup package:$PackageName">>/tmp/dl-reg.log`;

		}
		my $flfound = 0 + 0;
		my $found_srv_section;
		my $tmpsrv = ();

		foreach my $srv ( keys %ServInfo )
		{

			if (   ( $ServInfo{$srv}{"pkgname"} eq $PackageName )
				&& ( $ServInfo{$srv}{"processname"} eq $serviceparams[1] ) )
			{
    			debug_msg( $ServInfo{$srv}{"pkgname"} . "=" . $PackageName );
	    		debug_msg(
				$ServInfo{$srv}{"processname"} . "=" . $serviceparams[1] );
				$flfound           = 1 + 0;
				$found_srv_section = $srv;
				last;
			}
		}
		if ( $flfound == ( 0 + 0 ) )
		{
			$ServInfo{ "[SERVICE" . $srvnum . "]" }{"shortname"} =
			  $serviceparams[0];
			$ServInfo{ "[SERVICE" . $srvnum . "]" }{"description"} =
			  $serviceparams[6];
			$ServInfo{ "[SERVICE" . $srvnum . "]" }{"processname"} =
			  $serviceparams[1];
			$ServInfo{ "[SERVICE" . $srvnum . "]" }{"category"} =
			  lc( $serviceparams[2] );
			$ServInfo{ "[SERVICE" . $srvnum . "]" }{"startprogmode"} =
			  $serviceparams[3];
			$ServInfo{ "[SERVICE" . $srvnum . "]" }{"startrunmode"} =
			  $serviceparams[4];
			$ServInfo{ "[SERVICE" . $srvnum . "]" }{"required"} =
			  $serviceparams[5];
			if($serviceparams[2]=~/driver/)
			{
			  my $processname=$serviceparams[1];			
		      $ServInfo{ "[SERVICE" . $srvnum . "]" }{"type_protocol"}=`/gsw/$processname -m |grep type_protocol|sed "s/^type_protocol=//g"`;
			}  
			if ( $ordernum < 10 )
			{
				$ServInfo{ "[SERVICE" . $srvnum . "]" }{"order"} =
				  "0" . $ordernum;
			} else
			{
				$ServInfo{ "[SERVICE" . $srvnum . "]" }{"order"} = $ordernum;
			}
			$ServInfo{ "[SERVICE" . $srvnum . "]" }{"pkgname"} = $PackageName;
			$tmpsrv = "[SERVICE" . $srvnum . "]";
			$ordernum++;
			$srvnum++;
		}
		if ( $flfound == 1 )
		{
			$tmpsrv = $found_srv_section;
		}

		if ( $ServInfo{$tmpsrv}{"category"} =~ /drivers/ )
		{
			my $shortname = $serviceparams[1];
			my $is_drv_present_in_olddrv =
			  `cat /gsw/settings/olddrv.ini | grep -i $shortname`;
			chop $is_drv_present_in_olddrv;
			if ( length($is_drv_present_in_olddrv) == 0 )
			{
				my $output=`/gsw/$serviceparams[1] -m`;
				if($output=~/$shortname/i)
				{
				my @tags =
				  `/gsw/$serviceparams[1] -m >>/gsw/settings/olddrv.ini`;
				}
			} else
			{
				my $output=`/gsw/$serviceparams[1] -m`;
				if($output=~/$shortname/i)
				{
				my %OldDrvData = GetIniFileData("/gsw/settings/olddrv.ini");
				DeleteDriverFromOldDrv( $shortname, \%OldDrvData );
				$shortname = lc($shortname);
				DeleteDriverFromOldDrv( $shortname, \%OldDrvData );
				Save( \%OldDrvData, '/gsw/settings/olddrv.ini' );
				my @tags =
				  `/gsw/$serviceparams[1] -m >>/gsw/settings/olddrv.ini`;
				}
			}
		}

	}

	debug_msg("start Save  services.ini:$PackageName");

	#$output_=`echo "start Save  services.ini:$PackageName">>/tmp/dl-reg.log`;
	Save( \%ServInfo, "/gsw/settings/services.ini" );
	%ServInfo=GetEnabledServices();
	RegisterServicesInAutoRun(%ServInfo);
	#$output_=`echo "stop Save  services.ini:$PackageName">>/tmp/dl-reg.log`;
	debug_msg("stop Save  services.ini:$PackageName");

}
sub LoadKrugSettings()
{
  my @output = `cat /gsw/etc/krug.env`;
  my %data = ();
  foreach $s (@output)
  {
    chomp ($s);
    $_ = $s;
    if(/(\.*)\=(\.*)/)
    {
        my $tmp = "$'";
        $data{"$`"}=$tmp; 
    }
  }
  return %data;
}

sub GetEnabledServices()
{
   my %settings = LoadKrugSettings();
   my $services_ini = $settings{'GSW_SETTINGS'}.'services.ini';
   my $init_d_path=$settings{'GSW_ETC'}.'rc.d/init.d/';
   my %services_data=GetIniFileData($services_ini);
   my %data=();
   foreach my $s (keys %services_data)
   {
      my $filepath=$init_d_path.$services_data{$s}{'processname'}; 
      if(-e "$filepath")
      {
       next
      } 
      else
      {
       delete $services_data{$s};
      }                
   }        

   return %services_data;
}
sub RegisterServicesInAutoRun()
{
   my %services_data=@_;
   my %settings = LoadKrugSettings();
   my $rc1_path=$settings{'GSW_ETC'}.'rc.d/rc1.d/';
   my $rc0_path=$settings{'GSW_ETC'}.'rc.d/rc0.d/';
   my $rc6_path=$settings{'GSW_ETC'}.'rc.d/rc6.d/';
   my $init_d_path=$settings{'GSW_ETC'}.'rc.d/init.d/';
   foreach my $s (keys %services_data)
   {
      #§ ¯ãáª ¥âáï «¨ ¯à®æ¥áá ¢ à¥¦¨¬¥ ¯à®£à ¬¬¨à®¢ ­¨ï      
      my $startFileName="S".$services_data{$s}{'order'}.$services_data{$s}{'processname'};
      my $killFileName;
      if((100-$services_data{$s}{'order'})<(10-0))
      {
        my $tmp="0".(100-$services_data{$s}{'order'});        
        $killFileName="K".$tmp.$services_data{$s}{'processname'};        
      }
      else
      {      
         my $tmp=(100-$services_data{$s}{'order'});
        $killFileName="K".$tmp.$services_data{$s}{'processname'};
      }

      my $filepath=$rc1_path.$startFileName;
#      system("ls ".$filepath);
#      if($?==0)
      if(-e "$filepath")     
      {
         $services_data{$s}{"startprogmode"}=1;
      } 
      else
      {        
         #если пакет обязательный для статрта в режиме программирования (цифры 1 и 3  - обязательный в режиме программирования)
         if($services_data{$s}{'required'}=~/true|[1,3]/)
         {
            if($services_data{$s}{"startprogmode"}==1)
            {
              system("ln -s -f ".$init_d_path.$services_data{$s}{'processname'}." ".$rc1_path.$startFileName);
              system("ln -s -f ".$init_d_path.$services_data{$s}{'processname'}." ".$rc6_path.$killFileName);
            }
         } else
         {
            $services_data{$s}{"startprogmode"}=0;
         }                
      }                 
      #§ ¯ãáª ¥âáï «¨ ä ©« ¢ à¥¦¨¬¥ ®á­®¢­®© à ¡®âë
      $filepath=$rc0_path.$startFileName;
#      system("ls ".$filepath);
#      if($?==0)
      if(-e "$filepath") 
      {
         $services_data{$s}{"startrunmode"}=1;
      } 
      else
      {
         if($services_data{$s}{'required'}=~/true|[2,3]/)
         {
            if($services_data{$s}{"startrunmode"}==1)
            {
            system("ln -s -f ".$init_d_path.$services_data{$s}{'processname'}." ".$rc0_path.$startFileName);
            system("ln -s -f ".$init_d_path.$services_data{$s}{'processname'}." ".$rc6_path.$killFileName);
            }
         }else                 
         {
            $services_data{$s}{"startrunmode"}=0;
         }                
      }
   }    
   return %services_data;    
}

sub UnregPkg()
{
	my ( $PackageName, $num ) = @_;
	if ( -e "/tmp/updating" )
	{
		debug_msg("------------update_started-----------");
		my $output = `rm -f /tmp/updating`;
		debug_msg("updating:$PackageName");
	my %PackagesIniData = GetIniFileData("/gsw/rep/packages.ini");
	foreach $pack ( keys %PackagesIniData )
	{
		if ( $PackagesIniData{$pack}{'PackageName'} eq $PackageName )
		{
		   debug_msg("------------package_found-----------");

			foreach $packparam ( keys %{ $PackagesIniData{$pack} } )
			{
					if ( $packparam =~ /PermWebminModules/ )
					{
						my @modules2remove =
						  split( ", ", $PackagesIniData{$pack}{$packparam} );						  
						my $webmin_acl_file;
						if ( $packparam =~ /PermWebminModulesProg/ )
						{
							$webmin_acl_file = "/gsw/etc/webmin/webmin_p.acl";
						} else
						{
							$webmin_acl_file = "/gsw/etc/webmin/webmin_w.acl";
						}
						my @webmin_acl = cat($webmin_acl_file);
						my $OUTFILE1;
						open( OUTFILE1, ">$webmin_acl_file" ) or warn debug_msg("open-".$!);
						debug_msg($packparam);
						for ( my $i = 0 ; $i < scalar(@webmin_acl) ; $i++ )
						{
							for ( my $j = 0 ; $j < scalar(@modules2remove) ; $j++ )
							{
								my $moduleid = $modules2remove[$j];
								debug_msg("Before - ".$webmin_acl[$i]);
								$webmin_acl[$i]=~s/\b$moduleid\b/ /g;
								debug_msg("After - ".$webmin_acl[$i]);
							}
							$webmin_acl[$i]=~s/\s{2,}/ /g;
						    debug_msg("remove space - ".$webmin_acl[$i]);
							print OUTFILE1 $webmin_acl[$i] . "\n" or warn debug_msg("print-".$!);
							debug_msg("ToFile - ".$webmin_acl[$i]);							
						}
						close OUTFILE1 or warn {debug_msg($!)};
				}
			}
			last;
		}
	}		
		debug_msg("--------------------------------------------------------------------------");
		return 0;
	}
	my %PackagesIniData = GetIniFileData("/gsw/rep/packages.ini");
	foreach $pack ( keys %PackagesIniData )
	{
		if ( $PackagesIniData{$pack}{'PackageName'} eq $PackageName )
		{
			foreach $packparam ( keys %{ $PackagesIniData{$pack} } )
			{
				if ( $packparam =~ /WebminModule\d{1,5}/ )
				{
					my @module_params =
					  split( ", ", $PackagesIniData{$pack}{$packparam} );
					my $cat_id     = $module_params[0];
					my $catname    = $module_params[1];
					my @webmin_acl = cat("/etc/webmin/webmin.acl");
					my $OUTFILE;
					open( OUTFILE, ">/etc/webmin/webmin.acl" )
					  or die print "sdfsdfsdfsdf";
					for ( my $i = 0 ; $i < scalar(@webmin_acl) ; $i++ )
					{
						$webmin_acl[$i] =~ s/$cat_id(\s|$)//g;
						print OUTFILE $webmin_acl[$i];
					}
					close OUTFILE;
					my @webmin_catnames =
					  cat("/etc/webmin/webmin.catnames.ru.UTF-8");
					open( OUTFILE, ">/etc/webmin/webmin.catnames.ru.UTF-8" )
					  or die print "sdfsdfsdfsdf";
					for ( my $i = 0 ; $i < scalar(@webmin_catnames) ; $i++ )
					{
						$webmin_catnames[$i] =~ s/$cat_id=$catname//g;
						chomp $webmin_catnames[$i];
						print OUTFILE $webmin_catnames[$i];
					}
					close OUTFILE;
				} else
				{
					if ( $packparam =~ /PermWebminModules/ )
					{
						my @modules2remove =
				    	split( ", ", $PackagesIniData{$pack}{$packparam} );
						my $webmin_acl_file;
						if ( $packparam =~ /PermWebminModulesProg/ )
						{
							$webmin_acl_file = "/etc/webmin/webmin_p.acl";
						} else
						{
							$webmin_acl_file = "/etc/webmin/webmin_w.acl";
						}
						my @webmin_acl = cat($webmin_acl_file);
						my $OUTFILE2;
						open( OUTFILE2, ">$webmin_acl_file" )
						  or die debug_msg("$!");
						debug_msg($packparam);
						for ( $i = 0 ; $i < scalar(@webmin_acl) ; $i++ )
						{
							for ( $j = 0 ; $j < scalar(@modules2remove) ; $j++ )
							{
								my $moduleid = $modules2remove[$j];
								debug_msg("Before - ".$webmin_acl[$i]);
								$webmin_acl[$i] =~ s/\b$moduleid\b/ /g;
								debug_msg("After - ".$webmin_acl[$i]);								
							}
							$webmin_acl[$i] =~ s/\s{2,}/ /g;
							print OUTFILE2 $webmin_acl[$i] . "\n";						
						}
						close OUTFILE2 or die debug_msg("$!");

					}
				}
			}
			delete $PackagesIniData{$pack};
			last;
		}
	}

	foreach $pack ( keys %PackagesIniData )
	{
		if ( $PackagesIniData{$pack}{'PackageName'} eq $PackageName )
		{
			delete $PackagesIniData{$pack};
			last;
		}
	}
	debug_msg("start save packages.ini:$PackageName");
	Save( \%PackagesIniData, "/gsw/rep/packages.ini" );
	debug_msg("stop save packages.ini:$PackageName");

	my %ServInfo = GetIniFileData("/gsw/settings/services.ini");

	foreach $pack ( keys %ServInfo )
	{
		if ( $ServInfo{$pack}{'pkgname'} eq $PackageName )
		{
			my %servData=%{$ServInfo{$pack}};
			UnRegisterServiceInAutoRun(\%servData);
			delete $ServInfo{$pack};
		}
	}
	Save( \%ServInfo, "/gsw/settings/services.ini" );
}

sub GetUniquePackageNumber()
{
	my (%data) = @_;
	my $MaxPackNum = -1;
	@keys1 = sort {
		$a =~ s/PACKAGE|\[|\]//g;
		$b =~ s/PACKAGE|\[|\]//g;
		$a <=> $b;
	} ( keys %data );
	$MaxPackNum = $keys1[ scalar(@keys1) - 1 ];
	$MaxPackNum =~ s/PACKAGE|\[|\]//g;
	$MaxPackNum++;
	if ( !defined($MaxPackNum) )
	{
		$MaxPackNum = 1;
	}
	return $MaxPackNum;
}

sub GetUniqueServiceNumber()
{
	my (%data) = @_;
	my $MaxServNum = -1;
	@keys1 = sort {
		$a =~ s/SERVICE|\[|\]//g;
		$b =~ s/SERVICE|\[|\]//g;
		$a <=> $b;
	} ( keys %data );
	$MaxServNum = $keys1[ scalar(@keys1) - 1 ];
	$MaxServNum =~ s/SERVICE|\[|\]//g;
	$MaxServNum++;
	if ( !defined($MaxServNum) )
	{
		$MaxServNum = 1;
	}
	return $MaxServNum;
}

sub GetUniqueServiceOrderNumber()
{
	my (%data) = @_;
	my $MaxOrderNum = -1;
	@keys1 =
	  sort { $data{$a}{"order"} <=> $data{$b}{"order"} } ( keys %data );
	$MaxOrderNum = $data{ $keys1[ scalar(@keys1) - 1 ] }{'order'};
	$MaxOrderNum++;
	if ( !defined($MaxOrderNum) )
	{
		$MaxOrderNum = 1;
	}
	return $MaxOrderNum;
}

sub GetIniFileData()
{
	my ($filename) = @_;
	my $INIFILE;
	my $section;
	my %Data;
	if ( open( INIFILE, "<" . $filename ) != 0 )
	{
		while (<INIFILE>)
		{
			chomp;
			$_ =~ s/:.*//g;

			if (/\[.+?\]/)
			{
				$section = $_;
				from_to( $section, "cp866", "utf8" );
			}
			if (/(\.*)\=(\.*)/)
			{
				$s = "$`";
				$s =~ s/:.*//g;
				from_to( $s, "cp866", "utf8" );
				my $s1 = "$'";
				from_to( $s1, "cp866", "utf8" );
				$Data{$section}{$s} = $s1;
				undef $s;
				undef $s1;
			}
		}
		close(INIFILE);
	}
	undef $section;
	undef $INIFILE;
	undef $filename;
	return %Data;
}

sub Save()
{
	my ( $data, $path ) = @_;
	my %filedata = %$data;
	my $OUTFILE;
	open( OUTFILE, ">" . $path ) or die print "sdfsdfsdfsdf";
	foreach my $section ( keys %filedata )
	{
		my $s = $section;
		from_to( $s, "utf8", "cp866" );
		print OUTFILE $s, "\n";
		foreach my $param ( keys %{ $filedata{$section} } )
		{
			my $v = $filedata{$section}{$param};
			from_to( $v, "utf8", "cp866" );
			my $p = $param;
			from_to( $p, "utf8", "cp866" );
			print OUTFILE $p, "=", $v, "\n";
		}
	}
	close(OUTFILE);
}

sub debug_msg()
{
	my ($msg) = @_;
	my $LOGFILE;
	open( OUTFILE, ">>/tmp/dl-reg.log" );
	print OUTFILE $msg, "\n";
	close OUTFILE;
}

sub cat()
{
	my ($path) = @_;
	my $FILE;
	my @data = ();
	open( FILE, "<" . $path );
	while (<FILE>)
	{
		if(/^$/)
		{
			next;
		}
		push( @data, $_ );
	}
	close FILE;
	return @data;
}

sub setflag()
{
	my ($val) = @_;
	my $FILE;
	open( FILE, ">/tmp/dl-reg" );
	print FILE $val;
	close FILE;
}

sub DeleteDriverFromOldDrv
{
	my ($shortname, $OldDrvData) = @_;

	if ( defined( $OldDrvData->{ '[driver ' . $shortname.']' } ) )
	{
		delete $OldDrvData->{ '[driver ' . $shortname.']' };
	}
	if ( defined( $OldDrvData->{ '[Attach ' . $shortname.']' } ) )
	{
		delete $OldDrvData->{ '[Attach ' . $shortname.']' };
	}
	if ( defined( $OldDrvData->{ '[Trend ' . $shortname.']' } ) )
	{
		delete $OldDrvData->{ '[Trend ' . $shortname.']' };
	}
}
sub UnRegisterServiceInAutoRun()
{
   my ($service_data)=@_;
   my %settings = LoadKrugSettings();
   my $rc1_path=$settings{'GSW_ETC'}.'rc.d/rc1.d/';
   my $rc0_path=$settings{'GSW_ETC'}.'rc.d/rc0.d/';
   my $rc6_path=$settings{'GSW_ETC'}.'rc.d/rc6.d/';
   my $S_linkname="S".$service_data->{'order'}.$service_data->{'processname'};
   my $killorder=100-$service_data->{'order'};
   if($killorder<10)
   {
   	$killorder="0".$killorder;
   }   
   my $K_linkname="K".$killorder.$service_data->{'processname'};
   my $fullpath=$rc1_path.$S_linkname;
   if(-e $fullpath)
   {
   	unlink($fullpath);
   }
   $fullpath=$rc0_path.$S_linkname;
   if(-e $fullpath)
   {
   	unlink($fullpath);
   }
   $fullpath=$rc6_path.$K_linkname;
   if(-e $fullpath)
   {
   	unlink($fullpath);
   }   
}