diff options
Diffstat (limited to 'lib/sisu/v4/remote.rb')
-rw-r--r-- | lib/sisu/v4/remote.rb | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/lib/sisu/v4/remote.rb b/lib/sisu/v4/remote.rb new file mode 100644 index 00000000..d593f44b --- /dev/null +++ b/lib/sisu/v4/remote.rb @@ -0,0 +1,202 @@ +# encoding: utf-8 +=begin + + * Name: SiSU + + * Description: a framework for document structuring, publishing and search + + * Author: Ralph Amissah + + * Copyright: (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, + 2007, 2008, 2009, 2010, 2011, 2012 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.sisudoc.org/sisu/en/manifest/gpl.fsf.html> + + * 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.sisudoc.org/sisu/en/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_relative 'sysenv' # sysenv.rb + include SiSU_Env + pwd=Dir.pwd + class Put + def initialize(opt) + @opt=opt + @dir=SiSU_Env::InfoEnv.new(@opt.fns) + @put=(@opt.fns =~/\.ssm\.sst$/) \ + ? @opt.fns.gsub(/(.+)?\.ssm\.sst$/,'\1.ssm') + : @opt.fns + @remote=SiSU_Env::InfoRemote.new(@opt) + end + def rsync + SiSU_Screen::Ansi.new(@opt.cmd,'Remote placement ->',@put).dark_grey_title_hi unless @opt.cmd =~/q/ + @remote.rsync.document + end + def rsync_base + SiSU_Screen::Ansi.new(@opt.cmd,'Remote placement ->','rsync').dark_grey_title_hi unless @opt.cmd =~/q/ + @remote.rsync.site_base + end + def rsync_base_sync + SiSU_Screen::Ansi.new(@opt.cmd,'Remote placement ->','rsync and sync').dark_grey_title_hi unless @opt.cmd =~/q/ + @remote.rsync.site_base_sync + end + def rsync_sitemaps + SiSU_Screen::Ansi.new(@opt.cmd,'Remote placement sitemaps ->','rsync').dark_grey_title_hi unless @opt.cmd =~/q/ + @remote.rsync_sitemaps + end + def rsync_harvest + SiSU_Screen::Ansi.new(@opt.cmd,'Remote placement metadata harvest ->','rsync_harvest').dark_grey_title_hi unless @opt.cmd =~/q/ + @remote.rsync_harvest + end + def scp + SiSU_Screen::Ansi.new(@opt.cmd,'Remote placement ->',@put).dark_grey_title_hi unless @opt.cmd =~/q/ + @remote.scp.document + end + def scp_base + SiSU_Screen::Ansi.new(@opt.cmd,'Remote placement of base site ->','excluding images').dark_grey_title_hi unless @opt.cmd =~/q/ + @remote.scp.site_base + end + def scp_base_all + SiSU_Screen::Ansi.new(@opt.cmd,'Remote placement ->','complete').dark_grey_title_hi unless @opt.cmd =~/q/ + @remote.scp.site_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_relative 'composite' # composite.rb + @rgx_image=/(?:^|[^_\\])\{\s*(\S+?\.(?:png|jpg|gif))/ + 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 + downloaded_file=File.new("#{fnb}.-sst",'w+') + image_download_url=SiSU_Assemble::RemoteImage.new.image(imagedir) + images=[] + f.collect.each do |r| # work area + unless r =~/^%+\s/ + if r !~/^%+\s/ \ + and r =~@rgx_image + images << r.scan(@rgx_image).uniq + end + end + downloaded_file << r + end + if images \ + and images.length > 1 + images=images.flatten.uniq + images.delete_if {|x| x =~/https?:\/\// } + images=images.sort + @msg,@msgs='downloading images:', [ images.join(',') ] + @tell.call.warn unless @opt.cmd =~/q/ + image_info=image_download_url + images + SiSU_Assemble::RemoteImage.new.download_images(image_info) + #SiSU_Assemble::RemoteImage.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=RemoteDownload.new(requested_pod) + 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 RemoteDownload + def initialize(requested_file) + @requested_file=requested_file + end + def pod + re_p_div=/https?:\/\/([^\/]+)(\/\S+)\/(sisupod\.(?:txz|zip)|\S+?(?:\.ss[mt]\.(?:txz|zip))?|[^\/]+?\.ssp)$/ + re_p=/(sisupod\.(?:txz|zip)|\S+?\.ss[mt]\.(?:txz|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.join + 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__ |