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):
- Man sjekker at HMAC-en er gyldig. Hvis ikke skrives det ut en beskjed om «ugyldig sikkerhetskode».
- Man sjekker at billetten faktisk finnes i databasen. Hvis ikke skrives det ut at billetten ikke finnes i systemet – dette er nesten alltid tegn på at noe er feil i databasen et sted. Det mest sannsynlige er at synkroniseringen til hoveddatabasen på et eller annet vis er ødelagt (se under).
- Man sjekker at billetten ikke allerede er brukt. I så fall skrives det ut en beskjed om når den ble brukt.
- Man sjekker at billetten er til et godtatt arrangement for døren der den blir scannet (se over).
- Billetten merkes som brukt i databasen, og det flasher opp en melding om hvilken prisgruppe den tilhører.
«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:
- Still deg i door-mappen
- Kjør debchange -i, inkrementerer versjonsnummeret og skriv noe meningsfylt i endringsloggen.
- Bygg pakken med: debuild -uc -us
- Lintian vil forsøke å inspisere pakken og påpeke eventuelle feil Hvis du ikke vil kjøre lintian, kjør debuild –no-lintian -uc -us
- Ved suksessfull pakking vil .deb- og .changes-filer bli lagt i rotmappen til billig-prosjektet.
- Test pakkene ved å kjøre dpkg -i pakkenavn.deb. Installer eventuelle ikke-installerte dependencies.
- Putt den i pakkespeilet og sjekk inn endringene
Kryss-kompilering av Debian-pakken for armhf
Bygg heller pakken direkte på én odroid (eller annen maskin med armhf-arkitektur) hvis tilgjengelig.
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:
- pbuilder
- qemu-user-static
- debian-archive-keyring
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-loginSe 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 buster. For å sette opp ny maskin gjøres følgende:
- Pass på at den nye maskinen ligger i puppet ( cassarossa:/etc/puppet/manifest/billig_buster/nodes.pp ) og DNS ( cirkus:/etc/bind/pz/samfundet.no og cirkus:/etc/bind/pz/0.0.0.0.4.f.9.2.c.7.6.0.1.0.0.2.ip6.arpa ).
- Installer distribusjonen via PXE. Kan gjerne bruke semi-automatisk oppsett. Ikke trykk return, men tab og sett kernelflagget locale til en_GB.UTF8 (og ikke en_DK.UTF8).
- Slett gammel puppetnøkkel fra puppetmaster hvis den finnes: # puppet cert --clean billigx.samfundet.no
- Kjør puppet onetime: puppet agent --test --server=puppet.samfundet.no --environment=billig --waitforcert 15
- Signer sertifikat på puppetmaster (cassarossa). ( puppet cert --list og deretter puppet cert --sign <navn> )
- La puppet på klienten kjøre seg ferdig. (dersom enkelt pakker feiler i pkgsync, prøv å kjøre denne manuelt)
- Kjør reboot
- Hvis ting ikke funker, kjør puppet en gang til.
- (Sjekk at kalibrering av touchskjerm stemmer noenlunde, og at strekkode- og kortleser fungerer)
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 å:
- Kopiere nye arrangementer ned fra hoveddatabasen til døra.
- Kopiere nysolgte billetter fra hoveddatabasen til døra.
- Kopiere «brukt»-status fra døra til hoveddatabasen (slik at en billett som er brukt i en dør, også settes sentralt). (Etter at dette er gjort, settes et flagg på dørklienten, slik at den ikke vil prøve å migrere dette flagget for den gitte billetten i framtiden.)
- Tilsvarende, kopiere «brukt»- og «refundert»-status fra hoveddatabasen til døra (slik at en billett ikke kan brukes i noen av de andre dørene heller). Dersom det er uventet inkonsistens (f.eks. at en billett har rukket å bli satt som brukt i to dører), vil scriptet klage og sende en epost via cron.
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.
skru av puppet på billigklienten:
systemctl stop puppet
Skru på DHCP på billigklienten (i /etc/systemd/network/eth0.network på billigklienten):
[match] Name=eth0 [network] DHCP=yes
billig65:~# systemctl restart systemd-networkd
Dette skrur på dhcp slik at klienten automatisk får en ip.
Husk å åpne ip-rangen du bruker i pg_hba.conf, slik at man får synkronisert.
Bruk av kvitteringsprintere utenfor Samfundet
For å kunne bruke kvitteringsprintere utenfor huset, måtte vi sette opp en reverse SSH tunnel dette gjøres på en annen maskin i samme nett som kvitteringsprinteren:
ssh -R 8520:192.168.1.118:515 dinbruker@login.samfundet.no -vN4
-8520: Porten på cass. (Du kan velge en annen) -192.168.1.118: IPen som kvitteringsprinteren får. (Trykk på Feed knappen rett etter å ha skrudd den på for å få IPen) -515: porten som kvitteringsprinteren lytter på. (Endres ikke)
Etter at man har kjørt kommandoen, må man da:
-Gå til printhost.samfundet.no –> printers –> velg printeren du skal bruke –> modify printer
–> LPD/LPR Host or Printer –> skriv inn
lpd://localhost:8520/queue
–> continue –> modify printer –> print test page
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, billig generelt, innslipp utenfor samfundet, puppet
Epost: itk@samfundet.no | Telefon: 992 15 925 | Sist endret: 2024-02-19 11:31 | Revisjon: 62 (historie, blame) | Totalt: 1905 kB | Rediger