Fjärrstyrning i Ubuntu

Emellanåt hoppar jag in och assistera morfar. Det första hindret för att hjälpa någon på distans är oftast att lösa detta med att “se samma sak”. Detta är mina anteckningar för hur jag gör:

ssh -XC user@remotehost
user@remotehost:~$ vino-preferences

och fixa till inställningarna. Det går också att göra utan GUI – allt ligger i GConf under /desktop/gnome/remote_access/.
Därefter gäller det bara att hitta rätt nivå av kompression.

vncviewer -depth 8 -compresslevel 9 -quality 3 remotehost

Ett problem är att om man använder SSH-tunnel så räknar tight VNC ut att man pratar med den lokala maskinen och väljer då “raw” encoding vilken är väldigt högupplöst. Det kan man som tur är styra med -encodings. Så det blir till slut:

vncviewer -depth 8 -compresslevel 9 -quality 3 -encodings "copyrect tight hextile zlib corre rre raw"

Python och teckenkodning – utf8

Det är bara så – det krävs extrainsatser hela tiden med Python 2.* för att använda tecken andra än ASCII-tecken. Skall här teckna ned alla extrainsatser jag använder och stöter på.

Källkodsfilens teckenkodning

Anges såhär:

#!/usr/bin/env python
# -*- encoding: utf8 -*-

Läsa in textfil

in_file = codecs.open("elever.txt", "r", "utf8")

Utmatning på stdout

import codecs, sys
sys.stdout = codecs.getwriter('utf8')(sys.stdout)

Selenium and text-based testing

Ever since I saw PyUseCase I’ve been longing for a port which runs with web apps. I’ve been thinking briefly about actually doing this, using Selenium as the engine/driver. To make it usable, I guess I’d have to make TextTest ignore certain aspects of the DOM/HTML-tree (such as automatically-generated ID attributes, and positions of nodes, a dialog “window” for instance).

Today I saw the Tellerium IDE, which is a plugin for Firefox, and that got me even more motivated to actually go ahead and try to move towards a WebUseCase port for xUseCase and TextTest. Now I just need to find the time to make this happen …

apache, svn, mysql för prov

Idag skriver ett par elever omprov i kursen Avancerade Webbteknologier 1 i Agile Web Developer-programmet på kyh.se (yrkeshögskola). Deras prov består av två delar: en pappersdel och en “praktisk” del.

Den praktiska delen presenterar ett antal handritade skisser över en webbplats. I det första provet skulle de göra en enkel version av twitter. I detta prov ett enkelt forum. All hjälpmedel är tillåtna och poängen är att det skall vara likt en riktig arbetssituation. Studenten kan då visa vad han eller hon faktiskt kan åstadkomma på en viss tid, visa upp på kod han/hon väljer att checka in och visa prov på färdighet. Pappersdelen visar mest på nivå av kunskap – inte den hantverksmässiga färdighet man som utvecklare faktiskt bygger upp.

Hur funkar det då?

Förra gången uppstod konstiga fel för en del av de som satt på Windows och körde Eclipse med Subclipse. Problemet visade sig vara att de som inte köra “pure Java”-versionen, aka SVNKit, utan istället köra native-bryggan inte alls kunde interagera med svn-repot. Detta hade tidigare inte varit något problem under kursen, men då var alla läsoperationer tillåtna för hela världen (anonymous access) och endast skrivning krävde inloggningsuppgifter.

“Svn-repot” är egentligen flera repon – ett repo per student. De är skyddade så att bara ett konto kan komma åt just det repot, både vad gäller läs och skriv (och alla andra operationer). Repot accessas via HTTP och Apache via mod_authz_svn / mod_dav_svn (man får akta sig så att dav_svn.conf som medföljer vid installation inte används med default-inställningar).

Så, jag satte ihop ett par skript (bash och python) som

  • skapar svn-repo med branches, tags och trunk-kataloger (om det inte redan fanns),
  • skapar htpasswd-fil,
  • skapar apache-config-fil, samt
  • skapar MySQL-databas (en per person) och populerar med lite grunddata.

Konfiguration av Apache

Hela webbplatsen kör på en egen virtual host och konfigurationen för detta ligger i en enda fil. För varje student genereras följande:

<Location /live/carw949>
 AuthType Basic
 AuthName "Live - carw949"
 AuthUserFile /srv/prov/live/carw949.htpasswd
 Require valid-user
 Order allow,deny
 Allow from all
</Location>
<Location /svn/carw949>
 DAV svn
 SVNPath /srv/prov/svn/carw949
 AuthType Basic
 AuthName "AD10Gbg carw949"
 AuthUserFile /srv/prov/live/carw949.htpasswd
 Require valid-user
</Location>

Utöver det kör jag också ett cronjobb som checkar ut deras kod var tredje minut och lägger upp “live”. (Även denna “live”-katalog är skyddad och access ges bara till ett enda konto.)

Konfiguration av Subclipse och Eclipse

Idag fungerar det fint utan problem  för alla. Det gäller dock att man i Eclipse (med Subclipse-plugin) väljer att använda SVNKit istället för JavaHL (JNA). Installeras enklast via Help » Install New Software och med arkivet som finns på http://subclipse.tigris.org/update_1.6.x. För att kontrollera vilket SVN-lib (eller backend) som används så är vägen denna:

Window » Preferences
Team » Svn
Svn Interface » Client: SVNKit (Pure Java)

Alla skript ligger under http://wendt.se/software/education/kyh.se/awt1/ och do-it-all.sh gör “allt”. Filen elever.txt innehöll alla elever och var på det format som jag fick rått från SCAS (administrativt system).

Linux RAID-lek (md)

Uppgraderade filburken hemma med minne som hittades i skrotrummet (slängde julklappsförpackningar). 2GB SDRAM 667MHz bör göra maskinen snabbare än en 1GB som framtvingar viss swap-aktivitet på en slö slö slö SSD. Efter ingreppet så dök dock inte alla raid-enheter upp.

root@filserver:/var/log# mdadm --assemble --scan
mdadm: no devices found for /dev/md0
mdadm: no devices found for /dev/md2

F**k.

root@filserver:/var/log# mdadm --examine --brief --scan --config=partitions
ARRAY /dev/md4 level=raid1 num-devices=2 UUID=87afd380:6018cbda:c6d7c43e:eb241c8e

F**k.

root@filserver:/var/log# dmesg | tail
[ 4931.527092] md: Autodetecting RAID arrays.
[ 4931.527104] md: could not bd_claim sdc1.
[ 4931.527144] md: could not bd_claim sdb1.
[ 4931.527178] md: Scanned 2 and added 0 devices.
[ 4931.527181] md: autorun ...
[ 4931.527183] md: ... autorun DONE.
[ 5050.771944] md: md0 stopped.
[ 5050.781177] md: md2 stopped.
root@filserver:/var/log# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda5  /dev/sdb  /dev/sdb1  /dev/sdc  /dev/sdc1  /dev/sdd  /dev/sdd1  /dev/sdd5

shutdown -h now, öppnade locket på burken och såg att PATA-kortet inte satt i ordentligt. Tryckte dit det, startade upp maskinen igen och kontrollerade med

ceda@filserver:~$ lspci
00:00.0 Host bridge: Intel Corporation 82G33/G31/P35/P31 Express DRAM Controller (rev 10)
00:02.0 VGA compatible controller: Intel Corporation 82G33/G31 Express Integrated Graphics Controller (rev 10)
00:1b.0 Audio device: Intel Corporation 82801G (ICH7 Family) High Definition Audio Controller (rev 01)
00:1c.0 PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port 1 (rev 01)
00:1c.1 PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port 2 (rev 01)
00:1d.0 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI Controller #1 (rev 01)
00:1d.1 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI Controller #2 (rev 01)
00:1d.2 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI Controller #3 (rev 01)
00:1d.3 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI Controller #4 (rev 01)
00:1d.7 USB Controller: Intel Corporation 82801G (ICH7 Family) USB2 EHCI Controller (rev 01)
00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev e1)
00:1f.0 ISA bridge: Intel Corporation 82801GB/GR (ICH7 Family) LPC Interface Bridge (rev 01)
00:1f.1 IDE interface: Intel Corporation 82801G (ICH7 Family) IDE Controller (rev 01)
00:1f.2 IDE interface: Intel Corporation 82801GB/GR/GH (ICH7 Family) SATA IDE Controller (rev 01)
00:1f.3 SMBus: Intel Corporation 82801G (ICH7 Family) SMBus Controller (rev 01)
01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 03)
03:02.0 Mass storage controller: Promise Technology, Inc. PDC20268 (Ultra100 TX2) (rev 02)

Sista raden där ser fin ut.

ceda@filserver:~$ dmesg | grep md
[    0.807822] ata1: PATA max UDMA/100 cmd 0x1f0 ctl 0x3f6 bmdma 0xffa0 irq 14
[    0.807826] ata2: PATA max UDMA/100 cmd 0x170 ctl 0x376 bmdma 0xffa8 irq 15
[    0.809708] ata3: SATA max UDMA/133 cmd 0xc080 ctl 0xc000 bmdma 0xb800 irq 19
[    0.809711] ata4: SATA max UDMA/133 cmd 0xbc00 ctl 0xb880 bmdma 0xb808 irq 19
[    0.939487] ata5: PATA max UDMA/100 mmio m16384@0xfebfc000 cmd 0xfebfd7c0 irq 23
[    0.939490] ata6: PATA max UDMA/100 mmio m16384@0xfebfc000 cmd 0xfebfd5c0 irq 23
[    1.856559] md: linear personality registered for level -1
[    1.863976] md: multipath personality registered for level -4
[    1.866589] md: raid0 personality registered for level 0
[    1.870177] md: raid1 personality registered for level 1
[    1.965696] md: bind<sdc1>
[    1.987377] md: bind<sde5>
[    1.992221] md: bind<sdb1>
[    1.996833] raid1: raid set md4 active with 2 out of 2 mirrors
[    1.996869] md4: detected capacity change from 0 to 5...
[    1.998939]  md4: unknown partition table
[    2.139566] md: bind<sde6>
[    2.174302] md: bind<sdf6>
[    2.177122] raid1: raid set md2 active with 2 out of 2 mirrors
[    2.177159] md2: detected capacity change from 0 to 8...
[    2.179237]  md2:raid6: mmxx1     2494 MB/s
[    2.575133] md: raid6 personality registered for level 6
[    2.575136] md: raid5 personality registered for level 5
[    2.575138] md: raid4 personality registered for level 4
[    2.575744] md: bind<sdf5>
[    2.583390] md: raid10 personality registered for level 10
[    2.584960] raid1: raid set md0 active with 2 out of 2 mirrors
[    2.585036] md0: detected capacity change from 0 to 7...
[    2.587043]  md0: unknown partition table
[    3.671105] EXT4-fs (md0): barriers enabled
[    3.684246] kjournald2 starting: pid 469, dev md0:8, commit interval 5 seconds
[    3.684296] EXT4-fs (md0): warning: checktime reached, running e2fsck is recommended
[    3.715106] EXT4-fs (md0): internal journal on md0:8
[    3.715110] EXT4-fs (md0): delayed allocation enabled
[    3.715275] EXT4-fs (md0): mounted filesystem with ordered data mode
[    3.796771] EXT3 FS on md2, internal journal
[    3.816485] EXT4-fs (md4): barriers enabled
[    3.833274] kjournald2 starting: pid 475, dev md4:8, commit interval 5 seconds
[    3.833327] EXT4-fs (md4): warning: checktime reached, running e2fsck is recommended
[    3.856742] EXT4-fs (md4): internal journal on md4:8
[    3.856746] EXT4-fs (md4): delayed allocation enabled
[    3.857497] EXT4-fs (md4): mounted filesystem with ordered data mode

Gött. Inga semesterbilder förlorade. Dags att ordna offsite-backup igen. Partitionslista mailas en gång i månaden, så den finns “off site” iaf.

PGP och keysigning-part

FOSDEM Logotype
Free and Open Source Developers' European Meeting

Är påväg till FOSDEM i år igen. Det är en konferens inte lik någon annan (även om FSCONS ger ungefär samma stämning) som är helt fri att gå på och hålls på LUB-universitetet i Bryssel, första helgen i februari. Förväntningarna på Free Java-rummet  detta år är att det någon gång bryter ut i en fullständig politisk diskussion med smutskastning, bittra miner och “vi som klarar oss utan JCP, TCK osv”. Utöver det bör det som vanligt vara PGP-signering och CAcert Assurance-fest och en möjlighet att bli certifierad Linux-expert. Problemet med det sista brukar vara alla intressanta föreläsningar som än så länge prioriterats högre. Kanske är det dags att skaffa formellt intyg på Linux-kunskaperna.

En riktigt rolig tillställning är det i alla fall, med öppensinnade människor som lever för att dela kunskap och lära.

Gällande nyckelsignering så är verktyget caff (CA – Fire and Forget) helt oumbärligt för att orka med att signera hundratals nycklar. Under Ubuntu är det paketerat i signing-party. Caff tar en rad nyckel-ID:n som argument, hämtar hem nyckeln, signerar (interaktivt), skickar sedan nyckeln till varje e-postadress för respektive UID som ingår i nyckeln. Den skickade nyckeln är krypterad med den publika nyckeln så man kan vara säker på att man bara signerar nycklar till folk som den verkligen tillhör. Biff sade räven.

För att komma igång så bör man byta nyckelserver (jag kör pgp.mit.edu) och redigera .caffrc för att ställa in e-postsaker och ange nyckel man vill signera med. Sedan är det rätt rättframt.

CACert Assurer

CAcert Assurer Badge
CAcert Assurer

Sedan ett par minuter tillbaka är jag godkänd som CAcert Assurer. Det innebär att jag kan intyga identiteter och dela ut poäng till CAcert-medlemmar (så att de kan få fler poäng och bättre certifikat).

Målet med CAcert är att genom en transparent process och ett web of trust, bygga upp certifikathantering som är fri och likvärdig den traditionellt “kommersiella” (och grymt exploaterade) hanteringen. På kort sikt vill man se till att bli tillräckligt godkänd för att root-certifikatet skall distribueras med Mozillas alla produkter, t ex Firefox. När det målet är nått kan man alltså utan kostnad skaffa ett SSL-certifikat för sin webbserver och använda HTTPS utan att vara tvungen att betala avgift för att erhålla ett certifikat signerat av en betrodd CA.

En högst parentesaktig reflektion är att Debian borde vara med på detta som hökar kan jag tycka. De har ju fört seriösa diskussioner om en egen topp-nivå-domän (TLD) och DNSSEC:a en egen root-zon (om jag inte förstått det fel).

OpenVPN

Sätter upp OpenVPN för fjärde gången på kort tid (ett år) och denna gång skriver jag ner mina egna anteckningar istället för att följa någon annans som fungerar halvbra.

Tills vidare baserat på Virtual VPN Howto från riseup.net, fast med skillnaden att jag vill ha betrodda klient-certifikat (dvs med inslag från Sebastien Wains anteckningar.

På servern

echo “1” > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 10.30.0.0/24 -j MASQUERADE

aptitude install openvpn opencs #opencs behövs för pkcs11-tool
cp -r /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn/
cd /etc/openvpn/easy-rsa/2.0
vim vars
source vars
mkdir KEY_DIR
./clean-all #skapar index.txt och serial
./build-ca #defaults (bara trycka enter)
./build-key-server vpn.domain.org # defaults (bara trycka enter, sedan y, men fixa domännamnet)
./build-dh #skapar dh1024.pem
./build-key clientX.vpn.domain.org #skapar csr, crt och key för klienten
vim /etc/defaults/openvpn #AUTOSTART=”wains2-server”
cat >> /etc/openvpn/wains2-server.conf

På klienten

sudo aptitude install openvpn network-manager-openvpn-gnome
scp ceda@vpn.wendt.se:/etc/openvpn/keys/clientX.* .
cat >> wains2-client.conf
testa manuellt med sudo openvpn wains2-client.conf
Sedan kan resten skötas med Network Manager GUI:t: