Osallistun Haaga-Helia ammattikorkeakoulussa Linux-palvelimet kurssille, jonka opettajana toimii Tero Karvinen. Kaikki tehtävät ovat hänen verkkosivuiltaan http://terokarvinen.com/.
Suoritan tehtävän pöytätietokoneellani, jossa pyörii Debian 9.7. ja samalla käytän Digital Oceanilta vuokrattua virtuaalipalvelinta, jossa pyörii Ubuntu 18.04.
Tehtävänanto kuuluu seuraavasti:
a) Laita hankkimallesi virtuaalipalvelimelle mahdollisuus tehdä kotisivuja normaalin käyttäjän oikeuksin.
s) Laita hankkimallesi virtuaalipalvelimelle käyttäjän kotihakemistoon tallennettu sivu näkymään Apachen oletussivuna.
y) Etsi palvelimesi lokeista esimerkkejä murtautumisyrityksistä. Voit etsiä lisätietoa IP-osoitteista ottamatta niihin yhteyttä esimerkiksi komennoilla ipcalc, geoiplookup ja whois.
b) Tee weppisivuja paikallisella koneellasi ja kopioi ne palvelimelle scp-komennolla.
c) Laita palvelimellesi jokin yksinkertainen PHP-sivu. Voit esimerkiksi tulostaa käyttäjän IP-osoitteen$_SERVER[‘REMOTE_ADDR’] tms. Ole huolellinen, jos otat vastaan syötteitä lomakkeilla (forms).
Vapaaehtoisia tehtäviä
Vinkkejä: lue linkitetyt artikkelit aikataulusta yltä ennenkuin alat tehdä tehtäviä. Muista viitata kaikkiin lähteisiin. Käytä aina hyviä salasanoja, joka hetki ja joka paikassa.
r) Kokeile julkista virtuaalipalvelinta (VPS). Voit vuokrata palvelimen esimerkiksi Linodelta, Amazonilta, DigitalOceanilta, OVH:lta tai monista muista paikoista. Edullisinta on käyttää GitHub Education -paketista DigitalOceanin palveluita.
Vaihtoehto: jos et jostain syystä halua vuokrata virtuaalipalvelinta, voit kokeilla tehdä testipalvelimen vagrantilla, mutta tämä ei ole yhtä jännittävää.
x) Laita julkinen domain-nimi osoittamaan koneeseesi. NameCheap ja Gandi ovat tunnettuja nimien vuokraajia. GitHub Education -paketista saa NameCheapilta .me domainin ilmaiseksi vuodeksi.
v) Laita monta DNS-nimeä samaan IP-osoitteeseen. Apache Name Based Virtual Hosting.t) Asenna WordPress. Se on maailman suosituin sisällönhallintajärjestelmä (CMS). Samalla opit asentamaan kolmannen osapuolen valmiita PHP-ohjelmia. WordPress kannattaa asentaa wordpress.org:sta löytyvästä tervapallosta (.tar.gz).
u) Kokeile WordPressia kirjoittamalla esimerkkisisältöä.
WordPress vapaaehtoisia:
c) Ota järkevät URLit (permalinks) käyttöön
d) Vaihda teema
e) Varmuuskopioi sisältö
f) Palauta varmuuskopioitu sisältö puhtaaseen WordPress-asennukseen
g) Tee WordPressiin oma teema
h) Asenna WordPressiin plugin (esim Dofollow)
i) Tee WordPressiin oma plugin
j) Lisää kuvia WordPressiin (ja laita tämä toimimaan)
k) Laita WordPress nimipohjaiseen virtuaalipalvelimeen (http://thello.foo tms)
Muita vapaaehtoisia:
l) Asenna Drupal ja kokeile sitä
m) Asenna Joomla ja kokeile sitä
n) Hanki virallinen, selainten hyväksymä TLS-sertifikaatti Let’s Encryptistä
o) Vaikea: Tee esimerkkisivu Python Flaskilla
p) Vaikea: Tee esimerkkisivu Ruby on Rails (tuotantotyyppinen, ei pelkkä yhden käyttäjän testipalvelin)
q) Vaikea: Tee esimerkkisivu Python Django:lla (tuotantotyyppinen, ei pelkkä yhden käyttäjän testipalvelin)
A.) S.) Etusivu käyttäjän kotihakemistoon
Tarkoituksena olisi ensimmäisessä tehtävässä luoda virtuaalipalvelimen kotisivu käyttäjän kotihakemistoon. Siispä otamme ensiksi yhteyttä palvelimeen $ ssh santeri@santerisiirila.me. Kun olemme sisällä voimme aloittaa tekemisen. Kello on 14:41.
Ensiksi luomme uuden uuden kansion, johon haluamme asettaa DocumentRoot-polun lopulta: $ mkdir publicsites. Kansion nimi tosin voi olla mikä tahansa. Sitten voimme käydä säätämässä asetuksia. $ cd /etc/apache2/sites-available. Tänne voimme asettaa uuden ohjauksen. Luomme siis siihen uuden .conf-tiedoston, joka tulee kertomaan uuden polun Apachen sivulle. Näin ainakin muistelin, että se menisi. Loin $ sudo nano publicsite.conf -komennolla tiedoston, joka oli täytetty opettajamme Tero Karvisen mukaan hänen kotisivuiltaan: http://terokarvinen.com/2018/name-based-virtual-hosts-on-apache-multiple-websites-to-single-ip-address. Publicsite.conf näytti lopuksi tältä:
<VirtualHost *:80>
ServerName santerisiirila.me
ServerAlias www.santerisiirila.me
DocumentRoot /home/santeri/publicsites/
<Directory /home/santeri/publicsites/>
Require all granted
</Directory>
</VirtualHost>
Sitten enabloin sivun komennolla $ sudo a2ensite publicsite.conf. Sen jälkeen yritin potkaista demonia uudelleen käyntiin $ systemctl restart apache2, joka normaalisti kysyisi vain salasanaa, mutta nyt sain tällaisen ilmoituksen:
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to restart 'apache2.service'.
Multiple identities can be used for authentication:
1. santeri,,, (santeri)
2. santeri,,, (santeri)
Choose identity to authenticate as (1-2):
Valitsin tähän “1”, jonka jälkeen kysyi salasanaa. Aloin kirjoittaa salasanaa, mutta sitten asiat menivät ihan sekaisin. Kesken salasanan kirjoitusta sain tällaisen:
Password: Failed to restart apache2.service: Connection timed out
See system logs and 'systemctl status apache2.service' for details.
santeri@ubuntu-s-1vcpu-2gb-fra1-01:/etc/apache2/sites-available$ polkit-agent-helper-1: pam_authenticate
Tämän jälkeen painoin Ctrl + C, että saan tapettua prosessin, mutta silti jokin oli hullusti. En nähnyt enää inputtiani ja kaikki olivat vähän “sekaisin”. Kun laittoi $ ls, niin listaus näytti todella sekavalta. Päätin vain antaa $ exit ja kirjautua jälleen uudestaan koneeseen. Tämän jälkeen kaikki vaikutti taas olevan normaalisti. Nyt sain käynnistettyä demonin normaalisti, mutta laitoin varmuudeksi ihan $ sudo systemctl restart apache2, aiemmin en laittanut sudoa, koska se yleensä kysyy salasanaa kumminkin.
Sitten menin takaisin kotihakemistoon: $ cd /home/santeri/publicsites. Siellä sitten vielä laitoin $ echo moikka kotihakemisto! > index.php. Tämän jälkeen menin Debianillani santerisiirila.me -sivulle. Tässä lopputulos:

Kaikki toimi kuten pitikin loppujenlopuksi. Kello on 15:16.
A.) Käyttäjien omat kotisivut
Tajusin vasta aiemman kohdan tehtyä, että haluttiinkin ainoastaan jokaiselle käyttäjälle oma kotisivu. Tein siis vahingossa myöhemmän tehtävän aiemmin. Teemme siis nyt ne käyttäjäkohtaiset kotisivut. Kello on 15:20.
Siispä etsin vähän tietoa, koska olen vähän unohtanut, kuinka ne asetukset saatiinkaan päälle. Etsin hakukoneesta “enable user directories apache”. Löysin tämän sivun: https://websiteforstudents.com/enable-userdir-apache2-nginx-ubuntu-17-04-17-10/. Siinä sanotaan, että antaa vain komennon $ sudo a2enmod userdir, jonka jälkeen Apache itse neuvoo käynnistämään demonin uudestaan $ sudo systemctl restart apache2 -komennolla. Tämän jälkeen kävin katsomassa santerisiirila.me-domainissa pyörivän palvelimeni /~santeri-polun. Siellä oli tällainen tilanne:

Minulla siis oli siellä valmiiksi index-sivu. PHP ei ole enabloitu käyttäjähakemistoissa siispä haluan vielä korjata nopeasti. Etsin taas hakukoneesta “enable php user apache”, josta löytyi tämä Stack Overflow -lanka: https://stackoverflow.com/questions/42654694/enable-php-apache2 Tein kuten langassa sanottiin, mutta php 5 sijasta kirjoitin php 7.2. Eli siis $ sudo a2enmod php7.2. Tuli tällainen ilmoitus:
santeri@ubuntu-s-1vcpu-2gb-fra1-01:/etc/apache2/sites-enabled$ sudo a2enmod php7.2
Considering dependency mpm_prefork for php7.2:
Considering conflict mpm_event for mpm_prefork:
Considering conflict mpm_worker for mpm_prefork:
Module mpm_prefork already enabled
Considering conflict php5 for php7.2:
Module php7.2 already enabled
Siispä menin katsomaan /etc/apache2/mods-available/-kansion. Sieltä etsin php7.2.conf-tiedoston, joka on modin konfiguraatiotiedosto. Katsoin sitä ja alimmat rivit olivat kommentoimatta, jossa juuri luki
# To re-enable PHP in user directories comment the following lines
# (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
# prevents .htaccess files from disabling it.
<IfModule mod_userdir.c>
<Directory /home/*/public_html>
php_admin_flag engine Off
</Directory>
</IfModule>
Siispä $ sudoedit php7.2.conf. Sieltä vain #-merkillä kommentoimaan viimeiset viisi riviä pois. Sitten vielä viimeiseksi $ sudo systemctl restart apache2, jonka jälkeen lopputulos oli tällainen:

Melkein ihmettelin, että miksi ei näkynyt lopputulosta PHP-osiosta, mutta sitten tajusin, etten edes tehnyt sitä print()-metodilla. Siispä siinä ainostaan syy. Kaikki toimii kuten pitääkin. Kello on 15:41.
Y.) Murtautumisyritysten tutkiminen
Seuraavassa tehtävässä olisi tarkoitus katsoa VPS-palvelimeni lokeja ja yrittää etsiä sieltä murtautumisyrityksiä. Niitä olisi tarkoitus myös vähän tutkia esimerkiksi geoiplookup-, whois- ja ipcalc-ohjelmilla.
Kirjoitin hakukoneeseen hakusanaksi “cheking breaking attempts linux”, joka antoi minulle tämän postauksen: https://serverfault.com/questions/260706/possible-break-in-attempt-in-var-log-secure-what-does-this-mean
Siinä käyttäjällä on CentOS, mutta varmaankin tapahtuu Ubuntussa lähes samalla tavalla ainakin. Eli hän oli katsonut lokia /var/log/secure. Menen siis itsekin etsimään jotain vastaavaa. $ cd /var/log, niin päästään lokitiedostojen äärelle. Siellä huomasin auth.log-tiedoston. Nimeltään vaikuttaisi oikealta tiedostolta. $ less auth.log. Selasin lokia ja yllätyksekseni sekä kauhukseni eri autentikaatioyritysten määrä oli järkyttävä. Esimerkiksi jos annoin komennon $ less auth.log |grep root, niin tässä oli esimerkkituloksia:
Feb 9 13:59:43 ubuntu-s-1vcpu-2gb-fra1-01 sshd[13751]: PAM 5 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=122.194.229.45 user=root
Feb 9 13:59:47 ubuntu-s-1vcpu-2gb-fra1-01 sshd[13753]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=122.194.229.45 user=root
Feb 9 13:59:50 ubuntu-s-1vcpu-2gb-fra1-01 sshd[13753]: Failed password for root from 122.194.229.45 port 8786 ssh2
Feb 9 14:00:05 ubuntu-s-1vcpu-2gb-fra1-01 sshd[13753]: message repeated 5 times: [ Failed password for root from 122.194.229.45 port 8786 ssh2]
Feb 9 14:00:05 ubuntu-s-1vcpu-2gb-fra1-01 sshd[13753]: error: maximum authentication attempts exceeded for root from 122.194.229.45 port 8786 ssh2 [preauth]
Feb 9 14:00:05 ubuntu-s-1vcpu-2gb-fra1-01 sshd[13753]: Disconnecting authenticating user root 122.194.229.45 port 8786: Too many authentication failures [preauth]
Feb 9 14:00:05 ubuntu-s-1vcpu-2gb-fra1-01 sshd[13753]: PAM 5 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=122.194.229.45 user=root
Feb 9 14:00:10 ubuntu-s-1vcpu-2gb-fra1-01 sshd[13755]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=122.194.229.45 user=root
Feb 9 14:00:12 ubuntu-s-1vcpu-2gb-fra1-01 sshd[13755]: Failed password for root from 122.194.229.45 port 33968 ssh2
Feb 9 14:00:15 ubuntu-s-1vcpu-2gb-fra1-01 sshd[13759]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=112.85.42.232 user=root
Feb 9 14:00:15 ubuntu-s-1vcpu-2gb-fra1-01 sshd[13755]: Failed password for root from 122.194.229.45 port 33968 ssh2
Feb 9 14:00:17 ubuntu-s-1vcpu-2gb-fra1-01 sshd[13759]: Failed password for root from 112.85.42.232 port 20172 ssh2
Nämä olivat vain esimerkkejä. Jos laittoi $ tail -F auth.log, niin tuloksia tuli lähes joka sekunti lisää.
Testataanpa tutkia hieman näitä kyseisiä IP-osoitteita. Ensiksi $ sudo apt install ipcalc. Sitten $ man ipcalc. Tämän jälkeen tiesin, että vain $ ipcalc <osoite>, joten tässä tulokset yhdeltä IP:ltä:

Nämä tulokset eivät kertoneet minulle pahemmin mitään. Jatketaan tutkimista. Testataan whois-ohjelmaa seuraavaksi. $ sudo apt install whois. $ whois 122.194.229.45. Tällä kertaa tulokset olivatkin mielenkiintoisempia:

Tällaista tuloksissa esimerkiksi luki. Nähtävästi kiinalaisia, mutta varmaankin käyttävät joten whois-hämäystä, mutta saattaa jotkin tiedoista pitävän paikkaansa.
Katsoin vielä huvikseni toisenkin IP:n, joka oli yrittänyt murtautua:

Nähtävästi hollantilainen. Voisi ehkä jopa pitää paikkaansa. Yritin vielä katsoa geolookupia, mutta en löytänyt. Vaikka etsin ihan $ apt-cache search lookup geo. Siltikään ei mitään sellaista ohjelmaa löytynyt paketinhallinnasta. Kello on 16:26.
B.) Sivujen tekeminen paikallisesti ja lähetys SCP:llä
Seuraavaksi olisi tarkoitus luoda tiedostot paikallisella koneella ja sitten siirtää ne palvelimelle SCP:llä (https://en.wikipedia.org/wiki/Secure_copy). Muistaakseni tähän tarvittiin SSH-avainpari, joten etsin hakukoneesta ohjeita, kuinka sellainen laitetaan. Tein paikallisella koneella aluksi kyllä SSH-keygenillä itselleni SSH-avaimen, mutta en vain tiennyt, kuinka se otetaan vastaan palvelimella ja tallennetaan. Tein sen siis sen avaimen näin:
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/santeri/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/santeri/.ssh/id_rsa.
Your public key has been saved in /home/santeri/.ssh/id_rsa.pub.
Menin hakemaan avaimen näin: $ cat /home/santeri/.ssh/id_rsa.pub ja kopioin sen leikepöydälle. Nyt vain miettimään, että mihin se tulee laittaa. Etsin hakukoneesta “add ssh key pair” ja löysin tämän artikkelin https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys–2. Otin sieltä $ cat ~/.ssh/id_rsa.pub | ssh santeri@santerisiirila.me “mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys” komennon, joka ymmärtääkseni lisäsi SSH-avaimen onnistuneesti. Kun testasin kirjautua palvelimelle, niin sen sijaan, että kysyisi salasanaa tunnukseen, niin kysyikin salasanaa avaimeen, joka oli suojattu erillisellä salasanalla. Tämän asetettua pääsin sisälle palvelimelle ja tietääkseni sain SSH-avainparin toimimaan.
Seuraavaksi tein nopeasti, jonkin sivun, jonka voin sitten siirtää SCP:llä.
Näin pari tuntia myöhemmin, niin eihän se lopulta kauhean nopeasti sittenkään sujunut. Yritin väsertää sivua pari tuntia, vaikka halusin vain todella yksinkertaisen sellaisen. Kiitos IDE:n (WebStorm), niin asioiden arvailu oli edes hieman helpompaa.
Nyt olisi tarkoitus siirtää sivusto SCP:llä tuolle palvelimelle. Löysin heti hakukoneesta tällaisen sivun: https://linuxize.com/post/how-to-use-scp-command-to-securely-transfer-files/. Siinä kerrotaan, että siirtäminen tapahtuu ihan vain $ scp <tiedosto> <käyttäjänimi>@<palvelin>:/<hakemisto>. Vaikka minulla on vain yksi tiedosto, niin haluan tehdä niin kuin minulla olisi kokonainen hakemistollinen kopioitavaa. https://serverfault.com/questions/264595/can-scp-copy-directories-recursively Tämän sivun mukaan “-r” olisi avainsana. Yritin scp -r testisivu/ santeri@santerisiirila.me:/publicsites, mutta sain vain virheen: scp: /publicsites: Permission denied. Outoa, koska pääsen ihan ilman salasanaa SSH:lla palvelimelle, koska loin avainparin. Etsin siis tähän vastausta. Löysin vastauksen tältä sivulta https://askubuntu.com/questions/66492/scp-copy-over-ssh-doesnt-work-permission-denied-error-please. Syy oli, että kirjoitin /publicsite, joka tarkoittaisi sitä, että yrittäisin kopioida juurihakemistossa sijaitsevaan publicsites-kansioon tiedostoja. Siispä joko koko polku (/home/santeri/publicsites) tai vain hakemisto (publicsites) ilman juurihakemistoa (/). Loppuun kirjoitetaan tiedostonimi. Tässä siis lopputulos:

Poistin index.php-tiedoston komennolla $ rm index.php, etteivät nämä kaksi index-sivua mene ristiin.
Sitten vielä visiitti santerisiirila.me-sivulla:

Se toimii! Tehtävässä meni paljon kauemmin CSS:n kanssa säätämisen takia, joten siksi tässä tehtävässä meni noin 2,5 tuntia. Kello on 18:38.
C. Yksinkertainen PHP-sivu
Seuraavaksi piti vielä tehdä yksinkertainen PHP-sivu. Päätin tehdä tehtävässä ehdotetun IP-näyttäjän. Päätin hakea vähän apuja. Löysin tämän sivun: https://ccm.net/faq/1965-php-how-to-display-ip-address-of-a-visitor. Siinä näytettiin IP:n formaatti paremmin kuin opettajamme ohjeessa (http://terokarvinen.com/2018/aikataulu-linux-palvelimet-ict4tn021-3004-ti-alkukevat-2019-5-op).
Sain IP:n printattua siis näin:
<?php print("$_SERVER[REMOTE_ADDR]");?>
Muutin myös tiedostomuodon .html-muodosta .php-muotoon komennolla $ mv index.html index.php. Tämän jälkeen sivu näytti IP-osoitteen, mutta haluan vielä säätää fonttia suuremmaksi ja paremman näköiseksi. Siispä muokkasin hieman koodia ja lopputulos näytti koodin osalta tältä:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Coming soon...</title>
<style>
body {
background-color: #888888;
}
.main {
display: block;
margin-left: auto;
margin-right: auto;
width: 100%;
}
h1 {
color: #ffffff;
margin-top: 10%;
vertical-align: middle;
font-family: GentiumAlt;
align-items: center;
text-align: center;
}
.ip {
margin-top: 5%;
font-family: Courier;
font-size: 45pt;
text-align: center;
}
</style>
</head>
<body>
<h1>Coming soon... </h1>
<img src="https://free-astro.org/images/0/04/Debian_logo.png">
</div>
</body>
</html>
Sivu toimi mallikkaasti ja näyttää ihan tyylikkäältä. Lopputulosta en viitsi näyttää, koska siinä lukee IP-osoitteeni, mutta voi käydä katsomassa sivulta http://santerisiirila.me/. Tässä tehtävässä meni paljon vähemmän kuin oletin, mutta kiva joskus näinkin päin. Kello on 18:56.
N.) TLS-sertifikaatti
Näissä tehtävissä meni tällä kertaa sen verran vähän aikaa, että päätin tehdä yhden lisätehtävän, jonka samalla koen hyödylliseksi. En välttämättä koe WordPressiä niin hyödyllisenä, vaikka voisi olla joskus ihan käytännöllinen.
Menin Let’s Encryptin sivuille https://letsencrypt.org/getting-started/. Sieltä minut ohjattiin Certbotiin (https://certbot.eff.org/), koska minulla on “Shell access”. Sieltä piti valita alusta (Apache) ja järjestelmä (Ubuntu 18.04 LTS). Tein asennuksen täysin tämän ohjeen mukaan: https://certbot.eff.org/lets-encrypt/ubuntubionic-apache. Eli siis:
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository universe
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install certbot python-certbot-apache
Tämän jälkeen käynnistin Certbotin komennolla:
$ sudo certbot --apache
Tämän jälkeen sertifikaattien asennus alkoi. Tässä on terminaalini output ja vastaukset kysymyksiin. Lihavoitan omat vastaukseni erottuvuuden vuoksi. Vastaukset ovat vaikeasti nähtävissä, koska ne ovat yleensä vain kirjaimen tai numeron pituisia.
santeri@ubuntu-s-1vcpu-2gb-fra1-01:~/publicsites$ sudo certbot –apache
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices) (Enter ‘c’ to
cancel): santeri.siirila@gmail.com
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
(A)gree/(C)ancel: a
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let’s Encrypt project and the non-profit
organization that develops Certbot? We’d like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
(Y)es/(N)o: n
Which names would you like to activate HTTPS for?
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
1: santerisiirila.me
2: http://www.santerisiirila.me
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter ‘c’ to cancel): 1, 2
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for santerisiirila.me
http-01 challenge for http://www.santerisiirila.me
Enabled Apache rewrite module
Waiting for verification…
Cleaning up challenges
Created an SSL vhost at /etc/apache2/sites-available/publicsite-le-ssl.conf
Enabled Apache socache_shmcb module
Enabled Apache ssl module
Deploying Certificate to VirtualHost /etc/apache2/sites-available/publicsite-le-ssl.conf
Enabling available site: /etc/apache2/sites-available/publicsite-le-ssl.conf
Deploying Certificate to VirtualHost /etc/apache2/sites-available/publicsite-le-ssl.conf
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
1: No redirect – Make no further changes to the webserver configuration.
2: Redirect – Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you’re confident your site works on HTTPS. You can undo this
change by editing your web server’s configuration.
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Select the appropriate number [1-2] then [enter] (press ‘c’ to cancel): 2
Enabled Apache rewrite module
Redirecting vhost in /etc/apache2/sites-enabled/publicsite.conf to ssl vhost in /etc/apache2/sites-available/publicsite-le-ssl.conf
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Congratulations! You have successfully enabled https://santerisiirila.me and
https://www.santerisiirila.me
You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=santerisiirila.me
https://www.ssllabs.com/ssltest/analyze.html?d=www.santerisiirila.me
Kun asennus oli valmis, niin kävin katsomassa sivuni, mutta en saanut yhteyttä enää. Odotan jonkin aikaa, jos se olisi vain väliaikainen yhteysvirhe. Toivottavasti nyt jokin ei levinnyt aivan totaalisesti. Ping toimii hyvin, mutta selain ei vain saa yhteyttä. Veikkaan, että Certbot muutti konfiguraatioita niin, että yhteyttä ei voida muodostaa. Kello on paussin kohdalla 19:28.
Taukoa pidin noin 15 minuuttia ja mietitytti, että miksei asiat toimi. Ping toimi, mutta ei HTTP-requestit. Sitten se valkeni minulle. Kävin katsomassa /etc/apache2/sites-available/, jonne oli generoitu publicsite-le-ssl.conf-tiedosto. En tiennyt, että SSL vaatii TCP-porttia 443 auki toimiakseen. Siispä, kun en saanut yhteyttä, niin palvelimeltani vain annoin komennon $ sudo ufw allow 443/tcp, jolla saadaan avattua tuo kyseinen portti. Käynnistin demonin vielä uudestaan $ sudo systemctl restart apache2, jonka jälkeen tulos oli tällainen:

Tadaa! Sivuillani on nyt toimivat sertifikaatit.
Tehtävän lopetettua kello on 20:03.
Tehtäviin meni siis kokonaisuudessaan noin 6 tuntia.

Osallistun Haaga-Helia ammattikorkeakoulussa Linux-palvelimet kurssille, jonka opettajana toimii Tero Karvinen. Kaikki tehtävät ovat hänen verkkosivuiltaan http://terokarvinen.com/.
Suoritan tehtävän pöytätietokoneellani, jossa pyörii Debian 9.7.
Tehtävänanto kuuluu seuraavasti:
Tee viisi vapaavalintaista kohtaa. Säädä vaikeustaso oikeaksi: jos olet ihan alussa ja tämä on haastavaa, tee helpoimmat a b c d i. Jos osaat jo perusteet, tee useampia tai vaikeampia kohtia. Tarkoitus on, että tehtävät tehtyäsi osaat enemmän kuin osasit ennen.
a) Asenna Apache, laita käyttäjien kotisivut (http://example.com/~tero) toimimaan. Testaa esimerkkikotisivulla.
b) Surffaa oman palvelimesi weppisivuja. Etsi Apachen lokista esimerkki onnistuneesta (200 ok) sivulatauksesta ja epäonnistuneesta (esim 404 not found) sivulatauksesta. Analysoi rivit.
c) Tee virhe weppipalvelimella ajettavaan koodiin (esim PHP tai Python), etsi se lokista ja analysoi tuo lokirivi
d) Tee virhe johonkin Apachen asetustiedostoon, etsi ja analysoi tuo rivi. Etsimiseen sopivat esimerkiksi Apachen omat lokit, syslog sekä ‘apache2ctl configtest’.
e) Asenna ja kokeile PhpMyAdmin:a tai jotain muuta valmista weppiliittymää tietokantojen hallinnointiin.
f) Tee palvelimella ajettava weppiohjelma, joka tekee käyttäjälle jonkin yksinkertaisen laskun (esim. painoindeksi BMI)
g) Tee palvelimella ajettava weppiohjelma, joka käyttää tietokantaa. Voit tehdä jonkin yksinkertaisen CRUD-ohjelman, esimerkiksi TODO-listan
h) Tee Apachelle uusi sivu, joka näkyy suoraan palvelimen pääsivulla, mutta jonka sivuja voi muokata normaalin käyttäjän oikeuksilla (name based virtual host, DocumentRoot käyttäjän kotihakemistoon).
i) Kuinka monta eri HTTP Status:ta (200, 404, 500…) saat aiheutettua lokeihin? Selitä, miten aiheutit tilanteet ja analysoi yksi rivi kustakin statuksesta.
j) Asenna LAMP (Linux, Apache, MySQL, PHP). Testaa kunkin komponentin toiminta. Testaa lopuksi kokonaisuus. (Voit aloittaa tilanteesta, jossa Linux-käyttöjärjestelmä on jo asennettu, mutta ei muita (AMP) osia.
k) Kokeile jotain Flaskin uutta ominaisuutta flask-testipalvelimessa. Voit kokeilla esim. muotteja (templates), tietokantaa tai syötteiden ottamista lomakkeilta (forms).
l) Asenna Python Flask + PostgreSQL + Apache mod WSGI. Testaa kunkin komponentin toiminta. Testaa lopuksi kokonaisuus. (vaikea)
Vaikka tehtävänannossa on tarkoitus tehdä vain viisi tehtävää, niin haluan silti yrittää tehdä kaikki. Tämä on kumminkin vain tavoite. Todennäköistä, että vain viisi tulee tehdyksi.
L.) Python Flask, PostgreSQL ja Apache mod WSGI
Tehtävän L oli tarkoitus ilmeisesti olla vaikein. Kyseisessä tehtävässä tulisi siis asentaa Python Flash, Postgre ja Apache mod WSGI sekä testata niiden kokonaisuus. Aloitin tehtävän noin klo 12:00
Etsiskelin hetken ja löysin ensimmäisen sivuston, joka varmaankin voisi auttaa tässä tehtävässä: https://www.digitalocean.com/community/tutorials/how-to-deploy-a-flask-application-on-an-ubuntu-vps. Sivulla olevan ohjeen mukaan, ensiksi tulisi asentaa apache2. Joten asensin sen komennolla $ sudo apt install apache2. Sen jälkeen piti ohjeen mukaan asentaa libapache2-mod-wsgi ja python-dev, joten terminaaliin tämä:
$ sudo apt install libapache2-mod-wsgi python-dev
Kaikki näytti toimivan aluksi hyvin, ei virheitä asennuksessa. Python-dev minulla olikin jo entuudestaan, joten sain vain tiedon, että se on viimeisimmässä versiossaan. Versio oli 2.7, joka vähän herätti epäilystä, sillä Python on versiossa 3.7 tällä hetkellä ja ohje oli vuodelta 2013, mutta katsotaan, miten tässä käy. Seuraavaksi tulisi enabloida mod_wsgi, joka tapahtuu ohjeen mukaan komennolla $ sudo a2enmod wsgi – tuli vain teksti “Module wsgi already enabled”.
Sitten olisikin kai tarkoitus tehdä Flask-applikaatio. Tulen tekemään sen ohjeiden mukaan, vaikka ovatkin hieman vanhat. Ohjeen mukaan pitää ensiksi mennä hakemistoon /var/www/, joten $ cd /var/www. Sen jälkeen vielä $ pwd, jotta saamme varmuuden olevamme oikeassa alihakemistossa: /var/www. Tämän jälkeen tehdään kaksi FlaskApp-hakemistoa, yksi /var/www-hakemistoon ja toinen FlaskApp-hakemiston sisälle. Sen jälkeen vielä siihen toiseen FlaskApp-hakemistoon luodaan kaksi hakemistoa static ja templates. Eli siis näin:
$ sudo mkdir FlaskApp
$ cd FlaskApp/
$ sudo mkdir FlaskApp
$ cd FlaskApp/
$ sudo mkdir static templates
$ pwd
/var/www/FlaskApp/FlaskApp
$ ls
static template
Sitten luomme hakemistoon vielä __init__.py-tiedoston, joka siis tehdään vaikka näin: $ sudo nano __init__.py
Tämän jälkeen siihen tulisi laittaa tämä pätkä koodia ja sen jälkeen tallentaa:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello, I love Digital Ocean!"
if __name__ == "__main__":
app.run()
Näiden jälkeen asennamme pip-ohjelman, mutta minulla taitaa olla jo se. Testataan silti vielä: $ sudo apt install python-pip. Kyllä minulla se oli, mutta kannatti tarkistaa. Seuraavaksi piti asentaa virtualenv pip:llä, mutta kun annoin komennon $ sudo pip install virtualenv, niin mainittiin jälleen Python 2.7. Katsotaan miten käy lopputuloksen. Sitten luotiin virtuaaliympäristö komennolla $ sudo virtualenv venv, jossa “venv” on halutun ympäristön nimi. Sitten aktivoidaan ympäristö antamlla komento: $ source venv/bin/activate, jolloin terminaali näytti tältä: 
Sitten kun virtuaaliympäristö on käynnissä, niin annetaan Flaskin asennuskomento $ sudo pip install Flask. Kaikki vaikutti asentuvan ongelmitta. Sitten testattiin toimintaa $ sudo python __init__.py, jonka jälkeen terminaali näytti tältä: 
Käydään katsomassa selaimella tuo http://127.0.0.1:5000.
Sehän toimi! Sitten voidaan tappaa tuo CTRL + C -yhdistelmällä ja sitten voidaan deaktivoida tuo ympäristö komennolla deactivate. Nyt ollaan testattu, että kokonaisuus toimii edes jotenkin. Seuraavaksi pitäisi tehdä konfiguraatiotiedosto, mutta minusta tuntuu, että se on tarkoitettu vain sellaisille palvelimille, jotka on tarkoitettu tuotantoon, eikä ainoastaan pyöri localhostissa. Joten ohitamme ohjeesta kohdan neljä ja hyppäämme suoraan viidenteen.
Vielä olisi tarkoitus tehdä .wsgi-tiedosto /FlaskApp-kansioon, joten siis annetaan jälleen komentoa terminaaliin: $ cd /var/www/FlaskApp. Sitten vaikka nanolla uusi tiedosto, jonka nimi on flaskapp.wsgi. $ sudo nano flaskapp.wsgi. Laitoin tiedostoon juuri kuten ohjeessa sanotaan eli:
#!/usr/bin/python
import sys
import logging
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0,"/var/www/FlaskApp/")
from FlaskApp import app as application
application.secret_key = 'Add your secret key
Sitten käynnistetään apache2 uudelleen komennolla $ sudo service apache2 restart. Katsotaan sitten vielä, miltä sivu näyttää. Näyttää edelleen samalta ja toimii. Apache2 mod WSGI ja Python Flask siis toimivat. Vielä jos saisi yhdistettyä PostgreSQL:n tähän kokonaisuuteen. Yritetään!
Ensiksi varmaankin pitäisi asentaa PostgreSQL, mutta minulla on se jo asennettu, sillä käytimme sitä Ohjelmistoprojekti 1 -kurssilla. Se asennettaisiin normaalisti $ sudo apt install postgresql -komennolla. Joten tehdään varmaan ensiksi tietokanta. Mennään siis Postgren kehotteeseen luomaan kanta. $ sudo -u postgres psql, niin saamme luotua kannan postgres-käyttäjällä. Annoin ‘CREATE DATABASE test’ -komennon, sen jälkeen yhdistin siihen komennolla: # \connect test, tämä postauksen ansiosta: https://stackoverflow.com/questions/3949876/how-to-switch-databases-in-psql. Sen jälkeen loin sinne pöydän: # create table animals (id serial primary key, name text); Kiitos tästä formaatista Tommi Santamaalle (https://tommioffinland.fi/) tästä luontiformaatista.Nyt enää testidataa pöytään ja sitten voi yrittää kokonaisuutta yhdessä. Tältä sivulta katsoin lisäysformaatin: https://www.postgresql.org/docs/9.5/sql-insert.html. Eli siis #insert into animals values (1, ‘Giraffe’), (2, ‘Hippo’), (3, Flamingo); Tämän jälkeen tarkistus komennolla select * from animals;

Kaikki on tältä osin kunnossa. Sitten testaamaan kokonaisuutta.
Löysin tällaisen sivun, missä neuvottiin, kuinka tietokantayhteys otetaan Flaskillä. http://blog.sahildiwan.com/posts/flask-and-postgresql-app-deployed-on-heroku/ Siinä käytetään Herokua, mutta kyllä varmaan toimii ilman Herokuakin. Käytin myös apuna tätä videoa https://www.youtube.com/watch?v=VQM4QcozoW4. Asensin SQL Alchemyn komennolla $ pip install flask_sqlalchemy. Nyt kannan yhdistäminen voidaan varmaankin aloittaa.
Muokkasin aiemmin tehtyä __init__.py-tiedostoa $ sudo nano __init__.py-komennolla. Muokkasin sitä tällaiseksi:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = 'postgresql://postgres:Ku1v4hk0123#"!@localhost:5432/test'
db = SQLAlchemy(app)
@app.route("/")
def hello():
return db.query("SELECT * FROM ANIMALS;")
if __name__ == "__main__":
app.run()
Tuo ei toiminut ja olen yrittänyt jo monia muitakin muotoja, mutta saan internal server erroria koodilla 500. Olen tehnyt tehtävää jo noin 4,5 tuntia, että ehkä nyt on aika tehdä muita tehtäviä, jos vaikka tajuaisin tuon tehtävän jossain välissä paremmin. Kello on 16:42.
K.) Flask-ominaisuuden testaus
Seuraavaksi oli tarkoitus testata jotain Flask-ominaisuutta. Äskeisen tehtävän takia olen jo asentanut Flaskin, joten seuraavaksi vain etsin “flask templates”, kuten mainittiin tehtävänannossa. Kello on 16:55.
Löysin tällaisen sivun: https://code-maven.com/using-templates-in-flask. Siinä yritetään hyödyntää juuri templateja, mutta en ymmärrä kauhean hyvin, että kuinka ne toimivat. Tein kolme erillistä tiedostoa juuri kuten tuolla sanottiin, mutta saan vain virheilmoituksia, joka kerta kun yritän ajaa ohjelmaa.
Tiedostoni näyttävät tältä:
__init.py__
from flask import Flask, request, render_template
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
@app.route("/")
def hello():
return render_template('echo.html')
@app.route("/echo", methods=['POST'])
def echo():
return "You said: " + request.form['text']
if __name__ == "__main__":
app.run()
echo.html
<form action="/echo" method="POST">
<input name="text">
<input type="submit" value="Echo">
</form>
{% if text %}
You said: {{ text }}
{% endif %}
echo_template.py
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route("/")
def hello():
return render_template('echo.html')
@app.route("/echo", methods=['POST'])
def echo():
return render_template('echo.html', text=request.form['text'])
if __name__ == "__main__":
app.run(debug=True)
Hetken aikaa pähkäiltyä ja etsiskeltyä apua, löysin tämän langan: https://stackoverflow.com/questions/23327293/flask-raises-templatenotfound-error-even-though-template-file-exists. Tässä kerrottiin, että .html-ekstension omaava tiedosto pitää sijoittaa templates-hakemistoon. Siispä siirsin echo.html-tiedoston komennolla mv echo.html /var/www/FlaskApp/FlaskApp/templates/echo.html.
Kun ajoin __init__.py-tiedoston uudelleen niin kappas, sehän aukesi:

Vielä pieni testi:
Näytti toimivan ihan hyvin. Tiedostorakenne näytti siis tältä lopuksi:
/var/www/FlaskApp/FlaskApp$ ls
echo_template.py __init__.py static templates venv
Ja templates-hakemisto vielä lisäksi:
santeri@debian:/var/www/FlaskApp/FlaskApp$ cd templates/
santeri@debian:/var/www/FlaskApp/FlaskApp/templates$ ls
echo.html
Kaikki vakutti toimivan, kuten juuri pitäisikin. Siis lopetin tehtävä tähän pisteeseen. Kello on 17:48.
J. LAMP-asennus
Seuraavaksi olisi tarkoitus asentaa LAMP, eli Linux, Apache, MariaDB/MySQL ja PHP. Linux minulla on jo, sillä teen tälläkin hetkellä Debian jakelulla näitä tehtäviä. Apache2 minulla on aiempien tehtävien ansiosta, mutta SQL-tietokanta puuttuu sekä PHP, joten asennan ne nyt. Kello on 17:55
$ sudo apt install mariadb-client mariadb-server php7.0
Sitten asetetaan toimintakuntoon. Tarkistetaan localhost, että onko siellä jo jotain odottelemassa. 
Apache vaikutti olevan toiminnassa, joten seuraavaksi katsotaan, jos saataisi PHP toimimaan localhostissa. Etsin hieman apuja hakukoneesta, sillä kaikkea en tahdo muistaa oppitunnilta. Siispä tämä sivu toimii toistaiseksi apuna: https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-ubuntu-16-04 Seuraavaksi olisi kummiskin tarkoitus käydä enabloimassa PHP apache2:sta. Joten mennään Apache2-demonin hakemistoon eli /etc/apache2. Siellä vaan komento $ grep -ir php, jotta tiedetään, että mistä saadaan PHP toimintaan. Löytyi /mods-available, jossa piti vain kommentoida alimmat rivit, jotta PHP toimisi. Nyt PHP:n pitäisi tavallaan olla toiminnassa. Siispä testaamme luomalla /public_html-hakemiston kotihakemistoon.
$ cd
$ mkdir public_html
$ cd public_html/
Loin nopeasti index.php-tiedoston, joka on mahdollisimman yksinkertainen. Sen lähdekoodi oli tällainen:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<?php print(4 + 4)?>
</body>
</html>
Testasin käynnistää sivua, mutta tuli 404 sivulla http://localhost/~santeri. Sitten muistin, että eihän käyttäjäsivuja ole asetettu apachesta. Siispä googlailin, että miten ne enabloidaan. Menin opettajamme sivuille ja löysin sieltä tämän ohjeen: http://terokarvinen.com/2008/install-apache-web-server-on-ubuntu-4. Siinä mainittiin, että pitää laittaa tämä:
$ sudo a2enmod userdir
Sen jälkeen terminaali ilmoitti, että pitää laittaa $ systemctl restart apache2. Tein sen ja Debian kysyi salasanani. Tämän jälkeen testasin uudelleen sivua ja se toimi:

Viimeisenä pitäisi vielä laittaa MariaDB toimimaan. Joten siis ensiksi $ sudo mariadb. Sitten CREATE DATABASE TEST; Sen jälkeen USE test; (https://stackoverflow.com/questions/4005409/error-1046-no-database-selected-how-to-resolve) CREATE TABLE animals(id int primary key, name varchar(255)); (https://www.techonthenet.com/mariadb/tables/create_table.php) Sitten INSERT INTO animals VALUES (1, “Giraffe”),(2, “Tiger”),(3, “Hippo”); Tietokanta on valmis testaukseen, joten seuraavaksi enää pitää yrittää saada tieto näkymään tietokannasta.
Kello on 20:15, olen yrittänyt kymmeniltä eri sivuilta metodeja, kuinka saisin tietokantayhteyden, mutta mikään ei vain tunnu toimivan. Nämä sivut muunmuassa: https://www.tutorialspoint.com/mariadb/mariadb_create_tables.htm, http://terokarvinen.com/2018/php-database-select-and-insert-example-php-pdo, http://terokarvinen.com/2016/read-mysql-database-with-php-php-pdo ja https://www.youtube.com/watch?v=hSS1Ml6YOt8. Nämä olivat vain viimeisimmät, mutta ratkaisua ei löydy. En saa tietokannasta näytettyä dataa. Kello on 20:36.
H.) Name based virtual host
Heti ensimmäisenä löysin lehtorimme sivun: http://terokarvinen.com/2018/name-based-virtual-hosts-on-apache-multiple-websites-to-single-ip-address, jossa kuvataan oikein hyvin tämä konsepti.
Apache2 oli jos asennettu, joten jäljelle jäi ainoastaan:
echo "Default"|sudo tee /var/www/html/index.html
Menin $ cd /var/www/html, jossa oli index.html, jossa oli ainoastaan teksti “Default”. Tein täysin Tero Karvisen ohjeiden mukaan, eli siis loin santeri.siirila.com.conf-tiedoston /etc/apache2/sites-available/santeri.siirila.com.conf, joka näytti tältä:
$ sudoedit /etc/apache2/sites-available/pyora.example.com.conf
$ cat /etc/apache2/sites-available/santeri.siirila.com.conf
<VirtualHost *:80>
ServerName santeri.siirila.com
ServerAlias www.santeri.siirila.com
DocumentRoot /home/xubuntu/publicsites/santeri.siirila.com
<Directory /home/xubuntu/publicsites/santeri.siirila.com>
Require all granted
</Directory>
</VirtualHost>
$ sudo a2ensite santeri.siirila.com
$ sudo systemctl restart apache2
Tein aluksi santeri.siirila.com-sivulle noita asetuksia, mutta kuinka sattuikaan, se oli viety, siispä kesken tehtävän aloin säätää kaikki .com-alkuiset asiat .fi-muotoon. Tämän jälkeen yritin mennä selaimella santeri.siirila.fi, niin tuli ainoastaan error 403 Forbidden. Eli minulla ei olisi tunnuksia. En tiedä, mistä johtuu, mutta selvitellään. Yritin muokata index.html-tiedostoa, mutta mitään ei tapahdu. Siispä, jossain muissa oikeuksissa on virhe. Yritin $ systemctl restart apache2, mutta se ei auttanut ollenkaan.
Olen yrittänyt useita kertoja sivua ‘santeri.siirila.fi’, mutta saan aina vain forbidden 403, virheen. Kun vedin ‘hostname -I’-komennon, niin sain IP-osoitteella yhteyden localhostiin, jossa lukee default. Minun index.html-sivua, jossa on <h1>moi</h1> ei kuitenkaan näy.

Testasin luoda index.html-tiedoston minun kotihakemiston public_html kansioon. Loin siihen index.html-tiedoston ja tässä on lopputulos:

Tavallaan siis name based virtual hosting toimi, mutta ei kumminkaan root-hakemistossa. Tämä ei ole pääsivulla kuten piti olla, mutta en saa ymmärrettyä, kuinka pitäisi tehdä, kello on 22:11. Lopetan tehtävän toistaiseksi.
F.) Pieni webbiohjelma
Tehtävät ovat enemmän aikaa vieviä kuin oletin, kello on nyt 22:36, joten valitsin tämän. Ehkä nämä lasketaan viideksi tehtäväksi.
Tässä tehtävässä piti tehdä pieni web-ohjelma, kuten vaikka BMI-laiskuri. Siispä etsin aluksi taustatietoa, kuinka tällaisen voisi toteuttaa.
Kopioin aluksi tältä sivulta https://stackoverflow.com/questions/37195181/form-using-function-calculate-bmi-and-display-different-comment-fatal-error-and kaiken index.php-tiedostoon, jonka jälkeen testasin kyseistä kokonaisuutta ja sain 404 Not Found -virhee. Tiedosto yritti uudelleenohjata test.php-tiedostoon, mutta minulla ei sitä ollut, joten piti hieman tutkailla, että mitä sellainen tiedosto edes tarvitsisi sisälleen.
Olen katsonut useita eri lankoja, forumeita ja videoita. Lopulta löysin tämän videon: https://youtu.be/ZdP0KM49IVk. Tämän videon ansiosta sain .php- ja .html-tiedoston oikeaan formaattiin:
bmi.php
<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
<?php
$weight = $_POST["weight"];
$height = $_POST["height"];
$BMI = $weight / ($height * $height);
print("Your BMI is " + $BMI);
?>
</body>
</html>
index.html
<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
<form action="bmi.php" method="POST">
<table>
<tr><td>Height in meters</td><td><input type="text" name="height" maxlength="4"></td></tr>
<tr><td>Weight in kilograms</td><td><input type="text" name="weight" maxlength="3"></td></tr>
</table>
<input type="submit" value="Calculate"></input>
</form>
</body>
</html>
Nämä prittasivat sivulle oikeaa formaattia ja laskivat BMI:n oikein. Kello on tehtävän loputtua 0:40.
Hienosäätö, Name Based Virtual Host
Kello on 13:15 seuraavana päivänä. Aion yrittää hienosäätää tehtäviä vielä virkeämmällä mielellä. Aloitan DocumentRoot-tehtävästä, jossa piti saada sivu näkymään palvelimen etusivulle ja samalla pitää asettaa muokkausoikeudet normaalille käyttäjälle.
Etsin aluksi hakukoneella apuja ja päädyin tälle sivulle: https://www.dyclassroom.com/howto-ubuntu/how-to-change-document-root-of-apache-on-ubuntu. Tämän dokumentin ansiosta päädyin /etc/apache2-demonin hakemistoon, jossa taas tutkiskelin eilen tekemiäni asioita. Menin tutkimaan /etc/apache2/sites-enabled- ja /etc/apache2/sites-available-hakemistoja, joissa oli erilaisia konfiguraatiotiedostoja. Annoin komennon $ cat santeri.siirila.fi.conf, jotta näkisin, mitä tiedosto sisältää. Siellä luki DocumentRoot /home/santeri/publicsites/santeri.siirila.fi. Yritin antaa sekä hakemistolle, että index.html-tiedostolle oikeuksia komennolla $ chmod -R 777 <tiedosto/hakemisto>. Ei auttanut, sivu antaa edelleen 403 Forbidden -virheilmoitusta. Jatkoin apujen etsimistä ja tämän sivun mukaan https://www.virtualhelp.me/applications/54-web-servers/895-403-forbidden-after-changing-documentroot-directory minun pitäisi muuttaa /etc/apache2/apache2.conf-tiedostoa, joten siis tein niin ja lisäsin siihen rivin
<Directory /home/santeri/publicsites/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
Ei siltikään auttanut, vaikka tämän jälkeen käynnistin demonin uusiksi komennolla $ systemctl restart apache2.
Löysin tämän sivun https://stackoverflow.com/questions/6959189/apache-virtualhost-403-forbidden. Siinä neuvotaan laittamaan tällainen litania /etc/apache2/sites-available/santeri.siirila.fi.conf-tiedostoon:
<Directory /home/santeri/publicsites/santeri.siirila.fi>
Order allow, deny
Allow from all
Require all granted
</Directory>
Tämän jälkeen testasin taas uudelleenkäynnistää apache2-demonia, niin sain ilmoituksen
$ systemctl restart apache2
Job for apache2.service failed because the control process exited with error code.
See "systemctl status apache2.service" and "journalctl -xe" for details.
Tein ohjeen mukaan näin:
$ systemctl status apache2.service
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Sun 2019-02-03 14:17:42 EET; 3min 12s ago
Process: 7171 ExecStop=/usr/sbin/apachectl stop (code=exited, status=1/FAILURE)
Process: 7213 ExecStart=/usr/sbin/apachectl start (code=exited, status=1/FAILURE)
Main PID: 7139 (code=exited, status=0/SUCCESS)
Tähän ongelmaan auttoi, kun poistin muutokset /etc/apache2/sites-available/santeri.siirila.fi.conf-tiedostosta. Sitten Apache käynnistyi taas normaalisti.
Olen pähkäillyt pari tuntia tämän ongelman äärellä. Ainoaksi ratkaisuksi keksin tähän hätään /public_html-hakemiston. Siispä testaan nyt vaihtaa santeri.siirila.fi-konfiguraatiot siihen polkuun.
Testasin kaikkea, muutin polkuja kahteen eri paikkaan toinen kotihakemiston public_html-kansioon ja toisella kerralla /var/www/html/-hakemistoon. Mikään ei tunnu auttavan, aina saan Forbidden-virhettä. Tältä ihan viimeisimmillään näytti:
Minun mielestäni tuossa ei ole mitään vikaa, mutta pakko siinä on olla sillä saan aina 403-errorin. Kello on 15:43.
Hienosäätö, LAMP
Menin kotihakemistoni /public_html-kansioon ja poistin kaiken komennolla $ rm -rf * Sen jälkeen tein nanolla nopeasti index.php tiedoston. Tarkoituksena on siis saada ainoastaan tietokanta vuorovaikuttamaan muun ympäristön kanssa. Kello on 15:56.
Olen yrittänyt pähkäillä tätä jo pitkään. Olen testannut muuttaa PHP-koodia ja olen yrittänyt muokata asioita tietokannassa, mutta mikään ei tunnu toimivan. PHP toimii itsessään, mutta en vain saa tietokantayhteyttä toimimaan. Kirjoittamani koodi on otettu lehtorin Tero Karvisen nettisivuilta (http://terokarvinen.com/2018/php-database-select-and-insert-example-php-pdo) ja sitä on muokattu hieman enemmän minulle tarkoituksenmukaiseen muotoon. Se näyttää yrityshetkellä tältä:
<!doctype html>
<html>
<head>
</head>
<body>
<h1>animals</h1>
<?php
$user='testi';
$password='Ku1v4hk0123#"!';
$database='test';
$dsn="mysql:host=localhost;charset=UTF8;dbname=test";
// Open Connection, create new object of PDO class
$pdo=new PDO($dsn, $user, $password);
// Perform SQL Query
$pdoStatement=$pdo->prepare('SELECT * FROM animals;');
$pdoStatement->execute();
$hits=$pdoStatement->fetchAll();
// Print the $hits Array
foreach($hits as $row) {
echo "<p>".$row['id']." ".$row['name']."\n";
}
?>
<h2>testi</h2>
</body>
</html>
Tietokannassa yritin antaa kommennon GRANT ALL PRIVILEGES ON test TO testi@localhost IDENTIFIED BY ‘Ku1v4hk0123#”!’, mutta sekään ei auttanut. Kun hain käyttäjät kannasta ja katsoin heidän oikeudet, niin näytti tältä:

Joko tämä ongelma on tietokantayhteydessä tai sitten se on käyttäjäoikeuksissa, mutta en vain saa keksittyä vastausta. Olen lukenut todella monia eri lähteitä läpi, mutta yksikään ei oikein tuntunut auttavan minua. Hiominen jää siis hieman huonoon asemaan. Aikaa meni noin kaksi tuntia.
Loppumietteet
Tehtävät olivat paljon haastavampia ja vievät käsittämättömän määrän aikaa. En viitsi edes yrittää enää Apache mod WSGI, PostgreSQL ja Python Flask -yhdistelmän hiomista, sillä siinäkin se ongelma oli juuri tietokantayhteydessä. Ehkä opin jatkossa yhdistämään kannan ja saisin jopa nämä tehtävät paremmin tehtyä. Tästä jatketaan kokemuksia rikkaampina. Kokonaisaika näihin tehtäviin on käytetty ollut noin 20 tuntia. Ehkä hieman alle.
Osallistun Haaga-Helia ammattikorkeakoulussa Linux-palvelimet kurssille, jonka opettajana toimii Tero Karvinen. Kaikki tehtävät ovat hänen verkkosivuiltaan http://terokarvinen.com/.
Ensimmäisen tehtävän suoritin omalla pöytäkoneellani, jossa pyörii Debian 9.7. Tehtävänanto kuuluu seuraavasti:
a) Aiheuta lokiin kaksi eri tapahtumaa: yksi esimerkki onnistuneesta ja yksi esimerkki epäonnistuneesta tai kielletystä toimenpiteestä. Analysoi rivit yksityiskohtaisesti.
b) Vapaaehtoinen kohta, ei ole opetettu vielä: Asenna SSH-demoni. Kokeile omalla ssh-palvelimellasi jotain seuraavista: ssh-copy-id, sshfs, scp tai git. (Helpoin lienee scp: ‘scp foo.txt tero@example.com:’)
c) Tee unelmien apt-get -komento: yksi komentorivi, joka asentaa suosikkiohjelmasi.
d) Asenna komentokehotteen paketinhallinnasta kolme itsellesi uutta komentorivillä toimivaa ohjelmaa. Kokeile kutakin ohjelmaa sen pääasiallisessa käyttötarkoituksessa.
e) Opettele ulkoa ja harjoittele tärkeimmät komennot (tätä “opettele ulkoa” alakohtaa ei tarvitse raportoida):
http://terokarvinen.com/2009/command-line-basics-4
http://terokarvinen.com/2008/commands-for-admin-4 (Karvinen T. 2019.)
2. a. Lokitapahtumat
Tarkoituksena oli tarkkailla ja analysoida lokitietoja. Lokitiedot oli tarkoitus aiheuttaa tahallisesti. Avasin ihan aluksi tietokoneeni ja boottasin Debianiini. Kun järjestelmä oli käynnistynyt, avasin terminaalin, johon kirjoitin ‘cd ../../..’, jotta pääsin Root-hakemistoon. Sitten menin sieltä ‘/etc/log’, jossa sijaitsee lokitiedostot. Muistin, että komento ‘tail’ antaa mahdollisuuden tiedoston seuraamiseen. Siispä laitoin terminaaliin ‘man tail’. Manuaalissa kerrottiin, että ‘-F’ on seuraukseen tarkoituksenmukainen komento. kirjoitin ‘tail -F auth.log’, mutta sainkin ilmoituksen:
santeri@debian:/var/log$ tail -F auth.log
tail: cannot open ‘auth.log’ for reading: Permission denied
Nähtävästi Debianilla ei pääse lokeihin ilman Root-oikeuksia. Siispä ‘sudo !!’-komento, jotta saan ajettua edellisen komennon uudestaan superuserina. Sittenhän alkoihikin tulla outputia! Terminaali sylkäisi seuraavaa ulos:
Jan 26 19:45:01 debian CRON[6105]: pam_unix(cron:session): session closed for user root
Jan 26 19:55:01 debian CRON[6571]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 26 19:55:01 debian CRON[6571]: pam_unix(cron:session): session closed for user root
Jan 26 20:04:38 debian sudo: santeri : TTY=pts/1 ; PWD=/var/log ; USER=root ; COMMAND=/usr/bin/tail -F auth.log
Jan 26 20:04:38 debian sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Jan 26 20:05:01 debian CRON[6660]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 26 20:05:01 debian CRON[6660]: pam_unix(cron:session): session closed for user root
Jan 26 20:06:38 debian sudo: pam_unix(sudo:session): session closed for user root
Jan 26 20:06:40 debian sudo: santeri : TTY=pts/1 ; PWD=/var/log ; USER=root ; COMMAND=/usr/bin/tail -F auth.log
Jan 26 20:06:40 debian sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Seuraavaksi halusin jotain, mihin tarvitsen sudoa, joten päätin asentaa Binwalkin pakettityökalulla (apt). Siispä seuraava komento oli sudo apt install binwalk. Terminaali kysyi salasanaa, joten aluksi, laitoin salasanan väärin tarkoituksella ja toisella kerralla oikein. Sen jälkeen tarkistin, mitä auth.log on syljeskellyt sillä aikaa.
Jan 26 20:13:37 debian sudo: pam_unix(sudo:auth): authentication failure; logname= uid=1000 euid=0 tty=/dev/pts/2 ruser=santeri rhost= user=santeri
Jan 26 20:13:43 debian sudo: santeri : TTY=pts/2 ; PWD=/home/santeri ; USER=root ; COMMAND=/usr/bin/apt install binwalk
Jan 26 20:13:43 debian sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Virheellisessä kirjauksessa kerrotaan useita tietoja kirjautujasta, kuten käyttäjänimi ja ID. Oikeanlaisessa kirjauksessa taas kerrotaan noihin myös lisäksi ‘working directory’ ja myös komento, mitä käyttäjä käytti Roottina.
2. b. SSH-yhteys
Seuraavaksi olisi tarkoitus asentaa SSH-deamon. Avasin selaimen ja kirjoitin hakukoneeseen ‘install ssh daemon’, josta heti ensimmäisenä tuloksena tuli https://help.ubuntu.com/lts/serverguide/openssh-server.html.en. Olin jo asentanut SSH-clientin, joten en kokenut tarpeelliseksi enää katsoa ohjetta, koska siellä oli lähinnä valinnaista asiaa enää. Siispä laitoin komennon ‘touch foo.txt’, jotta olisi jotain mitä lähettää. Seuraavaksi laitoin ‘scp foo.txt a1704466@proto366.haaga-helia.fi’. Palvelin oli Ubuntu-palvelin, jota käytetään toisella kurssilla. Kävin tarkistamassa sen jälkeen SSH:lla palvelimelta, että onko siellä jotain. Ei ollut. En tiennyt, miten kuuluisi tehdä, joten päätin suosiolla luovuttaa, koska oli silti valinnainen tehtävä kyseessä.
2. c. Asennusskripti
Seuraavaksi oli tarkoitus tehdä pieni apt-komento, joka asentaa kivoja ohjelmia itselle. Päätin tehdä siitä samalla Bash-skriptin, koska miksikäs ei? Avasin VIM-editorin komennolla ‘vim asennus.sh’, joka samalla luo tiedoston. Kirjoitin siihen aluksi sen helpon leipätekstin, joka kuului seuraavasti: sudo apt install python3 gcc git vim’. Sitten etsin, että miten saan siitä oikean Bash-skriptin, joten päätin hakea sitä hakukoneesta. Löysin tämän sivun: https://bash.cyberciti.biz/guide/Hello,_World!_Tutorial. Siinä sanottiin, että pitää laittaa ensimmäiseksi rivi, jossa lukee ‘#!/bin/bash’. Sitten olikin kaikki valmista. Testasin ajaa skriptin kirjoittamalla ./asennus.sh, mutta ihmettelin jo, ettei se täydentänyt automaattisesti. Tuli virhe, bash: ./asennus.sh: Permission denied. Ajattelin, että pitääpi siis laittaakin Roottina. sudo ./asennus.sh. Tuli uudestaan virhe: sudo: ./asennus.sh: command not found. Päädyinpä siis takaisin sivulle. Ahaa, sivulla luki, että tiedostolle pitää antaa executable-oikeudet komennolla ‘chmod -x asennus.sh’. Sen jälkeen jopa sain jotain uloskin! Terminaali sylkäisi tällaista:
Reading package lists… Done
Building dependency tree
Reading state information… Done
gcc is already the newest version (4:6.3.0-4).
gcc set to manually installed.
git is already the newest version (1:2.11.0-3+deb9u4).
python3 is already the newest version (3.5.3-1).
python3 set to manually installed.
vim is already the newest version (2:8.0.0197-4+deb9u1).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Kaikki asennettavat ohjelmat olivatkin jo asennettu ja päivitetty, joten mitään sen kummempaa ei tapahtunut. Elämä jatkuu.
2. d. Komentoriviohjelmat
Tässä tehtävässä oli tarkoitus asentaa apt:sta kolme uutta komentorivillä toimivaa ohjelmaa. Minulla ei ollut kauheasti hajua, mistä lähtisin liikkelle, koska niitä on niin pilvin pimein. Siispä päädyin hakemaan sitä hakukoneesta, josta pääsin sivulle: https://www.linuxnov.com/35-terminal-text-based-application-for-linux/ Ajattelin, että tuollainen voisi olla hyvä tällaiselle aloittelevalle henkilölle. Ensimmäisenä päätin asentaa Sudokun, jonka sai komennolla ‘sudo apt install sudoku’. Avasin ohjelman kirjoittamalla vain sudoku.

Sudoku vaikutti toimivat hyvin ja juuri kuten kuuluikin.
Seuraavaksi päätin asentaa verkkoliikennettä analysoiva terminaalissa toimiva ohjelma vnState. Se tapahtui komennolla ‘sudo apt install vnstat’. Laitoin komentoriville vnstat, jos vaikka ohjelma aukeutuisi. Tuli ilmoitus: enp3s0: Not enough data available yet. Yritin vähän aiheuttaa trafiikkia, jos vaikka komento toimisikin. Ei edelleenkään toiminut, joten yritän sit myöhemmin uudelleen.
Viimeisenä asensin ohjelman nimeltä hTop. Sen tarkotus on olla prosessitarkastelija ja tietokoneen resurssien tarkastaja. Asennus tapahtui komennolla ‘sudo apt install htop’. Avasin ohjelman komennolla htop ja sitten se näyttikin tältä: 
Kaikki vaikutti toimivan asianmukaisesti ja eri statukset muuttuivat reaaliajassa kuten kuuluikin. Tämä on todella hyödyllinen ohjelma!
Tämän jälkeen testasin vielä vnstatia ja sain jopa outputtia! Ohjelma tulosti seuraavaa:

Tämä työkalu ei ollutkaan niin hyödyllinen kuin aluksi luulin sen olevan, mutta ihan hauska.
Kaikki ohjelmat toimivat kuten kuuluikin, eikä niiden kanssa ollut sen ihmeellisimpiä ongelmia.

Osallistun Haaga-Helia ammattikorkeakoulussa Linux-palvelimet kurssille, jonka opettajana toimii Tero Karvinen. Kaikki tehtävät ovat hänen verkkosivuiltaan http://terokarvinen.com/.
Ensimmäisen tehtävän suoritin omalla pöytäkoneellani. Tehtävänanto kuuluu seuraavasti:
a) Tee oma Linux-livetikku. Kokeile sitä jossain muussa kuin koulun koneessa. Tämä kohta ei edellytä asentamista – jos kuitenkin asennat, ota ensin varmuuskopiot. Jos ehdit tehdä tikun jo tunnilla, voit poikkeuksellisesti raportoida muistin perusteella jälkikäteen, mutta muista silloin mainita muistinvaraisuudesta.
b) Listaa testaamasi koneen rauta (‘sudo lshw -short -sanitize’).
c) Asenna kolme itsellesi uutta ohjelmaa. Kokeile kutakin ohjelmaa sen pääasiallisessa käyttötarkoituksessa.
d) Mitä lisenssiä kukin näistä ohjelmista käyttää? Selitä lyhyesti, mitä oikeuksia ja velvolisuuksia tuosta lisenssistä seuraa.
e) Listaa käyttämäsi ohjelmat (esim. MS Word), kunkin ohjelman käyttötarkoitus (esim. Tekstinkäsittely) ja vastaava vapaa Linux-ohjelma (esim. LibreOffice Writer). Jos johonkin tarkoitukseen ei löydy vapaata Linux-ohjelmaa, listaa sekin. (Päivitetty: korjasin tämän kohdan tunnuskirjaimen d->e)
f) Vapaaehtoinen lisätehtävä: varmuuskopioi tiedostosi (voit käyttää esimerkiksi ulkoista USB-levyä) (Karvinen T. 2018.)
-
a. Livetikku
Avasin selaimen, menin osoitteeseen https://xubuntu.org/download, latasin torrent-tiedoston ja käynnistin BitTorrentin. Ostin USB 3.0 -muistitikun, koska tarvitsin sitä tähän kyseiseen tehtävään. Menin osoitteeseen https://rufus.ie/ ja latasin sieltä Rufus 3.4 -Windows-ohjelman. Käynnistin Rufuksen heti ladattuani sen. Annoin oletusasetusten olla ja latasin ohjelmistoon Xubuntun ISO-tiedoston, jota ohjelma käyttää asentaakseen käyttöjärjestelmän tikulle.
Aloitin alustamisen ja bootattavan USB:n tekemisen. Sain ilmoituksen:
“Tämä kuva käyttää Syslinuxia 6.03/20171017, mutta tämä sovellus sisältää asennustiedostot vain Syslinuxille 6.03/2014-10-06.
Koska Syslinuxin uudet versiot eivät ole keskenään yhteensopivia, eikä Rufus voisi sisältää niitä kaikkia, on kaksi lisätiedostoa ladattava internetistä (‘ldlinux.sys’ ja ‘ldlinux.bss’):
– Valitse ‘Kyllä’ yhdistääksesi internetiin ja ladataksesi nämä tiedostot.
– Valitse ‘Ei’ peruaksesi toiminnon
Huomio: Tiedosto ladataan nykyiseen sovelluskansioon ja niitä käytetään automaattisesti uudelleen niiden löytyessä.”
Valitsin tähän ilmoitukseen kyllä, mutta sen jälkeen sain vielä toisen ilmoituksen:
“ISOHybrid-levykuva havaittu.
Valitsemasi levykuva on muotoa ‘ISOHybrid’. Tämä tarkoittaa, että se voidaan kirjoittaa joko ISO-kuvana (tiedostojen kopiointi) tai DD-kuvana (levykuva). Rufus suosittelee käyttämään ‘ISO-kuva’ -tilaa, jotta sinulla pysyy täysi pääsy asemaan kirjoittamisen jälkeen. Jos törmäät ongelmiin käynnistyksessä, voit yrittää kirjoittaa levykuvaa uudelleen ‘DD-kuva’ -tilassa.
Valitse tila, jota haluat käyttää levykuvan kirjoittamiseen:
[] Kirjoita ISO-kuvana (Suositellaan)
[] Kirjoita DD-kuvana”
Valitsin ISO-kuvan näistä kahdesta vaihtoehdosta.
Rufus antoi vielä varoitusilmoituksen:
“VAROITUS: KAIKKI TIEDOT LAITTEESSA ‘KINGSTON (G:) [128 GB]’ POISTETAAN.
Jatkaaksesi toimenpidettä valitse OK. Lopettaaksesi valitse PERUUTA.”
Valitsin OK.
Kun tikun asentaminen oli mennyt loppuun, suljin tietokoneeni, jossa pyöri silloin Windows 7 -käyttöjärjestelmä. Sitten käynnistin koneen uudestaan ja painoin F2-näppäintä, jolla avautuu minun UEFI/BIOS. Laitoin sieltä Boot options -valikosta Boot override -vaihtoehdoksi Kingston DataTraveler 3.0 PMAP (118368MB), joka oli juuri se tikku, jonka formatoin aiemmin. Xubuntu alkoi pyöriä ja avasi valikon, josta valitsin kieleksi englannin ja otin valinnan ‘Try Xubuntu’ asentamisen sijaan, koska pöytäkoneellani on jo Debian 9, enkä koe tarvitsevani – ainakaan vielä – kahta Linux-käyttöjärjestelmää. Molemmat näytöt toimivat heti “out of box”, eli ei vaatinut mitään ajureiden asentamista tai vastaavaa. Kaikki vaikutti olevan kunnossa.
-
b. Laitelistaus
Seuraavaksi piti tehtävänannon mukaan listata koneessa oleva rauta käyttäen komentoa ‘sudo lshw -short -sanitize’. Googlasin, mikä olikaan hotkey terminaalin avaukselle, jonka jälkeen avasin terminaalin näppäinyhdistelmällä Ctrl + Alt + T (Lifewire 2018). Kirjoitin terminaaliin ‘sudo lshw -short -sanitize’, mutta tajusin näppäimistöni olevan eri järjestyksellä kuin pohjoismaiden näppäimistöt ja oli siksi hankaluuksia aluksi löytää miinusmerkki ( – ).
Terminaali sylkäisi seuraavanlaisen litanian:
H/W path Device Class Description
==============================================================
system System Product Name (SKU)
/0 bus Z170 PRO GAMING
/0/0 memory 64KiB BIOS
/0/45 memory 16GiB System Memory
/0/45/0 memory 8GiB DIMM DDR4 Synchronous 26
/0/45/1 memory [empty]
/0/45/2 memory 8GiB DIMM DDR4 Synchronous 26
/0/45/3 memory [empty]
/0/4b memory 256KiB L1 cache
/0/4c memory 1MiB L2 cache
/0/4d memory 6MiB L3 cache
/0/4e processor Intel(R) Core(TM) i5-6600K CP
/0/100 bridge Skylake Host Bridge/DRAM Regi
/0/100/1 bridge Skylake PCIe Controller (x16)
/0/100/1/0 display GM204 [GeForce GTX 970]
/0/100/1/0.1 multimedia GM204 High Definition Audio C
/0/100/14 bus Sunrise Point-H USB 3.0 xHCI
/0/100/14/0 usb1 bus xHCI Host Controller
/0/100/14/0/3 multimedia HyperX Virtual Surround Sound
/0/100/14/0/4 input SteelSeries Rival 700 Gaming
/0/100/14/0/6 input Corsair Gaming K70 LUX RGB Ke
/0/100/14/1 usb2 bus xHCI Host Controller
/0/100/14/1/2 scsi6 storage DataTraveler 3.0
/0/100/14/1/2/0.0.0 /dev/sdd disk 124GB DataTraveler 3.0
/0/100/14/1/2/0.0.0/0 /dev/sdd disk 124GB
/0/100/14/1/2/0.0.0/0/1 /dev/sdd1 volume 115GiB Windows FAT volume
/0/100/16 communication Sunrise Point-H CSME HECI #1
/0/100/17 storage Sunrise Point-H SATA controll
/0/100/1b bridge Sunrise Point-H PCI Root Port
/0/100/1b.2 bridge Sunrise Point-H PCI Root Port
/0/100/1b.2/0 enp3s0 network 82574L Gigabit Network Connec
/0/100/1c bridge Sunrise Point-H PCI Express R
/0/100/1c/0 bus ASM1142 USB 3.1 Host Controll
/0/100/1c/0/0 usb3 bus xHCI Host Controller
/0/100/1c/0/1 usb4 bus xHCI Host Controller
/0/100/1d bridge Sunrise Point-H PCI Express R
/0/100/1f bridge Sunrise Point-H LPC Controlle
/0/100/1f.2 memory Memory controller
/0/100/1f.3 multimedia Sunrise Point-H HD Audio
/0/100/1f.4 bus Sunrise Point-H SMBus
/0/100/1f.6 network Ethernet Connection (2) I219-
/0/1 scsi0 storage
/0/1/0.0.0 /dev/sda disk 250GB Samsung SSD 850
/0/1/0.0.0/1 /dev/sda1 volume 100MiB Windows NTFS volume
/0/1/0.0.0/2 /dev/sda2 volume 232GiB Windows NTFS volume
/0/2 scsi1 storage
/0/2/0.0.0 /dev/sdb disk 500GB WDC WDS500G2B0A-
/0/2/0.0.0/1 /dev/sdb1 volume 465GiB Windows NTFS volume
/0/3 scsi2 storage
/0/3/0.0.0 /dev/sdc disk 1TB ST31000524AS
/0/3/0.0.0/1 /dev/sdc1 volume 351GiB Windows NTFS volume
/0/3/0.0.0/2 /dev/sdc2 volume 482GiB Windows NTFS volume
/0/3/0.0.0/3 /dev/sdc3 volume 97GiB Extended partition
/0/3/0.0.0/3/5 /dev/sdc5 volume 4767MiB Linux swap volume
/0/3/0.0.0/3/6 /dev/sdc6 volume 92GiB EXT4 volume
/1 power To Be Filled By O.E.M.
Tehtävä oli käytännössä tehty, mutta halusin vielä saada näppäimistöni Nordic layout -järjestykseen, joten googlasin jälleen apua. Testasin tällaisia komentoja, jotka pohjautuivat googlauksieni tuloksiin, ennen kuin löysin vastauksen: xfce, setxkbmap -fi, setxkbmap -fin, setxkbmap, setxkbmap -print, setxkbmap -help, setxkbmap -keycodes ja setxkbmap -print -layout. (Reddit, 2017.) Lopulta tajusin formaatin ja sain vaihdettua näppäimistöni toimimaan normaalisti komennolla “setxkbmap -layout fi”.
-
c. Ohjelma-asennukset
Seuraavaksi oli luvassa kolmen ohjelman asentaminen. Tähän tehtävänantoon valitsin Spotifyn, Discordin ja Braven. Tähän tehtävään oli vaikea valita ohjelmia, kun en tiennyt, että pitikö niiden olla ohjelmia, jotka ovat normaalisti käytössä, mutta ei tällä käyttöjärjestelmällä, joten päätin tehdä tavallaan jaotettuna eli Spotify ja Discord ovat normaalistikin minun Windowsillani, mutta Brave oli taas ainoastaan nimeltään tuttu.
Aloitin tehtävän avaamalla selaimen. Hain verkosta ‘spotify linux’, josta sain linkin Spotifyn omalle sivulle. Sivulla oli lista neljällä kohdalla, ja siinä asetettiin komentoja terminaaliin. Listaus oli seuraavanlainen:
# 1. Add the Spotify repository signing keys to be able to verify downloaded packages
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 931FF8E79F0876134EDDBDCCA87FF9DF48BF1C90
# 2. Add the Spotify repository
echo deb http://repository.spotify.com stable non-free | sudo tee /etc/apt/sources.list.d/spotify.list
# 3. Update list of available packages
sudo apt-get update
# 4. Install Spotify
sudo apt-get install spotify-client
Syötin jokaisen komennon listassa käyttämällä näppäinyhdistelmää Ctrl + Insert ja Shift + Insert, jotka ovat myös terminaalissa toimivia tekstinkopiointimenetelmiä. Kaikki asentui juuri kuin pitikin ja kun viimeinen vaihe oli suoritettu, kirjoitin terminaaliin ‘spotify’, joka avasi Spotify-ohjelman. Kaikki toimi kuin oli tarkoituskin ja kirjauduin sisään. (Spotify 2019.)
Seuraavaksi asensin Discordin. Aloitin asennuksen etsimällä taas verkosta hakusanoin ‘discord linux’. Sain sieltä itselleni Discordin sivut, josta piti ladata ohjelma manuaalisesti joko .deb- tai .taz-gz-tiedostona. Päätin ladata .tar-gz-tiedoston, koska ajattelin .deb-tiedostomuodon olevan Debianille. (Discord 2019.) Latauksen jälkeen terminaaliin ‘ls’, jotta näin, missä olin. Sitten cd Downloads/, jonka jälkeen yritin laittaa ‘dpkg -i Discord-0.0.8.tar.gz’. Ei toiminut, joten tietenkin laitoin ‘sudo apt install dpkg’, koska se ainakin toimi Debianilla pakettejen purkajana. Ei toiminut vieläkään purku, joten menin taas verkkoon etsimään vastauksia.
Etsin ‘tar.gz xubunu’ ja löysin foorumin, jossa mainittiin xvzf-komento (Ubuntu Forums 2019). Sain siten purettua paketin viimein, mutta en saanut asennettua. Alkoi ärsytys vallata, joten päätin hankkia Snap-työkalun. Laitoin sitä kummempia etsimättä ‘sudo apt install snap’, jolla sain Snapin ladattua. Sen jälkeen laitoin komennon ‘sudo snap install discord’. Asentaminen alkoi. Lopulta kun kaikki oli asentunut, niin laitoin terminaaliin vain ‘discord’, niin ohjelma avautui kirjautumisruudun kera. Kaikki tuntui toimivan hyvin.
Viimeiseksi oli tarkoitus asentaa Brave. Ajattelin testata ihan kummempia ihmettelemättä, että toimisiko komento ‘sudo apt install brave’. Se ei toiminut. Testasin sen jälkeen ‘sudo snap install brave’, sehän toimi kuin toimikin! Brave asentui nopeasti ja lopulta testasin vain laittamalla taas komennon ‘brave’ terminaaliin ja sitten selain aukesikin.
-
d. Ohjelmalisenssit
Seuraavassa tehtävänannossa tuli selvittää kunkin ohjelmien lisenssit. Mitä kukin ohjelma pitää sisällään ja miten sisältöä saa käyttää.
Etsin jälleen hakukoneesta ‘spotify licence’, jolloin sain Spotifyn verkkosivuilla sijaitsevat käyttöehdot. Kohdassa neljä kerrottaan käyttäjän oikeuksista käyttää sovellusta. Lyhyesti sanottuna Spotify-ohjelman hallitsija saa rajoitetun, ei-yksinomaisen ja peruutettavissa olevan lisenssin Spotify-palvelun käyttöön sekä rajoitetun, ei-yksinomaisen ja peruutettavissa olevan lisenssin sisällön henkilökohtaiseen ja ei-kaupalliseen viihdekäyttöön. Kaikki Spotify-ohjelmistosovellukset ja sisältö lisensoidaan käyttäjälle – niitä ei myydä. (Spotify 2019.)
Seuraavaksi katsoin Discordin käyttöehdot. Discordin lisenssissä sanottiin, että ohjelma on ilmainen ja jokainen, joka omistaa sen, voi muokata, kopioida, käyttää, yhdistää, jakaa, alilisensoida ja myydä sitä. Discord on avoin ja vapaa ohjelmisto. (Discord 2019.)
Lopuksi katsoin Braven käyttöehdot. Heidän GitHub-sivulla oli lisenssitiedosto, jossa luki, että käyttäjällä on maailmanlaajuinen, tekijänoikeuskorvausvapaa ja ei-ekslusiivinen lisenssi. Immateriaalioikeuksien puitteissa voidaan käyttää, luoda uudelleen, asettaa saataville, muokata, näyttää, suorittaa, jakaa ja muuten käyttää hyväksi. Myös Brave on siis avoin ja vapaa ohjelma. (Github 2019.)
-
e. Vapaat ohjelmat
Viimeiseksi tuli listata omia ohjelmia, joita käyttää normaalisti ja listata niille mahdollinen vapaa Linux-ohjelma. En itse käytä niin monia ohjelmia, että olisin keksinyt tähän paljon vaihtoehtoja, mutta yritin keksiä edes jotain.
Adobe Acrobat ja Atril Document Viewer – Näillä kahdella on sama käyttötarkoitus eli .pdf-tiedostojen lukeminen. Acrobat ei tuo muita ominaisuuksia joita edes haluaisin, joten tuo olisi helppo muutos.
MS Word ja LibreOffice Writer – Ajavat saman asian eli dokumenttien kirjoituksen.
MS Excel ja LibreOffice Calc – Ajavat ymmärtääkseni myös saman käyttötarkoituksen eli taulukot ja laskennan.
Jet Brains IDE:t ja VIM/Emacs – Ajavat tavallaan saman käyttötarkoituksen eli ohjelmoinnin/tekstieditoinnin, mutta olen varma, ettei samoja ominaisuuksia tule esimerkiksi Emacsissa kuin Jet Brainsin IDE:issä.
Spotify – Suljetun lähdekoodin ohjelmisto musiikin streamaukseen, eikä tavallaan ole samankaltaista ohjelmistoa vapaana ja ilmaisena, koska menisi muuten lähes laittomuuden puolelle.
Brave/Firefox – Molemmat ovat verkkoselaimia. Firefox löytyy valmiiksi Linuxista, niin sitä voi varsin hyvin käyttää, mutta Brave on myös ilmainen Linux-ohjelma, joten riippuu vähän mistä pitää.
Discord – VoIP- ja chat-ohjelma. Discord on jo valmiiksi avoin ja ilmainen ohjelma, myös Linuxille.
Lähteet
Lifewire 2018. Newell G. 5 Ways to Open a Terminal Console Window Using Ubuntu. Luettavissa: https://www.lifewire.com/ways-to-open-a-terminal-console-window-using-ubuntu-4075024 Luettu: 19.1.2019
Karvinen T. 2018. Aikataulu – Linux palvelimet ict4tn021-3004 ti – alkukevät 2019 – 5 op Luettavissa: http://terokarvinen.com/2018/aikataulu-linux-palvelimet-ict4tn021-3004-ti-alkukevat-2019-5-op Luettu: 19.1.2019
Reddit 2017. Xubuntu 16.04 always reverts keyboard layout to US english. Luettavissa: https://www.reddit.com/r/xubuntu/comments/65bd63/xubuntu_1604_always_reverts_keyboard_layout_to_us/ Luettu: 19.1.2019
Spotify 2019. Spotify for Linux. Luettavissa: https://www.spotify.com/fi/download/linux/ Luettu: 19.1.2019
Ubuntu Forums 2008. How to install .tar.gz and .tgz files. Luettavissa: https://ubuntuforums.org/showthread.php?t=1006587 Luettu: 19.1.2019
Github 2019. Brave. Luettavissa: https://github.com/brave/brave-browser/blob/master/LICENSE Luettu: 19.1.2019
Spotify 2019. Spotifyn käyttöehdot. Luettavissa: https://www.spotify.com/fi/legal/end-user-agreement/ Luettu: 19.1.2019
Discord 2019. Luettavissa: https://discordapp.com/download Luettu: 19.1.2019
Discord 2019. Acknowledgements. Luettavissa: https://discordapp.com/licenses Luettu: 19.1.2019
Rufus Luettavissa: https://rufus.ie/ Luettu: 19.1.2019