Patch title: Release 87 bulk changes
Abstract:
File: /pliant/install/recover.pli
Key:
    Removed line
    Added line
   
console "Starting Pliant, please wait ..."
module "minimal.pli"
module "/pliant/language/safe.pli"

module "/pliant/language/unsafe.pli"
module "/pliant/language/stream.pli"
module "/pliant/admin/file.pli"
module "/pliant/language/ui/ansi_terminal.pli"
module "/pliant/language/context.pli"
module "/pliant/language/os.pli"
module "/pliant/fullpliant/this_computer.pli"
module "/pliant/fullpliant/user.pli"
module "/pliant/admin/md5.pli"
console "[cr]"+(repeat 40 " ")+"[cr]"

gvar CBool failed := false

function notify_error msg
  console "ERROR: "+msg
  sleep 10
  os_exit 1

function checkup
  (var Stream s) open "security:/test.tmp" out+safe+mkdir
  if s=failure
    notify_error "This process cannot write to "+(file_os_name "security:/")
  s close
  file_delete "security:/test.tmp"
  (var Stream s) open "data:/test.tmp" out+safe+mkdir
  if s=failure
    notify_error "This process cannot write to "+(file_os_name "data:/")
  s close
  file_delete "data:/test.tmp"
  var Str temp := file_temporary
  (var Stream s) open temp out+safe+mkdir
  if s=failure
    notify_error "This process cannot write to "+file_os_name:temp
  s close
  file_delete temp

function welcome
  console eol
  console "PLIANT INSTALLATION" eol


function set_account
  var Str accounts := ""
  each u user_database:data:user
    each r u:right
      if r:auth="1" and (r:ip="" or r:ip="127.0.0.1") and r:server="" and r:right="administrator"
        accounts += (shunt accounts<>"" " " "")+keyof:u
  if accounts=""
    console eol
    console "You need an account to be able to connect to your Pliant HTTP" eol
    console "server through your favorite browser." eol
  else
    console eol
    console "You need an account to be able to connect to your Pliant HTTP" eol
    console "server through your favorite browser." eol
    console "The following existing accounts are ok:" eol
    console accounts eol
    console "Now you can: (i) define a new account, (ii) change an existing account, or" eol
    console "(iii) press Enter to skip." eol
  part input
    var Str user := keyboard_input "User ID: "
    if user=""
      if accounts<>""
        return
      else
        console "You must provide a user ID because there is no existing account." eol
        restart input
  part input2
    var Str password := keyboard_input_password "Password: "
    if password=""
      console "You must provide a password." eol
      restart input2
  user_database:data:user create user
  part scan
    var Data:User u :> user_database:data:user user
    each r u:right
      if r:auth="1" and (r:ip="" or r:ip="127.0.0.1") and r:server="" and r:right="administrator"
        leave scan
    var Str id := generate_id
    u:right create id
    var Data:UserRight r :> u:right id
    r auth := "1"
    r ip := "127.0.0.1"
    r right := "administrator"
  file_tree_create "security:/"
  user_database store
  user_secret_database:data:user create user
  user_secret_database:data:user:user password_md5 := string_md5_hexa_signature password
  user_secret_database store
  console eol


function set_port
  console eol
  console "About to define the TCP port the Pliant HTTP server will use." eol
  console "If you are not sure, then press Enter to select the default port." eol
  part scan
    for (var Int lap) -1 9
      var Int was := shunt lap=(-1) 80 8080+lap
      (var Stream s) open "tcp://127.0.0.1/client/"+string:was in+out+safe
      if s=failure
        (var Stream s) open "tcp:/server/"+string:was "noautoconnect" in+out+safe
        if s=success
          s close
          leave scan
    console "ERROR: Could not find a valid TCP port for the Pliant HTTP server." eol
    failed := true
    return
  if not ((keyboard_input "TCP port (default is "+string:was+"): ") parse (var Int port))
    port := was
  this_computer "pliant" "http" "port" := string port
  this_computer_database store


function set_level
  console eol
  console "Lastly, you can now specify the debugging level the to run the Pliant HTTP" eol
  console "server. Debugging level 1 is recommended for all but tiny computers with" eol
  console "less that 64 MB of memory." eol
  part input
    var Str level := keyboard_input "Debugging level (default is 1): "
    if level=""
      level := "1"
    if level<>"0" and level<>"1" and level<>"2"
      console "'" level "' is not a valid debugging level." eol
      restart input
  if os_api="win32" 
    var Str syspath := "file:"+(replace os_environment_variable:"SystemRoot" "\" "/")+"/system32/"
    if (file_query syspath standard+directories)=failure
      var Str syspath := "file:"+(replace os_environment_variable:"windir" "\" "/")+"/COMMAND/"
      if (file_query syspath standard+directories)=failure
        console "ERROR: Could not find system directory." eol
        failed := true
        return
    file_copy "/binary/pliant-debug"+level+".exe" "/install.exe"
    file_copy "/binary/pliant-debug"+level+".exe" "/run.exe"
    file_copy "/binary/pliant-debug"+level+".exe" syspath+"pliant.exe"
  else
    file_delete "/install" ; file_link "file:binary/pliant-debug"+level+".exe" "/install"
    file_delete "/run" ; file_link "file:binary/pliant-debug"+level+".exe" "/run"
    file_delete "file:/bin/pliant" ; file_link "/binary/pliant-debug"+level+".exe" "file:/bin/pliant"


function cleanup
  var Array:FileInfo files := file_list "/binary/" standard
  for (var Int i) 0 files:size-1
    if files:i:extension=".dump"
      file_delete files:i:name
  if this_computer:env:"pliant":"language":"optimizer"="gcc"
    this_computer:env:"pliant":"language" delete "optimizer"
  if (this_computer:env:"pliant":"memory":"assigned" parse (var Int mem)) and mem<64
    this_computer:env:"pliant":"memory" delete "assigned"
  if (this_computer:env:"pliant":"memory":"overflow" parse (var Int mem)) and mem<64
    this_computer:env:"pliant":"memory" delete "overflow"


function summary
  console eol
  var Str port :=  this_computer:env:"pliant":"http":"port"
  console "Congratulations, Pliant is now configured. You can now start the HTTP server" eol
  console "using the 'run' command. Then, using your favorite browser, connect to the" eol
  console "server via the URL http://localhost"+(shunt port="80" "" ":"+port)+"/" eol
  console eol


checkup
if not failed
  welcome
if not failed
  set_account
if not failed
  set_port
if not failed
  set_level
if not failed
  cleanup
if not failed
  summary
sleep 15