filehttpd: En webserver til filer i dit filsystem

Har du en guide til en funktion eller et program? Har du tips og trick, som du gerne vil dele med andre? Post dem her.
lath
Indlæg: 5095
Tilmeldt: 27. apr 2008, 02:16
IRC nickname: lars_t_h
Geografisk sted: Fyn

filehttpd: En webserver til filer i dit filsystem

Indlæg af lath »

Du kommer til at oversætte programmet (det er nemt), men du skal lige installere en pakke først:

Kode: Vælg alt

sudo apt-get -y install golang-go


Programmet er udviklet i programmeringssproget Go, og det ser således ud:

Kode: Vælg alt

package main

import (
   "flag"
   "fmt"
    "net/http"
    "os"
)

func main() {
   var dir string
   var port uint
   var localhost_port_str string

   flag.StringVar(&dir, "d", "", "The path to the directory. "+
      "Is equal to the / (Root) dir of the static file web server")
   flag.UintVar(&port, "p", 8108, "port number, default value: 8108, only listens on localhost")
   flag.Parse()

   if dir == "" {
      flag.PrintDefaults()
      os.Exit(-1)
   }
   if port > 65535 {
      flag.PrintDefaults()
      os.Exit(-2)
   } else {
      localhost_port_str = fmt.Sprintf("localhost:%d", port)
   }

   http.Handle("/", http.FileServer(http.Dir(dir)))
   http.ListenAndServe(localhost_port_str, nil)
}

Go koden herover er alt hvad der skal til at lave en webserver til filer i filsystemet.
Du kan vælge portnummer med -p argumentet, eller stille dig tilfreds med at den starter op på port 8108.
Med -d argumentet vælger du den mappe som webserveren skal bruge (!BEMÆRK!: at angive et filnavn virker ikke!)

Gem filen og giv den navnet: filehttpd.go

Fra mappen hvor filehttpd.go er i oversættes den med:

Kode: Vælg alt

go build ./filehttpd.go

Ud kommer et kørbart program der ingen afhængigheder har: filehttpd

Kopier så filen til ~/bin fra mappen hvor filehttpd er i.:

Kode: Vælg alt

mkdir -p ~/bin;mv ./filehttpd ~/bin/filehttpd; chmod ugo+x ~/bin/filehttpd


Nu kan du læse HTML filer i filsystemet, og AJAX kald vil også virke, da det jo er en webserver:

Kode: Vælg alt

filehttpd -d="$HOME"

Kommandoen serverer filer fra din hjemmemappe, på localhost:8108, så du skal altså kopiere det her ind i din browsers adresselinie for at se det:

Kode: Vælg alt

http://localhost:8108


/Lars

Edit: ~/.bin -> ~/bin
Senest rettet af lath 13. okt 2014, 02:17, rettet i alt 3 gange.
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og indlejede systemer, hvor indlejrede systemer er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags
AJenbo
Admin
Indlæg: 20878
Tilmeldt: 15. nov 2009, 15:04
IRC nickname: AJenbo
Geografisk sted: Vanløse, København

Re: filehttpd: En webserver til filer i dit filsystem

Indlæg af AJenbo »

Helt uden afhængiheder er den vel ikke for den kræver både Linux og Libc. Men den løser det jo ved at lave fat-bineries hvilket betyder at programmerne vil bruge mere ram end nødvendigt da de ikke kan dele hukommelsen hvilket jeg syndes er lidt ærgerligt. Det må vel også betyde et ydelses tab når der oftere skal skiftes ud mellem ram og CPU cache.
zob
Redaktør
Indlæg: 4430
Tilmeldt: 6. jan 2009, 22:01
Geografisk sted: København

Re: filehttpd: En webserver til filer i dit filsystem

Indlæg af zob »

Sejt. Meget enkelt.
Der er en fejl i linjen hvor du opretter en mappe, flytter en fil og sætter rettigheder:

Kode: Vælg alt

mkdir -p ~./bin;mv ./filehttpd ~./bin/filehttpd; chmod ugo+x ~/bin/filehttpd

Hvis det er meningen det skal være en bin mappe under den mappe man befinder sig i, så mangler chmod delen et punktum. Hvis det derimod er meningen at der der oprettes en mappe under /home/username (~/), så er der et punktum i overskud i mkdir og mv ~/bin/filehttpd kommandoerne. Ud over det fungerer det strålende.
lath
Indlæg: 5095
Tilmeldt: 27. apr 2008, 02:16
IRC nickname: lars_t_h
Geografisk sted: Fyn

Re: filehttpd: En webserver til filer i dit filsystem

Indlæg af lath »

AJenbo skrev:Helt uden afhængiheder er den vel ikke for den kræver både Linux og Libc.

Alle programmer kræver sjovt nok en kerne, så det er da rigtigt at Linux er påkrævet for Linux styresystemer før Go programmet (og alle andre programmer) overhovedet kan starte.

Med hensyn til libc må det have noget at gøre med net/http pakken (den bruger cgo), fordi Go laver normalt kun programmer med absolut ingen afhængigheder:
Fra Go FAQ https://golang.org/doc/faq#Why_is_my_trivial_program_such_a_large_binary har vi:
The linkers in the gc tool chain (5l, 6l, and 8l) do static linking. ...

AJenbo skrev:Men den løser det jo ved at lave fat-bineries hvilket betyder at programmerne vil bruge mere ram end nødvendigt da de ikke kan dele hukommelsen hvilket jeg syndes er lidt ærgerligt. Det må vel også betyde et ydelses tab når der oftere skal skiftes ud mellem ram og CPU cache.

Jeg kan nævne at programmet er fyldt med debugging symboler, og kører man stripe på objekt-koden (ikke program-filen) før programmet linkes til et program, så kan det reduceres meget i størrelse.

Nu kører der jo ofte kun en instans af programmet for servere, så RAM spild er der ikke så meget af, og din bekymring med ydelsestab er så ikke korrekt for kun 1 instans af serveren.
Google har dog planer om fuld support for Go shared libraries - også at et Go runtime kan embeddes inde i et andet program, som et shared library, såvel som brug af dynamisk linking ved runtime.

Det er absolut en fordel at lave en static linked binary for servere.
Deployment bliver super-nemt: 1) kopier til serveren med scp 2) start den. Der findes også tricks til automatisk blød opstart af Go servere uden at brugerne opdager noget, så trin 2 kan være udnødvendigt.
Tricket går ud på at overtage indkommende trafik fra den gamle version af serveren, og så lade klienter stadig være aktive for den gamle version af serveren, såvel som at acceptere nye indkomne requests for den nye version af serveren.
Den gamle version af serveren lukker så ned når sidste klient ikke længere har brug for serveren, evt .tilføjes en timeout for at serveren ikke hænger i RAM i al evighed.
Klient koden - javascript - kan laves sådan at den kan modtage en meddelelse om at serveren ønsker at klienten skal lukke den nuværende websocket ned og oprette en ny websocket forbindelse til serveren. For at undgå thundering hurd problemet indsætter man så en lille pause i hver anmodning til en klient om at reconnecte.

/Lars
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og indlejede systemer, hvor indlejrede systemer er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags
lath
Indlæg: 5095
Tilmeldt: 27. apr 2008, 02:16
IRC nickname: lars_t_h
Geografisk sted: Fyn

Re: filehttpd: En webserver til filer i dit filsystem

Indlæg af lath »

zob skrev:Sejt. Meget enkelt.
Der er en fejl i linjen hvor du opretter en mappe, flytter en fil og sætter rettigheder:

Kode: Vælg alt

mkdir -p ~./bin;mv ./filehttpd ~./bin/filehttpd; chmod ugo+x ~/bin/filehttpd

Hvis det er meningen det skal være en bin mappe under den mappe man befinder sig i, så mangler chmod delen et punktum. Hvis det derimod er meningen at der der oprettes en mappe under /home/username (~/), så er der et punktum i overskud i mkdir og mv ~/bin/filehttpd kommandoerne. Ud over det fungerer det strålende.

Godt spottet - fejlen er rettet nu.

/Lars
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og indlejede systemer, hvor indlejrede systemer er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags
AJenbo
Admin
Indlæg: 20878
Tilmeldt: 15. nov 2009, 15:04
IRC nickname: AJenbo
Geografisk sted: Vanløse, København

Re: filehttpd: En webserver til filer i dit filsystem

Indlæg af AJenbo »

lath skrev:Nu kører der jo ofte kun en instans af programmet for servere, så RAM spild er der ikke så meget af, og din bekymring med ydelsestab er så ikke korrekt for kun 1 instans af serveren.

Tjo, men måske ville man køre flere programmer hvor der kunne være en fordel at dele elementer af programmerne. Også mere generelt kunne det være en fordel hvis nu ikke lige man køre på en server med kun en funktion.
thj01
Indlæg: 2667
Tilmeldt: 21. nov 2006, 10:06
Geografisk sted: Fredericia

Re: filehttpd: En webserver til filer i dit filsystem

Indlæg af thj01 »

Kan andre computere på netværket også tilgå ens filstruktur ved at anvende IP:8108 - som f.eks. ved XAMPP?
Forfatter til Ubuntuguiden: http://www.vidas.dk/guides/ubuntuguiden.html

Kører LTS udgaverne.

"It's always easy if you know how to do it."
AJenbo
Admin
Indlæg: 20878
Tilmeldt: 15. nov 2009, 15:04
IRC nickname: AJenbo
Geografisk sted: Vanløse, København

Re: filehttpd: En webserver til filer i dit filsystem

Indlæg af AJenbo »

Ja
thj01
Indlæg: 2667
Tilmeldt: 21. nov 2006, 10:06
Geografisk sted: Fredericia

Re: filehttpd: En webserver til filer i dit filsystem

Indlæg af thj01 »

Det mener jeg jo så skal nævnes som en konsekvens sideeffekt. For når man så logger på netværket på f.eks. arbejde/skole osv - så får andre også adgang .....

uagtet at det er supercool at man kan gg
Forfatter til Ubuntuguiden: http://www.vidas.dk/guides/ubuntuguiden.html

Kører LTS udgaverne.

"It's always easy if you know how to do it."
lath
Indlæg: 5095
Tilmeldt: 27. apr 2008, 02:16
IRC nickname: lars_t_h
Geografisk sted: Fyn

Re: filehttpd: En webserver til filer i dit filsystem

Indlæg af lath »

thj01 skrev:Det mener jeg jo så skal nævnes som en konsekvens sideeffekt. For når man så logger på netværket på f.eks. arbejde/skole osv - så får andre også adgang .....

uagtet at det er supercool at man kan gg

I kildekoden står der localhost, hvilket er IP adressen 127.0.0.1, som kun er tilgængeligt fra programmer på maskinen der kører filehttpd.
Dermed er der ikke mulighed for adgang fra nogen hosts i et netværk.

Fjerner man localhost i kildekoden (det gøres i fomatteringsteksten til fmt.Sprintf) vil den derimod lytte på alle netværksinterfaces.

Man kan også oprette en ny bruger der hedder filehttpd for eksempel, og så starte filehttpd programmet som om det var den bruger.
Det gøres med:

Kode: Vælg alt

su filehttpd -c filehttpd <argumenter til filehttpd>

(kodeordet du skal indtaste er det for bruger filehttpd - ikke dit eget kodeord)

Teksten herunder er for alle andre brugerkonti end filehttpd brugerkontoen (*)
Hvis der bruges et andet brugernanv end dit eget til at starte filehttpd programmet, så vilrettigheder styre hvad der kan kigges på.
Det bliver så sådan at der kan kigges på en fil, hvis read-bitten for other er sat, dvs at hvis man kører chmod o+r på en fil kan den læses. Har man derimod kørt o-r på en fil kan den ikke læses.
Bemærk at for mapper skal x-bitten sættes for at man kan se indholdet.

/Lars

(*): Pas på med hvilke grupper filehttpd brugeren er medlem af, for eller kan der være adgang alligevel.
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og indlejede systemer, hvor indlejrede systemer er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags
lath
Indlæg: 5095
Tilmeldt: 27. apr 2008, 02:16
IRC nickname: lars_t_h
Geografisk sted: Fyn

Re: filehttpd: En webserver til filer i dit filsystem

Indlæg af lath »

Jeg brøvede lige at køre stripe på programmet før det skrives til filsystemet.

Det gør man sådan her:

Kode: Vælg alt

go build -ldflags "-s" filehttpd.go


Ud kommer en filehttpd som nu er stripped for debugging symboler, hvilket reducerer filstørrelsen med lige under 28% (27,99%) for filehttpds vedkommende.

Dvs at filehttpd:
  • med debugging symboler fylder 4.236.320 bytes (4,04 MiB)
  • uden debugging symboler fylder 5.883.760 bytes (5,61 MiB)

Det sjove er at programmet kun tog mig ca 10 minutter at lave, og at filehttpd kan klare flere samtidige forbindelser - sådan bare uden videre.

/Lars
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og indlejede systemer, hvor indlejrede systemer er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags
AJenbo
Admin
Indlæg: 20878
Tilmeldt: 15. nov 2009, 15:04
IRC nickname: AJenbo
Geografisk sted: Vanløse, København

Re: filehttpd: En webserver til filer i dit filsystem

Indlæg af AJenbo »

Er det muligt at compile det på en måde hvor den ikke statisk linker alle libs? Jeg kan se den både linker med et TLS crypto og gzip komprimerings lib selv om det ikke rigtig er i brug.
lath
Indlæg: 5095
Tilmeldt: 27. apr 2008, 02:16
IRC nickname: lars_t_h
Geografisk sted: Fyn

Re: filehttpd: En webserver til filer i dit filsystem

Indlæg af lath »

AJenbo skrev:Er det muligt at compile det på en måde hvor den ikke statisk linker alle libs? Jeg kan se den både linker med et TLS crypto og gzip komprimerings lib selv om det ikke rigtig er i brug.

Almindeligvis kan man som programmør selv bestemme om nogle libs skal statisk lænkes og andre dynamisk lænkes.

net/http pakken understøtter https, så det er nok derfor at den linker til en TLS crypto lib.
net/http pakken har såvidt jeg husker det en reference til gzip pg zlib pakkerne, så det er nok derfor at den er med.

Jeg mener godt at man kan dynamisk linke Go programmer. Det er bare ikke sådan noget man bare lige gør, og da jeg ikke har det behov, så det er uinteressant for mig.

/Lars
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og indlejede systemer, hvor indlejrede systemer er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags