/[secure-testing]/bin/compare-testing-status
ViewVC logotype

Contents of /bin/compare-testing-status

Parent Directory Parent Directory | Revision Log Revision Log


Revision 11215 - (show annotations) (download)
Sat Feb 14 16:57:17 2009 UTC (4 years, 3 months ago) by thijs
File size: 6326 byte(s)
oldstable is now etch, stable is now lenny, testing is now squeeze
1 #!/usr/bin/perl -w
2
3 # Compares the testing_status tables from two versions of security.db.
4 # To be accurate, both versions must have been created with the same svn
5 # revision of the tracker data files (but with different package files).
6
7 use strict;
8 use DBI;
9
10 my $TESTING="squeeze";
11 my $MAILTO='secure-testing-team@lists.alioth.debian.org';
12 my $MAILFROM='sf@sfritsch.de';
13
14 my @d = localtime(time);
15 my $MAILDATE = sprintf("%4d-%02d-%02d", $d[5] + 1900, $d[4] + 1, $d[3]);
16
17 if (@ARGV != 2) {
18 die "usage:\nlist-updates old.db new.deb\n";
19 }
20
21 my $migrated = {};
22 my $dtsa = {};
23 my $removed = {};
24 my $versions = {};
25
26 my $mail_text = "";
27
28 my $old_dbh = DBI->connect("dbi:SQLite:dbname=$ARGV[0]","","", { RaiseError => 1 });
29 my $new_dbh = DBI->connect("dbi:SQLite:dbname=$ARGV[1]","","", { RaiseError => 1 });
30
31 my $sth_version = $new_dbh->prepare("SELECT version, archive FROM source_packages WHERE name = ? AND release = '$TESTING' AND subrelease = ? ");
32 my $sth_desc = $new_dbh->prepare("SELECT description FROM bugs WHERE name = ?");
33 my $sth_debbug = $new_dbh->prepare("SELECT d.bug FROM package_notes p JOIN debian_bugs d ON d.note = p.id WHERE bug_name = ? AND package = ? AND release = ''");
34
35 my $old_issues = get_issues($old_dbh);
36 my $new_issues = get_issues($new_dbh);
37
38 foreach my $package ( sort keys %{$old_issues} ) {
39 $versions->{$package} = package_version($package); # undef if package does not exist in $new_dbh
40
41 foreach my $issue ( sort keys %{$old_issues->{$package}} ) {
42 my $old = $old_issues->{$package}->{$issue};
43 my $new = $new_issues->{$package}->{$issue};
44
45 if ( $new ) {
46 if ( $old->{testing_security_fixed} == 0
47 and $new->{testing_security_fixed} == 1 )
48 {
49 push @{$dtsa->{$package}}, $issue;
50 $versions->{$package} = package_version($package, "security");
51 }
52
53 }
54 else {
55 if ( ! defined $versions->{$package} ) {
56 push @{$removed->{$package}}, $issue;
57 }
58 elsif ( $old->{testing_security_fixed} != 1 ) {
59 push @{$migrated->{$package}}, $issue;
60 }
61 }
62 }
63 }
64
65 print_hash($dtsa, "DTSA", <<"EOF");
66 The following issues have been fixed by uploads to testing-security:
67
68 EOF
69
70 print_hash($migrated, "Migrated from unstable");
71
72 print_hash($removed, "Removed from testing", <<"EOF");
73 The following issues have been "fixed" by removing the (source) packages from
74 testing. This probably means that you have to manually uninstall the
75 corresponding binary packages to fix the issues.
76 It can also mean that the packages have been replaced, or that they have been
77 temporarily removed by the release team to make transitions from unstable
78 easier.
79
80 EOF
81
82
83
84 if ($mail_text) {
85 send_mail();
86 print "mail sent.\n";
87 }
88 else {
89 print "nothing fixed, no mail sent.\n";
90 }
91
92 # workaround DBD::Sqlite bug
93 undef $sth_version;
94 undef $sth_desc;
95 undef $sth_debbug;
96
97 ########### end MAIN #############
98
99 sub print_mail {
100 $mail_text .= join('', @_);
101 }
102
103 sub print_both {
104 print_mail(@_);
105 print @_;
106 }
107
108 sub print_hash {
109 my $hash = shift;
110 my $name = shift;
111 my $desc = shift;
112
113 return if ! scalar keys %{$hash};
114
115 print_both("$name:\n");
116 print_both('=' x ( length($name) + 1) , "\n");
117 print_mail("$desc") if $desc;
118
119 foreach my $p (sort keys %{$hash}) {
120 my $version = "";
121 if ( $versions->{$p} ) {
122 $version = " $versions->{$p}";
123 }
124 print_both("$p" . $version . ":\n");
125
126 # sort DTSAs first
127 my @issues = sort grep(/^DTSA/, @{$hash->{$p}});
128 push @issues, sort grep(!/^DTSA/, @{$hash->{$p}});
129 my %seen_dbug;
130 foreach my $i (@issues) {
131 print_both(issue2string($i));
132
133 # print debian bug no more than once per package
134 my @dbugs = issue2debbug($i, $p);
135 foreach my $dbug (@dbugs) {
136 if ( ! $seen_dbug{$dbug} ) {
137 $seen_dbug{$dbug} = 1;
138 print_both(" "x15 . "http://bugs.debian.org/$dbug\n");
139 }
140 }
141 }
142 print_both("\n");
143 }
144
145 }
146
147
148 sub get_issues {
149 my $dbh = shift;
150 return $dbh->selectall_hashref(
151 'SELECT package, bug, unstable_vulnerable, testing_security_fixed FROM testing_status',
152 [ 'package', 'bug' ] );
153 }
154
155 sub package_version {
156 my $package = shift;
157 my $subrelease = shift || "";
158 $sth_version->execute($package, $subrelease);
159 my $result = $sth_version->fetchall_arrayref();
160
161 if (scalar @{$result} > 1) {
162 return "";
163 }
164 if (scalar @{$result} == 0) {
165 return undef;
166 }
167 my $archive = "";
168 if ($result->[0]->[1] ne 'main') {
169 $archive = " ($result->[0]->[1])";
170 }
171 return $result->[0]->[0] . $archive;
172
173 }
174
175 sub issue2string {
176 my $issue = shift;
177 my $url = "";
178 my $desc = "";
179
180 $sth_desc->execute($issue);
181 my $result = $sth_desc->fetchall_arrayref();
182 $desc = $result->[0]->[0];
183
184 if ( $issue =~ /^CVE-\d{4}-\d{4}/ ) {
185 $url = "http://cve.mitre.org/cgi-bin/cvename.cgi?name=" . $issue ;
186 return "$issue: $url\n";
187 }
188 elsif ( $issue =~ /^DTSA-/ ) {
189 return "$issue : $desc\n";
190 }
191 else {
192 return "<no CVE yet> : $desc\n";
193 }
194
195 }
196
197 sub issue2debbug {
198 my ($issue, $package) = @_;
199
200 $sth_debbug->execute($issue, $package);
201 my $rows = $sth_debbug->fetchall_arrayref();
202 my @bugs = map { $_->[0] } @{$rows};
203
204 return @bugs;
205 }
206
207 sub send_mail {
208 open(my $sendmail, "| /usr/sbin/sendmail -bm -ti") or die "could not invoke sendmail\n";
209 print $sendmail <<"EOF";
210 From: $MAILFROM
211 To: $MAILTO
212 Subject: Security update for Debian Testing - $MAILDATE
213
214 This automatic mail gives an overview over security issues that were recently
215 fixed in Debian Testing. The majority of fixed packages migrate to testing
216 from unstable. If this would take too long, fixed packages are uploaded to the
217 testing-security repository instead. It can also happen that vulnerable
218 packages are removed from Debian testing.
219
220 $mail_text
221
222 How to update:
223 --------------
224 Make sure the line
225
226 deb http://security.debian.org $TESTING/updates main contrib non-free
227
228 is present in your /etc/apt/sources.list. Of course, you also need the line
229 pointing to your normal $TESTING mirror. You can use
230
231 aptitude update && aptitude dist-upgrade
232
233 to install the updates.
234
235
236 More information:
237 -----------------
238 More information about which security issues affect Debian can be found in the
239 security tracker:
240
241 http://security-tracker.debian.net/tracker/
242
243 A list of all known unfixed security issues is at
244
245 http://security-tracker.debian.net/tracker/status/release/testing
246
247 EOF
248 #############################
249 close($sendmail);
250 if ($?) {
251 print "Sendmail error\n";
252 }
253 }

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.5