FTP-сервер на базе Proftpd — различия между версиями

Материал из megapuper
Перейти к: навигация, поиск
Строка 11: Строка 11:
 
Вносим в <code bash>/etc/rc.conf</code>:  
 
Вносим в <code bash>/etc/rc.conf</code>:  
 
  proftpd_enable="YES"
 
  proftpd_enable="YES"
 
эта команда покажет где находятся конфиги и с какими модулями собран proftpd.
 
# proftpd -V
 
  
  
Строка 285: Строка 282:
 
  SQLAuthenticate        users
 
  SQLAuthenticate        users
 
   
 
   
  SQLConnectInfo          proftpd@localhost:3306 proftpd password
+
  SQLConnectInfo          <font color=blue>USER</font>@localhost:3306 <font color=blue>DB</font> <font color=blue>PASSWORD</font>
 
  SQLLogFile              /var/log/proftpd/proftpd_mysql.log
 
  SQLLogFile              /var/log/proftpd/proftpd_mysql.log
 
  SQLUserInfo            `users` `userid` `passwd` `uid` `gid` `homedir` `shell`
 
  SQLUserInfo            `users` `userid` `passwd` `uid` `gid` `homedir` `shell`
Строка 304: Строка 301:
 
  'admin@domain', 2000, 2001, 'password', '/bin/nonexistent', '/ftp', 'admin', 0, 0, 0, 0, 1, 0, 'admin');
 
  'admin@domain', 2000, 2001, 'password', '/bin/nonexistent', '/ftp', 'admin', 0, 0, 0, 0, 1, 0, 'admin');
 
   
 
   
 
Делаем ему шифрованный пароль(если надо):
 
mysql> UPDATE users SET passwd=PASSWORD('password') WHERE name='admin';
 
 
  
 
Скачиваем архив proma.tar и кидаем его содержимое в нужный каталог веб-сервера. Вносим в <code bash>config.inc.php</code> параметры подключения к БД. Теперь можно залогиниться в админку.  
 
Скачиваем архив proma.tar и кидаем его содержимое в нужный каталог веб-сервера. Вносим в <code bash>config.inc.php</code> параметры подключения к БД. Теперь можно залогиниться в админку.  
 
 
<font color=red>P.S.</font> Чтобы не было проблем с отображением русских букв, добавим в конфиг следующее:
 
<IfModule mod_lang.c>
 
  UseEncoding utf8 cp1251
 
</IfModule>
 
Эта директива сообщит серверу, что локальная кодировка на FreeBSD - koi8-r(eсли она у нас действительно такая), удаленная у клиента cp1251, поэтому при записи файлов с русскими названиями будет произведена конвертация кодировки из одной кодовой страницы в другую.
 
  
  
Строка 345: Строка 331:
 
  должно быть:
 
  должно быть:
 
  $query .= ", $table_users.$users_passwd = '$new_passwd1'";
 
  $query .= ", $table_users.$users_passwd = '$new_passwd1'";
 
 
<font color=red>P.S.</font>Для авторизации по открытому паролю, в конфиге proftpd.conf делаем:
 
SQLAuthTypes Plaintext
 
 
 
<font color=red>P.S.</font> Ошибки вида:
 
mod_sql/4.3: no SQL backends registered
 
mod_sql.c: error initializing session
 
 
Лечатся сборкой <code bash>/usr/ports/databases/proftpd-mod_sql_mysql/</code> и добавлением в конфиг строчек:
 
LoadModule mod_sql.c
 
LoadModule mod_sql_mysql.c
 
SQLBackend mysql
 
  
  
Строка 365: Строка 337:
 
* ftpwho - показывает информацию о каждом текущем соединении (-v показывает также текущую рабочую директорию).
 
* ftpwho - показывает информацию о каждом текущем соединении (-v показывает также текущую рабочую директорию).
 
* ftptop - аналог программы top для процессов ProFTPD.  
 
* ftptop - аналог программы top для процессов ProFTPD.  
 +
* proftpd -V  - показывает как собран пакет
 +
* proftpd -q -d 10 - посмотреть как запускается
  
 
+
Прикручиваем смотрелку логов.<br/>
Прикручиваем смотрелку логов.
+
<spoiler>
Взять можно здесь: http://www.lissyara.su/articles/freebsd/programms/proftpd+mysql/
+
<?php
Меняем в скрипте данные для подключения к БД и всё.
+
//Чтоб при нажатии на всё, не выдавало ошибку
 +
set_time_limit(60 * 5);
 +
if (isset($_GET['go']));
 +
 +
//Параметры подключения к MySQL
 +
$db_host = "localhost";
 +
$db_user = "";
 +
$db_passwd = "";
 +
$db_db = "";
 +
 +
//Считываем текущее время
 +
$start_time = microtime();
 +
// разделяем секунды и миллисекунды
 +
//(становятся значениями начальных ключей массива-списка)
 +
$start_array = explode(" ",$start_time);
 +
// это и есть стартовое время
 +
$start_time = $start_array[1] + $start_array[0];
 +
 +
//Пытаемся приконнектится к БД
 +
if(!mysql_connect($db_host,$db_user,$db_passwd))
 +
{
 +
echo "<br><br><BIG><CENTER>Not connect to MySQL!!!</CENTER></BIG>";
 +
exit;
 +
}
 +
mysql_set_charset('cp1251');
 +
 +
//Выбираем базу данных
 +
mysql_select_db($db_db);
 +
 +
// Смотрим, всё, или не всё хочет. (дефолт - сегодня.)
 +
if(isset($_GET['whats_date']))
 +
{
 +
  $whats_date = $_GET['whats_date'];
 +
}else{
 +
  $whats_date = "today";
 +
}
 +
 +
$part_sql = "";
 +
$timestamp_begin_day = ((date('H',time()))*3600) + ((date('i',time()))*60) + (date('s',time()));
 +
 +
// за сегодня
 +
if($whats_date == 'today'){
 +
$part_sql = "WHERE `timestamp` > " . (time() - $timestamp_begin_day);
 +
}
 +
 +
// за вчера
 +
if($whats_date == 'yesterday'){
 +
  $part_sql = "WHERE `timestamp` BETWEEN " . (time() - $timestamp_begin_day - 86400) . " AND " . (time() - $timestamp_begin_day);
 +
}
 +
 +
// за позавчера
 +
if($whats_date == 'd_b_yesterday'){
 +
$part_sql = "WHERE `timestamp` BETWEEN " . (time() - $timestamp_begin_day - 172800) . " AND " . (time() - $timestamp_begin_day - 86400);
 +
}
 +
 +
// за три дня
 +
if($whats_date == 'three_days'){
 +
$part_sql = "WHERE `timestamp` BETWEEN " . (time() - $timestamp_begin_day - 259200) . " AND " . (time() - $timestamp_begin_day - 172800);
 +
}
 +
 +
// за неделю
 +
if($whats_date == 'week'){
 +
$part_sql = "WHERE `timestamp` > " . (time() - $timestamp_begin_day - 604800);
 +
}
 +
 +
$page_content = "";
 +
$i = 0;
 +
// строим кверю на выбор чего тама накачано...
 +
$sql = "SELECT FROM_UNIXTIME(`timestamp`,'%d-%m-%Y') AS `ymd`,FROM_UNIXTIME(`timestamp`,'%H:%i') AS `his`,`file_and_path`,`client_name`,`bytes`,((`bytes`/(1024*1024))/`send_time`) AS `speed` FROM \
 +
`xfer_table` " . $part_sql . " ORDER BY `unic_id` DESC";
 +
//echo $sql;
 +
$sql = mysql_query("$sql");
 +
 +
// строим таблицу для вывода
 +
while ($row_id = mysql_fetch_assoc($sql)){
 +
if ($i%2 == 0){ // число чётное. ничё не делаем
 +
$fone_color = "#f1f1f1";
 +
// четное
 +
}else{ // чётное - > нечётное
 +
$fone_color = "#FFFFFF";
 +
} // закрытие - нечётное число
 +
// дёргаем чистое имя файла
 +
$file_name = substr($row_id['file_and_path'], strpos($row_id['file_and_path'], '/')+4);
 +
$page_content = $page_content . "\n\t\t\t\t<TR bgcolor=\"" . $fone_color . "\">
 +
\t\t\t\t\t<TD align=\"center\" width=\"70\">
 +
\t\t\t\t\t\t<CODE style=\"font-size:12px\">" . $row_id['ymd'] . "</CODE>
 +
\t\t\t\t\t</TD>
 +
\t\t\t\t\t<TD align=\"center\" width=\"60\">
 +
\t\t\t\t\t\t<CODE style=\"font-size:12px\">" . $row_id['his'] . "</CODE>
 +
\t\t\t\t\t</TD>
 +
\t\t\t\t\t<TD align=\"center\" width=\"\">
 +
\t\t\t\t\t\t<CODE style=\"font-size:12px\">" . iconv("koi8-r", "cp1251", $file_name ) . "</CODE>
 +
\t\t\t\t\t</TD>
 +
\t\t\t\t\t<TD align=\"center\" width=\"100\">
 +
\t\t\t\t\t\t<CODE style=\"font-size:12px\">" . $row_id['client_name'] . "</CODE>
 +
\t\t\t\t\t</TD>
 +
\t\t\t\t\t<TD align=\"center\" width=\"50\">
 +
\t\t\t\t\t\t<CODE style=\"font-size:12px\">" . round(($row_id['bytes']/(1024*1024)),2) . "</CODE>
 +
\t\t\t\t\t</TD>
 +
\t\t\t\t\t<TD align=\"center\" width=\"50\">
 +
\t\t\t\t\t\t<CODE style=\"font-size:12px\">" . round($row_id['speed'],2) . "</CODE>
 +
\t\t\t\t\t</TD>";
 +
 +
// прибавляем 1 к счётчику
 +
$i++;
 +
}
 +
 +
$page_top = "<HTML>
 +
<HEAD>
 +
<TITLE>яРЮРХЯРХЙЮ FTP-ЯЕПБЕПЮ</TITLE>
 +
<META NAME=\"description\" CONTENT=\"яРЮРХЯРХЙЮ FTP-ЯЕПБЕПЮ\">
 +
<META http-equiv=\"Content-Type\" content=\"text/html;charset=cp1251\">
 +
<!-- начало таблиц стилей для страницы -->
 +
<STYLE type=\"text/css\">
 +
<!-- стиль для линков -->
 +
A.text_link {COLOR: blue; TEXT-DECORATION: none}
 +
A.text_link:link {COLOR: blue; TEXT-DECORATION: none}
 +
A.text_link:visited {COLOR: blue; TEXT-DECORATION: none}
 +
A.text_link:hover {COLOR: darkblue; TEXT-DECORATION: underline}
 +
A.text_link:active {COLOR: darkblue; TEXT-DECORATION: none}
 +
</STYLE>
 +
</HEAD>
 +
<BODY style=\"margin: 0 0 0 0; padding: 0 0 0 0; BACKGROUND-COLOR: #f1f1f1; BORDER-RIGHT: #999999 1px solid; MARGIN: 0px; BORDER-LEFT: #999999 1px solid; \">
 +
&nbsp; <a class=\"text_link\" href=\"" . $_SERVER['SCRIPT_NAME'] . "?whats_date=today\">ЯЕЦНДМЪ</a>
 +
<br>
 +
&nbsp; <a class=\"text_link\" href=\"" . $_SERVER['SCRIPT_NAME'] . "?whats_date=yesterday\">БВЕПЮ</a>
 +
<br>
 +
&nbsp; <a class=\"text_link\" href=\"" . $_SERVER['SCRIPT_NAME'] . "?whats_date=d_b_yesterday\">ОНГЮБВЕПЮ</a>
 +
<br>
 +
&nbsp; <a class=\"text_link\" href=\"" . $_SERVER['SCRIPT_NAME'] . "?whats_date=three_days\">РПХ ДМЪ</a>
 +
<br>
 +
&nbsp; <a class=\"text_link\" href=\"" . $_SERVER['SCRIPT_NAME'] . "?whats_date=week\">ОНЯКЕДМЪЪ МЕДЕКЪ</a>
 +
<br>
 +
&nbsp; <a class=\"text_link\" href=\"" . $_SERVER['SCRIPT_NAME'] . "?whats_date=all\">БЯ╦</a>
 +
<br>
 +
<br>
 +
<CENTER>
 +
<TABLE width=\"95%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">
 +
<TBODY>
 +
<TR>
 +
<TD width=\"100%\" bgcolor=\"#707680\">
 +
<TABLE border=\"0\" width=\"100%\"  cellspacing=\"1\" cellpadding=\"3\">
 +
<TBODY>
 +
<TR bgcolor=\"#B9CCDF\">
 +
<TD align=\"center\" colspan=\"6\">
 +
<CODE><b>яРЮРХЯРХЙЮ FTP-ЯЕПБЕПЮ</b></CODE>
 +
</TD>
 +
</TR>
 +
<TR bgcolor=\"#f1f1f1\">
 +
<TD align=\"center\" colspan=\"6\">
 +
<CODE>&nbsp;</CODE>
 +
</TD>
 +
</TR>
 +
\t\t\t\t<TR bgcolor=\"#DAE0E7\">
 +
\t\t\t\t\t<TD align=\"center\" width=\"70\">
 +
\t\t\t\t\t\t<CODE style=\"font-size:12px\">дЮРЮ</CODE>
 +
\t\t\t\t\t</TD>
 +
\t\t\t\t\t<TD align=\"center\" width=\"50\">
 +
\t\t\t\t\t\t<CODE style=\"font-size:12px\">бПЕЛЪ</CODE>
 +
\t\t\t\t\t</TD>
 +
\t\t\t\t\t<TD align=\"center\" width=\"\">
 +
\t\t\t\t\t\t<CODE style=\"font-size:12px\">тЮИК</CODE>
 +
\t\t\t\t\t</TD>
 +
\t\t\t\t\t<TD align=\"center\" width=\"100\">
 +
\t\t\t\t\t\t<CODE style=\"font-size:12px\">IP-ЮДПЕЯ</CODE>
 +
\t\t\t\t\t</TD>
 +
\t\t\t\t\t<TD align=\"center\" width=\"80\">
 +
\t\t\t\t\t\t<CODE style=\"font-size:12px\">пЮГЛЕП(лА)</CODE>
 +
\t\t\t\t\t</TD>
 +
\t\t\t\t\t<TD align=\"center\" width=\"70\">
 +
\t\t\t\t\t\t<CODE style=\"font-size:12px\">яЙНПНЯРЭ</CODE>
 +
\t\t\t\t\t</TD>
 +
";
 +
 +
$page_down = " </TBODY>
 +
</TABLE>
 +
</TD>
 +
</TR>
 +
</TBODY>
 +
</TABLE>
 +
<BR><BR>
 +
</BODY>
 +
</HTML>";
 +
 +
// выводим наделанное
 +
 +
echo $page_top . $page_content . $page_down;
 +
 +
// Выводим время генерации скрипта
 +
$end_time = microtime();
 +
$end_array = explode(" ",$end_time);
 +
$end_time = $end_array[1] + $end_array[0];
 +
// вычитаем из конечного времени начальное
 +
$time = $end_time - $start_time;
 +
// выводим в выходной поток (браузер) время генерации страницы
 +
echo "<center><CODE>бПЕЛЪ ЦЕМЕПЮЖХХ ЯРПЮМХЖШ " . round($time,4) . " ЯЕЙСМД</CODE></center>";
 +
?>
 +
</spoiler>

Версия 17:00, 9 октября 2015

Озадачился я как-то поставить для любимых юзверей в локалке фтп-сервер, пусть думаю обмениваются своим любимым поревом.
Чтоб там с пользователями, с записями в базу, с красивой статистикой и т.д. Выбор пал на proftpd. Задумано-сделано. Поехали.


Система FreeBSD 10.2
Корневой каталог /ftp
Ставить будем из пакетов(версия 1.3.5a):

# pkg install proftpd proftpd-mod_sql_mysql-1.3.5a


Вносим в /etc/rc.conf:

proftpd_enable="YES"


Вариант 1. Простейший
Рихтуем proftpd.conf под наши нужды:

ServerName                      "My FTP server"
ServerType                      standalone
DefaultServer                   on
ScoreboardFile                  /var/run/proftpd/proftpd.scoreboard
DefaultAddress                  localhost
Port                            21
Umask                           022
MaxInstances                    30
CommandBufferSize               512
AllowOverwrite                  on
AllowRetrieveRestart            on
AllowStoreRestart               on
TimeoutNoTransfer               300

User                            nobody
Group                           nogroup

#Загоняем всех подключившихся в папку ftp
DefaultRoot  /ftp
 
### Security
AllowForeignAddress             off
DenyFilter                      \*.*/
MaxClientsPerHost               2 "The %m client are already connected from your host, it is not authorized any more"
MaxLoginAttempts                20 "It is too much attempts to enter "
PathDenyFilter                  "(^\.ftpaccess$)"
RequireValidShell               off

### Логи
DebugLevel                      1
TransferLog                     /var/log/proftpd/proftpd-transfer.log
ExtendedLog                     /var/log/proftpd/proftpd-extended.log
SystemLog                       /var/log/proftpd/proftpd-system.log
LogFormat                       default "%h %l %u %t \"%r\" %s %b"
LogFormat                       auth    "%v [%P] %h %t \"%r\" %s"
LogFormat                       write   "%h %l %u %t \"%r\" %s %b"

<Anonymous /ftp>
  User                         ftp
  Group                        ftp

UserAlias                       anonymous ftp
MaxClients                      10

Добавляем пользователя ftp для анонимного входа(без пароля)

# pw useradd ftp -s /usr/sbin/nologin

В принципе всё. Для простейшего случая, с анонимным пользователем этого достаточно. Можно юзать.


Теперь переходим к дальнейшей настройке сервера и остальным рюшечкам.


Вариант 2. Авторизация из файла
Пользователей можно заводить с помощью утилиты ftpasswd. Заводим юзверя или группу таким образом:(почему-то заводится только в папке в которой находимся)

# ftpasswd --passwd --name ftp_user --file /usr/local/etc/proftpd/ftpd.passwd --uid 2000 --gid 2001 --home /ftp --shell /bin/false
# ftpasswd --group --name ftp_group –-file /usr/local/etc/proftpd/ftpd.group --gid 2001 --member ftp_user


в proftpd.conf добавляем:

AuthUserFile  /usr/local/etc/proftpd/ftpd.passwd
AuthGroupFile  /usr/local/etc/proftpd/ftpd.group


Ну и собственно примерные права для папок(предварительно заведём пользователя boss).

<Directory /ftp/download>
        <Limit WRITE DELE RMD MKD>
                DenyAll
        </Limit>
</Directory>

<Directory /ftp/upload>
        <Limit WRITE MKD>
               AllowAll
        </Limit>

        <Limit DELE RMD>
               AllowUser boss
               DenyAll
       </Limit>
</Directory>

Итоговый конфиг
Spoiler


Вариант 2. Авторизация из MySQL и админка
(Взято и адаптировано отсюда http://www.lissyara.su/articles/freebsd/programms/proftpd+mysql/)

Создаём базу proftpd:

mysql> create database proftpd set utf8 collate utf8_general_ci;


Заводим пользователя proftpd

mysql> grant all on proftpd.* to proftpd@localhost identified by 'ПАРОЛЬ';


Создаём таблицы

CREATE TABLE IF NOT EXISTS `users` (
  `userid` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `mail` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `uid` int(11) DEFAULT '2000',
  `gid` int(11) DEFAULT '2001',
  `passwd` varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `shell` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '/bin/nonexistent',
  `homedir` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '/ftp',
  `note` text CHARACTER SET utf8 COLLATE utf8_general_ci,
  `last_login` int(15) NOT NULL,
  `count` int(11) NOT NULL DEFAULT '0',
  `last_err_login` int(15) NOT NULL,
  `err_login_count` int(15) NOT NULL,
  `admin` int(1) NOT NULL DEFAULT '0',
  `closed` int(1) NOT NULL DEFAULT '1',
  `groupname` varchar(24) DEFAULT 'unregistered',
  PRIMARY KEY (`userid`),
  KEY `groupname` (`groupname`),
  KEY `closed` (`closed`),
  KEY `admin` (`admin`),
  KEY `count` (`count`),
  KEY `passwd` (`passwd`),
  KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
CREATE TABLE IF NOT EXISTS `xfer_errors` (
  `unic_id` int(32) NOT NULL AUTO_INCREMENT,
  `timestamp` int(15) NOT NULL,
  `user_name` varchar(64) COLLATE utf8_general_ci NOT NULL,
  `file_and_path` tinytext COLLATE utf8_general_ci NOT NULL,
  `client_name` varchar(127) COLLATE utf8_general_ci NOT NULL,
  `client_IP` varchar(15) COLLATE utf8_general_ci NOT NULL,
  `client_command` varchar(5) COLLATE utf8_general_ci NOT NULL,
  PRIMARY KEY (`unic_id`),
  KEY `user_name` (`user_name`),
  KEY `client_name` (`client_name`),
  KEY `client_IP` (`client_IP`),
  KEY `client_command` (`client_command`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
 
CREATE TABLE IF NOT EXISTS `xfer_table` (
  `unic_id` int(32) NOT NULL AUTO_INCREMENT,
  `timestamp` int(15) NOT NULL,
  `user_name` varchar(64) COLLATE utf8_general_ci NOT NULL,
  `file_and_path` tinytext COLLATE utf8_general_ci NOT NULL,
  `bytes` int(15) NOT NULL DEFAULT '0',
  `client_name` varchar(127) COLLATE utf8_general_ci NOT NULL,
  `client_IP` varchar(15) COLLATE utf8_general_ci NOT NULL,
  `client_command` varchar(5) COLLATE utf8_general_ci NOT NULL,
  `send_time` varchar(9) COLLATE utf8_general_ci NOT NULL DEFAULT '0',
  PRIMARY KEY (`unic_id`),
  KEY `timestamp` (`timestamp`),
  KEY `user_name` (`user_name`),
  KEY `client_name` (`client_name`),
  KEY `client_IP` (`client_IP`),
  KEY `client_command` (`client_command`),
  KEY `send_time` (`send_time`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
 
CREATE TABLE IF NOT EXISTS `quotalimits` (
  `userid` varchar(30) NOT NULL,
  `quota_type` enum('user','group','class','all') NOT NULL,
  `per_session` enum('false','true') NOT NULL DEFAULT 'false',
  `limit_type` enum('soft','hard') NOT NULL DEFAULT 'hard',
  `bytes_in_avail` float NOT NULL DEFAULT '1.57286e+08',
  `bytes_out_avail` float NOT NULL DEFAULT '0',
  `bytes_xfer_avail` float NOT NULL DEFAULT '0',
  `files_in_avail` int(10) unsigned NOT NULL DEFAULT '0',
   `files_out_avail` int(10) unsigned NOT NULL DEFAULT '0',
  `files_xfer_avail` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`userid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

CREATE TABLE IF NOT EXISTS `quotatallies` (
  `userid` varchar(30) NOT NULL,
  `quota_type` enum('user','group','class','all') NOT NULL,
  `bytes_in_used` float NOT NULL DEFAULT '0',
  `bytes_out_used` float NOT NULL DEFAULT '0',
  `bytes_xfer_used` float NOT NULL DEFAULT '0',
  `files_in_used` int(10) unsigned NOT NULL DEFAULT '0',
  `files_out_used` int(10) unsigned NOT NULL DEFAULT '0',
  `files_xfer_used` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`userid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;


В конфиг добавляем следующее:

LoadModule              mod_sql.c
LoadModule              mod_sql_mysql.c
SQLBackend              mysql
#В каком виде хранятся пароли, в данном случае - открытым текстом
#SQLAuthTypes            backend
SQLAuthTypes            Plaintext
SQLAuthenticate         users

SQLConnectInfo          USER@localhost:3306 DB PASSWORD
SQLLogFile              /var/log/proftpd/proftpd_mysql.log
SQLUserInfo             `users` `userid` `passwd` `uid` `gid` `homedir` `shell`

SQLLog          PASS            counter_login
SQLLog          ERR_PASS        counter_err
SQLLog          RETR,STOR       log_story_transfer
SQLLOG          ERR_RETR,ERR_STOR,ERR_DELE,ERR_RMD,ERR_RNTO log_err_modify 

SQLNamedQuery   counter_login           UPDATE "`last_login`=UNIX_TIMESTAMP(),`count`=`count`+1 WHERE `userid`='%u'" `users`
SQLNamedQuery   counter_err             UPDATE "`last_err_login`=UNIX_TIMESTAMP(),`err_login_count`=`err_login_count`+1 WHERE `userid`='%U'" `users`
SQLNamedQuery   log_story_transfer      INSERT ",UNIX_TIMESTAMP(),'%u','%f', '%b', '%h','%a', '%m', '%T'"`xfer_table`
SQLNamedQuery   log_err_modify          INSERT ",UNIX_TIMESTAMP(),'%u', '%f', '%h','%a', '%m'" `xfer_errors`


Добавляем админа:

mysql> INSERT INTO `users` (`userid`, `name`, `mail`, `uid`, `gid`, `passwd`, `shell`, `homedir`, `note`, `last_login`, `count`, `last_err_login`, `err_login_count`, `admin`, `closed`, `groupname`) VALUES ('admin', 'admin',
'admin@domain', 2000, 2001, 'password', '/bin/nonexistent', '/ftp', 'admin', 0, 0, 0, 0, 1, 0, 'admin');

Скачиваем архив proma.tar и кидаем его содержимое в нужный каталог веб-сервера. Вносим в config.inc.php параметры подключения к БД. Теперь можно залогиниться в админку.


P.S. Чтобы админка пускала админа с открытым паролем, в файлике /libs/auth.lib.php в 31 строке вносим изменения:

вместо:
$users_passwd = PASSWORD('$passwd')";

должно быть:
$users_passwd = '$passwd'";


P.S. Чтобы пароли для пользователей фтп создавались в открытом виде, в файлике register.inc.php в 35 строке вносим изменения:

вместо:
} else {
$query = "SELECT PASSWORD('$passwd1')";
$result = mysql_query($query) or die("Database query failed.");

должно быть:
} else {
$query = "SELECT '$passwd1'";
$result = mysql_query($query) or die("Database query failed.");


P.S.Чтобы при смене пароля они тоже отображались в базе в открытом виде, в файлике /libs/admin.lib.php делаем следующие изменения в строке 375:

вместо
$query .= ", $table_users.$users_passwd = PASSWORD('$new_passwd1')";
 
должно быть:
$query .= ", $table_users.$users_passwd = '$new_passwd1'";


Полезности:

  • ftpcount - показывает число соединений в настоящий момент (с разбивкой по виртуальным хостам).
  • ftpwho - показывает информацию о каждом текущем соединении (-v показывает также текущую рабочую директорию).
  • ftptop - аналог программы top для процессов ProFTPD.
  • proftpd -V - показывает как собран пакет
  • proftpd -q -d 10 - посмотреть как запускается

Прикручиваем смотрелку логов.
Spoiler