diff options
Diffstat (limited to 'lib/sisu/v2/remote.rb')
| -rw-r--r-- | lib/sisu/v2/remote.rb | 219 | 
1 files changed, 219 insertions, 0 deletions
| diff --git a/lib/sisu/v2/remote.rb b/lib/sisu/v2/remote.rb new file mode 100644 index 00000000..b46202b7 --- /dev/null +++ b/lib/sisu/v2/remote.rb @@ -0,0 +1,219 @@ +# coding: utf-8 +=begin + + * Name: SiSU + + * Description: a framework for document structuring, publishing and search + + * Author: Ralph Amissah + + * Copyright: (C) 1997 - 2010, Ralph Amissah, All Rights Reserved. + + * License: GPL 3 or later: + +   SiSU, a framework for document structuring, publishing and search + +   Copyright (C) Ralph Amissah + +   This program is free software: you can redistribute it and/or modify it +   under the terms of the GNU General Public License as published by the Free +   Software Foundation, either version 3 of the License, or (at your option) +   any later version. + +   This program is distributed in the hope that it will be useful, but WITHOUT +   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +   FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +   more details. + +   You should have received a copy of the GNU General Public License along with +   this program. If not, see <http://www.gnu.org/licenses/>. + +   If you have Internet connection, the latest version of the GPL should be +   available at these locations: +   <http://www.fsf.org/licensing/licenses/gpl.html> +   <http://www.gnu.org/licenses/gpl.html> + +   <http://www.jus.uio.no/sisu/gpl.fsf/toc.html> +   <http://www.jus.uio.no/sisu/gpl.fsf/doc.html> +   <http://www.jus.uio.no/sisu/gpl.fsf/plain.txt> + + * SiSU uses: +   * Standard SiSU markup syntax, +   * Standard SiSU meta-markup syntax, and the +   * Standard SiSU object citation numbering and system + + * Hompages: +   <http://www.jus.uio.no/sisu> +   <http://www.sisudoc.org> + + * Download: +   <http://www.jus.uio.no/sisu/SiSU/download.html> + + * Ralph Amissah +   <ralph@amissah.com> +   <ralph.amissah@gmail.com> + + ** Description: remote operations, get source from or copy output to remote server + +=end +module SiSU_Remote +  require "#{SiSU_lib}/sysenv"                             # sysenv.rb +    include SiSU_Env +  pwd=Dir.pwd +  class Put +    def initialize(opt) +      @opt=opt +      @dir=SiSU_Env::Info_env.new(@opt.fns) +      @put=unless @opt.fns =~/\.ssm\.sst$/; @opt.fns +      else @opt.fns.gsub(/(.+)?\.ssm\.sst$/,'\1.ssm') +      end +      @remote=SiSU_Env::Info_remote.new(@opt) +    end +    def rsync +      tell=SiSU_Screen::Ansi.new(@opt.cmd,'Remote placement ->',@put) +      tell.dark_grey_title_hi unless @opt.cmd =~/q/ +      @remote.rsync +    end +    def rsync_base +      tell=SiSU_Screen::Ansi.new(@opt.cmd,'Remote placement ->','rsync') +      tell.dark_grey_title_hi unless @opt.cmd =~/q/ +      @remote.rsync_base +    end +    def rsync_base_sync +      tell=SiSU_Screen::Ansi.new(@opt.cmd,'Remote placement ->','rsync and sync') +      tell.dark_grey_title_hi unless @opt.cmd =~/q/ +      @remote.rsync_base_sync +    end +    def rsync_sitemaps +      tell=SiSU_Screen::Ansi.new(@opt.cmd,'Remote placement sitemaps ->','rsync') +      tell.dark_grey_title_hi unless @opt.cmd =~/q/ +      @remote.rsync_sitemaps +    end +    def rsync_harvest +      tell=SiSU_Screen::Ansi.new(@opt.cmd,'Remote placement metadata harvest ->','rsync_harvest') +      tell.dark_grey_title_hi unless @opt.cmd =~/q/ +      @remote.rsync_harvest +    end +    def scp +      tell=SiSU_Screen::Ansi.new(@opt.cmd,'Remote placement ->',@put) +      tell.dark_grey_title_hi unless @opt.cmd =~/q/ +      @remote.scp +    end +    def scp_base +      tell=SiSU_Screen::Ansi.new(@opt.cmd,'Remote placement of base site ->','excluding images') +      tell.dark_grey_title_hi unless @opt.cmd =~/q/ +      @remote.scp_base +    end +    def scp_base_all +      tell=SiSU_Screen::Ansi.new(@opt.cmd,'Remote placement ->','complete') +      tell.dark_grey_title_hi unless @opt.cmd =~/q/ +      @remote.scp_base_all +    end +  end +  class Get +    def initialize(opt,get_s) +      @opt,@get_s=opt,get_s +      @msg,@msgs='',nil +      @tell=lambda { SiSU_Screen::Ansi.new(@opt.cmd,@msg,"#{@msgs.inspect if @msgs}") } +    end +    def fns +      require 'open-uri' +      require 'pp' +      require "#{SiSU_lib}/composite"                      # composite.rb +      @rgx_image=/(?:^|[^_\\])\{\s*(\S+?\.(?:png|jpg|gif))/ +      @rgx_skin=/@skin:\s+(\S+)/ +      threads=[] +      for requested_page in @get_s +        re_fnb=/((?:https?|file):\/\/[^\/ ]+?\/[^\/ ]+?)\/\S+?\/([^\/]+?)\.ss(t)/ #revisit and remove DO +        threads << Thread.new(requested_page) do |url| +          open(url) do |f| +            raise "#{url} not found" unless f +            base_uri,fnb,instr=re_fnb.match(url)[1..3] if re_fnb +            imagedir=base_uri + '/_sisu/image' #check on +            doc_skin_dir = /((?:https?|file):\/\/\S+?)\/[^\/]+?\.sst$/.match(url).captures.join + '/_sisu/skin/doc' +            downloaded_file=File.new("#{fnb}.-sst",'w+') +            image_download_url=SiSU_Assemble::Remote_image.new.image(imagedir) +            images=[] +            skin=SiSU_Assemble::Remote_image.new.image(doc_skin_dir) +            f.collect.each do |r|                            # work area +              unless r =~/^%+\s/ +                skin << r.scan(@rgx_skin).uniq if r =~@rgx_skin +                if r !~/^%+\s/ \ +                and r =~@rgx_image +                  images << r.scan(@rgx_image).uniq +                end +              end +              downloaded_file << r +            end +            if skin \ +            and skin.length > 0 +              SiSU_Assemble::Remote_image.new.download_doc_skin(skin) +            end +            if images \ +            and images.length > 1 +              images.flatten! +              images.uniq! +              images.delete_if {|x| x =~/http:\/\// } +              images.sort! +              @msg,@msgs='downloading images:', [ images.join(',') ] +              @tell.call.warn unless @opt.cmd =~/q/ +              SiSU_Assemble::Remote_image.new.download_images(image_download_url,images) +              @msg,@msgs='downloading done',nil +              @tell.call.warn unless @opt.cmd =~/q/ +            end +            downloaded_file.close +          end +        end +      end +      threads.each {|thr| thr.join} if threads #and threads.length > 0 +    end +    def sisupod +      get_p=@get_s +      if get_p.length > 0                                     #% remote sisupod +         require 'net/http' +        for requested_pod in get_p +          pod_info=Remote_download.new(requested_pod) +          @opt.fns=pod_info.pod.name +          Net::HTTP.start(pod_info.pod.site) do |http| +            resp=http.get("#{pod_info.pod.path}/#{pod_info.pod.name_source}") +            open(pod_info.pod.name,'wb') do |file| +              file.write(resp.body) +             end +          end +        end +      end +    end +  end +  class Remote_download +    def initialize(requested_file) +      @requested_file=requested_file +    end +    def pod +      re_p_div=/http:\/\/([^\/]+)(\/\S+)\/(sisupod(?:\.zip)?|\S+?(?:\.ss[mt]\.zip)?|[^\/]+?\.ssp)$/ +      re_p=/(sisupod(?:\.zip)?|\S+?\.ss[mt](?:\.zip)?|[^\/]+?\.ssp)$/ +      if @requested_file =~ re_p_div +        @site,@pth,@pod= re_p_div.match(@requested_file).captures +      elsif @requested_file =~ re_p +        @pod= re_p.match(@requested_file).captures +      end +      def site +        @site +      end +      def path +        @pth +      end +      def dir_stub +        re_p_stub=/.+?([^\/]+)$/ +        pod_stub= re_p_stub.match(path).captures.join if path +      end +      def name_source +        @pod +      end +      def name +        name_source +      end +      self +    end +  end +end +__END__ | 
