App-Followme
view release on metacpan or search on metacpan
lib/App/Followme/UploadSite.pm view on Meta::CPAN
my $base_parser = sub {
my ($metadata, @tokens) = @_;
return "<base href=\"$self->{remote_url}\">";
};
my $global = 0;
my $metadata = [];
my $new_page = web_substitute_tags('<base href="*">',
$page,
$base_parser,
$metadata,
$global
);
return $new_page;
}
#----------------------------------------------------------------------
# Initialize the configuration parameters
sub setup {
my ($self) = @_;
# Turn off messages when in quick mode
$self->{verbose} = 0 if $self->{quick_mode};
# The target date is the date of the hash file, used in quick mode
# to select which files to test
$self->{target_date} = 0;
# Remove any trailing slash from url
if ($self->{remote_url}) {
$self->{remote_url} =~ s/\/$//;
}
return;
}
#----------------------------------------------------------------------
# Remove obfuscation from string
sub unobfuscate {
my ($self, $obstr) = @_;
my $str = '';
my $seed = SEED;
for (my $i = 0; $i < length($obstr); $i += 2) {
my $val = hex(substr($obstr, $i, 2));
$str .= chr($val ^ $seed);
$seed = $val;
}
return split(/:/, $str, 2);
}
#----------------------------------------------------------------------
# Update an individual file
sub update_file {
my ($self, $file, $hash) = @_;
my $local_file = $file;
# If there is a remote url, rewrite it into a new file
if ($self->{remote_url}) {
# Check extension, skip if not a web file
my ($dir, $basename) = fio_split_filename($file);
my ($ext) = $basename =~ /\.([^\.]*)$/;
if ($ext eq $self->{web_extension}) {
my $page = fio_read_page($file);
if ($page) {
$page = $self->rewrite_base_tag($page);
$local_file = rel2abs(catfile($self->{state_directory}, $basename));
fio_write_page($local_file, $page);
}
}
}
# Upload the file and return the status of the upload
my $status = 0;
my $remote_file = abs2rel($file, $self->{top_directory});
if ($self->{upload}->add_file($local_file, $remote_file)) {
$status = 1;
} else {
die "Too many upload errors\n" if $self->{max_errors} == 0;
$self->{max_errors} --;
}
# Remove any temporary file
unlink($local_file) if $file ne $local_file;
return $status;
}
#----------------------------------------------------------------------
# Update files in one folder
sub update_folder {
my ($self, $folder, $hash, $local) = @_;
my $index_file = $self->to_file($folder);
# Check if folder is new
if ($folder ne $self->{top_directory}) {
$folder = abs2rel($folder, $self->{top_directory});
delete $local->{$folder} if exists $local->{$folder};
if (! exists $hash->{$folder} ||
$hash->{$folder} ne 'dir') {
if ($self->{upload}->add_directory($folder)) {
$hash->{$folder} = 'dir';
print "add $folder\n" if $self->{verbose};
} else {
die "Too many upload errors\n" if $self->{max_errors} == 0;
$self->{max_errors} --;
}
}
}
# Check each of the files in the directory
my $files = $self->{data}->build('files', $index_file);
foreach my $filename (@$files) {
# Skip check if in quick mode and modification date is old
if ($self->{quick_update}) {
next if $self->{target_date} > fio_get_date($filename);
}
my $file = abs2rel($filename, $self->{top_directory});
delete $local->{$file} if exists $local->{$file};
my $value = ${$self->{data}->build('checksum', $filename)};
# Add file if new or changed
if (! exists $hash->{$file} || $hash->{$file} ne $value) {
if ($self->update_file($filename)) {
$hash->{$file} = $value;
print "add $file\n" if $self->{verbose};
}
}
}
# Recursively check each of the subdirectories
my $folders = $self->{data}->build('folders', $folder);
foreach my $subfolder (@$folders) {
$self->update_folder($subfolder, $hash, $local);
}
return;
}
( run in 0.679 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )