version 1.18, 2005/09/20 16:50:40
|
version 1.25, 2014/11/24 02:36:34
|
Line 48
|
Line 48
|
# parameter is not set $logthis is set to ¬hing, which does what you |
# parameter is not set $logthis is set to ¬hing, which does what you |
# would expect. |
# would expect. |
# |
# |
|
|
use strict; |
use strict; |
use DBI; |
use DBI; |
use lib '/home/httpd/lib/perl/Apache'; |
|
use lib '/home/httpd/lib/perl/'; |
use lib '/home/httpd/lib/perl/'; |
use LONCAPA::Configuration(); |
use LONCAPA::Configuration(); |
use Apache::lonmysql(); |
use Apache::lonmysql(); |
use lonmysql(); |
|
use Time::HiRes(); |
use Time::HiRes(); |
use Getopt::Long(); |
use Getopt::Long(); |
use IO::File; |
use IO::File; |
Line 144 if ($log) {
|
Line 141 if ($log) {
|
my $sourcefilename; # activity log data |
my $sourcefilename; # activity log data |
my $newfilename; # $sourcefilename will be renamed to this |
my $newfilename; # $sourcefilename will be renamed to this |
my $error_filename; # Errors in parsing the activity log will be written here |
my $error_filename; # Errors in parsing the activity log will be written here |
|
my $chunk_filename; # where we save data we are not going to write to db |
if ($srcfile) { |
if ($srcfile) { |
$sourcefilename = $srcfile; |
$sourcefilename = $srcfile; |
} else { |
} else { |
Line 153 my $sql_filename = $sourcefilename;
|
Line 151 my $sql_filename = $sourcefilename;
|
$sql_filename =~ s|[^/]*$|activity.log.sql|; |
$sql_filename =~ s|[^/]*$|activity.log.sql|; |
my $gz_sql_filename = $sql_filename.'.gz'; |
my $gz_sql_filename = $sql_filename.'.gz'; |
# |
# |
|
$chunk_filename = $sourcefilename.".unprocessed_chunks"; |
|
# |
my $xml_filename = $sourcefilename; |
my $xml_filename = $sourcefilename; |
my $gz_xml_filename = $xml_filename.'.gz'; |
my $gz_xml_filename = $xml_filename.'.gz'; |
if (defined($xmlfile)) { |
if (defined($xmlfile)) { |
Line 181 if (! defined($xmlfile)) {
|
Line 181 if (! defined($xmlfile)) {
|
if (!flock(LOCKFILE,LOCK_EX|LOCK_NB)) { |
if (!flock(LOCKFILE,LOCK_EX|LOCK_NB)) { |
warn("Unable to lock $lockfilename. Aborting".$/); |
warn("Unable to lock $lockfilename. Aborting".$/); |
# don't call clean_up_and_exit another instance is running and |
# don't call clean_up_and_exit another instance is running and |
# we don't want to 'cleanup' there files |
# we don't want to 'cleanup' their files |
exit 6; |
exit 6; |
} |
} |
|
|
Line 305 if (!&Apache::lonmysql::verify_sql_conne
|
Line 305 if (!&Apache::lonmysql::verify_sql_conne
|
} |
} |
$logthis->('SQL connection is up'); |
$logthis->('SQL connection is up'); |
|
|
|
&update_process_name($course.'@'.$domain." loading existing data"); |
my $missing_table = &check_for_missing_tables(values(%tables)); |
my $missing_table = &check_for_missing_tables(values(%tables)); |
if (-s $gz_sql_filename && ! -s $gz_xml_filename) { |
if (-s $gz_sql_filename && ! -s $gz_xml_filename) { |
my $backup_modification_time = (stat($gz_sql_filename))[9]; |
my $backup_modification_time = (stat($gz_sql_filename))[9]; |
Line 374 my $error_fh = IO::File->new(">>$error_f
|
Line 375 my $error_fh = IO::File->new(">>$error_f
|
## |
## |
## Parse the course log |
## Parse the course log |
$logthis->('processing course log'); |
$logthis->('processing course log'); |
|
&update_process_name($course.'@'.$domain." processing new data"); |
if (-s $newfilename) { |
if (-s $newfilename) { |
my $result = &process_courselog($newfilename,$error_fh,\%tables); |
my $result = &process_courselog($newfilename,$error_fh,\%tables); |
|
&update_process_name($course.'@'.$domain." backing up new data"); |
if (! defined($result)) { |
if (! defined($result)) { |
# Something went wrong along the way... |
# Something went wrong along the way... |
$logthis->('process_courselog returned undef'); |
$logthis->('process_courselog returned undef'); |
Line 478 sub process_courselog {
|
Line 481 sub process_courselog {
|
# %3aPOST%3a(name)%3d(value)%3a(name)%3d(value) |
# %3aPOST%3a(name)%3d(value)%3a(name)%3d(value) |
# or |
# or |
# %3aCSTORE%3a(name)%3d(value)%26(name)%3d(value) |
# %3aCSTORE%3a(name)%3d(value)%26(name)%3d(value) |
|
# or |
|
# %3aPUTSTORE%3a(name)%3d(value)%26(name)%3d(value) |
# |
# |
# get delimiter between timestamped entries to be &&& |
# get delimiter between timestamped entries to be &&& |
$log=~s/\%26(\d{9,10})\%3a/\&\&\&$1\%3a/g; |
$log=~s/\%26(\d{9,10})\%3a/\&\&\&$1\%3a/g; |
Line 486 sub process_courselog {
|
Line 491 sub process_courselog {
|
if (! defined($host)) { $host = 'unknown'; } |
if (! defined($host)) { $host = 'unknown'; } |
my $prevchunk = 'none'; |
my $prevchunk = 'none'; |
foreach my $chunk (split(/\&\&\&/,$log)) { |
foreach my $chunk (split(/\&\&\&/,$log)) { |
my $warningflag = ''; |
if (length($chunk) > 20000) { |
my ($time,$res,$uname,$udom,$action,@values)= split(/:/,$chunk); |
# avoid putting too much data into the database |
# |
# (usually an uploaded file or something similar) |
# Sometimes we get a file pasted into the activity.log from |
if (! &savechunk(\$chunk,$timestamp,$host)) { |
# an upload form. Here we try to detect it and avoid inserting |
close(IN); |
# it into the database to avoid the quiet death of the database |
return undef; |
# connection |
|
my $i; |
|
for ($i=0;$i<$#values;$i++) { |
|
if ($values[$i] =~ /^HWVAL/) { |
|
$#values = $i; |
|
last; |
|
} |
} |
|
next; |
} |
} |
|
my $warningflag = ''; |
|
my ($time,$res,$uname,$udom,$action,@values)= split(/:/,$chunk); |
# |
# |
if (! defined($res) || $res =~ /^\s*$/) { |
if (! defined($res) || $res =~ /^\s*$/) { |
$res = '/adm/roles'; |
$res = '/adm/roles'; |
Line 511 sub process_courselog {
|
Line 513 sub process_courselog {
|
if (! defined($action) || $action eq '') { |
if (! defined($action) || $action eq '') { |
$action = 'VIEW'; |
$action = 'VIEW'; |
} |
} |
if ($action !~ /^(LOGIN|VIEW|POST|CSTORE|STORE)$/) { |
if ($action !~ /^(LOGIN|VIEW|POST|CSTORE|STORE|PUTSTORE)$/) { |
$warningflag .= 'action'; |
$warningflag .= 'action'; |
print $error_fh 'full log entry:'.$log.$/; |
print $error_fh 'full log entry:'.$log.$/; |
print $error_fh 'error on chunk:'.$chunk.$/; |
print $error_fh 'error on chunk (saving)'.$/; |
$logthis->('(action) Unable to parse '.$/.$chunk.$/. |
if (! &savechunk(\$chunk,$timestamp,$host)) { |
|
close(IN); |
|
return undef; |
|
} |
|
$logthis->('(action) Unable to parse chunk'.$/. |
'got '. |
'got '. |
'time = '.$time.$/. |
'time = '.$time.$/. |
'res = '.$res.$/. |
'res = '.$res.$/. |
Line 552 sub process_courselog {
|
Line 558 sub process_courselog {
|
} |
} |
close IN; |
close IN; |
return $linecount; |
return $linecount; |
|
## |
|
## |
|
sub savechunk { |
|
my ($chunkref,$timestamp,$host) = @_; |
|
my $chunk = &escape(${$chunkref}); |
|
if (! open(CHUNKFILE,">>$chunk_filename") || |
|
! print CHUNKFILE $timestamp.':'.$host.':'.$chunk.$/) { |
|
# abort |
|
close(CHUNKFILE); |
|
return 0; |
|
} |
|
close(CHUNKFILE); |
|
return 1; |
|
} |
} |
} |
|
|
|
|
Line 925 sub xml_store_id_table {
|
Line 945 sub xml_store_id_table {
|
####################################################################### |
####################################################################### |
{ |
{ |
my @rows; |
my @rows; |
my $max_row_count = 100; |
|
|
|
sub store_entry { |
sub store_entry { |
|
my $max_row_count = 100; |
if (! @_) { |
if (! @_) { |
undef(@rows); |
undef(@rows); |
return ''; |
return ''; |