#!/usr/bin/env ruby
=begin
 * Name: SiSU - Simple information Structuring Universe - Structured information, Serialized Units
 * Author: Ralph Amissah
   * http://www.jus.uio.no/sisu
   * http://www.jus.uio.no/sisu/SiSU/download

 * Description: webrick share - note sisu by default does not link with file suffixes, see man pages for options
   * arch-tag: webrick
   * Date: $Date$
   * $Id$

 * Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Ralph Amissah

 * License: GPL 2 or later

  Summary of GPL 2

  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 2 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, write to the Free Software Foundation, Inc.,
  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA

  If you have Internet connection, the latest version of the GPL should be
  available at these locations:
    http://www.fsf.org/licenses/gpl.html
    http://www.gnu.org/copyleft/gpl.html
    http://www.jus.uio.no/sisu/gpl2.fsf

  SiSU was first released to the public on January 4th 2005

  SiSU uses:
  *  Standard SiSU markup syntax,
  *  Standard SiSU meta-markup syntax, and the
  *  Standard SiSU object citation numbering and system
  
  © Ralph Amissah 1997, current 2005.
  All Rights Reserved.

 * Ralph Amissah mailto:ralph@amissah.com
   Ralph Amissah mailto:amissah@gmail.com

=end
Version='0.37'
SiSU_lib="sisu/#{Version}"
require "#{SiSU_lib}/sysenv"
def brick(port,get='')
  cgidir=if get=~/pwd/: Dir.pwd
  else                  '/usr/lib/cgi-bin'
  end
  port=SiSU_Env::Info_port.new.webrick
  begin
    s=HTTPServer.new(
      :Port         => port,
      :DocumentRoot => Dir::pwd + '/htdocs',
      :CGIPathEnv   => ENV['PATH']
    )
    cgi_dir = File.expand_path(cgidir)
    @mount.each { |x,y|                                                        # mount subdirectories
      s.mount(x, HTTPServlet::FileHandler, y, true)
    }
    s.mount('/cgi-bin', HTTPServlet::FileHandler, cgi_dir, {:FancyIndexing=>true})
    #### mount subdirectories, true added to permit dir listing
    trap("INT"){ s.shutdown }
    s.start
  rescue: SiSU_Errors::Info_error.new($!,$@,'-W',nil).error #fix
  ensure
  end
end
begin                                                                          #% 
  require 'webrick'
  include WEBrick
  require 'time'
  require "#{SiSU_lib}/sysenv"
  include SiSU_Env
  include SiSU_Screen
  @cX=SiSU_Screen::Ansi.new('yes').cX
  @dir=SiSU_Env::Info_dir.new
  port=SiSU_Env::Info_port.new
  @argv=$*
  @host=ENV['HOSTNAME'] 
  #@host=%x{echo $HOSTNAME}.chomp! 
  host='localhost'
  @port="#{@argv[0].to_i}"
  @port="#{port.webrick}" if @port =~ /^0$/
  @serve=Array.new
  Dir.foreach(@dir.webserv_path) {|x| @serve << x if x !~/^\./ and FileTest.directory?("#{@dir.webserv_path}/#{x}") }
  @mount=Array.new
  @serve.each {|x| @mount << ["/#{x}", "#{@dir.webserv_path}/#{x}"]}
  #@serve.each {|x| @mount << ["/~#{x}", "#{@dir.webserv_path}/#{x}"]}
  @pwd=Dir.pwd
  @week=Time.now.strftime(%{%Yw%W})
  puts "\n"
  @mount.each { |x,y|
    puts "        #{@cX.cyan}#{x}#{@cX.off}\t#{@cX.grey}see#{@cX.off} #{@cX.blue}http://#@host:#@port#{x}/wb.cgi#{@cX.off} #{@cX.ruby}@#{@cX.off} #{@cX.blue}http://#@host:#@port#{x}/#{@cX.off}"
  }
  puts "#{@cX.grey}"
                                                          #%
  wb_s2=Array.new
                                                           #% writes file wb.cgi to shared directories ...
                                                           #% wb_top
  wb_top=%q(#!/usr/bin/env ruby
  # * arch-tag: webrick info on environment, mounted directories, and contents of pwd
  require 'time'
  require 'cgi'
  require 'fcgi'
  ls=Dir.entries('./')
  dir_contents=Array.new
  ls.each { |x| dir_contents << "<a href=\"./#{x}/\">#{x}</a><br>" unless x =~/^(\.)+$/ }
  dir_contents=dir_contents.sort.join(' ')
  #host=ENV['HOSTNAME']
  #host=%x{echo $HOSTNAME}
  )
                                                           #% wb_s1
  wb_s1=<<WOK

  page=CGI.new "html3"
  page.out {
    page.html {
      page.head { page.title {"#@host Webrick Report"} } +
      page.body {
        page.h1 {"Webrick #@host"} +
        page.p {"Webrick is Ruby's built in webserver."} + 
        page.center {"Host name: " + page.b{"#@host "} + "(#@host)  port: " + page.b{"#@port"}} + 
        page.center {"#{Time.now}"} + 
        page.center {"#{Time.now.strftime(%{%Yw%W})}"} + 
        #page.center { "Center " + page.em{"emphasise "} + page.i{"italicise " } + page.b{"bold "} + page.u{"underline "}} +
        page.p {''} + 
        page.p {''} + 
        page.p {page.b{"Webrick Served Directories: "}} +
WOK
                                                           #% wb_s2 (mounts)
  @mount.each do |x,y| wb_s2 <<<<WOK
        page.p {page.b{'<a href="http://#@host:#@port#{x}/">#{x}</a> '} + '<a href="http://#@host:#@port#{x}/">http://#@host:#@port#{x}</a> (mounts: #{y}/)   <a href="http://#@host:#@port#{x}/wb.cgi">info (wb.cgi)</a>'} +
WOK
end
                                                           #% wb_end
  wb_end=<<WOK
        page.p {page.b{"Contents of PWD (see URL): "}} +
        page.p {"#\{dir_contents}"} 
      }
    }
  }
WOK
  @mount.each { |x,y|                                      #% wb puts
    puts y
      filename=File.new("#{y}/wb.cgi", "w")
      filename << wb_top
      filename << wb_s1
      filename << wb_s2
      filename << wb_end
      filename.close
      system("chmod 755 #{y}/wb.cgi &") # use ruby to do this
  }
  puts "        #{@cX.off}"
  get=@argv.shift if @argv[0] =~/pwd/                      #% argv
  brick(@port,get)
rescue: SiSU_Errors::Info_error.new($!,$@,'-W',nil).error #fix
ensure
end

