Basic migration script using actual RS dir listings
This commit is contained in:
		
							parent
							
								
									0e10f3b6ff
								
							
						
					
					
						commit
						5370df9c75
					
				
							
								
								
									
										117
									
								
								migrate_metadata_to_redis.rb
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										117
									
								
								migrate_metadata_to_redis.rb
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,117 @@ | ||||
| #!/usr/bin/env ruby | ||||
| 
 | ||||
| require "rest_client" | ||||
| require "redis" | ||||
| 
 | ||||
| class Migrator | ||||
| 
 | ||||
|   attr_accessor :username, :token, :base_url | ||||
| 
 | ||||
|   def initialize(username, token) | ||||
|     @username = username | ||||
|     @token = token | ||||
|     @base_url = "https://storage.5apps.com" | ||||
|   end | ||||
| 
 | ||||
|   def configure_redis(redis_config) | ||||
|     @redis_config = redis_config | ||||
|   end | ||||
| 
 | ||||
|   def root_url | ||||
|     "#{@base_url}/#{@username}" | ||||
|   end | ||||
| 
 | ||||
|   def headers | ||||
|     {"authorization" => "Bearer #{@token}"} | ||||
|   end | ||||
| 
 | ||||
|   def is_dir?(name) | ||||
|     name[-1] == "/" | ||||
|   end | ||||
| 
 | ||||
|   def url_for(directory, parent_directory="") | ||||
|     # base_path = [root_url, parent_directory].join("/") | ||||
|     "#{root_url}#{parent_directory}#{directory}" | ||||
|   end | ||||
| 
 | ||||
|   def migrate | ||||
|     work_on_dir("", "/") | ||||
|   end | ||||
| 
 | ||||
|   def work_on_dir(directory, parent_directory) | ||||
|     url = url_for(directory, parent_directory) | ||||
| 
 | ||||
|     # puts "work on dir: #{url}" | ||||
| 
 | ||||
|     response = RestClient.get(url, headers) | ||||
|     listing = JSON.parse(response.body) | ||||
| 
 | ||||
|     timestamp = (Time.now.to_f * 1000).to_i | ||||
| 
 | ||||
|     if listing["items"].any? | ||||
|       items = listing["items"] | ||||
|       items.each do |item, data| | ||||
|         if is_dir? item | ||||
|           save_directory_data("#{parent_directory}#{directory}", item, data, timestamp) | ||||
| 
 | ||||
|           # get dir listing and repeat | ||||
|           work_on_dir(item, "#{parent_directory}#{directory}") | ||||
|         else | ||||
|           save_document_data("#{parent_directory}#{directory}", item, data, timestamp) | ||||
|         end | ||||
| 
 | ||||
|         add_item_to_parent_dir("#{parent_directory}#{directory}", item) | ||||
|       end | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   def add_item_to_parent_dir(dir, item) | ||||
|     key = "rs_meta:#{username}:#{parent_directory_for(dir)}:items" | ||||
|     # puts "adding item #{item} to #{key}" | ||||
|     redis.sadd key, item | ||||
|   end | ||||
| 
 | ||||
|   def save_directory_data(dir, item, data, timestamp) | ||||
|     key = "rs_meta:#{username}:#{dir.gsub(/^\//, "")}#{item}" | ||||
|     metadata = {etag: data["ETag"], modified: timestamp} | ||||
| 
 | ||||
|     # puts "metadata for dir #{key}: #{metadata}" | ||||
|     redis.hmset(key, *metadata) | ||||
|   end | ||||
| 
 | ||||
|   def save_document_data(dir, item, data, timestamp) | ||||
|     key = "rs_meta:#{username}:#{dir.gsub(/^\//, "")}#{item}" | ||||
|     metadata = { | ||||
|       etag: data["ETag"], | ||||
|       size: data["Content-Length"], | ||||
|       type: data["Content-Type"], | ||||
|       modified: timestamp | ||||
|     } | ||||
|     # puts "metadata for document #{key}: #{metadata}" | ||||
|     redis.hmset(key, *metadata) | ||||
|   end | ||||
| 
 | ||||
|   def parent_directory_for(directory) | ||||
|     return directory if directory == "/" | ||||
| 
 | ||||
|     return directory[0..directory.rindex("/")].gsub(/^\//, "") | ||||
|   end | ||||
| 
 | ||||
|   def redis | ||||
|     @redis ||= Redis.new(@redis_config) | ||||
|   end | ||||
| 
 | ||||
| end | ||||
| 
 | ||||
| username = ARGV[0] | ||||
| token = ARGV[1] | ||||
| 
 | ||||
| migrator = Migrator.new username, token | ||||
| migrator.configure_redis({host: "localhost", port: 6379}) | ||||
| 
 | ||||
| migrator.migrate | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user