понедельник, 9 апреля 2012 г.

mod_myvhost добавлен в дерево портов FreeBSD

mod_myvhost добавлен в дерево портов FreeBSD, это уже второй модуль, первым был - mod_jail.
Теперь займусь реализацией кэширования через memcached.

среда, 21 марта 2012 г.

mod_myvhost 0.21

Теперь можно задавать safe_mode и open_basedir из БД.
Если SQL-запрос не возвращает соответствующих данных,
то, как и раньше, safe_mode On, а open_basedir DocumentRoot.

Если существует директория DocumentRoot/.tmp,
то переменные PHP upload_tmp_dir и session.save_path принимают значение DocumentRoot/.tmp

понедельник, 16 января 2012 г.

дисковая квота на виртуальном хостинге

Как  на виртуальном хостинге гарантировать, что клиент не сможет выбрать дисковое пространство больше, чем ему положено по тарифу?

Обычно, клиент может загружать файлы на сервер хостинга по FTP и HTTP, будем исходить именно из этого.
В случае FTP задача решается достаточно просто, так как многие FTP-серверы имеют встроенную поддержку квот, например, ProFTPD и pure-ftpd.
С HTTP дело обстоит гораздо сложнее, тут такого простого стандартного решения не существует. Для себя я нашёл решение работающее, если хостинг использует PHP (только):
Для PHP есть расширение suhosin, кроме повышения безопасности, этот модуль предоставляет возможность "проверять" все загружаемые до того, как они попадут в клиентский PHP-скрипт. Опция suhosin.upload.verification_script, как следует из названия, задаёт имя программы (скрипта), который решает "хороший" файл загружен или нет, в качестве параметра скрипт получает полное имя загруженного файла.
Так как я на хостинг-сервере использую PureFTP c поддержкой виртуальных квот, то и скрипт у меня соответствующий:

#!/usr/bin/perl -w
use strict;

use Sys::Syslog qw/:standard :macros/;
use File::stat;
use DBI;

use vars qw/$res $database $hostname $port $user $password $uploaded_filename/;

BEGIN {
    openlog('php_upload_check', 'nofatal,pid', LOG_LOCAL7);
    $SIG{__DIE__} = sub {
        syslog(LOG_ERR, @_);
        CORE::die @_;
        return 1;
    };
    $SIG{__WARN__} = sub {
        syslog(LOG_WARNING, @_);
        return 1;
    };
}

END {
    syslog LOG_INFO, "result for file [%s] is [%s]\n", $uploaded_filename, $res;
    closelog();
}

# default result
$res = '0 quota exceeded';

$database = 'pureftpd';
$hostname = 'localhost';
$port = '/tmp/mysql.sock';
$user = 'pureftp';
$password = 'dbpassvv0rd';

$uploaded_filename = shift @ARGV or die "required filename parameter is missed";

my $fstat = stat($uploaded_filename) or die "failed stat($uploaded_filename): $!";

my $dbh = DBI->connect("DBI:mysql:$database:$hostname:$port", $user, $password)
    or die "Can't connect to [$database]: $DBI::errstr";

my $sth = $dbh->prepare( qq{SELECT vhost_type, Dir, Quota FROM users WHERE is_enabled='Y' AND Uid=? LIMIT 1} )
    or die "Can't prepare statement: $DBI::errstr";

my $rc = $sth->execute(scalar $fstat->uid) or die "Can't execute statement: $DBI::errstr";

if (my ($vhost_type, $dir, $quota) = $sth->fetchrow_array()) {
    if ($vhost_type eq 'OWN') {
        $res = '1 quota OK';
    } else {
        $dir =~ s{(/var/webroot/+[^/]+)(?:.*)?$}{$1};
        open(QUOTA_FILE , '<', "$dir/.ftpquota") or warn "can't open [$dir/.ftpquota]: $!";
        my $line = ;
        close(QUOTA_FILE) or warn "can't close [$dir/.ftpquota]: $!";
        $line =~ m/^\d+\s(\d+)$/;
        my $used_space = $1;
        $res = '1 quota OK' if ($used_space + $fstat->size <= $quota * 1024 * 1024);
    }
}

# check for problems which may have terminated the fetch early
warn $sth->errstr if $sth->err;

$sth->finish();

$dbh->disconnect;

print "$res\n";


Конечно, необходимо указать скрипт в php.ini:
[suhosin]
suhosin.upload.verification_script = /var/adm/php_upload_check
, настроить syslog, для FreeBSD можно так:
!php_upload_check
*.*                                             /var/log/httpd/php_upload_check.log
и тогда в логах при загрузке файла появляются записи вроде
Jan 16 15:36:14 vhosting php_upload_check[93237]: result for file [/var/webroot/clienthosting.ru/temp/php7MNnRm] is [1 quota OK]

четверг, 12 января 2012 г.

reset svn repository

#!/bin/bash

SVN_URL='https://projectname.googlecode.com/svn/'
SVN_USER='projectowner@gmail.com'

pushd /var/tmp

svnadmin create /var/tmp/svn-backup

pushd /var/tmp/svn-backup/hooks
mv pre-revprop-change.tmpl pre-revprop-change
chmod +x pre-revprop-change
perl -pi -e 's/^(exit 1)/#\1/' pre-revprop-change
popd

svnsync init file:///var/tmp/svn-backup "${SVN_URL}" --username "${SVN_USER}"
svnsync sync file:///var/tmp/svn-backup

# "reset this repository" link at the bottom of the "Source" tab's page

svnsync init "${SVN_URL}" file:///var/tmp/svn-backup --username "${SVN_USER}"
svnsync sync "${SVN_URL}"

popd

понедельник, 3 октября 2011 г.

Фряшный порт с jail-патчем для apache 2.2.21

Выложил фряшный порт с jail-патчем для apache 2.2.21 - никаких изменений нет. Собственно и в самом apache практически никаких, кроме касающихся бага с Accept-Range.

пятница, 5 ноября 2010 г.

deb for mod_myvhost-dbd

Собрал пакет для Ubuntu 10.10 amd64. RPM намного проще и понятнее, пришлось создать отдельный tag для DEB пакета.

пятница, 22 октября 2010 г.

Патч для apache 2.2.17

Добавил порт с jail-патчем для apache 2.2.17

В этом гаджете обнаружена ошибка