вторник, 28 сентября 2010 г.

mysql sphinx install

download http://sphinxsearch.com/downloads.html



cp -R /root/builds/sphinx-0.9.7/mysqlse /root/builds/mysql-5.1.14/storage/sphinx
 
sh BUILD/autorun.sh
 
./configure --with-plugins=sphinx
 
make
make install

четверг, 19 августа 2010 г.

thunderbird tips

disable storing read messages  on the local disk

Edit->Account Settings->Synchronization  & Storage

turn off checkbox  "Keep messages for this account on this computer"

среда, 4 августа 2010 г.

pptp mpd5 config

part of pptp mpd5 config suitable for ipad vpn client working thru GSM providers

pptp:
    create bundle template B
    set iface enable proxy-arp
    set iface idle 1800
    set iface enable tcpmssfix
    set ipcp yes vjcomp

    set ippool add poolsat 192.168.0.2 192.168.0.100
    set ipcp ranges 192.168.0.1/32 ippool pool1
    set ipcp dns DNSIP_IFEXIST
    set bundle enable compression
    set ccp yes mppc
    set mppc yes e40
    set mppc yes e128
    set mppc yes stateless

    create link template L pptp
    set link action bundle B

    set link enable multilink
    set link yes acfcomp protocomp

    set link no pap chap
    set link enable chap
    set link enable chap-msv1
    set link enable chap-msv2

    set link keep-alive 10 60
    set link mtu 1460
    set pptp self REALVPN_IP
    set link enable incoming

четверг, 22 июля 2010 г.

pcre regex

Positive Integers --- ^\d+$
Negative Integers --- ^-\d+$
Integer --- ^-{0,1}\d+$
Positive Number --- ^\d*\.{0,1}\d+$
Negative Number --- ^-\d*\.{0,1}\d+$
Positive Number or Negative Number - ^-{0,1}\d*\.{0,1}\d+$
Phone number --- ^\+?[\d\s]{3,}$
Phone with code --- ^\+?[\d\s]+\(?[\d\s]{10,}$
Year 1900-2099 --- ^(19|20)[\d]{2,2}$
Date (dd mm yyyy, d/m/yyyy, etc.) --- ^([1-9]|0[1-9]|[12][0-9]|3[01])\D([1-9]|0[1-9]|1[012])\D(19[0-9][0-9]|20[0-9][0-9])$
IP v4 --- ^(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]){3}$

Personal Name --- ^[\w\.\']{2,}([\s][\w\.\']{2,})+$
Username --- ^[\w\d\_\.]{4,}$
Password at least 6 symbols --- ^.{6,}$
Password or empty input --- ^.{6,}$|^$
email --- ^[\_]*([a-z0-9]+(\.|\_*)?)+@([a-z][a-z0-9\-]+(\.|\-*\.))+[a-z]{2,6}$
domain --- ^([a-z][a-z0-9\-]+(\.|\-*\.))+[a-z]{2,6}$

Match no input --- ^$
Match blank input --- ^\s[\t]*$
Match New line --- [\r\n]|$

пятница, 2 июля 2010 г.

среда, 26 мая 2010 г.

openssl crypt and decrypt files

создать шифрованный tar архив
tar -czf - /dir | openssl enc des3  -salt -k KEY  > file.tar.gz.des3
расшифровать
cat file.tar.gz.des3 | openssl enc -des3  -d  -salt -k KEY  | tar -xvzf -

зашифровать полный dump mysql
mysqldump -A -pPASS |  gzip -c | openssl des3  -d  -salt -k KEY > file.sql.gz.des3
расшифровать

cat file.sql.gz.des3 | openssl des3  -d  -salt -k KEY  | gunzip  > file.sql

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

среда, 31 марта 2010 г.

postgres tips

создать пользователя
create user pguser with password 'password';

сменить пароль 
alter user pguser with password 'password';

удалить юзера
drop user pguser;

Grant Privileges
grant all privileges on database mydatabase to pguser;

Revoke
Privileges
revoke all  privileges on mydatabase from pguser;
 

Решение проблемы с вводом русских символов с psql

alias psql='rlwrap psql -n'


вторник, 16 февраля 2010 г.

sudo tips

chroot allow

>sudoers
user  ALL = NOPASSWD: /usr/sbin/chroot -u user  /workdirectory
>command
 sudo /usr/sbin/chroot -u user /workdirectory

allow only service restart and edit config
>sudoers
user ALL=NOPASSWD: /etc/init.d/lighttpd restart, /usr/bin/vim /etc/lighttpd/lighttpd.conf

четверг, 11 февраля 2010 г.

linux i/o monitoring

некоторый полезные команды  linux   для мониторинга различного in\out подсистем

vmstat  -  дисковая подситема  и swap ,очень похожа по поведению на iostat во FreeBSD
sar  -  информация о io событиях происходивших в системе


sysctl.conf
vm.swappiness - параметр определяющий приоритет хранение памяти в свап, 0..100, чем больше тем больше лезет в swap. изменить мгновенно можно командой  
 echo 50 > /proc/sys/vm/swappiness

пятница, 5 февраля 2010 г.

ipfw enable

в очередной раз наступив на свои любимые грабли.
как включить ipfw

firewall_logging="YES"
firewall_enable="YES"
firewall_quiet="YES"  #  если это не вписать то в случае если в /etc/ipfw.conf есть flush  будет запрос на рутовой консоли, и сервер не загрузится.
firewall_type="/etc/ipfw.conf"

четверг, 4 февраля 2010 г.

mason + lighttpd fastcgi

включаем mason в lighttpd

сначало готовим скрипт mason.cgi


#!/usr/bin/perl
use CGI::Fast;
use HTML::Mason::CGIHandler;
use URI;

{
package HTML::Mason::Commands;

## anything you want available to components
use Storable qw(freeze thaw);
use HTTP::BrowserDetect;

## An example of how to keep a $dbh persistent
##our $dbh = DBI->connect_cached(
## 'dbi:Pg:dbname=dbname'
## , 'username'
## , 'password'
## , {AutoCommit=>0, RaiseError=>1, PrintError=>1}
##) || die "Could not Connect to DB".$dbi::errstr ;

}

# lazily-instantiated variables
my $cgi;
my $h;

while ($cgi = new CGI::Fast())
{
## make sure it is alive! (if not it will reconnect)
## $HTML::Mason::Commands::dbh->ping;

my $uri = URI->new( $ENV{REQUEST_URI} );

## this is a hack, that emulates mod_perl behavior see notes at bottom
## You might not want this hack, and it might be worse than not having it
$uri->path( $uri->path . 'index.html' )
if $uri->path =~ /\/$/
;

$ENV{PATH_INFO} = $uri->path;
$ENV{QUERY_STRING} = $uri->query;
$ENV{REQUEST_URI} = "$uri";

# this is lazily instantiated because %ENV is not set at startup time
if (! $h) {
$h = HTML::Mason::CGIHandler->new(
comp_root => $ENV{MASON_COMP_ROOT}
, data_dir => $ENV{MASON_DATA_ROOT}
, error_mode => 'fatal'
, error_format => 'line'
## Three good globals dbh user and session
, allow_globals => [qw/$dbh $U $S/]
);
}

## hand off to mason
eval { $h->handle_cgi_object($cgi) };

## catch error
if ( my $raw_error = $@ ) {
warn $raw_error;
# print out a pretty system error page and log $raw_error
}
## things went well
else {
$HTML::Mason::Commands::dbh->commit;
}

}

exit 0;


добавляем в lighttpf.conf

fastcgi.map-extensions = ( ".css" => ".html", "/" => ".html" )
        index-file.names = ( "index.html" )
        url.access-deny = ( ".mhtml" ) ## add autohandler/dhandler if you'd like
        fastcgi.server = ( ".html" =>
        ((
                "socket" => "/tmp/fastcgi.socket",
                "bin-path" => "/etc/lighttpd/bin/mason.cgi",   # пусть до скрипта
                "check-local" => "disable",
                "bin-environment" => (
                "MASON_COMP_ROOT" => "/www/myproject",
                "MASON_DATA_ROOT" => "/www/myproject/data",
                ),
        ))
        )


index.html кладем в comp_root
простенький helloworld
<HTML>
   <HEAD>
   <TITLE> Hello <% $worldname %> world!!</TITLE>
   </HEAD>
   <BODY bgcolor="#FFFFFF">
   Hello World<BR>
   This is my <B><% $count %></B> Mason component.
   </BODY>
</HTML>
<%init>
   my $worldname = "Great";
   my $count = "first";
</%init>
<%args>
</%args>

freebsd kernel 6.x -> 7.2

в FREEBSD 7 поменялись опции ядра касательно IPSEC

эти опции отсутствуют

options     IPSEC_ESP       #IP security (crypto; define w/ IPSEC)
options     IPSEC_FILTERGIF # Enbale to filter IPSEC GIF packets


ipsec теперь требует device crypto



device crypto
device enc
options IPSEC
options IPSEC_FILTERTUNNEL
 
 
 
*some notes 
# Set IPSEC_FILTERTUNNEL to change the default of the sysctl to force packets
# coming through a tunnel to be processed by any configured packet filtering
# twice. The default is that packets coming out of a tunnel are _not_ processed;
# they are assumed trusted.

среда, 27 января 2010 г.

amazon vodoo

http://s3sync.net/ -набор скпритов для управления
в консоли
export AWS_ACCESS_KEY_ID=тут типа ключ который паблик (короткий)
export AWS_SECRET_ACCESS_KEY=тут секретный ключ (коротки)

./s3cmd.rb listbuckets - смотрим список контейнеров
./s3cmd.rb list container1 - просмотреть содержимое контейнера
./s3cmd.rb delete container1:file - удалить один файл
./s3cmd.rb deleteall container1:filemaks - удалить файлы по маске

четверг, 26 ноября 2009 г.

ntp tips

посмотреть состояние stratum в ntpd

ntpq затем в консоли lpeer


получим что то вроде

ntpq> lpeer
remote refid st t when poll reach delay offset jitter
===============================================

+ntp1.imvp.ru .IMVP. 1 u 898 1024 377 28.964 2.887 0.695
*ntp2.imvp.ru .IMVP. 1 u 42 1024 377 27.876 2.972 0.343
ns2.firmacem.ru .STEP. 16 u - 1024 0 0.000 0.000 0.000
CR1-F0-1-VLAN70 .STEP. 16 u - 1024 0 0.000 0.000 0.000
+ntp0.nl.uu.net .PPS. 1 u 894 1024 377 91.362 2.046 0.141

вторник, 17 ноября 2009 г.

freebsd port-mgmt tips

посмотреть список портов на обновление

portversion -vL=

посмотреть текущий список уязвимого софта.

portaudit -Fa

вторник, 27 октября 2009 г.

fetch ports via proxy

прокси для make-fetch

в make.conf
FETCH_ENV=http_proxy=http://user:pass@192.168.0.1:3128

что бы кто не попадя несмотрел
chmod 600 /etc/make.conf

вторник, 29 сентября 2009 г.

lighttpd reverse proxy

только для lighttpd >1.5


proxy-core.protocol = "http"
#proxy-core.balancer = "carp"
proxy-core.balancer = "round-robin"

proxy-core.rewrite-response = ("Location" => ( "^http://my.example.com/(.*)" => "http://remote.site.com/" ) )
proxy-core.rewrite-request = ( ("^/(.*)$" => "http://my.example.com") )
proxy-core.backends = ( "remote.site.com" ) # вот тут нельзя писать протокол, а то будет ошибка.

четверг, 24 сентября 2009 г.

четверг, 3 сентября 2009 г.

antiddos: varnish+lighttpd

Сперто с http://habrahabr.ru

Простой способ защиты от HTTP DDoS — включить syn-cookies и заблокировать подонков. Но что делать если атакует 5к-10к хостов да еще и с динамическими IP? Тут нам на помощь придет frontend-backend архитектура c промежуточным кэшированием! Почему с промежуточным кэшированием? А потому что в моем случае от шквала запросов от frontend'а backend умирал унося за собой систему.

Итак алгоритм действий:

* Меняем порт нашего backend сервера на любой отличный от 80 (пусть будет 2080)
* Устанавливаем Varnish
* Устанавливаем и настраиваем lighttpd
* Ограничиваем кол-во соединений с одного хоста средствами iptables


Так, как, у меня в наличии было несколько серверов, то будет рассмотрена версия конфигурации именно с несколькими серверами, но никто не мешает вам все это запихнуть на один сервер =)

Как менять порт вашего любимого веб-сервера я думаю рассказывать не нужно, предлагаю перейти сразу к настройке Varnish.

Собственно устанавливаем сам пакет:
apt-get update && apt-get install varnish

Далее приводим C-подобный файл конфигурации (в Ubuntu это /etc/varnish/default.vcl) приблизительно к такому виду:
backend default {
.host = "1.1.1.1"; #IP нашего backend'а
.port = "2080"; #порт
.first_byte_timeout = 300s; #без этого таймаута varnish не хотел забирать контент с backend'а
}

acl purge {
"localhost"; #разрешаем очистку кэша только с локалхоста
}

sub vcl_recv {
if (req.request == "GET" && req.url ~ "\.(jpg|jpeg|gif|ico)$") {
lookup;
}

if (req.request == "GET" && req.url ~ "\.(css|js)$") {
lookup;
}

if (req.request == "GET" && req.url ~ "\.(pdf|xls|vsd|doc|ppt|iso)$") {
lookup;
}

if (req.request == "POST") {
pipe;
}

if (req.request != "GET" && req.request != "HEAD") {

if (req.request == "PURGE") {
if (!client.ip ~ purge) {
error 405 "Not allowed.";
}
lookup;
}

pipe;
}

if (req.http.Expect) {
pipe;
}

if (req.http.If-None-Match) {
pass;
}

if (req.http.Authenticate || req.http.Authorization) {
pass;
}
lookup;

}

sub vcl_hit {
if (req.request == "PURGE") {
set obj.ttl = 0s;
error 200 "Purged.";
}
}

sub vcl_miss {
if (req.http.If-Modified-Since) {
pass;
}

if (req.request == "PURGE") {
error 404 "Not in cache.";
}
}

sub vcl_fetch {
if ( obj.http.x-accel-redirect ~ ".*" ) {
set req.url = obj.http.x-accel-redirect;
restart;
}
}


Перезапускаем varnish: service varnish restart

Теперь можно приступить к установке и настройке нашего frontend'а — lighttpd.
Я предпочитаю брать lighttpd отсюда, но вам никто не мешает скачать его из репозиториев дистрибутива (apt-get install lighttpd).
И правим конфиг до тех пор, пока он не примет следующий вид:
server.modules = (
"mod_cache",
"mod_proxy",
"mod_access",
"mod_evasive"
)

server.network-backend = "writev"
server.max-keep-alive-requests = 4
server.max-keep-alive-idle = 4
server.max-read-idle = 10
server.max-write-idle = 30
server.event-handler = "linux-sysepoll"
server.stat-cache-engine = "disable"
server.protocol-http11 = "enable"
server.max-worker = 2 #Если у вас один процессор или вы все запускаете на одном сервере то стоит поставить 1
server.max-fds = 10000
server.max-connections = 5000
server.port = 80
server.document-root = "/var/www"
server.errorlog = "/var/log/lighttpd/error.log"
server.pid-file = "/var/run/lighttpd.pid"
server.username = "www-data"
server.groupname = "www-data"
etag.use-inode = "enable"
etag.use-mtime = "enable"
etag.use-size = "enable"
server.dir-listing = "disable"
evasive.max-conns-per-ip = 3 #Разрешаем только три одновременных подключения

cache.enable = "enable" #Включаем кэширование на стороне лайти
cache.bases = ("/var/spool/cache") #Здесь мы будим хранить кэш
cache.max-memory-size = 40960 #40Gb
cache.lru-remove-count = 512
cache.support-queries = "enable"
cache.dynamic-mode = "enable"
cache.refresh-pattern = (
"\.(?i)(js|css|xml|po)$" => "240", # update js/css/xml every 4 hours and on refresh requests
"\.(?i)(htm|html|shtml)$" => "30 use-memory", # update html/htm/shtml every 30 minutes and on refresh requests
"\.(?i)(jpg|bmp|jpeg|gif|png)$" => "2880", # update graphics files every 2 days
"\.(?i)(rar|zip|wmv|iso|avi|mp3|ape|rm|mpeg|mpg|wma|asf|rmvb|flv|mkv|ogg|ogm|swf|flac)$" => "0 fetchall-for-range-request", # cache media file forever
".(?i)php$" => "5", # update php request every 5 minutes
"." => "30 use-memory" #
)

mimetype.use-xattr = "enable"
include_shell "/usr/share/lighttpd/create-mime.assign.pl"

#Bad users go to hell
$HTTP["useragent"] == "" {
url.access-deny = ( "" )
}

$HTTP["host"] =~ "(^|\.)habrahabr\.ru$" {
proxy.balance = "round-robin"
proxy.server = ( "/" =>
(
( "host" => "1.2.1.1", "port" => 6081 ), #Отправляем запросы
( "host" => "1.2.1.2", "port" => 6081 ), #серверам varnish
( "host" => "1.2.1.3", "port" => 6081 ),
( "host" => "1.2.1.4", "port" => 6081 )
)
)
}
proxy.worked-with-mod-cache = "enable"


И напоследок iptables и небольшой тюнинг системы:

Разрешаем 10 подключений в секунду с одного IP:
iptables -I INPUT 1 -p tcp -m hashlimit --hashlimit-upto 10/sec --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-name HTTPD_DOS -m tcp --dport 80 -m state --state NEW -j ACCEPT
Увеличиваем количество открытых файлов:
ulimit -n 5000
Плюшки для sysctl.conf:
vm.swappiness=10
vm.vfs_cache_pressure=10000
vm.dirty_ratio = 1
vm.dirty_background_ratio = 1
vm.dirty_writeback_centisecs = 250
vm.dirty_expire_centisecs = 3000
kernel.panic = 10
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_sack = 1
net.core.rmem_max = 16777216
net.core.rmem_default = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.netfilter.ip_conntrack_max = 1048576
net.nf_conntrack_max = 1048576
net.ipv4.icmp_echo_ignore_all = 1
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 15
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 15
net.ipv4.ip_local_port_range= 10000 65000

Как все это работает? lighttpd получает запрос от клиента и если он удовлетворяет определенным критериям (в нашем случае это не пустой User-agent, клиент запрашивает домен habrahabr.ru и это не 4ый одновременный запрос) отправляет запрос одному из серверов varnish. Varnish проверяет свой кэш на наличие нужного пользователю контента отдает его либо из кэша либо отправляет запрос на backend, если в кэше данного контента нет или он устарел.

среда, 2 сентября 2009 г.

Failed to modify UNIX password: Insufficient access

при очередном обновлении всей системы выползла ошибка в smbldap-tools

Failed to modify UNIX password: Insufficient access ... во время смены пароля.

Проблема в том что ldap стал слать нахер если к нему лезут с неизвестным полем.
в моем случае это shadowLastChange. Решение тривиально, закоментарить в скрипте smbldap-passwd

три строки
# replace => [userPassword => "$hash_password"],

и ещё раз чуть ниже

# replace => [shadowLastChange => "$shadowLastChange"]
# replace => [shadowLastChange => "$shadowLastChange"]


По умному надо схемы править, но пока быстрое решение.