LINUX.ORG.RU

Как перед заменой выполнить поиск между определенными словами?

 , , ,


0

2

Задача примерно такая: У меня есть файл apache2.conf и я пытаюсь добавить в vitualhost сайта определенную строку, не удаляя другие.

Сейчас разбираюсь с perl, нашел пример с заменой, но он полностью стирает всё что найдено между ServerName и </VirtualHost> , а мне нужно хотя бы дописать, или в идеале: Найти в apache2.conf нужный virtualhost: ServerName $domain и </VirtualHost> , удалить строку начинающуюся с «ScriptAlias /php-bin/» и добавить свою строку «ScriptAlias /php-bin/ /нужный_путь/»

Нашел скриптик на гитхабе, но он удаляет всё что было в virtualhost, а потом добавляет то что нужно. Хотелось бы что бы не удалял.

Сам скрипт:

my $apacheconf = '/etc/apache2/apache2.conf';
    open(my $fh, '<:encoding(UTF-8)', $apacheconf);	
  
    my $newtext = "\n\tScriptAlias /php-bin/ /var/www/"."$user"."\n";

    my $find = "/var/www/$user/data/www/$domain";
    
    my $str = "";

    while (my $rowa = <$fh>) {
      chomp $rowa;
      $str .= "$rowa\n";
    }
    close $fh;
    my $string = $str;
    $string =~ s/(ServerName $domain).*?(\<\/VirtualHost\>)/$1$newtext$2/gis;

То есть задача у меня такая: Найти определенный virtualhost, удалить из него строку начинающуюся с ScriptAlias и добавить строчку из $newtext

Подскажите пожалуйста как хотя бы добавить строчку, я только учусь думаю что мне проще будет как-то отдельно от этой конструкции удалять строку, к примеру так:

perl -ni -e 'print unless /ScriptAlias \/php-bin\//' $результат_поиска_между_ServerName_и_virtualhost



Последнее исправление: yuranp (всего исправлений: 1)

Ответ на: tl;dr от mos

Ниже весь код, $newtext вставляется между ServerName $curdomain и <\VirtualHost>, но при этом всё что было там - удаляется.

#!/usr/bin/perl
BEGIN { push @INC, '/usr/local/ispmgr/lib/perl' }
use CGI;
use LWP::UserAgent;
use CGI::Carp qw(fatalsToBrowser);
use LWP::UserAgent;
use Time::localtime;
use strict;
use warnings;
use XML::Simple;
use Mgr;
#take a time
sub timestamp 
{
 	my $t = localtime;
    return sprintf( "%04d-%02d-%02d_%02d-%02d-%02d",
    $t->year + 1900, $t->mon + 1, $t->mday,
    $t->hour, $t->min, $t->sec );
}

#prepare
my $v52 = "#!/usr/local/php/5.2/bin/php-cgi";
my $v54 = "#!/usr/local/php/5.4/bin/php-cgi";
my $v70 = "#!/usr/local/php/7.0/bin/php-cgi";
my $v72 = "#!/usr/local/php/7.2/bin/php-cgi";
my $v73 = "#!/usr/local/php/7.3/bin/php-cgi";

#Get current user php version
my $Q = new CGI;
open DATA, "<phpchanger/domain.user";
my @rows = <DATA>;
close DATA;
my $user = $ENV{"REMOTE_USER"};
my $curdomain = $Q->param("domain");
my $newphp = $Q->param("phpver");
my $cdomain = $Q->param("elid");
my $usercurrentphpver = "5.4";
foreach $row (@rows) 
	{
		my @elems = split / /, $row, 3;
		if ($elems[0] eq $user && $elems[1] eq $cdomain)
		{
			my $usercurrentphpver = $elems[2];
		}
	}

if ($Q->param("sok")) 
{
		my $wrapper = "/var/www/php-bin/$user/php";

		#Writing changed setting
        open DATA, ">phpchanger/domain.user";
        foreach $row (@rows)
		{
            my @elems = split / /, $row, 3;
            printf DATA "%s", $row if ($elems[1] ne $curdomain);
        }
        printf DATA "%s %s %s\n", $user, $curdomain, $newphp;
        close DATA;

		#wrapping
		my $chphp = "";
		if (!-e $wrapper)
		{
			system ("touch $wrapper");
			system ("chown ".$user.":".$user." $wrapper");
			system ("chmod 0555 $wrapper");
			#my $lfh;
			#open($lfh, '>', $wrapper);
			#close($lfh);
			#my $uid = getpwnam $user;
			#my $gid = getgrnam $user;
			#chown $uid, $gid, $wrapper;
			#chmod 0555, $wrapper;
		}

		if($newphp == 5.2){
			$chphp = 5.2;
			system ("chattr -i $wrapper");
			system ("echo '$v52' > $wrapper");
			system ("chattr +i $wrapper");
            system ("pkill -9 -u $user");
		}
		if($newphp == 5.4){
			$chphp = 5.4;
			system ("chattr -i $wrapper");
			system ("echo '$v54' > $wrapper");
			system ("chattr +i $wrapper");
            system ("pkill -9 -u $user");
		}
		if($newphp == 7.0){
			$chphp = 7.0;
			system ("chattr -i $wrapper");
			system ("echo '$v70' > $wrapper");
			system ("chattr +i $wrapper");
            system ("pkill -9 -u $user");
		}
		if($newphp == 7.2){
			$chphp = 7.2;
			system ("chattr -i $wrapper");
			system ("echo '$v72' > $wrapper");
			system ("chattr +i $wrapper");
            system ("pkill -9 -u $user");
		}
		if($newphp == 7.3){
			$chphp = 7.3;
			system ("chattr -i $wrapper");
			system ("echo '$v73' > $wrapper");
			system ("chattr +i $wrapper");
            system ("pkill -9 -u $user");
		}
		# Запишем в лог
		open (MyFile, ">>" , "phpchanger/domain.change") ;
		print MyFile '[' . timestamp() . '] '.$user.' php was changed from '.$usercurrentphpver.' to '.$chphp."\n";
		close MyFile;

		#Getting apache's conf
		my $apacheconf = '/etc/apache2/apache2.conf';
		open(my $fh, '<:encoding(UTF-8)', $apacheconf);		

		#Setting text to replace
		my $newtext = "\n\tScriptAlias /php-bin/ "."$wrapper"."/"."$user"."/\n";
		
		#Setting find rule
		my $find = "/var/www/$user/data/www/$curdomain";
		
		#Getting config to a string
		my $str = "";

		while (my $rowa = <$fh>) {
		  chomp $rowa;
		  $str .= "$rowa\n";
		}
		close $fh;
		my $string = $str;
		$string =~ s/(ServerName $curdomain).*?(\<\/VirtualHost\>)/$1$newtext$2/gis;

		
		#backupping apache's config
		system("cp -f /etc/apache2/apache2.conf /usr/local/ispmgr/phpchanger/bkp/".timestamp()."_apache2.conf");
		
		#writing to apache's conf file
		open (MyApache, ">" , "/etc/apache2/apache2.conf");
		print MyApache $string;
		close MyApache;
		
		system('service apache2 reload >/dev/null 2>&1');
		
        print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<doc>\n<ok></ok>\n</doc>\n";
} else {
        #checking for php-cgi 
		($xmldoc, $xmlroot) = Mgr::query ('wwwdomain.edit', [ ['elid', $cdomain] ]);
		my $php_check = XMLin($xmldoc);
		
		#check for disabled domain 
		open DATA, "</usr/local/ispmgr/etc/ispmgr.conf";
		my @ispdomains = <DATA>;
		close DATA;
		
		print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<doc>\n";

		foreach $row (@ispdomains) {
			chomp($row);
			my @elems = split / /, $row, 3;
			if ($elems[0] eq "DisabledWebDomain" && $cdomain eq $elems[1] && "on" eq $elems[2]) {
				print "<error code=\"9\">Сайт отключен. Изменение версии PHP на отключенных сайтах невозможно.</error>\n";
				last;
				exit;
			}
		}
		
		if($php_check->{php} eq "phpmod")
		{
			print "<error code=\"9\">Сейчас Ваш сайт работает на PHP 5.6. Сначала выберите режим работы PHP как CGI, а затем выбирайте версию PHP.</error>\n";
		}
		
		if(-e "/var/www/php-bin/$user/php")
		{
			foreach $row (@rows) {
				chomp($row);
				my @elems = split / /, $row, 3;
				if ($elems[0] eq $user && $cdomain eq $elems[1]) {
					$elems[2] =~ s/\R//g;
					print "<phpver>$elems[2]</phpver>\n";
					last;
				}
			}
		} else {
			print "<phpver>5.4</phpver>\n";
		}
		print "<domain>$cdomain</domain>\n";
        # Заполняем список возможных версий
        print "<slist name=\"phpver\">\n";
        open WLIST, "<phpchanger/phpver.list";
        my @wlist = <WLIST>;
        close WLIST;
        foreach $phpver (@wlist) {
            my @elems = split / /, $phpver, 2;
        	$elems[0] =~ s/\R//g;
            print "<msg name='$elems[0]'>$elems[0]</msg>\n";
        }
        print "</slist>\n";
        print "</doc>\n";
}
yuranp
() автор топика
Ответ на: комментарий от yuranp

Образцовый говнокод. Как-то ты плохо с перлом разбираешься. Посчитай количество вызовов system и подумай, может, пора на баш перейти?

debugger ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.