Модулна система за действия в PC Suite режим при Nokia N900
Владимир | 03/20/2011Както знаете а може би не знаете аз съм горд собственик на Nokia N900 и даже съм понаписал няколко статии за това устройство. Една от първите причини да си закупя тази играчка беше, че е нещо доста повече от телефон. По-скоро се класира като таблет който даже има и телефон в него. Първата сериозна модификация която му направих беше да го науча да използва USB за интернет което си е голяма благинка. Хем играчката има интернет, хем се и зарежда :).
Както съм описал в статията налага се да се попипне тук там за да може да се вдигне мрежов интерфейс на се осигурят рутинг и други дреболийки.
С оглед на бъдещето реших да модифицирам две парчета от решението, за да може в бъдеще по-лесно и по-логически да добавям нови функционалности.
Идеята
Всички знаем че монолитните парчета код не че пречат, но са трудни за управление и търсене на проблеми. Ако си изградим модулна система за изпълняване на парчета код ще имаме по лесен начин за добавяне/премахване на функционалност и като следствие от това по-лесно управление на устройството.
Днес ще модифицираме кода в /usr/sbin/pcsuite-enable.sh и /usr/sbin/pcsuite-disable.sh за да може да изпълнява множество скриптове.
Идеята за реализацията идва от начина по който стандартните командни обвивки в Linux зареждат променливи при стартиране.
Реализация – pcsuite-enable.sh
В оригиналната статия имаме следното парче код
При избиране на PC-Suite mode от менюто при включване се изпълнява скрипта /usr/sbin/pcsuite-enable.sh. За да активираме автоматично интерфейса трябва да добавим в края му необходимите ни команди. Намерете секцията:
kill -USR1 $SYNCD_PID logger "$0: sent SIGUSR1 to syncd" exit 0и я заменете с:
kill -USR1 $SYNCD_PID logger "$0: sent SIGUSR1 to syncd" ifup usb0 echo "nameserver 8.8.8.8" >> /etc/resolv.conf echo "nameserver 8.8.4.4" >> /etc/resolv.conf exit 0
Вместо да пишем директно във файла там ще добавим малък цикъл който да проверява на друго място дали има файлове и да ги включва в кода автоматично. Също така и ще оправим един малък бъг. Както забелязвате от кода мрежата се стартира след като демонът за синхронизация е информиран, че се е случило нещо. Следствието от това е, че демонът няма мрежа и не изпълнява синхронизация. Нашето парче код ще бъде преместено над него за да може да си свършим цялата работа и да имаме мрежа когато демонът е информиран.
Новият ни код изглежда по следният начин
## Modular actions on PCSuite Enable
if [ -d /etc/pcsuite/enable ]; then
for i in /etc/pcsuite/enable/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
## Modular actions end
exit 0
Какво прави това парче код
Проверява дали съществува директория /etc/pcsuite/enable и за всеки файл в нея който има разширение *.sh ако може да бъде прочетен го включва в скрипта.
Съответно за да възстановим старата функционалност в директорията /etc/pcsuite/enable създаваме 2 файла
/etc/pcsuite/enable # ls -l
-rw-r–r– 1 root root 160 Mar 20 12:07 00-bring-usb-network-up.sh
-rw-r–r– 1 root root 103 Mar 20 12:17 99-invoke-syncd.sh
Със следното съдържание
00-bring-usb-network-up.sh
# Bring up USB networking so device can leech net from PC ifup usb0 echo "nameserver 8.8.8.8" > /etc/resolv.conf echo "nameserver 8.8.4.4" >> /etc/resolv.conf
99-invoke-syncd.sh
# Restore removed func from pcsuite-enable.sh kill -USR1 $SYNCD_PID logger "$0: sent SIGUSR1 to syncd"
Избрали сме да използване цифрови префикси за по лесно подреждане на модификациите. Може да се окаже че някоя модификация изисква други модификации да са свършили преди нея и по този начин най-лесно постигаме това.
Реализация – pcsuite-disable.sh
В оригиналната статия имаме следното парче код
При изваждане на USB кабела автоматично се изпълнява скрипта /usr/sbin/pcsuite-disable.sh където и ще добавим нашите инструкции за автоматично спиране на интерфейса.
Намерете секцията:logger "$0: do nothing to pass USB certs" exit 0и я заменете с:
logger "$0: do nothing to pass USB certs" ifdown usb0 echo "nameserver 127.0.0.1" > /etc/resolv.conf exit 0
Това парче ще модифицираме по аналогичен начин
logger "$0: do nothing to pass USB certs"
## Modular actions on PCSuite Disable
if [ -d /etc/pcsuite/disable ]; then
for i in /etc/pcsuite/disable/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
## Modular actions end
exit 0
Какво прави това парче код
Проверява дали съществува директория /etc/pcsuite/disable и за всеки файл в нея който има разширение *.sh ако може да бъде прочетен го включва в скрипта.
Съответно за да възстанивим старата функционалност създаваме файла 99-bring-usb-network-down.sh със следното съдържание
99-bring-usb-network-down.sh
# Bring down and cleanup USB networking ifdown usb0 echo "nameserver 127.0.0.1" > /etc/resolv.conf
В заключение
По този прост начин си сътворихме система за модулно, и до известна степен със зависимости изпълнение на модификации. Освен това получихме лесен начин за управление на модификациите. АКо нещо не нии трябва просто го махнете от директорията или го преименувайте примерно на *.sh.inactive
Е надявам се да ви е било полезно




[...] Редакция: Променен е начина на изпълнение за вдигане на USB интерфейса за да позволи модулно изпълнение на модификации [...]
[...] За да изпълним нашата задача ще създадем малък скрипт който да се изпълнява при включване в режим PC Suite, който да променя режима на синхронизация на винаги на линия. Скриптът ни ще запазва старите стойности за да може при изключване да ги възстановим. Съответно ще напишем и скрипт който при изключване ще възстановява старите стойности. Ще се възползване от предишаната статия за модулно изпълнение на скриптове при включване/изключв…. [...]