Remove dependence on bsd-sysctl package
… since it doesn't work on Linux
This commit is contained in:
@@ -1,4 +0,0 @@
|
|||||||
module Sysctl where
|
|
||||||
|
|
||||||
_SO_MAX_CONN :: String
|
|
||||||
_SO_MAX_CONN = "kern.ipc.somaxconn"
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
module Sysctl where
|
|
||||||
|
|
||||||
_SO_MAX_CONN :: String
|
|
||||||
_SO_MAX_CONN = "net.core.somaxconn"
|
|
||||||
@@ -15,17 +15,9 @@ executable nix-serve-ng
|
|||||||
|
|
||||||
main-is: Main.hs
|
main-is: Main.hs
|
||||||
|
|
||||||
other-modules: Sysctl
|
other-modules: Nix
|
||||||
, Nix
|
|
||||||
, Options
|
, Options
|
||||||
|
|
||||||
if os(darwin)
|
|
||||||
hs-source-dirs: darwin
|
|
||||||
elif os(linux)
|
|
||||||
hs-source-dirs: linux
|
|
||||||
else
|
|
||||||
buildable: False
|
|
||||||
|
|
||||||
-- https://nixos.org/manual/nix/stable/installation/supported-platforms.html
|
-- https://nixos.org/manual/nix/stable/installation/supported-platforms.html
|
||||||
if arch(i686) && os(linux)
|
if arch(i686) && os(linux)
|
||||||
cxx-options: -DSYSTEM="i686-linux"
|
cxx-options: -DSYSTEM="i686-linux"
|
||||||
@@ -49,7 +41,6 @@ executable nix-serve-ng
|
|||||||
build-depends: base < 5
|
build-depends: base < 5
|
||||||
, base16
|
, base16
|
||||||
, base32
|
, base32
|
||||||
, bsd-sysctl
|
|
||||||
, bytestring
|
, bytestring
|
||||||
, charset
|
, charset
|
||||||
, http-types
|
, http-types
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{ mkDerivation, base, base16, base32, bsd-sysctl, bytestring
|
{ mkDerivation, base, base16, base32, bytestring, charset
|
||||||
, charset, http-types, lib, managed, megaparsec, mtl, network
|
, http-types, lib, managed, megaparsec, mtl, network, nixstore
|
||||||
, nixstore, nixutil, optparse-applicative, vector, wai, wai-extra
|
, nixutil, optparse-applicative, vector, wai, wai-extra, warp
|
||||||
, warp, warp-tls
|
, warp-tls
|
||||||
}:
|
}:
|
||||||
mkDerivation {
|
mkDerivation {
|
||||||
pname = "nix-serve-ng";
|
pname = "nix-serve-ng";
|
||||||
@@ -10,9 +10,8 @@ mkDerivation {
|
|||||||
isLibrary = false;
|
isLibrary = false;
|
||||||
isExecutable = true;
|
isExecutable = true;
|
||||||
executableHaskellDepends = [
|
executableHaskellDepends = [
|
||||||
base base16 base32 bsd-sysctl bytestring charset http-types managed
|
base base16 base32 bytestring charset http-types managed megaparsec
|
||||||
megaparsec mtl network optparse-applicative vector wai wai-extra
|
mtl network optparse-applicative vector wai wai-extra warp warp-tls
|
||||||
warp warp-tls
|
|
||||||
];
|
];
|
||||||
executableSystemDepends = [ nixstore nixutil ];
|
executableSystemDepends = [ nixstore nixutil ];
|
||||||
description = "A drop-in replacement for nix-serve that's faster and more stable";
|
description = "A drop-in replacement for nix-serve that's faster and more stable";
|
||||||
|
|||||||
17
src/Main.hs
17
src/Main.hs
@@ -13,8 +13,8 @@ import Data.Function ((&))
|
|||||||
import Network.Socket (SockAddr(..))
|
import Network.Socket (SockAddr(..))
|
||||||
import Network.Wai (Application)
|
import Network.Wai (Application)
|
||||||
import Nix (PathInfo(..))
|
import Nix (PathInfo(..))
|
||||||
|
import Numeric.Natural (Natural)
|
||||||
import Options (Options(..), Socket(..), SSL(..), Verbosity(..))
|
import Options (Options(..), Socket(..), SSL(..), Verbosity(..))
|
||||||
import Sysctl (_SO_MAX_CONN)
|
|
||||||
|
|
||||||
import qualified Control.Monad as Monad
|
import qualified Control.Monad as Monad
|
||||||
import qualified Control.Monad.Except as Except
|
import qualified Control.Monad.Except as Except
|
||||||
@@ -34,7 +34,6 @@ import qualified Network.Wai.Middleware.RequestLogger as RequestLogger
|
|||||||
import qualified Nix
|
import qualified Nix
|
||||||
import qualified Options
|
import qualified Options
|
||||||
import qualified Options.Applicative as Options
|
import qualified Options.Applicative as Options
|
||||||
import qualified System.BSD.Sysctl as Sysctl
|
|
||||||
import qualified System.Environment as Environment
|
import qualified System.Environment as Environment
|
||||||
|
|
||||||
data ApplicationOptions = ApplicationOptions
|
data ApplicationOptions = ApplicationOptions
|
||||||
@@ -330,8 +329,8 @@ makeApplication ApplicationOptions{..} request respond = do
|
|||||||
Left response -> respond response
|
Left response -> respond response
|
||||||
Right void -> Void.absurd void
|
Right void -> Void.absurd void
|
||||||
|
|
||||||
toSocket :: FilePath -> IO Socket.Socket
|
toSocket :: Natural -> FilePath -> IO Socket.Socket
|
||||||
toSocket path = do
|
toSocket backlog path = do
|
||||||
let family = Socket.AF_UNIX
|
let family = Socket.AF_UNIX
|
||||||
|
|
||||||
Monad.unless (Socket.isSupportedFamily family) do
|
Monad.unless (Socket.isSupportedFamily family) do
|
||||||
@@ -341,8 +340,6 @@ toSocket path = do
|
|||||||
|
|
||||||
Socket.bind socket (SockAddrUnix path)
|
Socket.bind socket (SockAddrUnix path)
|
||||||
|
|
||||||
backlog <- Sysctl.sysctlReadInt _SO_MAX_CONN
|
|
||||||
|
|
||||||
Socket.listen socket (fromIntegral backlog)
|
Socket.listen socket (fromIntegral backlog)
|
||||||
|
|
||||||
return socket
|
return socket
|
||||||
@@ -378,10 +375,10 @@ main = do
|
|||||||
|
|
||||||
Warp.runSettings settings application
|
Warp.runSettings settings application
|
||||||
|
|
||||||
Options{ ssl = Disabled, socket = Unix{ path } } -> do
|
Options{ ssl = Disabled, socket = Unix{ backlog, path } } -> do
|
||||||
let settings = Warp.defaultSettings
|
let settings = Warp.defaultSettings
|
||||||
|
|
||||||
socket <- toSocket path
|
socket <- toSocket backlog path
|
||||||
|
|
||||||
Warp.runSettingsSocket settings socket application
|
Warp.runSettingsSocket settings socket application
|
||||||
|
|
||||||
@@ -395,11 +392,11 @@ main = do
|
|||||||
|
|
||||||
WarpTLS.runTLS tlsSettings settings application
|
WarpTLS.runTLS tlsSettings settings application
|
||||||
|
|
||||||
Options{ ssl = Enabled{ cert, key }, socket = Unix{ path } } -> do
|
Options{ ssl = Enabled{ cert, key }, socket = Unix{ backlog, path } } -> do
|
||||||
let tlsSettings = WarpTLS.tlsSettings cert key
|
let tlsSettings = WarpTLS.tlsSettings cert key
|
||||||
|
|
||||||
let settings = Warp.defaultSettings
|
let settings = Warp.defaultSettings
|
||||||
|
|
||||||
socket <- toSocket path
|
socket <- toSocket backlog path
|
||||||
|
|
||||||
WarpTLS.runTLSSocket tlsSettings settings socket application
|
WarpTLS.runTLSSocket tlsSettings settings socket application
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import Control.Applicative (optional, (<|>))
|
|||||||
import Data.String (IsString(..))
|
import Data.String (IsString(..))
|
||||||
import Data.Void (Void)
|
import Data.Void (Void)
|
||||||
import Network.Wai.Handler.Warp (HostPreference, Port)
|
import Network.Wai.Handler.Warp (HostPreference, Port)
|
||||||
|
import Numeric.Natural (Natural)
|
||||||
import Options.Applicative (Parser, ParserInfo, ReadM)
|
import Options.Applicative (Parser, ParserInfo, ReadM)
|
||||||
import Text.Megaparsec (Parsec)
|
import Text.Megaparsec (Parsec)
|
||||||
|
|
||||||
@@ -18,7 +19,7 @@ import qualified Text.Megaparsec.Char.Lexer as Lexer
|
|||||||
|
|
||||||
data Socket
|
data Socket
|
||||||
= TCP { host :: HostPreference, port :: Port }
|
= TCP { host :: HostPreference, port :: Port }
|
||||||
| Unix { path :: FilePath }
|
| Unix { backlog :: Natural, path :: FilePath }
|
||||||
|
|
||||||
data SSL = Disabled | Enabled { cert :: FilePath, key :: FilePath }
|
data SSL = Disabled | Enabled { cert :: FilePath, key :: FilePath }
|
||||||
|
|
||||||
@@ -94,8 +95,18 @@ parseTcp = do
|
|||||||
|
|
||||||
return TCP{..}
|
return TCP{..}
|
||||||
|
|
||||||
|
defaultBacklog :: Natural
|
||||||
|
defaultBacklog = 1024
|
||||||
|
|
||||||
parseUnix :: Parser Socket
|
parseUnix :: Parser Socket
|
||||||
parseUnix = do
|
parseUnix = do
|
||||||
|
backlog <- Options.option Options.auto
|
||||||
|
( Options.long "backlog"
|
||||||
|
<> Options.help "The maximum number of connections allowed for the backlog"
|
||||||
|
<> Options.metavar "INTEGER"
|
||||||
|
<> Options.value defaultBacklog
|
||||||
|
)
|
||||||
|
|
||||||
path <- Options.strOption
|
path <- Options.strOption
|
||||||
( Options.long "socket"
|
( Options.long "socket"
|
||||||
<> Options.short 'S'
|
<> Options.short 'S'
|
||||||
@@ -167,7 +178,10 @@ parseListen = do
|
|||||||
|
|
||||||
let parseUnixListen :: Parsec Void String Socket
|
let parseUnixListen :: Parsec Void String Socket
|
||||||
parseUnixListen = do
|
parseUnixListen = do
|
||||||
|
let backlog = defaultBacklog
|
||||||
|
|
||||||
path <- Megaparsec.takeRest
|
path <- Megaparsec.takeRest
|
||||||
|
|
||||||
return Unix{..}
|
return Unix{..}
|
||||||
|
|
||||||
let parseSocketListen = parseTcpListen <|> parseUnixListen
|
let parseSocketListen = parseTcpListen <|> parseUnixListen
|
||||||
|
|||||||
Reference in New Issue
Block a user