Patch title: Release 91 bulk changes
Abstract:
File: /appli/backup/engine.pli
Key:
    Removed line
    Added line
   
# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
#
# This program is free software; you can redistribute it and
# modify it under the terms of the GNU General Public Licens
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be us
# but WITHOUT ANY WARRANTY; without even the implied warrant
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See 
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public 
# version 2 along with this program; if not, write to the Fr
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 

submodule "/pliant/appli/database.pli"
submodule "/pliant/appli/database/split.pli"
module "/pliant/language/unsafe.pli"
# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
#
# This program is free software; you can redistribute it and
# modify it under the terms of the GNU General Public Licens
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be us
# but WITHOUT ANY WARRANTY; without even the implied warrant
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See 
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public 
# version 2 along with this program; if not, write to the Fr
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 

submodule "/pliant/appli/database.pli"
submodule "/pliant/appli/database/split.pli"
module "/pliant/language/unsafe.pli"
module "/pliant/language/schedule/namedsem.pli"
module "/pliant/language/stream.pli"
module "/pliant/admin/file.pli"
module "/pliant/admin/md5.pli"
module "/pliant/language/stream.pli"
module "/pliant/admin/file.pli"
module "/pliant/admin/md5.pli"
module "/pliant/admin/execute.pli"
module "/pliant/linux/kernel/module.pli"
module "/pliant/fullpliant/this_computer.pli"
module "/pliant/util/crypto/intn.pli"
module "/pliant/linux/storage/cdrom.pli"
module "/pliant/linux/storage/filesystem.pli"


module "/pliant/fullpliant/this_computer.pli"
module "/pliant/util/crypto/intn.pli"
module "/pliant/linux/storage/cdrom.pli"
module "/pliant/linux/storage/filesystem.pli"


gvar Sem engraver_sem
gvar NamedSem engraver_sem

method l engrave options0 -> status
  arg_rw Data:BackupLine l ; arg Str options0 ; arg Extended

method l engrave options0 -> status
  arg_rw Data:BackupLine l ; arg Str options0 ; arg Extended
  if not engraver_sem:nowait_request
    return failure:"There CD engraver is already running !"
  var Str options := options0+" "+l:options
  var Str engraver := options option "engraver" Str
  var Str options := options0+" "+l:options
  var Str engraver := options option "engraver" Str
  var Str engraver_id := this_computer:env:"hardware":("engraver"+engraver):"id"
  if not (engraver_sem nowait_request engraver_id)
    return failure:"There CD engraver is already running !"
  var Str engraver_medium := this_computer:env:"hardware":("engraver"+engraver):"medium"
  if engraver_medium=""
    engraver_medium := "cd"
  if remote_engraving
    var Str remote_server := this_computer:env:"hardware":("
  if log_report
    var DateTime start := datetime
  var CBool temporary := options option "temporary"
  var Str id := keyof l
  var BackupMedium m
  m medium := l:medium_header+(string l:medium_counter)
  if not (this_computer:env:"hardware":("engraver"+engraver)
  if remote_engraving
    var Str remote_server := this_computer:env:"hardware":("
  if log_report
    var DateTime start := datetime
  var CBool temporary := options option "temporary"
  var Str id := keyof l
  var BackupMedium m
  m medium := l:medium_header+(string l:medium_counter)
  if not (this_computer:env:"hardware":("engraver"+engraver)
    cd_capacity := 650
    cd_capacity := shunt engraver_medium="dvd" 4812 650
  cd_capacity *= 2^20
  var Str all_options := options+" title "+(string m:medium)
  cd_capacity *= 2^20
  var Str all_options := options+" title "+(string m:medium)
  var Intn free_space := cd_capacity-2^20
  var Intn free_space := cd_capacity*99\100
  part backup
    m free_space := free_space
    m dir_space := shunt (options option "indirect") 1024+25
    m files := var List:FileInfo empty_list
    var CBool empty := true
    each a backup_database:data:area filter a:line:id:pendin
      a select id m empty
      empty := false
    var Intn expected := m complete
    if m:dict:size<>0
      if remote_engraving and remote_server<>""
        if true
          status := cdrom_remote_engrave m:files all_options
        else
          var Str isofile := file_temporary
          status := cdrom_image m:files all_options isofile
          if status=success
            cdrom_remote_record isofile all_options remote_s
          file_delete isofile
      else
        status := cdrom_engrave m:files all_options
      if status=failure
        if (status:message parse (var Intn real_size) any) a
          free_space -= real_size-cd_capacity+2^20
          restart backup
        else
          leave backup
      sleep 15
      if log_report
        var DateTime intermediate := datetime
      if remote_engraving and remote_server<>""
        cdrom_remote_mount remote_server engraver
      else
  part backup
    m free_space := free_space
    m dir_space := shunt (options option "indirect") 1024+25
    m files := var List:FileInfo empty_list
    var CBool empty := true
    each a backup_database:data:area filter a:line:id:pendin
      a select id m empty
      empty := false
    var Intn expected := m complete
    if m:dict:size<>0
      if remote_engraving and remote_server<>""
        if true
          status := cdrom_remote_engrave m:files all_options
        else
          var Str isofile := file_temporary
          status := cdrom_image m:files all_options isofile
          if status=success
            cdrom_remote_record isofile all_options remote_s
          file_delete isofile
      else
        status := cdrom_engrave m:files all_options
      if status=failure
        if (status:message parse (var Intn real_size) any) a
          free_space -= real_size-cd_capacity+2^20
          restart backup
        else
          leave backup
      sleep 15
      if log_report
        var DateTime intermediate := datetime
      if remote_engraving and remote_server<>""
        cdrom_remote_mount remote_server engraver
      else
        execute "insmod isofs" quiet
        kernel_load_module "isofs"
        if (filesystem_mount this_computer:env:"hardware":("
        if (filesystem_mount this_computer:env:"hardware":("
          engraver_sem release
          engraver_sem release engraver_id
          return (failure "Failed to mount CDROM device "+th
      if not temporary
        l medium_counter += 1
      var Intn succeeded := 0
      part control "Checking CD "+m:medium+" content"
        (var Stream log) open "file:/tmp/backup.log" out+saf
        log writeline "medium "+m:medium
        log writeline ""
        each a backup_database:data:area filter a:line:id:pe
          succeeded += a control id m "file:/mnt/backup"+eng
        log close
      l compute
      if remote_engraving and remote_server<>""
        cdrom_remote_dismount remote_server engraver
      else
        filesystem_dismount "file:/mnt/backup"+engraver+"/"
      if log_report
        var DateTime final := datetime
        (var Stream log) open "file:/log/backup.log" append+
        log writeline "timestamp "+string:datetime
        log writeline "medium "+m:medium
        if temporary
          log writeline "temporary"
        if remote_engraving and remote_server<>""
          log writeline "on "+remote_server
        log writeline "elapsed "+string:(cast intermediate:s
        if (options option "indirect") and (status:message p
          log writeline "iso9660 image "+string:iso+" ("+str
        log writeline "sucessfully engraved "+string:succeed
        if succeeded<>expected
          log writeline "FAILED TO ENGRAVE "+(string expecte
        log writeline ""
        log close  
      status := success
    else
      status := failure "There is nothing to backup"
  if status=failure and log_report
    (var Stream log) open "file:/log/backup.log" append+safe
    log writeline "timestamp "+string:datetime
    log writeline "failure "+status:message
    log writeline ""
    log close  
          return (failure "Failed to mount CDROM device "+th
      if not temporary
        l medium_counter += 1
      var Intn succeeded := 0
      part control "Checking CD "+m:medium+" content"
        (var Stream log) open "file:/tmp/backup.log" out+saf
        log writeline "medium "+m:medium
        log writeline ""
        each a backup_database:data:area filter a:line:id:pe
          succeeded += a control id m "file:/mnt/backup"+eng
        log close
      l compute
      if remote_engraving and remote_server<>""
        cdrom_remote_dismount remote_server engraver
      else
        filesystem_dismount "file:/mnt/backup"+engraver+"/"
      if log_report
        var DateTime final := datetime
        (var Stream log) open "file:/log/backup.log" append+
        log writeline "timestamp "+string:datetime
        log writeline "medium "+m:medium
        if temporary
          log writeline "temporary"
        if remote_engraving and remote_server<>""
          log writeline "on "+remote_server
        log writeline "elapsed "+string:(cast intermediate:s
        if (options option "indirect") and (status:message p
          log writeline "iso9660 image "+string:iso+" ("+str
        log writeline "sucessfully engraved "+string:succeed
        if succeeded<>expected
          log writeline "FAILED TO ENGRAVE "+(string expecte
        log writeline ""
        log close  
      status := success
    else
      status := failure "There is nothing to backup"
  if status=failure and log_report
    (var Stream log) open "file:/log/backup.log" append+safe
    log writeline "timestamp "+string:datetime
    log writeline "failure "+status:message
    log writeline ""
    log close  
  engraver_sem release
  engraver_sem release engraver_id



# rebuild database from CDs content
method l reprocess_cd -> status
  arg_rw Data:BackupLine l ; arg ExtendedStatus status
  var Str cd_label := filesystem_name this_computer:env:"har
  if cd_label=""
    return failure:"Cannot get the CD volume ID"
  if (cd_label 0 l:medium_header:len)<>l:medium_header
    return (failure "CD volume ID is '"+cd_label+"'")



# rebuild database from CDs content
method l reprocess_cd -> status
  arg_rw Data:BackupLine l ; arg ExtendedStatus status
  var Str cd_label := filesystem_name this_computer:env:"har
  if cd_label=""
    return failure:"Cannot get the CD volume ID"
  if (cd_label 0 l:medium_header:len)<>l:medium_header
    return (failure "CD volume ID is '"+cd_label+"'")
  execute "insmod isofs" quiet
  kernel_load_module "isofs"
  if (filesystem_mount this_computer:env:"hardware":"engrave
  if (filesystem_mount this_computer:env:"hardware":"engrave
    engraver_sem release
    return (failure "Failed to mount CDROM device "+this_com
  var Intn found := 0
  part control "Reprocessing CD "+cd_label+" content"
    each a backup_database:data:area
      var CBool concerned := false
      each ap a:path
        if (file_query "file:/mnt/backup/"+ap:logical standa
          concerned := true
      if concerned
        console "  processing area " keyof:a eol 
        each f a:file
          var FileInfo info := file_query "file:/mnt/backup/
          if info=success and info:size=f:size and (file_md5
            found += f size
            var Data:BackupFileLine fl :> f:line keyof:l
            if not exists:fl
              f:line create keyof:l
              fl :> f:line keyof:l
            if fl:medium<>cd_label
              fl datetime := f datetime
              fl size := f size
              fl sign := f sign
              fl when := undefined
              fl history := fl:history+(shunt fl:history<>""
              fl medium := cd_label
              fl failure := 0
        a compute
  l compute
  filesystem_dismount "file:/mnt/backup/"
  status := success
  status message := "found "+string:found+" up to data bytes


export '. reprocess_cd' backup_reprocess_cd
    return (failure "Failed to mount CDROM device "+this_com
  var Intn found := 0
  part control "Reprocessing CD "+cd_label+" content"
    each a backup_database:data:area
      var CBool concerned := false
      each ap a:path
        if (file_query "file:/mnt/backup/"+ap:logical standa
          concerned := true
      if concerned
        console "  processing area " keyof:a eol 
        each f a:file
          var FileInfo info := file_query "file:/mnt/backup/
          if info=success and info:size=f:size and (file_md5
            found += f size
            var Data:BackupFileLine fl :> f:line keyof:l
            if not exists:fl
              f:line create keyof:l
              fl :> f:line keyof:l
            if fl:medium<>cd_label
              fl datetime := f datetime
              fl size := f size
              fl sign := f sign
              fl when := undefined
              fl history := fl:history+(shunt fl:history<>""
              fl medium := cd_label
              fl failure := 0
        a compute
  l compute
  filesystem_dismount "file:/mnt/backup/"
  status := success
  status message := "found "+string:found+" up to data bytes


export '. reprocess_cd' backup_reprocess_cd