Billigs dørklient

Dørklienten er dørvaktenes applikasjon for å ta imot billetter på papir og på kort. De er primært laget med tanke på å kunne slippe inn folk rimelig raskt, redusere forvirring med skikkelig informasjon, og være relativt robuste (dvs. fungere selv om f.eks. nettet skulle gå ned).

Dørklientene har sin egen lokale database som de jobber mot hele veien; se under for mer informasjon.

Slik fungerer dørklienten

Dørklienten kan motta billetter ved å scanne papirbillett med strekkodeleseren, ved å taste inn HMAC-kode, ved å dra medlemskort i kortleseren, eller ved å taste inn medlemskortnummeret. (Det vanligste er å bruke strekkode- og magnetkortleserne; touchskjermen er der primært for billetter med dårlig strekkode, folk som ikke har fått skrevet ut hjemme men har referansenummeret, osv. Merk: Vi antar at dårlige strekkoder helst blir sendt til luka for å få printet en ny billet. Det er slikt luka er der for.) I dørklienten settes det opp hvilke arrangement som skal godtas; ut fra dette kan man godta billetter på papir og på kort. Eksempelvis kan man ønske å slippe inn folk med billetter til konsert i bakdøra, men kreve helt andre billetter for inngang i Strossa.

Papirbilletter

Når noen scanner en strekkodebillett (eller taster inn en kode manuelt via touchskjermen), skjer det en del operasjoner i serie (tatt litt fra hukommelsen):

«Billettløs reise»/billett-på-kort

Dette fungerer omtrent som papirbilletter, med ett viktig unntak: Et kort kan ha flere billetter på seg, til flere forskjellige arrangementer (men bare ett per kort). Dersom et kort har flere ubrukte billetter på seg (innen omtrentlig riktig datoområde (?)), vil det når man trekker kortet komme opp en liste på touchskjermen som vakten kan velge fra. (For å unngå, evt. skape forvirring vil det også komme opp billetter for arrangementer som ikke godtas i den gitte døren.) Etter at valget er gjort (eller dersom det bare finnes én ubrukt billett på det gitte kortet), er prosedyren nøyaktig som for papirbilletter.

Dersom alle billettene på et gitt kort er brukt, vil det komme opp en feilmelding med når den siste ble brukt. Dersom kortet ikke har noen billetter på seg overhodet, vil det komme opp en feilmelding som sier dette.

Implementasjon

Selve dørklienten er skrevet i C++, med wxWidgets som widgetsett og libpqxx for å koble til PostgreSQL-databasen.

Kildekode for klienten ligger i billig/door/; det er stort sett rimelig rett fram hvis man kan C++ og wxWidgets (selv om koden kunne vært noe renere til tider). Den største «overraskelsen» er kanskje at strekkodeleseren og magnetkortleseren polles fra separate tråder, direkte via Linux' event-grensesnittet; slik blir man ikke avhengig av å lese fra tastaturet e.l. for å få tilgang til data derfra (og det er svært enkelt å finne ut hvilke data som kom hvorfra).

Fadingen (fra grønt/rødt avhengig av suksess/feil, og til nøytral bakgrunn) kan se ut som eyecandy, men den har faktisk en usability-misjon: Når nye meldinger er fargede og gamle er svart/hvitt, er det svært enkelt å se om man fikk respons på det man akkurat gjorde, eller om det bare er den forrige meldingen som fortsatt henger igjen.

Bygging av Debian-pakken

For å rulle ut nye endringer må det bygges en pakke som kan legges i Debian-speilet vårt:

Crossbuilding av Debian-pakken for armhf

Denne guiden er sterkt inspirert av Jodal's bloggpost som du finner her.

Det finnes flere ulike måter å crossbuilde til armhf. En av de metodene som generelt ser ut til å være mest anbefalt, er å opprette en separat chroot for arkitekturen, slik at du slipper å ha pakker for ulike arkitekturer. En annen fordel med dette er at om du senere ønsker å bygge andre pakker til armhf, så kan du bruke samme chroot.

For å gjøre dette ønsker vi å bruke pbuilder. Du kan lese mer om pbuilder her. Det første du trenger å gjøre er å sette opp en .pbuilderrc med en rekke miljøvariabler som gjør byggingen litt enklere. Du kan f. eks kopiere min fra ~paal/.pbuilderrc.

Deretter må du installere følgende pakker:

Du kan så bruke følgende kommando for å bygge en chroot for Debian Jessie med armhf som arkitektur:

sudo OS=debian DIST=jessie ARCH=armhf pbuilder –create

pbulider vil vanligvis installere alle dependencies når pakken bygges, men disse blir ikke installert permanent. Dette fører til at byggeprosessen tar realtivt lang tid. Det du derfor heller kan gjøre er å installere avhengighetene før du prøver å bygge pakken. Du kan gjøre dette på vanlig måte (altså, apt-get install ...) i chrooten. For å få tilgang til chrooten bruker du:

sudo OS=debian DIST=jessie ARCH=armhf pbuilder –login –save-after-login
Se deretter etter i debian/control for hvilke dependencies du trenger å installere. Etter chrooten er satt opp, kan du bruke følgende kommando for å bygge pakken:

OS=debian DIST=jessie ARCH=armhf pdebuild –debbuildopts -B
Årsaken til at vi ønsker å bruke –debbuildopts -B, er for å kun bygge den arkitekturavhengige pakken (her: billig-doorclient). Hvis du ønsker å bygge billig-doorsql i tillegg kan du istedet bruke
–use-pdebuild-internal
Årsaken til at vi må bruke –use-pdebuild-internal er at pbuilder tydeligvis kun mounter mappen man står i, og finner dermed ikke ../sql som billig-doorsql avhenger av.

Når byggingen av pakken er ferdig, vil den ligge i

/var/cache/pbuilder/debian-jessie-armhf/result
.

PC-oppsett

Dørmaskinen er puppetifisert og kjører jessie. For å sette opp ny maskin gjøres følgende:

Dørklienten o.l. distribueres fra et eget apt-arkiv på debian.samfundet.no; dette er adgangsbegrenset til dørklientene ettersom binærene inneholder tilkoblingsinformasjon til databasen (se under). Alle relevante Debian-pakker kompileres ut fra ./door-katalogen i Arch-treet; de kan kompileres på en vilkårlig jessie-maskin (dvs. enten på en klientmaskin, eller på altersex som har et egnet utviklingsmiljø oppe). Her ligger også en del ekstra drivere, som f.eks. ferdigkompilerte kjerne- og X-moduler for touchskjermen vi bruker.

Lokal database

Det er vitalt at dørklientene fungerer, også om nettverksforbindelsen skulle gå ned eller cirkus skulle få vondt på et eller annet vis. Derfor har alle dørmaskinene sin egen lokale database, og dørapplikasjonen snakker utelukkende med denne.

Generell multimaster-replikering med offline-støtte er ekstremt vanskelig, og det finnes få slike løsninger for PostgreSQL. Vi har i stedet en minimal synkroniseringsdæmon (skrevet i Perl) som kjører hvert femte minutt. Denne sørger for å:

Vi bruker såkalt two-phase-commit for å sikre at man kan opprettholde alt dette i en transaksjon som spenner over de to databasene. Dette betyr i praksis at det er nær-umulig at transaksjonen går gjennom på den ene siden men ikke den andre, og følgelig at det er mye enklere å opprettholde konsistent mht. hva som er migrert over eller ikke.

Se også Billig synkronisering v2.

Innslipp utenfor Samfundet

Ettersom ulike aktører ønsker å holde ulike arrangementer utenfor Samfundet, hender det at vi må gjøre innslipp utenfor samfundet.

i /etc/default/puppet sett:

 START=no 

Dette gjør at puppet ikke starter ved start-up, slik at den ikke overskriver endringene vi gjør.

i /etc/interfaces/network sett:

allow-hotplug eth0
iface eth0 inet dhcp

Den andre linjen gjør at maskinen spør om en dynamisk IP.

 sshuttle -rD <brukernavn>@login.samfundet.no 193.35.52.30/32 -v 

sshuttle brukes her til å sette opp en VPN som sender all trafikk som sendes til 193.35.52.30/32 via cassarossa. Dette gjøres siden postgres ikke aksepterer tilkoblinger fra IP-adresser som ikke finnes i pg_hba.conf. En enklere løsning er å midlertidig legge til IP-blokken som brukes under arrangementet inn i pg_hba.conf.

Bruk av kvitteringsprintere utenfor Samfundet

For å få kvitteringsprinterene til å fungere utenfor Samfundet kan en revers SSH-tunnel brukes. CUPS vil forsøke å kontakte printeren med lpd-protokolen på port 515, så f. eks:

 ssh -R8515:<den lokale IP-adressen til kvitteringsprinteren>:515 <ditt brukernavn>@login.samfundet.no 
vil opprette en revers SSH-tunnel fra port 8515 på cassarossa til port 515 på den lokale maskinen. Konfigurasjonen til kvitteringsprinteren i CUPS må også endres til å peke til denne porten. Dette gjøres ved å gå til Administration -> Manage Printers og deretter velge kvitteringsprinteren du ønsker å bruke. Du ønsker så å sette «Connection» til lpd://localhost:8515 (eller en annen port dersom du valgte det da du satte opp SSH-tunnelen).

Offline-migrering

Hvis nettverket skulle være virkelig på tur, eller man rett og slett er et sted uten skikkelig nettilgang (tenk teltet under UKA, med en litt shaky trådløslink), har vi to muligheter: Offlinemigrering og ren papirbasert backup. Sistnevnte er beskrevet i Billig web, førstnevnte vil bli beskrevet her.

Offlinemigrering initieres ved å kjøre scriptet offline.pl fra billig.samfundet.no (tilgjengelig i menyen for alle administratorer; se Billig web). Denne gjør ingen endringer i hoveddatabasen, men den tar et snapshot av dataene migreringsapplikasjonen vil trenge, i form av kommaseparerte filer inni en .zip-fil. Denne lagres så til USB-minnepinne, iPod, CF-kort e.l.; hva som helst som kan puttes inn i dørmaskinen duger.

Når dørmaskinen så merker (via udev) at noe er blitt satt inn, leter den (case-insensitivt) etter en fil ved navn offline.zip. Hvis den finner dette, laster den dataene inn i et eget «skygge-skjema» i den lokale databasen (som er laget for å ligne mest mulig på hoveddatabasen), før den gjør en migrering mot det som vanlig. Her gjøres det dog ikke noe forsøk på å migrere «brukt»-status opp tilbake til hoveddatabasen; migreringen er enveis, og ingenting lagres på USB-minnepinnen (eller hva man nå har brukt). Etter migreringen kommer det en beskjed opp på skjermen som forteller om ting gikk i orden eller ikke, og dørapplikasjonen fungerer som vanlig videre.

Lenker: Start, billig, billig database, billig for vakter, innslipp utenfor samfundet, puppet

Mail: itk@samfundet.no | Telefon: 992 15 925 | Sist endret: 2017-02-08 18:17 | Revisjon: 43 (historie, blame) | Totalt: 1419 kB | Rediger