f5f41af2ba34198e7149f6f29fd056deb825a5cc
[coquelicot.git] / tools / migrate_jyraphe.rb
1 #!/usr/bin/env ruby1.8
2 # Coquelicot: "one-click" file sharing with a focus on users' privacy.
3 # Copyright © 2010 potager.org <jardiniers@potager.org>
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License as
7 # published by the Free Software Foundation, either version 3 of the
8 # License, or (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU Affero General Public License for more details.
14 #
15 # You should have received a copy of the GNU Affero General Public License
16 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
18 $:.unshift File.join(File.dirname(__FILE__), '../lib')
19
20 require 'coquelicot'
21
22 module Coquelicot
23   class Options
24     def random_pass_length
25       16
26     end
27   end
28   class << self
29     def options
30       Options.new
31     end
32   end
33 end
34
35 class JyrapheMigrator
36   def initialize(jyraphe_var)
37     @var = jyraphe_var
38     @redirects = {}
39   end
40
41   def process
42     process_links
43     puts "RewriteEngine on"
44     @redirects.each_pair do |jyraphe, coquelicot|
45       puts "RewriteRule ^file-#{jyraphe}$ #{coquelicot} [L,R=301]"
46     end
47   end
48
49   def process_links
50     Dir.glob("#{@var}/links/*").each do |link_path|
51       link_name = File.basename(link_path)
52       one_time_only = link_name.slice(0, 1) == 'O'
53       File.open(link_path) do |link_file|
54         filename = link_file.readline.strip
55         mime_type = link_file.readline.strip
56         length = link_file.readline.strip.to_i
57         next if length > 10 * 1024 * 1024
58         file_key = link_file.readline.strip
59         if file_key.empty? then
60           random_pass = Coquelicot::gen_random_pass
61         end
62         expire_at = link_file.readline.strip.to_i
63         expire_at = [Time.now + Coquelicot.settings.maximum_expire,
64                      expire_at].min if expire_at <= 0
65         begin
66           coquelicot_link = File.open("#{@var}/files/#{filename}") do |src|
67             Coquelicot::depot.add_file(
68               src, file_key || random_pass,
69               { "Expire-at" => expire_at,
70                 "One-time-only" => one_time_only,
71                 "Filename" => filename,
72                 "Length" => length,
73                 "Content-Type" => mime_type
74               })
75           end
76           @redirects[link_name] = "#{coquelicot_link}"
77           @redirects[link_name] << "-#{random_pass}" if file_key.empty?
78         rescue Errno::ENOENT => ex
79           STDERR.puts "#{ex}"
80         end
81       end
82     end
83   end
84 end
85
86 def usage
87   STDERR.puts "Usage: #{$0} </path/to/jyraphe/var> </path/to/coquelicot/depot>"
88   exit 1
89 end
90
91 def main
92   usage unless ARGV.length == 2
93   jyraphe_var = ARGV[0]
94   coquelicot_depot = ARGV[1]
95
96   unless File.directory? "#{jyraphe_var}/files" and
97          File.directory? "#{jyraphe_var}/links" then
98     STDERR.puts "#{jyraphe_var} is not a Jyraphe 'var' directory."
99     exit 1
100   end
101   unless File.exists? "#{coquelicot_depot}/.links" then
102     STDERR.puts "#{coquelicot_depot} is not a Coquelicot depot."
103     exit 1
104   end
105
106   Coquelicot::Application.set :depot_path, coquelicot_depot
107   JyrapheMigrator.new(jyraphe_var).process
108 end
109
110 main