Отмена перехода на зимнее время FreeBsd

cd /usr/ports/misc/zoneinfo
make install clean
rehash
zic -l /usr/share/zoneinfo/Europe/Moscow

Далее перезапускаем сервисы
service mysql-server restart
service cron restart
4 ноября 2014, 07:12

Отмена перехода на зимнее время Debian

Как вы знаете, правительство РФ отменило переход на зимнее время, поэтому чтобы временные зоны работали
правильно нам нужно обновить пакет tzdata
wget http://ftp.us.debian.org/debian/pool/main/t/tzdata/tzdata_2011k-0squeeze1_all.deb
dpkg -i tzdata_2011k-0squeeze1_all.deb
date
4 ноября 2014, 07:12

Установка gitosis на FreeBsd

Для начала нужно установить сам git
cd /usr/ports/devel/git
make install clean

Теперь устанавливаем непосредственно gitosis
cd /usr/ports/devel/py-gitosis
make install clean


Установим sudo
cd /usr/ports/security/sudo
make install clean distclean
rehash


Нужно создать юзера, например git
adduser git

Далее следуем вопросам, оставляем все по умолчанию, только на вопрос об авторизации по паролю надо ответить нет
Use password-based authentication? [yes]: no
Вот такой юзер должен получиться
sername   : git
Password   : <disabled>
Full Name  :
Uid        : 1008
Class      :
Groups     : git
Home       : /home/git
Home Mode  :
Shell      : /bin/sh
Locked     : no


Необходимо разрешить юзеру git удаленный доступ по ссш, для этого в /etc/ssh/sshd_config добавляем строчку
AllowUsers git

и перезапускаем sshd
service sshd restart


Теперь сгенерим ключик для юзера git
ssh-keygen -t rsa

Жмем несколько раз enter, ключик создается в /root/.ssh

Инициализируем gitosis репозиторий, скармливаем ему публичный ключик, который только что создали
sudo -H -u git gitosis-init < /root/.ssh/id_rsa.pub

Должно получиться примерно так
Initialized empty Git repository in /usr/home/git/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /usr/home/git/repositories/gitosis-admin.git/

Gitosis готов, теперь надо добавить ключ со своей машины, чтобы удаленно админить все репозитории.
Для этого зайдем под юзером git
su git
cd ~

Создаем временную папку
mkdir ~/tmp
cd ~/tmp

Теперь склонируем наш админский репозиторий
git clone ~/repositories/gitosis-admin
cd gitosis-admin

Там будет файл gitosis.config вот такого содержания
[gitosis]

[group gitosis-admin]
members = root@server.ru 
writable = gitosis-admin

Чтобы иметь возможность управлять им удаленно нужно добавить себя и свой ключ в этот репозиторий.
Для этого во-первых поправим конфиг
[gitosis]

[group gitosis-admin]
members = root@server.ru Ncs
writable = gitosis-admin

Обратите внимание, я дописал в members Ncs.
Ncs это не юзер сервера freebsd, как раз gitosis и позволяет не плодить юзеров.
И во-вторых необходимо положить ПУБЛИЧНЫЙ ключ для доступа Ncs под названием Ncs.pub в директорию keydir
Когда поправлен конфиг и ключ Ncs.pub положен в keydir можно делать коммит
git add .
git commit -a -m 'Ncs added'
git push origin master


Всё, теперь можно удалить папку tmp.
Чтобы склонировать репозиторий удаленно надо использовать следующий вызов
ssh://git@server.ru:22/gitosis-admin.git
И конечно же, при клонировании нужно указывать ПРИВАТНЫЙ ключ, который является парой для публичного ключа, добавленного в keydir.
4 ноября 2014, 07:12

Определение кодировки файла в UNIX

file -i file.txt
4 ноября 2014, 07:12

Как переустановить библиотеки с зависимостями

После очередного обновления ПО в скриптах перестала работать библиотека GD, причем именно с png файлами.
Это лечится пересборкой всех зависимых библиотек
portmaster -r png
4 ноября 2014, 07:12

Установка nodejs на FreeBsd

Все очень просто ставится из портов
cd /usr/ports/www/node
make install clean
rehash

После установки проверим выполнение ява-скрипт файла
echo 'var a=2+2; console.log(a);' > ~/test.js
node ~/test.js

Если вывело 4, то все нормально.

Установка npm
curl http://npmjs.org/install.sh | sh
npm install express
4 ноября 2014, 07:12

Как закрыть соединение mysql из запроса

Для начала создается функция
 DELIMITER $$

    DROP FUNCTION IF EXISTS sfKillConnection $$

    CREATE FUNCTION sfKillConnection() RETURNS INT
    BEGIN
        SELECT connection_id() into @connectionId;
        KILL @connectionId;
        RETURN @connectionId;
    END $$

    DELIMITER ;

Затем можно делать запрос
  select if(
  (SELECT 1>2), 'ok', sfKillConnection()
  );

В данном примере этот запрос всегда будет закрывать соединение.
Где это может понадобиться? Например, в update скриптах для базы.
  SET @VersionToUpdate = 10;
  select if(
  (SELECT getCurrentVersion() = @VersionToUpdate), 'ok', sfKillConnection()
  );
DROP table my_table;

Если getCurrentVersion() не равно 10, то все запросы, которые идут после условия выполнены не будут, тем самым не получится применить update скрипт для неверной версии базы.
4 ноября 2014, 07:12

Вычисление разницы в днях между датами

<?php
echo date_diff(new DateTime(), new DateTime('2011-09-01 12:12:11'))->days;
?>
4 ноября 2014, 07:12

Включаем gzip сжатие и кэширование в nginx

Помещается в секцию http или server
expires max;
gzip  on;
gzip_vary on;
gzip_comp_level 6;
gzip_proxied any;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_buffers 16 8k;
gzip_disable "MSIE [1-6].(?!.*SV1)";

text/html в gzip_types писать не нужно, он всегда сжимается по умолчанию, если gzip включен.
4 ноября 2014, 07:12

Удаление из MYSQL записи символа \n

UPDATE tbl set pole = REPLACE(pole, CAST(0x0d AS CHAR), '')
4 ноября 2014, 07:12

Защита от брутфорса по ssh во FreeBsd

Для защиты будем использовать пакетный фильтр pf, для его активации необходимо проделать следующее
kldload pf
kldstat
echo 'pf_enable="YES"' >> /etc/rc.conf


Теперь добавим правило в /etc/pf.conf (фильтрующие правила нужно добавлять после всех остальных правил)
if="em0"
pass in on $if proto tcp from any to $if port ssh flags S/SA keep state (max-src-conn-rate 3/60, overload <ssh-bruteforce> flush global)
block drop in quick on $if from <ssh-bruteforce>
#обязательно оставьте пустую строку в конце файла


$if = em0 это наша сетевая карта.
max-src-conn-rate 3/60 означает не более 3 коннектов за 60 секунд, если более, то ип добавляется в таблицу

Запустим пакетный фильтр с правилами
pfctl -e
pfctl -f /etc/pf.conf


Теперь надо обеспечить периодическую очистку таблицы нарушителей (мало ли что), для это ставим expiretable
cd /usr/ports/security/expiretable
make install clean
rehash

И вешаем на крон каждые 5 минут очистку записей, которые протухли более часа назад
Для этого добавляем строчку в /etc/crontab
*/5 * * * *  root  /usr/local/sbin/expiretable -t 3600 ssh-bruteforce

Обратите внимание, что крон запускается от рута.

Всё, теперь если частота доступа по ссш превысит 4 раза в минуту, то ип блокируется на целый час.
Что характерно, блокируется доступ к серверу целиком по всем интерфейсам.
4 ноября 2014, 07:12

Как узнать кто входил по ssh?

Для этого в *nix есть простые утилиты, просто наберите это в консоле и смотрите кто сейчас торчит у вас на сервере.
who

last

w
4 ноября 2014, 07:12

Установка портов на FreeBsd

Если на вашем новом сервере нет дерева портов (хостер заюзал минимальную установку), то самое время его установить
csup -h cvsup6.freebsd.org /usr/share/examples/cvsup/ports-supfile

Также неплохо было бы установить исходные коды
csup -h cvsup6.freebsd.org /usr/share/examples/cvsup/stable-supfile


Почему используется cvsup6.freebsd.org? Просто это зеркало быстрее для России и Украины.
4 ноября 2014, 07:12

Как выйти из vi

Vi - очень "интуитивно-понятный" консольный редактор, если вы в него случайно попали, то хрен выйдите.
Все горячие клавиши там сделаны сгоряча.
Надо нажать :, а потом набрать
:wq
4 ноября 2014, 07:12

Как подключаться через SSH туннель

Если у вас есть сервер или vds, то вы можете использовать его как прокси. А так как подключаться будем по ssh, то получается довольно безопасный прокси с шифрованием.
Для начала нужно законнектиться на сервер. Я покажу как это сделать из windows при помощи putty
Скачиваем и запускаем эту крохотную софтинку, далее вводим урл или ип сервера

Затем идем во вкладку ssh->tunnels и ставим там динамический порт (для примера 999)

Не забываем нажать ADD, должно получиться вот так

Далее жмем OPEN, вводим логин и пароль, короче, входим на сервер по ssh как обычно.
Не закрывайте putty
Теперь необходимо настроить браузер. Я обычно юзаю opera, но в ней нет поддержки socks5 прокси, поэтому будем использовать firefox. Наша задача состоит в настройке proxy сервера, лезем в настройки

Затем вкладка дополнительно -> сеть -> настроить

Там выбираем ручную настройку прокси, вписываем порт и хост

Все, теперь можно выходить в интернет через ssh тунель, и у вас будет ип вашего сервера. В UNIX всё проще
ssh -N -D 9999 root@server_ip
4 ноября 2014, 07:12

Как склонировать репозитарий через ssh по нестандартному порту

git clone git+ssh://git-user@git-host.com:1111/rep.git rep
4 ноября 2014, 07:12

Шифрование каталога во FreeBsd при помощи pefs

Страница проекта на github
Качаем последнюю версию, на момент написания статьи это 2011-04-14
fetch https://github.com/downloads/glk/pefs/pefs-2011-04-14.tar.gz
tar -xvf pefs-2011-04-14.tar.gz
cd pefs-2011-04-14
make

Ну что же, как обычно получаем тупую ошибку. Опять разрабы не могут всё сделать как надо
===> sys/modules/pefs (all)
"Makefile", line 11: Malformed conditional (${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64")
"Makefile", line 14: if-less endif
make: fatal errors encountered -- cannot continue
*** Error code 1

Открываем sys/modules/pefs/Makefile, ищем там вот эти строки
.if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64"
SRCS+=  pefs_aesni.c
CFLAGS+= -DPEFS_AESNI
.endif

И делаем из нее вот это
#.if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64"
SRCS+=  pefs_aesni.c
CFLAGS+= -DPEFS_AESNI
#.endif

Ну теперь-то всё должно собраться нормально
make install clean
rehash


Когда pefs установлен, можно шифровать каталог.
Для начала создадим его
mkdir /secret
pefs mount /secret /secret
pefs addkey /secret

Вводим пароль (желательно подлиннее)
Шифрованный каталог создан, теперь можно проверить его работу.
Создаем файл
echo 'test' > /secret/file.txt

Проверяем его
cat /secret/file.txt

Теперь размонтируем каталог
pefs unmount /secret

Снова проверим содержимое файла
cat /secret/file.txt

В ответ получаем cat: /secret/file.txt: No such file or directory
Тоесть, не примонтировав каталог и не зная пароля невозможно получить содержимое шифрованного каталога. Это полезно если вы сдаете винт в ремонт на восстановление, либо к вам заглянули маски-шоу :)
При каждом ребуте нужно монтировать каталог и вводить ВЕРНЫЙ пароль, если пароль не верный, то содержимое будет также недоступно.
Монтируем снова
pefs mount /secret /secret
pefs addkey /secret

Если верно ввести пароль, то содержимое будет вновь доступно
cat /secret/file.txt
4 ноября 2014, 07:12

Клонирование объектов в jQuery

Рассмотрим вот такой код
var A = new Object;
var B = A;
A['value'] = 1;
alert(B['value']);

В яваскрипт все объекты передаются по ссылке, поэтому если вы измените свойство объекта A, оно автоматически изменится в объекте B.
Чтобы этого не произошло необходимо клонировать объект
var A = new Object;
var B = jQuery.extend({}, A);

Как клонировать объект на чистом яваскрипт мне, если честно, все равно. Потому что уже врядли можно встретить проект без какого-либо фреймворка.
4 ноября 2014, 07:12

Конфигурация nginx для Yii

Даже на сайте фреймворка yii нет вразумительного конфига для nginx (там много лишнего).
Привожу свой вариант, в связке с php-fpm
server {
        listen       80;
        server_name  your.site.ru;

        charset utf-8;
	root   /usr/local/www/nginx/build;
        index  index.html index.htm index.php;

        location / {
		try_files $uri $uri/ /index.php?$args;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/local/www/nginx-dist;
        }

	location ~ \w+\.php$ {
                #вот тут лучше заменить на юникс сокет
		fastcgi_pass  127.0.0.1:9000;
		fastcgi_index index.php;
		include fastcgi_params;
		fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
		fastcgi_param PATH_INFO $fastcgi_script_name;
	}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        location ~ /\.ht {
            deny  all;
        }
		
	location ~ ^/protected/ {
		deny  all;
	}
    }
4 ноября 2014, 07:12

Настройка и установка sphinx поиска для LiveStreet на FreeBsd

Чтобы запустить поиск на LiveStreet нужно сделать следующее
Для начала установим sphinx
cd  /usr/ports/textproc/sphinxsearch
make install clean 
rehash

Теперь идем править ему конфиг /usr/local/etc/sphinx.conf
Для LiveStreet можно взять его в папке install
Сразу даю 3 комментария к коду:
1. prefix_ меняется на префикс, который указывался при установки
2. sql_sock = /var/run/mysqld/mysqld.sock
это путь до сокета mysql, который задается в /etc/my.cnf, если не хочет коннектиться или вы не знаете где он у вас, то просто закоментируйте эту строчку в конфиге
3. не забудьте создать папку где хранить индексы (в конфиге это /var/lib/sphinx)
## Конфигурационный файл Sphinx-а для индексации LiveStreet
 
#######################
#
# Описываем индексы
#
#######################
 
# Источник-родитель для всех остальных источников. Здесь указываются параметры доступа
# к базе данных сайта
source lsParentSource
{
        type            = mysql
        sql_host        = localhost
        sql_user        = user
        sql_pass        = pass
        sql_db          = livestreet
        sql_port        = 3306
        # Для ускорения работы прописываем путь до MySQL-го UNIX-сокета (чтобы
        # операции с БД происходили не через TCP/IP стек сервера)
        sql_sock        = /var/run/mysqld/mysqld.sock
   
       
        mysql_connect_flags     = 32 # 32- включение сжатие при обмене данными с БД
   
        # Включам нужную кодировку соединения и выключаем кеш запросов
        sql_query_pre                   = SET NAMES utf8
        sql_query_pre                   = SET SESSION query_cache_type=OFF    
}
 
# Источник топиков
source topicsSource : lsParentSource
{
        # запрос на получения данных топиков
        sql_query               = \
                SELECT t_fast.topic_id, t_fast.topic_title, UNIX_TIMESTAMP(t_fast.topic_date_add) as topic_date_add, \
                tc.topic_text, t_fast.topic_publish \
                FROM prefix_topic as t_fast, prefix_topic_content AS tc \
                WHERE t_fast.topic_id=tc.topic_id AND t_fast.topic_id>=$start AND t_fast.topic_id<=$end
 
        # запрос для дробления получения топиков на неколько итераций
        sql_query_range         = SELECT MIN(topic_id),MAX(topic_id) FROM prefix_topic
       
        # сколько получать объектов за итерацию
        sql_range_step          = 1000
 
       
        # Указываем булевый атрибут критерия "топик опубликован". Для возможности указания этого критерия при поиске
        sql_attr_uint = topic_publish
 
        # Атрибут даты добавления, типа "время"
        sql_attr_timestamp      = topic_date_add
 
        # мульти-аттрибут "теги топика"
        sql_attr_multi  = uint tag from query; SELECT topic_id, topic_tag_id FROM prefix_topic_tag
 
        sql_ranged_throttle     = 0
}
 
# Источник комментариев
source commentsSource : lsParentSource
{
        sql_query               = \
                        SELECT comment_id, comment_text, UNIX_TIMESTAMP(comment_date) as comment_date, comment_delete \
                        FROM prefix_comment \
                        WHERE target_type='topic' AND comment_id>=$start AND comment_id<=$end AND comment_publish=1
 
        sql_query_range         = SELECT MIN(comment_id),MAX(comment_id) FROM prefix_comment
        sql_range_step          = 5000
 
        sql_attr_uint = comment_delete
        sql_attr_timestamp      = comment_date
}
 
#######################
#
# Описываем индексы
#
#######################
 
index topicsIndex
{
        # Источник, который будет хранить данный индекса
        source                  = topicsSource
        path                    = /var/lib/sphinx/topicIndex
 
        # Тип хранения аттрибутов
        docinfo                 = extern
 
        mlock                   = 0
 
        # Используемые морфологические движки
        morphology = stem_enru
 
        # Кодировака данных из источника    
        charset_type            = utf-8
 
 
        # Из данных источника HTML-код нужно вырезать
        html_strip                              = 1
        html_remove_elements = style, script, code
}
 
# Индекс комментариев
index commentsIndex
{
        source                  = commentsSource
        path                    = /var/lib/sphinx/commentsIndex
 
        docinfo                 = extern
 
        mlock                   = 0
 
        morphology = stem_enru
 
        charset_type            = utf-8
        
        # Из данных источника HTML-код нужно вырезать
        html_strip                              = 1
        html_remove_elements = style, script, code
}
 
#######################
#
# Настройки индексатора
#
#######################
 
 
indexer
{
        # Лимит памяти, который может использавать демон-индексатор
        mem_limit                       = 128M
}
 
#######################
#
# Настройка демона-поисковика
#
#######################
 
searchd
{
        # Адрес, на котором будет прослушиваться порт
        address                         = 127.0.0.1
 
 
        # Ну и собственно номер порта демона searchd
        port                            = 3312
 
        # Лог-файл демона
        log                                     = /var/log/sphinx/searchd.log
 
        # Лог поисковых запросов. Если закомментировать,то логировать поисковые строки не будет
        query_log                       = /var/log/sphinx/query.log
 
        # Время в секундах, которое ждет демон при обмене данными с клиентом. По исчерпании происходит разрыв коннекта
        read_timeout            = 5
 
        # Максимальное количество одновременно-обрабатываемых запросов. 0 означает дофига, а точнее без ограничения
        max_children            = 100
 
        # Файл, в который сохраняется PID-процесса при запуске
        pid_file                        = /var/log/sphinx/searchd.pid
}

Когда конфиг сохранен самое время запустить индексацию и поискового демона
indexer --all
searchd

Теперь осталось только прописать в /etc/crontab задания для периодической индексации топиков и комментов
Топики я поставил на каждый час, а комменты каждые полчаса, а чтобы мудни не было запускаю от рута
0 * * * *   root    /usr/local/bin/indexer --rotate topicsIndex > /dev/null 2>&1
*/30 * * * * root   /usr/local/bin/indexer --rotate commentsIndex > /dev/null 2>&1

Теперь на этом сайте есть полнотекстовый поиск.
4 ноября 2014, 07:12