Bepasty is een open source pastebin voor tekst en code-snippets, maar ook een upload-service voor grotere bestanden zoals afbeeldingen, PDF- en muziekbestanden, enzovoorts. Bepasty is makkelijk te installeren, makkelijk in gebruik en het draait in je eigen netwerk.

Matto Fransen

Bepasty is een open source webapplicatie waarmee je tekst en code-snippets deelt. Bepasty is tevens een generieke upload-service, voor bijvoorbeeld afbeeldingen, muziekbestanden, films, PDF-bestanden, enzovoorts.

Bepasty is geschreven in Python en Javascript en is beschikbaar onder de open source BSD 2-Clause “Simplified” License. De opslag van de snippets en geuploade bestanden vindt plaats in de vorm van bestanden in een directory op de server. Doordat het op Python gebaseerd is, draait het op de meeste platformen, zoals Linux en BSD. Bepasty is uitstekend geschikt om op een Raspberry Pi te draaien, je kunt het natuurlijk ook op een klassieke server installeren.

Elk bestand dat je uploadt krijgt een individuele link om mee te bekijken. Bepasty probeert de bestanden deze zoveel mogelijk in een passende viewer te tonen, zoals PDF-bestanden in een PDF-viewer, mp4-bestanden in een videoplayer, enzovoorts.

Snippets

Bepasty is een webapplicatie, de gebruiker opent Bepasty in de webbrowser en heeft geen extra software nodig. In het openingsscherm toont Bepasty een grote textarea waar je je snippet in plakt (paste). Vervolgens selecteer je het content-type. Je kiest daarbij uit een lange lijst het juiste type, zodat later bij het tonen van de snippet de juiste syntax-hightlighting wordt toegepast. Om snel het juiste content-type te kiezen werkt Bepasty met een soort incrementele zoekmethode, je begint met typen en naarmate je meer letters typt wordt de lijst met mogelijke keuzes steeds korter. In de praktijk zul al snel de content-types die je dagelijks gebruikt uit je hoofd kennen.

Naast de keuze van het content-type heb je optie om de bestandsnaam op te geven die later gebruikt wordt bij het downloaden van de snippet. Zie screenshot 1.

Bewaartermijn

Wanneer je een snippet toevoegt of een bestand uploadt, kies je de bewaartermijn. De standaard ingestelde bewaartermijn is een maand. Je kiest uit een bewaartermijn in minuten, uren, dagen, weken, maanden of jaren. Het is ook mogelijk om geen bewaartermijn op te geven, dat wil zeggen dat de snippet of het bestand niet automatisch wordt verwijderd.

Onder de textarea om snippets in de plakken bevindt zich de dropzone. Bestanden die je wilt uploaden, sleep je naar de dropzone en laat ze daar los. Een andere optie is om met je muis in de dropzone te klikken en dan met de gebruikelijke bestandskiezer van je browser een of meer bestanden te kiezen. Dit werkt allemaal heel makkelijk, in het begin is het wel even wennen dat je eerst de bewaartermijn moet kiezen voor je bestanden dropt of via de browser uploadt. Wanneer je geen bewaartermijn kiest, dan is de standaard bewaartermijn van een maand van toepassing.

Overzichtslijst

Snippets of bestanden die je hebt toegevoegd verschijnen in de overzichtslijst. De overzichtlijst is gesorteerd op datum van nieuw naar oud, dus het laatst toegevoegde bestand of snippet staat boven in de lijst. De lijst bevat de bestandsnaam, bij afbeeldingen een thumbnail, en up- en downloaddata. Zie screenshot 2.

Naast ieder element in de lijst staat een klein balkje met enkele buttons, “display”, “download”, “inline”, “delete” en “lock”. Je klikt op “display” om meer informatie over het element te krijgen. Dit toont meta-data, zoals bijvoorbeeld de SHA256 hash, bestandsnaam, content-type, uploaddatum en eventueel de laatste downloaddatum. Voor zover het content-type dat toelaat, wordt de inhoud in de browser getoond. Bepasty kan een grote verscheidenheid aan content-types in de browser tonen, zoals afbeeldingen, geluid en video via een html5-speler, asciinema opnames. PDF-bestanden (afhankelijk van de browser).

Niet elke gebruiker hoeft rechten te hebben om de overzichtslijst in te zien. Deze is vooral voor de beheerder bedoeld.

Flexibele permissies

Bepasty werkt niet met gebruikers, maar met gedeelde sleutels. Een sleutel is een, bij voorkeur lange, string. Deze leg je vast in het configuratiebestand. In het gedeelte “PERMISSIONS” neem je een lijst op met per regel de sleutel, een dubbele punt. Hierbij kies je een of meer van de rechten “admin”, “list”, “create”, “modify”, “read” en “delete”.

Verder geef je in het configuratiebestand de rechten op voor niet-ingelogde gebruikers. Afhankelijk van je toepassing kies je hier in het algemeen hetzij geen rechten (’‘), hetzij alleen lees-rechten (’read’).

Hiermee bouw je een structuur op van gebruikers met alleen lees-rechten (mensen met wie je een snippet of bestand wilt delen), gebruikers met creatie- en leesrechten (“gewone” gebruikers) en enkele gebruikers met meer rechten (bijvoorbeeld beheerders).

Iedereen die het toegangsrecht “read” heeft, kan alle snippets en alle bestanden openen, mits deze de referentie er van kent. Het idee hierachter is dat je de betrokkene de URL per IRC of per e-mail doorgeeft (de URL eindigt met de referentie).

Je deelt de sleutel met de rechten “create” en “read” met “gewone” gebruikers. Deze voegen hiermee nieuwe snippets en bestanden toe, noteren de URL en delen deze URL met anderen of gebruiken deze later weer om hun eigen snippet of bestand op te halen.

Je deelt de sleutel met toegangsrechten zoals “list”, “modify” en “delete” alleen met een zeer select gezelschap. Voor ons thuisgebruik vinden wij het recht “list” wel erg prettig.

Syntax-highlighting

Snippets worden standaard getoond met een regelnummer in de linker kantlijn, het regelnummer is tevens een link, zodat je makkelijk naar een bepaalde regel in je code kunt verwijzen. Wanneer je bij je snippet een content-type opgeeft, dan toont Bepasty de snippet met de bijbehorende syntax-hightlighting. Het aantal content-types waarvoor Bepasty syntax-highlighting kan tonen, is waanzinnig groot. Dit gebeurt met de Python syntax highlighter Pygments, welke volgens de website pygments.org ruim 500 verschillende types ondersteunt. Zie screenshot 3.

Wanneer je meerdere bestanden in een keer uploadt, krijg je de optie om daar een aparte pastebin-lijst van te maken. Het voordeel hiervan is, naast dat het wat structuur aanbrengt in de verzameling, later de bestanden ook weer als groep te downloaden zijn. In een toekomstige versie worden afbeeldingen, wanneer deze in een lijst zitten, in een carousel getoond.

Bij het uploaden berekent Bepasty de SHA256 hash van de snippet of het bestand en deze wordt bij de details getoond. Hiermee toets je bijvoorbeeld de integriteit van het bestand na het up- of downloaden.

Pastebinit

Pastebinit is een populaire commandline client om om snippets via een pastebin dienst te delen. Pastebinit is voor verschillende platforms beschikbaar, waaronder bijvoorbeeld de Linux distributies Debian en Ubuntu en FreeBSD.

Bepasty kan ook met pastebinit gebruikt worden. Je installeert pastebinit en past het configuratiebestand $HOME/pastebinit.xml aan en voegt toe een bestand in ~/.pastebin.d, zie listing 5.

Hierna deel je via de commandline snippets met

echo “linux magazine” | pastebinit -t titel -p [sleutel]

Dit is handig om bijvoorbeeld de output van commando’s naar Bepasty te sturen. Wanneer je dit veelt gebruikt, maak dan in je shell een alias van “pastebinit -p [sleutel]”, dat scheelt weer typen.

REST API

Bepasty heeft een uitgebreide REST API ingebouwd. Hiermee kun je bestanden en snippets up- en downloaden en daarbij de bewaartermijn opgeven, desgewenst het content-type specifiek meegeven, enzovoorts. Verder geeft de API ook mogelijkheden om meta-data op te vragen, bestanden te deleten, enzovoorts.

Raspberry Pi

Wij installeerden Bepasty op een Raspberry Pi 3 A plus, dit is een wat goedkopere Raspberry met een wat kleiner printplaatje dan gebruikelijk en heeft wel Wifi, maar geen aansluiting voor bedraad netwerk. Hiervoor gebruikten wij een kersverse Raspberry Pi OS Lite installatie, de versie met bestandsnaam 2021-03-04-raspios-buster-armhf-lite.zip.

Na een apt-get update en apt-get upgrade installeer je de benodigde Python onderdelen en de NGINX webserver, die we als na afloop als reverse-proxy gaan inzetten.

 

Voer de eerste stappen van de installatie uit, volgens listing 1. Open hierna het bestand ~/bepasty.conf in een editor en verwijder de bovenste regel (die met class Config) en verwijder de indents aan het begin van alle overige regels. Zoek de regel met “SECRET_KEY” en zet een lange string tussen de enkele quotes op die regel. Zoek de regel met “STORAGE_FILESYSTEM_DIRECTORY” en verander ‘/tmp’ in ’‘/home/bepasty/storage/’. Wanneer je geen https maar http gebruikt, wijzig dan de regel met “SESSION_COOKIE_SECURE” van True naar False. Bijna onderin het bestand vind je een regel die begint met “PERMISSIONS”. Hier maak je een of meer regels aan met een wachtwoord en bijbehorende rechten, bijvoorbeeld ‘geheimwachtwoord’:’admin,list,create,modify,read,delete’,

Maak het bestand /home/bepasty/bin/gunicorn_bepasty aan, en vul die met de inhoud van listing 2. Maak daarna het script executable met “chmod +x /home/bepasty/bin/gunicorn_bepasty”.

Maak met sudo het bestand /etc/nginx/conf.d/bepasty.conf aan, en vul die met de inhoud van listing 3. Pas desgewenst de hostname aan. Herstart daarna nginx met “service nginx reload”.

Test nu of alle werkt, met su – bepasty, gevolgd door ~/bin/gunicorn_bepasty, en open de hostname uit het nginx-config bestand in je browser (neem eventueel de hostname op in je /etc/hosts bestand). Als het goed is, krijg je nu het inlogscherm van bepasty in je browser. Stop gunicorn_bepasty met Ctrl-c.

Wanneer alles werkt, maak je nog met sudo het bestand “bepasty.service” aan in /etc/systemd/system, zie listing 4. Dit bestand maak je executable (chmod +x bepasty.service). Hierna start je bepasty op met “systemctl start bepasty.service” en zorg je dat het voortaan altijd gestart wordt met “systemctl enable bepasty.service”.

Ontwikkeling

Thomas Waldman, de huidige hoofdontwikkelaar, meldt dat gewerkt wordt aan een fraaiere weergave van een serie afbeeldingen. Meewerken doe je door zaken uit de issue tracker op te pakken. Wil je nieuwe functionaliteiten toevoegen, dan die graag eerst voorstellen door daar een nieuw issue voor aan te maken. Het team zoekt nog mensen die aan het front-end willen werken. Code security reviews zijn ook altijd welkom, net als verbeteringen van de documentatie.

 

Een pastebin service is bedoeld voor tijdelijke, korte termijn opslag van snippets en bestanden en niet als langetermijn opslag of als backup. Je gebruikt het om even een code snippet, een diff of een foutmelding en dergelijke met iemand anders te delen, of om makkelijk een bestand met een andere computer of iemand anders uit te wisselen.

Wannneer je Bepasty aan het internet blootstelt, let dan op dat je uploadrechten alleen aan vertrouwde personen toekent, om auteursrechtelijke problemen of verspreiding van schadelijk materiaal te voorkomen. Verder is het beter om persoonlijke wachtwoorden toe te kennen, bij misbruik kun je dan de rechten van een persoon intrekken en hoef je niet te raden wie van een groep over de scheef gegaan is.

Mobile devices

Wij gebruiken Bepasty ook op een 8 inch Android tablet en op een iPad, op beide apparaten werkt het probleemloos.

Het voordeel van een pastebin- of upload service onder je eigen beheer en in je eigen netwerk is dat je alles onder eigen controle hebt en de privacy gegarandeerd blijft.

Bij het werken met Bepatsy valt ons op het prettig het in gebruik is. Het is echt gemaakt met de eindgebruiker in gedachten. Het is handig om een snippet- en uploadservice in je eigen netwerk te hebben, dat al snel een onderdeel van je dagelijkse werkwijze wordt. Wij willen niet meer zonder.