#!/usr/bin/perl use DBI; sub decode { my $a = $_[0]; $a =~ s/\+/ /g; $a =~ s/\|/-/g; $a =~ s/\%([0-9A-Fa-f][0-9A-Fa-f])/chr(hex($1))/eg; return $a; } sub fl { my $a = $_[0]; $a =~ s/\\//g; $a =~ s/'/\\'/g; $a =~ s/"/\\"/g; $a =~ s/\x0d//g; $a =~ s/\x0a//g; $a =~ s/\x00//g; $a =~ s/\x1a//g; return $a; } sub insert { my $a = $_[0]; my $b = ''; my $c = ''; my $d = ''; ($b,$c,$d) = ($a =~ /(.*){{(.*)}}(.*)/); my $e = $b.$$c.$d; if ($e) { return $e; } else { return $a; } } sub log_read { my @row = (); my $a = ''; my $i = 0; my $statement = 'SELECT iSeq,iTime,cTitle,cArtist,iLength,cAlbum,'. 'cLabel FROM log ORDER BY iSeq DESC LIMIT 5'; my $sth = $dbh->prepare($statement) or die "$statement\n"; $sth->execute() or die "$statement\n"; for ($i = 5; $i > 0; $i--) { if (@row = $sth->fetchrow_array) { ${"tim$i"} = &time($row[1]); ${"titl$i"} = $row[2]; ${"artis$i"} = $row[3]; ${"lengt$i"} = &time_convert_back($row[4]); ${"albu$i"} = $row[5]; ${"labe$i"} = $row[6]; } } $sth->finish; } sub namescan { my $n = $_[0]; my @n = @name; my $a = ''; while ($a = shift @n) { if ($a eq $n) { return 1; } } return 0; } sub rcv { # ==> GET INPUT RECORD $i = 0; my $form = $_[0]; my $n = ''; my $na = ''; my $nn = ''; my $val = ''; @name = (); my @val = (); if (! $form){$form = <>} # ==> PREPARE FORM chomp $form; my @form = split(/&/,$form); for ($i = 0; $i <= $#form; $i++) { # ==> EXTRACT INFORMATION ($n,$val) = ($form[$i] =~ /(.*)=(.*)/); $val = &decode($val); $$n = $val; if ($n ne 'session') { if (! &namescan($n)) { @name = (@name,$n); } } } } sub scroll { my $i = $_[0]; my $j = 0; my $k = 0; if ($i > 0) { $title = ${"title$i"}; $artist = ${"artist$i"}; $length = ${"length$i"}; $album = ${"album$i"}; $label = ${"label$i"}; $starttime = &time(time); for ($j = $i; $j < 67; $j++) { $k = $j + 1; ${"title$j"} = ${"title$k"}; ${"artist$j"} = ${"artist$k"}; ${"album$j"} = ${"album$k"}; ${"length$j"} = ${"length$k"}; ${"label$j"} = ${"label$k"}; } &write($title,$artist,$length,$album,$label); $title66 = ''; $artist66 = ''; $album66 = ''; $length66 = '0'; $label66 = ''; # } else { # &update(); } } sub time { my $t = $_[0]; my @t = localtime($t); return sprintf("%02u",$t[2]).sprintf("%02u",$t[1]); } sub time_convert { my $time = $_[0]; my $secs = 0; my $mult = 1; my @a = split(':',$time); my $b = ''; while (scalar(@a) > 0) { $b = pop @a; $secs += $mult * $b; $mult *= 60; } return $secs; } sub time_convert_back { use integer; my $s = $_[0]; my $h = $s / 3600; $s = $s - (3600 * $h); my $m = $s / 60; $s = $s - (60 * $m); if ($h) { $h = "$h:"; } else { $h = ''; } if (($m) || ($h)) { if ($h) { $m = sprintf("%02u",$m); } $m = "$m:"; $s = sprintf("%02u",$s); } else { $m = ''; } return "$h$m$s"; } sub update { my $dev = 0; my $ino = 0; my $mode = 0; my $nlink = 0; my $uid = 0; my $gid = 0; my $rdev = 0; my $size = 0; my $atime = 0; my $mtime = 0; my $ctime = 0; my $blksize = 0; my $blocks = 0; my $time = time; my $artist = ''; my $title = ''; my $tts = ''; my $a = ''; ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks) = stat($NOW1); if ($WAIT > $time - $mtime) { if (open(NOW,"<$NOW1")) { $a = ; close NOW; ($title,$artist,$tts) = ($a =~ /.{11}(.{28})(.{28}).{6}(.{5})/); if ($title) { &write($title,$artist,$tts); } } } } sub write { my $title = $_[0]; my $artist = $_[1]; my $tts = $_[2]; my $album = $_[3]; my $label = $_[4]; my $statement = ''; my $sth = 0; my $time = time; if (($title) || ($artist) || ($album) || ($label)) { open (LOG,">>$LOG"); $t = localtime($time); print (LOG "$t\n"); $tts = &time_convert($tts); &write_rbds($title,$artist,$tts,$album); close LOG; $title = &fl($title); $artist = &fl($artist); $album = &fl($album); $label = &fl($label); $statement = 'INSERT INTO log (iTime,cTitle,cArtist,iLength,cAlbum,'. "cLabel) VALUES ($time,'$title','$artist',$tts,'$album','$label') "; $sth = $dbh->do($statement) or die "$statement\n"; } } sub write_rbds { my $title = $_[0]; my $artist = $_[1]; my $ttl = $_[2]; my $album = $_[3]; if (open (FILE,">$FILE")) { print (FILE "$title\|$artist\|$ttl\|$album\n"); close FILE; if (system($SCP)) { print (LOG "Failed: $SCP"); } else { print (LOG "RBDS: $title\|$artist\n"); } } } # ==> MAIN PROGRAM $SCRIPT = '/cgi-bin/rbds/rbds.pl'; $RBDS_HEAD = '/usr/lib/cgi-bin/rbds/head.html'; $RBDS_FOOT = '/usr/lib/cgi-bin/rbds/foot.html'; $FILE = '/var/www/rbds/rbds.txt'; $HTML = '/usr/lib/cgi-bin/rbds/rbds.html'; $LOG = '/var/www/rbds/rbds.log'; $SCP = 'scp /var/www/rbds/rbds.txt xmtr:rbds'; $WAIT = 60; $DATABASE = 'rbds'; $HOSTNAME = ''; $USERID = 'rbds'; $PASSWORD = ''; $INFO = "dbi:mysql:$DATABASE:$HOST"; $dbh = DBI->connect($INFO,$USERID,$PASSWORD) or die "Can\'t connect to database\n"; print "Content-type: text/html\r\n\r\n"; if (open (RBDS_HEAD,"<$RBDS_HEAD")) { while ($a = ) { print $a; } close RBDS_HEAD; } &rcv($ENV{QUERY_STRING}); for ($i = 1; $i < 67; $i++) { ${"length$i"} = &time_convert(${"length$i"}); ${"length$i"} = &time_convert_back(${"length$i"}); } &scroll($submit); &log_read; if (open (HTML,"<$HTML")) { while ($a = ) { print &insert($a); } close HTML; } if (open (RBDS_FOOT,"<$RBDS_FOOT")) { while ($a = ) { print $a; } close RBDS_FOOT; } $dbh->disconnect;