[Title] Added new "direct file transfer module"
authordonghee yang <donghee.yang@samsung.com>
Thu, 11 Oct 2012 07:57:14 +0000 (16:57 +0900)
committerdonghee yang <donghee.yang@samsung.com>
Thu, 11 Oct 2012 07:57:14 +0000 (16:57 +0900)
20 files changed:
build-cli
build-svr
src/build_server/BuildClientOptionParser.rb
src/build_server/BuildJob.rb
src/build_server/BuildServerController.rb
src/build_server/BuildServerOptionParser.rb
src/build_server/MultiBuildJob.rb
src/build_server/RegisterPackageJob.rb
src/build_server/RemoteBuilder.rb
src/build_server/SocketJobRequestListener.rb
src/common/BuildComm.rb
src/common/FileTransferViaDirect.rb [new file with mode: 0644]
src/common/FileTransferViaFTP.rb [new file with mode: 0644]
src/common/fileTransfer.rb [deleted file]
src/pkg_server/SocketRegisterListener.rb
src/pkg_server/client.rb
test/build-server.basic1/build-cli-01.testcase
test/build-server.basic1/buildsvr.init
test/build-server.basic2/build-svr-02.testcase
test/build-server.multi-svr1/buildsvr2.init

index 11460877c8aad298024d9daae105e7800f121528..d7bc25cd803d59454bcc3aa429425b334d50d6c1 100755 (executable)
--- a/build-cli
+++ b/build-cli
@@ -35,7 +35,8 @@ $LOAD_PATH.unshift File.dirname(__FILE__)+"/src/build_server"
 require "utils"
 require "BuildClientOptionParser"
 require "BuildComm"
-
+require "FileTransferViaFTP"
+require "FileTransferViaDirect"
 
 
 #option parsing 
@@ -270,17 +271,22 @@ begin
                bs_ip = result[0]
                bs_port = result[1]
 
-        ftp_result = Utils.parse_ftpserver_url(option[:fdomain])
-        if ftp_result.nil? or ftp_result.length != 4 then
-            puts "FTP server url is incorrect. (#{option[:fdomain]})"
-            puts "Tune as following format."
-            puts " ftp://<usrename>:<passwd>@<address>"
-            exit 1
-        end
-               ip = ftp_result[0]
-        port = ftp_result[1]
-               username = ftp_result[2]
-               passwd = ftp_result[3]
+               if not option[:fdomain].nil? then
+               ftp_result = Utils.parse_ftpserver_url(option[:fdomain])
+               if ftp_result.nil? or ftp_result.length != 4 then
+               puts "FTP server url is incorrect. (#{option[:fdomain]})"
+               puts "Tune as following format."
+               puts " ftp://<usrename>:<passwd>@<address>"
+               exit 1
+               end
+                       ip = ftp_result[0]
+               port = ftp_result[1]
+                       username = ftp_result[2]
+                       passwd = ftp_result[3]
+                       transporter = FileTransferFTP.new( nil, ip, port, username, passwd )
+               else
+                       transporter = FileTransferDirect.new( nil )
+               end
 
                # upload
                client = BuildCommClient.create( bs_ip, bs_port, nil, 0 )
@@ -291,7 +297,7 @@ begin
                dock = Utils.create_uniq_name()
                msg = "UPLOAD|#{dock}"
                client.send( msg )
-               result = client.send_file(ip, port, username, passwd, option[:package])
+               result = client.send_file(option[:package], transporter)
                client.terminate
                if not result then
                        puts "Uploading file failed!.. #{option[:package]}"
@@ -308,98 +314,6 @@ begin
                client.print_stream
                client.terminate
 
-       # for test
-       when "upload"
-               # check file exist 
-               if not File.exist? option[:file] then
-                       puts "The file does not exist!.. #{option[:file]}"
-                       exit(-1)
-               end
-
-        result = Utils.parse_server_addr(option[:domain])
-        if result.nil? then
-            puts "Server address is incorrect. (#{option[:domain]})"
-            puts "Tune as following format."
-            puts " <ip>:<port>"
-            exit 1
-        end
-
-               # FTP INFO
-               client = BuildCommClient.create( result[0], result[1], nil, 0 )
-               if client.nil? then
-                       puts "Can't access server #{result[0]}:#{result[1]}"
-                       exit(-1)
-               end
-               client.send "QUERY|FTP"
-               result0 = client.receive_data()
-               if result0.nil? then
-                       client.terminate
-                       exit(-1)
-               end
-               result0 = result0[0].split(",").map { |x| x.strip }
-               ip = result0[0]
-               username = result0[1]
-               passwd = result0[2]
-               client.terminate
-
-               client = BuildCommClient.create( result[0], result[1], nil, 0 )
-               if client.nil? then
-                       puts "Can't access server #{result[0]}:#{result[1]}"
-                       exit(-1)
-               end
-               client.send("UPLOAD")
-               result = client.send_file(ip, username, passwd, option[:file])
-               client.terminate
-               if not result then
-                       puts "Uploading file failed!.. #{option[:file]}"
-                       exit(-1)
-               else
-                       puts "Uploading file succeeded!"
-               end
-       
-       when "download"
-        result = Utils.parse_server_addr(option[:domain])
-        if result.nil? then
-            puts "Server address is incorrect. (#{option[:domain]})"
-            puts "Tune as following format."
-            puts " <ip>:<port>"
-            exit 1
-        end
-
-               # FTP INFO
-               client = BuildCommClient.create( result[0], result[1], nil, 0 )
-               if client.nil? then
-                       puts "Can't access server #{result[0]}:#{result[1]}"
-                       exit(-1)
-               end
-               client.send "QUERY|FTP"
-               result0 = client.receive_data()
-               if result0.nil? then
-                       client.terminate
-                       exit(-1)
-               end
-               result0 = result0[0].split(",").map { |x| x.strip }
-               ip = result0[0]
-               username = result0[1]
-               passwd = result0[2]
-               client.terminate
-
-               # download
-               client = BuildCommClient.create( result[0], result[1], nil, 0 )
-               if client.nil? then
-                       puts "Can't access server #{result[0]}:#{result[1]}"
-                       exit(-1)
-               end
-               file_name = option[:file]
-               client.send("DOWNLOAD|#{file_name}")
-               result = client.receive_file(ip, username, passwd, "./#{file_name}")
-               client.terminate
-               if not result then
-                       puts "Downloading file failed!.. #{option[:file]}"
-                       exit(-1)
-               else
-                       puts "Downloading file succeeded!"
-               end
        else
                raise RuntimeError, "input option incorrect : #{option[:cmd]}"
        end
index 6a862832b1c836e6bc1d612162e7891f37a7abe9..3e5a57c516cb716e49573f541bd8637de9d541a6 100755 (executable)
--- a/build-svr
+++ b/build-svr
@@ -53,17 +53,20 @@ end
 begin
        case option[:cmd]
        when "create"
-        ftp_result = Utils.parse_ftpserver_url(option[:fdomain])
-        if ftp_result.nil? or ftp_result.length != 4 then
-            puts "FTP server url is incorrect. (#{option[:fdomain]})"
-            puts "Tune as following format."
-            puts " ftp://<usrename>:<passwd>@<address>:<port>"
-            exit 1
-        end
-        ftpsvr_addr = ftp_result[0]
-        ftpsvr_port = ftp_result[1]
-        ftpsvr_username = ftp_result[2]
-        ftpsvr_passwd = ftp_result[3]
+               ftpsvr_addr = nil; ftpsvr_port = nil; ftpsvr_username = nil; ftpsvr_passwd = nil
+               if not option[:fdomain].nil? then
+               ftp_result = Utils.parse_ftpserver_url(option[:fdomain])
+               if ftp_result.nil? or ftp_result.length != 4 then
+               puts "FTP server url is incorrect. (#{option[:fdomain]})"
+               puts "Tune as following format."
+               puts " ftp://<usrename>:<passwd>@<address>:<port>"
+               exit 1
+               end
+               ftpsvr_addr = ftp_result[0]
+               ftpsvr_port = ftp_result[1]
+               ftpsvr_username = ftp_result[2]
+               ftpsvr_passwd = ftp_result[3]
+               end
                pkgsvr_url = pkgsvr_addr = pkgsvr_port = nil
                if not option[:domain].nil? and not option[:url].nil? then
                svr_result = Utils.parse_server_addr(option[:domain])
index 19433903a2f8d9f23c3722a0e5a1b900b915c27a..5aa74f7aa8c0b83b49ac375fad440a037a17e1a5 100644 (file)
@@ -38,7 +38,7 @@ class BuildClientUsage
     QUERY_PROJECT="build-cli query-project -d <server address>"    
     QUERY_JOB="build-cli query-job -d <server address>"    
     CANCEL="build-cli cancel -j <job number> -d <server address> [-w <password>]"    
-    REGISTER="build-cli register -P <package file> -d <server address>  -t <ftp server url> [-w <password>] [-D <distribution name>]"    
+    REGISTER="build-cli register -P <package file> -d <server address>  [-t <ftp server url>] [-w <password>] [-D <distribution name>]"    
 end
 
 
@@ -84,8 +84,7 @@ def option_error_check( options )
         end
     when "register" then
         if options[:package].nil? or options[:package].empty? or
-            options[:domain].nil? or options[:domain].empty? or
-            options[:fdomain].nil? or options[:fdomain].empty? then
+            options[:domain].nil? or options[:domain].empty? then
             raise ArgumentError, "Usage: " + BuildClientUsage::REGISTER
         end
 
index ed0e900407c03409ca4110ad22e9c3671bf05a1f..e48b84b3efe3d72f61c7bc6af86e999e44c6b73b 100644 (file)
@@ -742,7 +742,9 @@ class BuildJob < CommonJob
                        builder = RemoteBuilder.new("JB#{@id}", @remote_server, @server.ftp_addr, @server.ftp_port, @server.ftp_username, @server.ftp_passwd)
                        @log.info( "JobBuilder##{@id} is created", Log::LV_USER)
                        @log.info( " - Remote Server : #{@remote_server.ip}:#{@remote_server.port}" )
-                       @log.info( " - FTP Server : #{@server.ftp_addr}" )
+                       if not @server.ftp_addr.nil? then
+                               @log.info( " - FTP Server : #{@server.ftp_addr}" )
+                       end
                else
                        builder = Builder.create( "JB#{@id}", @pkgsvr_url, nil,
                                 "#{@buildroot_dir}", @server.build_cache_dir )
@@ -838,7 +840,9 @@ class BuildJob < CommonJob
                        builder = RemoteBuilder.new("JB#{@id}", @remote_server, @server.ftp_addr, @server.ftp_port, @server.ftp_username, @server.ftp_passwd)
                        @log.info( "JobBuilder##{@id} is created", Log::LV_USER)
                        @log.info( " - Remote Server : #{@remote_server.ip}:#{@remote_server.port}" )
-                       @log.info( " - FTP Server : #{@server.ftp_addr}" )
+                       if not @server.ftp_addr.nil? then
+                               @log.info( " - FTP Server : #{@server.ftp_addr}" )
+                       end
                else
                        builder = Builder.create( "JB#{@id}", @pkgsvr_url, nil,
                                 "#{@buildroot_dir}/#{@os}", @server.build_cache_dir )
@@ -916,7 +920,9 @@ class BuildJob < CommonJob
                        builder = RemoteBuilder.new("JB#{@id}", @remote_server, @server.ftp_addr, @server.ftp_port, @server.ftp_username, @server.ftp_passwd)
                        @log.info( "JobBuilder##{@id} is created", Log::LV_USER)
                        @log.info( " - Remote Server : #{@remote_server.ip}:#{@remote_server.port}" )
-                       @log.info( " - FTP Server : #{@server.ftp_addr}" )
+                       if not @server.ftp_addr.nil? then
+                               @log.info( " - FTP Server : #{@server.ftp_addr}" )
+                       end
                else
                        builder = Builder.create( "JB#{@id}", @pkgsvr_url, nil,
                                 "#{@buildroot_dir}/#{@os}", @server.build_cache_dir )
@@ -1001,7 +1007,7 @@ class BuildJob < CommonJob
 
                # upload
                u_client = Client.new( @pkgsvr_url, nil, @log )
-               snapshot = u_client.upload( @pkgsvr_ip, @pkgsvr_port, @server.ftp_addr, @server.ftp_port, @server.ftp_username, @server.ftp_passwd, binpkg_path_list)
+               snapshot = u_client.upload( @pkgsvr_ip, @pkgsvr_port, binpkg_path_list, @server.ftp_addr, @server.ftp_port, @server.ftp_username, @server.ftp_passwd)
 
                if snapshot.nil? then
                        @log.info( "Upload failed...", Log::LV_USER)
index 9a6d05d5d63352b228da28c4889d716f632e508e..f935964d85262b370d334a7722b9df239166702c 100644 (file)
@@ -34,7 +34,7 @@ class BuildServerController
        @@instance_map = {}
 
        # create
-       def self.create_server (id, path, ftpsvr_addr, ftpsvr_port, ftpsvr_username, ftpsvr_passwd, pkgsvr_url=nil, pkgsvr_addr=nil, pkgsvr_port=3333 )
+       def self.create_server (id, path, ftpsvr_addr=nil, ftpsvr_port=nil, ftpsvr_username=nil, ftpsvr_passwd=nil, pkgsvr_url=nil, pkgsvr_addr=nil, pkgsvr_port=3333 )
 
                # check server config root
                check_build_server_root
@@ -775,10 +775,9 @@ class BuildServerController
                        f.puts "TEST_TIME=#{server.test_time}" if server.test_time > 0
                        f.puts "PASSWORD=#{server.test_time}" if server.password != "0000"
                        f.puts "JOB_KEEP_TIME=#{server.keep_time}"
-                       f.puts "FTP_ADDR=#{server.ftp_addr}"
-            f.puts "FTP_PORT=#{server.ftp_port}"
-                       f.puts "FTP_USERNAME=#{server.ftp_username}"
-                       f.puts "FTP_PASSWD=#{server.ftp_passwd}"
+                       if not server.ftp_addr.nil? then
+                               f.puts "FTP_URL=ftp://#{server.ftp_username}:#{server.ftp_passwd}@#{server.ftp_addr}:#{server.ftp_port}"
+                       end
                        f.puts "PKG_SYNC_PERIOD=#{server.pkg_sync_period}"
                        f.puts "CHANGELOG_CHECK=#{server.changelog_check}"
                end
@@ -801,10 +800,10 @@ class BuildServerController
                test_time=0
                password="0000"
                keep_time=86400
-               ftp_addr=""
-               ftp_port="21"
-               ftp_username=""
-               ftp_passwd=""
+               ftp_addr=nil
+               ftp_port=nil
+               ftp_username=nil
+               ftp_passwd=nil
                pkg_sync_period=600
                changelog_check=false
 
@@ -831,14 +830,12 @@ class BuildServerController
                                        password = l[idx,length].strip.to_i
                                elsif l.start_with?("JOB_KEEP_TIME=")
                                        keep_time = l[idx,length].strip.to_i
-                               elsif l.start_with?("FTP_ADDR=")
-                                       ftp_addr = l[idx,length].strip
-                               elsif l.start_with?("FTP_PORT=")
-                                       ftp_port = l[idx,length].strip
-                               elsif l.start_with?("FTP_USERNAME=")
-                                       ftp_username = l[idx,length].strip
-                               elsif l.start_with?("FTP_PASSWD=")
-                                       ftp_passwd = l[idx,length].strip
+                               elsif l.start_with?("FTP_URL=")
+                               ftp_result = Utils.parse_ftpserver_url(l[idx,length].strip)
+                               ftp_addr = ftp_result[0]
+                               ftp_port = ftp_result[1]
+                               ftp_username = ftp_result[2]
+                               ftp_passwd = ftp_result[3]
                                elsif l.start_with?("PKG_SYNC_PERIOD=")
                                        pkg_sync_period = l[idx,length].strip.to_i
                                elsif l.start_with?("CHANGELOG_CHECK=")
@@ -881,12 +878,6 @@ class BuildServerController
                # set password
                obj.keep_time = keep_time
 
-               # set ftp infomation
-               obj.ftp_addr = ftp_addr
-        obj.ftp_port = ftp_port
-               obj.ftp_username = ftp_username
-               obj.ftp_passwd = ftp_passwd
-
                # load from DB
                obj.load_db()
 
index 8a5996917e068ec00537feb9e80df7690201292e..04b2f8eddabe5f80c6ddfb9394e32933486529fe 100644 (file)
@@ -31,7 +31,7 @@ require 'optparse'
 require 'utils'
 
 class BuildServerUsage
-       CREATE="build-svr create -n <server name> -t <ftp server url> [-u <package server url> -d <package server address>]"
+       CREATE="build-svr create -n <server name> [-t <ftp server url>] [-u <package server url> -d <package server address>]"
        REMOVE="build-svr remove -n <server name>"
        START="build-svr start -n <server name> -p <port>"
        STOP="build-svr stop -n <server name>"
@@ -57,8 +57,7 @@ def option_error_check( options )
     case options[:cmd]
 
     when "create"
-        if options[:name].nil? or options[:name].empty? or 
-            options[:fdomain].nil? or options[:fdomain].empty? then
+        if options[:name].nil? or options[:name].empty? then
             raise ArgumentError, "Usage: " + BuildServerUsage::CREATE
         end            
 
index 428f4b6c785c24e11ffda8f85c55bba1d9bb5203..6d9d588cd28f986014fe4b37600b756b69da4a78 100644 (file)
@@ -405,7 +405,7 @@ class MultiBuildJob < CommonJob
 
                # upload
                u_client = Client.new( @pkgsvr_url, nil, @log )
-               snapshot = u_client.upload( @pkgsvr_ip, @pkgsvr_port, @server.ftp_addr, @server.ftp_port, @server.ftp_username, @server.ftp_passwd, binpkg_path_list)
+               snapshot = u_client.upload( @pkgsvr_ip, @pkgsvr_port, binpkg_path_list, @server.ftp_addr, @server.ftp_port, @server.ftp_username, @server.ftp_passwd)
 
                if snapshot.nil? then
                        @log.info( "Upload failed...", Log::LV_USER)
index e2cd048f7795b9a93b94a6b56a04866aa96ec31a..89722b4bc894afbaeeb47d5c79647e829fde78f8 100644 (file)
@@ -483,7 +483,7 @@ class RegisterPackageJob < CommonJob
 
                # upload
                u_client = Client.new( @pkgsvr_url, nil, @log )
-               snapshot = u_client.upload( @pkgsvr_ip, @pkgsvr_port, @server.ftp_addr, @server.ftp_port, @server.ftp_username, @server.ftp_passwd, binpkg_path_list)
+               snapshot = u_client.upload( @pkgsvr_ip, @pkgsvr_port, binpkg_path_list, @server.ftp_addr, @server.ftp_port, @server.ftp_username, @server.ftp_passwd)
 
                if snapshot.nil? then
                        @log.info( "Upload failed...", Log::LV_USER)
index 1ebccc86b848429bfedfb5ce8c321e5c3b30f143..e895c9adb66b2844c7da8183c466fae70cb86736 100644 (file)
@@ -32,6 +32,8 @@ $LOAD_PATH.unshift File.dirname(File.dirname(__FILE__))+"/pkg_server"
 require "utils"
 require "PackageManifest"
 require "log"
+require "FileTransferViaFTP"
+require "FileTransferViaDirect"
 
 class RemoteBuilder 
        attr_accessor :id, :log
@@ -140,7 +142,13 @@ class RemoteBuilder
                file_name = file_path.split("/")[-1]
                msg = "UPLOAD|#{dock}"
                if client.send( msg ) then
-                       result=client.send_file( @ftp_addr, @ftp_port, @ftp_username, @ftp_passwd, file_path )
+                       if not @ftp_addr.nil? then
+                               transporter=FileTransferFTP.new(@log, @ftp_addr, @ftp_port, @ftp_username, @ftp_passwd)
+                       else
+                               transporter=FileTransferDirect.new(@log)
+                       end
+
+                       result=client.send_file( file_path, transporter )
                        if not result then
                                @log.error( "File uploading failed...#{file_name}", Log::LV_USER)
                        end
@@ -218,7 +226,12 @@ class RemoteBuilder
                file_name = file_path.split("/")[-1]
                msg = "DOWNLOAD|#{dock}|#{file_name}"
                if client.send( msg ) then
-                       result=client.receive_file( @ftp_addr, @ftp_port, @ftp_username, @ftp_passwd, file_path )
+                       if not @ftp_addr.nil? then
+                               transporter=FileTransferFTP.new(@log, @ftp_addr, @ftp_port, @ftp_username, @ftp_passwd)
+                       else
+                               transporter=FileTransferDirect.new(@log)
+                       end
+                       result=client.receive_file(file_path, transporter)
                        if not result then
                                @log.error( "File downloading failed...#{file_name}", Log::LV_USER)
                        end
index 53648e1f4d4b2a1669dea4ca9b68d0a1b5b11409..1fda9d8b2ba82505224dc9be45ecfdff73cdf068 100644 (file)
@@ -70,8 +70,12 @@ class SocketJobRequestListener
        def main()
                # server open
                begin
-                       ftp_url = Utils.generate_ftp_url(@parent_server.ftp_addr, @parent_server.ftp_port,
-                               @parent_server.ftp_username, @parent_server.ftp_passwd)
+                       if not @parent_server.ftp_addr.nil? then
+                               ftp_url = Utils.generate_ftp_url(@parent_server.ftp_addr, @parent_server.ftp_port,
+                                       @parent_server.ftp_username, @parent_server.ftp_passwd)
+                       else
+                               ftp_url = nil
+                       end
                        cache_dir = "#{@parent_server.transport_path}/.cache"
                        @comm_server = BuildCommServer.create(@parent_server.port, @log, ftp_url, cache_dir)
                rescue
@@ -393,7 +397,11 @@ class SocketJobRequestListener
                # QUERY, FTP
                when "FTP"
                        BuildCommServer.send_begin(req)
-                       BuildCommServer.send(req,"#{@parent_server.ftp_addr},#{@parent_server.ftp_username},#{@parent_server.ftp_passwd}")
+                       if not @parent_server.ftp_addr.nil? then
+                               BuildCommServer.send(req,"#{@parent_server.ftp_addr},#{@parent_server.ftp_username},#{@parent_server.ftp_passwd}")
+                       else
+                               BuildCommServer.send(req,"NONE,NONE,NONE")
+                       end
                        BuildCommServer.send_end(req)
                        BuildCommServer.disconnect(req)
 
index 950c90c01a0d0ad0ea800541c0d06c352191c525..82265342507890d8321b3270fa89bc88deed0c33 100644 (file)
@@ -31,9 +31,10 @@ Contributors:
 $LOAD_PATH.unshift File.dirname(__FILE__)
 require "log"
 require 'timeout'
-require "fileTransfer"
 require "net/ftp"
 require 'thread'
+require "FileTransferViaFTP"
+require "FileTransferViaDirect"
 
 ATTEMPTS = ["first", "second", "third"]
 
@@ -128,22 +129,45 @@ class BuildCommServer
             end
 
             req.puts "READY"
-                       @log.info "Ready to upload file"
-
-                       # receive file from client 
-                       if not @ftp_url.nil? then
-                url_contents = Utils.parse_ftpserver_url(@ftp_url)
-                               ip = url_contents[0]
-                               port = url_contents[1]
-                username = url_contents[2]
-                passwd = url_contents[3]
-                               @trans = FileTransfer.new(@log,ip,port,username,passwd)
-                       else
-                               @trans = FileTransfer.new(@log)
-                       end
+                       @log.info "Ready to send file"
 
-                       if not @trans.send_file( src_file, req, false ) then
-                               return false
+                       while line = req.gets()
+                               tok = line.split(",").map { |x| x.strip }
+                               cmd = tok[0].strip
+                               case cmd
+                               when "CHECK_TRANSPORTER"
+                                       type = tok[1].strip
+                                       case type
+                                       when "DIRECT"
+                                               transporter = FileTransferDirect.new(@log)
+                                       when "FTP"
+                                               if not @ftp_url.nil? then
+                                       url_contents = Utils.parse_ftpserver_url(@ftp_url)
+                                                       ip = url_contents[0]
+                                                       port = url_contents[1]
+                                       username = url_contents[2]
+                                       passwd = url_contents[3]
+                                                       transporter = FileTransferFTP.new(@log, ip, port, username, passwd)
+                                               else
+                                                       transporter = FileTransferFTP.new(@log)
+                                               end
+                                       else
+                                               req.puts "ERROR"
+                                               @log.error "Unsupported transporter type! : #{type}"
+                                               return false
+                                       end     
+
+                                       req.puts "TRANSPORTER_OK"
+
+                                       if not transporter.send_file( src_file, req, false ) then
+                                               return false
+                                       else
+                                               return true
+                                       end
+
+                               else
+                                       @log.warn "Unhandled message: #{line}"
+                               end
                        end
 
         rescue => e
@@ -159,18 +183,15 @@ class BuildCommServer
 
        # NOTE. dst_file can be directory
        def receive_file(req, dst_file)
-               # 1. send "READY"
-               # 2. If "UPLOADED,ip,port,file_path,username,passwd" is received,
-               #    Download the file using my ftp_url.
-               #    If ftp_url is nil, use the url on "UPLOADED" messge instead
-               #    After downloading it, send "SUCC"
-
                begin
             req.puts "READY"
-                       while l = req.gets()
-                               tok = l.split(",").map { |x| x.strip }
+                       @log.info "Ready to receive file"
+
+                       while line = req.gets()
+                               tok = line.split(",").map { |x| x.strip }
                                cmd = tok[0].strip
-                               if cmd == "CHECK_CACHE" then
+                               case cmd
+                               when "CHECK_CACHE"
                                        file_name = tok[1]
                                        file_size = tok[2].to_i
                                        checksum = tok[3]
@@ -189,37 +210,44 @@ class BuildCommServer
                                        else
                                                @log.info "Cached file not found!#{file_name}"
                                                req.puts "NOT_CACHED"
+                                       end
 
-                                               # receive file from client 
+                               when "CHECK_TRANSPORTER"
+                                       type = tok[1].strip
+                                       case type
+                                       when "DIRECT"
+                                               transporter = FileTransferDirect.new(@log)
+                                       when "FTP"
                                                if not @ftp_url.nil? then
                                        url_contents = Utils.parse_ftpserver_url(@ftp_url)
                                                        ip = url_contents[0]
                                                        port = url_contents[1]
                                        username = url_contents[2]
                                        passwd = url_contents[3]
-                                                       @trans = FileTransfer.new(@log, ip, port, username, passwd)
+                                                       transporter = FileTransferFTP.new(@log, ip, port, username, passwd)
                                                else
-                                                       @trans = FileTransfer.new(@log)
+                                                       transporter = FileTransferFTP.new(@log)
                                                end
+                                       else
+                                               req.puts "ERROR"
+                                               @log.error "Unsupported transporter type! : #{type}"
+                                               return false
+                                       end     
 
-                                               if not @trans.receive_file( dst_file, req, false ) then
-                                                       return false
-                                               end
+                                       req.puts "TRANSPORTER_OK"
 
-                                               # add to cache
-                                               if not @cache_dir.nil? then
-                                               if File.exist? dst_file and File.directory? dst_file then 
-                                                               target_file = File.join(dst_file,File.basename(dst_filepath))
-                                               else 
-                                                               target_file = dst_file 
-                                                       end
-                                                       add_download_cache(target_file)
-                                               end
+                                       if not transporter.receive_file( dst_file, req, false ) then
+                                               return false
+                                       end
+
+                                       # add to cache
+                                       if not @cache_dir.nil? then
+                                               add_download_cache(target_file)
                                        end
                     break
 
                                else
-                                       @log.warn "Unhandled message: #{l}"
+                                       @log.warn "Unhandled message: #{line}"
                                end
                        end                             
                rescue => e
@@ -456,7 +484,8 @@ class BuildCommClient
        end
 
 
-       def send_file(ip, port, username, passwd, src_file)
+       def send_file(src_file, transporter )
+               result = true
         begin
             l = @socket.gets()
             if l.nil? then 
@@ -471,29 +500,42 @@ class BuildCommClient
                        end
 
             while line = @socket.gets()
-                if line.strip == "READY" then
-                       @log.info "Server is ready to receive file"
+                cmd = line.split(",")[0].strip
+                               case cmd
+                when "READY"
+                       @log.info "Server is ready!"
                                        file_name = File.basename(src_file)
                                        file_size = File.size(src_file)
                                        checksum = Utils.checksum(src_file)
                     send "CHECK_CACHE,#{file_name},#{file_size},#{checksum}"
 
-                elsif line.strip == "CACHED" then
+                when "CACHED"
                     @log.info "Server already has cached file"
                                        break
 
-                elsif line.strip == "NOT_CACHED" then
-                       @log.info "Server doest not have cached file"
-                               
-                                       # send file to server
-                                       @trans = FileTransfer.new(@log, ip, port, username, passwd)
-                                       if not @trans.send_file( src_file, @socket, true ) then
-                                               return false
+                when "NOT_CACHED"
+                       @log.info "Server does not have cached file"
+                                       send "CHECK_TRANSPORTER,#{transporter.type}"
+
+                               when "TRANSPORTER_OK"                           
+                                       if not transporter.send_file( src_file, @socket, true ) then
+                                               result = false
+                                       else
+                               @log.info "Sending file succeeded!"
                                        end
-                                       break
 
-                elsif line.strip == "=END" then
-                    break
+                               when "TRANSPORTER_FAIL"                         
+                                       @log.warn "Server does not support transporter type: #{transporter.type}"
+                                       result = false
+
+                when "ERROR"
+                                       result = false
+
+                when "=END"
+                                       break
+                               
+                               else
+                                       @log.warn "Unhandled message: #{line}"
                 end
             end
         rescue => e
@@ -503,12 +545,14 @@ class BuildCommClient
                        return false                    
                end
 
-               return true
+               return result
        end
 
 
        # return file
-       def receive_file(ip, port, username, passwd, dst_file)
+       def receive_file(dst_file, transporter)
+               result = true
+
                begin
                        l = @socket.gets()
 
@@ -525,14 +569,26 @@ class BuildCommClient
 
             while line = @socket.gets()
                 cmd = line.split(",")[0].strip
-                if cmd == "READY" then
-                                       @trans = FileTransfer.new(@log, ip, port, username, passwd)
-                                       if not @trans.receive_file( dst_file, @socket, true ) then
-                                               return false
+                               case cmd
+                when "READY"
+                       @log.info "Server is ready!"
+                                       send "CHECK_TRANSPORTER,#{transporter.type}"
+
+                               when "TRANSPORTER_OK"                           
+                                       if not transporter.receive_file( dst_file, @socket, true ) then
+                                               result = false
+                                       else
+                               @log.info "Receiving file succeeded!"
                                        end
-                                       break 
-                elsif cmd == "=END" then
-                    break
+
+                when "ERROR"
+                                       result = false
+
+                when "=END"
+                                       break
+
+                               else
+                                       @log.warn "Unhandled message: #{line}"
                 end
             end
                rescue => e
@@ -542,7 +598,7 @@ class BuildCommClient
                        return false                    
                end
 
-               return true
+               return result
        end
 
 
diff --git a/src/common/FileTransferViaDirect.rb b/src/common/FileTransferViaDirect.rb
new file mode 100644 (file)
index 0000000..55072b3
--- /dev/null
@@ -0,0 +1,107 @@
+
+require 'socket'
+require 'log'
+
+class FileTransferDirect
+       attr_accessor :type
+
+       def initialize(logger)
+               @type = "DIRECT"
+
+               if not logger.nil? then
+                       @log = logger
+               else
+                       @log = DummyLog.new
+               end
+       end
+
+
+       def send_file( src_file, conn, is_client=true )
+
+        filename = File.basename(src_file)
+               size = File.size( src_file )
+               checksum = Utils.checksum( src_file )
+
+               if is_client then
+                       conn.puts "RECEIVE_REQ"
+               end
+
+               while line = conn.gets()
+                       tok = line.split(",") { |x| x.strip }
+                       cmd = tok[0].strip
+                       case cmd
+                       when "SEND_REQ"
+                       conn.puts "FILE_INFO,#{filename},#{size},#{checksum}"
+                               # read file contents
+                               # send via tcp/ip
+                               File.open(src_file, "rb") {|io|
+                                       while size > 0
+                                               buf = io.read(size > 1024*1024 ? 1024*1024 : size)
+                                               conn.write( buf )
+                                               size -= buf.length
+                                       end
+                               }
+
+                               @log.info "Upload is succeeded!" 
+                       conn.puts "SEND_OK"
+
+                       # wait for download result
+                       when "RECEIVE_OK"
+                               @log.info "Received download success message from remote site"
+                               return true     
+                                       
+                       when "RECEIVE_FAIL"
+                               @log.info "Received download fail message from remote site"
+                               return false
+
+                       else
+                               @log.error "Unhandled message: #{line}"
+                               return false
+                       end
+               end     
+       end
+
+
+       def receive_file( dst_file, conn, is_client=false )
+
+               if is_client then
+               conn.puts "SEND_REQ"
+               end
+
+               while line = conn.gets()
+                       tok = line.split(",") { |x| x.strip }
+                       cmd = tok[0].strip
+                       case cmd
+                       when "RECEIVE_REQ"
+                       conn.puts "SEND_REQ"
+                       when "FILE_INFO"
+                               @log.info "Received file info from remote site"
+                               filename = tok[1].strip
+                               size = tok[2].strip.to_i
+                               checksum = tok[3].strip
+
+                               if File.directory? dst_file then
+                                       dst_file = File.join(dst_file, filename)
+                               end
+
+                               File.open( dst_file, "wb" ) { |io|
+                               while size > 0
+                                       buf = conn.read(size > 1024*1024 ? 1024*1024 : size)
+                                       io.write( buf )
+                                       size -= buf.length
+                               end
+                               }
+
+                               conn.puts "RECEIVE_OK"
+
+                       when "SEND_OK"
+                               @log.info "Received success message from remote site"
+                               return true
+
+            else
+                               @log.error "Unhandled message: #{line}"
+                               return false
+                       end
+               end
+       end
+end
diff --git a/src/common/FileTransferViaFTP.rb b/src/common/FileTransferViaFTP.rb
new file mode 100644 (file)
index 0000000..9f0ce06
--- /dev/null
@@ -0,0 +1,261 @@
+
+require 'socket'
+require 'log'
+
+class FileTransferFTP
+       attr_accessor :type
+       ATTEMPTS = ["first", "second", "third"]
+
+       def initialize(logger, ip=nil, port=nil, username=nil, passwd=nil )
+               @type = "FTP"
+               @ip = ip
+               @port = port
+               @username = username
+               @passwd = passwd
+               if not logger.nil? then
+                       @log = logger
+               else
+                       @log = DummyLog.new
+               end
+       end
+
+
+       def send_file( src_file, conn, is_client=true )
+
+               if is_client then
+                       # check ftp info
+                       if @ip.nil? or @port.nil? or @username.nil? or @passwd.nil? then
+                               @log.error "No FTP information!" 
+                               conn.puts "UPLOAD_FAIL"                                                 
+                               return false 
+                       end
+                       conn.puts "DOWNLOAD_REQ,#{@ip},#{@port},#{@username},#{@passwd}"
+               end
+
+               ip = @ip; port = @port; username = @username; passwd = @passwd
+               while line = conn.gets()
+                       tok = line.split(",") { |x| x.strip }
+                       cmd = tok[0].strip
+                       case cmd
+                       when "UPLOAD_REQ"
+                               if @ip.nil? or @port.nil? or @username.nil? or @passwd.nil? then
+                                       ip = tok[1].strip
+                                       port = tok[2].strip
+                                       username = tok[3].strip
+                                       passwd = tok[4].strip
+                    @log.info "Using FTP information from remote... [#{ip}, #{port}]"
+                               end
+
+                               # upload to ftp
+                               ftp_filepath = nil
+                               for attempt in ATTEMPTS
+                               ftp_filepath = putfile( src_file, ip, port, username, passwd )
+                                       if !ftp_filepath.nil? then 
+                                               break
+                                       else 
+                                               @log.info "The #{attempt} uploading attempt failed!" 
+                                       end
+                               end
+
+                               if ftp_filepath.nil? then 
+                                       conn.puts "UPLOAD_FAIL"                                                 
+                                       return false 
+                               else 
+                                       @log.info "Upload is succeeded at #{attempt}" 
+                               conn.puts "UPLOAD_OK,#{ftp_filepath}"
+                               end
+
+                       # wait for download result
+                       when "DOWNLOAD_OK"
+                               @log.info "Received download success message from remote site"
+                               # clean
+                               cleandir( ftp_filepath, ip, port, username, passwd) 
+                       @log.info "Cleaned temporary dir on FTP server: #{ftp_filepath}"
+                               return true     
+                                       
+                       when "DOWNLOAD_FAIL"
+                               @log.info "Received download fail message from remote site"
+                               return false
+
+                       else
+                               @log.error "Unhandled message: #{line}"
+                               return false
+                       end
+               end     
+       end
+
+
+       def receive_file( dst_file, conn, is_client=false )
+
+               if is_client then
+                       # check ftp info
+                       if @ip.nil? or @port.nil? or @username.nil? or @passwd.nil? then
+                               @log.error "No FTP information!" 
+                               conn.puts "DOWNLOAD_FAIL"                                                       
+                               return false 
+                       end
+               conn.puts "UPLOAD_REQ,#{@ip},#{@port},#{@username},#{@passwd}"
+               end
+
+               ip = @ip; port = @port; username = @username; passwd = @passwd
+               while line = conn.gets()
+                       tok = line.split(",") { |x| x.strip }
+                       cmd = tok[0].strip
+                       case cmd
+                       when "DOWNLOAD_REQ"
+                               if @ip.nil? or @port.nil? or @username.nil? or @passwd.nil? then
+                                       ip = tok[1].strip
+                                       port = tok[2].strip
+                                       username = tok[3].strip
+                                       passwd = tok[4].strip
+                    @log.info "Using FTP information from remote... [#{ip}, #{port}]"
+                               end
+
+                       conn.puts "UPLOAD_REQ,#{ip},#{port},#{username},#{passwd}"
+                       when "UPLOAD_OK"
+                               @log.info "Received upload success message from remote site"
+                               filepath = tok[1].strip
+                               # download from ftp
+                               dst_filepath = nil
+                               for attempt in ATTEMPTS
+                                       dst_filepath = getfile( filepath, dst_file, ip, port, username, passwd )
+                                       if not dst_filepath.nil? then 
+                                               break
+                                       else 
+                                               @log.info "The #{attempt} downloading attempt failed!" 
+                                       end                                                     
+                               end                                     
+                               if dst_filepath.nil? then 
+                                       conn.puts "DOWNLOAD_FAIL"                                                       
+                                       return false                                                                                            
+                               else 
+                                       @log.info " Server is the #{attempt} successful attempt to download" 
+                                       conn.puts "DOWNLOAD_OK"
+                                       return true
+                               end
+
+                       when "UPLOAD_FAIL"
+                               @log.info "Received upload fail message from remote site"
+                               return false
+
+            else
+                               @log.error "Unhandled message: #{line}"
+                               return false
+                       end
+               end
+       end
+
+
+    def putfile( bpath, ip, port, username, passwd )
+        filename = File.basename(bpath)
+        uniqdir = Utils.create_uniq_name
+        ftp_filepath = File.join(uniqdir, filename)
+
+        begin
+            ftp = Net::FTP.new
+            if port.nil? or port == "" then
+                ftp.connect(ip)
+            else
+                ftp.connect(ip, port)                                 
+            end
+                       @log.info "[FTP log] Connected FTP server (#{ip}:#{port})"
+            ftp.login(username, passwd)
+            ftp.binary = true
+                       ftp.passive = true                      
+            ftp.mkdir(uniqdir)
+            ftp.chdir(uniqdir)
+            ftp.put(bpath)
+                       @log.info "[FTP log] Put a file"
+                       @log.info "[FTP log]   from \"#{bpath}\" to \"#{ftp_filepath}\""                        
+                       files = ftp.list(filename)
+                       if files.empty? then 
+                               @log.error "[FTP log] Failed to upload file (#{filename} does not exist)"
+                               return nil      
+                       end
+            ftp.quit
+                       @log.info "[FTP log] Disconnected FTP server"
+        rescue => e
+                       @log.error "[FTP log] Exception"
+                       @log.error e.message
+                       @log.error e.backtrace.inspect
+                       return nil                      
+        end
+               return ftp_filepath
+    end
+
+    def getfile( bpath, target, ip, port, username, passwd )
+        dirname = File.dirname(bpath)
+        filename = File.basename(bpath)
+
+        # target can be directory or file
+        if File.directory? target then
+            dst_file = File.join(target,filename)
+        else
+            dst_file = target
+        end
+
+        begin
+            ftp = Net::FTP.new
+            if port.nil? or port == "" then
+                ftp.connect(ip)
+            else                
+                ftp.connect(ip, port)
+            end                
+                       @log.info "[FTP log] Connected FTP server (#{ip}:#{port})"
+            ftp.login(username, passwd)
+            ftp.binary = true
+                       ftp.passive = true
+            ftp.chdir(dirname)
+            ftp.get(filename, dst_file)
+                       @log.info "[FTP log] Get a file"
+                       @log.info "[FTP log]   from \"#{bpath}\" to \"#{dst_file}\""
+            ftp.quit
+                       @log.info "[FTP log] Disconnected FTP server"
+        rescue => e
+                       @log.error "[FTP log] Exception"
+                       @log.error e.message
+                       @log.error e.backtrace.inspect
+                       return nil                      
+               end
+               if not File.exist? dst_file then
+                       @log.error "[FTP log] Failed to download file (#{dst_file} does not exist)"
+                       return nil
+               end                             
+        return bpath
+    end
+
+    def cleandir(path, ip, port, username, passwd)
+        dirname = File.dirname(path)
+
+        begin
+            ftp = Net::FTP.new
+            if port.nil? or port == "" then
+                ftp.connect(ip)
+            else
+                ftp.connect(ip, port)                    
+            end                    
+                       @log.info "[FTP log] Connected FTP server (#{ip}:#{port})"
+            ftp.login(username, passwd)
+            old_dir = ftp.pwd
+            ftp.chdir(dirname)
+            list = ftp.ls
+            # TODO: if list is directory?
+            list.each do |l|
+                file = l.split(" ")[-1].strip
+                ftp.delete(file)
+            end
+            ftp.chdir(old_dir)
+            ftp.rmdir(dirname)
+                       @log.info "[FTP log] Clean dir (#{dirname})"                    
+            ftp.quit
+                       @log.info "[FTP log] Disconnected FTP server"
+        rescue => e
+                       @log.error "[FTP log] Exception"
+                       @log.error e.message
+                       @log.error e.backtrace.inspect
+                       return nil                      
+        end
+
+        return true
+       end
+end
diff --git a/src/common/fileTransfer.rb b/src/common/fileTransfer.rb
deleted file mode 100644 (file)
index f504c4c..0000000
+++ /dev/null
@@ -1,259 +0,0 @@
-
-require 'socket'
-require 'log'
-
-class FileTransfer
-       ATTEMPTS = ["first", "second", "third"]
-
-       def initialize(logger, ip=nil, port=nil, username=nil, passwd=nil )
-               @ip = ip
-               @port = port
-               @username = username
-               @passwd = passwd
-               if not logger.nil? then
-                       @log = logger
-               else
-                       @log = DummyLog.new
-               end
-       end
-
-
-       def send_file( src_file, conn, is_client=true )
-
-               if is_client then
-                       # check ftp info
-                       if @ip.nil? or @port.nil? or @username.nil? or @passwd.nil? then
-                               @log.error "No FTP information!" 
-                               conn.puts "UPLOAD_FAIL"                                                 
-                               return false 
-                       end
-                       conn.puts "DOWNLOAD_REQ,#{@ip},#{@port},#{@username},#{@passwd}"
-               end
-
-               ip = @ip; port = @port; username = @username; passwd = @passwd
-               while line = conn.gets()
-                       tok = line.split(",") { |x| x.strip }
-                       cmd = tok[0].strip
-                       case cmd
-                       when "UPLOAD_REQ"
-                               if @ip.nil? or @port.nil? or @username.nil? or @passwd.nil? then
-                                       ip = tok[1].strip
-                                       port = tok[2].strip
-                                       username = tok[3].strip
-                                       passwd = tok[4].strip
-                    @log.info "Using FTP information from remote... [#{ip}, #{port}]"
-                               end
-
-                               # upload to ftp
-                               ftp_filepath = nil
-                               for attempt in ATTEMPTS
-                               ftp_filepath = putfile( src_file, ip, port, username, passwd )
-                                       if !ftp_filepath.nil? then 
-                                               break
-                                       else 
-                                               @log.info "The #{attempt} uploading attempt failed!" 
-                                       end
-                               end
-
-                               if ftp_filepath.nil? then 
-                                       conn.puts "UPLOAD_FAIL"                                                 
-                                       return false 
-                               else 
-                                       @log.info "Upload is succeeded at #{attempt}" 
-                               conn.puts "UPLOAD_OK,#{ftp_filepath}"
-                               end
-
-                       # wait for download result
-                       when "DOWNLOAD_OK"
-                               @log.info "Received download success message from remote site"
-                               # clean
-                               cleandir( ftp_filepath, ip, port, username, passwd) 
-                       @log.info "Cleaned temporary dir on FTP server: #{ftp_filepath}"
-                               return true     
-                                       
-                       when "DOWNLOAD_FAIL"
-                               @log.info "Received download fail message from remote site"
-                               return false
-
-                       else
-                               @log.error "Unhandled message: #{line}"
-                               return false
-                       end
-               end     
-       end
-
-
-       def receive_file( dst_file, conn, is_client=false )
-
-               if is_client then
-                       # check ftp info
-                       if @ip.nil? or @port.nil? or @username.nil? or @passwd.nil? then
-                               @log.error "No FTP information!" 
-                               conn.puts "DOWNLOAD_FAIL"                                                       
-                               return false 
-                       end
-               conn.puts "UPLOAD_REQ,#{@ip},#{@port},#{@username},#{@passwd}"
-               end
-
-               ip = @ip; port = @port; username = @username; passwd = @passwd
-               while line = conn.gets()
-                       tok = line.split(",") { |x| x.strip }
-                       cmd = tok[0].strip
-                       case cmd
-                       when "DOWNLOAD_REQ"
-                               if @ip.nil? or @port.nil? or @username.nil? or @passwd.nil? then
-                                       ip = tok[1].strip
-                                       port = tok[2].strip
-                                       username = tok[3].strip
-                                       passwd = tok[4].strip
-                    @log.info "Using FTP information from remote... [#{ip}, #{port}]"
-                               end
-
-                       conn.puts "UPLOAD_REQ,#{ip},#{port},#{username},#{passwd}"
-                       when "UPLOAD_OK"
-                               @log.info "Received upload success message from remote site"
-                               filepath = tok[1].strip
-                               # download from ftp
-                               dst_filepath = nil
-                               for attempt in ATTEMPTS
-                                       dst_filepath = getfile( filepath, dst_file, ip, port, username, passwd )
-                                       if not dst_filepath.nil? then 
-                                               break
-                                       else 
-                                               @log.info "The #{attempt} downloading attempt failed!" 
-                                       end                                                     
-                               end                                     
-                               if dst_filepath.nil? then 
-                                       conn.puts "DOWNLOAD_FAIL"                                                       
-                                       return false                                                                                            
-                               else 
-                                       @log.info " Server is the #{attempt} successful attempt to download" 
-                                       conn.puts "DOWNLOAD_OK"
-                                       return true
-                               end
-
-                       when "UPLOAD_FAIL"
-                               @log.info "Received upload fail message from remote site"
-                               return false
-
-            else
-                               @log.error "Unhandled message: #{line}"
-                               return false
-                       end
-               end
-       end
-
-
-    def putfile( bpath, ip, port, username, passwd )
-        filename = File.basename(bpath)
-        uniqdir = Utils.create_uniq_name
-        ftp_filepath = File.join(uniqdir, filename)
-
-        begin
-            ftp = Net::FTP.new
-            if port.nil? or port == "" then
-                ftp.connect(ip)
-            else
-                ftp.connect(ip, port)                                 
-            end
-                       @log.info "[FTP log] Connected FTP server (#{ip}:#{port})"
-            ftp.login(username, passwd)
-            ftp.binary = true
-                       ftp.passive = true                      
-            ftp.mkdir(uniqdir)
-            ftp.chdir(uniqdir)
-            ftp.put(bpath)
-                       @log.info "[FTP log] Put a file"
-                       @log.info "[FTP log]   from \"#{bpath}\" to \"#{ftp_filepath}\""                        
-                       files = ftp.list(filename)
-                       if files.empty? then 
-                               @log.error "[FTP log] Failed to upload file (#{filename} does not exist)"
-                               return nil      
-                       end
-            ftp.quit
-                       @log.info "[FTP log] Disconnected FTP server"
-        rescue => e
-                       @log.error "[FTP log] Exception"
-                       @log.error e.message
-                       @log.error e.backtrace.inspect
-                       return nil                      
-        end
-               return ftp_filepath
-    end
-
-    def getfile( bpath, target, ip, port, username, passwd )
-        dirname = File.dirname(bpath)
-        filename = File.basename(bpath)
-
-        # target can be directory or file
-        if File.directory? target then
-            dst_file = File.join(target,filename)
-        else
-            dst_file = target
-        end
-
-        begin
-            ftp = Net::FTP.new
-            if port.nil? or port == "" then
-                ftp.connect(ip)
-            else                
-                ftp.connect(ip, port)
-            end                
-                       @log.info "[FTP log] Connected FTP server (#{ip}:#{port})"
-            ftp.login(username, passwd)
-            ftp.binary = true
-                       ftp.passive = true
-            ftp.chdir(dirname)
-            ftp.get(filename, dst_file)
-                       @log.info "[FTP log] Get a file"
-                       @log.info "[FTP log]   from \"#{bpath}\" to \"#{dst_file}\""
-            ftp.quit
-                       @log.info "[FTP log] Disconnected FTP server"
-        rescue => e
-                       @log.error "[FTP log] Exception"
-                       @log.error e.message
-                       @log.error e.backtrace.inspect
-                       return nil                      
-               end
-               if not File.exist? dst_file then
-                       @log.error "[FTP log] Failed to download file (#{dst_file} does not exist)"
-                       return nil
-               end                             
-        return bpath
-    end
-
-    def cleandir(path, ip, port, username, passwd)
-        dirname = File.dirname(path)
-
-        begin
-            ftp = Net::FTP.new
-            if port.nil? or port == "" then
-                ftp.connect(ip)
-            else
-                ftp.connect(ip, port)                    
-            end                    
-                       @log.info "[FTP log] Connected FTP server (#{ip}:#{port})"
-            ftp.login(username, passwd)
-            old_dir = ftp.pwd
-            ftp.chdir(dirname)
-            list = ftp.ls
-            # TODO: if list is directory?
-            list.each do |l|
-                file = l.split(" ")[-1].strip
-                ftp.delete(file)
-            end
-            ftp.chdir(old_dir)
-            ftp.rmdir(dirname)
-                       @log.info "[FTP log] Clean dir (#{dirname})"                    
-            ftp.quit
-                       @log.info "[FTP log] Disconnected FTP server"
-        rescue => e
-                       @log.error "[FTP log] Exception"
-                       @log.error e.message
-                       @log.error e.backtrace.inspect
-                       return nil                      
-        end
-
-        return true
-       end
-end
index 2ad78e3c23f192c647cb1d471848233014438d9c..6ed2882a1166fd4cb0aa7f99567b593950853922 100644 (file)
@@ -4,7 +4,6 @@ $LOAD_PATH.unshift File.dirname(__FILE__)
 $LOAD_PATH.unshift File.dirname(File.dirname(__FILE__))+"/common" 
 $LOAD_PATH.unshift File.dirname(File.dirname(__FILE__))+"/build_server" 
 require "packageServerConfig"
-require "fileTransfer"
 require "BuildComm"
 require "net/ftp"
 
index a7e203475900b424b01466d944f47d822fc43381..0e2702c8a7e5afe598946dcde8a5477b6515af3f 100644 (file)
@@ -28,19 +28,23 @@ Contributors:
 
 require "fileutils"
 require "thread"
+require "net/ftp"
 $LOAD_PATH.unshift File.dirname(__FILE__)
 $LOAD_PATH.unshift File.dirname(File.dirname(__FILE__))+"/common"
 $LOAD_PATH.unshift File.dirname(File.dirname(__FILE__))+"/build_server"
 require "downloader"
 require "installer"
-require "fileTransfer"
 require "packageServerConfig"
 require "package"
 require "parser"
 require "utils"
 require "log"
 require "Version"
-require "net/ftp"
+require "BuildComm"
+require "FileTransferViaFTP"
+require "FileTransferViaDirect"
+
+
 $update_mutex = Mutex.new
 $get_snapshot_mutex = Mutex.new
 $filemove_mutex = Mutex.new
@@ -329,7 +333,7 @@ class Client
 
     public
     # upload package
-    def upload(ip, port, ftp_addr, ftp_port, ftp_username, ftp_passwd, binary_path_list)
+    def upload(ip, port, binary_path_list, ftp_addr=nil, ftp_port=nil, ftp_username=nil, ftp_passwd=nil)
 
            # check ip and port
            if ip.nil? or port.nil? then
@@ -365,7 +369,13 @@ class Client
             end
 
             begin
-                result = client.send_file(ftp_addr, ftp_port, ftp_username, ftp_passwd, bpath)
+                               if not ftp_addr.nil? then
+                                       transporter=FileTransferFTP.new(@log, ftp_addr, ftp_port, ftp_username, ftp_passwd)
+                               else
+                                       transporter=FileTransferDirect.new(@log)
+                               end
+
+                result = client.send_file(bpath, transporter)
             rescue => e
                 @log.error "FTP failed to put file (exception)"
                 @log.error "#{e.message}"
index 4aa083b570dfac9523847d1d045a995a74117626..83852c384328e3f3cd746168e9c7d70f3dab269d 100644 (file)
@@ -25,7 +25,7 @@ build-cli query-system -d <server address>
 build-cli query-project -d <server address>
 build-cli query-job -d <server address>
 build-cli cancel -j <job number> -d <server address> [-w <password>]
-build-cli register -P <package file> -d <server address>  -t <ftp server url> [-w <password>] [-D <distribution name>]
+build-cli register -P <package file> -d <server address>  [-t <ftp server url>] [-w <password>] [-D <distribution name>]
 
 Options:
 -N, --project <project name>     project name
index 408c7fdbc18d8baceb4b9f80dbc2ad7dd401a076..2dc34b0868028e72cf4f2f429fbdceacac8b51eb 100755 (executable)
@@ -8,7 +8,7 @@ rm -rf ~/.build_tools/build_server/testserver3
 ../../build-svr remove -n testserver3
 mkdir buildsvr01
 cd buildsvr01
-../../../build-svr create -n testserver3 -u `pwd`/../pkgsvr01/unstable -d 127.0.0.1:3333 -t ftp://ftpuser:ftpuser@127.0.0.1
+../../../build-svr create -n testserver3 -u `pwd`/../pkgsvr01/unstable -d 127.0.0.1:3333
 cd ..
 
 ../../build-svr add-svr -n testserver3 -d 127.0.0.1:2224
index c2c6aab8b78a94c6a59cace8fe22f8a9a335aa6c..1a9bac94ad87419258d33e81d63a79194227e19b 100644 (file)
@@ -30,7 +30,7 @@ set-attr      Set build server atribute.
 get-attr      Get build server atribute.
 
 Subcommand usage:
-build-svr create -n <server name> -t <ftp server url> [-u <package server url> -d <package server address>]
+build-svr create -n <server name> [-t <ftp server url>] [-u <package server url> -d <package server address>]
 build-svr remove -n <server name>
 build-svr start -n <server name> -p <port>
 build-svr stop -n <server name>
index d8e87d834e11c7aaee7e1d6895658bbb6b3f8e8f..c5ab0698bfbf8d32f45c0ca488ae11fb055fd5f5 100755 (executable)
@@ -4,7 +4,7 @@ rm -rf buildsvr02
 ../../build-svr remove -n testserver4
 mkdir buildsvr02
 cd buildsvr02
-ruby -d ../../../build-svr create -n testserver4 -t ftp://ftpuser:ftpuser@127.0.0.1
+ruby -d ../../../build-svr create -n testserver4
 cd ..
 ruby -d ../../build-svr add-dist -n testserver4 -D unstable -u `pwd`/pkgsvr01/unstable -d 127.0.0.1:3333