Как и обещал, даю первичные наработки по версии клиент-сервер. Надеюсь на поддержку.
Исходные данные:
Компьютер под управлением WindowsXP — Диспетчерский пульт №1 с локальным адресом 192.168.1.21,
Компьютер под управлением WindowsXP — Диспетчерский пульт №2 с локальным адресом 192.168.1.22.
На каждой машине имеется папка с общим доступом ”EXPORT”, куда складываются файлы логов, с интервалом в 1 час.
Компьютер под управлением Debian6.04 — сервер с установленными службами, для нас важны такие службы: mysql, samba.
Задача: Импортировать все логи от всех диспетчерских пультов в одну базу данных на сервере.
Для решения:
Монтируем папки общего доступа на сервере, для чего размещаем исполняемый скрипт в файле cat > /mnt/myfiles/lib/import.sh
Код
#! /bin/sh
#===Скрипт: Монтирование каталогов эеспорта на сервер===
SYNC_LOG="/mnt/mylog/import_mpult.log"
# Монтирование файла записи логов
[ -e "$SYNC_LOG" ] || touch $SYNC_LOG
SHARE_S="/mnt/myfiles/smb_import_mpult1"
[ -e "$SHARE_S" ] || mkdir -p $SHARE_S
MOUNT_FLAG=TRUE
if mount -t cifs -o rw,iocharset=utf8,user=,pass= //192.168.1.20/EXPORT $SHARE_S
then
echo $(date +%Y.%m.%d' '%T)' mount success://192.168.1.20/EXPORT->'$SHARE_S >> $SYNC_LOG
echo $(date +%Y.%m.%d' '%T)' BEGIN import files FROM '$SHARE_S >> $SYNC_LOG
else
echo $(date +%Y/%m/%d' '%T)' mount error: '$SHARE_S >> $SYNC_LOG
MOUNT_FLAG=FALSE
fi
SHARE_S="/mnt/myfiles/smb_import_mpult2"
[ -e "$SHARE_S" ] || mkdir -p $SHARE_S
if mount -t cifs -o rw,iocharset=utf8,user=,pass= //192.168.1.21/EXPORT $SHARE_S
then
echo $(date +%Y.%m.%d' '%T)' mount success://192.168.1.21/EXPORT->'$SHARE_S >> $SYNC_LOG
echo $(date +%Y.%m.%d' '%T)' BEGIN import files FROM '$SHARE_S >> $SYNC_LOG
else
echo $(date +%Y/%m/%d' '%T)' mount error: '$SHARE_S >> $SYNC_LOG
MOUNT_FLAG=FALSE
fi
if MOUNT_FLAG
then
/mnt/myfiles/lib/import_new.php >> $SYNC_LOG
fi
# umount -a -t cifs
exit 0
Для целей собственно импорта размещаем скрипт в файле:
cat>/mnt/myfiles/lib/import_new.php следующего содержания:
Код
#!/usr/bin/php
<?php
$db_host='localhost';//
$db_name='mlift';//
$db_user='user';//
$db_pass='8888';//
$tbl_name='mlift';
/* connect server */
$link = mysql_connect($db_host,$db_user,$db_pass) or die("Could not connect : " . mysql_error());
$sql = 'CREATE DATABASE IF NOT EXISTS '.$db_name;
mysql_query($sql) or die("Error creating database: " . mysql_error());
mysql_select_db($db_name) or die("Could not select database");
$sql="(
record_id,
act_date,
act_time,
act_code,
act_name,
mlift_id,
bit_sign,
massiv,
bit_num,
bit_num2,
table_num,
service_num,
pult_id
)
";
//Массив с примонтированными каталогами
$dir = array('1'=>'/mnt/myfiles/smb_import_mpult1/', '2'=>'/mnt/myfiles/smb_import_mpult2/');
foreach ($dir as $key => $value) {
$folder = scandir($value);
$nf = count($folder);/*получим количество файлов в каталоге*/
for ($cf=2; $cf<$nf; $cf++) {/*цикл по каталогу, начиная с 3 файла*/
$file_name = $folder[$cf];/*получим файл по индексу*/
$files = file($value . $file_name);/*полный путь к файлу-читаем содержимое файла и помещает его в массив*/
$vic=TRUE;/*флаг успешной записи файла*/
mysql_query("BEGIN");/*Начнем транзакцию в пределах всех строк файла - или все строки и удаление файла или ничего*/
foreach ($files as $file) {/*разбор массива строк файла*/
$str = iconv("windows-1251", "UTF-8//TRANSLIT", $file);/*Перекодировка содержимого*/
$str = trim($str);/*На всякий случай*/
$mydata = explode(";", $str);/*Разбиваю строку в массив*/
$mydata[1] = "STR_TO_DATE('" . $mydata[1] . "', '%d.%m.%Y')";/*Преобразую дату для вставки в таблицу*/
$mydata[2] = "STR_TO_DATE('" . $mydata[2] . "', '%H:%i:%s')";/*Преобразую время для вставки в таблицу*/
$num2 = count($mydata);/*Количество полей для вставки в таблицу*/
for ($c2=3; $c2<$num2; $c2++) {
$mydata[$c2] = "'" . $mydata[$c2] . "'";/*Обрамляю в апострофы, кроме полей кода,даты,время*/
}
$str = implode(",", $mydata);/*Собираю массив значенией в строку*/
$str .= ", '".$key."'";/*Добавляю номер диспетчерского пульта*/
$str = "(" . $str . ")";/*Обрамляю в скобки строку значений*/
$sql1 = 'INSERT INTO mlift' . $sql;/*Формирую адресную часть запроса*/
$str = $sql1 . ' VALUES' . $str . ';';/*запрос сформирован*/
// echo $str."\r\n";
$result = mysql_query($str);/*результат вставки записи*/
if (mysql_errno() == 1146) {/*вставка записи не удалась так как отсутсвует таблица*/
echo "Попытаемся создать таблицу: mlift" . "\r\n";
$sql3="CREATE TABLE IF NOT EXISTS mlift
(
enum_id int unsigned NOT NULL AUTO_INCREMENT COMMENT 'Код операции',
record_id int NULL DEFAULT NULL COMMENT 'Код записи',
act_date DATE NULL DEFAULT NULL COMMENT 'Дата события',
act_time TIME NULL DEFAULT NULL COMMENT 'Время события',
act_code VARCHAR(100) NULL DEFAULT NULL COMMENT 'Код события',
act_name VARCHAR(100) NULL DEFAULT NULL COMMENT 'Наименование события',
mlift_id INT UNSIGNED NULL DEFAULT '0' COMMENT 'Идентификатор лифта',
bit_sign VARCHAR(50) NULL DEFAULT NULL COMMENT 'Битовые признаки',
massiv VARCHAR(50) NULL DEFAULT NULL COMMENT 'Массив сохраненного состояния',
bit_num VARCHAR(50) NULL DEFAULT NULL COMMENT 'Номер бита сохраненного состояния',
bit_num2 VARCHAR(50) NULL DEFAULT NULL COMMENT 'Неизвестное поле',
table_num VARCHAR(50) NULL DEFAULT NULL COMMENT 'Номер таблицы сообщений станции управления лифтом',
service_num VARCHAR(50) NULL DEFAULT NULL COMMENT 'Номер сообщения станции управления, номер сервисного ключа',
pult_id VARCHAR(10) NULL DEFAULT NULL COMMENT 'Номер пульта',
UNIQUE (`record_id` , `mlift_id` , `pult_id`),
PRIMARY KEY ( `enum_id` )
)
ENGINE = INNODB COMMENT='Журнал событий программно-диспетчерчкого комплекса Обь';"
;
$result = mysql_query($sql3);/*Результат создания таблицы*/
if ($result) {
echo 'Таблица: '. $tbl_name1.' создана'."\r\n";
$result = mysql_query($str);/*Результат повторной вставки записи в созданную таблицу*/
}
}/*Метка - Завершена обработка неудачной записи так как отсутсвует таблица*/
if (!$result) {/*Вставка записи завершилась с ошибкой*/
$vic=FALSE;/*Сбросим флаг операции*/
echo mysql_error().'-'.mysql_errno()."\r\n";/*запишем код ошибки*/
break;/*прервем цикл записи файла в таблицу*/
}
}/*Метка - Завершен разбор массива строк файла*/
if ($vic){/*Если флаг операции есть...*/
$trans=mysql_query("COMMIT");/*...подтвердим транзакцию*/
if ($trans) {/*После успешной транзакции...*/
if(unlink($value.$file_name)) {/*...удалим файл из примонтированного каталога...*/
echo 'the file '.$file_name.' has been deleted.'."\r\n";/*...и запишем это приятное событие в лог*/
}
}
}
else {/*Если флаг операции нет,...*/
$trans=mysql_query("ROLLBACK");/*Откатим транзакцию...*/
echo mysql_error().'-'.mysql_errno()."\r\n";/*Запишем в лог код ошибки...*/
}
}/*Метка - Завершен цикл по каталогу, начиная с 3 файла*/
}/*Метка - Завершен цикл по примонтированным каталогам*/
mysql_close($link);/*Сбросим соединение с базой данных*/
?>
делаем запись в таблице заданий crontab -e
5 * * * * /mnt/myfiles/lib/import.sh >> /mnt/mylog/import_mpult.log
чтобы скрипт запускался в пять минут каждого часа
устанавливаем ротацию логов, для чего добавляем в конфигурационный файл logrotate.conf
Код
/mnt/mylog/*.log {
missingok
create 0664 username utmp
}
Смотрим файл логов "/mnt/mylog/import_mpult.log", видим примерно такое
Код
2013.01.22 10:05:01 mount success://192.168.1.20/EXPORT->/mnt/myfiles/smb_import_mpult1
2013.01.22 10:05:01 BEGIN import files FROM /mnt/myfiles/smb_import_mpult1
2013.01.22 10:05:01 mount success://192.168.1.21/EXPORT->/mnt/myfiles/smb_import_mpult2
2013.01.22 10:05:01 BEGIN import files FROM /mnt/myfiles/smb_import_mpult2
the file P0000001.csv has been deleted.
the file P0000001.csv has been deleted.
Смотрим базу данных(phpmyadmin), наслаждаемся результатом и пытаемся ответить на вопрос: а нафига все это и что с этим делать?
А Делать еще много чего надо, чтобы вся эта беда была полезной и удобной. Интересная мысль использовать LibreOffice для генерации отчетов. Я пока работаю над веб-интерфейсом, ибо поставлена задача иметь доступ через интернет
У меня скрипт работает с 30 ноября 2012 года. Количество записей уже более одного миллиона, размер базы данных более 200 метров. Пора писать скрипт, чтобы раскидывать записи по таблицам, например 1 месяц — одна таблица.
Размещение файлов пока рабочее, также надо решать проблемы безопасности и шифрования.
Однозначно надо работать с кодом,так как напрашивается класс.
Есть желание разместить проект на git.
Пишите