Wanneer een bestand over het Internet verstuurd wordt, dan wordt het aan de kant van de verzender eerst door een splitter opgedeeld in kleinere segmenten. Die segmenten worden pakketten genoemd. Alle pakketten worden daarna individueel over het Internet verstuurd naar dezelfde ontvanger. Als de ontvanger alle pakketten van het bestand heeft ontvangen, dan gebruikt hij een assembler om het originele bestand te reconstrueren.
Het Internet gebruikt packet switching1 om de route van de pakketten doorheen het netwerk te bepalen. Daarbij is het vaak wenselijk dat de pakketten van hetzelfde bestand verschillende routes volgen om opstopping te voorkomen. Als gevolg daarvan bereiken die pakketten de ontvanger niet noodzakelijk in hun originele volgorde.
Bovendien is het Internet niet feilloos en gebeurt het wel eens dat pakketten hun bestemming nooit of pas zeer laat bereiken.
Schrijf een bash shell script assembler dat kan gebruikt worden om boodschappen te reconstrueren op basis van binnengekomen pakketten. Aan het script moet als argument de locatie van een tekstbestand doorgegeven worden dat alle binnengekomen pakketten bevat. Zo een tekstbestand ziet er bijvoorbeeld als volgt uit:
6220 1 10 Because he's the hero Gotham deserves, 6220 9 10 5181 5 7 in time, like tears in rain. Time to die. 6220 3 10 So we'll hunt him. 6220 5 10 Because he's not a hero. 5181 6 7 5181 2 7 shoulder of Orion. I watched C-beams 5181 4 7 Gate. All those moments will be lost 6220 6 10 He's a silent guardian. 5181 3 7 glitter in the dark near the Tannhäuser 6220 7 10 A watchful protector. 5181 1 7 believe. Attack ships on fire off the 6220 0 10 We have to chase him. 5181 0 7 I've seen things you people wouldn't 6220 4 10 Because he can take it. 6220 2 10 but not the one it needs right now. 6220 8 10 A Dark Knight.
Elke regel van het tekstbestand stelt één enkel pakket voor en bestaat uit vier informatievelden die van elkaar gescheiden worden door tabs:
unieke code $$m \in \mathbb{N}$$ van de boodschap waaruit het pakket komt
volgnummer $$i \in \mathbb{N}$$ van het pakket; bij het opdelen van een boodschap worden pakketten opeenvolgend genummerd: het eerste pakket heeft volgnummer 0 en het laatste pakket heeft volgnummer $$p - 1$$
aantal pakketten $$p \in \mathbb{N}_0$$ waarin de boodschap werd opgedeeld
tekstfragment (string) dat zelf geen tabs bevat
De pakketten van eenzelfde boodschap komen in willekeurige volgorde voor en het tekstbestand moet niet noodzakelijk alle pakketten van die boodschap bevatten. Hetzelfde pakket komt echter nooit meerdere keren voor.
Daarnaast moet het script ook de volgende opties ondersteunen:
optie -m <int>: gebruik deze optie om de reconstructie van een binnengekomen boodschap weer te geven; de unieke code van die boodschap moet als verplicht argument aan de optie -m doorgegeven worden
optie -p: gebruik deze optie om in het statusoverzicht ook een percentage weer te geven of bij de reconstructie van een boodschap ook de volgnummers van de pakketten weer te geven (zie verder)
Het script moet voor de verwerking van de opties de flexibiliteit aan de dag leggen die gebruikelijk is bij Unix commando's: volgorde van opties speelt geen rol, opties kunnen eventueel samengenomen worden, ….
Als de optie -m niet gebruikt wordt dan moet het script een statusoverzicht uitschrijven naar stdout, dat aangeeft hoe volledig de boodschappen reeds zijn binnengekomen. Voor elke binnengekomen boodschap moet het overzicht een regel bevatten met de unieke code van de boodschap, gevolgd door een dubbelpunt (:), een spatie, het aantal pakketten van de boodschap die reeds zijn binnengekomen, een slash (/) en het aantal pakketten waarin de boodschap werd opgedeeld. Als de optie -p gebruikt wordt, dan moet op het einde van elke regel ook nog een extra spatie staan, gevolgd door het percentage van het aantal binnengekomen berichten. Het percentage moet tussen ronde haakjes staan en moet afgerond tot op twee cijfers na de komma weergegeven worden. De boodschappen moeten in het overzicht weergegeven worden volgens oplopende unieke code.
Als aan de optie -m een argument $$m$$ wordt doorgegeven, dan moet het script voor elk binnengekomen pakket van de boodschap met unieke code $$m$$ een regel met het tekstfragment van het pakket uitschrijven naar stdout. Hierbij moet de originele volgorde van de tekstfragmenten gereconstrueerd worden. Als de optie -p gebruikt wordt, dan moet elk tekstfragment voorafgegaan worden door het volgnummer van het pakket, een punt (.) en een spatie.
Het script moet de volgende foutafhandeling voorzien:
als het script niet de gepaste opties meekrijgt (enkel ondersteuning voor de opties -m en -p), het verplicht argument bij de optie -m wordt niet meegegeven, of er wordt niet één enkel argument doorgegeven aan het script, dan moet de gepaste boodschap (zie onderstaande voorbeeldsessie) uitgeschreven worden naar stderr en moet het script eindigen met exit status 1
als de bestandslocatie die aan het script wordt doorgegeven niet verwijst naar een gewoon leesbaar bestand, dan moet de gepaste boodschap (zie onderstaande voorbeeldsessie) uitgeschreven worden naar stderr en moet het script eindigen met exit status 2
als het argument dat aan de optie -m wordt doorgegeven geen unieke code is van een boodschap waarover het script pakketten heeft ontvangen, dan moet de gepaste boodschap (zie onderstaande voorbeeldsessie) uitgeschreven worden naar stderr en moet het script eindigen met exit status 3
als het argument dat aan de optie -m wordt doorgegeven de unieke code is van een boodschap waarvan het script nog niet alle pakketten heeft ontvangen, dan moet de gepaste boodschap (zie onderstaande voorbeeldsessie) uitgeschreven worden naar stderr en moet het script eindigen met exit status 3
Als er zich geen fouten voordoen, dan moet het script eindigen met exit status 0.
Onderstaande voorbeeldsessie geeft aan hoe het bash shell script assembler moet kunnen gebruikt worden. Hierbij gaan we ervan uit dat de tekstbestanden packets.01.txt2 en packets.02.txt3 zich in de huidige directory bevinden. Alle bestanden die bij het testen van je oplossing gebruikt worden, kan je hier4 downloaden.
$ assembler
Syntaxis: assembler [-p] [-m ID] FILE
$ echo $?
1
$ assembler -abc packets.01.txt5
Syntaxis: assembler [-p] [-m ID] FILE
$ echo $?
1
$ assembler xxx
assembler: onbestaand of onleesbaar bestand "xxx"
$ echo $?
2
$ assembler packets.01.txt6
5181: 7/7
6220: 10/10
$ assembler -p packets.02.txt7
1938: 13/17 (76.47%)
2997: 19/19 (100.00%)
6450: 11/11 (100.00%)
7469: 7/7 (100.00%)
9949: 10/10 (100.00%)
$ echo $?
0
$ assembler -m 666 packets.02.txt8
assembler: boodschap 666 is onbekend
$ echo $?
3
$ assembler -m 1938 packets.02.txt9
assembler: boodschap 1938 is onvolledig
$ echo $?
3
$ assembler -m 7469 packets.02.txt10
I've seen things you people wouldn't
believe. Attack ships on fire off the
shoulder of Orion. I watched C-beams
glitter in the dark near the Tannhäuser
Gate. All those moments will be lost
in time, like tears in rain. Time to die.
$ echo $?
0
$ assembler -pm 7469 packets.02.txt11
0. I've seen things you people wouldn't
1. believe. Attack ships on fire off the
2. shoulder of Orion. I watched C-beams
3. glitter in the dark near the Tannhäuser
4. Gate. All those moments will be lost
5. in time, like tears in rain. Time to die.
6.
$ echo $?
0