запускается дополнительный скрипт /jffs/etc/stop завершающий работу программ на HDD
А можно сей скрипт в студию?
Ну вообще мой скрипт не образец для повторения, он завершает только заданные программы, в нем наверняка сделано что-то неправильно, не спец я по linux, тем не менее, это скрипт выполняет поставленную перед ним задачу.
Где то в одной из соседних тем пробегал скрипт завершающий любые программы.
Code:
#!/bin/sh
#==завершаем работу transmission
killall transmission-daemon
#=========stop samba============
if [ -n "`pidof smbd`" ] ; then
echo "Stopping smbd:"
killall smbd
fi
if [ -n "`pidof nmbd`" ] ; then
echo "Stopping nmbd:"
killall nmbd
fi
#==========stop xinetd==========
OPTWARE_TARGET=ddwrt
killall xinetd 2>/dev/null
# Stop other inetd processes if running
if [ ${OPTWARE_TARGET} = "nslu2" ] ; then
killall inetd 2>/dev/null
fi
#===============================
#Ожидаем остановки процесса 1.5 минуты, если не завершился прибиваем
name="transmission-daemon"
wait=90
i=0
while [ -n "`pidof -s $name`" ]
do
if [ "$i" -gt "$wait" ]
then
echo "Process $name is not stopped for $wait seconds"
killall -9 $name #эта команда не проверялась
break
fi
let "i++"
sleep 1
done
#==================
sleep 1
unset LD_LIBRARY_PATH
Чуть доработал скрипт, может кому пригодиться
Смысл доработок:
1. Проверяем кнопку каждую секунду, но после проверяем через 3 сек, что позволяет коротким нажатием выключать Wifi (правда при длинном он тоже переключается... но это меньшее зло )
2. Если диски отключены, то скрипт подключает их и запускает стартап скрипт optware (зажигает синюю лампу)
3. Чуть больше индикации - в конце при успехе короткий того же цвета
(while sleep 6
do
if [ $(($(printf "%d" "'`dd if=/dev/gpio/in count=1 2>/dev/null`")&64)) -eq 0 ]
then
sleep 3;
if [ $(($(printf "%d" "'`dd if=/dev/gpio/in count=1 2>/dev/null`")&64)) -eq 0 ]
then
if [ `/bin/df | /bin/grep -c 'part'` -ne 0 ]
then
gpio disable 3
/jffs/etc/stop
umount /jffs
sleep 1;gpio enable 3
if [ `/bin/df | /bin/grep -c 'part'` -ne 0 ]
then
sleep 1;gpio disable 4;sleep 1;gpio enable 4
sleep 1;gpio disable 4;sleep 1;gpio enable 4
else
gpio disable 3
sleep 1;
gpio enable 3
fi
else
gpio disable 4;sleep 3;gpio enable 4
mount -o noatime /dev/scsi/host0/bus0/target0/lun0/part2 /jffs &
mount -o noatime /dev/scsi/host0/bus0/target0/lun0/part3 /mnt
/jffs/etc/config/optware.startup
sleep 1;gpio disable 4;sleep 1;gpio enable 4
fi
fi
fi
done;) &
Использую внешний USB-HDD подготовленный следующим образом: с помощью Paragon HDD Manager 8 на диске созданы три (primary) раздела:
Fat32 (основной);
Ext3 – под JFFS:
LinuxSWAP2;
Основной раздел оставлен в FAT32 с мыслью иметь возможность на ходу отключать USB-HDD от роутера и подключать куда-нибудь ещё. Физический порядок размещения разделов на диске может быть произвольным, однако следует иметь в виду, что dd-wrt автоматически монтирует только один раздел – тот который имеет первый логический номер в таблице разделов (занимает первый слот). Точно также и для сохранения совместимости с Windows (если она нужна) раздел общего назначения должен быть логически первым. Размечая диск обратите на это внимание. Так, например у меня, физическая картина размещения разделов следующая:
Однако с помощью опции главного меню Paragon'а «Change primary Slot» логический порядок разделов установлен таким:
Внимание!Приведённый ниже скрипт рассчитан именно на такой (логический) порядок разделов!
Итак, в настройках роутера (раздел «Services» –> «USB») установлены следующие параметры:
Каталог «Autorun.inf» создан на диске с конкретным умыслом: таким путём можно обезопасить себя (в какой-то степени) от так любимых средой Windows вирусов, норовящих прописать собственный загрузочный файл autorun.inf в корень диска. А тут место уже занято! (Каталог также имеет атрибуты скрытого и системного.)
Как видно, в качестве автостартующего указан скрипт run-on-mount, о котором я и собираюсь рассказать.
Что он делает:
Перед началом любого действия выполняется проверка возможности его выполнить (можете считать меня параноиком );
Монтирует к /jffs 2'й раздел диска;
К /opt подклеивает каталог /jffs/opt (если его нет – создаёт и подклеивает);
Подключает SWAP (если установлен busybox).
Создаёт скрипт action.sesbutton, который следит за боковой кнопкой и предназначен для завершения запущеных с внешнего носителя процессов и отмонтированию разделов – т.е. для безопасного извлечения USB-носителя. Помещает этот скрипт в /tmp/etc/config;
Создаёт скрипт, который перемонтирует /mnt с параметром noatime и исполняет его.
Если в процессе выполнения какие-то этапы не выполняются, коротко вспыхивает красный светодиод боковой кнопки;
Если процесс монтирования был успешно завершён на 2 секунды зажигает синий светодиод боковой кнопки (красный при проблемах). Это также сигнал готовности.
Собственно текст скрипта run-on-mount (он же в ZIP'е во вложении к этому посту):
Code:
#!/bin/sh
# +-----------------------------------------------------+
# | All value actually for D-Link DIR-320 |
# +-----------------------------------------------------+
#
# Red spark('s) in process - error('s).
Red=3 # gpio pin num. of RED SES LED
Blue=4 # gpio pin num. of BLUE SES LED
t=100000 # time interval in micro- s. (for short, "spark" LED light)
T=2 # Time interval in s. (for long LED light & pause's)
NAS="part1" # USB-HDD partition for file storage (ftp, torrent, samba)
JFFS="part2" # USB-HDD partition for Journaing File System - must be Ext3
SWAP="part3" # USB-hdd partition for SWAP - must be Linux SWAP[2]
# <On> SES LED function
sledon()
{ gpio disable $1; }
# <Off> SES LED function
sledoff()
{ gpio enable $1; usleep $t; }
# Onse spark of SES LED
blink()
{ sledon $1; usleep $t; sledoff $1; }
# Turn <Off> RED and BLUE SES LED's
sledoff $Red& sledoff $Blue&
# Check mount point AND exlude double-mount of /jffs
if [ -d /jffs -a ! -d /jffs/lost+found ];
then mount -o noatime /dev/discs/disc0/$JFFS /jffs;
else blink $Red;
fi;
# Check mount of /jffs and automatically create /opt
if [ -d /jffs/lost+found -a ! -d /jffs/opt/ ];
then mkdir -p /jffs/opt/usr;
fi;
# Check mount point AND exlude double-mount of /opt
if [ -d /opt -a -d /jffs/opt -a ! -d /opt/usr ];
then mount -o bind /jffs/opt /opt;
else blink $Red;
fi;
# Initialize SWAP if installed busybox
if [ -f /opt/bin/busybox ];
then /opt/bin/busybox swapon /dev/discs/disc0/$SWAP;
else blink $Red;
fi;
# Create /tmp/etc/config
if [ ! -d /tmp/etc/config ];
then mkdir /tmp/etc/config;
Else blink $Red;
fi;
# +-----------------------------------------------------+
# | Make /tmp/root/re-mount eXecutable & Run it |
# | In end-of action SES LED turn <On> at 2 s. |
# | BLUE - if sucess ALL mount, RED - if not. |
# +-----------------------------------------------------+
if [ -f /tmp/root/re-mount ];
then chmod +x /tmp/root/re-mount;
# +-----------------------------------------------------+
# | Uncomment next command if you want check creating |
# | of 're-mount' |
# | (script will copied to /mnt/Autorun.inf) |
# +-----------------------------------------------------+
cp /tmp/root/re-mount /mnt/Autorun.inf;
/tmp/root/re-mount&
else blink $Red;
fi
В результате своей работы скрипт создаёт два других скрипта (для контроля и отладки он может копировать также обратно в /mnt/Autorun.inf): /tmp/root/re-mount:
Code:
#!/bin/sh
sledon()
{ gpio disable $1; }
sledoff()
{ gpio enable $1; }
umount -l /mnt;
if [ ! -d /mnt/Autorun.inf ];
then mount -o noatime /dev/discs/disc0/part1 /mnt
else sledon 3; usleep 100000; sledoff 3;
fi;
if [ -d /opt/usr -a -d /jffs/lost+found -a -d /mnt/Autorun.inf ];
then sledon 4; sleep 2; sledoff 4;
else sledon 3; sleep 2; sledoff 3;
fi;
И /tmp/etc/config/action.sesbutton скрипт (функциональность переключения Wi-Fi я не то чтобы совсем пожертвовал, просто ещё не научился как это сделать ):
Posted: Fri May 29, 2009 14:41 Post subject: Вдогонку,: скрипт для установки op
Вдогонку.
Небольшой скрипт для установки optware по стандартной, описанной в wiki методике (лежит у меня рядом с run-on-mount'ом в Autorun.inf) Он же устанвливает и расширенную версию busybox'а, необходимую для запуска SWAP-раздела.
Скрипт optware:
Code:
#!/bin/sh
# Install optware
wget http://www.3iii.dk/linux/optware/optware-install-ddwrt.sh -O - | tr -d "\r" > /tmp/root/optware-install.sh
if [ -f /tmp/root/optware-install.sh ];
then chmod +x /tmp/root/optware-install.sh;
echo ;
echo "****************************** List of /tmp/root ******************************";
echo ;
ls -l /tmp/root;
echo "*******************************************************************************";
echo ;
echo "******************************* Install optware *******************************";
echo :
/tmp/root/optware-install.sh;
echo ;
echo "******************************** List of /opt *********************************";
echo ;
ls -l /opt;
echo "*******************************************************************************";
echo ;
fi
if [ ! -f /opt/bin/busybox ];
then /opt/bin/ipkg-opt update;
echo ;
echo "****************************** Install BusyBox *******************************";
/opt/bin/ipkg-opt install busybox;
fi
Posted: Sat Jun 27, 2009 11:13 Post subject: индикатор принтера
А сообразит ли кто-нибудь скрипт, зажигающий индикатор принтера на DIR-320 при его подключении (usblp0:) и гасящий при отключении?
А то на оригинальной прошивке работает, на DD-WRT (v24-sp2 (06/22/09) mini-usb-ftp - build 12360M NEWD Eko) - нет.
Вот своял маленький скриптик,для вывода на веб страницу кучи полезной инфы о роутере (иногда полезно бывает),требования:любой веб сервер с поддержкой cgi.При желании можете дописать туда что то свое.
#!/bin/sh
# +-----------------------------------------------------+
# | All value actually for D-Link DIR-320 |
# +-----------------------------------------------------+
#
# Red spark('s) in process - error('s).
Red=3 # gpio pin num. of RED SES LED
Blue=4 # gpio pin num. of BLUE SES LED
t=100000 # time interval in micro- s. (for short, "spark" LED light)
T=2 # Time interval in s. (for long LED light & pause's)
NAS="part1" # USB-HDD partition for file storage (ftp, torrent, samba)
JFFS="part2" # USB-HDD partition for Journaing File System - must be Ext3
SWAP="part3" # USB-hdd partition for SWAP - must be Linux SWAP[2]
# <On> SES LED function
sledon()
{ gpio disable $1; }
# <Off> SES LED function
sledoff()
{ gpio enable $1; usleep $t; }
# Onse spark of SES LED
blink()
{ sledon $1; usleep $t; sledoff $1; }
# Turn <Off> RED and BLUE SES LED's
sledoff $Red& sledoff $Blue&
# Check mount point AND exlude double-mount of /jffs
if [ -d /jffs -a ! -d /jffs/lost+found ];
then mount -o noatime /dev/discs/disc0/$JFFS /jffs;
else blink $Red;
fi;
# Check mount of /jffs and automatically create /opt
if [ -d /jffs/lost+found -a ! -d /jffs/opt/ ];
then mkdir -p /jffs/opt/usr;
fi;
# Check mount point AND exlude double-mount of /opt
if [ -d /opt -a -d /jffs/opt -a ! -d /opt/usr ];
then mount -o bind /jffs/opt /opt;
else blink $Red;
fi;
# Initialize SWAP if installed busybox
if [ -f /opt/bin/busybox ];
then /opt/bin/busybox swapon /dev/discs/disc0/$SWAP;
else blink $Red;
fi;
# Create /tmp/etc/config
if [ ! -d /tmp/etc/config ];
then mkdir /tmp/etc/config;
Else blink $Red;
fi;
# +-----------------------------------------------------+
# | Make /tmp/root/re-mount eXecutable & Run it |
# | In end-of action SES LED turn <On> at 2 s. |
# | BLUE - if sucess ALL mount, RED - if not. |
# +-----------------------------------------------------+
if [ -f /tmp/root/re-mount ];
then chmod +x /tmp/root/re-mount;
# +-----------------------------------------------------+
# | Uncomment next command if you want check creating |
# | of 're-mount' |
# | (script will copied to /mnt/Autorun.inf) |
# +-----------------------------------------------------+
cp /tmp/root/re-mount /mnt/Autorun.inf;
/tmp/root/re-mount&
else blink $Red;
fi
Большое спасибо за скрипт (правда в нем есть ошибки такие как
"Else" с большой буквы и "SWAP" вместо "$SWAP" , зато так интересней что то типа квеста, не прошел красный, прошол синии )
Но одну ошибку я всетаки вычислить не могу(((
Если в консоли вбить reboot или из морды перезагружать то всеравно мигает два раза быстро красным и один потом синим (типа нормуль все)
Я уж весь скрипт излазил нихрена не нашел
Автор подскажи, так надо ?
А самое то главное я из этого скрипта трансмишн стартануть не могу (тоесть в одном варианте стартанул но почемуто как будто не из под пользователя root и он создал еше один свой конфиг в папке /opt/etc)
Из морды стартует как надо
Из консоли вручную тоже как надо а из скрипта run-on-mount и любого другого запущеного из run-on-mount нет((( зато потом если вручную запускать то да
Вообщем хочется чтоб трансмишн запускался при монтировании hdd без перезапуска каробочки и без ручного запуска
З.Ы. Кстати забыл написать что скрипт run-on-mount у мну только с 3 секундной задержкой (sleep 3) корректно отрабатывает (мож поможет кому)
Я тут переписал стартовые скрипты нафиг, ввиду изменившихся условий. Могу выложить, если интерес есть.
Теперь у меня так:
отдельно стартовый run-on-mount;
отдельно стоповый action.sesbutton;
отдельно стартовый для сторонних приложений transmission – первый и единственный из них [пока];
отдельно скрипты дляустановкиoptware и transmission'а
По поводу запуска transmission'а - сделай стартовую задержку в ~25 секунд – будет тебе ЩАСЬЕ.
Я тут переписал стартовые скрипты нафиг, ввиду изменившихся условий. Могу выложить, если интерес есть.
Теперь у меня так:
отдельно стартовый run-on-mount;
отдельно стоповый action.sesbutton;
отдельно стартовый для сторонних приложений transmission – первый и единственный из них [пока];
отдельно скрипты дляустановкиoptware и transmission'а
По поводу запуска transmission'а - сделай стартовую задержку в ~25 секунд – будет тебе ЩАСЬЕ.
Интерес есть и в виду этого попросил бы вас выложить скрипты для ознакомления Заранее спасибо