use Config::TOML; use Cro::HTTP::Server; use Cro::HTTP::Log::File; use Cro::HTTP::Session::InMemory; use Crater::Routes; use Crater::Gallery; use Crater::Session; #| Crater is a photo gallery sub MAIN( IO() :$config where *.IO.f = 'resources/config.toml', #= configuration file IO() :$directory! where *.IO.d, #= gallery directory (takes absolute path) Str :$password = '0x', #= password for authentication Bool :$verbose, #= increase verbosity ) is export { put "Initialized: {now - INIT now}"; put "Gallery: {$directory.absolute}"; put "Password: $password"; my %conf = from-toml($config.slurp); %conf //= %*ENV; %conf //= %*ENV; my Crater::Gallery $gallery = Crater::Gallery.new(:$directory); my Cro::Service $http = Cro::HTTP::Server.new( http => <1.1>, host => %conf || die("host not set"), port => %conf || die("port not set"), application => routes(:$password, :$gallery), before => [ Cro::HTTP::Session::InMemory[Crater::Session].new( expiration => Duration.new(60 * 15) ); ], after => [ Cro::HTTP::Log::File.new(logs => $*OUT, errors => $*ERR) ] ); $http.start; say "Listening at http://%conf:%conf"; react { whenever signal(SIGINT) { say "Shutting down..."; $http.stop; done; } } }