Показаны сообщения с ярлыком perl. Показать все сообщения
Показаны сообщения с ярлыком perl. Показать все сообщения

среда, 22 августа 2012 г.

Книжка про перл

$ mkdir beginning_perl
$ cd  beginning_perl
$ lynx --source http://www.perl.org/books/beginning-perl/| grep pdf| awk -F"\"" '{print $4}' | xargs wget
$ gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=Beginning_Perl.pdf -dBATCH 3145_Intro.pdf 3145_Chap01.pdf 3145_Chap02.pdf 3145_Chap03.pdf 3145_Chap04.pdf 3145_Chap05.pdf 3145_Chap06.pdf 3145_Chap07.pdf 3145_Chap08.pdf 3145_Chap09.pdf 3145_Chap10.pdf 3145_Chap11.pdf 3145_Chap12.pdf 3145_Chap13.pdf 3145_Chap14.pdf 3145_AppA.pdf 3145_AppB.pdf 3145_AppC.pdf 3145_AppD.pdf 3145_AppE.pdf 3145_AppF.pdf 3145_AppG.pdf 3145_AppH.pdf 3145_AppJ.pdf 3145_Index.pdf

Cpanel wildcard domains and nginx

На днях появилась такая проблемка:
1. Клиент в сипанели цепляет вайдкардный домен вида *.domain.com.
2. Панель добавляет алиас www.*.domain.com.
3. При генерации конфига nginx в директиву server_name попадает значение  "*.domain.com www.*.domain.com"/
4. Nginx проверяет новый конфиг и говорит, что он invalid, т.к. "*" допускается только в начале или конце сервернейма.

Сипанель нельзя заставить генерить имена с "*" в середине, поэтому пришлось выгребать такие имена из нагенерённого конфига.

Сделал такую штуку:
#!/usr/bin/perl
my $filename=$ARGV[0];
open(IN, "<", $filename) or die "open error\n";

while (<IN>) {
        my($line) = $_;
        chomp($line);
        if (m/server_name/) {
                $line =~ s/\S+\*\S+//g;
        }
        print  "$line\n";
}
Дергаю её после генерации конфига, в патч для скрипта-генератора:
--- build-conf.sh       2010-03-04 14:26:39.000000000 +0300
+++ build-conf.sh_new   2012-08-22 11:58:27.000000000 +0400
@@ -16,13 +16,16 @@

 cd $ROOT

-if [ ! -f $NGINX/vhosts.conf.new ]; then
-       touch $NGINX/vhosts.conf.new
-       chmod 600 $NGINX/vhosts.conf.new
+if [ ! -f $NGINX/vhosts.conf.raw ]; then
+        touch $NGINX/vhosts.conf.raw
+        chmod 600 $NGINX/vhosts.conf.raw
 fi

 # build nginx conf using default template in $TMPL
-$ROOT/ngx_conf_gen.pl -c /usr/local/apache/conf/httpd.conf > $NGINX/vhosts.conf.new || exit 4
+$ROOT/ngx_conf_gen.pl -c /usr/local/apache/conf/httpd.conf > $NGINX/vhosts.conf.raw || exit 4
+
+# remove invalid wildcarded server_name (example: www.*.server.com)
+$ROOT/rm_badwildcard.pl $NGINX/vhosts.conf.raw > $NGINX/vhosts.conf.new

 new=`$MD5 $NGINX/vhosts.conf.new | cut -f1 -d' '`
 cur=`$MD5 $NGINX/vhosts.conf | cut -f1 -d' '`

четверг, 9 сентября 2010 г.

Ротация бекапов

Доделал скрипт для хранения и ротации бекапов. Из костыля к fsbackup оформилось что-то полноценное.
Можно отправлять несколько файлов, пример:
/root/scripts/store.pl /root/scripts/mybase.sql.gz backup.tar.gz
В сам скрипт забиваются реквизиты ftp сервера и глубина ротации.

#!/usr/bin/perl

use Net::FTP;
use File::Basename;


my $remote_host = "localhost";
my $remote_login = "backup";
my $remote_password = "yeyzfz200";
my $n = 12;
my $path;
my $file;

$ftp = Net::FTP->new($remote_host) || die "Can't connect to ftp server.\n";
$ftp->login($remote_login, $remote_password) || die "Can't login to ftp server.\n";
$ftp->binary();


while ($path = shift @ARGV) {
        my $file = basename($path);
        # old backup deleting
        print "Remove old backup\n";
        foreach $cur_dir ($ftp->ls()) {
                if ($cur_dir eq $file.".".($n - 1)) {                                                                                                       
                        $ftp->delete($cur_dir);                                                                                                             
                }                                                                                                                                           
        }                                                                                                                                                   
        # backup rotate                                                                                                                                     
        print "Backup rotating:\n";                                                                                                                         
        for ($i = $n - 2; $i > 0; --$i) {                                                                                                                   
                $j = $i + 1;                                                                                                                                
                foreach $cur_dir ($ftp->ls()) {                                                                                                             
                        $name = $new_name = $cur_dir;                                                                                                       
                        if ($name eq $file.".".$i) {                                                                                                        
                                $new_name =~ s/\.$i$/\.$j/;                                                                                                 
                                print "$name -> $new_name\n";                                                                                               
                                $ftp->rename($name, $new_name);                                                                                             
                        }                                                                                                                                   
                }                                                                                                                                           
        }                                                                                                                                                   
        foreach $cur_dir ($ftp->ls()) {                                                                                                                     
                $name = $new_name = $cur_dir;                                                                                                               
                if ($name eq $file) {                                                                                                                       
                        $new_name = $name.".1";                                                                                                             
                        print "$name -> $new_name\n";                                                                                                       
                        $ftp->rename($name, $new_name) or die "Can't rename $name\n";                                                                       
                }                                                                                                                                           
        }                                                                                                                                                   
                                                                                                                                                            
        $ftp->put("$path", "$file") || print "Can't PUT $path to remote FTP";                                                                               
}

вторник, 11 мая 2010 г.

Ротация бекапов в fsbackup

fsbackup - замечательная штука, но сохраняет токо последний бекап. Немного переделал скрипт, заменив сохранение старого бекапа на ротацию до 10 бекапов:

# Удаление старых бекапов
    print "Remove old backup\n";
        foreach $cur_dir ($ftp->ls()) {
            if ($cur_dir =~ /\.9$/) {
                $ftp->delete($cur_dir);
             }
        }
    # Ротация бекапов
        print "Backup rotating:\n";
        for ($i = 8; $i > 0; --$i) {
            $j = $i + 1;
            foreach $cur_dir ($ftp->ls()) {
                $name = $new_name = $cur_dir;
                if ($name =~ /\.$i$/) {
                    $new_name =~ s/\.$i$/\.$j/;
                    print "$name -> $new_name\n";
                    $ftp->rename($name, $new_name) or die "Can't rename $name\n";
                }
            }
        }
        foreach $cur_dir ($ftp->ls()) {
            $name = $new_name = $cur_dir;
                if ($name =~ /\.\w{2,5}$/) {
                    $new_name = $name.".1";
                    print "$name -> $new_name\n";
                    $ftp->rename($name, $new_name) or die "Can't rename $name\n";
                }
        }