Archive

Archive for the ‘FreeBSD’ Category

Установка PHP5.2 из портов на FreeBSD

May 31st, 2010

Сейчас в портах есть порт php52, но у меня он корректно собрался с модулем апача только с Apache 2.2. Поэтому в скрипте автоматической установки будет небольшое исправление:

make WITHOUT_SAMBA=yes -DBATCH -C /usr/ports/misc/mc install clean
make WITH_RC_NG=yes -DBATCH -C /usr/ports/ftp/vsftpd install clean
make WITHOUT_IPV6=yes -DBATCH -C /usr/ports/www/apache22 install clean
make WITH_CHARSET=utf8 WITH_COLLATION=utf8_unicode_ci -DBATCH -C /usr/ports/databases/mysql51-server install clean
make WITH_APACHE=yes WITHOUT_IPV6=yes -DBATCH -C /usr/ports/lang/php52 install clean
make WITH_BUNDLED_PCRE=yes -DBATCH -C /usr/ports/devel/php52-pcre install clean
make WITH_MBSTRING=yes WITH_CURL=yes WITH_FTP=yes WITH_GD=yes WITH_MCRYPT=yes WITH_MYSQL=yes WITH_MYSQLI=yes WITH_OPENSSL=yes WITH_SOCKETS=yes WITH_ZLIB=yes -DBATCH -C /usr/ports/lang/php52-extensions install clean
make -DBATCH -C /usr/ports/www/mod_geoip2 install clean
make WITH_HTTP_FLV_MODULE=yes -DBATCH -C /usr/ports/www/nginx install clean
make -DBATCH -C /usr/ports/www/mod_rpaf2 install clean
make -DBATCH -C /usr/ports/devel/ZendOptimizer install clean

FreeBSD, php

Ошибка в работе pcre (preg_match) во FreeBSD

April 22nd, 2010

В версиях php5-pcre 5.2 и ниже возможна ошибка проявляющаяся как:

Warning: preg_match() [function.preg-match]: Internal pcre_fullinfo() error

Причина этого проста – при сборке этого порта забыли поставить галочку для поддержки апача. Т.е. надо просто сделать make config этому порту и переустановить его.

FreeBSD, php

Перенос базы пользователей FreeBSD

March 11th, 2010

Чтобы перенести всех системных пользователей на другой сервер надо просто скопировать поверх файлы /etc/master.passwd и /etc/group, и затем на новом сервере выполнить команду

pwd_mkdb master.passwd

FreeBSD

Простая установка VPN-сервера MPD на FreeBSD

February 25th, 2010

Ставим из портов:

cd /usr/ports/net/mpd5 && make install

У файлов из /usr/local/etc/mpd5/ делаем копии без .sample

В mpd.secret удаляем все и прописываем имя и пароль в открытом виде через табуляцию.

В mpd.conf:
В секции startup: комментируем строчки set web.
В default заменяем на load pptp_server
В секции pptp_server:
меняем set ippool add pool1 на пул не пересекающийся с нашими локальными адресами.
set ipcp dns 8.8.8.8
set ipcp ranges – адрес сервера
set pptp self – адрес на котором будет слушать сервер.
set ipcp nbns – можно удалить

В /etc/rc.conf

mpd_enable="YES"
ipnat_enable="YES"
ipnat_rules="/etc/ipnat.rules"
gateway_enable="YES"

В /etc/ipnat.rules:

map bge0 192.168.6.0/24 -> 0/32

где bge0 внешний интерфейс сервера.

Запускаем:

/etc/rc.d/ipnat start
sysctl net.inet.ip.forwarding=1
/usr/local/etc/rc.d/mpd5 start

Все, можно подключаться стандартным виндовым клиентом.

FreeBSD, vpn ,

Проблема с php5-ffmpeg на FreeBSD

January 28th, 2010

На сегодняшний день имеется проблема выражающаяся в том, что одна из основных функций toGDImage() не работает выдавая ошибку “ffmpeg.so: Undefined symbol img_convert”
Этот патч проблему не решил.
Помогло следующее: порт multimedia/ffmpeg должен быть собран без swscaler. Для этого нужно поправить Makefile. Т.е. сделать –disable-swsсale. После пересборки самого ffmpeg, пересобрать и php-ffmpeg.

FreeBSD, php

Установка mod_geoip на Linux/FreeBSD сервер с DirectAdmin

October 17th, 2009

В случае c Linux:

yum install GeoIP GeoIP-devel
cd /root
wget http://geolite.maxmind.com/download/geoip/api/mod_geoip2/mod_geoip2_1.2.5.tar.gz
tar zxvf mod_geoip2_1.2.5.tar.gz
cd mod_geoip2_1.2.5
apxs -i -a -L/usr/lib -I/usr/include -lGeoIP -c mod_geoip.c

В /etc/httpd/conf/httpd.conf добавляем:

LoadModule geoip_module /usr/lib/apache/mod_geoip.so
GeoIPEnable On
GeoIPDBFile /usr/share/GeoIP/GeoIP.dat
/etc/init.d/httpd restart

В случае с FreeBSD:

cd /usr/ports/net/GeoIP && make install
cd /root
wget http://geolite.maxmind.com/download/geoip/api/mod_geoip2/mod_geoip2_1.2.5.tar.gz
tar zxvf mod_geoip2_1.2.5.tar.gz
cd mod_geoip2_1.2.5
apxs -i -a -L/usr/local/lib -I/usr/local/include -lGeoIP -c mod_geoip.c

Добавление в конфиг апача аналогично.

FreeBSD, linux ,

Наблюдение за действиями на другом терминале

October 16th, 2009

Иногда бывает необходимо посмотреть что делает в терминале другой пользователь системы. Во FreeBSD для этого есть встроенные средства:

# w
9:16PM up 55 days, 5 mins, 2 users, load averages: 0.07, 0.06, 0.00
USER TTY FROM LOGIN@ IDLE WHAT
user1 p0 test1.ru 9:06PM - w
user2 p1 test2.ru 9:16PM - -bash (bash)

Теперь подключаемся к сеансу:

watch p1

FreeBSD

Даунгрейд порта во FreeBSD

October 12th, 2009

Иногда возникает необходимость откатить приложение установленное через порты на более раннюю версию. Сначала откатим данные в нашей базе портов на нужную версию. К примеру будем откатывать php:

cd /usr/ports/ports-mgmt/portdowngrade && make install clean
/usr/local/sbin/portdowngrade -s "anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs" lang/php5
Выбираем 1, выбираем номер версии на которую нужно откатиться, пишем yes

Теперь мы получили нужную версию в дереве портов. Теперь, чтобы переустановить приложение в систему:

portupgrade -f php5

Если надо даунгрейдить другие приложения, то шаги нужно повторить.

FreeBSD ,

Из какого пакета файл?

July 22nd, 2009

Отличная статья отвечающая на вопрос Из какого пакета установлен файл?

FreeBSD, linux , , ,

Установка jail во FreeBSD

July 20th, 2009

Сначала скачиваем исходники системы.
Внимание на тэг обновления! Он обязательно должен совпадать с веткой установленной системы. Например, для системы FreeBSD 7.2-RELEASE-p2 тэг должен быть tag=RELENG_7_2.

cd /usr/share/examples/cvsup

Правим хост в standard-supfile на *default host=cvsup5.FreeBSD.org и запускаем:

csup ./standard-supfile

Затем:

mkdir /home/jail_sample
setenv D /home/jail_sample
mkdir -p $D
cd /usr/src
make buildworld
make installworld DESTDIR=$D
cd etc/ [1]
make distribution DESTDIR=$D
mount -t devfs devfs $D/dev

В rc.conf :

ifconfig_bge0="inet 1.2.3.1  netmask 255.255.255.0"
ifconfig_bge0_alias0="inet 1.2.3.2 netmask 255.255.255.255"

jail_enable="YES"
jail_list="sample"

jail_sample_rootdir="/home/jail_sample"
jail_sample_hostname="www.sample.com"
jail_sample_ip="1.2.3.2"
jail_sample_devfs_enable="YES"
jail_sample_sysvips_allow="YES"

Убедиться, что демоны на хост-машине и в jail не пересекаются по используемым IP-адресам.

Команды для управления jail-ом:

/etc/rc.d/jail start/stop/restart sample
jls # список запущенных jail
jexec 2 tcsh # запустить шелл внутри jail с ID=2

Возможно, потребуется поправить некоторые sysctl на хост-машине:

  • security.jail.set_hostname_allowed – если 1, то внутри jail можно поменять имя хоста;
  • security.jail.socket_unixiproute_only – если 1 , то сокет в jail можно создать только для доменов PF_LOCAL, PF_INET или PF_ROUTE, иначе, возвращается ошибка;
  • security.jail.sysvipc_allowed – если 1, то то в jail можно получить доступ к глобальному System V IPC;
  • security.jail.getfsstatroot_only – если 1, то в jail можно получить информацию (df)только о той файловой системе на которой создан jail;
  • security.jail.allow_raw_sockets – если 1, то в jail можно создавать raw sockets;
  • security.jail.chflags_allow – если 1, то процессы в jail могут модифицировать флаги ФС.

FreeBSD ,

Наблюдение за загрузкой канала клиентами в реальном времени

July 15th, 2009

Часто возникает задача в реальном времени наблюдать за загрузкой интернет-канала по пользователям сидящими за nat-ом. С этим отлично справляется iftop. Он выдает вот такую картинку:
iftop

Ставим:

cd /usr/ports/net-mgmt/iftop && make install

Можно использовать такой конфиг (.iftoprc) где 2М это ширина входящего интернет-канала:

port-resolution: no
show-bars: yes
promiscuous: no
port-display: off
line-display: one-line-sent
max-bandwidth: 2M
hide-source: yes

Запускаем:

iftop -c ./.iftoprc

FreeBSD ,

Скрипт автоматической установки типового веб-сервера на FreeBSD

July 5th, 2009

Задача: в автоматическом режиме установить основное ПО необходимое для работы веб-сервера: nginx/Apache/PHP/MySQL/vsftpd.
Скачать скрипт целиком

#!/bin/sh

### ver. 0.92 from 7.07.2009

### No need change in this script ###

os=`uname -a |grep -c FreeBSD`
if [ $os = "0" ]; then
    echo "This script work only on FreeBSD. Exit."
    exit
fi

echo "Enter username to create (default, admin):"
read USER
echo "This host is VPS? (yes/no. Default, no):"
read thisvps

if [ -z $USER ]; then
    USER=admin
fi
if [ -z $thisvps ]; then
    thisvps=no
fi

confighost=unix-notes.ru
USERPASS=`< /dev/urandom tr -dc A-Za-z0-9 | head -c15`
SQLPASS=`< /dev/urandom tr -dc A-Za-z0-9 | head -c15`
thiswebazilla=`uname -a | grep -c "webazilla"`

echo "WITHOUT_X11=yes" >> /etc/make.conf
echo "WITHOUT_IPV6=yes" >> /etc/make.conf
echo "WITHOUT_SAMBA=yes" >> /etc/make.conf

echo 'fsck_y_enable="YES"' >> /etc/rc.conf
echo 'icmp_drop_redirect="YES"' >> /etc/rc.conf
echo 'accounting_enable="YES"' >> /etc/rc.conf
echo 'syslogd_flags="-ss"' >> /etc/rc.conf
echo 'tcp_drop_synfin="YES"' >> /etc/rc.conf
echo 'tcp_restrict_rst="YES"' >> /etc/rc.conf
echo 'apache2_enable="YES"' >> /etc/rc.conf
echo 'mysql_enable="YES"' >> /etc/rc.conf
echo 'mysql_dbdir="/home/mysql"' >> /etc/rc.conf
echo 'nginx_enable="YES"' >> /etc/rc.conf
echo 'vsftpd_enable="YES"' >> /etc/rc.conf

# check to exist homedir
if [ ! -d /home ];  then
   echo "/home is no exist! setup canceled."
   exit
fi

# add additional dns servers, OpenDNS
echo "nameserver 208.67.222.222" >> /etc/resolv.conf

mkdir /root/.ssh
cd /root/.ssh
fetch http://$confighost/config/ssh/egor-pentarh/authorized_keys
chown -R root /root
chmod -R 400 /root

if [ $thisvps = "no" ]; then
    cd /etc
    rm -f /etc/sysctl.conf
    fetch http://$confighost/config/freebsd/sysctl.conf
    /etc/rc.d/sysctl restart

    ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime
    ntpdate pool.ntp.org
    echo "1 1 * * * root ntpdate pool.ntp.org" >> /etc/crontab
fi

if [ $thisvps = "yes" ]; then
    ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime
fi

freebsd-update fetch
freebsd-update install

portsnap fetch
portsnap extract
portsnap update

make WITHOUT_SAMBA=yes -DBATCH -C /usr/ports/misc/mc install clean
make WITH_RC_NG=yes -DBATCH -C /usr/ports/ftp/vsftpd install clean
make WITHOUT_IPV6=yes -DBATCH -C /usr/ports/www/apache20 install clean
make WITH_CHARSET=utf8 WITH_COLLATION=utf8_unicode_ci -DBATCH -C /usr/ports/databases/mysql51-server install clean
make WITH_APACHE=yes WITHOUT_IPV6=yes -DBATCH -C /usr/ports/lang/php5 install clean
make WITH_BUNDLED_PCRE=yes -DBATCH -C /usr/ports/devel/php5-pcre install clean
make WITH_MBSTRING=yes WITH_CURL=yes WITH_FTP=yes WITH_GD=yes WITH_MCRYPT=yes WITH_MYSQL=yes WITH_MYSQLI=yes WITH_OPENSSL=yes WITH_SOCKETS=yes WITH_ZLIB=yes -DBATCH -C /usr/ports/lang/php5-extensions install clean
make -DBATCH -C /usr/ports/www/mod_geoip2 install clean
make WITH_HTTP_FLV_MODULE=yes -DBATCH -C /usr/ports/www/nginx install clean
make -DBATCH -C /usr/ports/www/mod_rpaf2 install clean
make -DBATCH -C /usr/ports/devel/ZendOptimizer install clean

cd /usr/local/etc
rm -f /usr/local/etc/vsftpd.conf
fetch http://$confighost/config/linux/vsftpd.conf
chmod 400 /usr/local/etc/vsftpd.conf

cd /usr/local/etc/apache2/Includes
fetch http://$confighost/config/freebsd/mod_rpaf.conf
iplist=`ifconfig | grep inet | grep -v inet6 | awk '{print $2}' | grep -v '^$' | tr "\n" " "`
sed -I "" "s/127.0.0.1/$iplist/g" /usr/local/etc/apache2/Includes/mod_rpaf.conf
mkdir /var/log/httpd
chmod 777 /var/log/httpd

# Create user and setup user folders
pw user add $USER -d /home/$USER -m -s /sbin/nologin
echo "$USERPASS" |pw usermod $USER -h0
mkdir /home/$USER/domains
chmod -R 755 /home/$USER
chown -R $USER:www /home/$USER/domains

cd /home/$USER
fetch http://$confighost/config/freebsd/create_domain.sh
sed -I "" "s/testuser/$USER/g" /home/$USER/create_domain.sh
chmod +x /home/$USER/create_domain.sh
mkdir /usr/local/etc/apache2/vhosts
cd /usr/local/etc/apache2/vhosts
fetch http://$confighost/config/freebsd/sample

cd /home/$USER
fetch http://$confighost/config/freebsd/create_base.sh
sed -I "" "s/INSERTPASSHERE/$SQLPASS/g" /home/$USER/create_base.sh
chmod +x /home/$USER/create_base.sh

cd /home/$USER
fetch http://$confighost/config/freebsd/create_multi_bases.sh
sed -I "" "s/INSERTPASSHERE/$SQLPASS/g" /home/$USER/create_multi_bases.sh
sed -I "" "s/username/$USER/g" /home/$USER/create_multi_bases.sh
chmod +x /home/$USER/create_multi_bases.sh


cd /usr/local/etc/apache2
rm -f /usr/local/etc/apache2/httpd.conf
fetch http://$confighost/config/freebsd/httpd.conf

cd /usr/local/etc/
fetch http://$confighost/config/freebsd/php.ini

cd /usr/local/etc/nginx
rm -f /usr/local/etc/nginx/nginx.conf
fetch http://$confighost/config/freebsd/nginx.conf
iplist2=`ifconfig | grep inet | grep -v inet6 | awk '{print $2}' | grep -v '^$'|grep -v 127.0.0.1 | sed 's/\(.*\)/listen \1;/'`
sed -I "" "s/user_name/$USER/g" /usr/local/etc/nginx/nginx.conf
sed -I "" "s/IPADDR/$iplist2/g" /usr/local/etc/nginx/nginx.conf
mkdir /var/log/nginx/
chmod 777 /var/log/nginx/

mkdir /home/mysql
mkdir /home/mysql/tmp
chown -R mysql /home/mysql/
chmod -R 755 /home/mysql/
cd /etc
rm -f /etc/my.cnf
if [ $thisvps = "no" ]; then
    fetch http://$confighost/config/freebsd/my.cnf
fi
if [ $thisvps = "yes" ]; then
    fetch http://$confighost/config/freebsd/vps/my.cnf
fi
touch /var/log/mysqld.log
chmod 777 /var/log/mysqld.log
/usr/local/etc/rc.d/mysql-server start
/usr/local/bin/mysqladmin password $SQLPASS
echo "DELETE FROM mysql.user WHERE Password=''" | /usr/local/bin/mysql --password=$SQLPASS

/usr/local/etc/rc.d/apache2 start
/usr/local/etc/rc.d/nginx start
/usr/local/etc/rc.d/vsftpd start

echo "##############################"
echo "Setup ready!"
echo "FTP username: $USER"
echo "FTP password: $USERPASS"
echo "MySQL root password: $SQLPASS"
echo "##############################"

FreeBSD ,

Простой скрипт бэкапа типового веб-сервера

June 23rd, 2009

Скрипт может создавать локальный архив из указанных каталогов, с указанными исключениями; архив mysql-баз. Может закачивать их на указанный FTP-сервер. Автоматически удаляет старые архивные копии (два варианта правил). Есть поддержка полного и инкрементального бэкапов. Работает под FreeBSD и Linux. Есть шифрование архивов и отправка уведомления о результатах на электронную почту.
Текст всех файлов ниже. Возможно удобнее будет скачатьархив:
файл backup.sh

#!/bin/sh

# Kiloservers.com sample backup script
# Last changes from: 23-07-2009

# Global backup tasks
mysql="YES" # need backup mysql bases? YES || NO
filebackup="YES" # need perform backup local files? YES || NO
savelocalbackup="YES" # need save backup on local drive? YES || NO
uploadbackup="YES" # need upload backup to FTP server? YES || NO
encryptbackup="NO" # need encrypt backup? YES || NO. If "YES" setup "encryptkey".
emailresult="YES" # need send e-mail with the results of backup? YES || NO. If "YES" setup "emailforresult".

# Common parametrs
backuptype="full" # 'full' or 'incremental'-files changed after last full backup
scriptdir="/etc/backup-complect" # homedir of this script
backupdir="/home/backup" # where save local backup
incfile="incfile" # file/dirs include to backup. Change content of this file
exfile="exfile" # file/dirs exclude from backup. Change content of this file
minfreespace="5000" # Minimal free space on backup slice in MB to start backup
encryptkey="" # Secret key to encrypt backup. Min 10 symbols recommended. Make sure that this key is kept in a safe place!
gpgpath="/usr/local/bin/" # path to gpg program
ftppath="/usr/bin/" # path to ftp client program
emailforresult="" # e-mail for backup results
sendmailpath="/usr/sbin/" # path to sendmail program

# FTP settings
ftphost="" # backup host
ftpuser=""
ftppass=""

# SQL settings
sqluser="root"
sqlpass=""
sqlhost="localhost"
allbases="YES" # 'YES' or 'NO'. Backup all bases or only from 'backupsqlbases' parametr
backupsqlbases="mysql" # bases list separate by space
mysqlutilspath="/usr/local/bin/" # path to 'mysql' and 'mysqldump' folder. No need to change.
sqldef="--single-transaction --skip-add-locks --skip-disable-keys --force" # parametrs for mysqldump


#######################
##### just do it! #####
#######################

salt=`< /dev/urandom tr -dc A-Za-z0-9 | head -c8` # random string for more secure ftp uploads
freespace=`df -m $backupdir | grep dev | awk '{print $4}'` # current free space on backupdir slice
hostn=`hostname`
backupstartdate=`date "+%Y-%m-%d %H:%M %Z%n"`

# check to exist backupdir
if [ ! -d $backupdir ];  then
   echo "$backupdir backupdir is no exist! Backup canceled."
   exit
fi

# check to exist mysql/mysqldump program
if [ $mysql = YES ]; then
    if [ ! -f $mysqlutilspath"/mysql" ];  then
        mysqlutilspath="/usr/bin/"
        if [ ! -f $mysqlutilspath"/mysqldump" ];  then
            echo "mysqldump program is not exist on this path $mysqlutilspath ! Backup canceled."
            exit
        fi
    fi
fi

# check to email setup
if [ $emailresult = YES ]; then
    if [ $emailforresult = "" ]; then
        echo "You should setup emailforresult parametr. Backup canceled."
        exit
    fi

    if [ ! -f $sendmailpath"/sendmail" ];  then
        echo "You should setup sendmail before. Backup canceled."
        exit
    fi
fi

# check to exist ftp client program
if [ $uploadbackup = YES ]; then
    if [ ! -f $ftppath"/ftp" ];  then
        ftppath="/usr/local/bin/"
        if [ ! -f $ftppath"/ftp" ];  then
            echo "FTP client program is not exist on this path $ftppath ! Backup canceled."
            echo "To install ftp client on CentOS/RHEL:"
            echo "yum install ftp"
            exit
        fi
    fi

    # remove old ftp logs
    if [ -f $scriptdir"/ftpdump.txt" ];  then
        rm $scriptdir"/ftpdump.txt"
    fi
fi

# check to free space on backupdir
if [ $minfreespace -ge $freespace ]; then
    echo "Free space not enought! Backup canceled."
    exit
fi

# check gpg and secret key
gpgext=""
if [ $encryptbackup = YES ]; then
    if [ $encryptkey = "" ]; then
        echo "You must install the encryption key. Exit."
        exit
    fi

    if [ ! -f $gpgpath"/gpg" ];  then
        gpgpath="/usr/bin/"
        if [ ! -f $gpgpath"/gpg" ];  then
            echo "GnuPG v.1 is not found. You must setup path to GnuPG v.1 in gpgpath or setup GnuPG v.1."
            echo "To setup GnuPG v.1 on FreeBSD use:"
            echo "pkg_add -r gnupg1"
            echo "or"
            echo "cd /usr/ports/security/gnupg1 && make install"
            echo ""
            echo "To setup GnuPG v.1 on CentOS/RHEL use:"
            echo "yum install gnupg"
            echo ""
            echo "Backup canceled."
            exit
        fi
    fi
    gpgext=".gpg"
fi

# check OS
checkos=`uname -a | grep -c "FreeBSD"`

# if FreeBSD
if [ $checkos = "1" ]; then
    newerparam=" --newer-mtime-than "$scriptdir"/metka"
fi

# if Linux
if [ $checkos = "0" ]; then
    newerparam=" --newer "$scriptdir"/metka"
fi

if [ $backuptype = full ]; then
    newerparam=""
fi


incfile=$scriptdir"/"$incfile
exfile=$scriptdir"/"$exfile
curdate=`date "+%Y-%m-%d%n"`
curdatewithhours=`date "+%Y-%m-%d-%H%n"`

# get list of all mysql bases
if [ $mysql = YES ]; then
    echo "Get MySQL databases list"
    if [ $allbases = YES ]; then
        backupsqlbases=`echo "show databases"|$mysqlutilspath'mysql' --user=$sqluser --password=$sqlpass --host=$sqlhost|grep -v "^D"`
    fi
fi

# create remote current day folder
if [ $uploadbackup = YES ]; then
    echo "Create remote current day folder"
    ftp -i -n $ftphost 2>&1 1>>$scriptdir/ftpdump.txt <<END_SCRIPT
    quote USER $ftpuser
    quote PASS $ftppass
    mkdir /$curdate
    quit
END_SCRIPT
fi


if [ ! -d $backupdir"/"$curdate ];  then
    echo "Creating "$backupdir"/"$curdate
    mkdir $backupdir"/"$curdate
    chmod 777 $backupdir"/"$curdate
fi
cd $backupdir"/"$curdate

# create and upload mysql bases backup
if [ $mysql = YES ]; then
    echo "Begin export databases"
    for base in $backupsqlbases
        do
        $mysqlutilspath'mysqldump' $sqldef --user=$sqluser --password=$sqlpass --host=$sqlhost $base > $backupdir/$curdate/$base.sql
    done

    echo "Begin compress databases"
    nice -n 15 tar -cz -f $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz $backupdir/$curdate/*.sql
    rm $backupdir/$curdate/*.sql

    # get filesize
    if [ $checkos = "1" ]; then
        sqlbackupfilesize=`stat -f %z $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz`
        else
        sqlbackupfilesize=`stat -c %s $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz`
    fi

    if [ $encryptbackup = YES ]; then
        echo "Begin encrypt databases archive"

        echo "$encryptkey" | $gpgpath/gpg --no-tty --passphrase-fd 0 --cipher-algo AES256  -cq $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz
        rm $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz

        # get filesize for gpg files
        if [ $checkos = "1" ]; then
            sqlbackupfilesizegpg=`stat -f %z $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz$gpgext`
            else
            sqlbackupfilesizegpg=`stat -c %s $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz$gpgext`
        fi
    fi

    if [ $uploadbackup = YES ]; then
        echo "Begin upload databases archive"
        ftp -i -n $ftphost 2>&1 1>>$scriptdir/ftpdump.txt <<END_SCRIPT
        quote USER $ftpuser
        quote PASS $ftppass
        binary
        put $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz$gpgext /$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz$gpgext
        quit
END_SCRIPT
    fi

    if [ $savelocalbackup = NO ]; then
        echo "Remove local copy databases archive"
        rm $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz
        rm $backupdir/$curdate/$hostn-sql-backup-$curdatewithhours-$salt.tar.gz$gpgext
    fi
fi

# create and upload file backup
if [ $filebackup = YES ]; then
    echo "Begin compress files archive"

    nice -n 15 tar -cz $newerparam -f $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz -T $incfile -X $exfile

    # get filesize
    if [ $checkos = "1" ]; then
        filebackupfilesize=`stat -f %z $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz`
        else
        filebackupfilesize=`stat -c %s $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz`
    fi

    if [ $encryptbackup = YES ]; then
        echo "Begin encrypt files archive"

        echo "$encryptkey" | $gpgpath/gpg --no-tty --passphrase-fd 0 --cipher-algo AES256  -cq $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz
        rm $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz

        # get filesize for gpg files
        if [ $checkos = "1" ]; then
            filebackupfilesizegpg=`stat -f %z $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz$gpgext`
            else
            filebackupfilesizegpg=`stat -c %s $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz$gpgext`
        fi
    fi

    if [ $uploadbackup = YES ]; then
        echo "Begin upload files archive"
        ftp -i -n $ftphost 2>&1 1>>$scriptdir/ftpdump.txt <<END_SCRIPT
        quote USER $ftpuser
        quote PASS $ftppass
        binary
        put $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz$gpgext /$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz$gpgext
        quit
END_SCRIPT
    fi

    if [ $savelocalbackup = NO ]; then
        echo "Begin remove local copy files archive"
        rm $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz
        rm $backupdir/$curdate/$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz$gpgext
    fi
fi


# update special file for incremental backup
touch $scriptdir/metka

backupenddate=`date "+%Y-%m-%d %H:%M %Z%n"`

# send result e-mail
if [ -f $backupdir/report ];  then
    rm $backupdir/report
fi

if [ $emailresult = YES ]; then
    echo "Send a e-mail with the results"

    echo "Subject: $hostn `date "+%Y-%m-%d%n"` backup result" >> $backupdir/report

    echo "Backup started: $backupstartdate
Backup ended: $backupenddate" >> $backupdir/report

    echo "After backup free space on "$backupdir" - "`df -m $backupdir | grep dev | awk '{print $4}'`" MB" >> $backupdir/report

    if [ $filebackup = YES ]; then
        echo "Current file backup - "$filebackupfilesize" bytes - "$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz >> $backupdir/report

        if [ $encryptbackup = YES ]; then
            echo "Current encrypted file backup - "$filebackupfilesizegpg" bytes - "$hostn-$backuptype-file-backup-$curdatewithhours-$salt.tar.gz$gpgext >> $backupdir/report
        fi
    fi

    if [ $mysql = YES ]; then
        echo "Current mysql backup - "$sqlbackupfilesize" bytes - "$hostn-sql-backup-$curdatewithhours-$salt.tar.gz >> $backupdir/report

        if [ $encryptbackup = YES ]; then
            echo "Current encrypted mysql backup - "$sqlbackupfilesizegpg" bytes - "$hostn-sql-backup-$curdatewithhours-$salt.tar.gz$gpgext >> $backupdir/report
        fi
    fi

    if [ $uploadbackup = YES ]; then
        echo "Error during ftp upload: " >> $backupdir/report
        cat $scriptdir"/ftpdump.txt" >> $backupdir/report
    fi

    echo "
Local backup folder statistics:" >> $backupdir/report
    if [ $checkos = "1" ]; then
        du -hc -d 1 $backupdir >> $backupdir/report
        else
        du -hc --max-depth=1 $backupdir >> $backupdir/report
    fi

    cat $backupdir/report | $sendmailpath"/sendmail" $emailforresult
    rm $backupdir/report
fi

echo "Backup complete"
exit

Файл exfile

/var/log/
/home/mysql
*.bz2
*.err
*.flv
*.log
*.zzz
*.rar
*.wmv
*.gz
*.bz2
*.avi
*.zip

Файл incfile

/etc
/usr/local/etc

файл install.txt

INSTALLATION:

1. Copy this folder to /etc/
2. Create "backupdir" folder
3. Edit "incfile" (dirs are included in the backup) and "exfile" (dirs deleted from the backup) files
4. If need - create SQL user for backup and set "mysql" to YES
5. If need - set "encryptbackup" to YES and set encryptkey. To decrypt use "gpg -o output_filename.tar.gz -d encrypted_filename.gpg"
6. Setup "emailforresult"
7. Configure spacer.sh to check the free space
8. Create cron task. For example, for full backup, at first day of month .. and check free space:
###################
5       7       1       *       *       root    /etc/backup-complect/spacer.sh 2> /dev/null
15       7       1       *       *       root    /etc/backup-complect/backup.sh 2> /dev/null
###################
9. Perform the test run:
cd /etc/backup-complect
./backup.sh


IMPORTANT!
Do not forget to do a test restore!

Файл spacer.sh

#!/bin/sh

# Kiloservers free space and count files checker.
# The script deletes old files from "backupdir" until not enough free space
# OR
# deletes old files from "backupdir" until number of files reaches the required
# Last changes from: 23-07-2009

# Settings
mode="space" # work mode: "space" or "count".
minfreespace="5000" # Minimal free space in MB. Actual for "space" mode
count="6" # how many files stored. Actual for "count" mode
backupdir="/home/backup" # directory to check

### Begin ###
echo "Mode $mode active"

# check OS
checkos=`uname -a | grep -c "FreeBSD"`

if [ $mode = "space" ]; then
    while [ `df -m $backupdir | grep dev | awk '{print $4}'` -lt $minfreespace ]
    do
        if [ $checkos = "1" ]; then
            filetodelete=`find $backupdir -type f -exec stat -f "%Sm %N" -t %Y%m%d%H%M%S {} \; | sort -n | head -1 | cut -d' ' -f2`
            else
            filetodelete=`find $backupdir -type f -exec stat -c "%Y %n" {} \; | sort -n | head -1 | cut -d' ' -f2`
        fi

        if [ -z $filetodelete ]; then
            echo "No files found. Exit"
            exit
            else
            rm $filetodelete
            echo "Deleted $filetodelete"
        fi
    done
fi

if [ $mode = "count" ]; then
    while [ `find $backupdir -type f | wc -l` -gt $count ]
    do
        if [ $checkos = "1" ]; then
            filetodelete=`find $backupdir -type f -exec stat -f "%Sm %N" -t %Y%m%d%H%M%S {} \; | sort -n | head -1 | cut -d' ' -f2`
            else
            filetodelete=`find $backupdir -type f -exec stat -c "%Y %n" {} \; | sort -n | head -1 | cut -d' ' -f2`
        fi

        if [ -z $filetodelete ]; then
            echo "No files found. Exit"
            exit
            else
            rm $filetodelete
            echo "Deleted $filetodelete"
        fi
    done
fi

echo "Check complete"

FreeBSD, linux, Uncategorized ,

Базовая настройка ipfilter

June 3rd, 2009

К пакету применяется последнее подходящее правило.
Параметры в rc.conf:

ipfilter_enable="YES"             # Запуск межсетевого экрана ipf
ipfilter_rules="/etc/ipf.rules"   # Загрузка файла с правилами
gateway_enable="YES"              # Включение шлюза для локальной сети
ipnat_enable="YES"                # Если надо задействовать nat
ipnat_rules="/etc/ipnat.rules"    # Определение файла правил для ipnat

Примеры правил в ipf.rules:

pass out quick on lo0 proto ip from any to any
pass in quick on lo0 proto ip from any to any
pass in quick on fxp1 proto tcp from any to 1.2.3.1/32 port = 80 flags S keep state
pass out log quick on fxp1 from 1.2.3.1/32 to any
pass in quick on fxp1 proto icmp from any to any icmp-type 0
pass in quick on fxp1 proto icmp from any to any icmp-type 11
block in log quick on fxp1 proto icmp from any to any
block return-icmp(port-unr) in log quick on tun0 proto udp from any to 20.20.20.0/24 port = 111

quick означает, что если анализируемый пакет подпадает под данное правило, то дальнейший просмотр правил прекращается.
keep state означает, что так же будут разрешены все пакеты, которые пойдут по этому же соединению в том числе в обратную сторону.

Примеры редиректов в ipnat.rules:

map tun0 192.168.1.0/24 -> 20.20.20.1/32
map tun0 192.168.1.0/24 -> 0/32 portmap tcp/udp 20000:30000

Запускаем:

/etc/rc.d/ipfilter start
/etc/rc.d/ipnat start

Команды:

ipf -Fa -f /etc/ipf.rules # сбросить все правила и загрузить новые из файла                              
ipfstat -in # вывод правил для входящего трафика
ipfstat -on # вывод правил для исходящего трафика
ipfstat -t # просмотр текущей статистики в виде TOP-а
ipnat -l # смотрим текущие редиректы для ipnat
/etc/rc.d/ipnat reload #для перезагрузки правил ната

FreeBSD , ,

Создать диск в памяти (FreeBSD)

April 22nd, 2009

Иногда бывает необходимость создать виртуальный диск в памяти для размещения данных, к которым требуется быстрый доступ. Добрый человек подсказал готовый скрипт:

#!/bin/sh
DISKSIZE="256m"
case "$1" in
        start)
                /bin/echo -n "Starting memdisk "
                /sbin/mdconfig -a -t swap -s $DISKSIZE
                /bin/mkdir -p /mnt/md0
                /bin/chmod 777 /mnt/md0
                /sbin/newfs /dev/md0
                /sbin/mount /dev/md0 /mnt/md0
        ;;

        stop)
                /bin/echo -n "Shutting memdisk "
                /sbin/umount -f /mnt/md0
                /sbin/mdconfig -d -u md0
                /bin/rm -R /mnt/md0
        ;;

        restart)
                $0 stop
                $0 start
        ;;

        *)
                echo "Usage: $0 {start|stop}"
                exit 1
        ;;

esac

Естественно, надо убедиться, что диска md0 еще нет в системе.

FreeBSD ,

Простое включение dummynet

April 2nd, 2009
sysctl net.inet.ip.fw.one_pass=0
echo "net.inet.ip.fw.one_pass=0" >> /etc/sysctl.conf
kldload dummynet
kldstat
echo 'dummynet_enable="YES"' >> /etc/rc.conf
echo 'firewall_enable="YES"' >> /etc/rc.conf
echo 'firewall_script="/usr/local/etc/ipfw.rules"' >> /etc/rc.conf

Файл ipfw.rules:

#!/bin/sh

ipfw -q -f flush
cmd="ipfw -q add "

$cmd 100 pipe 1 ip from any to 192.168.0.0/24
ipfw pipe 1 config bw 1Mbit/s

# all traffic
$cmd 1000 allow ip from any to any

Ограничиваем для каждого ip из подсети 192.168.0.0/24 канал до 1 мегабита.

Запускаем:

/etc/rc.d/ipfw forcestart &

FreeBSD

Блокировка консоли в Linux/FreeBSD

March 24th, 2009

Для настройки автологоута в bash надо поместить в ~/.bash_profile (время в секундах):

export TMOUT=600

Для настройки автологоута в tcsh надо поместить в ~/.cshrc или в ~/.tcshrc

set autologout = (VAL1 VAL2)

Где,
VAL1 : Время неактивности в минутах после которого происходит автоматический логоут
VAL2 : Время неактивности в минутах после которого происходит автоматическая блокировка

Для ручной блокировки консоли в Linux ставим

yum install vlock

Для ручной блокировки консоли во FreeBSD используется

lock

FreeBSD, linux

Использование ipfw table

March 19th, 2009

Использование таблиц файрвола IPFW в некоторых случаях может быть очень удобным. Например, если нужно заблокировать много ip при dos-атаке. Суть в том, что все ip-адреса помещаются в таблицу и в правилах файрвола оперируем уже таблицей целиком.

ipfw table 3 add 10.10.11.1 #добавление в таблицу
ipfw table 3 add 10.11.11.2/24 #добавление в таблицу
ipfw table 3 list #посмотреть что в таблице
ipfw add deny ip from table\(3\) to me #пример исп-я. Слэши нужны!
ipfw table 3 delete 10.10.11.1 #удаляем
ipfw table 3 flush #чистим всю таблицу

Оперативно обновлять таблицу можно, к примеру, так:

#!/bin/sh
ipfw table 3 flush
cat /etc/ip.txt | while read ip; do
  ipfw table 3 add $ip
done

FreeBSD ,

Памятка по работе с портами FreeBSD

February 16th, 2009
portsnap fetch  #получить свежую базу портов
portsnap extract  #распаковать базу
portsnap update  #обновить локальную базу после получения и распаковки
make extract # извлечь исходники для сборки
make config  #указать праметры для сборки, они запомнятся для обновления порта
make showconfig #показать варианты конфигурирования
make rmconfig #удалить пользовательские настройки для сборки
make fetch-list #показать какие файлы будут загружены
make fetch-recursive-list #показать какие файлы будут загружены включая все зависимые
make  #собрать приложение
make install  #собрать и установить приложение
make deinstall  #удалить приложение
make reinstall  #переустановить приложение
make clean  #удалить рабочие файлы
pkg_delete mc  #удалить приложение
pkg_info  #Список установленных приложений
pkg_version -v  #Проверка на необходимость обновления
portupgrade mc  #Обновления какого-либо порта (требуется установка)
portaudit -Fda  #Проверка приложений на уязвимости (требуется установка)
portupgrade "php5-*" #Обновить все PHP5 пакеты
portmaster /usr/ports/misc/mc - установить mc с помощью Portmaster (тоже есть в портах)
portmaster expat-1.95.8 - обновляем expat
portmaster --clean-distfiles-all - удалить все старые скаченные дистрибутивы пакетов из distfiles

Дополнения и комментарии приветствуются!

FreeBSD , ,

Собрать программу со статически слинкованными библиотеками (FreeBSD)

February 5th, 2009

Данная манипуляция может понадобиться, например, если необходимо переносить и запускать программу на различных серверах, возможно не имеющих необходимых библиотек. Сделаем это на примере порта ncftp3:

cd /usr/ports/ftp/ncftp3
make configure
cd ./work/ncftp-3.2.2
./configure

Правим Makefile, дописываем в строчку CFLAGS= параметр “-static”.

cd ../..
make

Все. Из папки /usr/ports/ftp/ncftp3/work/ncftp-3.2.2/bin можно забирать готовые бинарники.

FreeBSD ,