Patch title: Release 94 bulk changes
Abstract:
File: /pliant/fullpliant/export.pli
Key:
    Removed line
    Added line
   
module "/pliant/language/context.pli"
module "/pliant/language/stream.pli"
module "/pliant/language/context.pli"
module "/pliant/language/stream.pli"
module "/pliant/language/os.pli"
module "/pliant/admin/file.pli"
module "/pliant/admin/execute.pli"
module "/pliant/linux/kernel/module.pli"
module "/pliant/fullpliant/computer.pli"
module "/pliant/linux/schedule/process.pli"
module "/pliant/admin/file.pli"
module "/pliant/admin/execute.pli"
module "/pliant/linux/kernel/module.pli"
module "/pliant/fullpliant/computer.pli"
module "/pliant/linux/schedule/process.pli"
module "/pliant/language/stream/pipe.pli"
module "password.pli"




constant uid 65534
constant gid 65534

function export_init
  (var Stream s) open "embedded:/var/run/afpd.pid" out+mkdir
function export_init
  (var Stream s) open "embedded:/var/run/afpd.pid" out+mkdir
  file_configure "embedded:/var/run/afpd.pid" "uid "+string:
  # file_configure "embedded:/var/run/afpd.pid" "uid "+string:uid
  (var Stream s) open "embedded:/var/log/smb" in+out+mkdir+s
  (var Stream s) open "embedded:/var/log/smb" in+out+mkdir+s
  file_configure "embedded:/var/log/smb" "uid "+string:uid
  # file_configure "embedded:/var/log/smb" "uid "+string:uid
  (var AsciiFile h) load "embedded:/etc/hosts"
  part add_name
    for (var Int i) 0 h:size-1
      if (" "+(replace h:i "[tab]" " ")+" " search " "+compu
        leave add_name
    if name_ip:computer_fullname<>""
      h += name_ip:computer_fullname+" "+computer_name
      h store


function export_nfs_start
  (var AsciiFile h) load "embedded:/etc/hosts"
  part add_name
    for (var Int i) 0 h:size-1
      if (" "+(replace h:i "[tab]" " ")+" " search " "+compu
        leave add_name
    if name_ip:computer_fullname<>""
      h += name_ip:computer_fullname+" "+computer_name
      h store


function export_nfs_start
  var Str root := this_computer:env:"debian":"nfs":"root"
  if root=""
    root := shunt (file_query "file:/bin/rpc.nfsd" standard)=success "file:/" "embedded:/"
  # be warned: non root does not work
  if not (this_computer:env:"debian":"nfs":"user" parse (var Int uid))
    uid := os_getuid
  if not (this_computer:env:"debian":"nfs":"group" parse (var Int gid))
    gid := os_getgid
  if (file_query root+"var/lib/nfs/etab" standard)=failure
    (var Stream s) open root+"var/lib/nfs/etab" out+mkdir+safe ; s close
  if (file_query root+"var/lib/nfs/rmtab" standard)=failure
    (var Stream s) open root+"var/lib/nfs/rmtab" out+mkdir+safe ; s close
  kernel_load_module "sunrpc"
  kernel_load_module "lockd"
  kernel_load_module "nfsd"
  kernel_load_module "sunrpc"
  kernel_load_module "lockd"
  kernel_load_module "nfsd"
  execute "portmap" root "embedded:/" path "embedded:/" # us
  execute "portmap" root root path root user uid group gid
  sleep 1
  sleep 1
  execute "rpc.nfsd" root "embedded:/" path "embedded:/" # u
  (var Stream s) open "embedded:/etc/exports" out+mkdir+safe
  execute "rpc.nfsd" root root path root user uid group gid
  (var Stream s) open root+"etc/exports" out+mkdir+safe
  each c computer
    if c:env:"pliant":"system":"medium"="nfs"
      var Str ip := name_ip keyof:c
      if ip<>""
  each c computer
    if c:env:"pliant":"system":"medium"="nfs"
      var Str ip := name_ip keyof:c
      if ip<>""
        file_tree_create "embedded:/export/diskless/"+keyof:
        file_tree_create root+"export/diskless/"+keyof:c+"/"
        s writeline "/export/diskless/"+keyof:c+" "+ip+"(rw,
  each e this_computer:env:"export"
    if e:"protocol"="nfs" or e:"protocol"="all"
      file_tree_create e:"path"
        s writeline "/export/diskless/"+keyof:c+" "+ip+"(rw,
  each e this_computer:env:"export"
    if e:"protocol"="nfs" or e:"protocol"="all"
      file_tree_create e:"path"
      if ((file_os_name e:"path") parse (pattern file_os_nam
        var Str mode := "("+(shunt e:"mode"="rw" "rw" "ro")+
      if ((file_os_name e:"path") parse (pattern file_os_name:root) any:(var Str subpath))
        var Str mode := "("+(shunt e:"mode"="rw" "rw" "ro")+","+(e:"options" option "nfs" Str "async")+")"
        s writeline "/"+subpath+" "+(replace e:"ip" " " mode
      else
        console "Cannot export " e:"path" " through NFS sinc
  plugin nfs_configure
  s close
        s writeline "/"+subpath+" "+(replace e:"ip" " " mode
      else
        console "Cannot export " e:"path" " through NFS sinc
  plugin nfs_configure
  s close
  execute "rpc.mountd" root "embedded:/" path "embedded:/" #
  execute "rpc.mountd --no-nfs-version 3 --port 112" root root path root user uid group gid
  sleep 1
  sleep 1
  execute "exportfs -a" root "embedded:/" path "embedded:/" 
  execute "exportfs -a" root root path root user uid group gid




function export_password user password
  arg Str user password
  var Str root := this_computer:env:"debian":"samba":"root"
  if root=""
    root := shunt (file_query "file:/bin/smbd" standard)=success "file:/" "embedded:/"
  if not (this_computer:env:"debian":"samba":"user" parse (var Int uid))
    uid := os_getuid
  if not (this_computer:env:"debian":"samba":"group" parse (var Int gid))
    gid := os_getgid
  part create_user
    (var Stream passwd) open root+"etc/passwd" in+safe
    while not passwd:atend
      if (passwd:readline parse any:(var Str user_name) ":" any ":" (var Int user_id) ":" any) and user_name=user
        leave create_user
    (var Stream passwd) open root+"etc/passwd" append+safe
    passwd writeline user+":*:"+string:uid+":"+string:gid+":"+user+":/home/"+user+":/bin/sh"
    passwd close
  stream_pipe (var Str pipe_in) (var Str pipe_out)
  thread
    (var Stream pipe) open pipe_out out+safe
    pipe writeline password
    pipe writeline password
    pipe close
  execute "smbpasswd -L -a "+user+" -s" root root path root user uid group uid input pipe_in


function os_sethostname name len
  arg Address name ; arg Int len
  kernel_function 74

function export_samba_start
  var Str name := computer_name ; os_sethostname name:charac
function os_sethostname name len
  arg Address name ; arg Int len
  kernel_function 74

function export_samba_start
  var Str name := computer_name ; os_sethostname name:charac
  (var Stream s) open "embedded:/etc/samba/smb.conf" out+mkd
  var Str root := this_computer:env:"debian":"samba":"root"
  if root=""
    root := shunt (file_query "file:/bin/smbd" standard)=success "file:/" "embedded:/"
  if not (this_computer:env:"debian":"samba":"user" parse (var Int uid))
    uid := os_getuid
  if not (this_computer:env:"debian":"samba":"group" parse (var Int gid))
    gid := os_getgid
  if not (this_computer:env:"debian":"samba":"port" parse (var Int port))
    port := undefined
  (var Stream s) open root+"etc/samba/smb.conf" out+mkdir+safe
  s writeline "[lb]global[rb]"
  s writeline "  security = share"
  s writeline "[lb]global[rb]"
  s writeline "  security = share"
  # s writeline "  map to guest = Bad Password"
  # s writeline "  max connections = 0"
  s writeline ""
  var Str guest := this_computer:env:"debian":"samba":"guest_name"
  if guest=""
    if this_computer:env:"pliant":"system":"distribution"="fullpliant" and uid<>0
      (var Stream passwd) open root+"etc/passwd" in+safe
      while not passwd:atend
        if (passwd:readline parse any:(var Str user_name) ":" any ":" (var Int user_id) ":" any) and user_id=uid
          guest := user_name
  if guest<>""
    s writeline "  guest account = "+guest
  each e this_computer:env:"export"
    if e:"protocol"="samba" or e:"protocol"="all"
  each e this_computer:env:"export"
    if e:"protocol"="samba" or e:"protocol"="all"
      if ((file_os_name e:"path") parse (pattern file_os_nam
        file_tree_create e:"path"
      if ((file_os_name e:"path") parse (pattern file_os_name:root) any:(var Str subpath))
        if (file_query e:"path" standard+directories)=undefined
          file_tree_create e:"path"
          file_rights e:"path" uid gid 0 0
        s writeline ""
        s writeline "[lb]"+keyof:e+"[rb]"
        s writeline "  path = /"+subpath
        s writeline "[lb]"+keyof:e+"[rb]"
        s writeline "  path = /"+subpath
        s writeline "  public = yes"
        if e:"users"<>""
          var Str all := e:"users"
          var Str list := ""
          while all<>""
            if not (all parse any:(var Str user) _ any:(var Str remain))
              user := all ; remain := ""
            list += ", "+user
            if (password computer_fullname user)<>""
              export_password user (password computer_fullname user)
            all := remain
          s writeline "  valid users = "+(list 2 list:len)
        else
          s writeline "  public = yes"
        s writeline "  writable = "+(shunt e:"mode"="rw" "ye
        s writeline "  mangled names = no"
        if e:"ip"<>""
          s writeline "  hosts allow = "+e:"ip"
        s writeline "  writable = "+(shunt e:"mode"="rw" "ye
        s writeline "  mangled names = no"
        if e:"ip"<>""
          s writeline "  hosts allow = "+e:"ip"
        if (e:"options" option "samba" Str)<>""
          s writeline "  "+(e:"options" option "samba" Str)
      else
        console "Cannot export " e:"path" " through Samba si
  plugin samba_configure
  s close
      else
        console "Cannot export " e:"path" " through Samba si
  plugin samba_configure
  s close
  # execute "nmbd" root "embedded:/" path "embedded:/" # use
  execute "smbd" root "embedded:/" path "embedded:/" # user 
  execute "smbd"+(shunt port<>undefined " -p "+string:port "") root root path root user uid group gid


function export_netatalk_start
  (var Stream s) open "embedded:/etc/netatalk/afpd.conf" out
  s writeline export_netatalk_options
  s close
  (var Stream s) open "embedded:/etc/netatalk/AppleVolumes.s
  each e this_computer:env:"export"
    if e:"protocol"="netatalk" or e:"protocol"="all"
      if ((file_os_name e:"path") parse (pattern file_os_nam
        file_tree_create e:"path"
        # file_rights e:"path" undefined undefined 7*8^2+7*8
        s writeline "/"+subpath+" [dq]"+keyof:e+"[dq]"
        each ext e
          if (keyof:ext parse "extmap" any)
            s writeline ext
        # s writeline ".tif TIFF ArtW" # fix me
      else
        console "Cannot export " e:"path" " through Netatalk
  plugin netatalk_configure
  s close
  (var Stream s) open "embedded:/etc/netatalk/AppleVolumes.d
  s close


function export_netatalk_start
  (var Stream s) open "embedded:/etc/netatalk/afpd.conf" out
  s writeline export_netatalk_options
  s close
  (var Stream s) open "embedded:/etc/netatalk/AppleVolumes.s
  each e this_computer:env:"export"
    if e:"protocol"="netatalk" or e:"protocol"="all"
      if ((file_os_name e:"path") parse (pattern file_os_nam
        file_tree_create e:"path"
        # file_rights e:"path" undefined undefined 7*8^2+7*8
        s writeline "/"+subpath+" [dq]"+keyof:e+"[dq]"
        each ext e
          if (keyof:ext parse "extmap" any)
            s writeline ext
        # s writeline ".tif TIFF ArtW" # fix me
      else
        console "Cannot export " e:"path" " through Netatalk
  plugin netatalk_configure
  s close
  (var Stream s) open "embedded:/etc/netatalk/AppleVolumes.d
  s close
  # execute "afpd -noddp -c 25" root "embedded:/" path "embe
  execute "afpd -c "+string:export_netatalk_slot root "embed


  execute "afpd -c "+string:export_netatalk_slot root "embed


export export_init
export export_init export_password
export export_nfs_start export_nfs_stop export_nfs_test 
export export_nfs_start export_nfs_stop export_nfs_test 
export export_samba_start export_samba_stop export_samba_tes
export export_netatalk_options export_netatalk_slot export_n
export export_samba_start export_samba_stop export_samba_test
export export_netatalk_options export_netatalk_slot export_netatalk_start export_netatalk_stop export_netatalk_test