5 use I18N::Langinfo qw'langinfo CODESET';
 
   8 unless ($FEXLIB = $ENV{FEXLIB}) {
 
  10     $FEXLIB = $ENV{FEXHOME}.'/lib';
 
  11   } elsif (-f '/usr/share/fex/lib/fex.ph') {
 
  12     $FEXLIB = '/usr/share/fex/lib';
 
  14     $FEXLIB = dirname(dirname(abs_path($0))).'/lib';
 
  16   $ENV{FEXLIB} = $FEXLIB;
 
  18 die "$0: no $FEXLIB\n" unless -d $FEXLIB;
 
  21 our (@logdir,$spooldir,$debug);
 
  23 # load common code, local config : $HOME/lib/fex.ph
 
  24 require "$FEXLIB/fex.pp" or die "$0: cannot load $FEXLIB/fex.pp - $!\n";
 
  26 $CTYPE = langinfo(CODESET());
 
  27 binmode(STDOUT,":encoding($CTYPE)");
 
  29 $log = shift || $logdir[0].'/fexsrv.log';
 
  31 $ignore = join('|',qw(
 
  32   (CONNECT|CONTINUE).*(crawl|msnbot|obertux)
 
  33   DISCONNECT:.no.HTTP.request
 
  34   GET.*(favicon|robots\.txt)
 
  35   GET./organization\.gif
 
  38   GET./action-fex-camel\.gif
 
  44   GET./browserconfig\.xml
 
  45   User-Agent:.*(Webnote|FeedFetcher|\w+bot|bot/|Website.Watcher|crawler|spider|searchme|Yandex|Slurp|ScoutJet|findlinks|urlmon|nagios)
 
  47   From:.*(msnbot|yandex|googlebot|webcrawler)
 
  96 if (-t STDIN or $ENV{GATEWAY_INTERFACE}) {
 
  97   open L,$log or die "$0: $log - $!\n";
 
 102 # binmode(L,":encoding(UTF-8)");
 
 106     next if /(^|\n)($ignore)/i;
 
 107     s/[\x00-\x08\x0B-\x1F\x1F\x80-\x9F]/_/g;
 
 109     foreach $weed (@weed) {
 
 110       while (s/\n$weed.*\n/\n/i) {}
 
 112     if (/^\n*(CONNECT|CONTINUE).*\s\[([\d_]+)\]/i) { $pid = $2 }
 
 113     if (/\n(POST|GET)\s+\/(\w+)/i)                 { $cgi = $2 }
 
 114     if (/Content-Length: (\d+)/i) {
 
 116       while ($d =~ s/(\d)(\d\d\d\b)/$1,$2/) {};
 
 117       s/Content-Length: \d+/Content-Length: $d/i;
 
 122     if (m:\nGET /fup/(\w{40,}):) {
 
 124       printf "  FROM=\"%s\"\n\n",$1 if /from=([\w\@.-]+)/;
 
 125     } elsif (m:\nGET /fop/(\w+)/:) {
 
 127       my $ddir = "$spooldir/.dkeys/$dkey";
 
 128       $_ = readlink $ddir or next;
 
 129       (undef,$to,$from) = split('/');
 
 130       printf "  FROM=\"%s\"\n",$from;
 
 131       printf "  TO=\"%s\"\n",$to;
 
 133       if ($comment = slurp("$ddir/comment")) {
 
 134         printf "  COMMENT=\"%s\"\n",utf8decode($comment)||'';
 
 136       if (not -f "$ddir/data" and $_ = slurp("$ddir/error")) {
 
 138         print "  ERROR=\"$_\"\n";
 
 140       elsif ($size = -s "$ddir/data") {
 
 141         printf "  SIZE=%s MB\n",int($size/1024/1024);
 
 144     } elsif (m:\nGET /fup.*skey=(\w+):) {
 
 148     if ($debug and $pid and $cgi) {
 
 166     @log = `ls -rt $logdir[0]/.debug/*_${pid}.$cgi 2>/dev/null`;
 
 167     if ($log = $log[-1] and open $log,$log) {
 
 168       # binmode($log,":encoding(UTF-8)");
 
 171         if (/^Content-Disposition:.*name="FILE".*filename="(.+)"/i) {
 
 172           print "  FILE=\"$1\"\n";
 
 173         } elsif (/^Content-Disposition:.*name="(\w+)"/i) {
 
 178           printf "  %s=\"%s\"\n",$p,utf8decode($v)||$v if $v;
 
 179           read_akey($v) if $p eq 'AKEY';
 
 180           read_skey($v) if $p eq 'SKEY';
 
 181         } elsif (/^(Param|Exp): (\w+=".+")/) {
 
 193   my $akey = "$spooldir/.akeys/" . shift;
 
 194   if (my $user = readlink($akey)) {
 
 196     printf "  USER=\"%s\"\n",$user;
 
 202   my $skey = "$spooldir/.skeys/" . shift;
 
 203   if (open $skey,$skey) {
 
 205       printf "  FROM=\"%s\"\n",$1 if /from=(.+)/;
 
 206       printf "  TO=\"%s\"\n",$1   if /to=(.+)/;
 
 215   s/([\xC0-\xDF])([\x80-\xBF])/chr(ord($1)<<6&0xC0|ord($2)&0x3F)/eg;