From 70e240e7b09cc5317b96e582896f36d62735ace3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reynir=20Bj=C3=B6rnsson?= Date: Tue, 14 Sep 2021 14:45:27 +0200 Subject: [PATCH] verify-data-dir: check for untracked files --- bin/builder_db.ml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/bin/builder_db.ml b/bin/builder_db.ml index 82e59a4..e2e900c 100644 --- a/bin/builder_db.ml +++ b/bin/builder_db.ml @@ -224,7 +224,20 @@ let script_and_console : (unit, _, [`One | `Zero | `Many ]) Caqti_request.t = FROM build b, job WHERE job.id = b.job |} +module FpathSet = Set.Make(Fpath) + +let files_in_dir dir = + Bos.OS.Dir.fold_contents ~elements:`Files ~dotfiles:true + (fun f acc -> + let f = Option.get (Fpath.rem_prefix dir f) in + FpathSet.add f acc) + FpathSet.empty + dir + let verify_data_dir () datadir = + let files_in_filesystem = or_die 1 (files_in_dir (Fpath.v datadir)) in + Logs.info (fun m -> m "files in filesystem: %d" (FpathSet.cardinal files_in_filesystem)); + let files_tracked = ref (FpathSet.singleton (Fpath.v "builder.sqlite3")) in let dbpath = datadir ^ "/builder.sqlite3" in Logs.info (fun m -> m "connecting to %s" dbpath); let r = @@ -260,6 +273,7 @@ let verify_data_dir () datadir = (match Bos.OS.File.read abs_path with | Error (`Msg msg) -> Logs.err (fun m -> m "file %a not present: %s" Fpath.pp abs_path msg) | Ok data -> + files_tracked := FpathSet.add lpath !files_tracked; let s = Int64.of_int (String.length data) in if s <> size then Logs.err (fun m -> m "File %a has different size (in DB %Lu on disk %Lu)" Fpath.pp abs_path size s); let sh = Mirage_crypto.Hash.SHA256.digest (Cstruct.of_string data) in @@ -274,8 +288,13 @@ let verify_data_dir () datadir = in Bos.OS.File.must_exist console_file >>= fun _ -> Bos.OS.File.must_exist script_file >>= fun _ -> + files_tracked := FpathSet.add console (FpathSet.add script !files_tracked); Ok ()) () in + let files_untracked = FpathSet.diff files_in_filesystem !files_tracked in + FpathSet.iter (fun f -> + Logs.err (fun m -> m "untracked file in filesystem: %a" Fpath.pp f)) + files_untracked; or_die 1 r let help man_format cmds = function