LINUX.ORG.RU
ФорумAdmin

очередной скрипт - аплоад то фтп...?

 , ,


0

1
Приветствую снова!
Я, наверное, всем тут уже жутко надоел, но есть у меня ещё вот такая проблема - есть раскиданные по фолдерам кучки файлов, которые надо upload to ftp - каждую кучку в отдельный, специальный фолдер на фтп.

я наваял чтото типа такого:


####ana 

echo "Starting script:ana  $(date +%Y.%m.%d\ %H:%M:%S)..."

getfmts() { if [ -f "$1" ] || [ -d "$1" ]; then echo $(stat -c %Y $1); else echo 0; fi; }

DIRIN_ana=/DWD_sorted/ana  # Full path to input directory
DIROUT_ana=/DWD_sorted/ana_sent # Full path to output directory

cd $DIRIN_ana

if [ "$(ls -A .|grep bufr)" ]; then echo "Processing files..."; else echo "No files"; exit; fi

for f in *; do
ts=$(date +%s); tsf=$(getfmts $f)
if [ $((ts-tsf)) -gt 10 ]; then
echo "Sending file $f to ftp..."
curl -T $f  ftp://smart:smart@SM/../../smart/edit/dwd/ana
if [ $? -eq 0 ]; then
mv -f $f $DIROUT_ana/
else
echo "There was an error when trying to upload file!"
fi
fi
done

echo "Script finished: $(date +%Y.%m.%d\ %H:%M:%S)"




####hsy 

echo "Starting script:hsy  $(date +%Y.%m.%d\ %H:%M:%S)..."

getfmts() { if [ -f "$1" ] || [ -d "$1" ]; then echo $(stat -c %Y $1); else echo 0; fi; }

DIRIN_hsy=/DWD_sorted/hsy  # Full path to input directory
DIROUT_hsy=/DWD_sorted/hsy_sent # Full path to output directory

cd $DIRIN_hsy

if [ "$(ls -A .|grep bufr)" ]; then echo "Processing files..."; else echo "No files"; exit; fi

for f in *; do
ts=$(date +%s); tsf=$(getfmts $f)
if [ $((ts-tsf)) -gt 10 ]; then
echo "Sending file $f to ftp..."
curl -T $f  ftp://smart:smart@SM/../../smart/editor/dwd/gme/hsy
if [ $? -eq 0 ]; then
mv -f $f $DIROUT_hsy/
else
echo "There was an error when trying to upload file!"
fi
fi
done

echo "Script finished: $(date +%Y.%m.%d\ %H:%M:%S)"


####htp

echo "Starting script:htp  $(date +%Y.%m.%d\ %H:%M:%S)..."

getfmts() { if [ -f "$1" ] || [ -d "$1" ]; then echo $(stat -c %Y $1); else echo 0; fi; }

DIRIN_htp=/DWD_sorted/htp  # Full path to input directory
DIROUT_htp=/DWD_sorted/htp_sent # Full path to output directory

cd $DIRIN_htp

if [ "$(ls -A .|grep bufr)" ]; then echo "Processing files..."; else echo "No files"; exit; fi

for f in *; do
ts=$(date +%s); tsf=$(getfmts $f)
if [ $((ts-tsf)) -gt 10 ]; then
echo "Sending file $f to ftp..."
curl -T $f  ftp://smart:smart@SM/../../smart/editor/dwd/htp
if [ $? -eq 0 ]; then
mv -f $f $DIROUT_htp/
else
echo "There was an error when trying to upload file!"
fi
fi
done

echo "Script finished: $(date +%Y.%m.%d\ %H:%M:%S)"



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

наверняка это можно сделать както покрасивше, но у меня толком нет идей, как именно.

не то чтобы это ктото кроме меня будет особо видеть, но всёравно, хочется, чтобы было красиво....

если кто сможет помочь примером - спасибо заранее! 

PS да, структура с ветками «еррор» и «финишед» не допилена, так что в примере может быть неправильная логика на данный момент.

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

наверняка это можно сделать както покрасивше, но у меня толком нет идей, как именно.

Сделать функцию, а не копипастить сто раз. То, что в копипасте отличается, сделать переменными, и вынести в куда-нибудь в массив, например.

Deleted
()
Ответ на: комментарий от Deleted

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

как это реализовать - непонятно.

то есть, скажем, dir_in, dir_out = ana , ana_sent, ftp: ../dwd/ana

ter, ter_sent, ftp: ..dwd/prog/ter

...?
wisedraco ★★
() автор топика
Ответ на: комментарий от wisedraco

Я например в файлик построчно записывал параметры, потом из него читал как-то так, из нагугленных костылей:

FILE=/ololo/params
while read -r LINE || [[ -n "${LINE}" ]]
do
    if ! [ -z "${LINE}" ] && grep -v '^#' -q <<<${LINE} 
	then
        DIRIN=$(echo ${LINE}| cut -f1 -d ' ')
        DIROUT=$(echo ${LINE}| cut -f2 -d ' ')
	...
	ftp_magic_fucntion
    fi
done < ${FILE}
cat /ololo/params
# DIRIN DIROUT
/DWD_sorted/ana /DWD_sorted/ana_sent
/DWD_sorted/hsy /DWD_sorted/hsy_sent
Соответственно добавляешь еще переменных, каких тебе нужно.

Есть у меня еще вариант брать из sqlite значения, но там совсем все через жопу, поэтому я не буду его показывать.

Deleted
()
Ответ на: комментарий от Deleted

sqlite для такого скрипта, конечно, совсем мимо, но ведь если каждую переменную в цикле расписывать руками, а-ля 
 DIRIN=$(echo ${LINE}| cut -f1 -d ' ')
 DIROUT=$(echo ${LINE}| cut -f2 -d ' ')

то никакого короткого скрипта с циклом не получится, а получится чтото похожее на мой первоначальный вариант?

wisedraco ★★
() автор топика
Ответ на: комментарий от wisedraco

Почему не получится?

И оно в любом случае будет удобнее для изменений, чем твоя копипаста.

Deleted
()
Ответ на: комментарий от Deleted

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

wisedraco ★★
() автор топика
Ответ на: комментарий от ving2
нет, мне хотелось бы это на чистом баше, дабы была великая универсальность
скрипта сего.
был поконсультироватся у нашего перлового программера.
тот советовал связатся с арреями, но это чересчур сложно для меня,
и плюсов этого я не вижу.
вместо этого, имхо, в начале скрипта можно надефинировать переменных, например:

DIRIN1=/DWD_sorted_obs
DIRIN2=/DWD_sorted_tre
DIRIN3=/DWD_serted_htp

FTP1=ftp://smart:smart@SM/../../smart/editor/dwd/gme/obs
FTP2=ftp://smart:smart@SM/../../smart/editor/dwd/tre
FTP3=ftp://smart:smart@SM/../../smart/editor/dwd/gme/htp


вопрос только - каким образом организовать цикл, и как там расписать, чтобы в каждом проходе брались ноые по нумерации переменные,
 и чтобы цикл отрабатывал по числу блоков переменных, а потом заканчивался, либо, начинал опять всё с начала почле небольшой паузы?
wisedraco ★★
() автор топика
Ответ на: комментарий от Bootmen

типа того. борюсь и пытаюсь понаделать резервирований систем и автомтики на скриптах, сильно ненравится мне когда звонят ночью или в выходные... :D

wisedraco ★★
() автор топика
Ответ на: комментарий от wisedraco

Сочувствую. Меня тоже задрало немного (за полгода) внедрение bufr.

:)

Bootmen ☆☆☆
()

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

Вопросы следующие, просто чтобы понять что именно хочется сделать:

  • Исходные файлы лежат на одном хосте или как-то распределены между несколькими?
  • Файлы нужно отправить на один хост-получатель или на несколько? Нужно ли их как-то хитро распределять между получателями?
  • Хост-получатель находится в одной сети с отправителем? Нужно ли заботиться о безопасности передачи данных?
  • Каков объем файлов, который нужно пересылать и как часто нужно проводить синхронизацию директорий на получателе и отправителе?
  • Нужно ли будет в перспективе как-то модифицировать это решение? (менять наборы копируемых файлов у разных пользователей, модифицировать права доступа к ним, будет ли меняться количество хостов куда нужно будет складывать копии с мастера и т.д.)
  • Есть ли возможность поставить дополнительное ПО на хостах, между которыми осуществляется резервное копирование?

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

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

На первый взгляд похоже что для решения задачи вполне мог бы подойти rsync, если ты уточнишь особенности задачи (см. мои вопросы выше), то возможно я смогу предложить что-то более конкретное чем общие идеи.

charioteer
()
Ответ на: комментарий от charioteer

припветствую! Спасибо, что откликнулся.

стори не про резервное копирование, и правка скрипта будет ок. допсофт ставить - нет, чисто на баше и дефаултными линуксовскими утилитами.

задача скрипта - брать из дефинированного каталога на локальной машине все файлы что там есть, и по фтп заливать на дефинированный хост с путём.

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

для некоторых каталогогв файлы надо отправлять не на один фтп, а на 2 или 3, да, есть такая штука.

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

модифицировать время от времени надо будет.

wisedraco ★★
() автор топика
Ответ на: комментарий от wisedraco

Я тут вдумчиво почитал скрипт в ОП и все-таки попробую предложить альтернативный вариант.

Если я правильно понимаю, речь идет о том, чтобы иметь несколько синхронизированных копий одной и той же директории (рекурсивное копирование) в разных местах (и возможно на разных серверах). Если это так, то rsync как раз то, что нужно.

стори не про резервное копирование, и правка скрипта будет ок. >допсофт ставить - нет, чисто на баше и дефаултными линуксовскими >утилитами.

Судя по твоему скрипту, кмк, тебе главное положить копии всех изменившихся файлов в правильную директорию на ftp-сервере и чтобы при этом у файлов на «слейве» были правильные права, чтобы юзеры могли их оттуда забирать по ftp (или что ты там еще разрешаешь им делать конфигом ftp-сервера)

задача скрипта - брать из дефинированного каталога на локальной >машине все файлы что там есть, и по фтп заливать на >дефинированный хост с путём.

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

 rsync -avz /path_to_src_filetree/ user@desthost:/path_to_dest_filetree/ 
# слэши в конце путей нужны, чтобы синхронизировалось все содержимое директорий
# если хочется секурности, то можно это завернуть в ssh, добавив
# -e ssh

Прелесть этой штуки состоит в том, что тебе не надо будет проверять время изменения файлов и директорий в скрипте. Если хотя бы один файл внутри директории менялся, то rsync заменит старые файлы на новые и не тронет остальное (кстати, он умеет работать и в режиме записи в конец файла, что может быть удобно если меняются большие файлы и умеет удалять со слейвов файлы, которые были удалены на мастере). Также очень велик шанс что rsync на твоих машинах у тебя уже есть «из коробки».

which rsync

Таким образом, тебе не надо будет вычислять юниксовые timestamp-ы от начала эпохи и заниматься их вычитанием.

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

каталогогв таких много, и у каждого свой путь заливки, хоть и сам >сервер куда всё это льётся, один. безопасность не важна.

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

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

Попробуй потестировать мое решение просто позапускав его руками в шелле и посмотри как оно работает. Если понравится - то автоматизировать ее совсем не сложно. https://rsync.samba.org/

Если не покатит - попытаюсь подкинуть пару идей по «улучшайзингу» кода в ОП, но это уже завтра.

charioteer
()
Ответ на: комментарий от charioteer

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

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

wisedraco ★★
() автор топика
Ответ на: комментарий от Bootmen

Выполнение через cron чреватповторным запуском скрипта. Например : скрипт не успел перекинуть файл по фтп из за глюков сети, а тут запускается еще одна копия скрипта и пошла катавасия...

Тут поможет lockrun

Bootmen ☆☆☆
()
Последнее исправление: Bootmen (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.