From: Tom Hughes Date: Mon, 23 Nov 2015 09:23:02 +0000 (+0000) Subject: Add a script to cleanup old rails assets X-Git-Url: https://git.openstreetmap.org/chef.git/commitdiff_plain/8323b6a7e371e288c06626e5e7bf80e440fe9d19 Add a script to cleanup old rails assets --- diff --git a/cookbooks/web/recipes/rails.rb b/cookbooks/web/recipes/rails.rb index 9fab99c30..632a627cc 100644 --- a/cookbooks/web/recipes/rails.rb +++ b/cookbooks/web/recipes/rails.rb @@ -79,6 +79,15 @@ rails_port "www.openstreetmap.org" do mapzen_valhalla_key web_passwords["mapzen_valhalla_key"] end +package "libjson-xs-perl" + +template "/usr/local/bin/cleanup-rails-assets" do + source "cleanup-assets.erb" + owner "root" + group "root" + mode 0755 +end + gem_package "apachelogregex" gem_package "file-tail" diff --git a/cookbooks/web/templates/default/cleanup-assets.erb b/cookbooks/web/templates/default/cleanup-assets.erb new file mode 100644 index 000000000..132c8260a --- /dev/null +++ b/cookbooks/web/templates/default/cleanup-assets.erb @@ -0,0 +1,73 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +use IO::Dir; +use IO::File; +use JSON::XS; + +my $root = shift @ARGV; + +my $manifest; + +if (my $file = IO::File->new("${root}/tmp/manifest.json", "r")) +{ + $manifest = decode_json(join("\n", $file->getlines)); + + $file->close; +} +else +{ + die "Can't open ${root}/tmp/manifest.json: $!"; +} + +expire_assets($manifest, "${root}/public/assets", ""); + +exit 0; + +sub expire_assets +{ + my $manifest = shift; + my $assetroot = shift; + my $prefix = shift; + + if (my $dir = IO::Dir->new("${assetroot}/${prefix}")) + { + $prefix = "${prefix}/" unless $prefix eq ""; + + while (my $name = $dir->read) + { + next if $name eq "." || $name eq ".."; + + my $path = $name = "${prefix}${name}"; + + $name =~ s/\.gz$//; + + if (-d "${assetroot}/${path}") + { + expire_assets($manifest, $assetroot, $path); + } + elsif (exists($manifest->{files}->{$name})) + { + # Still a live asset (with checksum) + } + elsif (exists($manifest->{assets}->{$name})) + { + # Still a live asset (without checksum) + } + elsif (-A "${assetroot}/${path}" > 28) + { + unlink("${assetroot}/${path}") || die "Can't remove ${assetroot}/${path}: $!"; + } + } + + $dir->close; + } + else + { + die "Can't read ${assetroot}/${prefix}: $!"; + } + + return; +} diff --git a/cookbooks/web/templates/default/rails.cron.erb b/cookbooks/web/templates/default/rails.cron.erb index 35256a2ce..e34880f36 100644 --- a/cookbooks/web/templates/default/rails.cron.erb +++ b/cookbooks/web/templates/default/rails.cron.erb @@ -2,3 +2,6 @@ # Cleanup temporary directory find <%= @directory %>/tmp \( \( -type f -mtime +28 \) -o \( -type d -empty \) \) -delete + +# Cleanup assets +/usr/local/bin/cleanup-rails-assets <%= @directory %>