Patch title: Release 94 bulk changes
Abstract:
File: /pliant/fullpliant/rules.pli
Key:
    Removed line
    Added line
abstract
  [This module is applying the kind of macros that enable to specify a computer using a few items rather than the all set of individual settings.]

module "/pliant/language/stream.pli"
module "/pliant/language/context.pli"
module "/pliant/admin/md5.pli"
module "/pliant/protocol/http/server.pli"
module "/pliant/protocol/http/style/default.style"
module "debian.pli"
module "kernel.pli"
module "computer.pli"


method c study_hardware
  arg_rw Data:Computer c
  c "hardware" "memory" "capacity" := string (cast memory_physical\2^20 Int)
  var Int count := 0
  (var Stream s) open "file:/proc/cpuinfo" in+safe
  while not s:atend
    var Str l := s readline
    if (l parse "processor" ":" any)
      count += 1
    if (l parse "cpu" "family" ":" "6")
      c "hardware" "processor" "family" := "i386"
    if (l parse "cpu" "MHz" ":" (var Float mhz))
      c "hardware" "processor" "speed" := string (cast mhz Int)
    c "hardware" "processor" "count" := string (max count 1)


method c apply_component component instance log
  arg_rw Data:Computer c ; arg Str component ; arg Str instance ; arg_rw Stream log
  var Data:ComputerComponent cc :> computer_database:data:component:component
  each i cc:include
    c apply_component i instance log
  each v cc:variable
    c v:category (shunt v:instance<>"" v:instance instance) v:id := v value
    log writeline component+": "+v:category+" "+(shunt v:instance<>"" v:instance instance)+" "+v:id+" = "+v:value

method c apply_database_rules log
  arg_rw Data:Computer c ; arg_rw Stream log
  each cc c:content
    c apply_component cc:component cc:instance log


method c apply_extra_rules
  arg_rw Data:Computer c
  if (c:env:"hardware":"processor":"count" parse (var Int cpu)) and cpu>1
    c "kernel" "make" "CONFIG_SMP" := "y"
    c "package" "irqbalance" "version" := ""
    c "package" "irqbalance" "/usr/sbin/irqbalance" := "/bin/irqbalance"
  if not (c:env:"hardware":"memory":"capacity" parse (var Int mb))
    mb := undefined
  if true # 2.2 kernel
    c "kernel" "make" (shunt mb<=1024 "CONFIG_1GB" "CONFIG_2GB") := "y"
  if true # 2.4 kernel
    if mb<=1024
    if mb<800
      c "kernel" "make" "CONFIG_NOHIGHMEM" := "y"
    eif mb<=4096
      c "kernel" "make" "CONFIG_HIGHMEM" := "y"
      c "kernel" "make" "CONFIG_HIGHMEM4G" := "y"
    else
      c "kernel" "make" "CONFIG_HIGHMEM" := "y"
      c "kernel" "make" "CONFIG_HIGHMEM64G" := "y"



method temp save_variables c component instance
  arg_rw Data:Computer temp ; arg_rw Data:Computer c ; arg Str component instance
  var Data:ComputerComponent cc :> computer_database:data:component:component
  each v cc:variable
    if v:type<>""
      temp v:category (shunt v:instance<>"" v:instance instance) v:id := c v:category (shunt v:instance<>"" v:instance instance) v:id
  each i cc:include
    temp save_variables c i instance

method c compute reset logfile -> status
  arg_rw Data:Computer c ; arg CBool reset ; arg Str logfile ; arg ExtendedStatus status
  (var Stream log) open logfile out+safe
  if not reset
    var (Link Database:Computer) temp :> new Database:Computer
    each cc c:content
      temp:data save_variables c cc:component cc:instance
    each sw c:env:"software"
      if (exists sw:"status") and sw:size<>1
        temp:data "software" keyof:sw "status" := sw "status"
  data_reset c:env
  if (keyof:c parse any:(var Str name) "." any:(var Str domain))
    c "pliant" "identity" "name" := name
    c "pliant" "identity" "domain" := domain
  else
    c "pliant" "identity" "name" := keyof c
    c "pliant" "identity" "domain" := ""
  c apply_database_rules log
  if not reset
    each category temp:data:env
      each instance category
        each id instance
          c keyof:category keyof:instance keyof:id := id
          log writeline "restoring "+keyof:category+" "+keyof:instance+" "+keyof:id+" = "+id
  if computer_fullname=keyof:c
    c study_hardware
  c apply_extra_rules
  status := debian_select c
  c "kernel" "constant" "signature" := string_md5_hexa_signature (kernel_signature c true)

export '. compute'


#---------------------------------------------------------------------


method page rec_display_variables c component instance stack
  arg_rw HtmlPage page ; arg_rw Data:Computer c ; arg Str component instance stack
  implicit page
    if (stack search string:component+":"+string:instance -1)<>(-1)
      highlight "circular reference to "+component+" "+instance ; eol
      return  
    var Data:ComputerComponent cc :> computer_database:data:component:component
    if cc:title<>""
      para
        bold (text cc:title)
    each v cc:variable
      if v:type<>""
        var Data:Str value :> c v:category (shunt v:instance<>"" v:instance instance) v:id
        if (v:type parse word:"option" any)
          var Str options := v type
          select v:label+": " value
            var Int indice := 0
            while { var Int p := options option_position "option" indice -1 ; p<>(-1) }
              if ((options p options:len) parse "option" (var Str labeli) (var Str valuei) any)
                option labeli valuei
              indice += 1
        eif v:length=defined
          input v:label+": " value length v:length
        else
          input v:label+": " value
    each i cc:include
      rec_display_variables c i instance stack+" "+string:component+":"+string:instance

method page display_variables c component instance
  arg_rw HtmlPage page ; arg_rw Data:Computer c ; arg Str component instance
  page rec_display_variables c component instance ""

export '. display_variables'


method page display_kernel_settings c script
  arg_rw HtmlPage page ; arg_rw Data:Computer c ; arg Str script
  implicit page
    var Str name := script 0 (script search_last "/" script:len)
    part look_for_label
      var Str label
      for (var Int lap) 0 1
        part scan_lap
          (var Stream s) open "embedded:/usr/src/linux/"+script in+safe
          while not s:atend
            var Str l := s readline
            if (l parse word:"comment" "'" any:label "'" any)
              leave look_for_label
            if lap=1 and (l parse "#" any:label) and label<>""
              leave look_for_label
            if (l parse word:"bool" "'" any "'" any)
              leave scan_lap
            eif (l parse word:"tristate" "'" any "'" any)
              leave scan_lap
            eif (l parse word:"dep_tristate" "'" any "'" any)
              leave scan_lap
      label := ""
    if not (name parse any "/" any "/" any)
      header (shunt label<>"" label name)
    para
      bold text:name ; fixed [  ] ; italic text:label
    (var Stream s) open "embedded:/usr/src/linux/"+script in+safe
    while not s:atend
      var Str l := s readline
      var Str option default
      if (l parse word:"bool" "'" any:(var Str label) "'" _ any:option _ any) or (l parse word:"bool" "'" any "'" _ any:option)
        default := "n"
      eif (l parse word:"tristate" "'" any:(var Str label) "'" _ any:option _ any) or (l parse word:"tristate" "'" any "'" _ any:option)
        default := "n"
      eif (l parse word:"dep_tristate" "'" any:(var Str label) "'" _ any:option _ any) or (l parse word:"dep_tristate" "'" any "'" _ any:option)
        default := "n"
      eif (l parse word:"int" "'" any:(var Str label) "'" _ any:option _ any:default)
        void
      eif (l parse word:"string" "'" any:(var Str label) "'" _ any:option _ any:default)
        void
      else
        option := ""
      if option<>""
        var Str value := c:env:"kernel":"make":option
        if value="y"
          fixed text:(left option+" "+value 40 " ")
        eif value="m"
          font color (color hsl 240 100 50)
            fixed text:(left option+" "+value 40 " ")
        else
          font color (color hsl 0 0 50)
            fixed text:(left option+" "+value 40 " ")
        fixed [  ] ; italic (small text:label) ; fixed [  ]
        note "?"
          title label
          (var Stream help) open "embedded:/usr/src/linux/Documentation/Configure.help" in+safe
          var CBool inside := false
          while not help:atend
            var Str l := help readline
            if (l eparse "CONFIG_" any) and (l parse any:(var Str tag))
              inside := tag=option
            eif (l 0 2)="  "
              if inside
                text (l 2 l:len) ; eol
        eol
    (var Stream s) open "embedded:/usr/src/linux/"+script in+safe
    while not s:atend
      var Str l := s readline
      if (l parse word:"source" any:(var Str sub))
        display_kernel_settings c sub

method page display_kernel_settings c
  arg_rw HtmlPage page ; arg_rw Data:Computer c
  implicit page
    title "Kernel settings for '"+keyof:c+"'"
    display_kernel_settings c "arch/i386/config.in"

export '. display_kernel_settings'