Patch title: Release 92 bulk changes
Abstract:
File: /fullpliant/recover.pli
Key:
    Removed line
    Added line
   
abstract
  [This is Pliant CDROM installation/recovery script.]

submodule "/pliant/fullpliant/computer.pli"
module "/pliant/language/compiler.pli"
module "/pliant/language/stream.pli"
module "/pliant/language/stream/filesystembase.pli"
module "/pliant/language/stream/multi.pli"
module "install.pli"
module "/pliant/admin/file.pli"
module "/pliant/admin/execute.pli"
module "/pliant/linux/storage/partition.pli"
module "/pliant/linux/storage/filesystem.pli"
module "/pliant/language/ui/ansi_terminal.pli"
module "/pliant/linux/kernel/shutdown.pli"
module "/pliant/linux/network/net.pli"
abstract
  [This is Pliant CDROM installation/recovery script.]

submodule "/pliant/fullpliant/computer.pli"
module "/pliant/language/compiler.pli"
module "/pliant/language/stream.pli"
module "/pliant/language/stream/filesystembase.pli"
module "/pliant/language/stream/multi.pli"
module "install.pli"
module "/pliant/admin/file.pli"
module "/pliant/admin/execute.pli"
module "/pliant/linux/storage/partition.pli"
module "/pliant/linux/storage/filesystem.pli"
module "/pliant/language/ui/ansi_terminal.pli"
module "/pliant/linux/kernel/shutdown.pli"
module "/pliant/linux/network/net.pli"
module "/pliant/linux/network/boot.pli"
module "/pliant/language/stream/tcp.pli"
module "/pliant/appli/database/light.pli"
module "/pliant/util/crypto/rsa.pli"
module "/pliant/util/network/ping.pli"
module "/pliant/protocol/dns/name.pli"
module "/pliant/protocol/http/site.pli"
module "/pliant/language/context.pli"


function recover_menu
  console eol
  console "PCI hardware content is:" eol
  display_hardware
  console eol
  console "FULLPLIANT INSTALL/RECOVERY UTILITY" eol
  console eol
  if this_computer:env:"pliant":"system":"medium"<>"cdrom"
    console "This utility must be executed from a CD" eol
    return
  var Str fullname ip mask route
  console "Current identity:" eol
  for (var Int i) 0 2
    var Str root := shunt i=0 "md0" i=1 "hda1" i=2 "sda1" ""
    if fullname=""
      if (is_partition "device:/"+root) and (filesystem_moun
        pliant_multi_file_system mount "target:/" "file:/mnt
        if (data_read "target:/pliant_security/this_computer
          fullname := name+"."+domain
          console "  computer name is " fullname eol
          computer_fullname := fullname
          if (data_read "target:/pliant_security/name.pdb" "
            console "  IP is " ip eol
            net_shutdown "eth0"
            if (net_configure "eth0" ip+"/255.255.255.0")=fa
              console "Failed to reconfigure network card." 
          if (data_read "target:/pliant_security/this_comput
            console "  default route is " route eol
            if (net_route "0.0.0.0/0.0.0.0" route)=failure
              console "Failed to set default route." eol
            console "  " (shunt (net_ping "212.180.52.85")=s
          var CBool matched := false
          if (data_read "target:/pliant_security/name.pdb" "
            if (data_read "target:/pliant_security/name_secr
              console "  found " rsa_nbbits:public_key " bit
              site_database:data:site delete fullname
              site_secret_database:data:site delete fullname
              name_database:data:host create fullname
              name_database:data:host:fullname public_key :=
              name_secret_database:data:host create fullname
              name_secret_database:data:host:fullname privat
              matched := (public_key parse word:"rsa" any:(v
          if not matched
            console "Could not find existing keys pair: gene
            rsa_generate "host:"+fullname 128 ""
        pliant_multi_file_system dismount "target:/"
        filesystem_dismount "file:/mnt/target/"
  console eol
  var Data:Computer c ; var Int count := 0
  console "Available computer models are: " eol
  each cc computer
    if (file_query "file:/fullpliant/archive/"+keyof:cc+".tg
      console "  " keyof:cc eol
      c :> cc ; count += 1   
  console eol
  if count<>1
    var Str cname := keyboard_input "Computer model: "
    c :> computer cname
    if not exists:c or (file_query "file:/fullpliant/archive
      console "There is no such a computer." eol
      return
    console eol
module "/pliant/language/stream/tcp.pli"
module "/pliant/appli/database/light.pli"
module "/pliant/util/crypto/rsa.pli"
module "/pliant/util/network/ping.pli"
module "/pliant/protocol/dns/name.pli"
module "/pliant/protocol/http/site.pli"
module "/pliant/language/context.pli"


function recover_menu
  console eol
  console "PCI hardware content is:" eol
  display_hardware
  console eol
  console "FULLPLIANT INSTALL/RECOVERY UTILITY" eol
  console eol
  if this_computer:env:"pliant":"system":"medium"<>"cdrom"
    console "This utility must be executed from a CD" eol
    return
  var Str fullname ip mask route
  console "Current identity:" eol
  for (var Int i) 0 2
    var Str root := shunt i=0 "md0" i=1 "hda1" i=2 "sda1" ""
    if fullname=""
      if (is_partition "device:/"+root) and (filesystem_moun
        pliant_multi_file_system mount "target:/" "file:/mnt
        if (data_read "target:/pliant_security/this_computer
          fullname := name+"."+domain
          console "  computer name is " fullname eol
          computer_fullname := fullname
          if (data_read "target:/pliant_security/name.pdb" "
            console "  IP is " ip eol
            net_shutdown "eth0"
            if (net_configure "eth0" ip+"/255.255.255.0")=fa
              console "Failed to reconfigure network card." 
          if (data_read "target:/pliant_security/this_comput
            console "  default route is " route eol
            if (net_route "0.0.0.0/0.0.0.0" route)=failure
              console "Failed to set default route." eol
            console "  " (shunt (net_ping "212.180.52.85")=s
          var CBool matched := false
          if (data_read "target:/pliant_security/name.pdb" "
            if (data_read "target:/pliant_security/name_secr
              console "  found " rsa_nbbits:public_key " bit
              site_database:data:site delete fullname
              site_secret_database:data:site delete fullname
              name_database:data:host create fullname
              name_database:data:host:fullname public_key :=
              name_secret_database:data:host create fullname
              name_secret_database:data:host:fullname privat
              matched := (public_key parse word:"rsa" any:(v
          if not matched
            console "Could not find existing keys pair: gene
            rsa_generate "host:"+fullname 128 ""
        pliant_multi_file_system dismount "target:/"
        filesystem_dismount "file:/mnt/target/"
  console eol
  var Data:Computer c ; var Int count := 0
  console "Available computer models are: " eol
  each cc computer
    if (file_query "file:/fullpliant/archive/"+keyof:cc+".tg
      console "  " keyof:cc eol
      c :> cc ; count += 1   
  console eol
  if count<>1
    var Str cname := keyboard_input "Computer model: "
    c :> computer cname
    if not exists:c or (file_query "file:/fullpliant/archive
      console "There is no such a computer." eol
      return
    console eol
  var Str new_fullname := keyboard_input "Computer name: "
  if new_fullname<>"" or fullname=""
  var CBool canonical := false
  if { var Str new_fullname := keyboard_input "Computer name: " ; new_fullname<>"" }
    fullname := new_fullname
    if (fullname search "." -1)=(-1)
      console "The name must be something like "+fullname+".
      return
    computer_fullname := fullname
    fullname := new_fullname
    if (fullname search "." -1)=(-1)
      console "The name must be something like "+fullname+".
      return
    computer_fullname := fullname
  var Str new_ip := keyboard_input "IP: "
  if new_ip<>"" or ip=""
  eif fullname=""
    canonical := true
    fullname := keyof c
    computer_fullname := keyof c
  if canonical
    each t computer:fullname:env
      if (keyof:t parse "net_" any)
        this_computer:env create keyof:t
        data_copy t (this_computer:env keyof:t)
    net_boot
    console (shunt (net_ping "212.180.52.85")=success "Internet connection is ok." "INTERNET CONNECTION IS BROKEN !") eol
  eif { var Str new_ip := keyboard_input "IP: " ; new_ip<>"" }
    ip := new_ip
    var Str mask := keyboard_input "mask: "
    net_shutdown "eth0"
    if (net_configure "eth0" ip+"/"+mask)=success
      console "Network card is configured." eol
    else
      console "Failed to reconfigure network card." eol
    route := keyboard_input "Default route: "
    if route<>""
      if (net_route "0.0.0.0/0.0.0.0" route)=success
        console "Default route is ok." eol
      else
        console "Failed to set default route." eol
      console (shunt (net_ping "212.180.52.85")=success "Int
  part menu
    console eol
    console "Possible actions are: command check parted part
    console "If you select 'partition', all datas on all dis
    console "If you select 'format', all datas on the "+c:en
    console "If you select 'install', your programs and conf
    console "If you select 'recover', only programs should b
    console "If you select 'setup', only computer name, IP a
    console "Anyway, nothing is granted." eol
    console eol
    var Str action := keyboard_input "action: "
    console eol
    if action="command"
      var Link:List program :> new List
      while { var Str l := keyboard_input "> " ; l<>"" }
        program append addressof:(new Str l)
      pliant_compiler_semaphore request
      var Link:Module module :> new Module
      module name := "recover"
      module include the_module:"/pliant/language/basic/safe
      module include the_module:"/pliant/language/compiler.p
      module include the_module:"/pliant/admin/file.pli"
      module include the_module:"/pliant/admin/execute.pli"
      error_push_record (var ErrorRecord e) error_filter_all
      compile_text program module
      var Str err := shunt e:id<>error_id_noerror e:message 
      e id := error_id_noerror
      error_pull_record e
      pliant_compiler_semaphore release
      if err<>""
        console err eol
      restart menu
    eif action="check"
      filesystem_mount c:env:"partition":"root":"device" "fi
      filesystem_dismount "file:/mnt/target/"
      restart menu
    eif (action parse word:"check" any:(var Str device))
      filesystem_mount device "file:/mnt/target/" "check rea
      filesystem_dismount "file:/mnt/target/"
      restart menu
    eif action="parted"
      execute "parted"
      restart menu
    eif action="partition" or action="format" or action="ins
      recover c action "fullname "+string:fullname+" ip "+st
    else
      console "Unsupported action specifyed." eol
      restart menu


  
export display_hardware recover_menu downgrade
    ip := new_ip
    var Str mask := keyboard_input "mask: "
    net_shutdown "eth0"
    if (net_configure "eth0" ip+"/"+mask)=success
      console "Network card is configured." eol
    else
      console "Failed to reconfigure network card." eol
    route := keyboard_input "Default route: "
    if route<>""
      if (net_route "0.0.0.0/0.0.0.0" route)=success
        console "Default route is ok." eol
      else
        console "Failed to set default route." eol
      console (shunt (net_ping "212.180.52.85")=success "Int
  part menu
    console eol
    console "Possible actions are: command check parted part
    console "If you select 'partition', all datas on all dis
    console "If you select 'format', all datas on the "+c:en
    console "If you select 'install', your programs and conf
    console "If you select 'recover', only programs should b
    console "If you select 'setup', only computer name, IP a
    console "Anyway, nothing is granted." eol
    console eol
    var Str action := keyboard_input "action: "
    console eol
    if action="command"
      var Link:List program :> new List
      while { var Str l := keyboard_input "> " ; l<>"" }
        program append addressof:(new Str l)
      pliant_compiler_semaphore request
      var Link:Module module :> new Module
      module name := "recover"
      module include the_module:"/pliant/language/basic/safe
      module include the_module:"/pliant/language/compiler.p
      module include the_module:"/pliant/admin/file.pli"
      module include the_module:"/pliant/admin/execute.pli"
      error_push_record (var ErrorRecord e) error_filter_all
      compile_text program module
      var Str err := shunt e:id<>error_id_noerror e:message 
      e id := error_id_noerror
      error_pull_record e
      pliant_compiler_semaphore release
      if err<>""
        console err eol
      restart menu
    eif action="check"
      filesystem_mount c:env:"partition":"root":"device" "fi
      filesystem_dismount "file:/mnt/target/"
      restart menu
    eif (action parse word:"check" any:(var Str device))
      filesystem_mount device "file:/mnt/target/" "check rea
      filesystem_dismount "file:/mnt/target/"
      restart menu
    eif action="parted"
      execute "parted"
      restart menu
    eif action="partition" or action="format" or action="ins
      recover c action "fullname "+string:fullname+" ip "+st
    else
      console "Unsupported action specifyed." eol
      restart menu


  
export display_hardware recover_menu downgrade