Skip to content

Commit dba6ae6

Browse files
authored
Merge pull request #42 from binplz/jmc/logrotate
Add simple logrotate-based logging
2 parents 8219cea + c7fd772 commit dba6ae6

File tree

4 files changed

+54
-6
lines changed

4 files changed

+54
-6
lines changed

flake.nix

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@
4646
image-name = "binplz-ami-${system}";
4747
port = 80;
4848

49+
binplz-log-dir = "/var/log/binplz";
50+
4951
config = {
5052
amazon = {
5153
amazonImage.sizeMB = 4096;
@@ -108,7 +110,8 @@
108110
script = ''
109111
${pkgs.binplz-server}/bin/binplz-server \
110112
--port ${builtins.toString port} \
111-
--program-db ${programs-db}
113+
--program-db ${programs-db} \
114+
--log-dir ${binplz-log-dir}
112115
'';
113116
serviceConfig = {
114117
Restart = "always";
@@ -131,6 +134,18 @@
131134
services = {
132135
openssh.enable = true;
133136
openssh.permitRootLogin = "prohibit-password";
137+
logrotate = {
138+
enable = true;
139+
settings.${binplz-log-dir + "/*.log"} = {
140+
rotate = -1;
141+
size = "16M";
142+
compress = true;
143+
delaycompress = true;
144+
dateext = true;
145+
missingok = true;
146+
notifempty = true;
147+
};
148+
};
134149
};
135150
};
136151
};

server/app/Main.hs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,18 @@ getConfig = runOptionParser $ \envOption ->
4242
optShow = show
4343
}
4444
)
45+
<*> envOption
46+
( Option
47+
{ optHelp = "Log file directory",
48+
optMetaVar = "DIR",
49+
optLong = "log-dir",
50+
optShort = 'd',
51+
optEnvKey = "BINPLZ_LOG_DIR",
52+
optReadM = Opt.str,
53+
optDefault = "/var/log/binplz",
54+
optShow = show
55+
}
56+
)
4557

4658
main :: IO ()
4759
main = do

server/binplz-server.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ common common-options
3535
, servant-server
3636
, sqlite-simple
3737
, text
38+
, time
3839
, transformers
3940
, utf8-string
4041
, warp

server/src/Lib.hs

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ import Control.Concurrent (myThreadId)
1313
import Control.Concurrent.Async (concurrently)
1414
import Control.Monad
1515
import Control.Monad.IO.Class
16-
import Control.Monad.Trans.Except (ExceptT (..), runExceptT, withExceptT)
16+
import Control.Monad.Trans.Except (ExceptT (..), runExceptT)
17+
import Data.Aeson ((.=))
18+
import qualified Data.Aeson as Aeson
1719
import Data.ByteString (ByteString)
1820
import qualified Data.ByteString as BS
1921
import qualified Data.ByteString.Char8 as BS8
@@ -27,6 +29,7 @@ import Data.Maybe (fromMaybe)
2729
import Data.String (fromString)
2830
import Data.Text (Text)
2931
import qualified Data.Text as Text
32+
import qualified Data.Time.Clock.System as Time
3033
import Database.SQLite.Simple
3134
import Database.SQLite.Simple.FromField (FromField (..), Field, returnError, fieldData)
3235
import Database.SQLite.Simple.ToField (ToField (..))
@@ -119,7 +122,8 @@ newtype ProgramDB = ProgramDB {unProgramDB :: FilePath}
119122
data ServerConfig = ServerConfig
120123
{ _programDB :: ProgramDB,
121124
_applicationDB :: ApplicationDB,
122-
_port :: Port
125+
_port :: Port,
126+
_logdir :: FilePath
123127
}
124128
deriving (Show)
125129

@@ -129,18 +133,34 @@ data ServerConfig = ServerConfig
129133
-- 2. Building the triplet
130134
-- If an error occurs, this is returned as a 400
131135
server :: ServerConfig -> Server API
132-
server (ServerConfig programDB appDB _) =
136+
server (ServerConfig programDB appDB _ logdir) =
133137
redirectToDocs
134138
:<|> (\bin -> handle bin Nothing)
135139
:<|> (\pkg bin -> handle bin (Just pkg))
136140
where
137141
handle :: BinaryName -> Maybe PackageName -> Maybe Platform -> Maybe NixpkgsCommit -> Handler BSL.ByteString
138-
handle bin mpkg msys mcommit =
139-
Handler . withExceptT (\err -> err400 {errBody = BSL.pack err}) $ do
142+
handle bin mpkg msys mcommit = Handler $ do
143+
mbin <- liftIO . runExceptT $ do
140144
commit <- resolveCommit mcommit
141145
let sys = fromMaybe X86_64_Linux msys
142146
pkg <- maybe (resolvePackageName programDB bin sys) pure mpkg
143147
buildTriplet appDB (BinInfo bin pkg sys commit)
148+
liftIO $ do
149+
time <- Time.systemSeconds <$> Time.getSystemTime
150+
Dir.createDirectoryIfMissing True logdir
151+
let logstring =
152+
Aeson.encode . Aeson.object $
153+
[ "time" .= time,
154+
"binary" .= unBinaryName bin,
155+
"package" .= maybe Aeson.Null (Aeson.String . Text.pack . unPackageName) mpkg,
156+
"platform" .= maybe Aeson.Null (Aeson.String . Text.pack . show) msys,
157+
"commit" .= maybe Aeson.Null (Aeson.String . unNixpkgsCommit) mcommit,
158+
"result" .= either (Aeson.String . Text.pack) (const "success") mbin
159+
]
160+
Lazy.appendFile (logdir </> "requests.log") (logstring <> "\n")
161+
case mbin of
162+
Left err -> throwError (err400 {errBody = BSL.pack err})
163+
Right ok -> pure ok
144164

145165
-- | The default Nixpkgs commit we use when the user doesn't provide one.
146166
--

0 commit comments

Comments
 (0)