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__ |