من و راسبری-پی و دانلودهای شبانه

یه دونه راسبری پی خریدم که تو خونه گذاشتم و باهاش عشق دنیا رو می‌کنم. چند وقتی بود که می‌خواستم مثل این یادداشت بیت نیم‌سوز یه مدیر دانلود روش راه بندازم. چیزی که هدفم بود این بود که (۱) خیلی راحت بتونم فایل‌هام رو به لیست دانلودهام اضافه کنم (۲) دانلود خیلی اتوماتیک و تمیز انجام بشه.

ساختن لیست دانلودها
تو یه پوشه از هاستم یه اسکرپت کوچیک php گذاشتم که هر چی براش بفرستم، به آخر یه فایل تکست اضافه می‌کنه. به این ترتیب هر جا که باشم، لینکایی که می‌خوام دانلود شن رو خیلی تمیز برای این اسکریپت می‌فرستم و و این اسکریپت برام لیست دانلودهام رو می‌سازه. مثلا:
[html]
http://melmi.ir/downloads/append.php?link_to_download_file
[/html]
من php بلد نیستم، واسه همین هم اصل اسکریپت رو از این‌جا برداشتم و یه کم تغییرش دادم. این هم اسکریپت تغییر پیدا کرده:

البته برای اینکه هر کسی نتونه به این فایل چیزی اضافه کنه، رو فولدر این اسکرپت پسورد گذاشتم. نتیجتا برای دسترسی به این اسکرپت، یه همچین چیزی لازمه:
[html]
http://folani:passwordesh@melmi.ir/downloads/append.php?link_to_download_file
[/html]
امن‌ترین روش توی دنیا نیست، اما برای من کافیه.

تو مرحله بعد برای اینکه تنبلی رو به اوجش برسونم، دنبال یه افزونه گشتم که از تو کروم با یه کلیک مستقیما بتونم لینکم رو به این ارسال کنم. با یه کم گشتن افزونه خیلی خوب Context Menus رو پیدا کردم که اجازه می‌ده به راحتی برای کانتکست منوی کروم، آیتم‌های اضافه با اسکرپت‌های سفارشی تعریف کنیم. من البته کار خاصی نداشتم و فقط همون دستور بالا رو با یه کم تغییر به قسمت Custom از منوی LinkMenu اضافه کردم:
[html]
http://folani:passwordesh@melmi.ir/downloads/append.php?%s
[/html]
و تمام. حالا می‌تونم با یه کلیک از هر جای دنیا لینک دانلود فایلی که می‌خوام رو تو سایتم ثبت کنم.

انجام دانلود
نظم دادن به خود دانلود دردسر زیادی نداره. باید یه اسکرپت داشته باشم که تو یه فاصله زمانی مشخص دانلودهام رو انجام بده.
تو اسکریپت اول از هم می‌رم به فولدر دانلودها و فایل dllist.txt رو (بعد از پاک کردن فایل قبلی) از سرور می‌گیرم:
[bash]
cd ~/Downloads/auto/
rm dllist.txt
wget –user=folani –password=passwordesh melmi.ir/downloads/dllist.txt
[/bash]
برای استفاده از این فایل به دو تا فایل دیگه هم احتیاج دارم. یه فایل به اسم done.txt که لیست فایلایی رو نگه می‌داره که دانلودشون تکمیل شده، و یه فایل به اسم active.txt که لیست فایلایی هست که هنوز دانلودشون انجام یا کامل نشده. بعد از دانلود فایل dllist.txt، اولین کار اینه که ازش فایل done.txt رو فریق کنم تا فایل active.txt تشکیل بشه:
[bash]
comm dllist.txt done.txt -23 –nocheck-order > active.txt
[/bash]
دستور comm تفریق رو انجام می‌ده. معنی پارامترهاش رو هم می‌شه راحت تو منوال‌هاش دید.
مرحله بعد اینه که یه حلقه بنویسم که تا وقتی فایل active.txt خالی نشده، فایلای اون تو رو یکی یکی (۱) دانلود کنه (۲) بعد از اینکه دانلودشون تموم شد، بذاره تو done.txt و (۳) فایل دانلود شده رو از active.txt خارج کنه:
[bash]
while [ -s active.txt ]
do
head -n 1 active.txt | sed -e’s/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g’ | xargs echo -e | xargs -I {} wget -c “{}”
head -n 1 active.txt >> done.txt
tail -n +2 active.txt > tmp.txt
mv tmp.txt active.txt
done
[/bash]
فقط خط اول حلقه یه کم توضیح می‌خواد. لینک‌ها تو فایل لینکای من به شکل کدبندی درصدی می‌یاد. از طرف دیگه wget میونش زیاد با این فرمت کدبندی درصدی خوب نیست و ممکنه اسم فایلا رو به هم بریزه. برای همین با استفاده از بخش sed و echo اون پایپ‌لاین لینک‌ها رو به شکل اول برمی‌گردونم. (راستش این مشکل رو با پرسیدن سوال حل کردم.)
و نهایتا اسکریپت ما این شکلی خواهد بود:

والبته یادم نمی‌ره که مجوز اجرایی هم بهش بدم.
[bash]
sudo chmod +x dl.sh
[/bash]

خوب برای اجرای این اسکریپت به شکل منظم یه cron احتیاج دارم که البته کار باهاش رو قبلا این‌جا تجربه کرده بودم. اینا هم دستورایی هستن که تو cron می‌ذارم. به این ترتیب اسکریپت عزیز دانلودها رو ساعت یک شب شروع و ساعت ۹ صبح قطع می‌کنه. فکر کنم واضح باشن:
[bash]
۰ ۱ * * * /home/pi/Downloads/auto/dl.sh
۰ ۹ * * * kill $(pgrep dl.sh)
۰ ۹ * * * killall wget
[/bash]

والسلام. دو تا نکته. اول این که برای این کار حتی یه برنامه اضافه هم تو rpi نصب نکردم و فقط با ابزارای ساده لینوکس و وصل کردن اون‌ها به هم کل این سیستم رو راه انداختم. نکته دیگه اینکه این ویندوزیا با همه دانلود منیجرای غول تشنشون نمی‌تونن به سادگی یه همچین سیستمی راه بندازن.

آپدیت: اسکریپت‌ها به گیست اضافه شد و از آنجا در متن قرار گرفت.

چرا گنو/لینوکس رو دوست دارم؟ چون هر ۵ دیقه یه بار بهم می‌گه هیس.

من نه درون‌گرام و و نه برون‌گرا و نه میانه‌رو! چیزی که من هستم یه ترکیبی از برون‌گرایی شدید تو بعضی زمینه‌ها و درون‌گرایی شدید تو بعضی زمینه‌های دیگست. خوب این مشکل من از قسمت برون‌گرام شروع شد! این بود که شروع می‌کردم سر کار با موسیقی که گوش می‌کردم حال کردن و زیادش کردن و باهاش خوندن و اینا… می‌دونین دیگه: همکارا شاکی می‌شن. راه حل؟ می‌خوام از سیستم‌عاملم خواهش کنم هر ۵ دیقه یه بار بهم بگه هیس!

مواد لازم:
۱- یه چیزی که بشه باهاش به دستگاه حالی کرد با یه توالی زمانی مشخص یه کاری انجام بده،
۲- یه چیزی که بهم بگه هیس!

معلومه که سر این رو می‌شه به دمب اون وصل کرد و چیزی که می‌خوام رو داشته‌باشم.

برای انجام منظم کارا cron هست. این یه ابزاره که هر دقیقه یه بار تو سیستم بالا میاد و کنترل می‌کنه باس کاری رو انجام بده یا نه. برای این هم که بدونه چه کاری رو باید کی انجام بده، به فایل متنی رو می‌خونه. البته برای ویرایش اون فایل متنی باید از crontab استفاده بشه. تو فایل محترم متنی چی هست؟ یه سری خط که دستورات هستن. اینم فرمتش:
[bash]
* * * * * /chizi/ke/mikhaim/ejra/she
[/bash]
این ستاره‌ها به ترتیب مال دقیقه، ساعت، روز ماه، ماه و روز هفته هستن. خود ستاره هم یعنی هر. مثلا
[bash]
۳۰ ۰۸ ۱۰ ۰۶ * /home/ramesh/full-backup
[/bash]
یعنی دقیقه سی از ساعت ۸ از روز ۱۰ از ماه ۶، حالا هر روز هفته‌ای که می‌شد یه بکاپ بگیر. خوب cron رو می‌شه به روش‌های مختلف کانفیگ کرد. با یه سرچ کلی چیز میز تو اینترنت می‌شه در بارش خوند (مثلا + و + و +).

خوب حالا دستور ما چیه؟ می‌خوایم ۵ دیقه یه بر هشدار بده دیگه. پس میگیم:
[bash]
*/۵ * * * * /begu/hisss
[/bash]

این تا اینجا. حالا میمونه که بگیم هیس! خوب از قبل می‌دونستم که یه دستوری هست که از تو ترمینال می‌شه یه دیالوگ نمایش داد. یه سرچ می‌زنم و پیداش می‌کنم: zenity. بعد نصب هم خوندن منوالشه و رسیدن به این دستور:
[bash]
zenity –warning –title=”Silence” –text=”Be sure you are respecting others’ privacy.” –timeout=2
[/bash]
این یعنی اینکه یه پنجره به شکل اخطار باز کن که عنوانش باشه «سکوت» و متنش هم «به حریم خصوصی دیگران احترام بزار.». اگرم تا ۲ ثاینه پنجره رو نبستم خودت ببند.

حالا باید همه اینا رو به هم بدوزم. کافیه با crontab فایله رو باز کنم و توش یه خط اضافه کنم:
[bash]
*/۵ * * * * /usr/bin/zenity –warning –title=”Silence” –text=”Be sure you are respecting others’ privacy.” –timeout=2
[/bash]

با لبی خندان منتظر بودم که اسکریپت اجرا بشه، ولی نشد. مشکل؟ یه سرچ زدم و جواب رو پیدا کردم (+ و +). خلاصش این که zenity بنده خدا نمی‌تونسته بفهمه کجا باید پنجره رو نمایش بده. خوب برای حل به فایل .bashrc اضافه می‌کنم:
[bash]
xhost local:YOUR_USERNAME > /dev/null
[/bash]
و یه سوییچ هم به خطی که می‌ره تو cron:
[bash]
*/۵ * * * * /usr/bin/zenity –warning –title=”Silence” –text=”Be sure you are respecting others’ privacy.” –timeout=2 –display=:0.0
[/bash]

والسلام!

پی‌نوشت: لازمه بگم که فاصله زمانیش رو بعدا بیشتر کردم؟ و بعدا هم قطعش کردم؟