Bestandswachter instellen
Eerste opname: de toestand aanleggen
Bij de eerste start valt er niets te vergelijken — in plaats daarvan legt de ronde de toestand aan: bij elk bestand een checksum (sha256 waar PHP dat meebrengt, anders md5), plus grootte, wijzigingstijd en gebied. Dat loopt in hapjes, standaard tot 400 bestanden of 5 seconden per stap; je kunt het venster sluiten en later verdergaan. Een percentage is er bij de eerste opname niet, omdat niemand het totale aantal nog kent — getoond worden gelezen bestanden en nog open mappen. Belangrijk vooraf: de wachter onthoudt wat hij aantreft en houdt dat voor juist. Ben je niet zeker van de installatie, laat dan eerst de bestandsintegriteit (core tegen WordPress.org) en de malwarescan lopen. Na een verhuizing of een herstel is ‘Toestand verwerpen’ de schone weg: alle checksums en bevindingen vervallen, de volgende ronde neemt opnieuw op. Dat is onherroepelijk.
Wat er wordt gecontroleerd — en wat niet
Gecontroleerd wordt de boom vanaf de WordPress-map. Ligt wp-content of de pluginmap bij jouw hoster daarbuiten, dan komt die er als eigen wortel bij en krijgt in de weergave een eigen voorvoegsel. Een wp-config.php die één niveau boven de installatie ligt, wordt als benoemd los bestand opgenomen en aan het begin van elke ronde als eerste gecontroleerd — de bovenliggende map zelf wordt bewust niet doorzocht, daar staan bij de meeste hosters vreemde installaties en back-ups. Standaard uitgezonderd zijn de uploadsmap en 15 ingebouwde cache-, temp- en logpatronen (onder meer wp-content/cache, wp-content/upgrade, node_modules, .git, *.log); beide schakelaars kun je uitzetten, dan duurt de ronde langer en levert elke geüploade afbeelding een bevinding op. Eigen patronen vul je aan in de uitsluitingslijst: tot 100 vermeldingen, elk hoogstens 200 tekens. Een patroon zonder schuine streep raakt elk paddeel met die naam, een patroon met schuine streep is aan de wortel verankerd, * geldt binnen één deel. Een patroon dat op alle voorbeeldpaden past, wordt geweigerd — het zou de bewaking uitschakelen zonder dat je dat aan de lijst ziet. Bij het invoeren wordt geteld en getoond hoeveel bestanden van de huidige toestand daaronder vallen. Niet gelezen worden bestanden boven de groottegrens (standaard 16 MB, instelbaar 1 tot 512), onleesbare bestanden en alles achter een symbolische koppeling — deze gevallen staan als eigen getallen in het resultaat en gelden uitdrukkelijk niet als ‘ontbreekt’.
Bevindingen lezen en toepassen
Er zijn drie soorten: gewijzigd, nieuw, ontbreekt. Per bestand staat er hoogstens één open bevinding in de lijst, met eerste vaststelling, laatste vaststelling en teller. Er wordt vergeleken met de laatst bevestigde toestand, niet met de vorige ronde — daarom blijft een bevinding staan totdat je hem toepast. Komt de inhoud vanzelf weer met de toestand overeen (update teruggedraaid, bestand teruggezet), dan verdwijnt de bevinding; een gemeld nieuw bestand dat weer weg is, wordt met pad in het activiteitenlog geschreven in plaats van stil verwijderd. ‘Toestand toepassen’ laat vooraf zien wat er zou gebeuren en werkt daarna in blokken van 500: gewijzigde bestanden krijgen hun nieuwe checksum, nieuwe komen erbij, ontbrekende vallen eruit. Aan de bestanden zelf verandert niets — maar de oude checksum is daarna weg, dus bekijk alles wat je niet kunt verklaren voordat je drukt. Voor de administratie is er een CSV-export met tot 2000 open bevindingen inclusief oude en nieuwe checksum. Twee grenzen kun je maar beter kennen: boven 3000 open bevindingen wordt er wel doorgeteld, maar niets meer opgeslagen (de interface zegt dat), en van het verloop blijven de 500 meest recente toegepaste bevindingen staan. Een afgebroken ronde stelt geen ontbrekende bestanden vast — daarvoor is een volledige ronde nodig.
Directe melding bij gevoelige bestanden
Standaard ingeschakeld. ‘Gevoelig’ betekent hier niet ‘belangrijk’, maar: wie dit bestand kan wijzigen, voert eigen code uit of komt bij de toegangsgegevens. Dat zijn wp-config.php, serverconfiguraties (.htaccess, .htpasswd, .user.ini, php.ini, web.config), drop-ins (db.php, object-cache.php, advanced-cache.php, sunrise.php en verwanten), mu-plug-ins en PHP-bestanden op plekken waar er geen horen te liggen: in de uploadsmap, in de WordPress-hoofdmap en in wp-content buiten plugins en themes. Deze meldingen gaan aan het eind van elk hapje de deur uit, niet pas aan het eind van de ronde — op een grote installatie zitten daar uren tussen. De minimale tussentijd staat standaard op 15 minuten (0 tot 1440 instelbaar); wat er in die tijd bij komt, wordt verzameld en gaat met de volgende melding mee, er gaat niets verloren. Eén melding somt hoogstens 200 vermeldingen op, de rest wordt als getal genoemd. Aan het eind van de ronde en bij een afbreking wordt de rest geleegd, ongeacht de tussentijd. Test de weg een keer met de proefmelding: die zegt je uitdrukkelijk of wp_mail() het bericht heeft aangenomen of geweigerd — of het ook wordt bezorgd, bepaalt de server daarachter. Eigen patronen kun je daarnaast als gevoelig invoeren; open bevindingen worden daarbij meteen opnieuw ingedeeld, zodat de lijst niet twee waarheden toont.
Automatisering en tijdschema
Standaard loopt de ronde alleen als je hem zelf start. Schakel je de automatisering in, dan kies je tussen elk uur, tweemaal per dag, dagelijks (standaard) en wekelijks. Het eerste tijdstip ligt met opzet 5 minuten in de toekomst, zodat er niet midden in je werk in het beheer een ronde aanspringt. Er wordt gerekend vanaf het begin van de vorige ronde, met 5 minuten speling — anders zou een lange ronde elke keer zeldzamer lopen. De cron werkt dezelfde hapjes af en plant zichzelf elke 30 seconden opnieuw zolang er nog iets openstaat; ben je op dat moment zelf in de browser bezig, dan wacht hij 120 seconden en grijpt hij niet in het stuur. Dat er twee bestuurders op dezelfde opdracht zitten, sluit een token uit dat met elk antwoord meereist; de blokkade verloopt na 60 seconden, zodat een dichtgeklapte browser de opdracht niet blijvend blokkeert. Staat DISABLE_WP_CRON in jouw installatie aan, dan zegt de melding bij het inschakelen dat de ronde alleen start als wp-cron.php van buitenaf wordt aangeroepen — dus als er een cronjob op de server is ingericht.