File: logrewrap.pl

package info (click to toggle)
putty 0.83-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 13,216 kB
  • sloc: ansic: 148,476; python: 8,466; perl: 1,830; makefile: 128; sh: 117
file content (44 lines) | stat: -rwxr-xr-x 1,625 bytes parent folder | download | duplicates (3)
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
#!/usr/bin/perl

# Process a PuTTY SSH packet log that has gone through inappropriate
# line wrapping, and try to make it legible again.
#
# Motivation: people often include PuTTY packet logs in email
# messages, and if they're not careful, the sending MUA 'helpfully'
# wraps the lines at 72 characters, corrupting all the hex dumps into
# total unreadability.
#
# But as long as it's only the ASCII part of the dump at the end of
# the line that gets wrapped, and the hex part is untouched, this is a
# mechanically recoverable kind of corruption, because the ASCII is
# redundant and can be reconstructed from the hex. Better still, you
# can spot lines in which this has happened (because the ASCII at the
# end of the line is a truncated version of what we think it should
# say), and use that as a cue to remove the following line.

use strict;
use warnings;

while (<<>>) {
    if (/^  ([0-9a-f]{8})  ((?:[0-9a-f]{2} ){0,15}(?:[0-9a-f]{2}))/) {
        my $addr = $1;
        my $hex = $2;
        my $ascii = "";
        for (my $i = 0; $i < length($2); $i += 3) {
            my $byte = hex(substr($hex, $i, 2));
            my $char = ($byte >= 32 && $byte < 127 ? chr($byte) : ".");
            $ascii .= $char;
        }
        $hex = substr($hex . (" " x 48), 0, 47);
        my $old_line = $_;
        chomp($old_line);
        my $new_line = "  $addr  $hex  $ascii";
        if ($old_line ne $new_line and
            $old_line eq substr($new_line, 0, length($old_line))) {
            print "$new_line\n";
            <<>>; # eat the subsequent wrapped line
            next;
        }
    }
    print $_;
}