Blame


1 38232a0a 2023-05-07 op #!/usr/bin/env perl
2 38232a0a 2023-05-07 op #
3 38232a0a 2023-05-07 op # smingest was written by Omar Polo <op@openbsd.org> and is placed in the
4 38232a0a 2023-05-07 op # public domain. The author hereby disclaims copyright to this source
5 38232a0a 2023-05-07 op # code.
6 38232a0a 2023-05-07 op
7 38232a0a 2023-05-07 op use strict;
8 38232a0a 2023-05-07 op use warnings;
9 38232a0a 2023-05-07 op use v5.32;
10 38232a0a 2023-05-07 op use utf8;
11 38232a0a 2023-05-07 op
12 38232a0a 2023-05-07 op use Date::Parse;
13 38232a0a 2023-05-07 op use File::Basename;
14 38232a0a 2023-05-07 op
15 38232a0a 2023-05-07 op die "usage: $0 dbpath\n" if @ARGV != 1;
16 38232a0a 2023-05-07 op my $dbpath = shift @ARGV;
17 38232a0a 2023-05-07 op
18 38232a0a 2023-05-07 op open(my $sqlite, "|-", "/usr/local/bin/sqlite3", $dbpath)
19 38232a0a 2023-05-07 op or die "can't spawn sqlite3";
20 38232a0a 2023-05-07 op
21 7b8263f5 2023-05-07 op if (`uname` =~ "OpenBSD") {
22 7b8263f5 2023-05-07 op use OpenBSD::Pledge;
23 7b8263f5 2023-05-07 op use OpenBSD::Unveil;
24 38232a0a 2023-05-07 op
25 7b8263f5 2023-05-07 op unveil("/usr/local/bin/mshow", "rx") or die "unveil mshow: $!";
26 7b8263f5 2023-05-07 op pledge("stdio proc exec") or die "pledge: $!";
27 7b8263f5 2023-05-07 op }
28 7b8263f5 2023-05-07 op
29 38232a0a 2023-05-07 op say $sqlite ".import --csv /dev/stdin email"
30 38232a0a 2023-05-07 op or die "can't speak to sqlite: $!";
31 38232a0a 2023-05-07 op
32 38232a0a 2023-05-07 op while (<>) {
33 38232a0a 2023-05-07 op chomp;
34 38232a0a 2023-05-07 op
35 38232a0a 2023-05-07 op open(my $fh, "-|", "/usr/local/bin/mshow", "-Atext/plain", "-NF", $_)
36 38232a0a 2023-05-07 op or die "can't run mshow $_: $!";
37 38232a0a 2023-05-07 op
38 38232a0a 2023-05-07 op my $f = $_;
39 38232a0a 2023-05-07 op my ($time, $id) = split /\./, basename $_;
40 38232a0a 2023-05-07 op my $mid = "$time.$id";
41 38232a0a 2023-05-07 op $mid =~ s/"/""/g;
42 38232a0a 2023-05-07 op
43 38232a0a 2023-05-07 op my ($from, $subj, $date) = ('', '', undef);
44 38232a0a 2023-05-07 op while (<$fh>) {
45 38232a0a 2023-05-07 op chomp;
46 38232a0a 2023-05-07 op last if /^$/;
47 38232a0a 2023-05-07 op s/"/""/g;
48 38232a0a 2023-05-07 op $from = s/.*?: //r if /^From:/;
49 38232a0a 2023-05-07 op $subj = s/.*?: //r if /^Subject:/;
50 38232a0a 2023-05-07 op $date = str2time(s/.*?: //r) if /^Date:/;
51 38232a0a 2023-05-07 op }
52 38232a0a 2023-05-07 op $date //= time;
53 38232a0a 2023-05-07 op $from =~ s/ +<.*>//;
54 38232a0a 2023-05-07 op
55 38232a0a 2023-05-07 op # leave open for the body
56 38232a0a 2023-05-07 op print $sqlite "\"$mid\",\"$from\",\"$date\",\"$subj\",\"";
57 38232a0a 2023-05-07 op
58 38232a0a 2023-05-07 op while (<$fh>) {
59 38232a0a 2023-05-07 op s/"/""/g;
60 38232a0a 2023-05-07 op print $sqlite $_;
61 38232a0a 2023-05-07 op }
62 38232a0a 2023-05-07 op say $sqlite '"';
63 38232a0a 2023-05-07 op
64 38232a0a 2023-05-07 op close $fh;
65 38232a0a 2023-05-07 op }
66 38232a0a 2023-05-07 op
67 38232a0a 2023-05-07 op close $sqlite;
68 38232a0a 2023-05-07 op die "sqlite3 exited with $?\n" unless $? == 0;