посмотреть состояние 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
четверг, 26 ноября 2009 г.
вторник, 17 ноября 2009 г.
freebsd port-mgmt tips
посмотреть список портов на обновление
portversion -vL=
посмотреть текущий список уязвимого софта.
portaudit -Fa
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
в 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" ) # вот тут нельзя писать протокол, а то будет ошибка.
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, если в кэше данного контента нет или он устарел.
Простой способ защиты от 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"]
По умному надо схемы править, но пока быстрое решение.
Failed to modify UNIX password: Insufficient access ... во время смены пароля.
Проблема в том что ldap стал слать нахер если к нему лезут с неизвестным полем.
в моем случае это shadowLastChange. Решение тривиально, закоментарить в скрипте smbldap-passwd
три строки
# replace => [userPassword => "$hash_password"],
и ещё раз чуть ниже
# replace => [shadowLastChange => "$shadowLastChange"]
# replace => [shadowLastChange => "$shadowLastChange"]
По умному надо схемы править, но пока быстрое решение.
суббота, 1 августа 2009 г.
xfce touchpad archlinux
для запуска touchpad ноутбуке в Archlinux
поставить модуль xf86-input-synaptics
добавить в xorg.conf
Section "Module"
load "synaptics"
EndSection
поставить модуль xf86-input-synaptics
добавить в xorg.conf
Section "Module"
load "synaptics"
EndSection
четверг, 30 июля 2009 г.
trac + subversion + apache22
заводим связку svn + trac + apache22 на FreeBSD
Весь софт ставится из портов.
ставим apache22 не забываем включить поддержку DBD
trac будет жить в папке www, а его базы в /var/trac
настраиваем apache
NameVirtualHost xx.xx.xx.xx:80
<VirtualHost projects.example.com:80>
DocumentRoot "/www/trac"
ServerName projects.example.com
ServerAlias projects
Options Indexes FollowSymlinks MultiViews
ErrorLog "/var/log/projects.example.com-error.log"
CustomLog "/var/log/projects.example.com-access.log" common
# Секция в которой мы говорим что все что /www/trac будет обрабатывать mod_python
<Location />
SetHandler mod_python
PythonInterpreter main_interpreter
PythonHandler trac.web.modpython_frontend
PythonOption TracEnvParentDir /var/trac
PythonOption TracUriRoot /
</Location>
# У меня несколько проектов и занимаются или разные люди которые не должны иметь доступ к данным друг другу. Это простой способ разграничить доступ. Сам путь соответствует пути /var/trac/project1
<Location /project1 >
AuthType Basic
AuthName "Project1 svn AREA"
AuthUserFile /www/trac/access/.htpasswd_project1
Require valid-user
</Location>
#полезная информация.
<Location /mpinfo>
SetHandler mod_python
PythonInterpreter main_interpreter
PythonHandler mod_python.testhandler
</Location>
</VirtualHost>
Поскольку я обычно ставлю такие вещи отдельно в jail, web сервер кроме обслуживания trac больше ничем не занимается. Отсюда с точки зрения безопасности и просто удобства user и group указаны svn.
добавляем в /etc/rc.conf
apache22_enable="YES"
все на этом закончена настройка apache, запускать его не надо, тем более он все равно не запустить поскольку пользователь и группа svn, отсутствуют в системе.
--
Установка subversion
Все также ставится из портов
При установке обязательно посмотреть с какими параметрами будет устанавливаться svn
Обязательно поддержка DBD, APACHE2_APR, MOD_DAV_SVN если оный не был указан при установке apache)
после установки надо убедиться что пользователь и группа SVN присутствуют в системе
mkdir /svn
# создаем репозитарий проекта
svnadmin create /svn/project1
cd /svn/project/conf
# разбиваем на группы.
файл authz
[groups]
project1_users = user1,user2,user3
[project1:/]
@project1_users = rw
* =
# добавляем пароли
файл passwd
[users]
user1 = password1
user2 = password2
все, теперь chown -R svn:svn /svn; chmod 700 /svn
--
Ставим Trac, тоже из портов. Ставится он в /usr/local/lib/python2.6/site-packages/Trac-0.11.4-py2.6.egg/trac что для нас не очень удобно поэтому делаем symlink
ln -s /usr/local/lib/python2.6/site-packages/Trac-0.11.4-py2.6.egg/trac /www/trac
создаем htaccess /www/trac/access/.htpasswd_project1
инициализируем хранилище trac для проекта
trac-admin /var/trac/project1 initenv
отвечаем на заданные вопросы
наделяем правами админа пользователя user1
trac-admin /var/trac/project1 permission add user1 TRAC_ADMIN
выставляем права.
chown -R svn:svn /var/trac ; chmod 700 /var/trac
меняем лого
в файле /var/trac/project1/conf/trac.ini
находим секцию [header_logo]
src = /project1/chrome/common/my_logo.gif
сам файл с логотипом необходимо положить в /www/trac/htdocs/
типа все.
Весь софт ставится из портов.
ставим apache22 не забываем включить поддержку DBD
trac будет жить в папке www, а его базы в /var/trac
настраиваем apache
NameVirtualHost xx.xx.xx.xx:80
<VirtualHost projects.example.com:80>
DocumentRoot "/www/trac"
ServerName projects.example.com
ServerAlias projects
Options Indexes FollowSymlinks MultiViews
ErrorLog "/var/log/projects.example.com-error.log"
CustomLog "/var/log/projects.example.com-access.log" common
# Секция в которой мы говорим что все что /www/trac будет обрабатывать mod_python
<Location />
SetHandler mod_python
PythonInterpreter main_interpreter
PythonHandler trac.web.modpython_frontend
PythonOption TracEnvParentDir /var/trac
PythonOption TracUriRoot /
</Location>
# У меня несколько проектов и занимаются или разные люди которые не должны иметь доступ к данным друг другу. Это простой способ разграничить доступ. Сам путь соответствует пути /var/trac/project1
<Location /project1 >
AuthType Basic
AuthName "Project1 svn AREA"
AuthUserFile /www/trac/access/.htpasswd_project1
Require valid-user
</Location>
#полезная информация.
<Location /mpinfo>
SetHandler mod_python
PythonInterpreter main_interpreter
PythonHandler mod_python.testhandler
</Location>
</VirtualHost>
Поскольку я обычно ставлю такие вещи отдельно в jail, web сервер кроме обслуживания trac больше ничем не занимается. Отсюда с точки зрения безопасности и просто удобства user и group указаны svn.
добавляем в /etc/rc.conf
apache22_enable="YES"
все на этом закончена настройка apache, запускать его не надо, тем более он все равно не запустить поскольку пользователь и группа svn, отсутствуют в системе.
--
Установка subversion
Все также ставится из портов
При установке обязательно посмотреть с какими параметрами будет устанавливаться svn
Обязательно поддержка DBD, APACHE2_APR, MOD_DAV_SVN если оный не был указан при установке apache)
после установки надо убедиться что пользователь и группа SVN присутствуют в системе
mkdir /svn
# создаем репозитарий проекта
svnadmin create /svn/project1
cd /svn/project/conf
# разбиваем на группы.
файл authz
[groups]
project1_users = user1,user2,user3
[project1:/]
@project1_users = rw
* =
# добавляем пароли
файл passwd
[users]
user1 = password1
user2 = password2
все, теперь chown -R svn:svn /svn; chmod 700 /svn
--
Ставим Trac, тоже из портов. Ставится он в /usr/local/lib/python2.6/site-packages/Trac-0.11.4-py2.6.egg/trac что для нас не очень удобно поэтому делаем symlink
ln -s /usr/local/lib/python2.6/site-packages/Trac-0.11.4-py2.6.egg/trac /www/trac
создаем htaccess /www/trac/access/.htpasswd_project1
инициализируем хранилище trac для проекта
trac-admin /var/trac/project1 initenv
отвечаем на заданные вопросы
наделяем правами админа пользователя user1
trac-admin /var/trac/project1 permission add user1 TRAC_ADMIN
выставляем права.
chown -R svn:svn /var/trac ; chmod 700 /var/trac
меняем лого
в файле /var/trac/project1/conf/trac.ini
находим секцию [header_logo]
src = /project1/chrome/common/my_logo.gif
сам файл с логотипом необходимо положить в /www/trac/htdocs/
типа все.
воскресенье, 26 июля 2009 г.
ssh remote fetch file
стащить и заархивировать файл на удаленном сервере.
ssh -l user remoteserver.local "tar -cjf - /tmp/file.xml" | cat - > file.xml.tar.bz2
ssh -l user remoteserver.local "tar -cjf - /tmp/file.xml" | cat - > file.xml.tar.bz2
пятница, 24 июля 2009 г.
lighttpd fastcgi catalyst
fastcgi.server = (
"" => (
"germion" => (
"socket" => "/tmp/germion.socket",
"check-local" => "disable",
"bin-path" => "/germion/script/germion_fastcgi.pl",
"min-procs" => 2,
"max-procs" => 5,
"idle-timeout" => 20,
)
)
)
"" => (
"germion" => (
"socket" => "/tmp/germion.socket",
"check-local" => "disable",
"bin-path" => "/germion/script/germion_fastcgi.pl",
"min-procs" => 2,
"max-procs" => 5,
"idle-timeout" => 20,
)
)
)
среда, 15 июля 2009 г.
запуск zabbix_server в jail
в логе шла активная ругать
zabbix_server [1424]: Can not create Semaphore [Function not implemented]
zabbix_server [1424]: Unable to create mutex for log file
решение на хост системе поправить sysctl
sysctl -w security.jail.sysvipc_allowed=1
возможно ещё необходимо
sysctl -w security.jail.allow_raw_sockets=1
но оно у меня по другим причинам включено
zabbix_server [1424]: Can not create Semaphore [Function not implemented]
zabbix_server [1424]: Unable to create mutex for log file
решение на хост системе поправить sysctl
sysctl -w security.jail.sysvipc_allowed=1
возможно ещё необходимо
sysctl -w security.jail.allow_raw_sockets=1
но оно у меня по другим причинам включено
xen grub setup
запись для xen3 в /boot/grub/menu.lst
title Xen [/boot/xen.gz]
root (hd0,2)
kernel /boot/xen-3.4.0.gz dom0_mem=524288
module /boot/vmlinuz-2.6.18.8-xen0 root=/dev/disk/by-uuid/239bf825-2e32-4c63-8029-564c74d146ec ro
module /boot/xen0.img
title Xen [/boot/xen.gz]
root (hd0,2)
kernel /boot/xen-3.4.0.gz dom0_mem=524288
module /boot/vmlinuz-2.6.18.8-xen0 root=/dev/disk/by-uuid/239bf825-2e32-4c63-8029-564c74d146ec ro
module /boot/xen0.img
пятница, 10 июля 2009 г.
php следите за параметрами
поимел геморой с неработающими post запросами.
а php.ini добрый человек прописал
post_max_size = 11Mb
казалось бы в чем ошибка. Добрый php молча обнулит такую запись, но вам об этом не скажт просто у вас не будет post запросов, потому что мегабайты обозначают как 11M, одним символом.
а php.ini добрый человек прописал
post_max_size = 11Mb
казалось бы в чем ошибка. Добрый php молча обнулит такую запись, но вам об этом не скажт просто у вас не будет post запросов, потому что мегабайты обозначают как 11M, одним символом.
понедельник, 22 июня 2009 г.
perl -X функции
if (-e $filename) { print "Файл существует.\n"; }
if (-z $filename) { print "Файл существует и он пустой.\n"; }
if (-r $filename) { print "У меня есть право на чтение файла.\n"; }
if (-w $filename) { print "У меня есть право на изменение файла.\n"; }
if (-x $filename) { print "У меня есть право на выполнение файла.\n"; }
if (-o $filename) { print "Я владелец файла.\n"; }
if (-f $filename) { print "$filename - это обычный файл.\n"; }
if (-d $filename) { print "$filename - это каталог.\n"; }
if (-l $filename) { print "$filename - это символическая ссылка.\n"; }
if (-p $filename) { print "$filename - это FIFO.\n"; }
if (-S $filename) { print "$filename - это сокет.\n"; }
if (-b $filename) { print "$filename - это блок-ориентированное спец. устройство.\n"; }
if (-c $filename) { print "$filename - это символьное спец. устройство.\n"; }
if (-t $filename) { print "Файловый манипулятор открыт для терминала.\n"; }
if (-u $filename) { print "У файла установлен бит setuid\n"; }
if (-g $filename) { print "У файла установлен бит setgid\n"; }
if (-k $filename) { print "У файла установлен бит запрета (бит-липучка)\n"; }
if (-T $filename) { print "Это текстовый файл.\n"; }
if (-B $filename) { print "Это двоичный файл.\n"; }
$size = -s $filename;
print "Размер файла: $size.\n"; }
$modification_time = int(-M $filename);
print "Со времени последнего изменения файла прошло $modification_time дней.\n";
$access_time = int(-A $filename);
print "Со времени последнего чтения файла прошло $access_time дней.\n";
$ctime = int(-C $filename);
print "Со времени последнего изменения файлового дескриптора прошло $ctime дней";
if (-z $filename) { print "Файл существует и он пустой.\n"; }
if (-r $filename) { print "У меня есть право на чтение файла.\n"; }
if (-w $filename) { print "У меня есть право на изменение файла.\n"; }
if (-x $filename) { print "У меня есть право на выполнение файла.\n"; }
if (-o $filename) { print "Я владелец файла.\n"; }
if (-f $filename) { print "$filename - это обычный файл.\n"; }
if (-d $filename) { print "$filename - это каталог.\n"; }
if (-l $filename) { print "$filename - это символическая ссылка.\n"; }
if (-p $filename) { print "$filename - это FIFO.\n"; }
if (-S $filename) { print "$filename - это сокет.\n"; }
if (-b $filename) { print "$filename - это блок-ориентированное спец. устройство.\n"; }
if (-c $filename) { print "$filename - это символьное спец. устройство.\n"; }
if (-t $filename) { print "Файловый манипулятор открыт для терминала.\n"; }
if (-u $filename) { print "У файла установлен бит setuid\n"; }
if (-g $filename) { print "У файла установлен бит setgid\n"; }
if (-k $filename) { print "У файла установлен бит запрета (бит-липучка)\n"; }
if (-T $filename) { print "Это текстовый файл.\n"; }
if (-B $filename) { print "Это двоичный файл.\n"; }
$size = -s $filename;
print "Размер файла: $size.\n"; }
$modification_time = int(-M $filename);
print "Со времени последнего изменения файла прошло $modification_time дней.\n";
$access_time = int(-A $filename);
print "Со времени последнего чтения файла прошло $access_time дней.\n";
$ctime = int(-C $filename);
print "Со времени последнего изменения файлового дескриптора прошло $ctime дней";
пятница, 5 июня 2009 г.
geli remove boot promt
geli инициируют раздели по умолчанию при загрузке, для remote server подобное поведение не допустимо
решение
geli configure -B /dev/da0s1d.eli
решение
geli configure -B /dev/da0s1d.eli
вторник, 2 июня 2009 г.
mysql 5.4-6.0 compile error
при сборке mysql версий 5.4 и 6.0 на freebsd 6.4 вылетала ошибка компилятора
/var/tmp//ccdN1bO7.s: Assembler messages:
/var/tmp//ccdN1bO7.s:1571: Error: bad register name `%sil'
/var/tmp//ccdN1bO7.s:1697: Error: bad register name `%dil'
/var/tmp//ccdN1bO7.s:1915: Error: bad register name `%dil'
/var/tmp//ccdN1bO7.s:2804: Error: bad register name `%dil'
/var/tmp//ccdN1bO7.s:3647: Error: bad register name `%sil'
решение.
1. ставим из портов gcc42, появятся бинарники gcc42 и g++42
2. ./configure CC=gcc42 CXX=g++42
3. make ; make install
4. profit!
/var/tmp//ccdN1bO7.s: Assembler messages:
/var/tmp//ccdN1bO7.s:1571: Error: bad register name `%sil'
/var/tmp//ccdN1bO7.s:1697: Error: bad register name `%dil'
/var/tmp//ccdN1bO7.s:1915: Error: bad register name `%dil'
/var/tmp//ccdN1bO7.s:2804: Error: bad register name `%dil'
/var/tmp//ccdN1bO7.s:3647: Error: bad register name `%sil'
решение.
1. ставим из портов gcc42, появятся бинарники gcc42 и g++42
2. ./configure CC=gcc42 CXX=g++42
3. make ; make install
4. profit!
понедельник, 1 июня 2009 г.
lighttpd digest auth
lighttpd.conf
раскомментарить mod_auth
добавить в секцию host или URL
auth.backend = "htdigest"
auth.backend.htdigest.userfile = "/etc/lighttpd/.passwd"
auth.debug = 2
auth.require = ( "/" =>
(
"method" => "digest",
"realm" => "Restricted Area",
"require" => "valid-user"
))
затем в консоли
htdigest -c /etc/lighttpd/.passwd "Restricted Area" login
chown www:www /etc/lighttpd/.passwd
chmod 400 /etc/lighttpd/.passwd
раскомментарить mod_auth
добавить в секцию host или URL
auth.backend = "htdigest"
auth.backend.htdigest.userfile = "/etc/lighttpd/.passwd"
auth.debug = 2
auth.require = ( "/" =>
(
"method" => "digest",
"realm" => "Restricted Area",
"require" => "valid-user"
))
затем в консоли
htdigest -c /etc/lighttpd/.passwd "Restricted Area" login
chown www:www /etc/lighttpd/.passwd
chmod 400 /etc/lighttpd/.passwd
пятница, 29 мая 2009 г.
custom сборка eaccelerator
1. /usr/local/php-525/bin/phpize
2. ./configure --prefix=/usr/local/eaccelerator --with-eaccelerator-shared-memory --enable-eaccelerator=shared --with-eaccelerator-sessions --with-eaccelerator-content-caching --with-eaccelerator-userid=80 --with-php-config=/usr/local/php-525/bin/php-config
не работает в если php собрано с cgi SAPI
2. ./configure --prefix=/usr/local/eaccelerator --with-eaccelerator-shared-memory --enable-eaccelerator=shared --with-eaccelerator-sessions --with-eaccelerator-content-caching --with-eaccelerator-userid=80 --with-php-config=/usr/local/php-525/bin/php-config
не работает в если php собрано с cgi SAPI
вторник, 12 мая 2009 г.
вторник, 5 мая 2009 г.
wget stalled
при скачке с yandex репозитариев почему то wget постоянно впадает в stalled
решение просто
wget -c -t 100 -T 3
-t 100 из-за того что для больших файлов переконнект происходит так часто что стандартных 20 попыток не хватает.
решение просто
wget -c -t 100 -T 3
-t 100 из-за того что для больших файлов переконнект происходит так часто что стандартных 20 попыток не хватает.
cpan install
инсталяция модулей из CPAN
запустить шел
perl -MCPAN -e shell
поиск модуля
i /строка/
установка
install Имя_Модуля
запустить шел
perl -MCPAN -e shell
поиск модуля
i /строка/
установка
install Имя_Модуля
среда, 15 апреля 2009 г.
freebsd статистика
top -mio - показать I/O по процессам
top -S - показать ситемные процессы в топе (по дефолту они не показываются)
gstat - нагрузка на диски
systat -io start 1
diskinfo -t da0 - тест на дисковую производительность
tunefs -p /var/ - информация о настройках файловой системы
vmstat -z чего не хватает
vmstat -i прерывания по устройствам
netstat -i ошибки на интерфейсах
systat -ifstat - интенсивность передачи трафика
netstat -inb - передано через интерфейс в байтах
netstat -w1 - количество пакетов/ошибок/байт на интерфейсе
стибрил тут
top -S - показать ситемные процессы в топе (по дефолту они не показываются)
gstat - нагрузка на диски
systat -io start 1
diskinfo -t da0 - тест на дисковую производительность
tunefs -p /var/ - информация о настройках файловой системы
vmstat -z чего не хватает
vmstat -i прерывания по устройствам
netstat -i ошибки на интерфейсах
systat -ifstat - интенсивность передачи трафика
netstat -inb - передано через интерфейс в байтах
netstat -w1 - количество пакетов/ошибок/байт на интерфейсе
стибрил тут
dns loss check
Оценить количество потерянных dns запросов можно, например, по счетчику "dropped due to full socket buffers" в netstat -s -p udp
среда, 1 апреля 2009 г.
find tips
найти суммарный размер файлов к которым обращались за последние три дня
find . -type f -atime -3 -exec ls -lad {} \;|awk ' BEGIN {s=0}; {s += $5;} END {print s;}'
найти количество строк в файлах определенного типа
find . -type f \( -name "*.php" -o -name "*.tpl" -o -name "*.js" -o -name "*.xml" -o -name "*.css" -o -name "*.html" \) -exec cat {} \; |wc -l
find . -type f -atime -3 -exec ls -lad {} \;|awk ' BEGIN {s=0}; {s += $5;} END {print s;}'
найти количество строк в файлах определенного типа
find . -type f \( -name "*.php" -o -name "*.tpl" -o -name "*.js" -o -name "*.xml" -o -name "*.css" -o -name "*.html" \) -exec cat {} \; |wc -l
четверг, 19 февраля 2009 г.
freebsd acl operate
setfacl -m u:username:rwx - установить ACL
getfacl dir/file - посмотреть текущие
setfacl -d -m u::rwx,g::---,o::rwx dir/file -выставить дефолтные ACL
так как ACL нет возможно выставить рекурсивно во FreeBSD, пользуем find
find . -type d -exec setfacl -m u:username:rwx {} \;
getfacl dir/file - посмотреть текущие
setfacl -d -m u::rwx,g::---,o::rwx dir/file -выставить дефолтные ACL
так как ACL нет возможно выставить рекурсивно во FreeBSD, пользуем find
find . -type d -exec setfacl -m u:username:rwx {} \;
среда, 11 февраля 2009 г.
vim tips
.vimrc
set cindent shiftwidth=4 - Включает отступы в стиле C , но жутко бесит когда надо вставлять куски кода с отступами, вызывает смещение каждой вствляемой строки, что в свою очередь лечится
set paste в консоли vim
сохраниение по Ctrl+s
map <C-S> :wa<CR>
imap <C-S> <Esc>:wa<CR><Ins><Right>
set cindent shiftwidth=4 - Включает отступы в стиле C , но жутко бесит когда надо вставлять куски кода с отступами, вызывает смещение каждой вствляемой строки, что в свою очередь лечится
set paste в консоли vim
сохраниение по Ctrl+s
map <C-S> :wa<CR>
imap <C-S> <Esc>:wa<CR><Ins><Right>
понедельник, 9 февраля 2009 г.
transport.db issue
Или о вреде апдейтов, жил был postfix суко долго жил, пока до него не добрались мои шаловливые ручки, а точнее меня как обычно ввела диссонанс его устаревшая версия. Собственно обновился, потом ещё и ещё, и хрен с ним, спустя какое то время потребовалось изменить transport, меняем конфиг делаем postmap transport, затем postfix reload и... почта перестает ходить o_O. возвращаю назад сохраненный бинарник transport.db все работает. До конца так и не удалось выяснить в какой конкретно версии произошли изменения, да и экспериментировать на продакшн сервере, крайне опасно для зарплаты, но ларчик открывался просто
было
transport_maps = btree:$config_directory/transport
стало
transport_maps = hash:$config_directory/transport
postmap по умолчанию генерит Berkley DB методом хранения hash, а никак не btree.
было
transport_maps = btree:$config_directory/transport
стало
transport_maps = hash:$config_directory/transport
postmap по умолчанию генерит Berkley DB методом хранения hash, а никак не btree.
понедельник, 2 февраля 2009 г.
freebsd acl
Enable ACL
Команда tunefs может быть применена на отмонтированной либо доступной только для чтения файловой системе. Это означает, что, обычно, Вы должны загрузиться в однопользовательском режиме перед запуском команды
/sbin/tunefs -a enable /fs ,
где /fs обозначает точку монтирования файловой системы (/, /usr, и так далее). Если Вы не имеете доступа к терминалу машины (например, в случае машины, находящейся на colocation), Вы можете добавить вызов команды tunefs в начало файла /etc/rc для включения ACL при последующей загрузке.
Если Вы используете файловую систему UFS2, включение ACL закончено. Для включения ACL необходима только строчка opions UFS_ACL, встроенная по умолчанию в GENERIC-конфигурацию ядра.
спер тут
Команда tunefs может быть применена на отмонтированной либо доступной только для чтения файловой системе. Это означает, что, обычно, Вы должны загрузиться в однопользовательском режиме перед запуском команды
/sbin/tunefs -a enable /fs ,
где /fs обозначает точку монтирования файловой системы (/, /usr, и так далее). Если Вы не имеете доступа к терминалу машины (например, в случае машины, находящейся на colocation), Вы можете добавить вызов команды tunefs в начало файла /etc/rc для включения ACL при последующей загрузке.
Если Вы используете файловую систему UFS2, включение ACL закончено. Для включения ACL необходима только строчка opions UFS_ACL, встроенная по умолчанию в GENERIC-конфигурацию ядра.
спер тут
четверг, 22 января 2009 г.
понедельник, 19 января 2009 г.
firefox image issue
на некоторых виодекартах возникает проблема с отображение изображений в firefox3 (поехавшая прозрачность, черная картинка при изменения размера)
лекарство:
в xorg.conf секцию device добавить
Option "XAANoOffscreenPixmaps" "on"
лекарство:
в xorg.conf секцию device добавить
Option "XAANoOffscreenPixmaps" "on"
Подписаться на:
Сообщения (Atom)