// IfsBackupCmd2.bcpl -- operator interface for backup system // Copyright Xerox Corporation 1979, 1980, 1981 // Last modified October 4, 1981 4:12 PM by Taft get "Ifs.decl" get "IfsSystemInfo.decl" get "IfsFiles.decl" get "IfsBackup.decl" external [ // outgoing procedures BackupStatus; BackupChange; BackupEnable; BackupDisable BackupRepeat; BackupDontRepeat // incoming procedures GetString; GetNumber; BeginDefaultPhrase; EndDefaultPhrase EnableCatch; EndCatch; SelectKeyword CreateKeywordTable; DestroyKeywordTable; InsertKeyword; GetKeyword GetCreateParams; DestroyCreateParams; CreateIFS; CloseIFS VFileReadPage; VFileWritePage; LockCell; UnlockCell ParseDate; WritePackedDT; PutTemplate Free; Ws; Wss; Wns; Errors; MoveBlock; Mul; Div; Zero; IFSPrintError // incoming statics infoVMD; sysZone; dsp; backupRunning ] //---------------------------------------------------------------------------- let BackupEnable(cs) be BackupOnOff(true) //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- and BackupDisable(cs) be BackupOnOff(false) //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- and BackupOnOff(value) be //---------------------------------------------------------------------------- [ Ws(" (backup system)") let bi = VFileWritePage(infoVMD, biPage) bi>>BI.okToGo = value ] //---------------------------------------------------------------------------- and BackupRepeat(cs) be //---------------------------------------------------------------------------- [ Wss(cs, " (backups more recent than) ") let timeBackupAfter = vec 1 GetDate(cs, timeBackupAfter) MoveBlock(lv VFileWritePage(infoVMD, biPage)>>BI.timeBackupAfter, timeBackupAfter, 2) ] //---------------------------------------------------------------------------- and BackupDontRepeat(cs) be //---------------------------------------------------------------------------- [ SelectKeyword(cs, "Repeat") Ws(" (backups)") Zero(lv VFileWritePage(infoVMD, biPage)>>BI.timeBackupAfter, 2) ] //---------------------------------------------------------------------------- and BackupStatus(cs) be //---------------------------------------------------------------------------- [ let bi = VFileReadPage(infoVMD, biPage) LockCell(lv bi) PutTemplate(dsp, "*nBackup system is $S and $S.", (bi>>BI.okToGo? "enabled", "disabled"), (backupRunning? "running", "waiting")) if bi>>BI.inProgress then PutTemplate(dsp, "*n$S working on file $S.", (backupRunning? "Presently", "Interrupted while"), lv bi>>BI.pathName) PutTemplate(dsp, "*nBackup scheduled between $P and $P.", WritePackedDT, lv bi>>BI.timeStart, WritePackedDT, lv bi>>BI.timeStop) if bi>>BI.timeBackupAfter.h ne 0 then PutTemplate(dsp, "*nWill repeat backups more recent than $P.", WritePackedDT, lv bi>>BI.timeBackupAfter) for i = 0 to numBFSD-1 do [ let bfsd = lv bi>>BI.bfsd↑((bi>>BI.iBFSD+i) rem numBFSD) if bfsd>>BFSD.state eq bfsdEmpty loop PutTemplate(dsp, "*nFile system $S is ", lv bfsd>>BFSD.id) switchon bfsd>>BFSD.state into [ case bfsdUsable: [ Ws("available to backup system; ") PutTemplate(dsp, (bfsd>>BFSD.refresh? "to be re-initialized.", "$ED free pages."), lv bfsd>>BFSD.freePages) endcase ] case bfsdInUse: [ Ws("presently in use by backup system"); endcase ] case bfsdUsed: [ Ws("no longer usable by backup system*n --") IFSPrintError(dsp, bfsd>>BFSD.errorCode) endcase ] ] ] UnlockCell(lv bi) ] //---------------------------------------------------------------------------- and BackupChange(cs) be //---------------------------------------------------------------------------- [ Wss(cs, " (backup parameters)*nStart next backup at: ") let bi = nil if EnableCatch(cs) then [ UnlockCell(lv bi); EndCatch(cs) ] bi = VFileWritePage(infoVMD, biPage) LockCell(lv bi) let timeStart = vec 1 DefaultDate(cs, lv bi>>BI.timeStart) GetDate(cs, timeStart) Wss(cs, "*nStop next backup at: ") let timeStop = vec 1 DefaultDate(cs, lv bi>>BI.timeStop) GetDate(cs, timeStop) Wss(cs, "*nInterval between backup runs (hours): ") let timeInterval = vec 1 DefaultNumber(cs, Div(lv bi>>BI.timeInterval, 3600, timeInterval)) Mul(0, GetNumber(cs), 3600, timeInterval) Wss(cs, "*nFull file system dump period (days): ") let fullPeriod = vec 1 DefaultNumber(cs, Div(lv bi>>BI.fullPeriod, 3600, fullPeriod)/24) Mul(0, GetNumber(cs)*24, 3600, fullPeriod) MoveBlock(lv bi>>BI.timeStart, timeStart, 2) MoveBlock(lv bi>>BI.timeStop, timeStop, 2) MoveBlock(lv bi>>BI.timeInterval, timeInterval, 2) MoveBlock(lv bi>>BI.fullPeriod, fullPeriod, 2) bi>>BI.version = biVersion //signal that BI is kosher now UnlockCell(lv bi) ] //---------------------------------------------------------------------------- and GetDate(cs, time) be //---------------------------------------------------------------------------- [ let DateBreak(cs, char) = char eq $*n % char eq $*033 let str = GetString(cs, DateBreak, Wss, "date and time (dd-mmm-yy hh:mm)") let ok = ParseDate(str, time) Free(sysZone, str) unless ok do Errors(cs, 0) ] //---------------------------------------------------------------------------- and DefaultDate(cs, time) be //---------------------------------------------------------------------------- [ if time!0 ne 0 then [ BeginDefaultPhrase(cs) WritePackedDT(cs, time) EndDefaultPhrase(cs) ] ] //---------------------------------------------------------------------------- and DefaultNumber(cs, num) be //---------------------------------------------------------------------------- [ if num ne 0 then [ BeginDefaultPhrase(cs) Wns(cs, num) EndDefaultPhrase(cs) ] ]