view mcabber/contrib/cicq2mcabber.pl @ 2135:361603828d9e

Set the trace log file permissions again when we write to it If the log file is recreated (e.g. log rotation) the new file will have correct permissions.
author Mikael Berthe <mikael@lilotux.net>
date Sun, 06 Jul 2014 10:20:30 +0200
parents cb2f18e20e6a
children
line wrap: on
line source

#!/usr/bin/perl -w
#
# usage: cicq2mcabber.pl cicqhistoryfile > mcabberhistoryfile
# Convert a centericq history file to mcabber format
#
# See histolog.c for the mcabber format.
#
# MiKael, 2005/05/05

use strict;

my $line;
my $inblock = 0;

my %bdata = ();

sub print_entry()
{
  my ($type, $info, $date, $len, $data);

  return  unless(defined $bdata{"msg"});

  if ($bdata{"type"} eq "MSG") {
    $type = "M";
    if ($bdata{"inout"} eq "OUT") {
      $info = "S";
    } elsif ($bdata{"inout"} eq "IN") {
      $info = "R";
    } else {
      print STDERR "Neither IN nor OUT!?\n";
      return;
    }
  } else {
    print STDERR "Data type not handled.\n";
    return;
  }
  $date = $bdata{"timestamp"};
  $len  = $bdata{"nb"};
  $data = $bdata{"msg"};

  # Date conversion to iso8601
  my ($ss,$mm,$hh,$DD,$MM,$YYYY) = gmtime($date);
  $date = sprintf "%04d%02d%02dT%02d:%02d:%02dZ",
                  $YYYY+1900, $MM+1,$DD,$hh,$mm,$ss;

  printf("%s%s %18.18s %03d %s", $type, $info, $date, $len, $data);
}

while ($line = <>) {
  chomp $line;
  # The separator is ^L ; I use substr to exclude the EOL
  if ($line eq "") {
    print_entry() if ($inblock);
    # reset data for new block
    %bdata = ();
    $inblock = 1;
    next;
  }
  # Skip garbage or unrecognized stuff...
  if (!$inblock) {
    print STDERR "Skipping line\n";
    next;
  }

  # 1 IN/OUT line
  unless (exists $bdata{"inout"}) {
    if (($line eq "IN") || ($line eq "OUT")) {
      $bdata{"inout"} = $line;
    } else {
      print STDERR "No IN/OUT information ($line)!\n";
      $inblock = 0;
    }
    next;
  }
  # 1 type line (MSG...)
  unless (exists $bdata{"type"}) {
    # We don't handle NOTE and AUTH yet.
    if ($line eq "MSG") {
      $bdata{"type"} = $line;
    } else {
      print STDERR "Not a MSG type ($line)\n";
      $inblock = 0;
    }
    next;
  }
  # 2 date lines
  unless (exists $bdata{"timestamp"}) {
    $bdata{"timestamp"} = $line;
    last unless defined ($line = <>);
    chomp $line;
    $bdata{"timestamp2"} = $line;
    if (! $bdata{"timestamp2"} eq $bdata{"timestamp2"}) {
      print STDERR "Timestamps differ...\n";
    }
    next;
  }
  # ... The message itself
  $line =~ s/
$//;
  if (exists $bdata{"msg"}) {
    $bdata{"msg"} .= $line."\n";
    $bdata{"nb"}++;
  } else {
    $bdata{"msg"} = $line."\n";
    $bdata{"nb"} = 0;
  }
}
print_entry() if ($inblock);

# vim:set sw=2 sts=2 et si cinoptions="":