-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathincdump.ml
97 lines (90 loc) · 3.99 KB
/
incdump.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
(***********************************************************************)
(* incdump.ml - creates keydump consisting of recently added keys *)
(* *)
(* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, *)
(* 2011, 2012, 2013 Yaron Minsky and Contributors *)
(* Copyright (C) 2004 Peter Palfrader *)
(* *)
(* This file is part of SKS. SKS is free software; you can *)
(* redistribute it and/or modify it under the terms of the GNU General *)
(* Public License as published by the Free Software Foundation; either *)
(* version 2 of the License, or (at your option) any later version. *)
(* *)
(* This program is distributed in the hope that it will be useful, but *)
(* WITHOUT ANY WARRANTY; without even the implied warranty of *)
(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *)
(* General Public License for more details. *)
(* *)
(* You should have received a copy of the GNU General Public License *)
(* along with this program; if not, write to the Free Software *)
(* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *)
(* USA or see <http://www.gnu.org/licenses/>. *)
(***********************************************************************)
open StdLabels
open MoreLabels
open Printf
open Common
open Packet
module Set = PSet.Set
let settings = {
Keydb.withtxn = !Settings.transactions;
Keydb.cache_bytes = !Settings.cache_bytes;
Keydb.pagesize = !Settings.pagesize;
Keydb.keyid_pagesize = !Settings.keyid_pagesize;
Keydb.meta_pagesize = !Settings.meta_pagesize;
Keydb.subkeyid_pagesize = !Settings.subkeyid_pagesize;
Keydb.time_pagesize = !Settings.time_pagesize;
Keydb.tqueue_pagesize = !Settings.tqueue_pagesize;
Keydb.word_pagesize = !Settings.word_pagesize;
Keydb.dbdir = Lazy.force Settings.dbdir;
Keydb.dumpdir = Lazy.force Settings.dumpdir;
}
module Keydb = Keydb.Unsafe
let dump_database timestamp fname =
let maxsize = 250_000 in
let log = Keydb.reverse_logquery ~maxsize timestamp in
if List.length log = 0 then
printf "No changes since timestamp\n"
else
let file = open_out fname in
let run () =
let newkeys = List.fold_left log ~init:Set.empty
~f:(fun set (_,change) -> match change with
Add hash -> Set.add hash set
| Delete hash -> Set.remove hash set)
in
printf "%d new keys in log.\n%!" (Set.cardinal newkeys);
Set.iter newkeys
~f:(fun hash ->
try
let keystring = Keydb.get_keystring_by_hash hash in
output_string file keystring;
with
e ->
eprintf "Error fetching keystring from hash %s: %s\n%!"
(Utils.hexstring hash)
(Printexc.to_string e)
)
in
protect ~f:run ~finally:(fun () -> close_out file)
let run () =
List.iter !Settings.anonlist
~f:(fun x -> printf "\"%s\" " x);
printf "\n%!";
match !Settings.anonlist with
| timestamp::tl ->
let name = match tl with
| [] -> "incdump.pgp"
| [name] -> name
| _ -> raise (Argument_error "too many arguments")
in
printf "saving to file %s\n%!" name;
set_logfile "incdump";
perror "Running SKS %s%s" Common.version Common.version_suffix;
Keydb.open_dbs settings;
protect ~f:(fun () ->
let timestamp = float_of_string timestamp in
dump_database timestamp name )
~finally:(fun () -> Keydb.close_dbs ())
| _ ->
raise (Argument_error "no timestamp provided")