نمونه مستند سازی شده - Speedtouchconf
این اسکریپتی است که من نگهداری میکنم و برای پیکربندی یک مودم Alcatel SpeedTouch به کار میرود. اگر واقعاً میخواهید از اسکریپت استفاده کنید به آدرس http://speedtouchconf.sourceforge.net/ بروید. این صفحه فقط در مورد مستندسازی آن ، و نشان دادن سبکهای خوب و بد در کدنویسی است.
توجه نمایید که کد به صورت <PRE> میباشد، بنابراین، ممکن است لازم باشد در مرورگرتان، برای دیدن توضیحات، به نسبت کیفیت وضوح نمایشگر و اندازههای فونتها به چپ و راست مرور کنید،
. تغییر اینها برای کار در نمایشگرهای کوچکتر به معنی تغییر خود کد نیز میباشد،که مورد اشاره این تمرین نیست. اگر شما نمیتوانید وضوح تصویر نمایشگر خود راافزایش بدهید، میتوانید کاهش اندازه فونت monospace متن آرایش نشده را امتحان کنید.
من نباید به زور تمام این یادداشتها را در داخل خود اسکریپت ضبط میکردم ، اسکریپتی مانند این فقط باید توسط کسی که آماده فهمیدن چگونگی کارکرد آن میباشد، ویرایش شود، این توضیحات برای مقاصد آموزشی است، و به قصد کمک به ویرایش این اسکریپت خاص نمیباشد.
کد | توضیحات |
---|---|
#!/bin/bash # (c) Steve Parker, 17 Oct 2002 # steve at steve dash parker dot org # Released under GPL version 2 (http://www.gnu.org/copyleft/gpl.html) # This program is free software; you can redistribute it and/or modify # it under the terms of Version 2 of the the GNU General Public License # as published by the Free Software Foundation. Any later versions of # the GPL will be evaluated as they are released, and this software may # or may not be re-released under those terms also. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # See the included file COPYING for more details. # SpeedTouch Configuration for Alcatel USB Modem | The GPL license requires this boilerplate. |
# Tested on RedHat 8.0 with BT OpenWorld by Steve # Tested on Mandrake 9.0 with BT OpenWorld by Steve # Updated 29 Oct 2002 to create a log file for diagnosis. # Updated 21 Nov 2002 to list Singapore Pacificnet VPI/VCI pair. # Updated 25 Nov 2002 to use "tar -xzf" not "tar xzf" as one user reported problems. # Also added a web page (http://www.japarker.btinternet.co.uk/speedtouch/) # Updated 03 Dec 2002 - moved to http://speedtouchconf.sourceforge.net/ # btinternet.co.uk site deprecated. # Updated 05 Dec 2002 - creates symlink to /etc/ppp/resolv.conf to fix DNS problems. # Also includes speedtouch-1.1.tar.bz2, accepts microcode in current directory as # speedmgmt.tar.gz, mgmt.o, or alcaudsl.sys. Therefore no need to edit the script. # Updated 07 Dec 2002 - fixed a bug that it couldn't find the tarball. # Updated 17 Dec 2002 - added uname -a to logfile, added tests for gcc, make # Updated 23 Dec 2002 - specified GPLv2 after reading http://www.infoworld.com/articles/hn/xml/02/11/06/021106hngnudelay.xml?s=IDGNS # Version 08 Jan 2003 missing a "fi" - fixed 15/1/2003 # 16 Jan 2003 - fixed another stupid bug. # 19 Jan 2003 - Actually did some decent testing, and got it working again. Also added a comment about the timeout messages. # 20 Jan 2003 - Just some extra checks. # 23 Feb 2003 - Allows for init.d being /etc/init.d/ or /etc/rc.d/init.d # Also some basic checks for the kernel-level driver. First tidy-up of the kernel testing code, too. # 07 Mar 2003 - Some SuSE (LSB) tidyups; skip debian-specific notes for non-debian users # 11th August 2003 - Changed to stop if gcc/make/etc are not installed. Also bundled the 1.2beta2 driver. # 18th August 2003 - Tidied up the output a little bit to make it clearer. # 9th September 2003 - Fixed speedtouch-init for RedHat 9 # 11th September 2003 - Added 2.6 support; tidied up the kernel checks a bit. | همواره یک فایل تغییرات ضمیمه کنید - این کار به خودتان و همچنین هرفرد دیگری کمک خواهد نمود. اگر شخصی با یک مشکل با شما تماس بگیرد، شما میتوانید به سادگی کنترل کنید که چه وقت اتفاق افتاده، و ببینید که نگارش جدیدترآن مشکل را برطرف میکند.
من همچنین در اینجا اشاره میکنم که کدام توزیع ها گزارش کردهاند که کار کرده است - به نظر میرسد در اکثر توزیع ها کار میکند -لیندوز، دبیان، ردهت، ماندریک، سوزه، وغیره. |
VERSION=11.09.2003 # Location of Log File (send me this file if you need help diagnosing problems) LOGFILE=/tmp/speedtouch.txt # Quiet compilation (recommended) QUIET=YES # Speedtouch (speedtouch.sf.net) version SPEEDTOUCH=speedtouch-1.1 MODEM_RUN=/usr/local/sbin/modem_run PATH=/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$PATH PPPD=pppd UNAME=uname LSPCI=lspci # Only tested with PREFIX=/ PREFIX="/" | تنظیم برخی متغیرهای ظاهراً کم استفاده، در ابتدای اسکریپت، مفید است، این به آن معنی است که میتوانید به سادگی چیزی را یکبار و فقط یکبار تغییر دهید.
همچنین درگیری با خطاهای تایپی را آسانتر میکند - در زبان غیر ترجمهای، برخی خطاها برای پیگری ، میتوانند نیرنگآمیز باشند. همچنین توضیح هرکدام همراه با مقصود از آن. همچنین قرار دادن مسیر تا اندازهای که معقول میدانید نیز میتواند سودمند باشد - این اسکریپت انتظار دارد قادر به یافتن کد در /usr/local/sbin باشد، که اغلب به طور پیشفرض در PATH اکثر افراد موجود نمیباشد. با قرار دادن آن در آنجا، میتوانیم ازبسیاری موارد کوچک نامطبوع اجتناب ورزیم. |
همچنین تنظیم متغیری برای شماره نگارش، ایده خوبی است، به این طریق به سادگی میتواند به اسکریپت امکان گزارش شماره نگارش در موقعیتهای مختلف، را بدهید، اما وقتی اسکریپت را به روز میکنید، فقط اول باید آن متغیر را تغییر بدهید. در این حالت، من از تاریخ به عنوان شماره نگارش استفاده میکنم، چون من دلیل تجاری برای نامیدن آن به صورت "8.0" یا "2003 Professional" نداشتهام و من واقعاًمطمئن نیستم که "1.0" به چه معنی است. از طرف دیگر استفاده از تاریخ اینجا در UK عبارت , "11.09.2003" به معنی یازدهم سپتامبر 2003است، ودر امریکا این به معنی نهم نوامبر 2003 است. من کد را در یازدهم سپتامبر 2003 تألیف کردهام و امیدوارم هر کسی بداند که "Sep" یعنی نهمین ماه، میشود , "September", "Septiembre", "Settembre", یا "Septembre". | |
حالا تعریف توابع را شروع میکنیم. خیلی با ارزش است که تا آن جا که ممکن است وظایف را در توابع قراربدهیم، حتی وقتی ( مانند بیشترین اینها ) فقط یکبار به کار میروند.
چند دلیل برای این موضوع وجود دارد، نه تنها کد را مرتبتر میکند، بلکه خواندن و ویرایش آن را سادهتر میسازد . به عنوان مثال، در این اسکریپت مقداری کد برای کار با این واقعیت، که یک ارتقاء(1.2b) درایور مرتبط با مودم جدید (model 330) وجود دارد، اما درایور 1.1 بهتر تست شده است. اگر درایور 1.2 بهبود بیابد، ممکن است احساس شود که فقط از آن استفاده شود . در این روش دانستن آن که چه قسمتی نیاز به تغییر دارد سادهتر است (مدیریت یک اسکریپت 681 سطری میتوانددشوار باشد), و به این معنی است که سایر توابع واقعاً مواظبت نمیشوند. | |
check_err() { if [ "$1" -ne "0" ]; then echo "$2 - FAILED" | tee -a $LOGFILE exit 1 else echo "$2 - SUCCESS" | tee -a $LOGFILE fi } | این یک تابع سودمند کنترل خطاست - این به عنوان check_err $? نامیده شده - چرا درد سر کنترل هر خطای مهلک ، وقتی میتوانید فقط یک تابع، که خطا را ثبت و در مورد مقتضی خارج میشود، را فرابخوانید؟ تابع "tee" خطا را به ترمینال و همچنین فایل لاگ منعکس میکند.
|
check_330() { echo echo echo "Do you have a SpeedTouch 330 modem? " echo " (If you say Yes, the 1.2beta2 driver will be used;" echo " if you say No, the 1.1 driver will be used)." echo "Please answer Yes or No" read ans a=`echo $ans | awk '{ print $1 }' | cut -c1 | tr '[A-Z]' '[a-z]'` if [ "$a" == "y" ]; then SPEEDTOUCH=speedtouch-1.2-beta2 fi echo "Using $SPEEDTOUCH" echo echo } | این فقط یک سؤال ساده میپرسد، و متغیر SPEEDTOUCH را نسبت به پاسخ به روزرسانی میکند. سطر awk/cut/tr فقط کاراکتر اول ورودی را میگیرد و به حرف کوچک تبدیل میکند( این روش مطمئن است، به طوریکه میدانم ابزار tr گنو میتواند این را انجام دهد ) و کنترل میکند که آیا کاربر گفته "y" . |
check_config() { # Check we're on Linux $UNAME -a >> $LOGFILE $UNAME -a|grep -qi Linux if [ "$?" -ne "0" ]; then echo "Sorry, this script only supports the GNU/Linux operating system." echo "FreeBSD support is planned for the distant future." echo "If you want to help support of another OS, please contact me at" echo "steve at steve-parker dot org" exit 1 fi |
این تابع کنترل میکند که آیا ماشین آماده پیکربندی مودم میباشد - قبل از این که کار را شروع کنید، این کنترل ارزشمندی است. |
required_files_installed=1 type $LSPCI > /dev/null 2>&1 if [ "$?" -ne "0" ]; then # Try Mandrake's name for it... why do they have to rename core utilities? LSPCI=lspcidrake fi # Check we can find our required binaries for required_binary in $PPPD $LSPCI $UNAME tar cp rm gcc make mkdir ls cat chown chmod read ping ifconfig do type ${required_binary} > /dev/null 2>&1 if [ "$?" -ne "0" ]; then echo "Error: Cannot find ${required_binary}. Please check" echo "the PATH environment variable, and that you are running" echo "as root. Your PATH variable is currently:" echo $PATH echo "Error: Cannot find ${required_binary} in $PATH" >> $LOGFILE required_files_installed=0 fi done | این اسکریپت فایلهای متنوعی احتیاج دارد، لازم است کنترل کنیم که وجود دارند(تمام توزیع های نصب شده لینوکس شامل تمام اینها نمیباشند )بنابراین با ارزش است، قبل از اینکه در نیمه راه آن را انجام دهیم، با کنترل آن که همه چیز درست کار میکند، وقت اشحاص را ذخیره کنیم. |
# Flag for speedmgmt or speedtch in use... alcatel_inside=0 for unrequired_files in /usr/sbin/speedmgmt do if [ -f ${unrequired_files} ]; then echo "You have the Thomson drivers installed." echo "These are not required by this speedtouch usermode driver." ps -eaf|grep -w speed[m]gmt > /dev/null 2>&1 if [ "$?" -eq "0" ]; then echo "The Thomson speedmgmt driver seems to be running." echo "Please \"pkill speedmgmt\" driver before proceeding." alcatel_inside=1 else echo "Fortunately, the Thomson speedmgmt daemons" echo "does not appear to be running." fi fi done lsmod | grep -w "^speedtch" > /dev/null 2>&1 if [ "$?" -eq "0" ]; then echo "The kernel speedtch module is loaded. This is not" echo "compatible with the speedtouch usermode driver." echo "Please \"rmmod speedtch\" before running speedtouchconf.sh." alcatel_inside=1 fi if [ "$alcatel_inside" -ne "0" ]; then exit 1 fi |
دو ناسازگاری درایوری برای این دستگاه وجود دارد( یکی از Thomson، یکی در توسعه 2.5 کرنل ) - اکثر اسکریپتها پیشنیازهای تشخیص آنها را دارند.
آنها را قبلاً با فرض آن که با آنها روبرو شدهاید، کنترل کنید. شما فقط یکبار کد را مینویسید، اگر ۱۰۰ نفر کد را به کار ببرند، صرف یک ساعت وقت شما، ذخیره ۱۰۰ ساعت وقت دیگران است. در اجرای درازمدت، وقت شما نیز - در گزارش اشکالها - ذخیره میشود. این دو کنترل بعد از آن که افراد با مشکلات با من تماس گرفتند، اضافه شدند. پس از افزودن این تستها من از هیچکس نشنیدهام که با این مشکل روبرو شده باشد -احتمالاً پس از آن هیچکس مشکل نداشته، یا آنها قادر بودهاند خودشان آن را برطرف نمایند. |
# Assume /etc/ppp exists mkdir -p /etc/ppp > /dev/null 2>&1 | به وجود دایرکتوری /etc/ppp احتیاج دارد - اگر میتوانید یک مشکل را به آسانی رفع کنید، فقط آن را بررسی نکنید. |
if [ "$PREFIX" != "/" ]; then echo "Using prefix of $PREFIX - note that this is untested!" mkdir -p $PREFIX 2>/dev/null fi | من وقتی شروع به نوشتن این اسکریپت کردم این متغیر را این جا گذاشتم - اگر با سولاریس ردهت آشنا هستید، به ترتیب فکر کنید JumpStart، یا KickStart. من هیچ تست نکردهام، گر چه، چنین هشدار دادم. یک «ویژگیآینده» برای حالتی که به آن احتیاج شود، میباشد. گذاشتن چنین چیزهایی در آغاز، سادهتر از پاشنهکشیدن بعدی برای آنهاست. |
# Check for microcode in speedmgmt.tar.gz, mgmt.o, alcaudsl.sys if [ -f speedmgmt.tar.gz ]; then echo "Using speedmgmt.tar.gz for microcode" tar xzf speedmgmt.tar.gz MICROCODE=/etc/ppp/mgmt.o cp mgmt/mgmt.o $MICROCODE rm -rf mgmt else if [ -f mgmt.o ]; then echo "Using mgmt.o for microcode" MICROCODE=/etc/ppp/mgmt.o cp mgmt.o $MICROCODE else if [ -f ALCAUDSL.SYS ]; then cp ALCAUDSL.SYS alcaudsl.sys fi if [ -f alcaudsl.sys ]; then echo "Using alcaudsl.sys for microcode" MICROCODE=/etc/ppp/alcaudsl.sys cp alcaudsl.sys $MICROCODE else echo "ERROR: Cannot find microcode" | tee -a $LOGFILE echo "Please place a copy of the Microcode in this directory." echo "This could be :" echo " - the speedmgmt.tar.gz file from http://www.speedtouchdsl.com/dvrreg_lx.htm" echo " - mgmt.o from speedmgmt.tar.gz" echo " - alcaudsl.sys from the Windows software (Eg C:\\WINDOWS\\SYSTEM\\ALCAUDSL.SYS)" echo "Due to the license, you must obtain this file for yourself." exit 3 fi fi fi |
این مودم به یک فایل از تولید کننده نیاز دارد، که قبل از اینکه بتوانید از آن استفاده کنید، باید به داخل مودم بارگذاری شود، مجوز آنها مرا از توزیع آن همراه با اسکریپت منع میکند - هر کاربر باید آن را برای خودش تهیه کند. به این دلیل، دستورالعملهای اسکریپت میگوید آن را به این یا آن شکل در همان دایرکتوری که اسکریپت هست قرار بدهید.
حالا شما کنترل کنید که یکی از این فایلها حاضر باشد. ما از متغیر عمومی $MICROCODE استفاده میکنیم، زیرابه طور واقعی نمیدانیم کدام فایل موجود است، فقط برای برنامه speedtouch.sf.net لازم است، وجود داشته باشد.در اولین نمونه، فایل آرشیو (speedmgmt.tar.gz) دارای فایل mgmt/mgmt.o میباشد، دومی برای آن است که اگر کاربر فایل mgmt.o را فراهم نموده باشد، و سومی برای حالتی که اگر کاربر یا فایل ALCAUDSL.SYS یا alcaudsl.sys (فایل ویندوز ) را فراهم کرده باشد - درایور میتواند هریک از اینها را استفاده کند، ما فقط به شناسایی وانتقال آنها نیاز داریم. |
# Check for speedtouch.sf.net tarball if [ -f ${SPEEDTOUCH}.tar.bz2 ]; then TARBALL=${SPEEDTOUCH}.tar.bz2 type bzcat > /dev/null 2>&1 if [ "$?" -ne "0" ]; then echo "You have supplied the .tar.bz2 version, but do not have bzcat installed." echo "Please download the .tar.gz version from http://speedtouch.sf.net/" echo "or install bzcat on your system." # Do not exit; fall through to .tar.gz fi else if [ -f ${SPEEDTOUCH}.tar.gz ]; then TARBALL=${SPEEDTOUCH}.tar.gz else echo "Cannot find ${SPEEDTOUCH} tarball (tried .tar.gz and .tar.bz2)" | tee -a $LOGFILE exit 1 fi fi echo "Using Tarball $TARBALL" >> $LOGFILE |
این اسکریپت یکی از دو درایور را به کار میبرد - درایور نسخه1.1پایدار، یا درایور نسخه بتا 1.2برای مدل جدیدتر 330. این قسمت از تابع کنترل میکند که فایل مناسب در دسترس باشد. از متغیر اصلی speedtouch-1.1 ، متغیر TARBALL را برای اشاره به فایل واقعی speedtouch-1.1.tar.gz یا
speedtouch-1.1.tar.bz2 تجدید میکند، وابزار مناسب خارج کردن از حالت فشرده ، در دسترس است.
|
FIXME: تغییر مکان این قسمت از این جا به بالای تابع ، get_tarball() با ارزش است - فقط خارج کردن از حالت فشرده و اشاره به دایرکتوری...این است، آن چیزی که بازبینی کد خودتان به طور تفصیلی، میتواند فراهم کند. امیدوارم یک نگارش جدید از اسکریپت، این ویژگی را شامل شود - هرچند، این صفحه احتمالاً، با این نگارش از کد، ثابت میماند. برای وسواس مدرسهای من حدی هست:-) | |
error=0 PPP_VERSION=`$PPPD --version 2>&1 | awk '{ print $3 }'` KERNEL=`$UNAME -r` KERNEL_MAJOR=`echo $KERNEL | cut -d"." -f1,2` KERNEL_MINOR=`echo $KERNEL |sed s/"[a-z]"/"."/g|sed s/"[A-Z]"/"."/g|tr '-' '.' | cut -d"." -f3` TWO_FOUR_OR_NEWER=`echo "$KERNEL_MAJOR >= 2.4" | bc` USB_TYPE=`$LSPCI -v |grep -i usb|grep HCI` if [ "${PPP_VERSION}" == "2.4.0" ] || [ "${PPP_VERSION}" == "2.4.1" ]; then echo " PPP version $PPP_VERSION okay." else echo "PPP Version ${PPP_VERSION} should be 2.4.0 or 2.4.1" | tee -a $LOGFILE error=`expr $error + 1` fi if [ "$TWO_FOUR_OR_NEWER" == "0" ]; then if [ "$KERNEL_MAJOR" == "2.2" ] && [ "$KERNEL_MINOR" -ge "18" ]; then echo "With the 2.2.18 kernel you should get away with $PPP_VERSION" | tee -a $LOGFILE echo "... maybe." | tee -a $LOGFILE else echo "You probably need the HDLC kernel patch n_hdlc.c.diff" | tee -a $LOGFILE error=`expr $error + 4` fi else echo " Linux kernel version ${KERNEL_MAJOR}.${KERNEL_MINOR} okay." fi |
در اینجا متغیر error به عنوان یک نقشه بیت از خطاها به کار رفته - برای فهمیدن نقشه بیتها، تعریف دوم (aka binary) را بخوانید. این به آن معنی است، که میتوانیم چندین خطا را کنترل نموده و همه مشکلات بالقوه را یکباره گزارش کنیم،به جای آن که مردم یک مشکل را تا پیدا شدن مورد بعدی رفع کنند، یک ساعت برای برطرف کردن آن صرف کنید، سپس مشکل دیگری را که آنها نمیتوانند رفع نمایند پیدا کنید. به آنها سرراست بگویید که چه چیزهایی نیاز به تعمیر دارد.بنابراین ما با کنترل نسخه کرنل لینوکسی که آنها اجرا کردهاند، شروع میکنیم. همچنین، ما نسخه PPPیا (pppd) که آنها اجرا کردهاند را کنترل میکنیم، چون این نیز در اینجا با اهمیت است. با نسخه داده شده ما پیآمدهای بالقوه را گزارش میکنیم. تمام این اسکریپت بر مبنای مستندات موجود در SourceForge است، امابرای ذخیره وقت افراد و کاهش زحمت فهمیدن تمام آن، نوشته شده است. بنابراین سیستمهای آنها را کنترل میکنیم و قبل ازاینکه بتوانند از این مودم بدقلق استفاده کنند، هرچیزی که لازم است به روزرسانی شود را میگوییم. |
if [ -z "${USB_TYPE}" ]; then echo "No USB Bus found!" | tee -a $LOGFILE error=`expr $error + 2` fi echo ${USB_TYPE} | grep -q UHCI if [ "$?" -eq "0" ]; then USB_TYPE=UHCI else USB_TYPE=OHCI fi | همین طور هم پس از آن لازم است بدانیم، آنها چه نسخهای از USB در سیستم خود دارند. این به طور سخت گیرانهای لازم نیست، اما میتوانیم بارگذاری ماژول صحیح را امتحان کنیم نماییم. |
FIXME: شاید میتوانستیم فقط هر دو ماژول UHCI و OHCI ، رابدون کنترل برای خطاها، بارگذاری کنیم ( به هر حال کنترل نمیکنیم ) و فرض کنیم که کار خواهد کرد. سادهسازی مسائل EHCI که من فقط امشب شنیدهام و ممکن است رایجتر باشد | |
ls -l /dev/ppp|grep -wq 108 if [ "$?" -ne "0" ]; then cd /dev ./MAKEDEV ppp if [ "$?" -ne "0" ]; then echo "MAKEDEV failed" | tee -a $LOGFILE error=`expr $error + 16` fi fi ls -l /dev/ppp|grep -wq 108 if [ "$?" -ne "0" ]; then echo "/dev/ppp cannot be created, or is not device 108" error=`expr $error + 32` fi |
ما به دستگاه /dev/ppp نیاز داریم، و باید عدد major آن 108 باشد(ls -l نمایش داده میشود) |
if [ "`id -u`" != "0" ]; then echo "You must be logged in as root to use this script" exit 1 fi if [ "$required_files_installed" -eq "0" ]; then echo "Some required files are not installed. Please install these" echo "(from your Linux install media, or the internet) before" echo "you can configure and install the speedtouch software." exit 1 fi echo "--- Environment ---" >> $LOGFILE set >> $LOGFILE echo "--- End of Environment ---" >> $LOGFILE } |
حالا چیزهایی را که یافتهایم کنترل میکنیم: آیا شما کاربر ارشد هستید؟ من مایل هستم این مورد را آخر کنترل کنم، چون وقتی اسکریپت را بررسی میکنم، ترجیح میدهم به عنوان کاربر ارشد نباشم و ریسک نقض پیکربندی جاری وجود نداشته باشد. همچنین کنترل میکنیم که فایلهای لازم موجود باشند، در این حالت لازم است پیغام مناسبی ارائه کنیم، چون احتمالاً شخصی بدون ابزارهای پیشرفته نصب شده، به کمک اضافی احتیاج دارد. |
get_tarball() { echo "$TARBALL" |grep -q "gz$" if [ "$?" -eq "0" ]; then tar -xzf $TARBALL cd `basename $TARBALL .tar.gz` else bzcat $TARBALL | tar -xf - cd `basename $TARBALL .tar.bz2` fi if [ "$PREFIX" != "/" ]; then config="./configure --prefix $PREFIX/usr" else config="./configure" fi echo "Configururing SpeedTouch Driver..." | tee -a $LOGFILE if [ "$QUIET" == "YES" ]; then $config > /dev/null 2>&1 res=$? else $config res=$? fi check_err $res "Software Configuration" echo "Building SpeedTouch Driver..." | tee -a $LOGFILE if [ "$QUIET" == "YES" ]; then make > /dev/null 2>&1 res=$? else make res=$? fi check_err $res "Software Build" echo "Installing SpeedTouch Driver..." | tee -a $LOGFILE if [ "$QUIET" == "YES" ]; then make install > /dev/null res=$? else make install res=$? fi check_err $res "Software Installation" rm -rf /tmp/speedtouch.$$ } |
برای این نسخه اسکریپت لازم است، کاربر فایلهای آرشیو شده مناسب خود را از 3rd-party utility دانلود نماید. ( چون مجوز این برنامه GPL است، اسکریپت GPL من حالا نسخههای مختلف آن را شامل شده است). این تابع سعی میکند دریابد چه نوع فایل tarball را آنها در این دایرکتوری قرار دادهاند - این فایل آرشیو، هم میتواند یک فایل tar.gz یا یک فایل tar.bz2 باشد - متغیر TARBALL قبلاً روی آن تنظیم شده بود. سپس تابع فایل آرشیو را با فرمانهای مناسب استخراج میکند، و سراغ ترجمه کد میرود. برای اجتناب از آزار کاربران، خروجی را به /dev/null ارسال میکند و فقط موفقیت یا شکست را گزارش میکند. این موضوع، مرا به عنوان مؤلف چند بار نیش زده ـ نگارش بعدی اسکریپت خروجی را در /tmp ، دخیره خواهد نمود، به طوری که درصورت عدم موفقیت، اسکریپت افراد را به ارسال خروجی دستور ناموفق به من، هدایت نماید - به آن ترتیب من، نسبت به آن که آنها دوباره به طور دستی آن را انجام داده و خروجی را به من ارسال کنند، بهتر میتوانم مشکل آنها را تشخیص بدهم. |
create_ppp_files() { echo "Creating ppp files in $PREFIX/etc/ppp" >> $LOGFILE cd $PREFIX/etc/ppp mv options options.bak 2>/dev/null cat - > options << EOF #------------------ /etc/ppp/options Beginning ------------- noauth usepeerdns lock noipdefault #------------------ /etc/ppp/options End ------------------ EOF mkdir peers 2>/dev/null cat - > peers/adsl < |
تابع create_ppp_files فایلهای مختلف مورد نیاز را در /etc/ppp/ ایجاد میکند -
وقتی فایلهای سیستم شخص دیگری را ویرایش میکنید، همیشه اول پشتیبان بگیرید! سپس برای ریختن متن در فایل از این ترفند"cat - > file << EOF" استفاده کنید. همچنین اسکریپت نام لاگین و کلمه عبور ISP کاربر را به فایلهایی که احتیاج دارد اضافه میکند. ممکن بود یک کاربر اسکریپت را اجرا نموده و اطلاعات اشتباه وارد کند، و بعد بخواهد دوباره اسکریپت را اجرا نماید، متأسفانه، pppd مقدار اولیه را میخواند و آن را باور میکند، و تا عدم موفقیت ادامه میدهد، زیرا کلمه عبور اشتباه است، حتی با وجود آن که بعد،اطلاعات صحیح در فایل قرار گرفته باشد. برای اجتناب از این مشکل، اما شروع بدون سروکار داشتن با عبارتهای منظم و کاراکترهای ویژه در کلمه عبور (\, *, etc)، بعد از هر سطری که اسکریپت به فایل میافزاید، این متن را اضافه میکنیم: Added by speedtouchconf# . همیشه فقط باید یک سطر در فایل باشد، بنابراین ما با حذف هر سطر speedtouch موجود در فایل آغاز میکنیم ، سپس سطر جدید را ( با امید صحت ) اضافه میکنیم. |
add_line() { grep -q "$1" $3 || echo "$2" >> $3 } | این فقط یک برنامه ساده برای افزودن سطر "$2" به فایل "$3" ، در صورتیکه "$1" از قبل در فایل وجود نداشته باشد، میباشد. این بعداً برای ویرایش فایلهای سیستم استفاده میشود. |
modify_modules_conf() { if [ -f /etc/modules.conf ]; then MODCONF=$PREFIX/etc/modules.conf else MODCONF=$PREFIX/etc/conf.modules fi echo "Original modules.conf: " >> $LOGFILE cat $MODCONF >> $LOGFILE add_line "ppp_generic" "alias char-major-108 ppp_generic" $MODCONF add_line "dev/ppp" "alias /dev/ppp ppp_generic" $MODCONF add_line "ppp_async" "alias tty-ldisc-3 ppp_async" $MODCONF add_line "n_hdlc" "alias tty-ldisc-13 n_hdlc" $MODCONF add_line "ppp_synctty" "alias tty-ldisc-14 ppp_synctty" $MODCONF add_line "bsd_comp" "alias ppp-compress-21 bsd_comp" $MODCONF add_line "ppp-compress-24" "alias ppp-compress-24 ppp_deflate" $MODCONF add_line "ppp-compress-26" "alias ppp-compress-26 ppp_deflate" $MODCONF echo "--- New modules.conf: " >> $LOGFILE cat $MODCONF >> $LOGFILE echo "--- end of new modules.conf" >> $LOGFILE } |
این تابع مستعارها را در صورتیکه از قبل در فایل modules.conf وجود نداشته باشند، به آن اضافه میکند،
تابع قبلی add_line این کار را نسبت به استفاده صریح کنترلهای هرسطر، خیلی آسانتر میکند. توجه کنید که اسکریپت فایلهای قدیم و جدید modules.conf را در فایل ثبت وقایع، منعکس ( cat ) میکند - نگارش بعدی اسکریپت فقط یک مقایسه( "diff" ) از فایلها را انجام میدهد، به طور ویژه، توزیع سوزه، فایلهای بزرگ modules.conf دارد، که فقط فایل ثبت وقایع را برای خواندن دشوار میسازد. |
do_modprobe() { echo "Doing modprobes ... ">> $LOGFILE modprobe ppp_generic | tee -a $LOGFILE modprobe ppp_synctty | tee -a $LOGFILE modprobe n_hdlc | tee -a $LOGFILE modprobe usbcore | tee -a $LOGFILE mount none /proc/bus/usb -t usbdevfs > /dev/null 2>&1 if [ "$USB_TYPE" == "UHCI" ]; then USB_INTERFACE=usb-uhci modprobe usb-uhci | tee -a $LOGFILE if [ "$?" -ne "0" ]; then USB_INTERFACE=uhci modprobe uhci | tee -a $LOGFILE fi else modprobe usb-ohci | tee -a $LOGFILE USB_INTERFACE=usb-ohci fi echo "lsmod output:" >> $LOGFILE lsmod >> $LOGFILE echo "df -k : " >> $LOGFILE df -k >> $LOGFILE } |
تابع do_modprobe ماژولهایی را که ممکن است مورد نیاز باشند، کاوش میکند - اگر ماژولها در نصب موفق نباشند، نگران نمیشود، شاید کرنل به صورت یک پارچه ساختهشدهخانگی، باشد، ماژولها ممکن است از قبل نصب شده باشند، و غیره. همچنین به عنوان یک نگهدارنده این اسکریپت، نگران افرادی که خودشان کرنلهایشان را ترجمه میکنند، نیستم - آنها خودشان میتوانند این مودم را برای خود پیکربندی کنند. به طور عمومی، افرادی که از این اسکریپت استفاده میکنند، توزیعهای لینوکسی که برای هرچیزی از ماژول هااستفاده میکنند،را به کار میبرند، وآن توزیعها برای اینگونه موارد خوب کنترل شده،میباشند. فقط چیزهایی را تست کنید، که میتوانید کاری در مورد آن انجام دهید: اگر یک ماژول مورد نیاز است، نه ترجمه کرنل، که قبلاً بارگذاری نشده و بارگذازی آن ناموفق بوده، بعد موضوع پیچیده دلپذیری است، که یک اسکریپت عمومی مانند این محتمل نیست که به هرحال قادر به کار کردن باشد، و دارنده چنان سیستمی احتمالاً قادر به کشف آن برای آنها باشد. تابع فقط سعی میکند دوباره ماژول xHCI مناسبی را بارگذاری نماید، شاید این زیاده روی باشد. در نهایت، خروجی "lsmod" را به فایل لاگ میفرستد، و دستور "df -k" برای نمایش فایلسیستمهای usb متصل شده به سیستم است. |
select_options() { ans="N" while [ "$ans" != "Y" ]; do echo "***************************************" echo "* *" echo "* Please select your ISP Settings *" echo "* *" echo "***************************************" echo cat - << EOF Country/ISP VPI VCI Belgium, ? 8 35 Denmark, Orang 8 35 France, wanado 8 35 France, ? 8 67 Italy, ? 8 35 Netherlands, ? 8 48 UK, BTopenworld 0 38 UK, Any ISP 0 38 US, BellSouth 8 35 Singapore Pacificnet 0 100 EOF echo "Please type your VPI VCI numbers (eg, 0 38) for UK" read VPI VCI echo "Please enter your ISP Login ID (eg another@hg1.btinternet.com)" read ISP_LOGIN echo "Please enter your ISP Password" read ISP_PASSWORD echo "Settings: " echo " VPI / VCI : $VPI / $VCI" echo " Login : $ISP_LOGIN" echo " Password : $ISP_PASSWORD" echo "Are these correct? (Y/N)" read ans ans=`echo ${ans}N|tr '[a-z]' '[A-Z]'|cut -c1` done echo "VPI: $VPI VCI: $VCI" >> $LOGFILE } |
این تابع اصلی است که با کاربران گفتگو میکند،از آنها سه مورد کلیدی، که برای آنها منحصر به فرد است، میپرسد: ISP آنها، نام کاربری، وکلمه عبور آنها. هنگامیکه چنین اطلاعاتی از کاربر اخذ میشود، همیشه شانس بازبینی و تأیید را به آنها میدهد - حلقه while در این تابع با کنترل متغیر "ans" این کار را انجام میدهد - در ابتدا آن را به مورد مشهودی تنظیم کرده و در پایان از ورودی کاربر خوانده میشود. به این طریق، کاربر میتواند در این بخش،تا موقعی که میخواهد، حرکت کند و ما قبل از آن که پیش برویم و بر اساس ورودی، هرگونه پیکربندی را انجام دهیم، از صحت اطلاعات مطمئن گردیم. |
setup_etc_conf( { CONF=$PREFIX/etc/speedtouch.conf echo "# SpeedTouch Config File" > $CONF echo "# Created by speedtouchconf.sf.net version $VERSION" >> $CONF echo "# The speedtouch rc script assumes /usr/local/sbin is in the path..." >> $CONF echo "# It does a ". /etc/speedtouch.conf", so we can just add it to the PATH here." >> $CONF echo "PATH=\$PATH:/usr/local/sbin" >> $CONF echo "# LOAD_ directives should be 1 for modules, 0 if built into the kernel" >> $CONF echo "LOAD_USBCORE=1" >> $CONF echo "LOAD_USBINTERFACE=1" >> $CONF echo "LOAD_NHDLC=1" >> $CONF echo "# USB Interface - UHCI or OHCI" >> $CONF USB=`echo $USB_TYPE | tr '[:upper:]' '[:lower:]'` echo "DEFAULT_USBINTERFACE=\"${USB_INTERFACE}\"" >> $CONF echo "# Path to microcode (mgmt.o or alcudsl.sys from the official Alcatel drivers" >> $CONF echo "MICROCODE=\"$MICROCODE\"" >> $CONF echo "# modem_run verbosity" >> $CONF echo "VERBOSE=0" >> $CONF echo "# Set this to 1 if you have configured the script" >> $CONF echo "CONFIGURED=1" >> $CONF for rc_dir in /etc/rc.d/init.d /etc/init.d do [ -d "${rc_dir}" ] && break done #cp /usr/local/etc/init.d/speedtouch ${rc_dir} cp ${INITSCRIPT} ${rc_dir}/speedtouch } | برنامه speedtouch از یک فایل /etc/speedtouch.conf استفاده میکند - در این جا آن را مطابق سیستم کاربر تنظیم میکنیم. تنها مورد تفاوت آنها در نوع xHCI USB ونام microcode مورد استفاده آنهامیباشد ( این مودم ها تحت نامهای متنوعی توزیع میشوند ). |
check_resolv_conf() { if [ -f /etc/resolv.conf ]; then mv /etc/resolv.conf /etc/resolv.conf.orig fi cd /etc ln -sf ppp/resolv.conf resolv.conf ping -c1 www.google.com > /dev/null if [ "$?" -eq "0" ]; then echo "Fixed DNS ... it's working!" | tee -a $LOGFILE else echo "Looks like /etc/ppp/resolv.conf is wrong." | tee -a $LOGFILE echo "You need to check the DNS configuration." | tee - a $LOGFILE echo "Look in /var/log/messages to see if DNS was configured." | tee -a $LOGFILE DNS=NOTOK fi } |
این تابع در صورتیکه DNS پیدا نشود، فراخوانی میشود، فایل /etc/resolv.conf برای پیدا کردن DNS استفاده میشود، با یک تنظیم PPP ، باید به فایل /etc/ppp/resolv.conf اشاره کند. اگر فایل /etc/resolv.conf از قبل موجود باشد، pppd آن را تعویض نمیکند، بنابراین ما کنترل میکنیم، اگر موجود بود آن را کنار میگذاریم و لینک را تنظیم میکنیم. سپس دوباره DNS را کنترل میکنیم ومطابق ( رفع عیب شده یا هنوز کار نمیکند ) گزارش میکنیم. |
check_router() { route=`netstat -rn|grep "^0\.0\.0\.0"|awk '{ print $2 }'` if [ ! -z "${route}" ]; then echo "You have a default router : $route (removing it for you!)" | tee -a $LOGFILE route delete default gw $route fi } |
اگر سیستم از قبل مسیریاب پیشفرضی استفاده مینموده، pppd آن را تعویض نخواهد کرد - این به آن معنی است که کاربر میتواند ارتباط بگیرد، اما قادر نخواهد بود بستهها رابه اینترنت ارسال کند یا از آن دریافت نماید. این تابع مسیریاب را از یک سیستم در حال اجرا پاک میکند، امااز نظر پیکربندی ، خیلی وابسته به توزیع است، این به طور درازمدت مشکل را رفع نمیکند: موقعی که کاربر راهاندازی مجدد مینماید، مسیریاب پیشفرض دوباره در آنجا خواهد بود. اسکریپت فقط به کاربر میگوید که خودش آن را برطرف نماید. یک نگارش بعدی از اسکریپت ممکن است با تعدادی از توزیعها برای برطرف کردن بلند مدت این مشکل کار کند، اما کاملا بغرنج است. |
# main script starts here clear echo echo "************************************************" echo "* *" echo "* speedtouchconf.sh by Steve Parker *" echo "* *" echo "* http://speedtouchconf.sourceforge.net/ *" echo "* based on speedtouch.sourceforge.net project *" echo "* *" echo "************************************************" echo echo "If you have any problems with this script, mail me" echo "(steve at steve-parker dot org) with the files" echo "$LOGFILE and /var/log/messages for diagnosis." if [ -f $LOGFILE ]; then mv $LOGFILE ${LOGFILE}.old fi echo "Starting speedtouch.sh script" > $LOGFILE echo "Version ${VERSION}" >> $LOGFILE date >> $LOGFILE echo "Called as $0 from `pwd`" >> $LOGFILE INITSCRIPT=`pwd`/speedtouch-init check_330 check_config if [ "$error" -ne "0" ]; then echo "Not ready to install the software at this time. - code $error" | tee -a $LOGFILE exit 1 fi select_options echo "No further user interaction is required." | tee -a $LOGFILE get_tarball create_ppp_files modify_modules_conf do_modprobe check_router setup_etc_conf echo echo " *** Configuration finished. Starting the connection ***" echo echo "The modem lights should start flashing for 20 seconds..." | tee -a $LOGFILE echo "You may get one or two timeout or USBDEVFS_BULK failed messages" echo "now - ignore them unless there are lots." echo "You will get these messages whenever you connect - it is safe to ignore them." $MODEM_RUN -m -f $MICROCODE res=$? if [ "$res" -eq "0" ]; then echo "Phew! That was the hard part! Should be plain sailing now..." | tee -a $LOGFILE else echo "The modem_run command failed (code $res)- check your kernel config" | tee -a $LOGFILE if [ "$res" -eq "255" ]; then echo " This *may* not be a problem if you've already loaded the microcode" | tee -a $LOGFILE echo " (for example, if you ran this script earlier without powering off" | tee -a $LOGFILE echo " the modem)." | tee -a $LOGFILE fi #exit 1 fi sleep 10 echo "Running : $PPPD call adsl" | tee -a $LOGFILE $PPPD call adsl echo "pppd return code $?" >> $LOGFILE sleep 10 echo "--- ifconfig -a output ---" >> $LOGFILE ifconfig -a >> $LOGFILE echo "--- netstat -rn output ---" >> $LOGFILE netstat -rn >> $LOGFILE DNS=OK PPP0=NOT_OK ifconfig ppp0 | grep "inet addr:" if [ "$?" -eq "0" ]; then PPP0=OK echo "Looks like we're online... " | tee -a $LOGFILE ping -c1 www.google.com > /dev/null if [ "$?" -eq "0" ]; then echo "Hey look, I can see the Net from here!" | tee -a $LOGFILE else echo "Cannot ping www.google.com - trying steve-parker.org by numeric IP" | tee -a $LOGFILE ping -c1 195.224.68.226 > /dev/null if [ "$?" -eq "0" ]; then echo "Looks like DNS might be iffy ... sorting it out" | tee -a $LOGFILE check_resolv_conf else echo "I can't ping even without DNS" | tee -a $LOGFILE fi fi else echo "****************************************" echo "* Oops - don't seem to have connected. *" | tee -a $LOGFILE echo "****************************************" fi echo "--- dns ---" >> $LOGFILE ls -l /etc/resolv.conf /etc/ppp/resolv.conf >> $LOGFILE 2>&1 echo "--- /etc/resolv.conf ---" >> $LOGFILE cat /etc/resolv.conf >> $LOGFILE echo "--- /etc/ppp/resolv.conf ---" >> $LOGFILE cat /etc/ppp/resolv.conf >> $LOGFILE echo "--- end of diags ---" >> $LOGFILE echo "Configuration finished." | tee -a $LOGFILE echo "Any potential problems are listed below:" if [ "$DNS" != "OK" ]; then echo "The connection is established, but there seems to be some" echo "problem with DNS (looking up the names of internet hosts)" fi if [ ! -z "${route}" ]; then echo echo "You have a default route configured." echo "You need to disable this, as there can only be one default route." grep -q "GATEWAY=" /etc/sysconfig/network 2>/dev/null if [ "$?" -eq "0" ]; then echo "You need to remove the GATEWAY= line from /etc/sysconfig/network." else if [ -f /etc/sysconfig/network/routes ]; then echo "You need to remove the \"default\" line from /etc/sysconfig/network/routes" fi fi echo fi echo "To automatically dial-in when the PC boots up : " | tee -a $LOGFILE if [ -f /etc/debian_version ]; then echo " update-rc.d speedtouch start 90 2 3 4 5 . stop 10 0 1 6 ." | tee -a $LOGFILE else echo " cd ${rc_dir}; chkconfig speedtouch on" | tee -a $LOGFILE fi echo echo "You can connect and disconnect with the ${rc_dir}/speedtouch script," echo "passing either stop or start as the only parameter." if [ "$PPP0" == "OK" ]; then echo "You are now connected. There is no need to run this" echo "speedtouchconf.sh script again." echo "You can stop and start the interface with " echo " ${rc_dir}/speedtouch stop" echo " ${rc_dir}/speedtouch start" fi exit 0 |
این اسکریپت اصلی است. به طور سؤال برانگیزی این بخش خیلی طولانی است، و باید به چند تابع مختلف مجزا میشد، اما تا اندازهای قابل مدیریت است. با کنترل تنظیم (check_config) شروع میشود و در صورت شکست، از ادامه خودداری میکند. بعد اطلاعات کاربر را در یافت میکند (select_options). با یک موفقیت check_config و اطلاعات معتبر کاربر، حالا اسکریپت باید موفق شود. توابع تعریف شده در بالا را به ترتیب مناسب فراخوانی میکند، سپس شروع به برقراری ارتباط با اینترنت مینماید. در سطر «پیکربندی تمام شد. شروع برقراری ارتباط»، اتصال را شروع میکند، وسعی میکند هر مشکلی را در هر نقطه شناسایی نماید. بیشترین بازخورد دریافتی ازکاربران را در مورد این بخش دریافت کردهام. این بخش میخواهد بدون سر درگم نمودن کاربران تا آنجا که ممکن است، پرگو باشد - به آنها بگوید که چه چیز رخ میدهد، وبعد انتظار دیدن چه جیز را میتوانند داشته باشند. میکروکد بارگذاری شدهام را آغاز میکند ($MODEM_RUN) - یک نگارش بعدی از این اسکریپت، یک وصله modem_run را شامل میشود، نسخه speedtouch.sf.net فقط همیشه "-1" ( یعنی ۲۵۵ ) را برای هر خطا برمیگرداند، نگارش جدیدتر اسکریپت تشخیصهای بهتری دارد. با فرض این که دستور modem_run موفق شود، اسکریپت میرود که pppd را فرا بخواند - به ISP کاربر وصل میشود، اعتبارسنجی میکند، و امیدوارانه در انتظارارتباط با اینترنت میماند. تنظیمات ifconfig و netstat را در فایل ثبت وقایع، برای مقاصد تشخیصی، مینویسد، و بعد شروع به اشکالیابی میکند. در سطر "DNS=OK"، روتین اشکالیابیاش را آغاز میکند. یک آدرس اینترنتی در دستگاه ppp0 کنترل میکند - اگر چیزی نباشد، یک خطا گزارش میکند( در واقع، این خطا اکثراً نشان دهنده نام یا کلمه عبور اشتباه میباشد). اگر یک آدرس داشته باشد، بعد با موفقیت به ISP وصل میشود. سپس در ping کردن www.google.com تلاش میکند ( که مطمئناً به شبکه متصل است! ) -اگر این مورد ناموفق باشد، سپس دوباره سعی میکند steve-parker.org را از طریق آدرس IP آن ping کند - که به راستی باید متصل باشد، و من میتوانم مطمئن شوم که آدرس IPام ایستا خواهد بود. بر اساس این نتایج، ممکن است تابع check_resolv_conf را برای برای برطرف نمودن هر مشکل DNS فراخوانی کند. سپس اسکریپت با ثبت کردن موارد تفصیلی دیگر در فایل ثبت وقایع، - و اعلام آنچه برای نهایی کردن پیکربندی لازم است،به کاربر، اگر آنها مسیریاب پیشفرض سیستم را حذف کردهاند، و پیشنهادروشی برای ارتباط گرفتن خودکار در موقع بالا آمدن سیستم، تمام میکند. تمامش همین بود - امیدوارم آنها متصل شده باشند، و بدانند که دفعه بعدبه نسبت نیازهایشان چه کار باید بکنند. |
Steve Parker نوشته Bourne و Bash راهنمای آموزشی اسکریپت نویسی
ترجمه محمود پهلوانی
لطفاً برای بهتر دیدن صفحه از فایرفاکس استفاده کنید