Разворачивание syslog-сервера с веб-интерфейсом

Невероятно странно, но попытки нагуглить хоть какой-нибудь веб-интерфейс для сислога приводят в основном в дебри топов коммерческих интерфейсов, среди которых, может, и есть бесплатные версии, но будьте любезны сами ковыряться и  разбираться насколько оно убого или нет, и какой функционал там порезан.

Мне же от вебморды много не надо — мне надо чтобы она лог показывала,  фильтры имела, и было бы неплохо чтобы составляла с сервером полностью FOSS-решение. И сам я давно уже использую под это дело LogAnalyzer, который с поставленной задачей — презентовать лог сислог-сервера, собирающего в базу данных логи с различного оборудования — справляется весьма неплохо.

И так как в целом задача развертывания сислог-сервера с веб-мордой не решается автоматически установкой какого-нибудь пакета в этом нашем дебиане, я решил во-первых написать скрипт, который сделает все за вас, ну а попутно еще расписать как в целом все это инсталлируется и настраивается руками.

Итак, скрипт писался и проверялся на Debian 10 «Buster», его актуальная версия находится на гитхабе, а текущую я оставлю здесь:

loganalyzer_install.sh
 
  1. #!/bin/bash
  2. # Syslog server with web interface for Debian 10
  3. # LAMP + phpmyadmin + rsyslog + Log Analyzer
  4. PHPMYADMINUSER="pma"
  5. PHPMYADMINPASS="321"
  6. SYSLOGDBPASSWORD="Qwerty"
  7. PMAVER="4.9.2"
  8. LAVERSION="4.1.7"
  9. export LANG="en_US.UTF-8"
  10. function check_packages {
  11.     notinstalled=""
  12.     if [ $# -eq 0 ]; then echo "Package name(s) required"; fi
  13.     if [ $# -gt 0 ]; then
  14.         for packagename in $@; do
  15.             if [[ "" == $(dpkg-query  -W --showformat='${Status}\n' ${packagename}  2>&1 | grep "install ok") ]]; then
  16.                 notinstalled=${notinstalled}${packagename}" "
  17.             fi
  18.         done
  19.     fi
  20.     if [[ "" == ${notinstalled} ]]; then
  21.         echo "true"
  22.     else
  23.         echo "${notinstalled}"
  24.     fi
  25. }
  26. ######## MARIA DB
  27. function check_sql {
  28.     if [[ "true" != $( check_packages  mariadb-server ) && "true" != $( check_packages  mysql-server) ]]; then
  29.         echo "false"
  30.     fi
  31.     if  [[ "true" == $( check_packages  mariadb-server ) ]]; then echo "mariadb"; fi
  32.     if  [[ "true" == $( check_packages  mysql-server ) ]]; then echo "mysql"; fi
  33. }
  34. function install_sql {
  35.     apt -y install mariadb-server
  36. #    mysql -uroot -e "UPDATE mysql.user SET Password=PASSWORD('${MYSQLROOTPASS}') WHERE User='root';\
  37. #    DELETE FROM mysql.user WHERE User='';\
  38. #    DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');\
  39. #    DROP DATABASE test;\
  40. #    DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%';\
  41. #    FLUSH PRIVILEGES;"
  42. }
  43. ######### PHP
  44. function check_php {
  45.     phpnotinstalled=$( check_packages php libapache2-mod-php php-mysql php-common php-cli  php-json php-gd php-opcache php-readline php-mbstring )
  46.     if [[ "true" != ${phpnotinstalled} ]]; then
  47.         echo "${phpnotinstalled}"
  48.     else
  49.         echo "true"
  50.     fi
  51. }
  52. ######### PHPMYADMIN
  53. function check_phpmyadmin {
  54.     if [[ ! -d /usr/share/phpmyadmin/ ]]; then
  55.         echo "false"
  56.     fi
  57. }
  58. function install_phpmyadmin {
  59. IFS='' read -r -d '' SITECONFIG  <<"EOF"
  60. Alias /phpmyadmin /usr/share/phpmyadmin
  61. <Directory /usr/share/phpmyadmin>
  62.     Options SymLinksIfOwnerMatch
  63.     DirectoryIndex index.php
  64.     <IfModule mod_php5.c>
  65.         <IfModule mod_mime.c>
  66.             AddType application/x-httpd-php .php
  67.         </IfModule>
  68.         <FilesMatch ".+\.php$">
  69.             SetHandler application/x-httpd-php
  70.         </FilesMatch>
  71.         php_value include_path .
  72.         php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
  73.         php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/:/usr/share/php/php-php-gettext/:/usr/share/javascript/:/usr/share/php/tcpdf/:/usr/share/doc/phpmyadmin/:/usr/share/php/phpseclib/
  74.         php_admin_value mbstring.func_overload 0
  75.     </IfModule>
  76.     <IfModule mod_php.c>
  77.         <IfModule mod_mime.c>
  78.             AddType application/x-httpd-php .php
  79.         </IfModule>
  80.         <FilesMatch ".+\.php$">
  81.             SetHandler application/x-httpd-php
  82.         </FilesMatch>
  83.         php_value include_path .
  84.         php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
  85.         php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/:/usr/share/php/php-php-gettext/:/usr/share/javascript/:/usr/share/php/tcpdf/:/usr/share/doc/phpmyadmin/:/usr/share/php/phpseclib/
  86.         php_admin_value mbstring.func_overload 0
  87.     </IfModule>
  88. </Directory>
  89. # Authorize for setup
  90. <Directory /usr/share/phpmyadmin/setup>
  91.     <IfModule mod_authz_core.c>
  92.         <IfModule mod_authn_file.c>
  93.             AuthType Basic
  94.             AuthName "phpMyAdmin Setup"
  95.             AuthUserFile /etc/phpmyadmin/htpasswd.setup
  96.         </IfModule>
  97.         Require valid-user
  98.     </IfModule>
  99. </Directory>
  100. # Disallow web access to directories that don't need it
  101. <Directory /usr/share/phpmyadmin/templates>
  102.     Require all denied
  103. </Directory>
  104. <Directory /usr/share/phpmyadmin/libraries>
  105.     Require all denied
  106. </Directory>
  107. <Directory /usr/share/phpmyadmin/setup/lib>
  108.     Require all denied
  109. </Directory>
  110. EOF
  111. if [ ! -f phpMyAdmin-${PMAVER}-all-languages.tar.gz ]; then wget https://files.phpmyadmin.net/phpMyAdmin/${PMAVER}/phpMyAdmin-${PMAVER}-all-languages.tar.gz; fi
  112. tar -xf phpMyAdmin-${PMAVER}-all-languages.tar.gz
  113. mkdir /usr/share/phpmyadmin
  114. cp -r phpMyAdmin-${PMAVER}-all-languages/* /usr/share/phpmyadmin
  115. mkdir -p /var/lib/phpmyadmin/tmp
  116. chown -R www-data:www-data /var/lib/phpmyadmin
  117. mkdir /etc/phpmyadmin/
  118. cp /usr/share/phpmyadmin/config.sample.inc.php  /usr/share/phpmyadmin/config.inc.php
  119. ln -s /usr/share/phpmyadmin/config.inc.php /etc/phpmyadmin/
  120. echo "\$cfg['TempDir'] ='/var/lib/phpmyadmin/tmp';" >> /usr/share/phpmyadmin/config.inc.php
  121. r="\$cfg\['blowfish_secret'\] = '"
  122. sed -i  "s/${r}/${r}$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32)/g" /usr/share/phpmyadmin/config.inc.php
  123. echo "$SITECONFIG" >  /etc/apache2/sites-available/phpmyadmin.conf
  124. ln -s /etc/apache2/sites-available/phpmyadmin.conf /etc/apache2/sites-enabled/
  125. service  apache2 restart
  126. mysql -uroot -e "use mysql; CREATE USER ${PHPMYADMINUSER}@localhost IDENTIFIED BY '${PHPMYADMINPASS}'; GRANT ALL ON *.* TO ${PHPMYADMINUSER}@localhost WITH GRANT OPTION;"
  127. service mysql restart
  128. }
  129. ######### SYSLOG
  130. function install_rsyslog_mysql {
  131. debconf-set-selections << END
  132. rsyslog-mysql      rsyslog-mysql/mysql/admin-pass      password
  133. # MySQL application password for rsyslog-mysql:
  134. rsyslog-mysql      rsyslog-mysql/mysql/app-pass      password ${SYSLOGDBPASSWORD}
  135. rsyslog-mysql      rsyslog-mysql/password-confirm      password ${SYSLOGDBPASSWORD}
  136. rsyslog-mysql      rsyslog-mysql/app-password-confirm      password ${SYSLOGDBPASSWORD}
  137. # MySQL username for rsyslog-mysql:
  138. rsyslog-mysql      rsyslog-mysql/db/app-user      string      rsyslog@localhost
  139. # Back up the database for rsyslog-mysql before upgrading?
  140. rsyslog-mysql      rsyslog-mysql/upgrade-backup      boolean      true
  141. # Host running the MySQL server for rsyslog-mysql:
  142. rsyslog-mysql      rsyslog-mysql/remote/newhost      string
  143. # MySQL database name for rsyslog-mysql:
  144. rsyslog-mysql      rsyslog-mysql/db/dbname      string      Syslog
  145. # Reinstall database for rsyslog-mysql?
  146. rsyslog-mysql      rsyslog-mysql/dbconfig-reinstall      boolean      false
  147. rsyslog-mysql      rsyslog-mysql/missing-db-package-error      select      abort
  148. rsyslog-mysql      rsyslog-mysql/remote/port      string
  149. # Perform upgrade on database for rsyslog-mysql with dbconfig-common?
  150. rsyslog-mysql      rsyslog-mysql/dbconfig-upgrade      boolean      true
  151. # Host name of the MySQL database server for rsyslog-mysql:
  152. rsyslog-mysql      rsyslog-mysql/remote/host      select      localhost
  153. # Deconfigure database for rsyslog-mysql with dbconfig-common?
  154. rsyslog-mysql      rsyslog-mysql/dbconfig-remove      boolean      true
  155. # Database type to be used by rsyslog-mysql:
  156. rsyslog-mysql      rsyslog-mysql/database-type      select      mysql
  157. rsyslog-mysql      rsyslog-mysql/upgrade-error      select      abort
  158. rsyslog-mysql      rsyslog-mysql/remove-error      select      abort
  159. rsyslog-mysql      rsyslog-mysql/install-error      select      abort
  160. rsyslog-mysql      rsyslog-mysql/passwords-do-not-match      error
  161. rsyslog-mysql      rsyslog-mysql/internal/skip-preseed      boolean      false
  162. # Delete the database for rsyslog-mysql?
  163. rsyslog-mysql      rsyslog-mysql/purge      boolean      false
  164. # Connection method for MySQL database of rsyslog-mysql:
  165. rsyslog-mysql      rsyslog-mysql/mysql/method      select      Unix socket
  166. rsyslog-mysql      rsyslog-mysql/mysql/admin-user      string      root
  167. rsyslog-mysql      rsyslog-mysql/internal/reconfiguring      boolean      false
  168. # Configure database for rsyslog-mysql with dbconfig-common?
  169. rsyslog-mysql      rsyslog-mysql/dbconfig-install      boolean      true
  170. END
  171. DEBIAN_FRONTEND=noninteractive apt-get install -y rsyslog-mysql
  172. echo "Creating /etc/rsyslog.d/enable-remote.conf"
  173. echo "module(load=\"imudp\")" > /etc/rsyslog.d/enable-remote.conf
  174. echo "input(type=\"imudp\" port=\"514\")" >> /etc/rsyslog.d/enable-remote.conf
  175. echo "module(load=\"imtcp\")" >> /etc/rsyslog.d/enable-remote.conf
  176. echo "input(type=\"imtcp\" port=\"514\")" >> /etc/rsyslog.d/enable-remote.conf
  177. service rsyslog restart
  178. echo "17 2     * * *     root mysql -uroot -e 'use Syslog; DELETE FROM SystemEvents WHERE ReceivedAt < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 365 DAY);'" > /etc/cron.d/rsyslog_mysql
  179. #mysql -uroot -e "CREATE DATABASE Syslog_template;"
  180. #mysqldump -uroot Syslog > /tmp/sql.sql
  181. #mysql -uroot Syslog_template < /tmp/sql.sql
  182. #mysql -uroot -e "TRUNCATE TABLE Syslog_template.SystemEvents"
  183. }
  184. ######### LOG ANALYZER
  185. function install_loganalyzer {
  186. if [ ! -f loganalyzer-${LAVERSION}.tar.gz ]; then wget http://download.adiscon.com/loganalyzer/loganalyzer-${LAVERSION}.tar.gz; fi
  187. tar -xf loganalyzer-${LAVERSION}.tar.gz
  188. cp -r loganalyzer-${LAVERSION}/src/* /var/www/html/
  189. rm -rf ./loganalyzer-${LAVERSION}/
  190. rm /var/www/html/index.html
  191. chown www-data:www-data -R /var/www/html/
  192. #create new db for loganalyzer user and settings with rsyslog user as admin
  193. mysql -uroot -e "create database loganalyzer; grant all privileges on loganalyzer.* to rsyslog@localhost"
  194. #disable new version check during logon into admin panel
  195. r="\$content\['UPDATEURL'\] = \"http://loganalyzer.adiscon.com/files/version.txt\";"
  196. sed -i  "s|${r}|\$content\['UPDATEURL'\] = \"\";|g"  /var/www/html/include/functions_common.php
  197. }
  198. ####
  199. ## MAIN
  200. ####
  201. instaldebconf="false"
  202. installmariadb="false"
  203. installapache="false"
  204. installphp="false"
  205. instalphpmyadmin="false"
  206. installrsyslog="false"
  207. printf "Checking debconf-utils..."
  208. check=$( check_packages debconf-utils )
  209. if [[ $check != "true" ]]; then
  210.     echo "......will be installed"
  211.     instaldebconf="true"
  212. else
  213.     echo "......found!"
  214. fi
  215. printf "Checking sql..."
  216. check=$( check_sql )
  217. case ${check} in
  218.     false)
  219.         echo "................will be installed: MariaDB"
  220.         installmariadb="true"
  221.         ;;
  222.     mysql)
  223.         echo "................MySQL found, it will be used during installation"
  224.         ;;
  225.     mariadb)
  226.         echo "................MariaDB found, it will be used during installation"
  227.         ;;
  228. esac
  229. printf "Checking apache..."
  230. check=$( check_packages apache2 )
  231. if [[ $check != "true" ]]; then
  232.     echo ".............will be installed"
  233.     installapache="true"
  234. else
  235.     echo ".............found!"
  236. fi
  237. printf "Checking php..."
  238. check=$( check_php )
  239. if [[ $check != "true" ]]; then
  240.     echo "................will be installed: ${check}"
  241.     installphp="true"
  242.     phptoinstall=${check}
  243. else
  244.     echo "................found!"
  245. fi
  246. printf "Checking rsyslog-mysql..."
  247. check=$( check_packages rsyslog-mysql )
  248. if [[ $check != "true" ]]; then
  249.     echo "......will be installed"
  250.     installrsyslog="true"
  251. else
  252.     echo "......found!"
  253. fi
  254. printf "Checking phpmyadmin..."
  255. check=$( check_phpmyadmin )
  256. if [[ $check == "false" ]]; then
  257.     echo ".........not found in /usr/share/phpmyadmin/"
  258.     echo
  259.     while true; do
  260.         read -p "Do you wish to install phpmyadmin? (y/n): " yn
  261.         case $yn in
  262.             [Yy] ) instalphpmyadmin="true"; break;;
  263.             [Nn] ) break;;
  264.             * ) echo "Please answer [y]es or [n]o.";;
  265.         esac
  266.     done
  267. else
  268.     echo ".........found!"
  269. fi
  270. echo
  271. echo "This file(s) should be downloaded:"
  272. if [[ ${instalphpmyadmin} != "false" ]]; then echo "https://files.phpmyadmin.net/phpMyAdmin/${PMAVER}/phpMyAdmin-${PMAVER}-all-languages.tar.gz" ; fi
  273. echo "http://download.adiscon.com/loganalyzer/loganalyzer-${LAVERSION}.tar.gz"
  274. echo "You can place this file(s) into current directory manually if you have not an Internet connection."
  275. echo "Debian repository must be accessible!"
  276. echo
  277. read -p "Ok, let's do it. Press ENTER to install, CTRL-C - to abort."
  278. # INSTALL
  279. apt update
  280. if [[ ${instaldebconf} != "false" ]]; then apt -y install debconf-utils ; fi
  281. if [[ ${installmariadb} != "false" ]]; then install_sql ; fi
  282. if [[ ${installapache} != "false" ]]; then apt -y install apache2 ; fi
  283. if [[ ${installphp} != "false" ]]; then  apt -y install ${phptoinstall} ; fi
  284. if [[ ${installrsyslog} != "false" ]]; then  install_rsyslog_mysql  ; fi
  285. installrsyslog
  286. if [[ ${instalphpmyadmin} != "false" ]]; then install_phpmyadmin ; fi
  287. install_loganalyzer
  288. serverip=$(ip addr show | grep -o "inet [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" | grep -o "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" | grep -v "^127.0.0.1" | head -n 1)
  289. echo
  290. echo
  291. echo Installation complete
  292. echo
  293. if [[ ${instalphpmyadmin} != "false" ]]; then
  294.     echo "phpmyadmin address: http://${serverip}/phpmyadmin"
  295.     echo "             login:${PHPMYADMINUSER}"
  296.     echo "          password:${PHPMYADMINPASS}"
  297.     echo
  298. fi
  299. echo "Open IP address of this server in web-browser (http://${serverip}/)"
  300. echo and use next settings for wizard:
  301. echo
  302. echo "User Database Options (optional)"
  303. echo "Enable User Database: Yes"
  304. echo "       Database User: rsyslog"
  305. echo "   Database Password: ${SYSLOGDBPASSWORD}"
  306. echo
  307. echo "First Syslog Source"
  308. echo "                        Source Type: MYSQL Native"
  309. echo "     Database Name (case-sensitive): Syslog"
  310. echo "Database Tablename (case-sensitive): SystemEvents"
  311. echo "                      Database User: rsyslog"
  312. echo "                  Database Password: ${SYSLOGDBPASSWORD}"
  313. echo "                Enable Row Counting: No"

 

Лучше всего использовать его на свежеустановленном дебиане в минимальной конфигурации. Перед запуском нужно его отредактировать, изменив пароль для создаваемого в процессе пользователя (базы данных) rsyslog, а также логин и пароль дополнительного администратора БД, который будет создан в случае установки (опциональной) PhpMyAdmin.  Всего скрипт установит:

  1. mariadb в качестве сервера баз данных,
  2. rsyslog с коннектором rsyslog-mysql в качестве сислог сервера, и создаст конфиг для приема логов по сети
  3. веб-сервер apache
  4. опционально phpmyadmin для управления базой данных
  5. LogAnalyzer.

После завершения работы скрипта останется пройти мастера настройки LogAnalyzer, перейдя в браузере по адресу вашего сервера. Так что если вы решите его использовать, то можете листать к разделу «Настройка LogAnalyzer», а также посмотреть наглядное видео:

Настройка сервера syslog с веб-интерфейсом и хранением логов в базе данных (на Debian 10 «buster»)

Установка debian

Для наших целей подойдет установленный в минимальной конфигурации дебиан. Идеально сразу при установке поставить LAMP-набор, отметив опцию web server

Но можно обойтись пунктом standard system utilities, а все остальное установить самостоятельно. Я буду исходить из этого варианта.

Установка базы данных MariaDB

 
 
  1. apt update && apt -y install mariadb-server

Установка веб-сервера apache

 
 
  1. apt -y install apache2

Установка необходимых модулей PHP

 
 
  1. apt -y install php libapache2-mod-php php-mysql php-common php-cli php-json php-gd php-opcache php-readline php-mbstring

Установка rsyslog

 
 
  1. apt -y rsyslog-mysql

В процессе установки соглашаемся сконфигурировать базу данных

Придумываем и подтверждаем пароль для пользователя «rsyslog» БД

После того как сислог будет установлен, его нужно сконфигурировать так, чтобы он мог принимать события с сетевого оборудования. Создаем файл /etc/rsyslog.d/enable-remote.conf с таким содержанием:

/etc/rsyslog.d/enable-remote.conf
 
  1. module(load="imudp")
  2. input(type="imudp" port="514")
  3. module(load="imtcp")
  4. input(type="imtcp" port="514")

И перезагружаем сервис

 
 
  1. service rsyslog restart

Установка веб-интерфейса (LogAnalyzer)

Скачиваем и распаковываем файлы в директорию веб-сервера:

 
 
  1. wget http://download.adiscon.com/loganalyzer/loganalyzer-4.1.7.tar.gz
  2. tar -xvf loganalyzer-4.1.7.tar.gz
  3. rm loganalyzer-4.1.7.tar.gz
  4. cp -r loganalyzer-4.1.7/src/* /var/www/html/
  5. rm /var/www/html/index.html
  6. chown www-data:www-data -R /var/www/html/

Перед тем как перейти мастеру настройки, создадим еще одну одну базу, в которой лог аналайзер будет хранить свои настройки, и дадим пользователю rsyslog полные права на нее

 
 
  1. mysql -uroot -e "create database loganalyzer; grant all privileges on loganalyzer.* to rsyslog@localhost"

Настройка LogAnalyzer

Теперь к мастеру. Перейдя в браузере по адресу сервера мы должны увидеть его приглашение создать конфиг

Первые два шага пропускаем, интересное  начинается с третьего. Здесь нужно выбрать Enable User Database и ввести имя пользователя (rsyslog)  и пароль с которыми будет производиться подключение к созданной нами базе «loganalyzer». Остальные настройки можно оставить по умолчанию.

На шестом шаге создаем внутреннего администратора лог аналайзера

На следующем шаге выбираем источник данных — базу rsyslog\’а. Важные пункты, которые будет нужно здесь изменить:

  1. Source Type — MYSQL Native
  2. Database Name — Syslog (была создана при установке rsyslog-mysql)
  3. Database Tablename — SystemEvents (именно так — с большими буквами, а не как по дефолту)
  4. Database User — rsyslog
  5. Database Password — пароль юзера rsyslog
  6. Enable Row Counting — No (при объеме логов в несколько гигабайт этот подсчет приводит к более чем минутным запросам к БД)

Next, Finish и перед нами интерфейс лог аналайзера

Тюнинг

Теперь остается сделать две довольно важные вещи.

Во-первых, при попытке логина в админку, лог аналайзер пытается проверить свое собственное обновление, и это приводит к длительному ожиданию, если сервер не имеет выхода в интернет. Чтобы этого не происходило — нужно отредактировать файл /var/www/html/include/functions_common.php, изменив строку

 
 
  1. $content['UPDATEURL'] = "http://loganalyzer.adiscon.com/files/version.txt";

на

 
 
  1. $content['UPDATEURL'] = "";

Второе, и не менее важное. Со временем база сислога будет опухать, поэтому ее стоит периодически очищать от старых записей. Для этого нужно создать файлик /etc/cron.d/rsyslog_mysql с содержимым

 
 
  1. 23 2     * * *     root mysql -uroot -e 'use Syslog; DELETE FROM SystemEvents WHERE ReceivedAt < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 365 DAY);'

С ним каждый день из базы будут удаляться записи старше 365 дней (разумеется это количество можно поправить на необходимое)

 

Написал поисковик для файлопомоек — pyFileSearcher

По работе нужно было внести ясность в постоянно убывающее место на файловых серверах, на которые пользователи любят сгружать всякий мусор, не относящийся к работе. Столкнувшись с такой необходимостью, полез искать софт и выяснил, что хотя индексаторов в целом довольно много, но они или перегружены функционалом и нацелены на домашнего пользователя — такие просто не справляются с большим объемом файлов; или являются какими-то безумными корпоративными системами, которые выглядят страшно шописец, ставятся как отдельный сервер с разворачиваемыми агентами и настраиваются так, что без поллитры не разобраться.

В общем, я решил что было бы прикольно написать что-то свое. Эту мысль я вынашивал наверное больше года, так как яжнепрограммист ну абсолютно, но вот прошел курс по гуям в питоне и подумал что надо бы попробовать че получится.

Получилось портабельное приложение, которое не обладает горой функционала, но во-первых умеет сожрать в себя 20 миллионов файлов, во-вторых — умеет искать по нужным в быту параметрам, таким как размер файла, тип, и — это важно — дате добавления в индекс. Строго говоря я не видел тулзов, которые бы сами запоминали время, когда файл был обнаружен. Да, у файла есть время создания и время модификации — и казалось бы их должно хватать для отфильтровывания новых файлов, когда мы хотим их найти. Но хрен там был, эти атрибуты ведут себя черт знает как — например файл притащенный с плеера может показать какой-нить 1700й год до нашей эры.

В общем ладно, это все лирика, вот что вышло:

Аскетично, но работает. Прожка может запускаться с ключом, который стартует сканирование, так что можно запускать его раз в сутки по шедулеру и потом смотреть — что же пользователи накидали за прошедшую неделю, нет ли свежих релизов с рутрекера ))

При скролле результатов отсутствующие файлы подсвечиваются красным, список можно сохранить в csv чтобы предъявить владельцу каталога на сервере или его начальнику =) Фильтры поиска можно сохранять (обычно мне нужны медиафайлы размером не менее, список расширений прилагается, в индексе появились за неделю)

Вся эта балалайка разумеется умеет работать под виндой, но и линукс не забыл (была бы макось под рукой, тестил бы код еще и под маком). В качестве базы данных можно использовать или sqlite, базы которого можно рожать прямо из проги, или подключиться к MySQL — мой случай, 20 лямов записей sqlite тупо не вывозит (собственно это проблема большинства несложных индексаторов, какие можно найти в инете)

В общем получилось такое промежуточное решение — простенькое и на скорую руку, не требующее воскуривания мануалов перед использованием, но и не умирающее от большого файлсервера. Да, поиск внутри файлов не умеет, как и кучу других плюшек, так что для домашнего использования скорее всего не пригодится, но мою задачу решает лучше чем что-то похожее, что я использовал (Locate32 — от его интерфейса и возможностей я отталкивался, но он с некоторой периодичностью терял конфиг, жрал под гиг оперативки из-за использования локальных баз, и был виндуз-онли. Хотя в целом прога более чем годная). Так что вот он, первый релиз: https://github.com/qiwichupa/pyFileSearcher/releases также залил на сурсфордж.

Думаю еще пару фишек потом добавить, типа поиска по файлам которые были удалены, потому что оно бывает нужно. Но это как будет время и желание — базовые мои хотелки оно уже удовлетворяет, может кому пригодится тоже =)