sunnuntai, 23. syyskuuta 2012

MediaWikin siirto toiselle palvelimelle

Haaga-Helian Työasemat ja tietoverkot -kurssin Linux-osiossa viimeisenä tehtävänäni oli keksiä itselleni tehtävä. Minun oli joka tapauksessa siirrettävä ApologetiikkaWiki uudelle virtuaalipalvelimelle, joten ajattelin asettaa tehtäväkseni wikin siirron uudelle palvelimelle. Käytin muistilistanani MediaWikin virallista ohjetta wikin siirtoon palvelimelta toiselle.

Tietokannan kopiointi uudelle virtuaalipalvelimelle

Otin aluksi etäyhteyden (23.9.2012 klo 18.49) vanhaan virtuaalipalvelimeeni, jolta wiki oli tarkoitus siirtää uudelle:
ssh blaa@apologetiikkawiki.fi
Raportoinnin vuoksi selvitin, minkä Ubuntun päällä nykyinen mediawiki pyöri.
blaa@honiara:~# cat /etc/*rel*
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=9.10
DISTRIB_CODENAME=karmic
DISTRIB_DESCRIPTION="Ubuntu 9.10"
MediaWikin tiedot selvitin toimintosivulta Special:Version, josta löytyi MediaWikin olennaiset tiedot (tässä hieman karsittuna):
Tuote Versio
MediaWiki 1.16.0
PHP 5.2.10-2ubuntu6.10 (apache2handler)
MySQL 5.1.37-1ubuntu5.5

Asennetut laajennukset
CheckUser (Versio 2.3), Cite, CSS, HTMLets, ImageMap, ParserFunctions (Versio 1.3.0), SidebarBannerBox (Versio 0.1), ConfirmEdit, FCKeditor (Versio 1.0.1), RandomTex, confirmEditSetup, wfHTMLetsExtension, wfRandomExtension, wfRefbase, wfSetupCSS, wfSetupParserFunctions
3G-yhteyteni katkesi lähes täydellisesti (olin junassa) noin klo 19.00. SSH-yhteyteni katkesi kymmeniä kertoja, joten päätin pitää paussin (19.24), koska tuulimyllyjä vastaan taisteleminen on masentavaa. 3G-yhteyden parannuttua jatkoin projektia klo 21.12.

Siirsin MediaWikin tietokannasta otetun varmuuskopion (dumpin) uudelle virtuaalipalvelimelle. Loin uuden virtuaalipalvelimen tilaa.nl -palveluun.

Siirtääkseni varmuuskopion uudelle virtuaalipalvelimelle minun tuli ensin luoda projektiin soveltuvat SSH-tunnukset uudelle palvelimelle. Kirjauduin uudelle virtuaalipalvelimelle ssh:lla.
ssh root@164.138.26.183
Loin uuden tunnuksen itselleni.
adduser blaa
Sitten annoin käyttäjälle blaa (käyttäjätunnus muutettu turvallisuussyistä) sudo-oikeudet. Tätä ennen minun kuitenkin tuli luoda ryhmä "admin".
addgroup admin && adduser blaa admin
Kirjauduin uudelle virtuaalipalvelimelle juuri luomillani tunnuksilla.
ssh blaa@164.138.26.183
Halusin estää SSH:n yli kirjautumisen roottina, joten yritin muokata /etc/ssh/sshd_config -tiedostoa nanolla. Tämä ei kuitenkaan onnistunut, koska nanoa ei ollut asennettuna. Asensin nanon ja päätin saman tien päivittää järjestelmän.
sudo apt-get update && sudo apt-get upgrade && sudo apt-get install nano
Asennus onnistui. Totesin samalla, että sudo-oikeuksien lisääminen käyttäjälle blaa onnistui. Nanon asennuksen myötä pääsin muokkaamaan SSHD:n konffia.
sudo nano -w /etc/ssh/sshd_config 
 Muutin PermitRootLogin-asetuksen estetyksi, jolloin rivi näytti seuraavanlaiselta.
PermitRootLogin no
Käynnistin SSHD:n uudestaan asetuksen käyttöön saattamiseksi.
sudo service ssh restart
Sitten kirjauduin vanhalle virtuaalipalvelimelle siirtääkseni wikin tietokannan varmuuskopion uudelle palvelimelle.
ssh blaa@apologetiikkawiki.fi
Lähetin viimeisimmän varmuuskopion uudelle palvelimelle käyttäjän blaa kotihakemistoon.
 scp /backup/dbdumps/hourly/apologetiikkawiki-hourly-wikidb-21.sql blaa@164.138.26.183:~
 Tein images-hakemistosta pullapallon ja lähetin sen uudelle virtuaalipalvelimelle.
tar cjvf /var/www/mediawiki_100926/images.tar.bz2 images
scp images.tar.bz2 blaa@164.138.26.183:~
 Lähetin myös LocalSettings.php-tiedoston uudelle virtuaalipalvelimelle.
scp LocalSettings.php blaa@164.138.26.183:~
Paketoin sitten extensions-hakemiston ja lähetin sen uudelle virtuaalipalvelimelle.
scp extensions.tar.bz2 blaa@164.138.26.183:~

 MediaWikin asennus uudelle palvelimelle

Kirjauduin uudelle virtuaalipalvelimelle aloittaakseni uuden MediaWikin asennuksen.
ssh blaa@164.138.26.183
Päätin wikin manuaalisesta päivityksestä seuraavan kärsimyksen minimoimiseksi asentaa wikin ensimmäistä kertaa käyttäen Ubuntun paketinhallintaa. Noudatin Ubuntu 10.04:ää silmällä pitäen kirjoitettuja MediaWiki.org:in ohjeita. Asensin tarvittavat paketit:
sudo apt-get install apache2 mysql-server php5 php5-mysql mediawiki
Asennusprosessin loputtua kirjauduin MySQL-tulkkiin.
 mysql -uroot -p
Loin MediaWikille uuden käyttäjän ja tietokannan.
create database wikidb;
grant select,insert,update,delete on blaadb.* to 'blaa'@'localhost' identified by 'blaa';
exit;
Tämän jälkeen tuuppasin tietokannan varmuuskopion uuden wikin tietokantaan.
mysql -uroot -p wikidb < apologetiikkawiki-hourly-wikidb-21.sql
Muokkasin tiedostoa apache.conf (nano -w /etc/mediawiki/apache.conf) ja poistin risuaidan seuraavalta riviltä.
Alias /mediawiki /var/lib/mediawiki
Tämän jälkeen käynnistin Apache2-demonin uudelleen.
sudo service apache2 restart
Menin Apache2:n käynnistyttyä selaimellani osoitteeseen http://164.138.26.183/mediawiki/ ja havaitsin, että wiki toimii. Niinpä etenin siirtämällä extensions- ja images-hakemistot asennetun MediaWikin hakemistorakenteeseen.
tar xjvf images.tar.bz2
tar xjvf extensions.tar.bz2
sudo mv images/* /var/lib/mediawiki/images/
sudo mv var/www/mediawiki_100926/extensions/* /var/lib/mediawiki/extensions/
Jatkoin asentamalla wikin osoitteessa http://164.138.26.183/mediawiki/. Vastailin kysymyksiin ja sitten siirsin juuri luodun asetustiedoston tarvittaviin paikkoihin.
cp /var/lib/mediawiki/config/LocalSettings.php /etc/mediawiki/
cp /var/lib/mediawiki/config/LocalSettings.php /var/lib/mediawiki/ 
Päivitin sivun, ja lopputuloksena oli toimiva wiki vanhan wikin sisällöillä. Migraation uudelle palvelimelle voidaan siis todeta onnistuneen.

Koska kello alkoi olla jo aika paljon (23.26) ja seuraavana päivänä oli tiedossa Linux-koe, päätin jättää teeman CSS:n viilailun, laajennusten asennuksen ja konfiguroinnin, virtual hostin asetuksen ja käyttöönoton, url_rewrite-moduulin (short url) käyttöönoton, wikin testauksen sekä nimipalvelimen konffimisen seuraavalle päivälle.

Kyllä ne ihmiset kestävät vanhaa palvelinta vielä pari päivää. 

torstai, 20. syyskuuta 2012

Usean tietokoneen hallinta SSH:n yli

Tässä raportissa kerron, miten onnistuin usean koneen hallinnassa SSH:n yli yhtäaikaisesti. Käytännössä tarkoituksenani oli luoda tietokoneelleni RSA-ID, lähettää se kohdekoneille ja luoda niihin hakemisto ~/helloworld.

Loin aluksi RSA-ID:n.
ssh-keygen
 Sitten kopioin sen kohdepalvelimille.
ssh-copy-id blaa@turkanen.tilaa.nl; ssh-copy-id blaa@192.168.100.48; ssh-copy-id blaa@myy.haaga-helia.fi
Tämän jälkeen komensin kaikkia kolmea etäkäytettävää tietokonetta luomaan käyttäjän kotihakemiston "hello world".
 for S in "blaa@turkanen.tilaa.nl" "blaa@192.168.100.48" "blaa@myy.haaga-helia.fi"; do ssh $S 'mkdir ~/helloworld'; done
Komento ei palauttanut mitään valituksia, joten kaikki meni oletettavasti hyvin. Varmistin kuitenkin asian selvittämällä, onko kohdekoneilla tällä hetkellä hakemisto "helloworld".
for S in "blaa@turkanen.tilaa.nl" "blaa@192.168.100.48" "blaa@myy.haaga-helia.fi"; do ssh $S 'ls ~ | grep helloworld'; done
Tuloste näytti siltä, miltä pitääkin, eli helloworld tulostui kolme kertaa.
helloworld
helloworld
helloworld
Lopuksi vielä poistin turhat hakemistot sekä RSA-autentikoinnit kohdetietokoneista, sillä en halua vaarantaa muiden tietokoneiden suojausta ympäri maailmaa liikkuvalla läppärilläni.
for S in "blaa@turkanen.tilaa.nl" "blaa@192.168.100.48" "blaa@myy.haaga-helia.fi"; do ssh $S 'rm -r ~/helloworld && rm ~/.ssh/authorized_keys'; done
Varmistin vielä, että hakemistot ja authorized_keys-tiedostot poistettiin ajamalla äskeisen komennon uudestaan. Nyt kohdetietokoneista ensimmäinen kysyi salasanaa, joten totesin äsken ajamani komennon tehneen tehtävänsä.

tiistai, 18. syyskuuta 2012

"Hei maailma" kolmella kielellä ja varmuuskopiointiskripti

Tavoitteenani oli saada "Hei maailma" toimimaan kolmella eri kielellä. Toinen tavoitteeni oli tehdä täysin automaattinen, syklinen varmuuskopiointiskripti wikilleni. Aloitin projektin 19.9. noin klo 07.05.

Perl

Käytin ohjenuoranani Troubleshootersin Hello World -ohjetta. Aloitin projektin (7.10.) selvittämällä, onko perl-tulkki jo asennettuna koneelleni, ja jos kyllä, missä on ajamiseen käytettävä binääri.
whereis perl
perl: /usr/bin/perl /etc/perl /usr/lib/perl /usr/bin/X11/perl /usr/share/perl /usr/share/man/man1/perl.1.gz
Loin hello.pl-tiedoston.
 nano -w hello.pl
Loin seuraavanlaisen tiedoston.
#!/usr/bin/perl
print "Hei maailma."\n
Muutin tiedoston ajettavaksi ja ajoin sen onnistuneesti.
$ chmod ugo+x hello.pl 
$ ./hello.pl 
Hei maailma.

 C++

Oppaanani käytin Ubuntu Geekin artikkelia, joka käsittelee C++:n toimivuuden testaamista Ubuntulla. Asensin (7.20) Ubuntuuni paketin build-essential. Sitten loin tiedoston hello.c.
sudo nano hello.c
 Tiedoston sisälltö oli seuraavanlainen:
#include <stdio.h>
int main()
{
printf("Hello, world\n");
return 0;
}
 Tämän jälkeen käänsin objektitiedoston ja binäärin.
 cc -c hello.c && cc -o hello hello.c
Sitten ajoin binäärin.
$ ./hello
Hello, world
Koska tuloste oli "Hello, world", totesin onnistuneeni.

Ruby

Käytin selkänojanani About.com-sivuston artikkelia Rubyn perusteista. Aloitin (07.35) asentamalla Ruby-ajoympäristön vaatimat paketit.
sudo apt-get install ruby1.8 ruby1.8-dev irb rdoc ri
Loin hello.rb-tiedoston (nano -w hello.rb), jolla oli seuraavanlainen sisältö:
#!/usr/bin/ruby
puts "Hello world!"
Sitten asetin tiedostolle ajo-oikeudet ja ajoin sen.
$ chmod ugo+x hello.rb && ./hello.rb
Hello world!

Mission accomplished!

Varmuuskopiointiskriptin luominen

http://www.apologetiikkawiki.fiPäätin luoda ylläpitämälleni ApologetiikkaWikille uuden varmuuskopiointiskriptin. Päädyin tekemään skriptistä kolme eri varianttia, joista ensimmäinen tarjoaa kannalle 24 palautuspistettä edellisen 24 tunnin ajalta. Toinen tarjoaa 7 palautuspistettä viimeisen viikon ajalta ja kolmas tarjoaa palautuspisteen per kuukausi. Kuukausittain tehtyjä varmuuskopioita ei ylikirjoiteta. Skriptit ajetaan cronilla (cron.hourly, cron.daily ja cron.monthly).

#!/bin/bash
#/etc/cron.hourly
mysqldump -u blaa --password=blaa blaadb -c > /tmp/hourly_backup && tar cjvf /backup/dbdumps/hourly/apologetiikkawiki-hourly-wikidb-$(date +%H).sql.bz /tmp/hourly_backup

#!/bin/bash
#/etc/cron.daily
mysqldump -u blaa --password=blaa blaadb -c > /tmp/daily_backup && tar cjvf /backup/dbdumps/daily/apologetiikkawiki-daily-wikidb-$(date +%d).sql.bz /tmp/daily_backup

#!/bin/bash
#/etc/cron.monthly
mysqldump -u blaa --password=blaa blaadb -c > /tmp/monthly_backup && tar cjf /backup/dbdumps/monthly/apologetiikkawiki-monthly-wikidb-$(date +%Y-%m-%d).sql.bz /tmp/monthly_backup

Raportissa mainitut tiedostot

tiistai, 11. syyskuuta 2012

Irkkausopas Haaga-Helian innovaattoreille (TN1PE-2012s)

Tämä ohje on suunnattu erityisesti Haaga-Helian IT-tradenomin koulutusohjelman innovaattorilinjan opiskelijoille (TN1PE-2012s). Myös muiden haagahelialaisten on helppoa soveltaa tätä opasta omiin tarkoituksiinsa.

Johdanto: perustietoa irkkaamisesta ja sen eduista

Innovaattorien ja kaikkien avoimen lähdekoodin kanssa tekemisissä olevien kannattaa irkata tai vähintäänkin opetella irkkaamaan, koska pienten ohjelmistoprojektien ainoa tuotetuki löytyy usein irkistä. Lisäksi innovaattoreille voi olla hyötyä kyetä yhteistyöhön erilaisten ohjelmistokehittäjien kanssa esimerkiksi avoimia ohjelmistoja oman innovaatioprojektin pohjana käytettäessä.

Kertauksena todettakoon, että IT-innovaattoriryhmällemme on perustettu IRC-kanava nimeltään #TN1PE-2012s, joka toimii Freenode-verkossa. Esimerkiksi weechat (IRC-asiakasohjelma) yhdistää automaattisesti Freenodeen. Kaikkien innovaattorien on syytä harkita kanavalle tulemista, koska siellä liikkuu paljon hyödyllistä tietoa ja vinkkejä – sieltä saa myös vertaistukea IT-ahdistuksessaan.

Suositeltava tapa irkata on laittaa palvelin irkkiin; kun haluat irkata, otat etäyhteyden palvelimeen ja irkata palvelinta etäkäyttämällä. Tämä voi kuulostaa monimutkaiselta, mutta on todella helppoa. Itse IRC-verkkoon liitytään weechatillä, joka käynnistetään screen-ohjelmalla. Tässä tapauksessa screen lähinnä mahdollistaa sen, että weechat jää palvelimella päälle, vaikka sulkisit ikkunan, jolla irkkaat.

Mitä järkeä siinä on, että palvelin on irkissä, vaikka sinä et olisi? Siksi, että irkissä voi liikkua hyödyllistä dataa sinun nukkuessasi tai ollessasi pois koneelta. Irkkiä usein tarkistetaan meilin tapaan eli ihmiset eivät useinkaan jumita irkissä aamusta iltaan. Voit esimerkiksi esittää kysymyksen irkissä, sulkea koneesi, ottaa illalla etäyhteyden palvelimeen, avata sillä weechatin ja katsoa, oletko saanut vastauksen.

Nyt itse asiaan eli oppaaseen. En aio syventyä teoriaan, vaan kerron mahdollisimman yksinkertaisesti, miten irkkaaminen käytännössä tapahtuu. Koulun palvelimelle ei voi asentaa weechatiä tai muitakaan IRC-asiakasohjelmia paketinhallinnan avulla, mutta weechatin (ja screenin) saa toimimaan alla olevilla ohjeilla. 

Weechatin ja screenin "asennus"

Kirjaudu myy-palvelimelle SSH:lla, esim. seuraavasti:
a1111111@myy.haaga-helia.fi
Luo kotihakemistoosi hakemisto bin, mene sinne, lataa valmiiksi käännetty weechat-binääri sekä screen-binääri netistä (vain jos luotat allekirjoittaneeseen) ja anna ladatuille tiedostoille ajo-oikeudet.
mkdir ~/bin && cd ~/bin && wget http://myy.haaga-helia.fi/~a1202425/screen http://myy.haaga-helia.fi/~a1202425/weechat-curses && chmod a+x screen && chmod a+x weechat-curses

Ääkköset toimimaan 

Myy-palvelin käyttää ISO-8859 -merkistökoodausta, ja tämän vuoksi käyttäjätilisi merkistökoodausta on muutettava, jottei ääkkösten kanssa tulisi irkissä (yleisesti) ongelmia. Avaa tiedosto ~/.bashrc muokattavaksi.
nano -w ~/.bashrc
Lisää tiedoston loppuun seuraava rivi:
export LANG="en_US.UTF-8"
Sulje tiedosto tallentaen (CTRL+X). Lopeta SSH-yhteys ja avaa uusi yhteys myy-palvelimeen. Jos käytät Puttyä, muista asettaa yhteyttä muodostaessasi asetusvälilehdeltä Window -> Translation "Remote Character Set" -kohtaan "UTF-8".

Weechatin käynnistys screenissä 

Tämän jälkeen voimmekin käynnistää weechatin screeniin. Tämä tapahtuu seuraavasti:
screen weechat-curses
Tästä eteenpäin weechat onkin sitten aina ja ikuisesti päällä, paitsi jos palvelin käynnistetään uudelleen tai erehdyt sulkemaan weechatin (esim. komentamalla /exit). Oikea tapa poistua irkistä on painaa CTRL+A+D tai vain sulkea terminaali-ikkuna/Putty. Pääset takaisin irkkaamaan (miltä tahansa koneelta milloin vain) ottamalla SSH-yhteyden palvelimeen, ja komentamalla:
screen -DRU
Voit liittyä innovaattoriryhmän kanavalle komentamalla weechatissä seuraavaa:
/join #TN1PE-2012s
Lisätietoja weechatin käytöstä löytyy täältä.

Summa summarum

Kun olet suoriutunut asennustoimenpiteistä, käynnistät weechatin komennolla "screen weechat-curses". Tämän jälkeen suljet aina SSH-ikkunasi (et weechatiä) tai painat CTRL+A+D. Kun haluat taas irkata, otat SSH-yhteyden palvelimeen ja komennat "screen -DRU".

PS. Ilmoitathan, jos mieleesi tulee jotain lisättävää tai muutettavaa.

maanantai, 10. syyskuuta 2012

OpenSSH-demonin asennus, käynnistys ja testaus

Asensin SSH-palvelun Ubuntuuni (12.04) 10.9. noin klo 14.25 Suomen aikaa. On helppoa valita käytetyin vaihtoehto, joten asensin OpenSSH:n demonin, joka käynnistyi automaattisesti ja otin siihen välittömästi yhteyden localhostia kohteena käyttäen.
sudo apt-get install openssh-server && ssh blaa@localhost
SSH-demonin asennuksen ja käynnistymisen jälkeen SSH-demoni kysyi minulta käyttäjän blaa salasanaa ja annoin sen. Pääsin kohdejärjestelmään. Selvittääkseni, olinko todella järjestelmässä SSH:n yli enkä lokaalisti, varmistin asian tarkistamalla sshd:n lokitiedostot. Ensin tietysti poistuin SSH-istunnosta komentamalla "exit", minkä jälkeen tarkistin lokin. Tässä lokin neljä viimeisintä riviä.
blaa@ubuntu:~$ cat /var/log/auth.log | grep sshd | tail -4
Sep 10 14:24:31 ubuntu sshd[3580]: Accepted password for blaa from 127.0.0.1 port 52703 ssh2
Sep 10 14:24:31 ubuntu sshd[3580]: pam_unix(sshd:session): session opened for user blaa by (uid=0)
Sep 10 14:26:20 ubuntu sshd[3743]: Received disconnect from 127.0.0.1: 11: disconnected by user
Sep 10 14:26:20 ubuntu sshd[3580]: pam_unix(sshd:session): session closed for user blaa
Loki siis kertoo, että käyttäjä blaa on kirjautunut SSH:n yli klo 14.24 (UTC+3) kieppeillä, mikä täsmää oman kirjautumiseni ajankohtaan SSH:n yli. Näin ollen rohkenin päätellä, että olin onnistuneesti kirjautunut järjestelmääni SSH:n yli.

SSH-istunto toiselta koneelta

11.9. noin klo 19.50 ajattelin kuitenkin varmistaa asian vielä eräällä toisella tavalla. Tein tämän kirjautumalla miniläppäriltäni SSH:n yli Mac OS X -tietokoneeseeni, jolta kirjauduin SSH:n yli miniläppäriini ajaen ifconfig-komennon; jos ifconfig antaisi tietokoneen IP-osoitteeksi miniläppärini IP-osoitteen, miniläppärini SSH:n on oltava toimiva. Tätä ennen selvitin miniläppärini IP-osoitteen ifconfigilla sekä Mac OS X -tietokoneeni IP-osoitteen nmapillä.
blaa@ubuntu:~$ ifconfig | grep 192.168          inet addr:192.168.100.32  Bcast:192.168.100.255  Mask:255.255.255.0
blaa@ubuntu:~$ nmap -sP 192.168.100.0/24
Starting Nmap 5.21 ( http://nmap.org ) at 2012-09-11 19:49 EEST
Nmap scan report for 192.168.100.1
Host is up (0.0041s latency).
Nmap scan report for ubuntu.Elisa (192.168.100.32)
Host is up (0.0047s latency).
Nmap scan report for Host-002.Elisa (192.168.100.48)
Host is up (0.017s latency).
Nmap done: 256 IP addresses (3 hosts up) scanned in 2.32 seconds
blaa@ubuntu:~$ ssh blaa@192.168.100.48
Password:
Last login: Tue Sep 09 13:22:55 2012 from ubuntu.elisa
host-002:~ blaa$ ssh blaa@192.168.100.32 'ifconfig | grep 192.168'     [ RSA-varmistus ]
blaa@192.168.100.32's password: 
          inet addr:192.168.100.32  Bcast:192.168.100.255  Mask:255.255.255.0
host-002:~ blaa$ exit
logout
Connection to 192.168.100.48 closed.
blaa@ubuntu:~$

sunnuntai, 9. syyskuuta 2012

Linux-tehtävissä käyttämäni tietokoneen tiedot

Linux-tehtävissä useimmiten käyttämäni tietokone on Asus Aspire One ZG5 -miniläppäri. Saman tauhkan toistamisen välttämiseksi laitan tarkat tiedot läppäristäni tähän yhteen postaukseen, johon viittaan aina tarvittaessa.
Tarkat tiedot läppäristäni ovat siis alla.
ubuntu@ubuntu:~$ sudo lshw -short && lsusb && lspci
H/W path             Device     Class       Description
=======================================================
                                system      AOA150 (Napa_Fab5)
/0                              bus         Motherboard
/0/0                            memory      1MiB BIOS
/0/14                           memory      1GiB System Memory
/0/14/0                         memory      512MiB DIMM DDR2 Synchronous 533 MHz
/0/14/1                         memory      512MiB DIMM DDR2 Synchronous 533 MHz
/0/1c                           processor   Intel(R) Atom(TM) CPU N270   @ 1.60G
/0/1c/1d                        memory      512KiB L2 cache
/0/1c/1e                        memory      32KiB L1 cache
/0/1c/0.1                       processor   Logical CPU
/0/1c/0.2                       processor   Logical CPU
/0/100                          bridge      Mobile 945GSE Express Memory Control
/0/100/2                        display     Mobile 945GSE Express Integrated Gra
/0/100/2.1                      display     Mobile 945GM/GMS/GME, 943/940GML Exp
/0/100/1b                       multimedia  N10/ICH 7 Family High Definition Aud
/0/100/1c                       bridge      N10/ICH 7 Family PCI Express Port 1
/0/100/1c.1                     bridge      N10/ICH 7 Family PCI Express Port 2
/0/100/1c.1/0        eth0       network     RTL8101E/RTL8102E PCI Express Fast E
/0/100/1c.2                     bridge      N10/ICH 7 Family PCI Express Port 3
/0/100/1c.2/0        wlan0      network     AR242x / AR542x Wireless Network Ada
/0/100/1c.3                     bridge      N10/ICH 7 Family PCI Express Port 4
/0/100/1c.3/0                   generic     SD/MMC Host Controller
/0/100/1c.3/0.2                 generic     Standard SD Host Controller
/0/100/1c.3/0.3                 generic     MS Host Controller
/0/100/1c.3/0.4                 generic     xD Host Controller
/0/100/1d                       bus         N10/ICH 7 Family USB UHCI Controller
/0/100/1d.1                     bus         N10/ICH 7 Family USB UHCI Controller
/0/100/1d.2                     bus         N10/ICH 7 Family USB UHCI Controller
/0/100/1d.3                     bus         N10/ICH 7 Family USB UHCI Controller
/0/100/1d.7                     bus         N10/ICH 7 Family USB2 EHCI Controlle
/0/100/1e                       bridge      82801 Mobile PCI Bridge
/0/100/1f                       bridge      82801GBM (ICH7-M) LPC Interface Brid
/0/100/1f.2          scsi0      storage     82801GBM/GHM (ICH7-M Family) SATA Co
/0/100/1f.2/0.0.0    /dev/sda   disk        160GB Hitachi HTS54321
/0/100/1f.2/0.0.0/1  /dev/sda1  volume      93GiB EXT4 volume
/0/100/1f.2/0.0.0/2  /dev/sda2  volume      954MiB Linux swap volume
/0/100/1f.3                     bus         N10/ICH 7 Family SMBus Controller
/0/1                 scsi2      storage    
/0/1/0.0.0           /dev/sdb   disk        3926MB SCSI Disk
/0/1/0.0.0/1         /dev/sdb1  volume      3741MiB Windows FAT volume
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 002: ID 0951:1643 Kingston Technology DataTraveler G3 4GB
Bus 001 Device 003: ID 064e:d101 Suyin Corp. Acer CrystalEye Webcam
Bus 004 Device 002: ID 0af0:7211 Option
00:00.0 Host bridge: Intel Corporation Mobile 945GSE Express Memory Controller Hub (rev 03)
00:02.0 VGA compatible controller: Intel Corporation Mobile 945GSE Express Integrated Graphics Controller (rev 03)
00:02.1 Display controller: Intel Corporation Mobile 945GM/GMS/GME, 943/940GML Express Integrated Graphics Controller (rev 03)
00:1b.0 Audio device: Intel Corporation N10/ICH 7 Family High Definition Audio Controller (rev 02)
00:1c.0 PCI bridge: Intel Corporation N10/ICH 7 Family PCI Express Port 1 (rev 02)
00:1c.1 PCI bridge: Intel Corporation N10/ICH 7 Family PCI Express Port 2 (rev 02)
00:1c.2 PCI bridge: Intel Corporation N10/ICH 7 Family PCI Express Port 3 (rev 02)
00:1c.3 PCI bridge: Intel Corporation N10/ICH 7 Family PCI Express Port 4 (rev 02)
00:1d.0 USB controller: Intel Corporation N10/ICH 7 Family USB UHCI Controller #1 (rev 02)
00:1d.1 USB controller: Intel Corporation N10/ICH 7 Family USB UHCI Controller #2 (rev 02)
00:1d.2 USB controller: Intel Corporation N10/ICH 7 Family USB UHCI Controller #3 (rev 02)
00:1d.3 USB controller: Intel Corporation N10/ICH 7 Family USB UHCI Controller #4 (rev 02)
00:1d.7 USB controller: Intel Corporation N10/ICH 7 Family USB2 EHCI Controller (rev 02)
00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev e2)
00:1f.0 ISA bridge: Intel Corporation 82801GBM (ICH7-M) LPC Interface Bridge (rev 02)
00:1f.2 IDE interface: Intel Corporation 82801GBM/GHM (ICH7-M Family) SATA Controller [IDE mode] (rev 02)
00:1f.3 SMBus: Intel Corporation N10/ICH 7 Family SMBus Controller (rev 02)
02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8101E/RTL8102E PCI Express Fast Ethernet controller (rev 02)
03:00.0 Ethernet controller: Atheros Communications Inc. AR242x / AR542x Wireless Network Adapter (PCI-Express) (rev 01)
04:00.0 System peripheral: JMicron Technology Corp. SD/MMC Host Controller
04:00.2 SD Host controller: JMicron Technology Corp. Standard SD Host Controller
04:00.3 System peripheral: JMicron Technology Corp. MS Host Controller
04:00.4 System peripheral: JMicron Technology Corp. xD Host Controller

LAMP-palvelimen asennus ja testaus

Asensin LAMP-palvelimen Ubuntun (12.04) live-ympäristöön Acer Aspire One -miniläppäriini (ks. tarkemmat tiedot). Asennuskohteena oli läppärini.

PHP:n käyttöönotto Apachessa

Asensin aluksi (9.9. klo 22.45 GMT+3) Apache2:n, PHP5-moduulin, MYSQL-palvelindemonin sekä MYSQL-asiakasohjelman. Tämän jälkeen otin userdir-moduulin käyttöön (jotta ~/public_html alkaisi toimia). Otin myös PHP5-moduulin käyttöön.
sudo apt-get install apache2 libapache2-mod-php5 mysql-server mysql-client && sudo a2enmod userdir && sudo a2enmod php5 && sudo service apache2 restart && mkdir ~/public_html/
Asetin PHP:n toimimaan myös käyttäjien kotihakemistoissa muokkaamalla Apachen konffia.
sudoedit /etc/apache2/mods-available/php5.conf
Muutin tiedostosta seuraavat rivit kommentoiduiksi:
#    <IfModule mod_userdir.c>
#        <Directory /home/*/public_html>
#            php_admin_value engine Off
#        </Directory>
#    </IfModule>

Käynnistin Apache-demonin uudelleen ja kokeilin, tulkkaako Apache2 kotihakemistoissa olevia *.php-tiedostoja. Tein tämän lynxillä.
sudo service apache2 restart && echo '<? echo ("PHP toimii kotihakemistossa"); ?>' > /home/ubuntu/public_html/index.php && sudo apt-get install lynx && lynx http://localhost/~ubuntu
Lynx palautti terminaaliemulaattoriin tekstin "PHP toimii kotihakemistossa.", mikä osoittaa, että PHP-koodi ajettiin onnistuneesti.

MySQL:in käyttöönotto

Yritin kirjautua MySQL-demonin komentotilaan, mutta törmäsin ongelmaan:
ubuntu@ubuntu:~$ mysql -uroot -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Hetken guuglattuani syyksi selvisi kovalevytilan puute. Koska järjestelmäni pyörii muistitikulla, tämä oli sen verran suuri ongelma, että päätin jättää leikin kesken klo 23.24 ja tehdä lopun tehtävästä (PHP-ohjelmoinnin) virtuaalipalvelimellani.

MySQL-kokeiluja virtuaalipalvelimella

Otin yhteyden Hollannissa sijaitsevaan virtuaalipalvelimeeni.
ssh blaa@turkanen.tilaa.nl
Kirjauduin mysqlin komentokäyttöliittymään.
mysql -uroot -p
Loin uuden käyttäjän ja uuden tietokannan.
create database myslitesti;
grant all privileges on myslitesti.* to 'myslitesti'@'localhost' identified by 'blaa';
Kirjauduin root-käyttäjältä ulos.
exit
 Otin tietokannan "myslitesti" käyttöön käyttäjällä "myslitesti".
mysql -umyslitesti -p myslitesti
Loin uuden taulun.
create table myslitesti;
Loin taulukolle rakenteen.
create table terkut (terkut TEXT, viimeisimmat TEXT);
Alustin tiedot.
 insert into terkut (kahva, terkut) values ('viimeisin', 'blaa');
Poistuin komennolla "exit" ja aloin kirjoittaa MySQL-tietokantaa käyttävää PHP-tiedostoa. Tavoitteena oli tehdä kikkare, joka kävijälle edellisen kävijän jättämät terveiset. Sähläsin MySQL-hakujen kanssa 10.9. klo 00.55 asti ja päätin jatkaa aamulla. Jatkoin nysväämistä 10.9. klo 06.30 ja luovutin klo 7.23, kun MySQL-haut eivät ottaneet onnistuakseen. Viimeisin yritykseni näytti tältä ja lähdekoodi seuraavanlaiselta:

<?
$yhteys = mysql_connect("localhost", "myslitesti", "blaa") or die ("Error: mysql_connect");
mysql_select_db("myslitesti", $yhteys) or die ("Error: mysql_select_db");
// Haetaan vanhat terkut kannasta
$vanhat_terkut = "SELECT * FROM terkut WHERE kahva = 'terkut'";
$vanhat_terkut = mysql_query($vanhat_terkut);
mysql_close ($yhteys);
?>

<!doctype html>
<head>
<title>Terkut</title>
<meta charset="utf-8" />
</head>

<body>
<form action="terkut.php" method="GET">
<table>
<tr><td><? echo $vanhat_terkut; ?></td></tr>
<tr><td><input type="text" name="uudet_terkut" /><input type="submit"
value="Lähetä" /></td></tr>
</table>
</body>

tiistai, 4. syyskuuta 2012

Apachen asennus ja Apache-lokien tarkastelua

Tero Karvisen Linux-johdantokurssilla (ICT1TN002-33) sain muun ryhmäni ohella tehtäväkseni asentaa maailman suosituimman weppipalvelimen, Apachen Ubuntuuni (Ubuntu 12.04). Asennetun Apachen lokiin minun oli määrä aiheuttaa tieto onnistuneesta sivun latauksesta sekä ilmoitus siitä, ettei sivua löydy. Sokerina pohjalla raportin lopussa on muistiinpanoja ensitapaamisestani Telnetin kanssa.

Apachen poisto, asennus, käyttöönotto ja testaus one-linerilla

Koska olin jo edellisellä tunnilla asentanut läppäriini Apachen, päätin poistaa sen hävittäen kaikki asetustiedostot ja asentaa apachen saman tien (4.9.2012 klo 20.35) uudelleen, koska kyseessä ei ole erityisen massiivinen projekti. En voinut välttää kiusausta kokeilla tehdä koko hommaa one-linerilla, joten typoja uhmaten komensin Ubuntuani seuraavalla tavalla:
sudo apt-get purge apache2 && sudo apt-get update && sudo apt-get install apache2 && sudo a2enmod userdir && sudo service apache2 restart && rm -r /home/erkkimon/public_html/ && mkdir /home/erkkimon/public_html/ && echo 'Hello world.' > /home/erkkimon/public_html/index.html && ssh himanen@192.168.100.48 'wget http://192.168.100.32/~erkkimon/index.html -o /dev/null' && ssh himanen@192.168.100.48 'wget http://192.168.100.32/~erkkimon/index.fail -o /dev/null'

Onnistuinko? – Lokien analyysi

One-linerin ajettuani, muutaman kerran sudolle ja SSH:lle salasanani annettuani ja hetken odoteltuani pääsin selvittämään, onnistuinko. Aluksi selvitin, oliko Apache kuullut asiakaskoneeni kaksi kutsua:
cat /var/log/apache2/access.log | tail -2
192.168.100.48 - - [04/Sep/2012:20:59:30 +0300] "GET /~erkkimon/index.html HTTP/1.0" 200 325 "-" "Wget/1.11.4"
192.168.100.48 - - [04/Sep/2012:20:59:31 +0300] "GET /~erkkimon/index.fail HTTP/1.0" 404 538 "-" "Wget/1.11.4"
Lokin mukaan siis asiakas IP-numerosta 192.168.100.48 on pyytänyt wget-asiakasohjelmalla Apachelta tiedostoa /~erkkimon/index.html HTTP-protokollan yli 4.9.2012 klo 20.59:30 ja sekuntia myöhemmin tiedostoa index.fail samasta hakemistosta. Tämän jälkeen katsoin Apachen virhelokista, onko Apache oletukseni mukaisesti ilmoittanut, ettei index.fail-tiedostoa ole.
erkkimon@ubuntu:~$ cat /var/log/apache2/error.log | tail -1
[Tue Sep 04 20:59:31 2012] [error] [client 192.168.100.48] File does not exist: /home/erkkimon/public_html/index.fail
Oletus oli oikea: Apache kirjasi virhelokiinsa, että 4.9.2012 klo 20.59:31 asiakas IP-osoitteesta 192.168.100.48 pyysi HTTP-protokollan yli tiedostoa /home/erkkimon/public_html/index.fail, mutta sitä ei ollut palvelimen tiedostojärjestelmässä.

Telnetiin tutustumista

Tehtävänäni oli myös kokeilla Telnetiä localhostilla sekä lisätehtävänä ladata sivu telnetillä localhostissa pyörivältä Apache-palvelimelta.

Aluksi testasin vain avata yhteyden ja rämpätä [Enter]-painiketta. Lopputuloksena oli vain rivinvaihtoja,  kunnes palvelin (localhost) kyllästyi leikkiimme ja sulki telnet-yhteyden. Siirryin kokeilemaan sivun lataamista telnetillä.

En aluksi tiennyt, miten sivu ladataan telnetillä. Löysin kuitenkin nopeasti vastauksen Microsoftin (!) Telnet-artikkelista. Puolustuksekseni totean, että klikkasin ekaa Google-hakutulosta ja vasta raporttiin linkkiä lisätessäni (= nyt) huomasin, että lähdesivusto on Microsoftin.
telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /~blaa/index.html
Hello world.
Connection closed by foreign host.
Lataaminen siis tehtiin GET-komennolla. Syntaksissa mielenkiintoa herättää tiedostopolun ilmoittaminen absoluuttiselta näyttävässä muodossa. Lisäksi laitoin merkille, että Apachen lokeissa ja Telnet-komennoissa on yhteisiä piirteitä.

Joka tapauksessa GET-komento palautti halutun tiedoston sisällön, joten homman voidaan todeta toimivan.

PS. One-linerin kirjoittamisen aloitushetken ja lokimerkinnän välillä on noin 25 minuutin ero. En suinkaan kirjoittanua one-lineria 25 minuuttia; toisessa koneessani on Mac OS X, joten aluksi minun tarvitsi ottaa Mac OS X -koneessa SSH-demoni käyttöön, asentaa Xcode, jonka jälkeen asensin Xcoden comman-line -ympäristön. Tämän jälkeen asensin MacPortsin, jonka jälkeen asensin sillä wgetin (sudo ports selfupdate && sudo ports install wget). Tämän raportin fokuksessa ei kuitenkaan ole wgetin asennus Mac OS X -koneelleni, joten päätin jättää wgetin asennuksen raportoinnin maininnan tasolle.