next up previous
Next: A.27 vc-model.setl Up: A. WEBeye Source Code Previous: A.25 vc-jumper.setl

  
A.26 vc-master.cgi

Source code: *

#! SETL_BIN/setl -k
 
-- This script should be placed in the Web server's cgi-bin directory or
-- equivalent, after SETL_BIN and VC_DIR are defined by configuration.
 
const vc_dir  = VC_DIR;  -- WEBeye home directory name
 
const vc_link = vc_dir+`/vc-link.html';
const fresh   = vc_dir+`/vc-fresh.html';
const broken  = vc_dir+`/vc-broken.html';
 
const vc_prefix  = `CGI|';  -- pseudo-document convention
 
magic := false;
 
-- Try up to 10 times to read through link.  The link file should
-- always exist after the first time the Box is started, except
-- very briefly during major life-cycle transitions when the Box is
-- shut down or restarted:
loop for i in {1..10} while (content := getfile vc_link) = om do
  select (om, 50);  -- wait 50 ms and try again
end loop;
 
if content = om then
  -- WEBeye Box probably never started
  put_document (getfile fresh);
 
elseif match (contentvc_prefix) = vc_prefix then
  -- Pseudo-document
  lookup := break (content, `|');  -- location of lookup service
  lookup_fd := open (lookup, `socket');
  if lookup_fd = om then
    -- Lookup server did not accept connection
    put_diagnostic_about (`lookup');
  else
    writea (lookup_fd, `httpd');
    reada (lookup_fd, [httpd_hosthttpd_port]);
    close (lookup_fd);
    httpd := httpd_host + `:' + str httpd_port;
    httpd_fd := open (httpd, `socket');
    if httpd_fd = om then
      -- WEBeye httpd server did not accept connection
      put_diagnostic_about (`httpd');
    else
      -- Construct HTTP request and send to WEBeye httpd
      query := getenv `PATH_INFO' + `?' + getenv `QUERY_STRING';
      printa (httpd_fd, `GET', query, `HTTP/1.0');
      printa (httpd_fd);
      if `HTTP/1.0 200 OKin (getline httpd_fd ? `') then
        -- Success - serve document returned by WEBeye httpd
        putchar (getfile httpd_fd);
      else
        -- WEBeye httpd up but not responding properly
        put_diagnostic_about (`httpd');
      end if;
      close (httpd_fd);
    end if;
  end if;
 
else
  -- Link points to a (static) real document
  put_document (content);
end if;
 
proc put_mime_headers;
  print (`Content-type: text/html');
  print;
end proc;
 
proc put_document (content);
  put_mime_headers;
  putchar (content);
end proc;
 
proc put_diagnostic_about (service_name);
  var content := getfile broken;
  gsub (content, `SERVICE', service_name);
  put_document (content);
end proc;


next up previous
Next: A.27 vc-model.setl Up: A. WEBeye Source Code Previous: A.25 vc-jumper.setl
David Bacon
1999-12-10