Rozpoczynam od założenia w serwisie dyndns.org
konta.
Potem przechodzę do My Services→Host services,
wybieram nazwę hosta (w moim przypadku pinkaccordions
) i domeny
(homelinux.org
).
Typ usługi: Host with IP address
. Resztę pól
można zostawić niewypełnione.
Darmowe konto pozwala na przydzielenie 5 adresów...
Teraz w menu Tomato klikam w Basic→DDNS. Jako service
wybieram DynDNS -- static, Username/Password to dane z rejestracji
w serwisie DynDNS, hostname to z kolei wybrana przez nas
nazwa hosta, tj. w moim przypadku pinkaccordions.homelinux.org
.
Więcej niczego nie trzeba wpisywać wystarczą dane domyślne.
Można ustawić w ten sposób dwa adresy...
Por też notatki tutaj.
Pozostaje wreszcie uruchamienie usługi port forwarding na routerze z działającym Tomato. Jest to bardzo proste i sprowadza się do wypełnienia pól Proto, Ext Ports, Int Address oraz opcjonalnie Description (por. ekran obok).
Instalacja serwera apache oraz php w systemie Debian Lenny.
apt-get install apache2 apache2-mpm-prefork apache2-utils apache2.2-common apt-get install php5 libapache2-mod-php5 php5-common php5-curl apt-get install php5-dev php5-gd php5-imagick php5-mcrypt php5-memcache php5-mhash \ php5-mysql php5-pspell php5-snmp php5-sqlite php5-xmlrpc php5-xsl
W pliku /etc/apache2/ports.conf
umieszczam komentarz
przed dyrektywą NameVirtualHost
:
#NameVirtualHost *:80
Zaś powyższą dyrektywę umieszczam w /etc/apache2/httpd.conf
.
Konfiguracja wirtualnego hosta; plik /etc/apache2/sites-available/pinkaccordions
powstaje przez skopiowanie pliku domyślnego:
cd /etc/apache2/sites-available/ ; cp default pinkaccordions
Następnie plik modyfikuję dopisując
ServerName
i ServerAlias
<VirtualHost *:80> ServerAdmin webmaster@localhost ServerName pinkaccordions.homelinux.org ServerAlias pinkaccordions.homelinux.org DocumentRoot /var/www_pinkaccordions/ <!-- dalej w zasadzie niezmienione --> </VirtualHost>
Teraz:
cd /etc/apache2/sites-enabled && ln -s ../sites-available/pinkaccordions pinkaccordions
To samo dla drugiego i ewentualnie kolejnych hostów. Innych plików
za wyjątkiem opisanych wyżej httpd.conf
,
ports.conf
oraz plików z katalogu
./sites-available/
i linków z katalogu ./sites-enabled/
nie ruszam. Teraz
/etc/init.d/apache2 restart # albo apache2ctl graceful
No i powinno działać...
Dopisane 15 września 2010:
Aby logrotate
nie usuwał najstarszego przechowywanego pliku
modyfikuję /etc/logrotate.d/apache2
i dodając stosowane prerotate...endscript
:
sharedscripts prerotate if [ -f "/path2logs/access.log.52.gz" ] ; then cp /path2logs/access.log.52.gz /path2archive/access.`date +%Y%m%d`.log.gz ; fi if [ -f "/path2logs/access.fabians.log.52.gz" ] ; then cp /path2logs/access.log.52.gz /path2logs/access.`date +%Y%m%d`.log.gz ; fi endscript
Teraz (mam nadzieję), plik access.log.52.gz
przed skasowaniem zostanie
skopiowany w inne miejsce i ocaleje. Pewnie można by prościej, przykładowo
brutalnie wpisując po prostu rotate 156
.
Na potrzeby dostosowana adresów URL do innej konfiguracji innego serwera wykorzystałem następujący skrypt:
#!/usr/bin/perl -w use strict; undef $/; ## na potrzeby czytania każdego pliku (process_file) sub recurse($) { my($path) = @_; ## append a trailing / if it's not there $path .= '/' if($path !~ /\/$/); ## print the directory being searched print STDERR $path,"\n"; ## loop through the files contained in the directory for my $eachFile (glob($path.'*')) { ## if the file is a directory if( -d $eachFile) { ## pass the directory to the routine ( recursion ) recurse($eachFile); } else { ## przetwarzaj plik process_file ($eachFile); } } } sub process_file { my $file = shift; ## Tylko pliki .html i .php if ($file =~ /\.html|\.php$/) { my $tmp_file = "$file.temp"; rename($file, $tmp_file); open (F, $tmp_file); open (FO, ">$file"); my $ff = <F>; ## zamień bezwględne URLe na lepsze $ff =~ s/href=(["'])http:\/\/gnu.univ.gda.pl\/~tomasz/href=$1/g; ## zamień $ff =~ s/src=(["'])http:\/\/gnu.univ.gda.pl\/~tomasz/src=$1/g; ## zamień print STDERR "-> $file\n"; print FO $ff; close(F); close (FO); } } ## initial call ... $ARGV[0] is the first command line argument recurse($ARGV[0]);
Wymieniając procedurę process_file
można oczywiście ww. skrypt zaadaptować do innych zadań, np. poprawienia
zepsutej daty modyfikacji plików:-)
Uruchomiłem na Szewie #2 serwer WWW,
dostępny pod adresem
pinkaccordions.homelinux.org
(darmowa domena z serwisu
dyndys.com -- w moim przypadku konieczność, bo mam
tzw. zmienne IP). Jak już jest serwer, to trzeba robić -- w sposób
systematyczny, a nie ad hoc -- kopie zapasowe na wypadek gdyby, np. karta padła
(co podobno nie jest takie rzadkie...). Po konsultacji z tym co w tym temacie
proponują inni postanowiłem robić to za pomocą rsync
a, uruchamianego z zewnętrznego
komputera.
W tym celu trzeba zainstalować rsync na obu komputerach źródłowym i tym, na którym będzie tworzona kopia:
apt-get install rsync
Teraz należy skonfigurować rsync
po stronie
źródła (czyli tego komputera, z którego mają być
kopiowane dane) modyfikując /etc/rsyncd.conf
.
Zawartość pliku /etc/rsyncd.conf
w moim przypadku wygląda następująco:
## http://encodable.com/tech/blog/2005/10/13/Secure_Remote_Backups_via_rsync uid = 0 gid = 0 hosts allow = ***** transfer logging = no read only = yes [wholefs] path = / comment whole root fs [pinkaccordions] path = /var/www_pinkaccordions/ comment pinkaccordions www
Można sprawdzić czy działa (neptune
jest zadeklarowany w /etc/hosts
):
rsync neptune::wholefs/
Tworzenie kopii realizuje skrypt
rsync_neptune.sh
uruchamiany po stronie przeznaczenia:
#!/bin/bash SOURCE=neptune::wholefs/ EXCLUDE=/root/.rsync/backup_exclude.lst DESTDIR=/backup/neptune/rootfs echo "=== Syncing ${SOURCE} at `date` ===" rsync -av --exclude-from=${EXCLUDE} --delete ${SOURCE} ${DESTDIR}
Plik $EXCLUDE
zawiera te katalogi, które nie powinny
-- z oczywistych względów -- być kopiowane (zawartości katalogów
/proc
, /sys
oraz /tmp
):
## Exclude - /proc/* - /sys/* - /tmp/*
Skrypt rsync_neptune.sh
jest zaś uruchamiany
poprzez cron
a:
0 4 * * 7 /root/bin/rsync_neptune.sh >> /root/logs/RSync/RSync.log 2>&1
Idea jest taka: kopia całego rootfs
z karty SDHC
ma być wykonywana na dysk USB raz w tygodniu (z innego komputera, konkretnie Szewy #1).
W razie potrzeby (awarii karty SDHC) kopia ta może być
szybko przeniesiona na inną kartę SDHC... Można też kopiować bezpośrednio
na kartę SDHC wsadzoną na zicher w czytnik kart, ale nie widzę sensu podłączania
czytnika wyłącznie i tylko po to, żeby w razie awarii, mieć kopię karty
od razu a nie po 3 minutach.
Zatem:
#!/bin/bash EXCLUDE=/root/.rsync/backup_exclude.lst SOURCE=/public/sheeva/backup/neptune/rootfs/ DESTDIR=/media/sd_backup # http://www.cyberciti.biz/tips/shell-root-user-check-script.html # Make sure only root can run our script if [ "$(id -u)" != "0" ]; then echo "This script must be run as root" 1>&2 ; exit 1 fi ## sprawdz czy karta jest w czytniku i jest zamontowana if [ -d "$DESTDIR" ] ; then echo "** OK: $DESTDIR!" else echo "** ERROR: $DESTDIR not mounted!"; exit 1; fi rsync -av --exclude-from=${EXCLUDE} --delete ${SOURCE} ${DESTDIR}
No i tu porażka:
rsync: readlink_stat("/media/sd_backup/etc/shadow") failed: Input/output error (5) rsync: readlink_stat("/media/sd_backup/etc/resolv.conf") failed: Input/output error (5) rsync: recv_generator: failed to stat "/media/sd_backup/etc/resolv.conf": Input/output error (5) rsync: recv_generator: failed to stat "/media/sd_backup/etc/shadow": Input/output error (5) rsync: recv_generator: failed to stat "/media/sd_backup/etc/network/run/ifstate": Input/output error (5) rsync: recv_generator: failed to stat "/media/sd_backup/var/lib/urandom/random-seed": Input/output error (5) rsync: recv_generator: failed to stat "/media/sd_backup/var/log/lastlog": Input/output error (5) rsync: recv_generator: failed to stat "/media/sd_backup/var/run/dhclient.eth0.pid": Input/output error (5) rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1058) [sender=3.0.5]
Trefne pliki (w liczbie sześciu, jak widać) mają długość 0 bajtów,
a próba np. ls -li /media/sd_backup/etc/shadow
powoduje
komunikat I/O error
. Usunąć tego też się nie da
(rm -f
nie daje rady)...
Wobec powyższego, sformatowałem partycję i wykonałem kopię za
pomocą następującego polecenia wykorzystując tar
a:
tar cf - . | (cd /media/sd_backup/; tar xvpf - ) 2> ../../tar.log
Po wsadzeniu kopii zamiast oryginału do Szewy, system wydaje się działać.
Czemu rsync
zawiódł nie wiem (na razie)...
Dopisane 27 maja 2010 (po południu):
Log tara
(2> ../../tar.log
) zawierał masę wpisów:
implausibly old time stamp 1960-04-13 04:17:36. Data jest absurdalna. Żeby było śmieszniej
w systemie była inna (w przód 2028 rok -- licznik się przekręcił tar
owi?).
Pliki z błędnym czasem modyfikacji były głównie
w katalogach /dev/
/var/
oraz /etc/
; wygląda jakby w czasie
inicjalizacji, przed uruchomieniem ntpdate
,,fabryczny'' zegar
Szewy wskazywał coś dziwacznego.
Czasy poprawiłem touch
em. Zrobiłem rsync
na dysk, a potem z dysku
na kartę zapasową. Tym razem błędów nie było...
Dopisane 10 Kwietnia 2011:
Poprawiłem skrypt rsync_neptune.sh
na
możliwą okoliczność wykonania kopii z uszkodzonych danych.
W nowej wersji tworzone są trzy kopie
z dwutygodniowym horyzontem czasowym:
#!/bin/bash # rsync_neptune.sh (wersja poprawiona) SOURCE=neptune::wholefs/ EXCLUDE=/root/.rsync/backup_exclude.lst DESTDIR=/public/sheeva/backup/neptune/rootfs COPYDIR=/public/sheeva/backup/neptune ### Zachowaj stara kopie pod inna nazwa: cp -f ${COPYDIR}/1week.tar.gz ${COPYDIR}/2week.tar.gz ### Zachowaj stare dane (sprzed tygodnia): tar -zcPf ${COPYDIR}/1week.tar.gz ${DESTDIR} echo "=== Syncing ${SOURCE} at `date` ===" rsync -av --exclude-from=${EXCLUDE} --delete ${SOURCE} ${DESTDIR}
Powinienem w ciągu dwóch tygodni się połapać, że coś jest nie tak, np. z kartą.
Zainstalowałem Debiana Lenny na karcie SD (Patriot 16Gb class 6) wg. wskazówek ze strony Manually unpacking a tar ball of Debian on SheevaPlug, ale nie poszło gładko. Ponieważ boot loader mojej szewy był w wersji wcześniejszej od zalecanej 3.4.19, zatem kierując się wskazówkami ze strony Upgrading SheevaPlug's U-Boot, rozpocząłem od wgrania nowego U-boata stosując technikę wykorzystującą USB (a nie serwera TFTP). W rezultacie już za pierwszym podejściem zbrikowałem szewę na amen.
Na szczęście się okazało, że wgranie nowego programu rozruchowego i systemu do pamięci NAND nie jest aż takie trudne i sprowadza się do pobrania czegoś co się nazywa SheevaPlug Installer. Relewantna informacja zaczyna się od śródtytułu How to install 1.0?. Należy mianowicie:
.tar.gz
installer
do katalogu
głównego PenDrive'a
uboot-nand-custom.txt
oraz
uboot-mmc-custom.txt
i poprawić MAC adres odczytując go z obudowy
SheevaPlug.
root
):
php ./runme.php nand
Odczekać aż wszystko się nagra. U mnie nie do końca działa: system się ładuje
ale root
nie może się zalogować... Pech...
Ponieważ ostatecznie chcę uruchomić system z karty SD, a nie wbudowany z pamięci NAND, to powyższa niedogodność jest w sumie bez znaczenia. Ważne że U-boat jest zaktualizowany do wersji 3.4.19. Można zatem instalować Debiana.
Kartę podzieliłem na partycje i sformatowałem zgodnie z opisem, tyle że zamiast Ext2 użyłem Ext3, co okazało się błędem (ale o tym za chwilę). Następnie pobrałem archiwum z systemem:
wget http://people.debian.org/~tbm/sheevaplug/lenny/base.tar.bz2 wget http://people.debian.org/~tbm/sheevaplug/lenny/base.tar.bz2.asc
Zamontowałem kartę i skopiowałem co trzeba
tar -xjvf ~/base.tar.bz2
Ustawiłem środowisko programu ładującego:
setenv mainlineLinux yes setenv arcNumber 2097 saveenv reset
oraz
setenv bootargs_console console=ttyS0,115200 setenv bootargs_root 'root=/dev/mmcblk0p2' setenv bootcmd_mmc 'mmcinit; ext2load mmc 0 0x01100000 /uInitrd; ext2load mmc 0 0x00800000 /uImage' setenv bootcmd 'setenv bootargs $(bootargs_console) $(bootargs_root); run bootcmd_mmc; bootm 0x00800000 0x01100000' saveenv
Teraz run bootcmd
i kicha... System nie może odnaleźć partycji systemowej.
Próbowałem różnych kombinacji, nic...
Wreszcie dla świętego spokoju, sformatowałem
kartę jako Ext2 a nie Ext3, tak jak jest to zalecane. Zadziałało... Morał: nie kombinować....
Teraz zrobiłem to wszystko co jest zalecane na stronie Manually unpacking a tar ball of Debian on SheevaPlug, tj.:
rm /etc/ssh/ssh_host* ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N "" ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" ## Synchronizacja czasu ntpdate pool.ntp.org apt-get dist-upgrade ## Ustawienie daty/czasu dpkg-reconfigure tzdata ## wybieram (spacją) pl_PL.utf8 pl_PL.88592, domyślnie pl_PL.utf8 dpkg-reconfigure locales ## zmienić nazwę hosta dodając ją do vi /etc/hostname
A ponadto:
apt-get install ntp apt-get install fuse-utils apt-get install libxml-dom-xpath-perl libxml-dom-perl apt-get install vim apache2 apt-get install php5 php5-cli apt-get install make zip unzip
Na razie wystarczy...
Dopisane 20 maja 2010: Na podstawie zaleceń ze strony Debian Lenny -- installing Apache2 and PHP5 doinstalowuję porządnie PHP.
Dopisane 20 maja 2010:
Formatowanie karty 8Gb za pomocą gparted
.
Partycja #1: 102 Mb (boot),
partycja #2: 7044 Mb (system),
partycja #3: ok. 500 Mb (swap). Za pomocą
fdisk
a dodałem flagę boot do pierwszej partycji:
/sbin/fdisk /dev/sdc a # toggle a bootable flag 1 # pierwsza partycja w # zapisz tabelę partycji
Wczoraj próbowałem kartę SDHC Patriot LX (klasa 10), ale przesadziłem:
SDHC found. Card desciption is: Manufacturer: 0x27, OEM "PH" Product name: "SD08G", revision 3.0 Serial number: 2952790466 Manufacturing date: 4/2010 CRC: 0x00, b0 = 0 ** Unable to read "/uInitrd" from mmc 0:1 ** ** Unable to read "/uImage" from mmc 0:1 ** ## Booting image at 00800000 ... Bad Magic Number
Wygląda że Patriot LX 8Gb (class 10) is one of them, czyli z gatunku tych z którymi U-boat nie działa.
Ponieważ opisany
poprzednio
uploader filmów na YT przestał działać przyjrzałem się bliżej skryptowi
youtube-upload.py.
Od pierwszego strzału nie działa, ale...
Skrypt ten
wymaga do działania programu ffmpeg
, który to program
służy wyłącznie do obliczenia czasu trwania filmu.
W przypadku szewy uruchamianie ffmpeg
chyba nie jest dobrym pomysłem, a uruchamianie
tylko po to żeby obliczyć ile trwa film to w ogóle beznadziejna sprawa...
Zatem ,,rozbroiłem'' skrypt, wpisując na zicher w odpowiednie miejsce długość filmu jako 60 (pewnie sekund):
def get_video_duration(video_path): """Return video duration in seconds.""" #errdata = ffmpeg("-i", video_path) #match = re.search(r"Duration:\s*(.*?),", errdata) #if not match: # return #strduration = match.group(1) #return sum(factor*float(value) for (factor, value) in # zip((60*60, 60, 1), strduration.split(":"))) return 60
Wygląda że działa.... Opis filmu dodaję po załadowaniu...
Skrypt youtube-upload.py
korzysta z API jest zatem dużo większa szansa,
że nagle przestanie działać (jak to było z poprzednio
wykorzystywanym
programem).
Do działania potrzebna jest też biblioteka
python-gdata, która wszakże zainstalowała
się na szewie w/o problems.