From 39df1af298d79f06282b87033e559bbc494141fa Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Tue, 16 Sep 2014 13:19:22 +0200 Subject: Prüfsummen ermöglicht MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Make | Bin 1359741 -> 1373158 bytes Make.lpr | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++------------- Make.lps | 68 ++++++++++++------------ 3 files changed, 174 insertions(+), 70 deletions(-) diff --git a/Make b/Make index 5151bd0..75e13c7 100755 Binary files a/Make and b/Make differ diff --git a/Make.lpr b/Make.lpr index d8769e6..347facb 100644 --- a/Make.lpr +++ b/Make.lpr @@ -46,10 +46,6 @@ type Datum: TDateTime; end; -var - jetzt: TDateTime; - inputfile: string; - { TAbhaengigkeit } constructor TAbhaengigkeit.create; @@ -100,6 +96,35 @@ begin inherited destroy; end; +function pruefsumme(datei: string): string; +var p: tProcess; + rb: longint; +const leseHappen=65536; +begin + p:=tProcess.create(nil); + p.Executable:='/usr/bin/sha512sum'; + p.Parameters.add(datei); + p.Options:=p.Options + [poUsePipes]; + p.Execute; + result:=''; + rb:=0; + while p.Running do begin + if p.Output.NumBytesAvailable=0 then sleep(10) + else begin + setlength(result,rb+leseHappen); + rb:=rb+p.Output.Read(result[rb+1],leseHappen); + end; + end; + if p.Output.NumBytesAvailable>0 then begin + setlength(result,rb+leseHappen); + rb:=rb+p.Output.Read(result[rb+1],leseHappen); + end; + setlength(result,rb); + delete(result,pos(' ',result),length(result)); + result:=trim(result); + p.free; +end; + function liesZeile(var dat: textfile; out s: string): boolean; begin repeat @@ -177,14 +202,15 @@ begin result:=0; end; -function liesMakeFile(datNam: string; out Abh: TAbhaengigkeiten; out dats: TDateienMitDaten): boolean; +function liesMakeFile(datNam,sumNam: string; out Abh: TAbhaengigkeiten; out dats: TDateienMitDaten; jetzt: extended): boolean; var f: textfile; s,t: string; NA: TAbhaengigkeit; beg,fin,rek: boolean; - wo,num: integer; + wo,num,i: integer; begin result:=false; + NA:=TAbhaengigkeit.create; setlength(dats,0); setlength(Abh,0); @@ -261,6 +287,31 @@ begin end; closefile(f); NA.free; + + if sumNam<>'' then begin + assignfile(f,sumNam); + if not fileexists(sumNam) then begin + rewrite(f); + closefile(f); + end; + if not fileexists(sumNam) then + exit; + reset(f); + while not eof(f) do begin + readln(f,s); + t:=copy(s,1,pos(' ',s)-1); + delete(s,1,pos(' ',s)); + s:=trim(s); + for i:=0 to length(dats)-1 do + if s=dats[i]^.Name then begin // bekannte Dateien sind formal uralt (Prüfsumme OK) + dats[i]^.Datum:=(jetzt + 1)*byte(pruefsumme(s)<>t); // oder von morgen (Prüfsumme nicht OK) + break; + end; + end; + closefile(f); + end; + + result:=true; end; @@ -285,7 +336,7 @@ begin end; end; -function Quellersetzung(var worin: string; Quelle: string): boolean; +function Quellersetzung(var worin: string; Quelle, inputfile: string): boolean; var s,t: string; i,a,e: integer; begin @@ -390,13 +441,13 @@ begin RE.free; end; -procedure ZieleHinzufuegen(var Ziele: TDateienMitDaten; Ziel,Quelle: string; var dats: TDateienMitDaten); +procedure ZieleHinzufuegen(var Ziele: TDateienMitDaten; Ziel,Quelle,inputfile: string; var dats: TDateienMitDaten); var i,Anz,Ende: integer; s,t,u: string; wasda: boolean; begin if pos('{',Ziel)=0 then begin - if not Quellersetzung(Ziel,Quelle) then exit; + if not Quellersetzung(Ziel,Quelle,inputfile) then exit; Ziel:=unescape(Ziel); i:=0; wasda:=false; @@ -434,32 +485,32 @@ begin u:=copy(Ziel,Ende+1,length(Ziel)); if unescapedpos('..',t)>0 then begin for i:=strtoint(copy(t,1,unescapedpos('..',t)-1)) to strtoint(copy(t,unescapedpos('..',t)+2,length(t))) do - ZieleHinzufuegen(Ziele,s+inttostr(i)+u,Quelle,dats); + ZieleHinzufuegen(Ziele,s+inttostr(i)+u,Quelle,inputfile,dats); end else begin t:=t+','; while unescapedpos(',',t)>0 do begin - ZieleHinzufuegen(Ziele,s+copy(t,1,unescapedpos(',',t)-1)+u,Quelle,dats); + ZieleHinzufuegen(Ziele,s+copy(t,1,unescapedpos(',',t)-1)+u,Quelle,inputfile,dats); delete(t,1,unescapedpos(',',t)); end; end; end; end; -procedure findeMehrZiele(var Ziele: TDateienMitDaten; ZieleFkt: TStringList; Quelle: string; var dats: TDateienMitDaten); +procedure findeMehrZiele(var Ziele: TDateienMitDaten; ZieleFkt: TStringList; Quelle,inputfile: string; var dats: TDateienMitDaten); var i: integer; begin for i:=0 to ZieleFkt.Count-1 do - ZieleHinzufuegen(Ziele,ZieleFkt[i],Quelle,dats); + ZieleHinzufuegen(Ziele,ZieleFkt[i],Quelle,inputfile,dats); end; -procedure findeZiele(out Ziele: TDateienMitDaten; ZieleFkt: TStringList; Quelle: string; var dats: TDateienMitDaten); +procedure findeZiele(out Ziele: TDateienMitDaten; ZieleFkt: TStringList; Quelle,inputfile: string; var dats: TDateienMitDaten); begin setlength(Ziele,0); - findeMehrZiele(Ziele,ZieleFkt,Quelle,dats); + findeMehrZiele(Ziele,ZieleFkt,Quelle,inputfile,dats); end; -procedure findeWasZuTunIst(var mgl: TAbhaengigkeiten; out zuTun: TAbhaengigkeiten; var dats: TDateienMitDaten); +procedure findeWasZuTunIst(var mgl: TAbhaengigkeiten; out zuTun: TAbhaengigkeiten; var dats: TDateienMitDaten; inputfile: string; jetzt: extended); var i,j,k,l: integer; neues,schonda: boolean; quNeu, @@ -496,7 +547,7 @@ begin for k:=0 to mgl[i]^.Befehle.Count-1 do begin s:=mgl[i]^.Befehle[k]; - if Quellersetzung(s,dats[j]^.Name) then begin + if Quellersetzung(s,dats[j]^.Name,inputfile) then begin if k=0 then mgl[i]^.Erben[0]^.Befehle.Clear; mgl[i]^.Erben[0]^.Befehle.Add(s); end; @@ -520,11 +571,11 @@ begin mgl[length(mgl)-1]^.AbhArt:=aaFinal; SetLength(mgl[length(mgl)-1]^.Quellen,1); mgl[length(mgl)-1]^.Quellen[0]:=dats[j]; - findeZiele(mgl[length(mgl)-1]^.Ziele,mgl[i]^.ZieleFkt,dats[j]^.name,dats); + findeZiele(mgl[length(mgl)-1]^.Ziele,mgl[i]^.ZieleFkt,dats[j]^.name,inputfile,dats); mgl[length(mgl)-1]^.Befehle.Clear; for k:=0 to mgl[i]^.Befehle.Count-1 do begin s:=mgl[i]^.Befehle[k]; - if Quellersetzung(s,dats[j]^.Name) then + if Quellersetzung(s,dats[j]^.Name,inputfile) then mgl[length(mgl)-1]^.Befehle.Add(s); end; if mgl[length(mgl)-1]^.Befehle.Count=0 then begin @@ -544,7 +595,7 @@ begin quNeu:=max(quNeu,mgl[i]^.Quellen[j]^.Datum); if length(mgl[i]^.Ziele)=0 then begin for j:=0 to length(mgl[i]^.Quellen)-1 do - findeMehrZiele(mgl[i]^.Ziele,mgl[i]^.ZieleFkt,mgl[i]^.Quellen[j]^.Name,dats); + findeMehrZiele(mgl[i]^.Ziele,mgl[i]^.ZieleFkt,mgl[i]^.Quellen[j]^.Name,inputfile,dats); if length(mgl[i]^.Ziele)=0 then begin mgl[i]^.AbhArt:=aaIgnore; continue; @@ -561,7 +612,7 @@ begin SetLength(mgl[i]^.Erben,1); mgl[i]^.Erben[0]:=zuTun[length(zuTun)-1]; for j:=0 to length(mgl[i]^.Ziele)-1 do - mgl[i]^.Ziele[j]^.Datum:=jetzt; + mgl[i]^.Ziele[j]^.Datum:=jetzt+2; // neu erzeugte Dateien sind dann formal von übermorgen neues:=true; end; end; @@ -572,15 +623,33 @@ begin until not neues; end; -procedure tueWasZuTunIst(zuTun: TAbhaengigkeiten; nurAnzeigen: boolean; Ausgabedatei: string); -var Prior,i,j: integer; - Ausg: Textfile; - Befehle: TStringlist; +procedure tueWasZuTunIst(alles,zuTun: TAbhaengigkeiten; nurAnzeigen, allesNeu: boolean; Ausgabedatei,Summendatei: string); +var Prior,i,j: integer; + Ausg: Textfile; + Befehle,geaenderteDateien,alteDateien: TStringlist; + ms: boolean; begin Befehle:=TStringlist.create; Prior:=0; + ms:=Summendatei<>''; for i:=0 to length(zuTun)-1 do Prior:=max(Prior,zuTun[i]^.Prioritaet); + if ms then begin + geaenderteDateien:=TStringlist.create; + if allesNeu then + for i:=0 to length(alles)-1 do begin + for j:=0 to length(alles[i]^.Ziele)-1 do + geaenderteDateien.add(alles[i]^.Ziele[j]^.Name); + for j:=0 to length(alles[i]^.Quellen)-1 do + geaenderteDateien.add(alles[i]^.Quellen[j]^.Name); + end; + for i:=0 to length(zuTun)-1 do begin + for j:=0 to length(zuTun[i]^.Ziele)-1 do + geaenderteDateien.add(zuTun[i]^.Ziele[j]^.Name); + for j:=0 to length(zuTun[i]^.Quellen)-1 do + geaenderteDateien.add(zuTun[i]^.Quellen[j]^.Name); + end; + end; while Prior>=0 do begin for i:=0 to length(zuTun)-1 do if zuTun[i]^.Prioritaet=Prior then @@ -588,6 +657,33 @@ begin Befehle.Add(zuTun[i]^.Befehle[j]); dec(Prior); end; + if ms then begin + for i:=geaenderteDateien.count-1 downto 0 do + for j:=0 to i-1 do + if geaenderteDateien[i]=geaenderteDateien[j] then begin + geaenderteDateien.Delete(i); + break; + end; + if geaenderteDateien.count>0 then + Befehle.Add('echo -ne "Sha512summen erneuern ..."'); + for i:=0 to geaenderteDateien.count-1 do + Befehle.Add('/usr/bin/sha512sum '+geaenderteDateien[i]+' >> '+Summendatei); + if geaenderteDateien.count>0 then + Befehle.Add('echo " fertig"'); + if not nurAnzeigen then begin + alteDateien:=tStringlist.create; + alteDateien.LoadFromFile(Summendatei); + for i:=alteDateien.Count-1 downto 0 do + for j:=0 to geaenderteDateien.count-1 do + if trim(copy(alteDateien[i],pos(' ',alteDateien[i]),length(alteDateien[i])))=geaenderteDateien[j] then begin + alteDateien.delete(i); + break; + end; + alteDateien.SaveToFile(Summendatei); + alteDateien.free; + end; + end; + if length(zuTun)=0 then Befehle.Add('echo "Es gibt hier nichts zu tun!"'); Befehle.Add('sleep 2'); @@ -603,20 +699,21 @@ begin Closefile(Ausg); end; Befehle.Free; + if ms then + geaenderteDateien.Free; end; { TMake } procedure TMake.DoRun; var - ErrorMsg: String; - mglAbhaengigkeiten, - zutunAbhaengigkeiten: TAbhaengigkeiten; - Dateien: TDateienMitDaten; + inputfile,pruefsummenfile,ErrorMsg: String; + mglAbhaengigkeiten,zutunAbhaengigkeiten: TAbhaengigkeiten; + Dateien: TDateienMitDaten; begin - ErrorMsg:=CheckOptions('A:HWD:','Ausgabe: Hilfe Watte Datei:'); + ErrorMsg:=CheckOptions('A:HWD:P:a','Ausgabe: Hilfe Watte Datei: Prüfsummen: alleSummenErneuern'); if ErrorMsg<>'' then begin - ShowException(Exception.Create(ErrorMsg)); + ShowException(Exception.Create(ErrorMsg+#10'Hilfe: '+Exename+' -H/--Hilfe')); Terminate; Exit; end; @@ -636,10 +733,17 @@ begin if HasOption('D','Datei') then inputfile:=GetOptionValue('D','Datei') else inputfile:='Machdatei'; - jetzt:=now; + if HasOption('P','Prüfsummen') then pruefsummenfile:=GetOptionValue('P','Prüfsummen') + else pruefsummenfile:=''; + + if HasOption('a','alleSummenErneuern') and (pruefsummenfile='') then begin + ShowException(Exception.Create('Ich kann alle Summen nur dann erneuern (-a/--alleSummenErneuern), wenn ich eine Prüfsummendatei habe (-P/--Pfrüfsummen)!')); + Terminate; + Exit; + end; if fileexists(inputfile) then begin - if not liesMakeFile(inputfile,mglAbhaengigkeiten,Dateien) then begin + if not liesMakeFile(inputfile,pruefsummenfile,mglAbhaengigkeiten,Dateien,now) then begin ShowException(Exception.Create('Datei '''+inputfile+''' ist fehlerhaft!')); Terminate; Exit; @@ -652,9 +756,9 @@ begin end; writeln('Regeln: '+inttostr(length(mglAbhaengigkeiten))+', Dateien: '+inttostr(length(Dateien))); - findeWasZuTunIst(mglAbhaengigkeiten,zuTunAbhaengigkeiten,Dateien); + findeWasZuTunIst(mglAbhaengigkeiten,zuTunAbhaengigkeiten,Dateien,inputfile,now); writeln('anzuwendende Regeln: '+inttostr(length(zuTunAbhaengigkeiten))); - tueWasZuTunIst(zuTunAbhaengigkeiten,HasOption('W','Watte'),GetOptionValue('A','Ausgabe')); + tueWasZuTunIst(mglAbhaengigkeiten,zuTunAbhaengigkeiten,HasOption('W','Watte'),HasOption('a','alleSummenErneuern'),GetOptionValue('A','Ausgabe'),pruefsummenfile); Terminate; end; @@ -668,7 +772,7 @@ end; procedure TMake.WriteHelp; begin writeln('Verwendung:'); - writeln(' ',ExeName,' -A/--Ausgabe -H/--Hilfe -W/--Watte -D/--Datei'); + writeln(' ',ExeName,' -A/--Ausgabe $Ausgabedatei -H/--Hilfe -W/--Watte -D/--Datei $Machdatei -P/--Prüfsummen $Prüfsummendatei -a/--alleSummenErneuern'); end; var diff --git a/Make.lps b/Make.lps index c7bb64c..4d2377a 100644 --- a/Make.lps +++ b/Make.lps @@ -11,9 +11,9 @@ - - - + + + @@ -22,7 +22,7 @@ - + @@ -40,123 +40,123 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + -- cgit v1.2.3-70-g09d2