next up previous
Next: A.19 vc-httpd.setl Up: A. WEBeye Source Code Previous: A.17 vc-giver.setl

  
A.18 vc-go.setl

Called by parent program:
vc-restart.setl     (Section A.37 [vc-restart.setl])

Calls child program:
vc-toplev.setl     (Section A.42 [vc-toplev.setl])

Textually #includes:
vc-admin.setl     (Section A.1 [vc-admin.setl])

Source code: *

const yhwh = `vc-go.setl';
 
-- Start the Box
 
const my_lock = `vc-going';  -- lock file (mutex)
const vc_lock = `vc-lock';   -- Box's lock file
const vc_log  = `vc-log';    -- Box's log file
const vc_cmd  = `exec setl vc-toplev.setl';  -- Box's top-level program
const vc_link = `vc-link.html';  -- eventually points to pseudo-document
const vc_prefix = `CGI|';        -- pseudo-document ``magic'' convention
const vc_health = `vc-tcp/health';  -- host:port for Box's health check
 
var box_locktext;
 
 
commence;  -- acquire mutex or exit abnormally right away
 
interactive := system (`tty -s') = 0;
 
 
if (box_locktext := readlink vc_lock/= om then
  if interactive then
    printa (stderr, ``The Box's lock file still exists:'');
    printa (stderrrender_link (vc_lockbox_locktext));
    putc (stderr, `Shall I forcibly remove it? [n/y] ');
    if yes (`no') then
      clear_error;
      unlink (vc_lock);
      if last_error = no_error then
        printa (stderr, `Lock file ' + vc_lock + ` removed.');
      else
        printa (stderr, `Error "' + last_error + `" trying to remove ' +
                         vc_lock + `.');
        msg (`Abending.');
        finis (1);
      end if;
    else
      printa (stderr, `Lock file ' + vc_lock + ` not removed.');
      msg (`Exiting.');
      finis (0);
    end if;
  else
    msg (``Error - Box's lock file still exists:'');
    msg (render_link (vc_lockbox_locktext));
    msg (`Abending without starting the Box.');
    finis (1);
  end if;
end if;
 
if fexists vc_log then
  if interactive then
    printa (stderr, `The log file ' + vc_log + ` already exists.');
    putc (stderr, `Go ahead and clobber it? [n/y] ');
    if yes (`no') then
      printa (stderr, `Okay, ' + str vc_cmd + ` will clobber ' +
                                 vc_log + `.');
    else
      printa (stderr, `Okay, log file left intact.');
      printa (stderr, ``Try 'vc-restart' in order to save it and then'');
      printa (stderr, `start the Box again.');
      msg (`Exiting.');
      finis (0);
    end if;
  else
    msg (`Warning - ' + str vc_cmd + ` will clobber ' +
                        vc_log + `.');
  end if;
end if;
 
full_cmd := vc_cmd + ` > ' + vc_log + ` 2>&1';
msg (`Starting ' + str full_cmd + ` in the background ...');
system (full_cmd + ` &');
 
-- Wait for Box's lock to reappear
loop for ms in {10,20..250} while not lexists vc_lock do
  select (omms);  -- 10 + 20 + ... + 250 ms = 3.25 sec
end loop;
if (box_locktext := readlink vc_lock) = om then
  failure (`Box failed to create lock file ' + vc_lock + `.');
end if;
if interactive then
  printa (stderr, `Box has succeeded in creating its lock file:');
  printa (stderrrender_link (vc_lockbox_locktext));
end if;
 
-- Wait to see pseudo-document indicating that Box is up and available
--- magic-constants file?  vc-limits.setl?
interval := 100;  -- ms
limit := 100000;  -- ms
if interactive then
  printa (stderr, `Box initializing ... please wait (up to ' +
                   str (limit/1000) + ` sec.)');
end if;
loop for ms in {interval,2*interval..limitdoing
  flag := (content := getfile vc_link/= om and
          match (contentvc_prefix) = vc_prefix;
while not flag do
  select (ominterval);
  if interactive then
    putc (stderrfixed (ms/1000, 6, 1) + ` sec.\r');
  end if;
end loop;
if interactive then
  printa (stderr);
end if;
if not flag then
  failure (box() + ` failed to reach "running" state.');
end if;
 
-- Try to exercise its health check
if (hp := getfile vc_health) = om then
  failure (box() + ` failed to create file ' + str vc_health + `.');
end if;
-- hp is now the host:port designation of the health-check service
if (fd := open (hp, `socket')) = om then
  failure (box() + ` failed to open health-check service at ' + hp + `.');
end if;
if (line := getline fd/= `okthen
  failure (box() + ` failed health check, reason = ' + str line);
end if;
close (fd);
 
msg (box() + ` appears to be up and running normally.');
msg (`Done.');
if interactive then
  printa (stderr, `You may wish to "tail -f ' + vc_log +
                  `" for a while.');
end if;
finis (0);  -- release mutex and exit normally
 
 
proc yes (default);
  [ans] := split (getline stdin);
  ans ?:= default;
  return to_lower ans in {`y', `yes'};
end proc;
 
-- Fancy Box identifier
proc box();
  return `Box {' + render_link (vc_lockbox_locktext) + `}';
end proc;
 
proc failure (message);
  msg (message);
  msg (`Abending.');
  finis (1);
end proc;
 
#include ``vc-admin.setl''


next up previous
Next: A.19 vc-httpd.setl Up: A. WEBeye Source Code Previous: A.17 vc-giver.setl
David Bacon
1999-12-10