<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.rabbibob.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rabbi+Bob</id>
	<title>Rabbi Blog - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.rabbibob.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rabbi+Bob"/>
	<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php/Special:Contributions/Rabbi_Bob"/>
	<updated>2026-09-13T08:48:36Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=PhpBB&amp;diff=2052</id>
		<title>PhpBB</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=PhpBB&amp;diff=2052"/>
		<updated>2026-08-29T10:29:01Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: Created page with &amp;quot;Category:Weblog-2026-08 Category:Linux  phpBB, proof that I am a masochist.  =Updating versions= * Ref: https://www.phpbb.com/support/docs/en/3.3/ug/upgradeguide/update_full/ ==Prepping== * Download the full package and read the update directions ** tl\dr: unzip the zip and clear out folder\files to NOT overwrite in the destination later &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; del config.php rmdir /s /q &amp;quot;files/&amp;quot; rmdir /s /q &amp;quot;images/&amp;quot; rmdir /s /q &amp;quot;store/&amp;quot; &amp;lt;/syntaxhighlight&amp;gt;...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Weblog-2026-08]]&lt;br /&gt;
[[Category:Linux]]&lt;br /&gt;
&lt;br /&gt;
phpBB, proof that I am a masochist.&lt;br /&gt;
&lt;br /&gt;
=Updating versions=&lt;br /&gt;
* Ref: https://www.phpbb.com/support/docs/en/3.3/ug/upgradeguide/update_full/&lt;br /&gt;
==Prepping==&lt;br /&gt;
* Download the full package and read the update directions&lt;br /&gt;
** tl\dr: unzip the zip and clear out folder\files to NOT overwrite in the destination later&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
del config.php&lt;br /&gt;
rmdir /s /q &amp;quot;files/&amp;quot;&lt;br /&gt;
rmdir /s /q &amp;quot;images/&amp;quot;&lt;br /&gt;
rmdir /s /q &amp;quot;store/&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Double check the listing below and create cleanup.sh executable in the phpbb dir on the webserver&lt;br /&gt;
* Run the script from that dir (else it fails) using &amp;quot;Usage: ./cleanup.sh &#039;&#039;&#039;/var/www/html/target_directory&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Check if target directory is provided as an argument&lt;br /&gt;
if [ -z &amp;quot;$1&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Error: Target directory not provided.&amp;quot;&lt;br /&gt;
    echo &amp;quot;Usage: ./cleanup.sh /path/to/target_directory&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Resolve absolute paths for reliable comparison&lt;br /&gt;
TARGET_DIR=$(realpath &amp;quot;$1&amp;quot; 2&amp;gt;/dev/null)&lt;br /&gt;
CURRENT_DIR=$(pwd)&lt;br /&gt;
&lt;br /&gt;
# Verify the target directory actually exists before comparing&lt;br /&gt;
if [ -z &amp;quot;$TARGET_DIR&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Error: The specified target directory does not exist.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# SAFETY CHECK 1: Ensure script is run from inside the target directory&lt;br /&gt;
if [ &amp;quot;$CURRENT_DIR&amp;quot; != &amp;quot;$TARGET_DIR&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Safety Check Failed: You must run this script from inside the target directory.&amp;quot;&lt;br /&gt;
    echo &amp;quot;Please &#039;cd&#039; into $TARGET_DIR and run the script from there.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# SAFETY CHECK 2: Confirm config.php exists&lt;br /&gt;
if [ ! -f &amp;quot;config.php&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Safety Check Failed: &#039;config.php&#039; was not found in $CURRENT_DIR.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# SAFETY CHECK 3: Confirm config.php contains the word &#039;phpBB&#039;&lt;br /&gt;
if ! grep -q &#039;phpBB&#039; config.php; then&lt;br /&gt;
    echo &amp;quot;Safety Check Failed: &#039;config.php&#039; does not contain the word &#039;phpBB&#039;.&amp;quot;&lt;br /&gt;
    echo &amp;quot;Aborting to prevent accidental deletion in a non-phpBB directory.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Safety checks passed. Starting cleanup in $TARGET_DIR...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Execute cleanup&lt;br /&gt;
# -mindepth 1 and -maxdepth 1 ensure we only look at the immediate contents of the directory&lt;br /&gt;
find . -mindepth 1 -maxdepth 1 \&lt;br /&gt;
    -not -name &#039;cleanup.sh&#039; \&lt;br /&gt;
    -not -name &#039;config.php&#039; \&lt;br /&gt;
    -not -name &#039;ext&#039; \&lt;br /&gt;
    -not -name &#039;files&#039; \&lt;br /&gt;
    -not -name &#039;images&#039; \&lt;br /&gt;
    -not -name &#039;store&#039; \&lt;br /&gt;
    -not -name &#039;styles&#039; \&lt;br /&gt;
    -exec rm -rf {} +&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Cleanup complete! Unnecessary files and directories have been removed.&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* You should have a clean area now. &lt;br /&gt;
* Follow the rest of the directions&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Fail2Ban&amp;diff=2051</id>
		<title>Fail2Ban</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Fail2Ban&amp;diff=2051"/>
		<updated>2026-08-29T10:05:45Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: Created page with &amp;quot;==Notes== * /var/log/fail2ban  =Timing= We&amp;#039;ve been set to 1 month. I really don&amp;#039;t care to see those IP addresses here.  ==Manual Banning== Ex: sudo fail2ban-client set &amp;lt;jail&amp;gt; banip &amp;lt;IP_ADDRESS&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; sudo fail2ban-client set sshd banip 192.168.1.100 sudo fail2ban-client status sshd sudo fail2ban-client set sshd unbanip 192.168.1.100 &amp;lt;/syntaxhighlight&amp;gt;    Category:Wiki Category:Weblog-2026-08&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Notes==&lt;br /&gt;
* /var/log/fail2ban&lt;br /&gt;
&lt;br /&gt;
=Timing=&lt;br /&gt;
We&#039;ve been set to 1 month. I really don&#039;t care to see those IP addresses here.&lt;br /&gt;
&lt;br /&gt;
==Manual Banning==&lt;br /&gt;
Ex: sudo fail2ban-client set &amp;lt;jail&amp;gt; banip &amp;lt;IP_ADDRESS&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo fail2ban-client set sshd banip 192.168.1.100&lt;br /&gt;
sudo fail2ban-client status sshd&lt;br /&gt;
sudo fail2ban-client set sshd unbanip 192.168.1.100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wiki]]&lt;br /&gt;
[[Category:Weblog-2026-08]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Main_Page&amp;diff=2050</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Main_Page&amp;diff=2050"/>
		<updated>2026-08-29T09:39:22Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This site is mainly a collection of my own meanderings and interests (of course it would be, it&#039;s my site).  If you&#039;re lost, I suggest checking out either the [[Special:Categories|Categories]] or [[Special:Contributions/Rabbi_Bob|My Contributions]] page to see if there really is anything of interest for you at all here.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
If you were looking for MikeBeane.com, you&#039;ve found that as well.  I can&#039;t be bothered to update two sites, so both domains point to the same place on the web.  It&#039;s just another spot....&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;left&amp;quot; class=&amp;quot;wikitable&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
! style=&amp;quot;background:#000000; color:white&amp;quot;| Last Entries&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;DynamicPageList&amp;gt;&lt;br /&gt;
namespace = mainspace&lt;br /&gt;
  ordermethod = lastedit&lt;br /&gt;
  count=20&lt;br /&gt;
&amp;lt;/DynamicPageList&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|+&lt;br /&gt;
! style=&amp;quot;background:#000000; color:white&amp;quot;| External Links&lt;br /&gt;
|-&lt;br /&gt;
|{{ExternalLinks}}|}&lt;br /&gt;
{{HideTitle}}&lt;br /&gt;
__notoc__&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Category:Weblog-2026-07&amp;diff=2049</id>
		<title>Category:Weblog-2026-07</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Category:Weblog-2026-07&amp;diff=2049"/>
		<updated>2026-08-28T00:21:43Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: Created page with &amp;quot;Category:Blog&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Blog]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Half_Life_Log_Parsing&amp;diff=2048</id>
		<title>Half Life Log Parsing</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Half_Life_Log_Parsing&amp;diff=2048"/>
		<updated>2026-08-28T00:19:54Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Purpose=&lt;br /&gt;
Awhile ago I started a project called &amp;quot;[[Atlashl|AtlasHL]]&amp;quot; and today while I was sick I decided to go back and look at some of the scripting I had done two years ago.  Without too much detail, I did today in two hours what I did in about two months back then.&lt;br /&gt;
&lt;br /&gt;
I&#039;m not a Regex Guru by any stretch of the imagination and while there are better ways to do what I&#039;m doing, I do actually have some reasons for breaking some specific log lines the way I do.  Someday I&#039;ll learn efficiency, but for right now, I&#039;m going through this in the worst way possible: stepped if/elsif statements until the end.&lt;br /&gt;
&lt;br /&gt;
==Current Status==&lt;br /&gt;
# Generally just bashing lines through the regex.  After I get through all of the logs I have, I&#039;ll look at categorizing a little better (and condensing some lines).&lt;br /&gt;
# Current ratio:&lt;br /&gt;
## 10,972 logs&lt;br /&gt;
## 114 unmatched lines (mostly repetitive)&lt;br /&gt;
## 2,619,859 matched lines&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
#http://developer.valvesoftware.com/wiki/HL_Log_Standard#054._Team_Selection&lt;br /&gt;
&lt;br /&gt;
The HL Log Standard appears to be a little long in the tooth and hasn&#039;t been really updated and the adhering to it is loose at best depending on what game you&#039;re looking at.  Tthis is my opinion, but I have nearly 100 thousand logs from various games &amp;amp; mods to back this up with.&lt;br /&gt;
&lt;br /&gt;
=Code=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot; line&amp;gt;&lt;br /&gt;
#!/usr/bin/perl -w&lt;br /&gt;
# Created by Rabbi-Bob&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
&lt;br /&gt;
my ($VERSION)=&amp;quot;0.6B&amp;quot;;&lt;br /&gt;
my ($LASTEDIT)=&amp;quot;11/03/2007&amp;quot;;&lt;br /&gt;
my ($EDIT)=&amp;quot;Rabbi Bob&amp;quot;;&lt;br /&gt;
my ($COPYRIGHT)=&amp;quot;2007&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
#my($LOGDIR)=&amp;quot;U:/Programs/atlashl/pb/oldlogs&amp;quot;;&lt;br /&gt;
#my($LOGDIR)=&amp;quot;V:/Programs/Perl/logscanner/source/logs&amp;quot;;&lt;br /&gt;
my($LOGDIR)=&amp;quot;input&amp;quot;;&lt;br /&gt;
my($LOGFILE_IN)=();         #logfile input vars&lt;br /&gt;
my($FILE)=();&lt;br /&gt;
my(@FILES)=();&lt;br /&gt;
my($OUTPUT)=();                #output vars&lt;br /&gt;
my($missing)=();&lt;br /&gt;
&lt;br /&gt;
my ($TODO_OUT)=&amp;quot;todo.txt&amp;quot;;&lt;br /&gt;
my ($DONE_OUT)=&amp;quot;done.csv&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
my @LINES=();&lt;br /&gt;
my $LINES=();&lt;br /&gt;
&lt;br /&gt;
my $LOGLINE=();&lt;br /&gt;
my $lineno = 0; # The line number in the log file    &lt;br /&gt;
&lt;br /&gt;
##################################&lt;br /&gt;
opendir(DIR, &amp;quot;$LOGDIR&amp;quot;) or die &amp;quot;Cannot open $LOGDIR to read: $!&amp;quot;;&lt;br /&gt;
@FILES = grep(/\.log$/,readdir(DIR));&lt;br /&gt;
closedir(DIR);&lt;br /&gt;
&lt;br /&gt;
open (TODO_OUT, &amp;quot;&amp;gt;$TODO_OUT&amp;quot;) or die &amp;quot;Cannot open $TODO_OUT to output: $!&amp;quot;;&lt;br /&gt;
open (DONE_OUT, &amp;quot;&amp;gt;$DONE_OUT&amp;quot;) or die &amp;quot;Cannot open $DONE_OUT to output: $!&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
print DONE_OUT &amp;quot;EventID,LogLine\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
@FILES = sort (@FILES); # reverse the array&lt;br /&gt;
&lt;br /&gt;
$lineno = 0; # The line number in the log file&lt;br /&gt;
&lt;br /&gt;
foreach $FILE (@FILES) &lt;br /&gt;
    {&lt;br /&gt;
	$LOGFILE_IN=&amp;quot;$LOGDIR/$FILE&amp;quot;;&lt;br /&gt;
    $lineno=0;&lt;br /&gt;
    &lt;br /&gt;
    ########### Open Logfile for reading ############################################&lt;br /&gt;
	#open the input file&lt;br /&gt;
	open LOGFILE_IN, $LOGFILE_IN or die &amp;quot;Cannot open $LOGFILE_IN for read :$!&amp;quot;;&lt;br /&gt;
	print &amp;quot;scanning $LOGFILE_IN\n&amp;quot;;&lt;br /&gt;
    ######################################################################&lt;br /&gt;
        while (&amp;lt;LOGFILE_IN&amp;gt;)&lt;br /&gt;
	    {&lt;br /&gt;
        $LINES[$lineno]=$_;            &lt;br /&gt;
        print $LINES[$lineno];&lt;br /&gt;
        $lineno++;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        $lineno=0;&lt;br /&gt;
        &lt;br /&gt;
        foreach $LINES (@LINES)&lt;br /&gt;
        {&lt;br /&gt;
        $LOGLINE=$LINES[$lineno];&lt;br /&gt;
        &amp;amp;CHECKLINE($LOGLINE);&lt;br /&gt;
        $lineno++;        &lt;br /&gt;
        }&lt;br /&gt;
    &lt;br /&gt;
            &lt;br /&gt;
        #$lineno++; # increment the line number primarily for debugging&lt;br /&gt;
	    #$LOGLINE=$_;&lt;br /&gt;
	    ##### Log File Comment #####&lt;br /&gt;
&lt;br /&gt;
        #L 05/11/2007 - 06:45:28: Server cvars start&lt;br /&gt;
     &lt;br /&gt;
            &lt;br /&gt;
    }    &lt;br /&gt;
        close (LOGFILE_IN);&lt;br /&gt;
    #    close ($FILE);        &lt;br /&gt;
     #Close of log file&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
     #End of log files&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
##################################################&lt;br /&gt;
################### Main Loop End ################&lt;br /&gt;
##################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub printmissing&lt;br /&gt;
    {&lt;br /&gt;
    #Alternate the comment if you really want to see the area that sent the &lt;br /&gt;
    #line, otherwise just output the $_&lt;br /&gt;
    &lt;br /&gt;
    #print MISSING &amp;quot;$printout\n$_\n&amp;quot;;&lt;br /&gt;
    print &amp;quot;Missing $_\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub CHECKLINE&lt;br /&gt;
    {&lt;br /&gt;
       if ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Server cvars start/i)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;001A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/11/2007 - 06:45:28: Server cvars end&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Server cvars end/i)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;001B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/11/2007 - 06:45:28: Server cvar &amp;quot;_tutor_bomb_viewable_check_interval&amp;quot; = &amp;quot;0.5&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Server cvar \&amp;quot;(.*)\&amp;quot; = \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;001C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/03/2007 - 18:12:22: server_cvar: &amp;quot;sv_accelerate&amp;quot; &amp;quot;5&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): server_cvar: \&amp;quot;(.*)\&amp;quot; \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;001D,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }          &lt;br /&gt;
        #L 11/03/2007 - 20:46:17: &amp;quot;r_AirboatViewDampenFreq&amp;quot; = &amp;quot;7.0&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; = \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;001D,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }          &lt;br /&gt;
        #L 05/11/2007 - 06:45:28: Log file started (file &amp;quot;logs\L0511019.log&amp;quot;) (game &amp;quot;cstrike&amp;quot;) (version &amp;quot;47/1.1.2.5/3647&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Log file started \(file \&amp;quot;(.*)\&amp;quot;\) \(game \&amp;quot;(.*)\&amp;quot;\) \(version \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;002A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/11/2007 - 07:11:12: Log file closed&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Log file closed/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;002B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 10/30/2007 - 10:11:25: server_message: &amp;quot;quit&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): server_message: \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;002C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }        &lt;br /&gt;
        #L 07/08/2007 - 03:29:10: Server shutdown    &lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Server shutdown/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;002C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }                &lt;br /&gt;
        #L 05/11/2007 - 06:45:28: Loading map &amp;quot;de_dust&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Loading map \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;003A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/11/2007 - 06:45:30: Started map &amp;quot;de_dust&amp;quot; (CRC &amp;quot;-1641307065&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Started map \&amp;quot;(.*)\&amp;quot; \(CRC \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;003B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 04/25/2007 - 08:30:44: Bad Rcon: &amp;quot;rcon 578394037 &amp;quot;password&amp;quot; changelevel de_dust &amp;quot; from &amp;quot;65.175.222.9:61147&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Bad Rcon: \&amp;quot;(.*) \&amp;quot;(.*)\&amp;quot; (.*)\&amp;quot; from \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;004B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        &lt;br /&gt;
        #L 10/29/2007 - 23:23:24: rcon from &amp;quot;70.91.92.66:1941&amp;quot;: command &amp;quot;log on&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): rcon from \&amp;quot;(.*)\&amp;quot;: command \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;004C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/06/2005 - 21:27:47: Rcon: &amp;quot;rcon 4018452088 &amp;quot;toyota&amp;quot; log&amp;quot; from &amp;quot;24.253.156.83:7130&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Rcon: \&amp;quot;(.*) \&amp;quot;(.*)\&amp;quot; (.*)\&amp;quot; from \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;004D,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/04/2007 - 20:25:34: rcon from &amp;quot;66.30.92.200:2058&amp;quot;: Bad Password&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): rcon from \&amp;quot;(.*)\&amp;quot;: Bad Password/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;004E,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }        &lt;br /&gt;
        #L 10/28/2007 - 20:39:28: [META] dll: Updating plugins...&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[META|CSTRIKE|CSX|FUN\] (.*)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;007A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/04/2007 - 01:44:28: &amp;quot;FoCA|LocoYokel&amp;lt;158&amp;gt;&amp;lt;STEAM_ID_PENDING&amp;gt;&amp;lt;&amp;gt;&amp;quot; connected, address &amp;quot;72.177.119.42:12381&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; connected, address \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;050A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/04/2007 - 02:00:04: &amp;quot;-Ãinosaur&amp;lt;161&amp;gt;&amp;lt;STEAM_0:1:3908269&amp;gt;&amp;lt;&amp;gt;&amp;quot; STEAM USERID validated&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; STEAM USERID validated/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;050B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/02/2007 - 23:50:41: &amp;quot;FoCA|rochvegas j&amp;lt;9&amp;gt;&amp;lt;STEAM_0:0:63048&amp;gt;&amp;lt;&amp;gt;&amp;quot; entered the game&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; entered the game$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;051A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/04/2007 - 01:44:12: &amp;quot;violeNt| Conen.&amp;lt;157&amp;gt;&amp;lt;STEAM_0:0:5752133&amp;gt;&amp;lt;TERRORIST&amp;gt;&amp;quot; disconnected (reason &amp;quot;Disconnect by user.&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): &amp;quot;(.*)&amp;quot; disconnected \(reason \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;052A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/11/2007 - 06:46:43: &amp;quot;(* ) ( *)&amp;lt;1&amp;gt;&amp;lt;STEAM_0:1:273255&amp;gt;&amp;lt;&amp;gt;&amp;quot; disconnected&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): &amp;quot;(.*)&amp;quot; disconnected$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;052A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 10/28/2007 - 21:28:34: Kick: &amp;quot;Ciggarette  / Gago&amp;lt;202&amp;gt;&amp;lt;STEAM_0:1:15378592&amp;gt;&amp;lt;&amp;gt;&amp;quot; was kicked by &amp;quot;Console&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Kick: &amp;quot;(.*)&amp;quot; was kicked by \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;052B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/11/2007 - 06:45:30: Ban: &amp;quot;&amp;lt;&amp;gt;&amp;lt;STEAM_0:0:1004474&amp;gt;&amp;lt;&amp;gt;&amp;quot; was banned &amp;quot;permanently&amp;quot; by &amp;quot;Console&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Ban: &amp;quot;(.*)&amp;quot; was banned \&amp;quot;(.*)\&amp;quot; by \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;052C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/20/2007 - 21:54:31: Ban: &amp;quot;VZLA.milk&amp;lt;192&amp;gt;&amp;lt;STEAM_0:1:14553521&amp;gt;&amp;lt;&amp;gt;&amp;quot; was kicked and banned &amp;quot;for 5.00 minutes&amp;quot; by &amp;quot;Console&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Ban: &amp;quot;(.*)&amp;quot; was kicked and banned \&amp;quot;(.*)\&amp;quot; by \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;052D,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }        &lt;br /&gt;
        &lt;br /&gt;
        #L 11/03/2007 - 23:41:06: &amp;quot;FoCA| TADMG&amp;lt;113&amp;gt;&amp;lt;STEAM_0:0:85065&amp;gt;&amp;lt;TERRORIST&amp;gt;&amp;quot; disconnected (reason &amp;quot;No Steam logon&lt;br /&gt;
        ###HL2DM &amp;amp; CS:S output appears to include a line carriage when announcing STEAM account issues###&lt;br /&gt;
        # Confirmed with Alfred Reynolds 11-6-07&lt;br /&gt;
        #&lt;br /&gt;
        # Hey, you need to parse all the text between the quotes for this one, the reason string on disconnect &lt;br /&gt;
        # is shown in the users UI and we are moving more lines to have breaks for readability. - Alfred&lt;br /&gt;
        &lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): &amp;quot;(.*)&amp;quot; disconnected \(reason \&amp;quot;(.*)$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;052Z,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }            &lt;br /&gt;
        ##L 11/03/2007 - 01:44:44: Banid: &amp;quot;&amp;lt;&amp;gt;&amp;lt;STEAM_0:1:9283492&amp;gt;&amp;lt;&amp;gt;&amp;quot; was banned &amp;quot;permanently&amp;quot; by &amp;quot;Console&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Banid: &amp;quot;(.*)&amp;quot; was banned \&amp;quot;(.*)\&amp;quot; by \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;052D,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/03/2007 - 00:03:32: &amp;quot;FoCA|BigE[GH]&amp;lt;18&amp;gt;&amp;lt;STEAM_0:0:28458&amp;gt;&amp;lt;CT&amp;gt;&amp;quot; committed suicide with &amp;quot;hegrenade&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; committed suicide with \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;053A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/02/2007 - 23:50:46: &amp;quot;FoCA|BigE[GH]&amp;lt;18&amp;gt;&amp;lt;STEAM_0:0:28458&amp;gt;&amp;lt;Unassigned&amp;gt;&amp;quot; joined team &amp;quot;CT&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; joined team \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;054A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/02/2005 - 21:45:01: &amp;quot;FoCA|Rolyak&amp;lt;986&amp;gt;&amp;lt;STEAM_0:1:72275&amp;gt;&amp;lt;Axis&amp;gt;&amp;quot; changed role to &amp;quot;#class_axis_k43&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; changed role to \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;055A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/03/2007 - 01:59:19: &amp;quot;Anarico&amp;lt;42&amp;gt;&amp;lt;STEAM_0:1:412737&amp;gt;&amp;lt;CT&amp;gt;&amp;quot; changed name to &amp;quot;FoCA|Anarico&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; changed name to \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;056A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/02/2007 - 23:54:24: &amp;quot;FoCA|BigE[GH]&amp;lt;18&amp;gt;&amp;lt;STEAM_0:0:28458&amp;gt;&amp;lt;CT&amp;gt;&amp;quot; killed &amp;quot;Alice&amp;lt;8&amp;gt;&amp;lt;STEAM_0:0:2357615&amp;gt;&amp;lt;TERRORIST&amp;gt;&amp;quot; with &amp;quot;m4a1&amp;quot;    &lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; killed \&amp;quot;(.*)\&amp;quot; with \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;057A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/02/2007 - 23:54:24: &amp;quot;FoCA|BigE[GH]&amp;lt;18&amp;gt;&amp;lt;STEAM_0:0:28458&amp;gt;&amp;lt;CT&amp;gt;&amp;quot; killed &amp;quot;Alice&amp;lt;8&amp;gt;&amp;lt;STEAM_0:0:2357615&amp;gt;&amp;lt;TERRORIST&amp;gt;&amp;quot; with &amp;quot;m4a1&amp;quot; (headshot)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; killed \&amp;quot;(.*)\&amp;quot; with \&amp;quot;(.*)\&amp;quot; \((.*)\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;057B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/02/2007 - 23:52:36: &amp;quot;FoCA|Rabbi Bob&amp;lt;17&amp;gt;&amp;lt;STEAM_0:1:273255&amp;gt;&amp;lt;TERRORIST&amp;gt;&amp;quot; triggered &amp;quot;Got_The_Bomb&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; triggered \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;060A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/02/2005 - 21:47:06: &amp;quot;FoCA|Rolyak&amp;lt;986&amp;gt;&amp;lt;STEAM_0:1:72275&amp;gt;&amp;lt;Allies&amp;gt;&amp;quot; triggered a &amp;quot;dod_capture_area&amp;quot; - &amp;quot;POINT_AVALANCHE_AXISGUNPOSITION&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; triggered a \&amp;quot;(.*)\&amp;quot; - \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;060BA,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/02/2005 - 20:57:29: &amp;quot;FoCA|moondance&amp;lt;970&amp;gt;&amp;lt;STEAM_0:0:1852522&amp;gt;&amp;lt;Axis&amp;gt;&amp;quot; triggered a &amp;quot;dod_object&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; triggered a \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;060BA,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/03/2007 - 00:51:39: Team &amp;quot;TERRORIST&amp;quot; triggered &amp;quot;Target_Bombed&amp;quot; (CT &amp;quot;0&amp;quot;) (T &amp;quot;0&amp;quot;)&lt;br /&gt;
        #L 05/11/2007 - 06:50:22: Team &amp;quot;CT&amp;quot; triggered &amp;quot;Target_Saved&amp;quot; (CT &amp;quot;1&amp;quot;) (T &amp;quot;0&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Team \&amp;quot;(.*)\&amp;quot; triggered \&amp;quot;(.*)\&amp;quot; \(CT \&amp;quot;(.*)\&amp;quot;\) \(T \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;061A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/03/2007 - 00:06:35: Team &amp;quot;CT&amp;quot; triggered &amp;quot;CTs_Win&amp;quot; (CT &amp;quot;12&amp;quot;) (T &amp;quot;6&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Team \&amp;quot;(.*)\&amp;quot; triggered \&amp;quot;(.*)\&amp;quot; \(CT \&amp;quot;(.*)\&amp;quot;\) \(T \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;061B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/02/2005 - 21:47:06: Team &amp;quot;Allies&amp;quot; triggered a &amp;quot;dod_capture_area&amp;quot; - &amp;quot;POINT_AVALANCHE_AXISGUNPOSITION&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Team \&amp;quot;(.*)\&amp;quot; triggered a \&amp;quot;(.*)\&amp;quot; - \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;061C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/30/2005 - 20:51:57: Team &amp;quot;Allies&amp;quot; triggered a &amp;quot;dod_capture_area&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Team \&amp;quot;(.*)\&amp;quot; triggered a \&amp;quot;(.*)\&amp;quot;$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;061C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        #L 05/11/2007 - 06:46:52: World triggered &amp;quot;Round_Start&amp;quot;&lt;br /&gt;
        #L 05/11/2007 - 06:46:43: World triggered &amp;quot;Round_End&amp;quot;&lt;br /&gt;
        #L 11/02/2007 - 23:50:47: World triggered &amp;quot;Game_Commencing&amp;quot;            &lt;br /&gt;
        #L 11/04/2007 - 02:06:26: World triggered &amp;quot;Intermission_Time_Limit&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): World triggered \&amp;quot;(.*)\&amp;quot;$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;062A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
       #L 05/11/2007 - 06:46:43: World triggered &amp;quot;Round_Draw&amp;quot; (CT &amp;quot;0&amp;quot;) (T &amp;quot;0&amp;quot;)&lt;br /&gt;
       #L 04/21/2007 - 07:43:18: World triggered &amp;quot;Game_Commencing&amp;quot; (CT &amp;quot;0&amp;quot;) (T &amp;quot;0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): World triggered \&amp;quot;(.*)\&amp;quot; \(CT \&amp;quot;(.*)\&amp;quot;\) \(T \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;062B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        #L 11/04/2007 - 01:48:19: &amp;quot;FoCA|LocoYokel&amp;lt;158&amp;gt;&amp;lt;STEAM_0:0:4864772&amp;gt;&amp;lt;CT&amp;gt;&amp;quot; say &amp;quot;test&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; say \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;063A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/04/2007 - 01:52:25: &amp;quot;[CoFR]FoxyFire&amp;lt;156&amp;gt;&amp;lt;STEAM_0:0:1362382&amp;gt;&amp;lt;CT&amp;gt;&amp;quot; say_team &amp;quot;go back door&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; say_team \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;063B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/11/2007 - 07:11:12: Team &amp;quot;CT&amp;quot; scored &amp;quot;6&amp;quot; with &amp;quot;0&amp;quot; players&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Team \&amp;quot;(.*)\&amp;quot; scored \&amp;quot;(.*)\&amp;quot; with \&amp;quot;(.*)\&amp;quot; players/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;065A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/02/2005 - 21:47:37: &amp;quot;Allies&amp;quot; scored &amp;quot;55&amp;quot; with &amp;quot;2&amp;quot; players&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; scored \&amp;quot;(.*)\&amp;quot; with \&amp;quot;(.*)\&amp;quot; players/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;065A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
############### AMXMODX ####################&lt;br /&gt;
        #L 10/28/2007 - 21:23:17: [admincmd.amxx] Cmd: &amp;quot;[FoCA|CoFR]Barnes&amp;lt;189&amp;gt;&amp;lt;STEAM_0:1:343958&amp;gt;&amp;lt;&amp;gt;&amp;quot; changelevel &amp;quot;de_dust2&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[admincmd.amxx\] Cmd: \&amp;quot;(.*)\&amp;quot; changelevel \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A03A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }            &lt;br /&gt;
        #L 06/03/2007 - 23:48:29: [admincmd.amxx] Cmd: &amp;quot;Simple Daddy&amp;lt;305&amp;gt;&amp;lt;STEAM_0:1:215772&amp;gt;&amp;lt;&amp;gt;&amp;quot; set cvar (name &amp;quot;sv_gravity&amp;quot;) (value &amp;quot;200&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[admincmd.amxx\] Cmd: \&amp;quot;(.*)\&amp;quot; set cvar \(name \&amp;quot;(.*)\&amp;quot;\) \(value \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A03A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }            &lt;br /&gt;
&lt;br /&gt;
        #L 10/28/2007 - 20:41:06: [admincmd.amxx] Cmd: &amp;quot;FoCA|LocoYokel[GH]&amp;lt;141&amp;gt;&amp;lt;STEAM_0:0:4864772&amp;gt;&amp;lt;&amp;gt;&amp;quot; ask for players list&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[admincmd.amxx\] Cmd: \&amp;quot;(.*)\&amp;quot; ask for players list/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A07A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }            &lt;br /&gt;
        &lt;br /&gt;
        #L 05/11/2007 - 06:46:18: [admin.amxx] Login: &amp;quot;(* ) ( *)&amp;lt;1&amp;gt;&amp;lt;STEAM_0:1:273255&amp;gt;&amp;lt;&amp;gt;&amp;quot; became an admin (account &amp;quot;STEAM_0:1:273255&amp;quot;) (access &amp;quot;bcdefghijklmnopqrstu&amp;quot;) (address &amp;quot;76.179.90.224&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[admin.amxx\] Login: \&amp;quot;(.*)\&amp;quot; became an admin \(account \&amp;quot;(.*)\&amp;quot;\) \(access \&amp;quot;(.*)\&amp;quot;\) \(address \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A50A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 10/28/2007 - 21:28:34: [plmenu.amxx] Kick: &amp;quot;FoCA|rochvegas j + astigmatism&amp;lt;192&amp;gt;&amp;lt;STEAM_0:0:63048&amp;gt;&amp;lt;&amp;gt;&amp;quot; kick &amp;quot;Ciggarette  / Gago&amp;lt;202&amp;gt;&amp;lt;STEAM_0:1:15378592&amp;gt;&amp;lt;&amp;gt;&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[plmenu.amxx\] Kick: \&amp;quot;(.*)\&amp;quot; kick \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A52B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }                    &lt;br /&gt;
        #L 06/17/2007 - 22:23:51: [admincmd.amxx] Kick: &amp;quot;FoCA|DRB&amp;lt;114&amp;gt;&amp;lt;STEAM_0:0:400966&amp;gt;&amp;lt;&amp;gt;&amp;quot; kick &amp;quot;|8|r90|Prim3[martyr]&amp;lt;143&amp;gt;&amp;lt;STEAM_0:1:2487360&amp;gt;&amp;lt;&amp;gt;&amp;quot; (reason &amp;quot;&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[admincmd.amxx\] Kick: \&amp;quot;(.*)\&amp;quot; kick \&amp;quot;(.*)\&amp;quot; \(reason \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A52C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }                    &lt;br /&gt;
        #L 06/19/2007 - 21:58:00: [admincmd.amxx] Ban: &amp;quot;FoCA|DRB&amp;lt;417&amp;gt;&amp;lt;STEAM_0:0:400966&amp;gt;&amp;lt;&amp;gt;&amp;quot; ban and kick &amp;quot;cl_utch&amp;lt;433&amp;gt;&amp;lt;STEAM_0:1:9428559&amp;gt;&amp;lt;&amp;gt;&amp;quot; (minutes &amp;quot;0&amp;quot;) (reason &amp;quot;&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[admincmd.amxx\] Ban: \&amp;quot;(.*)\&amp;quot; ban and kick \&amp;quot;(.*)\&amp;quot; \(minutes \&amp;quot;(.*)\&amp;quot;\) \(reason \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A52C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }                    &lt;br /&gt;
        #L 10/29/2007 - 01:12:55: [plmenu.amxx] Ban: &amp;quot;FoCA|LocoYokel[GH]&amp;lt;241&amp;gt;&amp;lt;STEAM_0:0:4864772&amp;gt;&amp;lt;&amp;gt;&amp;quot; ban and kick &amp;quot;Ctb  SSay&amp;lt;266&amp;gt;&amp;lt;STEAM_0:1:13406436&amp;gt;&amp;lt;&amp;gt;&amp;quot; (minutes &amp;quot;5&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[plmenu.amxx\] Ban: \&amp;quot;(.*)\&amp;quot; ban and kick \&amp;quot;(.*)\&amp;quot; \(minutes \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A52C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            } &lt;br /&gt;
        #L 05/06/2005 - 20:21:21: [admincmd.amxx] Cmd: &amp;quot;FoCA|Sturm[RR]&amp;lt;15&amp;gt;&amp;lt;STEAM_0:1:548458&amp;gt;&amp;lt;&amp;gt;&amp;quot; ban &amp;quot;STEAM_0&amp;quot; (minutes &amp;quot;:&amp;quot;) (reason &amp;quot;1&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[admincmd.amxx\] Cmd: \&amp;quot;(.*)\&amp;quot; ban \&amp;quot;(.*)\&amp;quot; \(minutes \&amp;quot;(.*)\&amp;quot;\) \(reason \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A52C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            } &lt;br /&gt;
            &lt;br /&gt;
        #L 05/20/2007 - 17:32:19: [plmenu.amxx] Cmd: &amp;quot;FoCA|OGWG Persecutor&amp;lt;51&amp;gt;&amp;lt;STEAM_0:0:266906&amp;gt;&amp;lt;&amp;gt;&amp;quot; transfer &amp;quot;xDf&amp;lt;69&amp;gt;&amp;lt;STEAM_0:1:14332828&amp;gt;&amp;lt;&amp;gt;&amp;quot; (team &amp;quot;TERRORIST&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[plmenu.amxx\] Cmd: \&amp;quot;(.*)\&amp;quot; transfer \&amp;quot;(.*)\&amp;quot; \(team \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A54A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }              &lt;br /&gt;
        #L 10/28/2007 - 22:10:11: [admincmd.amxx] Cmd: &amp;quot;FoCA|rochvegas j + astigmatism&amp;lt;192&amp;gt;&amp;lt;STEAM_0:0:63048&amp;gt;&amp;lt;&amp;gt;&amp;quot; change nick to &amp;quot;roch&#039;s slave&amp;quot; &amp;quot;Player&amp;lt;213&amp;gt;&amp;lt;STEAM_0:1:15118437&amp;gt;&amp;lt;&amp;gt;&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[admincmd.amxx\] Cmd: \&amp;quot;(.*)\&amp;quot; change nick to \&amp;quot;(.*)\&amp;quot; \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A56A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }                    &lt;br /&gt;
        #L 10/28/2007 - 21:12:41: [plmenu.amxx] Cmd: &amp;quot;FoCA|LocoYokel[GH]&amp;lt;141&amp;gt;&amp;lt;STEAM_0:0:4864772&amp;gt;&amp;lt;&amp;gt;&amp;quot; slay &amp;quot;[.icC.]Duke Nukem&amp;lt;183&amp;gt;&amp;lt;STEAM_0:1:13910450&amp;gt;&amp;lt;&amp;gt;&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[plmenu.amxx\] Cmd: \&amp;quot;(.*)\&amp;quot; slay \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A57A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }                    &lt;br /&gt;
        #L 06/20/2007 - 21:28:12: [admincmd.amxx] Cmd: &amp;quot;FoCA|LocoYokel[GH]&amp;lt;121&amp;gt;&amp;lt;STEAM_0:0:4864772&amp;gt;&amp;lt;&amp;gt;&amp;quot; slay &amp;quot;LCC Tank&amp;lt;125&amp;gt;&amp;lt;STEAM_0:1:13068210&amp;gt;&amp;lt;&amp;gt;&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[admincmd.amxx\] Cmd: \&amp;quot;(.*)\&amp;quot; slay \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A57A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }                    &lt;br /&gt;
        #L 10/28/2007 - 21:36:12: [admincmd.amxx] Cmd: &amp;quot;[FoCA|CoFR]Barnes&amp;lt;189&amp;gt;&amp;lt;STEAM_0:1:343958&amp;gt;&amp;lt;&amp;gt;&amp;quot; slap with 0 damage &amp;quot;FoCA|Senser&amp;lt;203&amp;gt;&amp;lt;STEAM_0:0:261108&amp;gt;&amp;lt;&amp;gt;&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[admincmd.amxx\] Cmd: \&amp;quot;(.*)\&amp;quot; slap with (.*) damage \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A57B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }                     &lt;br /&gt;
        #L 10/28/2007 - 20:42:41: [plmenu.amxx] Cmd: &amp;quot;FoCA|Rizzo&amp;lt;180&amp;gt;&amp;lt;STEAM_0:0:8245642&amp;gt;&amp;lt;&amp;gt;&amp;quot; slap with 0 damage &amp;quot;FoCA|Fullthrottle&amp;lt;160&amp;gt;&amp;lt;STEAM_0:1:386955&amp;gt;&amp;lt;&amp;gt;&amp;quot;            &lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[plmenu.amxx\] Cmd: \&amp;quot;(.*)\&amp;quot; slap with (.*) damage \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A57C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }                             &lt;br /&gt;
        #L 08/26/2007 - 18:12:02: [admincmd.amxx] Cmd: &amp;quot;FoCA|Chronik[BB]&amp;lt;151&amp;gt;&amp;lt;STEAM_0:1:2643832&amp;gt;&amp;lt;&amp;gt;&amp;quot; server console (cmdline &amp;quot;sv_alltalk 3&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[admincmd.amxx\] Cmd: \&amp;quot;(.*)\&amp;quot; server console \(cmdline \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A57D,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }             &lt;br /&gt;
        &lt;br /&gt;
        #L 10/28/2007 - 20:39:49: [adminchat.amxx] Chat: &amp;quot;FoCA|LocoYokel[GH]&amp;lt;141&amp;gt;&amp;lt;STEAM_0:0:4864772&amp;gt;&amp;lt;&amp;gt;&amp;quot; chat &amp;quot; who changed it?&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[adminchat.amxx\] Chat: \&amp;quot;(.*)\&amp;quot; chat \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A63A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }            &lt;br /&gt;
        #L 10/28/2007 - 20:43:30: [adminchat.amxx] Chat: &amp;quot;FoCA|LocoYokel[GH]&amp;lt;141&amp;gt;&amp;lt;STEAM_0:0:4864772&amp;gt;&amp;lt;&amp;gt;&amp;quot; tsay &amp;quot;hey RB&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[adminchat.amxx\] Chat: \&amp;quot;(.*)\&amp;quot; tsay \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A63B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }    &lt;br /&gt;
        #L 05/14/2007 - 23:36:46: [adminchat.amxx] Chat: &amp;quot;FoCA|LocoYokel[GH]&amp;lt;21&amp;gt;&amp;lt;STEAM_0:0:4864772&amp;gt;&amp;lt;&amp;gt;&amp;quot; csay &amp;quot;Friendly fire is on, verify your targets and do not shoot teammates.  Offenders WILL be kicked.&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[adminchat.amxx\] Chat: \&amp;quot;(.*)\&amp;quot; csay \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A63C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }              &lt;br /&gt;
        #L 05/16/2007 - 22:13:37: [adminchat.amxx] Chat: &amp;quot;FoCA|mother_goose&amp;lt;342&amp;gt;&amp;lt;STEAM_0:1:265230&amp;gt;&amp;lt;&amp;gt;&amp;quot; psay &amp;quot;FoCA|MudBone[GH]&amp;lt;337&amp;gt;&amp;lt;STEAM_0:1:717421&amp;gt;&amp;lt;&amp;gt;&amp;quot; &amp;quot;hey&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[adminchat.amxx\] Chat: \&amp;quot;(.*)\&amp;quot; psay \&amp;quot;(.*)\&amp;quot; \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A63D,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }              &lt;br /&gt;
        #L 05/04/2005 - 21:28:28: [adminchat.amxx] Chat: &amp;quot;[CoFR]STEELEAGLE|FoCA&amp;lt;1214&amp;gt;&amp;lt;STEAM_0:0:546319&amp;gt;&amp;lt;&amp;gt;&amp;quot; say &amp;quot;I thought he was a lost lamb&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[adminchat.amxx\] Chat: \&amp;quot;(.*)\&amp;quot; say \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A63D,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }              &lt;br /&gt;
        #L 05/16/2007 - 22:24:30: [adminvote.amxx] Vote: &amp;quot;FoCA|mother_goose&amp;lt;342&amp;gt;&amp;lt;STEAM_0:1:265230&amp;gt;&amp;lt;&amp;gt;&amp;quot; vote custom (question &amp;quot;should loco learn how to do an actual vote?&amp;quot;) (option#1 &amp;quot;yes&amp;quot;) (option#2 &amp;quot;no&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[adminvote.amxx\] Vote: \&amp;quot;(.*)\&amp;quot; vote custom \(question \&amp;quot;(.*)\&amp;quot;\) \(option#1 \&amp;quot;(.*)\&amp;quot;\) \(option#2 \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A80A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }              &lt;br /&gt;
        #L 06/04/2007 - 18:33:37: [adminvote.amxx] Vote: &amp;quot;FoCA|DRB&amp;lt;366&amp;gt;&amp;lt;STEAM_0:0:400966&amp;gt;&amp;lt;&amp;gt;&amp;quot; vote map (map &amp;quot;mindmaze&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[adminvote.amxx\] Vote: \&amp;quot;(.*)\&amp;quot; vote map \(map \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A80A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }              &lt;br /&gt;
        #L 05/16/2007 - 22:24:42: [adminvote.amxx] Vote: Voting successful (got &amp;quot;10&amp;quot;) (needed &amp;quot;1&amp;quot;) (result &amp;quot;should loco learn how to do an actual vote? - yes&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[adminvote.amxx\] Vote: Voting successful \(got \&amp;quot;(.*)\&amp;quot;\) \(needed \&amp;quot;(.*)\&amp;quot;\) \(result \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A80B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }             &lt;br /&gt;
        #L 05/20/2005 - 21:54:29: [adminvote.amxx] Vote: Voting failed (got &amp;quot;3&amp;quot;) (needed &amp;quot;6&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[adminvote.amxx\] Vote: Voting successful \(got \&amp;quot;(.*)\&amp;quot;\) \(needed \&amp;quot;(.*)\&amp;quot;\)$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A80B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }             &lt;br /&gt;
        #L 07/18/2007 - 17:04:18: [mapsmenu.amxx] Cmd: &amp;quot;FoCA|Scorp&amp;lt;2&amp;gt;&amp;lt;STEAM_0:0:7817668&amp;gt;&amp;lt;&amp;gt;&amp;quot; changelevel &amp;quot;as_crazytank&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[mapsmenu.amxx\] Cmd: \&amp;quot;(.*)\&amp;quot; changelevel \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A81B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }       &lt;br /&gt;
        #L 05/12/2007 - 22:44:10: [mapchooser.amxx] Vote: Voting for the nextmap started&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[mapchooser.amxx\] Vote: Voting for the nextmap (.*)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A81C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 06/04/2007 - 18:33:50: [adminvote.amxx] Vote: Result accepted            &lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[mapchooser.amxx\] Vote: Result accepted/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A81C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 06/09/2007 - 01:27:43: [mapsmenu.amxx] Vote: Voting successful. Map will be changed to awp_city&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[mapchooser.amxx\] Vote: Voting successful. Map will be changed to (.*)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A81C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }           &lt;br /&gt;
        #L 05/05/2005 - 23:34:32: [mapsmenu.amxx] Vote: &amp;quot;FoCA|LocoYokel&amp;lt;1402&amp;gt;&amp;lt;STEAM_0:0:4864772&amp;gt;&amp;lt;&amp;gt;&amp;quot; vote maps (map#1 &amp;quot;dod_charlie&amp;quot;) (map#2 &amp;quot;&amp;quot;) (map#3 &amp;quot;&amp;quot;) (map#4 &amp;quot;&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[mapsmenu.amxx\] Vote: \&amp;quot;(.*)\&amp;quot; vote maps \(map#1 \&amp;quot;(.*)\&amp;quot;\) \(map#2 \&amp;quot;(.*)\&amp;quot;\) \(map#3 \&amp;quot;(.*)\&amp;quot;\) \(map#4 \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A81C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }           &lt;br /&gt;
        &lt;br /&gt;
        #L 10/28/2007 - 20:07:20: [mapsmenu.amxx] Vote: Result accepted&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[mapsmenu.amxx\] Vote: Result accepted/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A81C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
               &lt;br /&gt;
        #L 05/19/2005 - 23:06:42: [mapsmenu.amxx] Vote: Result refused&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[mapsmenu.amxx\] Vote: Result refused/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A81C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/20/2005 - 21:54:29: [adminvote.amxx] Vote: Voting failed (got &amp;quot;3&amp;quot;) (needed &amp;quot;6&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[adminvote.amxx\] Vote: Voting failed \(got \&amp;quot;(.*)\&amp;quot;\) \(needed \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A81C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        #L 05/07/2005 - 21:49:37: [mapsmenu.amxx] Vote: Voting failed&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[mapsmenu.amxx\] Vote: Voting failed/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A81C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        #L 10/28/2007 - 20:07:18: [mapsmenu.amxx] Vote: Voting successful. Map will be changed to as_tundra&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[mapsmenu.amxx\] Vote: Voting successful. Map will be changed to (.*)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A81C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }    &lt;br /&gt;
        #L 05/11/2005 - 21:44:40: [adminreservation.amxx] [AdminReservation] =[21st]=Maj.Vash was kicked to free a slot for [CoFR]Big Shirtless Ron!&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[adminreservation.amxx\] \[AdminReservation\] (.*) was kicked to free a slot for (.*)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A81C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }    &lt;br /&gt;
&lt;br /&gt;
################### STATS #################################&lt;br /&gt;
&lt;br /&gt;
        #L 09/07/2007 - 04:25:12: &amp;quot;Koopa Koop&amp;lt;44&amp;gt;&amp;lt;STEAM_0:0:63055&amp;gt;&amp;lt;CT&amp;gt;&amp;quot; attacked &amp;quot;MM | lil [IRA]&amp;lt;49&amp;gt;&amp;lt;STEAM_0:1:406035&amp;gt;&amp;lt;CT&amp;gt;&amp;quot; with &amp;quot;grenade&amp;quot; (damage &amp;quot;77&amp;quot;) (damage_armor &amp;quot;0&amp;quot;) (health &amp;quot;23&amp;quot;) (armor &amp;quot;0&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; attacked \&amp;quot;(.*)\&amp;quot; with \&amp;quot;(.*)\&amp;quot; \(damage \&amp;quot;(.*)\&amp;quot;\) \(damage_armor \&amp;quot;(.*)\&amp;quot;\) \(health \&amp;quot;(.*)\&amp;quot;\) \(armor \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;B01A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }                    &lt;br /&gt;
        #L 05/02/2005 - 23:04:49: Final Scores: Allies: 94   Axis: 476&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Final Scores: (.*): (.*) (.*): (.*)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;B01B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
################ MISC ADDONS #################&lt;br /&gt;
&lt;br /&gt;
#L 05/14/2005 - 23:27:54: [ADMIN] IRONHAND has forgiven FoCA|Whatfer&#039;s TK.&lt;br /&gt;
       elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[ADMIN\] (.*) has forgiven (.*)\&#039;s TK.$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C01A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 05/14/2005 - 23:28:24: [ADMIN] [CoFR]Keeve TK warning 1 of 3&lt;br /&gt;
       elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[ADMIN\] (.*) TK warning (.*) of (.*)$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C01B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 05/02/2005 - 22:08:50: [ADMIN] FoCA|moondance Slayed for teammate attack after respawn&lt;br /&gt;
       elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[ADMIN\] (.*) Slayed for teammate attack after respawn$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C01C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 05/05/2005 - 23:40:18: [ADMIN] Nix Slayed for violating 3 TK warning&lt;br /&gt;
       elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[ADMIN\] (.*) Slayed for violating (.*) TK warning$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C01C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 05/06/2005 - 21:13:04: [ADMIN] deiter Exceeded 3 TK limit and is BANNED for 1 minutes&lt;br /&gt;
       elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[ADMIN\] (.*) Exceeded (.*) TK limit and is BANNED for (.*) minutes$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C01C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 05/12/2005 - 23:43:10: [ADMIN] FoCA|Ogre Slayed for melee attack&lt;br /&gt;
       elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[ADMIN\] (.*) Slayed for melee attack$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C01C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
#L 10/27/2007 - 08:07:31: Loaded 128 Maps into the maps that will be picked for the vote&lt;br /&gt;
       elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Loaded (.*) Maps into the maps that will be picked for the vote$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C02A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 09/13/2007 - 18:10:47: Nominations for the map vote: 0 out of 5 possible nominations&lt;br /&gt;
       elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Nominations for the map vote: (.*) out of (.*) possible nominations$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C02A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 09/13/2007 - 18:10:47: Randomly Filling slots for the vote with 5 out of 128&lt;br /&gt;
       elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Randomly Filling slots for the vote with (.*) out of (.*)$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C02A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 09/13/2007 - 18:10:47: Filled 5 vote slots with random maps, 5 are custom&lt;br /&gt;
       elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Filled (.*) vote slots with random maps, (.*) are custom$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C02A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 10/27/2007 - 07:19:39: Banned 1 Maps in your mapstoban.ini file&lt;br /&gt;
       elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Banned (.*) Maps in your mapstoban.ini file$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C02B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 10/27/2007 - 07:19:39: 1 Maps were not loaded because they were the last maps played, or defined twice, or banned&lt;br /&gt;
elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): (.*) Maps were not loaded because they were the last maps played, or defined twice, or banned$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C02C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 10/27/2007 - 07:19:39: Found 12 Maps in your mapcycle.txt/allmaps.txt file, 7 are available for filling slots&lt;br /&gt;
elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Found (.*) Maps in your mapcycle.txt\/allmaps.txt file, (.*) are available for filling slots$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C02D,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 10/26/2007 - 06:09:27: Vote: Voting for the nextmap started&lt;br /&gt;
elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Vote: Voting for the nextmap started$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C02E,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
#L 10/26/2007 - 06:09:47: Vote: Voting for the nextmap finished. The nextmap will be de_dust&lt;br /&gt;
elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Vote: Voting for the nextmap finished. The nextmap will be (.*)$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C02F,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 09/15/2007 - 05:13:04: -------- Mapchange to awp_war --------&lt;br /&gt;
elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): -------- Mapchange to (.*) --------$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C02G,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
#L 05/01/2005 - 16:16:58: -------- Mapchange --------&lt;br /&gt;
elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): -------- Mapchange --------$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C02G,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
#L 06/19/2007 - 21:26:40: Server say &amp;quot;DRB I need your steam id to fix the ban&amp;quot;&lt;br /&gt;
elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Server say \&amp;quot;(.*)\&amp;quot;$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C03G,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 09/15/2007 - 04:48:35: FoCA|quibeep has left; de_dust is no longer nominated&lt;br /&gt;
elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): (.*) has left; (.*) is no longer nominated$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C03H,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
#L 05/31/2005 - 17:19:23: [DODX] dev: called: GiveFnptrsToDll&lt;br /&gt;
elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[DODX\] (.*)$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C03H,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 05/14/2005 - 13:13:22: FATAL ERROR (shutting down): models/mapmodels/hedgehog.mdl has been modified since starting the engine.  Consider running system diagnostics to check for faulty hardware.&lt;br /&gt;
elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): FATAL ERROR \(shutting down\): (.*)$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C04H,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
################&lt;br /&gt;
################&lt;br /&gt;
&lt;br /&gt;
        else&lt;br /&gt;
            {&lt;br /&gt;
            print TODO_OUT &amp;quot;$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            #print &amp;quot;$LINES[$lineno];&amp;quot;;                        &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Perl]]&lt;br /&gt;
[[Category:Gaming]]&lt;br /&gt;
[[Category:Weblog-2007-11]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Half_Life_Log_Parsing&amp;diff=2047</id>
		<title>Half Life Log Parsing</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Half_Life_Log_Parsing&amp;diff=2047"/>
		<updated>2026-08-28T00:19:38Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Purpose=&lt;br /&gt;
Awhile ago I started a project called &amp;quot;[[Atlashl|AtlasHL]]&amp;quot; and today while I was sick I decided to go back and look at some of the scripting I had done two years ago.  Without too much detail, I did today in two hours what I did in about two months back then.&lt;br /&gt;
&lt;br /&gt;
I&#039;m not a Regex Guru by any stretch of the imagination and while there are better ways to do what I&#039;m doing, I do actually have some reasons for breaking some specific log lines the way I do.  Someday I&#039;ll learn efficiency, but for right now, I&#039;m going through this in the worst way possible: stepped if/elsif statements until the end.&lt;br /&gt;
&lt;br /&gt;
==Current Status==&lt;br /&gt;
# Generally just bashing lines through the regex.  After I get through all of the logs I have, I&#039;ll look at categorizing a little better (and condensing some lines).&lt;br /&gt;
# Current ratio:&lt;br /&gt;
## 10,972 logs&lt;br /&gt;
## 114 unmatched lines (mostly repetitive)&lt;br /&gt;
## 2,619,859 matched lines&lt;br /&gt;
&lt;br /&gt;
=References=&lt;br /&gt;
#http://developer.valvesoftware.com/wiki/HL_Log_Standard#054._Team_Selection&lt;br /&gt;
&lt;br /&gt;
The HL Log Standard appears to be a little long in the tooth and hasn&#039;t been really updated and the adhering to it is loose at best depending on what game you&#039;re looking at.  Tthis is my opinion, but I have nearly 100 thousand logs from various games &amp;amp; mods to back this up with.&lt;br /&gt;
&lt;br /&gt;
=Code=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/perl -w&lt;br /&gt;
# Created by Rabbi-Bob&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
&lt;br /&gt;
my ($VERSION)=&amp;quot;0.6B&amp;quot;;&lt;br /&gt;
my ($LASTEDIT)=&amp;quot;11/03/2007&amp;quot;;&lt;br /&gt;
my ($EDIT)=&amp;quot;Rabbi Bob&amp;quot;;&lt;br /&gt;
my ($COPYRIGHT)=&amp;quot;2007&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
#my($LOGDIR)=&amp;quot;U:/Programs/atlashl/pb/oldlogs&amp;quot;;&lt;br /&gt;
#my($LOGDIR)=&amp;quot;V:/Programs/Perl/logscanner/source/logs&amp;quot;;&lt;br /&gt;
my($LOGDIR)=&amp;quot;input&amp;quot;;&lt;br /&gt;
my($LOGFILE_IN)=();         #logfile input vars&lt;br /&gt;
my($FILE)=();&lt;br /&gt;
my(@FILES)=();&lt;br /&gt;
my($OUTPUT)=();                #output vars&lt;br /&gt;
my($missing)=();&lt;br /&gt;
&lt;br /&gt;
my ($TODO_OUT)=&amp;quot;todo.txt&amp;quot;;&lt;br /&gt;
my ($DONE_OUT)=&amp;quot;done.csv&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
my @LINES=();&lt;br /&gt;
my $LINES=();&lt;br /&gt;
&lt;br /&gt;
my $LOGLINE=();&lt;br /&gt;
my $lineno = 0; # The line number in the log file    &lt;br /&gt;
&lt;br /&gt;
##################################&lt;br /&gt;
opendir(DIR, &amp;quot;$LOGDIR&amp;quot;) or die &amp;quot;Cannot open $LOGDIR to read: $!&amp;quot;;&lt;br /&gt;
@FILES = grep(/\.log$/,readdir(DIR));&lt;br /&gt;
closedir(DIR);&lt;br /&gt;
&lt;br /&gt;
open (TODO_OUT, &amp;quot;&amp;gt;$TODO_OUT&amp;quot;) or die &amp;quot;Cannot open $TODO_OUT to output: $!&amp;quot;;&lt;br /&gt;
open (DONE_OUT, &amp;quot;&amp;gt;$DONE_OUT&amp;quot;) or die &amp;quot;Cannot open $DONE_OUT to output: $!&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
print DONE_OUT &amp;quot;EventID,LogLine\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
@FILES = sort (@FILES); # reverse the array&lt;br /&gt;
&lt;br /&gt;
$lineno = 0; # The line number in the log file&lt;br /&gt;
&lt;br /&gt;
foreach $FILE (@FILES) &lt;br /&gt;
    {&lt;br /&gt;
	$LOGFILE_IN=&amp;quot;$LOGDIR/$FILE&amp;quot;;&lt;br /&gt;
    $lineno=0;&lt;br /&gt;
    &lt;br /&gt;
    ########### Open Logfile for reading ############################################&lt;br /&gt;
	#open the input file&lt;br /&gt;
	open LOGFILE_IN, $LOGFILE_IN or die &amp;quot;Cannot open $LOGFILE_IN for read :$!&amp;quot;;&lt;br /&gt;
	print &amp;quot;scanning $LOGFILE_IN\n&amp;quot;;&lt;br /&gt;
    ######################################################################&lt;br /&gt;
        while (&amp;lt;LOGFILE_IN&amp;gt;)&lt;br /&gt;
	    {&lt;br /&gt;
        $LINES[$lineno]=$_;            &lt;br /&gt;
        print $LINES[$lineno];&lt;br /&gt;
        $lineno++;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        $lineno=0;&lt;br /&gt;
        &lt;br /&gt;
        foreach $LINES (@LINES)&lt;br /&gt;
        {&lt;br /&gt;
        $LOGLINE=$LINES[$lineno];&lt;br /&gt;
        &amp;amp;CHECKLINE($LOGLINE);&lt;br /&gt;
        $lineno++;        &lt;br /&gt;
        }&lt;br /&gt;
    &lt;br /&gt;
            &lt;br /&gt;
        #$lineno++; # increment the line number primarily for debugging&lt;br /&gt;
	    #$LOGLINE=$_;&lt;br /&gt;
	    ##### Log File Comment #####&lt;br /&gt;
&lt;br /&gt;
        #L 05/11/2007 - 06:45:28: Server cvars start&lt;br /&gt;
     &lt;br /&gt;
            &lt;br /&gt;
    }    &lt;br /&gt;
        close (LOGFILE_IN);&lt;br /&gt;
    #    close ($FILE);        &lt;br /&gt;
     #Close of log file&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
     #End of log files&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
##################################################&lt;br /&gt;
################### Main Loop End ################&lt;br /&gt;
##################################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub printmissing&lt;br /&gt;
    {&lt;br /&gt;
    #Alternate the comment if you really want to see the area that sent the &lt;br /&gt;
    #line, otherwise just output the $_&lt;br /&gt;
    &lt;br /&gt;
    #print MISSING &amp;quot;$printout\n$_\n&amp;quot;;&lt;br /&gt;
    print &amp;quot;Missing $_\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub CHECKLINE&lt;br /&gt;
    {&lt;br /&gt;
       if ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Server cvars start/i)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;001A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/11/2007 - 06:45:28: Server cvars end&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Server cvars end/i)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;001B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/11/2007 - 06:45:28: Server cvar &amp;quot;_tutor_bomb_viewable_check_interval&amp;quot; = &amp;quot;0.5&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Server cvar \&amp;quot;(.*)\&amp;quot; = \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;001C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/03/2007 - 18:12:22: server_cvar: &amp;quot;sv_accelerate&amp;quot; &amp;quot;5&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): server_cvar: \&amp;quot;(.*)\&amp;quot; \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;001D,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }          &lt;br /&gt;
        #L 11/03/2007 - 20:46:17: &amp;quot;r_AirboatViewDampenFreq&amp;quot; = &amp;quot;7.0&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; = \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;001D,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }          &lt;br /&gt;
        #L 05/11/2007 - 06:45:28: Log file started (file &amp;quot;logs\L0511019.log&amp;quot;) (game &amp;quot;cstrike&amp;quot;) (version &amp;quot;47/1.1.2.5/3647&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Log file started \(file \&amp;quot;(.*)\&amp;quot;\) \(game \&amp;quot;(.*)\&amp;quot;\) \(version \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;002A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/11/2007 - 07:11:12: Log file closed&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Log file closed/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;002B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 10/30/2007 - 10:11:25: server_message: &amp;quot;quit&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): server_message: \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;002C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }        &lt;br /&gt;
        #L 07/08/2007 - 03:29:10: Server shutdown    &lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Server shutdown/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;002C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }                &lt;br /&gt;
        #L 05/11/2007 - 06:45:28: Loading map &amp;quot;de_dust&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Loading map \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;003A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/11/2007 - 06:45:30: Started map &amp;quot;de_dust&amp;quot; (CRC &amp;quot;-1641307065&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Started map \&amp;quot;(.*)\&amp;quot; \(CRC \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;003B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 04/25/2007 - 08:30:44: Bad Rcon: &amp;quot;rcon 578394037 &amp;quot;password&amp;quot; changelevel de_dust &amp;quot; from &amp;quot;65.175.222.9:61147&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Bad Rcon: \&amp;quot;(.*) \&amp;quot;(.*)\&amp;quot; (.*)\&amp;quot; from \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;004B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        &lt;br /&gt;
        #L 10/29/2007 - 23:23:24: rcon from &amp;quot;70.91.92.66:1941&amp;quot;: command &amp;quot;log on&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): rcon from \&amp;quot;(.*)\&amp;quot;: command \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;004C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/06/2005 - 21:27:47: Rcon: &amp;quot;rcon 4018452088 &amp;quot;toyota&amp;quot; log&amp;quot; from &amp;quot;24.253.156.83:7130&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Rcon: \&amp;quot;(.*) \&amp;quot;(.*)\&amp;quot; (.*)\&amp;quot; from \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;004D,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/04/2007 - 20:25:34: rcon from &amp;quot;66.30.92.200:2058&amp;quot;: Bad Password&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): rcon from \&amp;quot;(.*)\&amp;quot;: Bad Password/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;004E,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }        &lt;br /&gt;
        #L 10/28/2007 - 20:39:28: [META] dll: Updating plugins...&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[META|CSTRIKE|CSX|FUN\] (.*)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;007A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/04/2007 - 01:44:28: &amp;quot;FoCA|LocoYokel&amp;lt;158&amp;gt;&amp;lt;STEAM_ID_PENDING&amp;gt;&amp;lt;&amp;gt;&amp;quot; connected, address &amp;quot;72.177.119.42:12381&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; connected, address \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;050A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/04/2007 - 02:00:04: &amp;quot;-Ãinosaur&amp;lt;161&amp;gt;&amp;lt;STEAM_0:1:3908269&amp;gt;&amp;lt;&amp;gt;&amp;quot; STEAM USERID validated&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; STEAM USERID validated/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;050B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/02/2007 - 23:50:41: &amp;quot;FoCA|rochvegas j&amp;lt;9&amp;gt;&amp;lt;STEAM_0:0:63048&amp;gt;&amp;lt;&amp;gt;&amp;quot; entered the game&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; entered the game$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;051A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/04/2007 - 01:44:12: &amp;quot;violeNt| Conen.&amp;lt;157&amp;gt;&amp;lt;STEAM_0:0:5752133&amp;gt;&amp;lt;TERRORIST&amp;gt;&amp;quot; disconnected (reason &amp;quot;Disconnect by user.&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): &amp;quot;(.*)&amp;quot; disconnected \(reason \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;052A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/11/2007 - 06:46:43: &amp;quot;(* ) ( *)&amp;lt;1&amp;gt;&amp;lt;STEAM_0:1:273255&amp;gt;&amp;lt;&amp;gt;&amp;quot; disconnected&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): &amp;quot;(.*)&amp;quot; disconnected$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;052A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 10/28/2007 - 21:28:34: Kick: &amp;quot;Ciggarette  / Gago&amp;lt;202&amp;gt;&amp;lt;STEAM_0:1:15378592&amp;gt;&amp;lt;&amp;gt;&amp;quot; was kicked by &amp;quot;Console&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Kick: &amp;quot;(.*)&amp;quot; was kicked by \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;052B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/11/2007 - 06:45:30: Ban: &amp;quot;&amp;lt;&amp;gt;&amp;lt;STEAM_0:0:1004474&amp;gt;&amp;lt;&amp;gt;&amp;quot; was banned &amp;quot;permanently&amp;quot; by &amp;quot;Console&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Ban: &amp;quot;(.*)&amp;quot; was banned \&amp;quot;(.*)\&amp;quot; by \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;052C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/20/2007 - 21:54:31: Ban: &amp;quot;VZLA.milk&amp;lt;192&amp;gt;&amp;lt;STEAM_0:1:14553521&amp;gt;&amp;lt;&amp;gt;&amp;quot; was kicked and banned &amp;quot;for 5.00 minutes&amp;quot; by &amp;quot;Console&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Ban: &amp;quot;(.*)&amp;quot; was kicked and banned \&amp;quot;(.*)\&amp;quot; by \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;052D,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }        &lt;br /&gt;
        &lt;br /&gt;
        #L 11/03/2007 - 23:41:06: &amp;quot;FoCA| TADMG&amp;lt;113&amp;gt;&amp;lt;STEAM_0:0:85065&amp;gt;&amp;lt;TERRORIST&amp;gt;&amp;quot; disconnected (reason &amp;quot;No Steam logon&lt;br /&gt;
        ###HL2DM &amp;amp; CS:S output appears to include a line carriage when announcing STEAM account issues###&lt;br /&gt;
        # Confirmed with Alfred Reynolds 11-6-07&lt;br /&gt;
        #&lt;br /&gt;
        # Hey, you need to parse all the text between the quotes for this one, the reason string on disconnect &lt;br /&gt;
        # is shown in the users UI and we are moving more lines to have breaks for readability. - Alfred&lt;br /&gt;
        &lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): &amp;quot;(.*)&amp;quot; disconnected \(reason \&amp;quot;(.*)$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;052Z,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }            &lt;br /&gt;
        ##L 11/03/2007 - 01:44:44: Banid: &amp;quot;&amp;lt;&amp;gt;&amp;lt;STEAM_0:1:9283492&amp;gt;&amp;lt;&amp;gt;&amp;quot; was banned &amp;quot;permanently&amp;quot; by &amp;quot;Console&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Banid: &amp;quot;(.*)&amp;quot; was banned \&amp;quot;(.*)\&amp;quot; by \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;052D,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/03/2007 - 00:03:32: &amp;quot;FoCA|BigE[GH]&amp;lt;18&amp;gt;&amp;lt;STEAM_0:0:28458&amp;gt;&amp;lt;CT&amp;gt;&amp;quot; committed suicide with &amp;quot;hegrenade&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; committed suicide with \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;053A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/02/2007 - 23:50:46: &amp;quot;FoCA|BigE[GH]&amp;lt;18&amp;gt;&amp;lt;STEAM_0:0:28458&amp;gt;&amp;lt;Unassigned&amp;gt;&amp;quot; joined team &amp;quot;CT&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; joined team \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;054A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/02/2005 - 21:45:01: &amp;quot;FoCA|Rolyak&amp;lt;986&amp;gt;&amp;lt;STEAM_0:1:72275&amp;gt;&amp;lt;Axis&amp;gt;&amp;quot; changed role to &amp;quot;#class_axis_k43&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; changed role to \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;055A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/03/2007 - 01:59:19: &amp;quot;Anarico&amp;lt;42&amp;gt;&amp;lt;STEAM_0:1:412737&amp;gt;&amp;lt;CT&amp;gt;&amp;quot; changed name to &amp;quot;FoCA|Anarico&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; changed name to \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;056A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/02/2007 - 23:54:24: &amp;quot;FoCA|BigE[GH]&amp;lt;18&amp;gt;&amp;lt;STEAM_0:0:28458&amp;gt;&amp;lt;CT&amp;gt;&amp;quot; killed &amp;quot;Alice&amp;lt;8&amp;gt;&amp;lt;STEAM_0:0:2357615&amp;gt;&amp;lt;TERRORIST&amp;gt;&amp;quot; with &amp;quot;m4a1&amp;quot;    &lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; killed \&amp;quot;(.*)\&amp;quot; with \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;057A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/02/2007 - 23:54:24: &amp;quot;FoCA|BigE[GH]&amp;lt;18&amp;gt;&amp;lt;STEAM_0:0:28458&amp;gt;&amp;lt;CT&amp;gt;&amp;quot; killed &amp;quot;Alice&amp;lt;8&amp;gt;&amp;lt;STEAM_0:0:2357615&amp;gt;&amp;lt;TERRORIST&amp;gt;&amp;quot; with &amp;quot;m4a1&amp;quot; (headshot)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; killed \&amp;quot;(.*)\&amp;quot; with \&amp;quot;(.*)\&amp;quot; \((.*)\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;057B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/02/2007 - 23:52:36: &amp;quot;FoCA|Rabbi Bob&amp;lt;17&amp;gt;&amp;lt;STEAM_0:1:273255&amp;gt;&amp;lt;TERRORIST&amp;gt;&amp;quot; triggered &amp;quot;Got_The_Bomb&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; triggered \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;060A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/02/2005 - 21:47:06: &amp;quot;FoCA|Rolyak&amp;lt;986&amp;gt;&amp;lt;STEAM_0:1:72275&amp;gt;&amp;lt;Allies&amp;gt;&amp;quot; triggered a &amp;quot;dod_capture_area&amp;quot; - &amp;quot;POINT_AVALANCHE_AXISGUNPOSITION&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; triggered a \&amp;quot;(.*)\&amp;quot; - \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;060BA,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/02/2005 - 20:57:29: &amp;quot;FoCA|moondance&amp;lt;970&amp;gt;&amp;lt;STEAM_0:0:1852522&amp;gt;&amp;lt;Axis&amp;gt;&amp;quot; triggered a &amp;quot;dod_object&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; triggered a \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;060BA,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/03/2007 - 00:51:39: Team &amp;quot;TERRORIST&amp;quot; triggered &amp;quot;Target_Bombed&amp;quot; (CT &amp;quot;0&amp;quot;) (T &amp;quot;0&amp;quot;)&lt;br /&gt;
        #L 05/11/2007 - 06:50:22: Team &amp;quot;CT&amp;quot; triggered &amp;quot;Target_Saved&amp;quot; (CT &amp;quot;1&amp;quot;) (T &amp;quot;0&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Team \&amp;quot;(.*)\&amp;quot; triggered \&amp;quot;(.*)\&amp;quot; \(CT \&amp;quot;(.*)\&amp;quot;\) \(T \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;061A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/03/2007 - 00:06:35: Team &amp;quot;CT&amp;quot; triggered &amp;quot;CTs_Win&amp;quot; (CT &amp;quot;12&amp;quot;) (T &amp;quot;6&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Team \&amp;quot;(.*)\&amp;quot; triggered \&amp;quot;(.*)\&amp;quot; \(CT \&amp;quot;(.*)\&amp;quot;\) \(T \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;061B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/02/2005 - 21:47:06: Team &amp;quot;Allies&amp;quot; triggered a &amp;quot;dod_capture_area&amp;quot; - &amp;quot;POINT_AVALANCHE_AXISGUNPOSITION&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Team \&amp;quot;(.*)\&amp;quot; triggered a \&amp;quot;(.*)\&amp;quot; - \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;061C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/30/2005 - 20:51:57: Team &amp;quot;Allies&amp;quot; triggered a &amp;quot;dod_capture_area&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Team \&amp;quot;(.*)\&amp;quot; triggered a \&amp;quot;(.*)\&amp;quot;$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;061C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        #L 05/11/2007 - 06:46:52: World triggered &amp;quot;Round_Start&amp;quot;&lt;br /&gt;
        #L 05/11/2007 - 06:46:43: World triggered &amp;quot;Round_End&amp;quot;&lt;br /&gt;
        #L 11/02/2007 - 23:50:47: World triggered &amp;quot;Game_Commencing&amp;quot;            &lt;br /&gt;
        #L 11/04/2007 - 02:06:26: World triggered &amp;quot;Intermission_Time_Limit&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): World triggered \&amp;quot;(.*)\&amp;quot;$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;062A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
       #L 05/11/2007 - 06:46:43: World triggered &amp;quot;Round_Draw&amp;quot; (CT &amp;quot;0&amp;quot;) (T &amp;quot;0&amp;quot;)&lt;br /&gt;
       #L 04/21/2007 - 07:43:18: World triggered &amp;quot;Game_Commencing&amp;quot; (CT &amp;quot;0&amp;quot;) (T &amp;quot;0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): World triggered \&amp;quot;(.*)\&amp;quot; \(CT \&amp;quot;(.*)\&amp;quot;\) \(T \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;062B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        #L 11/04/2007 - 01:48:19: &amp;quot;FoCA|LocoYokel&amp;lt;158&amp;gt;&amp;lt;STEAM_0:0:4864772&amp;gt;&amp;lt;CT&amp;gt;&amp;quot; say &amp;quot;test&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; say \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;063A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 11/04/2007 - 01:52:25: &amp;quot;[CoFR]FoxyFire&amp;lt;156&amp;gt;&amp;lt;STEAM_0:0:1362382&amp;gt;&amp;lt;CT&amp;gt;&amp;quot; say_team &amp;quot;go back door&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; say_team \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;063B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/11/2007 - 07:11:12: Team &amp;quot;CT&amp;quot; scored &amp;quot;6&amp;quot; with &amp;quot;0&amp;quot; players&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Team \&amp;quot;(.*)\&amp;quot; scored \&amp;quot;(.*)\&amp;quot; with \&amp;quot;(.*)\&amp;quot; players/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;065A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/02/2005 - 21:47:37: &amp;quot;Allies&amp;quot; scored &amp;quot;55&amp;quot; with &amp;quot;2&amp;quot; players&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; scored \&amp;quot;(.*)\&amp;quot; with \&amp;quot;(.*)\&amp;quot; players/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;065A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
############### AMXMODX ####################&lt;br /&gt;
        #L 10/28/2007 - 21:23:17: [admincmd.amxx] Cmd: &amp;quot;[FoCA|CoFR]Barnes&amp;lt;189&amp;gt;&amp;lt;STEAM_0:1:343958&amp;gt;&amp;lt;&amp;gt;&amp;quot; changelevel &amp;quot;de_dust2&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[admincmd.amxx\] Cmd: \&amp;quot;(.*)\&amp;quot; changelevel \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A03A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }            &lt;br /&gt;
        #L 06/03/2007 - 23:48:29: [admincmd.amxx] Cmd: &amp;quot;Simple Daddy&amp;lt;305&amp;gt;&amp;lt;STEAM_0:1:215772&amp;gt;&amp;lt;&amp;gt;&amp;quot; set cvar (name &amp;quot;sv_gravity&amp;quot;) (value &amp;quot;200&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[admincmd.amxx\] Cmd: \&amp;quot;(.*)\&amp;quot; set cvar \(name \&amp;quot;(.*)\&amp;quot;\) \(value \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A03A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }            &lt;br /&gt;
&lt;br /&gt;
        #L 10/28/2007 - 20:41:06: [admincmd.amxx] Cmd: &amp;quot;FoCA|LocoYokel[GH]&amp;lt;141&amp;gt;&amp;lt;STEAM_0:0:4864772&amp;gt;&amp;lt;&amp;gt;&amp;quot; ask for players list&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[admincmd.amxx\] Cmd: \&amp;quot;(.*)\&amp;quot; ask for players list/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A07A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }            &lt;br /&gt;
        &lt;br /&gt;
        #L 05/11/2007 - 06:46:18: [admin.amxx] Login: &amp;quot;(* ) ( *)&amp;lt;1&amp;gt;&amp;lt;STEAM_0:1:273255&amp;gt;&amp;lt;&amp;gt;&amp;quot; became an admin (account &amp;quot;STEAM_0:1:273255&amp;quot;) (access &amp;quot;bcdefghijklmnopqrstu&amp;quot;) (address &amp;quot;76.179.90.224&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[admin.amxx\] Login: \&amp;quot;(.*)\&amp;quot; became an admin \(account \&amp;quot;(.*)\&amp;quot;\) \(access \&amp;quot;(.*)\&amp;quot;\) \(address \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A50A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 10/28/2007 - 21:28:34: [plmenu.amxx] Kick: &amp;quot;FoCA|rochvegas j + astigmatism&amp;lt;192&amp;gt;&amp;lt;STEAM_0:0:63048&amp;gt;&amp;lt;&amp;gt;&amp;quot; kick &amp;quot;Ciggarette  / Gago&amp;lt;202&amp;gt;&amp;lt;STEAM_0:1:15378592&amp;gt;&amp;lt;&amp;gt;&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[plmenu.amxx\] Kick: \&amp;quot;(.*)\&amp;quot; kick \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A52B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }                    &lt;br /&gt;
        #L 06/17/2007 - 22:23:51: [admincmd.amxx] Kick: &amp;quot;FoCA|DRB&amp;lt;114&amp;gt;&amp;lt;STEAM_0:0:400966&amp;gt;&amp;lt;&amp;gt;&amp;quot; kick &amp;quot;|8|r90|Prim3[martyr]&amp;lt;143&amp;gt;&amp;lt;STEAM_0:1:2487360&amp;gt;&amp;lt;&amp;gt;&amp;quot; (reason &amp;quot;&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[admincmd.amxx\] Kick: \&amp;quot;(.*)\&amp;quot; kick \&amp;quot;(.*)\&amp;quot; \(reason \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A52C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }                    &lt;br /&gt;
        #L 06/19/2007 - 21:58:00: [admincmd.amxx] Ban: &amp;quot;FoCA|DRB&amp;lt;417&amp;gt;&amp;lt;STEAM_0:0:400966&amp;gt;&amp;lt;&amp;gt;&amp;quot; ban and kick &amp;quot;cl_utch&amp;lt;433&amp;gt;&amp;lt;STEAM_0:1:9428559&amp;gt;&amp;lt;&amp;gt;&amp;quot; (minutes &amp;quot;0&amp;quot;) (reason &amp;quot;&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[admincmd.amxx\] Ban: \&amp;quot;(.*)\&amp;quot; ban and kick \&amp;quot;(.*)\&amp;quot; \(minutes \&amp;quot;(.*)\&amp;quot;\) \(reason \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A52C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }                    &lt;br /&gt;
        #L 10/29/2007 - 01:12:55: [plmenu.amxx] Ban: &amp;quot;FoCA|LocoYokel[GH]&amp;lt;241&amp;gt;&amp;lt;STEAM_0:0:4864772&amp;gt;&amp;lt;&amp;gt;&amp;quot; ban and kick &amp;quot;Ctb  SSay&amp;lt;266&amp;gt;&amp;lt;STEAM_0:1:13406436&amp;gt;&amp;lt;&amp;gt;&amp;quot; (minutes &amp;quot;5&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[plmenu.amxx\] Ban: \&amp;quot;(.*)\&amp;quot; ban and kick \&amp;quot;(.*)\&amp;quot; \(minutes \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A52C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            } &lt;br /&gt;
        #L 05/06/2005 - 20:21:21: [admincmd.amxx] Cmd: &amp;quot;FoCA|Sturm[RR]&amp;lt;15&amp;gt;&amp;lt;STEAM_0:1:548458&amp;gt;&amp;lt;&amp;gt;&amp;quot; ban &amp;quot;STEAM_0&amp;quot; (minutes &amp;quot;:&amp;quot;) (reason &amp;quot;1&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[admincmd.amxx\] Cmd: \&amp;quot;(.*)\&amp;quot; ban \&amp;quot;(.*)\&amp;quot; \(minutes \&amp;quot;(.*)\&amp;quot;\) \(reason \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A52C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            } &lt;br /&gt;
            &lt;br /&gt;
        #L 05/20/2007 - 17:32:19: [plmenu.amxx] Cmd: &amp;quot;FoCA|OGWG Persecutor&amp;lt;51&amp;gt;&amp;lt;STEAM_0:0:266906&amp;gt;&amp;lt;&amp;gt;&amp;quot; transfer &amp;quot;xDf&amp;lt;69&amp;gt;&amp;lt;STEAM_0:1:14332828&amp;gt;&amp;lt;&amp;gt;&amp;quot; (team &amp;quot;TERRORIST&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[plmenu.amxx\] Cmd: \&amp;quot;(.*)\&amp;quot; transfer \&amp;quot;(.*)\&amp;quot; \(team \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A54A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }              &lt;br /&gt;
        #L 10/28/2007 - 22:10:11: [admincmd.amxx] Cmd: &amp;quot;FoCA|rochvegas j + astigmatism&amp;lt;192&amp;gt;&amp;lt;STEAM_0:0:63048&amp;gt;&amp;lt;&amp;gt;&amp;quot; change nick to &amp;quot;roch&#039;s slave&amp;quot; &amp;quot;Player&amp;lt;213&amp;gt;&amp;lt;STEAM_0:1:15118437&amp;gt;&amp;lt;&amp;gt;&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[admincmd.amxx\] Cmd: \&amp;quot;(.*)\&amp;quot; change nick to \&amp;quot;(.*)\&amp;quot; \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A56A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }                    &lt;br /&gt;
        #L 10/28/2007 - 21:12:41: [plmenu.amxx] Cmd: &amp;quot;FoCA|LocoYokel[GH]&amp;lt;141&amp;gt;&amp;lt;STEAM_0:0:4864772&amp;gt;&amp;lt;&amp;gt;&amp;quot; slay &amp;quot;[.icC.]Duke Nukem&amp;lt;183&amp;gt;&amp;lt;STEAM_0:1:13910450&amp;gt;&amp;lt;&amp;gt;&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[plmenu.amxx\] Cmd: \&amp;quot;(.*)\&amp;quot; slay \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A57A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }                    &lt;br /&gt;
        #L 06/20/2007 - 21:28:12: [admincmd.amxx] Cmd: &amp;quot;FoCA|LocoYokel[GH]&amp;lt;121&amp;gt;&amp;lt;STEAM_0:0:4864772&amp;gt;&amp;lt;&amp;gt;&amp;quot; slay &amp;quot;LCC Tank&amp;lt;125&amp;gt;&amp;lt;STEAM_0:1:13068210&amp;gt;&amp;lt;&amp;gt;&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[admincmd.amxx\] Cmd: \&amp;quot;(.*)\&amp;quot; slay \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A57A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }                    &lt;br /&gt;
        #L 10/28/2007 - 21:36:12: [admincmd.amxx] Cmd: &amp;quot;[FoCA|CoFR]Barnes&amp;lt;189&amp;gt;&amp;lt;STEAM_0:1:343958&amp;gt;&amp;lt;&amp;gt;&amp;quot; slap with 0 damage &amp;quot;FoCA|Senser&amp;lt;203&amp;gt;&amp;lt;STEAM_0:0:261108&amp;gt;&amp;lt;&amp;gt;&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[admincmd.amxx\] Cmd: \&amp;quot;(.*)\&amp;quot; slap with (.*) damage \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A57B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }                     &lt;br /&gt;
        #L 10/28/2007 - 20:42:41: [plmenu.amxx] Cmd: &amp;quot;FoCA|Rizzo&amp;lt;180&amp;gt;&amp;lt;STEAM_0:0:8245642&amp;gt;&amp;lt;&amp;gt;&amp;quot; slap with 0 damage &amp;quot;FoCA|Fullthrottle&amp;lt;160&amp;gt;&amp;lt;STEAM_0:1:386955&amp;gt;&amp;lt;&amp;gt;&amp;quot;            &lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[plmenu.amxx\] Cmd: \&amp;quot;(.*)\&amp;quot; slap with (.*) damage \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A57C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }                             &lt;br /&gt;
        #L 08/26/2007 - 18:12:02: [admincmd.amxx] Cmd: &amp;quot;FoCA|Chronik[BB]&amp;lt;151&amp;gt;&amp;lt;STEAM_0:1:2643832&amp;gt;&amp;lt;&amp;gt;&amp;quot; server console (cmdline &amp;quot;sv_alltalk 3&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[admincmd.amxx\] Cmd: \&amp;quot;(.*)\&amp;quot; server console \(cmdline \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A57D,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }             &lt;br /&gt;
        &lt;br /&gt;
        #L 10/28/2007 - 20:39:49: [adminchat.amxx] Chat: &amp;quot;FoCA|LocoYokel[GH]&amp;lt;141&amp;gt;&amp;lt;STEAM_0:0:4864772&amp;gt;&amp;lt;&amp;gt;&amp;quot; chat &amp;quot; who changed it?&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[adminchat.amxx\] Chat: \&amp;quot;(.*)\&amp;quot; chat \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A63A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }            &lt;br /&gt;
        #L 10/28/2007 - 20:43:30: [adminchat.amxx] Chat: &amp;quot;FoCA|LocoYokel[GH]&amp;lt;141&amp;gt;&amp;lt;STEAM_0:0:4864772&amp;gt;&amp;lt;&amp;gt;&amp;quot; tsay &amp;quot;hey RB&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[adminchat.amxx\] Chat: \&amp;quot;(.*)\&amp;quot; tsay \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A63B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }    &lt;br /&gt;
        #L 05/14/2007 - 23:36:46: [adminchat.amxx] Chat: &amp;quot;FoCA|LocoYokel[GH]&amp;lt;21&amp;gt;&amp;lt;STEAM_0:0:4864772&amp;gt;&amp;lt;&amp;gt;&amp;quot; csay &amp;quot;Friendly fire is on, verify your targets and do not shoot teammates.  Offenders WILL be kicked.&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[adminchat.amxx\] Chat: \&amp;quot;(.*)\&amp;quot; csay \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A63C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }              &lt;br /&gt;
        #L 05/16/2007 - 22:13:37: [adminchat.amxx] Chat: &amp;quot;FoCA|mother_goose&amp;lt;342&amp;gt;&amp;lt;STEAM_0:1:265230&amp;gt;&amp;lt;&amp;gt;&amp;quot; psay &amp;quot;FoCA|MudBone[GH]&amp;lt;337&amp;gt;&amp;lt;STEAM_0:1:717421&amp;gt;&amp;lt;&amp;gt;&amp;quot; &amp;quot;hey&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[adminchat.amxx\] Chat: \&amp;quot;(.*)\&amp;quot; psay \&amp;quot;(.*)\&amp;quot; \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A63D,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }              &lt;br /&gt;
        #L 05/04/2005 - 21:28:28: [adminchat.amxx] Chat: &amp;quot;[CoFR]STEELEAGLE|FoCA&amp;lt;1214&amp;gt;&amp;lt;STEAM_0:0:546319&amp;gt;&amp;lt;&amp;gt;&amp;quot; say &amp;quot;I thought he was a lost lamb&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[adminchat.amxx\] Chat: \&amp;quot;(.*)\&amp;quot; say \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A63D,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }              &lt;br /&gt;
        #L 05/16/2007 - 22:24:30: [adminvote.amxx] Vote: &amp;quot;FoCA|mother_goose&amp;lt;342&amp;gt;&amp;lt;STEAM_0:1:265230&amp;gt;&amp;lt;&amp;gt;&amp;quot; vote custom (question &amp;quot;should loco learn how to do an actual vote?&amp;quot;) (option#1 &amp;quot;yes&amp;quot;) (option#2 &amp;quot;no&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[adminvote.amxx\] Vote: \&amp;quot;(.*)\&amp;quot; vote custom \(question \&amp;quot;(.*)\&amp;quot;\) \(option#1 \&amp;quot;(.*)\&amp;quot;\) \(option#2 \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A80A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }              &lt;br /&gt;
        #L 06/04/2007 - 18:33:37: [adminvote.amxx] Vote: &amp;quot;FoCA|DRB&amp;lt;366&amp;gt;&amp;lt;STEAM_0:0:400966&amp;gt;&amp;lt;&amp;gt;&amp;quot; vote map (map &amp;quot;mindmaze&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[adminvote.amxx\] Vote: \&amp;quot;(.*)\&amp;quot; vote map \(map \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A80A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }              &lt;br /&gt;
        #L 05/16/2007 - 22:24:42: [adminvote.amxx] Vote: Voting successful (got &amp;quot;10&amp;quot;) (needed &amp;quot;1&amp;quot;) (result &amp;quot;should loco learn how to do an actual vote? - yes&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[adminvote.amxx\] Vote: Voting successful \(got \&amp;quot;(.*)\&amp;quot;\) \(needed \&amp;quot;(.*)\&amp;quot;\) \(result \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A80B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }             &lt;br /&gt;
        #L 05/20/2005 - 21:54:29: [adminvote.amxx] Vote: Voting failed (got &amp;quot;3&amp;quot;) (needed &amp;quot;6&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[adminvote.amxx\] Vote: Voting successful \(got \&amp;quot;(.*)\&amp;quot;\) \(needed \&amp;quot;(.*)\&amp;quot;\)$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A80B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }             &lt;br /&gt;
        #L 07/18/2007 - 17:04:18: [mapsmenu.amxx] Cmd: &amp;quot;FoCA|Scorp&amp;lt;2&amp;gt;&amp;lt;STEAM_0:0:7817668&amp;gt;&amp;lt;&amp;gt;&amp;quot; changelevel &amp;quot;as_crazytank&amp;quot;&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[mapsmenu.amxx\] Cmd: \&amp;quot;(.*)\&amp;quot; changelevel \&amp;quot;(.*)\&amp;quot;/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A81B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }       &lt;br /&gt;
        #L 05/12/2007 - 22:44:10: [mapchooser.amxx] Vote: Voting for the nextmap started&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[mapchooser.amxx\] Vote: Voting for the nextmap (.*)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A81C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 06/04/2007 - 18:33:50: [adminvote.amxx] Vote: Result accepted            &lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[mapchooser.amxx\] Vote: Result accepted/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A81C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 06/09/2007 - 01:27:43: [mapsmenu.amxx] Vote: Voting successful. Map will be changed to awp_city&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[mapchooser.amxx\] Vote: Voting successful. Map will be changed to (.*)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A81C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }           &lt;br /&gt;
        #L 05/05/2005 - 23:34:32: [mapsmenu.amxx] Vote: &amp;quot;FoCA|LocoYokel&amp;lt;1402&amp;gt;&amp;lt;STEAM_0:0:4864772&amp;gt;&amp;lt;&amp;gt;&amp;quot; vote maps (map#1 &amp;quot;dod_charlie&amp;quot;) (map#2 &amp;quot;&amp;quot;) (map#3 &amp;quot;&amp;quot;) (map#4 &amp;quot;&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[mapsmenu.amxx\] Vote: \&amp;quot;(.*)\&amp;quot; vote maps \(map#1 \&amp;quot;(.*)\&amp;quot;\) \(map#2 \&amp;quot;(.*)\&amp;quot;\) \(map#3 \&amp;quot;(.*)\&amp;quot;\) \(map#4 \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A81C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }           &lt;br /&gt;
        &lt;br /&gt;
        #L 10/28/2007 - 20:07:20: [mapsmenu.amxx] Vote: Result accepted&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[mapsmenu.amxx\] Vote: Result accepted/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A81C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
               &lt;br /&gt;
        #L 05/19/2005 - 23:06:42: [mapsmenu.amxx] Vote: Result refused&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[mapsmenu.amxx\] Vote: Result refused/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A81C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        #L 05/20/2005 - 21:54:29: [adminvote.amxx] Vote: Voting failed (got &amp;quot;3&amp;quot;) (needed &amp;quot;6&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[adminvote.amxx\] Vote: Voting failed \(got \&amp;quot;(.*)\&amp;quot;\) \(needed \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A81C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        #L 05/07/2005 - 21:49:37: [mapsmenu.amxx] Vote: Voting failed&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[mapsmenu.amxx\] Vote: Voting failed/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A81C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        #L 10/28/2007 - 20:07:18: [mapsmenu.amxx] Vote: Voting successful. Map will be changed to as_tundra&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[mapsmenu.amxx\] Vote: Voting successful. Map will be changed to (.*)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A81C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }    &lt;br /&gt;
        #L 05/11/2005 - 21:44:40: [adminreservation.amxx] [AdminReservation] =[21st]=Maj.Vash was kicked to free a slot for [CoFR]Big Shirtless Ron!&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[adminreservation.amxx\] \[AdminReservation\] (.*) was kicked to free a slot for (.*)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;A81C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }    &lt;br /&gt;
&lt;br /&gt;
################### STATS #################################&lt;br /&gt;
&lt;br /&gt;
        #L 09/07/2007 - 04:25:12: &amp;quot;Koopa Koop&amp;lt;44&amp;gt;&amp;lt;STEAM_0:0:63055&amp;gt;&amp;lt;CT&amp;gt;&amp;quot; attacked &amp;quot;MM | lil [IRA]&amp;lt;49&amp;gt;&amp;lt;STEAM_0:1:406035&amp;gt;&amp;lt;CT&amp;gt;&amp;quot; with &amp;quot;grenade&amp;quot; (damage &amp;quot;77&amp;quot;) (damage_armor &amp;quot;0&amp;quot;) (health &amp;quot;23&amp;quot;) (armor &amp;quot;0&amp;quot;)&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \&amp;quot;(.*)\&amp;quot; attacked \&amp;quot;(.*)\&amp;quot; with \&amp;quot;(.*)\&amp;quot; \(damage \&amp;quot;(.*)\&amp;quot;\) \(damage_armor \&amp;quot;(.*)\&amp;quot;\) \(health \&amp;quot;(.*)\&amp;quot;\) \(armor \&amp;quot;(.*)\&amp;quot;\)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;B01A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }                    &lt;br /&gt;
        #L 05/02/2005 - 23:04:49: Final Scores: Allies: 94   Axis: 476&lt;br /&gt;
        elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Final Scores: (.*): (.*) (.*): (.*)/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;B01B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
################ MISC ADDONS #################&lt;br /&gt;
&lt;br /&gt;
#L 05/14/2005 - 23:27:54: [ADMIN] IRONHAND has forgiven FoCA|Whatfer&#039;s TK.&lt;br /&gt;
       elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[ADMIN\] (.*) has forgiven (.*)\&#039;s TK.$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C01A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 05/14/2005 - 23:28:24: [ADMIN] [CoFR]Keeve TK warning 1 of 3&lt;br /&gt;
       elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[ADMIN\] (.*) TK warning (.*) of (.*)$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C01B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 05/02/2005 - 22:08:50: [ADMIN] FoCA|moondance Slayed for teammate attack after respawn&lt;br /&gt;
       elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[ADMIN\] (.*) Slayed for teammate attack after respawn$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C01C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 05/05/2005 - 23:40:18: [ADMIN] Nix Slayed for violating 3 TK warning&lt;br /&gt;
       elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[ADMIN\] (.*) Slayed for violating (.*) TK warning$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C01C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 05/06/2005 - 21:13:04: [ADMIN] deiter Exceeded 3 TK limit and is BANNED for 1 minutes&lt;br /&gt;
       elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[ADMIN\] (.*) Exceeded (.*) TK limit and is BANNED for (.*) minutes$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C01C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 05/12/2005 - 23:43:10: [ADMIN] FoCA|Ogre Slayed for melee attack&lt;br /&gt;
       elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[ADMIN\] (.*) Slayed for melee attack$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C01C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
#L 10/27/2007 - 08:07:31: Loaded 128 Maps into the maps that will be picked for the vote&lt;br /&gt;
       elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Loaded (.*) Maps into the maps that will be picked for the vote$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C02A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 09/13/2007 - 18:10:47: Nominations for the map vote: 0 out of 5 possible nominations&lt;br /&gt;
       elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Nominations for the map vote: (.*) out of (.*) possible nominations$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C02A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 09/13/2007 - 18:10:47: Randomly Filling slots for the vote with 5 out of 128&lt;br /&gt;
       elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Randomly Filling slots for the vote with (.*) out of (.*)$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C02A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 09/13/2007 - 18:10:47: Filled 5 vote slots with random maps, 5 are custom&lt;br /&gt;
       elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Filled (.*) vote slots with random maps, (.*) are custom$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C02A,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 10/27/2007 - 07:19:39: Banned 1 Maps in your mapstoban.ini file&lt;br /&gt;
       elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Banned (.*) Maps in your mapstoban.ini file$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C02B,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 10/27/2007 - 07:19:39: 1 Maps were not loaded because they were the last maps played, or defined twice, or banned&lt;br /&gt;
elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): (.*) Maps were not loaded because they were the last maps played, or defined twice, or banned$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C02C,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 10/27/2007 - 07:19:39: Found 12 Maps in your mapcycle.txt/allmaps.txt file, 7 are available for filling slots&lt;br /&gt;
elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Found (.*) Maps in your mapcycle.txt\/allmaps.txt file, (.*) are available for filling slots$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C02D,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 10/26/2007 - 06:09:27: Vote: Voting for the nextmap started&lt;br /&gt;
elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Vote: Voting for the nextmap started$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C02E,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
#L 10/26/2007 - 06:09:47: Vote: Voting for the nextmap finished. The nextmap will be de_dust&lt;br /&gt;
elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Vote: Voting for the nextmap finished. The nextmap will be (.*)$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C02F,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 09/15/2007 - 05:13:04: -------- Mapchange to awp_war --------&lt;br /&gt;
elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): -------- Mapchange to (.*) --------$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C02G,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
#L 05/01/2005 - 16:16:58: -------- Mapchange --------&lt;br /&gt;
elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): -------- Mapchange --------$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C02G,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
#L 06/19/2007 - 21:26:40: Server say &amp;quot;DRB I need your steam id to fix the ban&amp;quot;&lt;br /&gt;
elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): Server say \&amp;quot;(.*)\&amp;quot;$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C03G,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 09/15/2007 - 04:48:35: FoCA|quibeep has left; de_dust is no longer nominated&lt;br /&gt;
elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): (.*) has left; (.*) is no longer nominated$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C03H,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
#L 05/31/2005 - 17:19:23: [DODX] dev: called: GiveFnptrsToDll&lt;br /&gt;
elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): \[DODX\] (.*)$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C03H,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
#L 05/14/2005 - 13:13:22: FATAL ERROR (shutting down): models/mapmodels/hedgehog.mdl has been modified since starting the engine.  Consider running system diagnostics to check for faulty hardware.&lt;br /&gt;
elsif ($LOGLINE =~ m/^L (\d\d)\/(\d\d)\/(\d\d\d\d) - (\d\d:\d\d:\d\d): FATAL ERROR \(shutting down\): (.*)$/)&lt;br /&gt;
            {&lt;br /&gt;
            print DONE_OUT &amp;quot;C04H,$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
################&lt;br /&gt;
################&lt;br /&gt;
&lt;br /&gt;
        else&lt;br /&gt;
            {&lt;br /&gt;
            print TODO_OUT &amp;quot;$LINES[$lineno];&amp;quot;;&lt;br /&gt;
            #print &amp;quot;$LINES[$lineno];&amp;quot;;                        &lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Perl]]&lt;br /&gt;
[[Category:Gaming]]&lt;br /&gt;
[[Category:Weblog-2007-11]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=VoYD&amp;diff=2046</id>
		<title>VoYD</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=VoYD&amp;diff=2046"/>
		<updated>2026-08-27T22:53:02Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Misc */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Gigs=&lt;br /&gt;
* https://voyd.mikebeane.com&lt;br /&gt;
* [https://docs.google.com/spreadsheets/d/e/2PACX-1vS3fepEaCnI1XjzccsC7SXo5Dno9X6jm9Ghy7ubFGn9BAleei9UiFG3L8lFoSh6xmEpiqH8OiIRLVIG/pubhtml?gid=2044986723&amp;amp;single=true Calendar Output]&lt;br /&gt;
&lt;br /&gt;
=Misc=&lt;br /&gt;
==DR==&lt;br /&gt;
Deliver YT 1920x1080&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Cam3&lt;br /&gt;
.720&lt;br /&gt;
-717.0000&lt;br /&gt;
&lt;br /&gt;
Cam1&lt;br /&gt;
1    1&lt;br /&gt;
x 389&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Older==&lt;br /&gt;
* https://bit.ly/VoYDCalendar&lt;br /&gt;
&lt;br /&gt;
=Set List Mirror=&lt;br /&gt;
* [https://docs.google.com/spreadsheets/d/e/2PACX-1vQuDii0jPXrJPLGpp7I5wUEK6LWnRiEbuTezg-jLlTTVCzW63hOKYSgT3hzkxquQGcSYx3Hgk5VM0MI/pubhtml#gid=0 3 Sets]&lt;br /&gt;
* https://bit.ly/VoYD3&lt;br /&gt;
[[Category:VoYD]]&lt;br /&gt;
[[Category:Music]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=VoYD&amp;diff=2045</id>
		<title>VoYD</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=VoYD&amp;diff=2045"/>
		<updated>2026-08-27T22:52:29Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Gigs=&lt;br /&gt;
* https://voyd.mikebeane.com&lt;br /&gt;
* [https://docs.google.com/spreadsheets/d/e/2PACX-1vS3fepEaCnI1XjzccsC7SXo5Dno9X6jm9Ghy7ubFGn9BAleei9UiFG3L8lFoSh6xmEpiqH8OiIRLVIG/pubhtml?gid=2044986723&amp;amp;single=true Calendar Output]&lt;br /&gt;
&lt;br /&gt;
=Misc=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Cam3&lt;br /&gt;
.720&lt;br /&gt;
-717.0000&lt;br /&gt;
&lt;br /&gt;
Cam1&lt;br /&gt;
1    1&lt;br /&gt;
x 389&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Older==&lt;br /&gt;
* https://bit.ly/VoYDCalendar&lt;br /&gt;
&lt;br /&gt;
=Set List Mirror=&lt;br /&gt;
* [https://docs.google.com/spreadsheets/d/e/2PACX-1vQuDii0jPXrJPLGpp7I5wUEK6LWnRiEbuTezg-jLlTTVCzW63hOKYSgT3hzkxquQGcSYx3Hgk5VM0MI/pubhtml#gid=0 3 Sets]&lt;br /&gt;
* https://bit.ly/VoYD3&lt;br /&gt;
[[Category:VoYD]]&lt;br /&gt;
[[Category:Music]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Maine_shines_after_Navy_tour&amp;diff=2044</id>
		<title>Maine shines after Navy tour</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Maine_shines_after_Navy_tour&amp;diff=2044"/>
		<updated>2026-08-27T10:47:14Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Article in the Morning Sentinel on 01/22/2008&lt;br /&gt;
&lt;br /&gt;
[[Image:Mike article.jpg|thumbnail]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Maine shines after Navy tour&lt;br /&gt;
&lt;br /&gt;
By Morning Sentinel staff&lt;br /&gt;
&lt;br /&gt;
Living in Maine is costing Michael Beane money, and he knows it.&lt;br /&gt;
&lt;br /&gt;
Just a couple of hundred miles south of his Newport home, Beane&#039;s&lt;br /&gt;
friends in Boston earn almost twice the money in jobs similar to &lt;br /&gt;
Beane&#039;s position as a systems analyst at Pittsfield&#039;s Sebasticook &lt;br /&gt;
Valley Hospital.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See the full article [http://morningsentinel.mainetoday.com/news/local/4661455.html here] or if that no longer exists, you can read it [http://www.mikebeane.com/index.php?title=Maine_shines_after_Navy_tour&amp;amp;oldid=730 here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It no longer exists and you can read it here:&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Maine shines after Navy tour&#039;&#039;&#039; ===&lt;br /&gt;
&#039;&#039;By Morning Sentinel staff&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kennebec Journal, Morning Sentinel &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
01/22/2008&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Living in Maine is costing Michael Beane money, and he knows it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Just a couple of hundred miles south of his Newport home, Beane&#039;s friends in Boston earn almost twice the money in jobs similar to Beane&#039;s position as a systems analyst at Pittsfield&#039;s Sebasticook Valley Hospital.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Yet, when he and his wife, Fiona, reflect on what their two children are getting out of growing up in his home state of Maine, Beane knows his fortune is being invested in the future.  &amp;quot;Maine has a comfortable, constant speed to it,&amp;quot; Beane said. &amp;quot;Some places just seem to be fast for the sake of being fast, and that doesn&#039;t sit well with me. It&#039;s not that I can&#039;t navigate the big city and stay there. It&#039;s just that I don&#039;t want to.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A Benton native, Beane, 33, graduated from Lawrence High School in Fairfield in 1992. He had the grades for college, but the idea held no appeal.  &amp;quot;I didn&#039;t really prepare myself in high school to go to college,&amp;quot; Beane said. &amp;quot;I&#039;m a path of least resistance kind of guy.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beane looked to the Navy for direction. He headed to basic training in San Diego in 1993 believing he would never return to Maine for more than family visits.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;I left here February 21st of 1993,&amp;quot; Beane recalled. &amp;quot;If you look at the weather that day we had the most snow we&#039;d had in years. I was happy to be going.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The Navy allowed Beane to pick a school after he graduated from basic training in the top 5 percent of his class. The southern California life agreed with him, so Beane spent another year in San Diego learning to be a sonar technician.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;I picked night classes so I got to get up in the morning and go to the beach,&amp;quot; Beane said. &amp;quot;Life was good.&amp;quot;  Beane again graduated near the top of his class, and the Navy again allowed him to pick his assignment.  His superiors were stunned when Beane decided to return to Maine to serve at a duty station as the destroyer USS Laboon was being built at Bath Iron Works.  &amp;quot;The Navy brought me back to Maine,&amp;quot; Beane said. &amp;quot;The other choice was Corpus Christi, Texas. I think 107 was the average temperature down there. For a lot of reasons it was a no-brainer for me to come home.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beane spent a year living in a hotel in Brunswick. He drove to Benton to visit his family just about every weekend, but for the most part Beane was seeing Maine as an adult for the first time.  &amp;quot;When I came back with the Navy I saw Maine from a different perspective,&amp;quot; Beane said.  Beane spent the last 18 months of his service in the Laboon&#039;s home port in Virginia and six months traveling the waters around Crete, Morocco and the Persian Gulf, where in September 1996, the Laboon launched its missiles in support of Operation Desert Strike.  Beane was ready to leave the Navy when his commitment was up in 1997.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;quot;I didn&#039;t hate the Navy,&amp;quot; he said. &amp;quot;I was just kind of done with it.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
At 23, Beane decided to head home to Maine again.  He spent two-plus years at the University of Maine at Orono -- where he met Fiona -- studying computer science, before transferring to Eastern Maine Technical College in Bangor (now Eastern Maine Community College). He graduated with an associate&#039;s degree in computer networking in 2002.  Beane took a job as a service manager for a small Bangor company, Automated Business Concepts, just before graduation. The company sent Beane and his new wife, Fiona, to Manchester, N.H., where they stayed for almost a year.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As it had before, Maine beckoned. When Fiona became pregnant with the couple&#039;s first child Beane requested a transfer back to Bangor and, in 2003, the Beanes returned home for good.  &amp;quot;It was really the pull of family,&amp;quot; Beane said. &amp;quot;That was the catalyst to come back.&amp;quot;  Beane took a job at the hospital in 2004, the same year the baby was born, and they purchased their first home, in Newport.  Beane has no regrets about living in Maine, but he acknowledges it is not easy. Jobs do not pay as much and there is a dearth of industry to buoy the economy as a whole.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Beanes were committed to Fiona staying home to care for their children but she has recently returned to work to help with the family&#039;s budget.  &amp;quot;We&#039;re seeing the cost of heating fuel and now gasoline (stressing) family budgets, and the effects on the local economies are noticeable,&amp;quot; Beane said. &amp;quot;We&#039;ve seen work that was done in the state for quite some time now go elsewhere, resulting in closures and job losses, which has put a strain on the state and the people who live here.&amp;quot;  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The same thing that makes Maine so appealing as a place to live could also save it, Beane believes.  &amp;quot;I wish the state could find a good way to attract business back into the state by exploiting what we&#039;re rich in: people who perform quality, hard work,&amp;quot; Beane said.  Beane hopes his family will always be able to stay in Maine. With both his and Fiona&#039;s extended families so close it is nearly an ideal situation, he said.  &amp;quot;I can&#039;t come up with any good reasons to leave that are good life decisions,&amp;quot; Beane said. &amp;quot;I&#039;m in a fairly stable industry in a position that I am both happy and thankful for, working in a place with great people, living in an area with equally great people. I&#039;m very go-with-the-flow about things and, well, the flow is good here.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Craig Crosby -- 487-3288&lt;br /&gt;
&lt;br /&gt;
ccrosby@centralmaine.com&lt;br /&gt;
[[Category:Weblog-2008-01]]&lt;br /&gt;
[[Category:Family]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Mediawiki_1.43_from_1.39&amp;diff=2043</id>
		<title>Mediawiki 1.43 from 1.39</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Mediawiki_1.43_from_1.39&amp;diff=2043"/>
		<updated>2026-08-27T10:40:27Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Background */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Things to Look At=&lt;br /&gt;
* https://www.mediawiki.org/wiki/Extension:DynamicPageList (consider replacing Intersection with this)&lt;br /&gt;
=Background=&lt;br /&gt;
This was a WhatIf page to map out 1.39 to 1.43 with a thought of waiting until November for 1.47 LTS... but I went for it this past week.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=LTS=&lt;br /&gt;
Note: To upgrade MediaWiki, you can upgrade from the two most recent Long Term Support (LTS) versions directly.  If you are using an older version, you must first upgrade to one of the two latest LTS versions before proceeding to the latest version.&lt;br /&gt;
&lt;br /&gt;
=The Path=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Version !! MySQL !! PHP !! Jumps !! Status !! Notes &lt;br /&gt;
|-&lt;br /&gt;
| MediaWiki 1.39.5 LTS || MySQL 8.0.46 || PHP 8.1.2 || 0 || Current || &lt;br /&gt;
|-&lt;br /&gt;
| MediaWiki 1.43 LTS || MySQL 5.7.0+ (good) || PHP 8.1.0+ (good)  || 1 || Could do now ||  &lt;br /&gt;
|-&lt;br /&gt;
| MediaWiki 1.47 LTS || MySQL 5.7.0+ (good)  || PHP 8.3.0+ &#039;&#039;&#039;(need to update)&#039;&#039;&#039; || 2 ||  ||  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=The Process=&lt;br /&gt;
The last few times I&#039;ve done this I have been honing in on &#039;what is the basic approach to updating Mediawiki?&#039; and I think I&#039;m there now.&lt;br /&gt;
==Naming==&lt;br /&gt;
# Create the databases with the wiki version in the name. End it with _139 or something.&lt;br /&gt;
# Create the site directories in the same fashion.  Use symlinks for the actual &amp;quot;public&amp;quot; name.&lt;br /&gt;
## example: rabbibob\-&amp;gt;rabbibob_139\&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I started doing this so updates were more agile.  When I want to go to 143, I can create rabbibob_143\ and use that as a fresh area to configure, then shift the symlink when it is all done.  Copying the db from the _139 into a new _143 is the other key.  Editing LocalSettings.php allows for the ability to do this.  The limitation is if php or mysql requirements don&#039;t allow to the older or the new version to cohabitate.&lt;br /&gt;
&lt;br /&gt;
==Mediawiki==&lt;br /&gt;
# Know the requirements for where you are and where you need to get to in regards to MySQL and PHP requiremnts.&lt;br /&gt;
#* Sometimes a major revision upgrade of the OS carries these with them and it might be worth updating the OS or starting a fresh install&lt;br /&gt;
# BACK THINGS UP &lt;br /&gt;
# List your extensions (go to the Special:Version page, copy that page out to a Google Sheet so the links are intact)&lt;br /&gt;
# Create a new database_### and import the previous version db into that&lt;br /&gt;
# Create a new html dir mediawiki_### and import the target mediawiki into that&lt;br /&gt;
# Copy LocalSettings.php into the new dir from the old dir&lt;br /&gt;
# Edit LocalSettings.php&lt;br /&gt;
## Update the following with temporary values&lt;br /&gt;
##* $wgScriptPath&lt;br /&gt;
##* $wgServer&lt;br /&gt;
## Comment out all of the extensions&lt;br /&gt;
## Set the skin to one that comes stock&lt;br /&gt;
# run php maintenance\update.php from the command line&lt;br /&gt;
# Copy the images/ directory from the old install&lt;br /&gt;
# Update file permissions as needed during testing&lt;br /&gt;
# Work through the extensions&lt;br /&gt;
#* It is worth curating the extensions so you know what is custom and came with the new update&lt;br /&gt;
#* Comment out any that you are not using&lt;br /&gt;
#* Add ## or #! for ones that crash MW&lt;br /&gt;
# Work through the skins&lt;br /&gt;
# When everything is working, set the symlink to the new dir&lt;br /&gt;
# Edit LocalSettings.php&lt;br /&gt;
#* $wgScriptPath&lt;br /&gt;
#* $wgServer&lt;br /&gt;
===Clean Up Thoughts===&lt;br /&gt;
* Set up your backups if exporting the db and backing up the html directories.&lt;br /&gt;
&lt;br /&gt;
=OLD NOTES BELOW=&lt;br /&gt;
==Requirements==&lt;br /&gt;
Required software as of MediaWiki 1.47.0:&lt;br /&gt;
&lt;br /&gt;
* Web server with PHP 8.3.0 or higher, plus the following extensions:&lt;br /&gt;
** ctype&lt;br /&gt;
** dom&lt;br /&gt;
** fileinfo&lt;br /&gt;
** iconv&lt;br /&gt;
** intl&lt;br /&gt;
** libxml&lt;br /&gt;
** mbstring&lt;br /&gt;
** openssl&lt;br /&gt;
** xml&lt;br /&gt;
** xmlreader&lt;br /&gt;
* A SQL server, the following types are supported&lt;br /&gt;
** MariaDB 10.11 or higher&lt;br /&gt;
** MySQL 5.7.0 or higher&lt;br /&gt;
** PostgreSQL 10 or higher&lt;br /&gt;
** SQLite 3.31.0 or higher&lt;br /&gt;
&lt;br /&gt;
=June Notes=&lt;br /&gt;
==PHP 8.4==&lt;br /&gt;
* This can be done prior to the major jump as 1.39 supports 8.4&lt;br /&gt;
===Steps===&lt;br /&gt;
* dpkg -l | grep php&lt;br /&gt;
* sudo apt-get install php8.4&lt;br /&gt;
* sudo apt install php8.4-cli php8.4-common php8.4-mysql php8.4-zip php8.4-gd php8.4-mbstring php8.4-curl php8.4-xml php8.4-bcmath&lt;br /&gt;
* sudo apt install php8.4-redis php8.4-pcov php8.4-imagick php8.4-intl&lt;br /&gt;
* dpkg -l | grep php&lt;br /&gt;
* sudo update-alternatives --config php&lt;br /&gt;
* php -v&lt;br /&gt;
* sudo a2dismod php7.4 9&lt;br /&gt;
* sudo a2enmod php8.4&lt;br /&gt;
* sudo systemctl restart apache2&lt;br /&gt;
* Check wiki version, should be at 8.4.x&lt;br /&gt;
==MySQL==&lt;br /&gt;
# copy the existing db into a new db_1.43&lt;br /&gt;
# set permissions&lt;br /&gt;
&lt;br /&gt;
==Mediawiki Files==&lt;br /&gt;
# Make a list of the extensions...&lt;br /&gt;
# sudo mkdir it-wiki-1.43&lt;br /&gt;
# chown it:www-data it-wiki-1.43&lt;br /&gt;
# upload new files to 1.43&lt;br /&gt;
# cp /var/www/html/wiki-1.39/LocalSettings.php  /var/www/html/wiki-1.43&lt;br /&gt;
# cp -r /var/www/html/wiki-1.39/images/ /var/www/html/wiki-1.43/&lt;br /&gt;
# set permissions&lt;br /&gt;
#* sudo chown -R it:www-data /var/www/html/wiki-1.43/images&lt;br /&gt;
#* sudo chmod -R 775 /var/www/html/wiki-1.43/images&lt;br /&gt;
# edit LocalSettings.php to reflect url path for testing&lt;br /&gt;
# $wgScriptPath&lt;br /&gt;
# $wgServer&lt;br /&gt;
# change the db to 143&lt;br /&gt;
# set the skin to vector (shut off foreground)&lt;br /&gt;
# disable extensions&lt;br /&gt;
# Test&lt;br /&gt;
# sort out extensions and cleanup LocalSettings.php&lt;br /&gt;
&lt;br /&gt;
===Changeover===&lt;br /&gt;
After testing...&lt;br /&gt;
# Set the symlink to the new dir&lt;br /&gt;
# $wgScriptPath&lt;br /&gt;
# $wgServer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=The Approach=&lt;br /&gt;
* ALL THIS STUFF IS FROM THE LAST PAGE, REVAMP IT!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prepping the Databases==&lt;br /&gt;
# Backup the MW databases&lt;br /&gt;
# Find my Google sheet with notes&lt;br /&gt;
# Tally the extensions in use and find out what is still being maintained.&lt;br /&gt;
#* From the old sites I made copy of the Extensions that were installed via the Special:Version page&lt;br /&gt;
# Upgrade MySQL&lt;br /&gt;
# Upgrade PHP&lt;br /&gt;
* I installed the lowest version of MediaWiki I required and verified it worked.&lt;br /&gt;
** I then pulled in a backup of my two wiki sites&lt;br /&gt;
** I imported images/ from the same site&lt;br /&gt;
** I pointed mediawiki (via localsettings.php) at one of the databases&lt;br /&gt;
*** Ran maintenance/update.php --force&lt;br /&gt;
** Verified that the information loaded in the new site&lt;br /&gt;
* NOTE: I entirely ignored Skins and Extensions.&lt;br /&gt;
* Repeated for Site #2&lt;br /&gt;
* Once I had a working MW site for each database, I installed the next LTS MW version.&lt;br /&gt;
* Repeated the above steps&lt;br /&gt;
* Once I had a working MW site for each database, I installed the next LTS MW version.&lt;br /&gt;
* Repeated the above steps&lt;br /&gt;
* Eventually I had two working MW databases at 1.39&lt;br /&gt;
==New Ubuntu Server==&lt;br /&gt;
* I created a new Ubuntu 22.04 server and on this one, I took the time to set up various security related items.&lt;br /&gt;
* I opted to put&lt;br /&gt;
** MySQL at 8.0.35-0ubuntu0.22.04.1 &lt;br /&gt;
** php at 8.1.2-1ubuntu2.14 (apache2handler)&lt;br /&gt;
* Installed apache2, created a new MW1.39LTS site to verify it ran under the new software.&lt;br /&gt;
* From there, I imported the two site databases, copied the 1.39 directory to two separate directories, set up MW, imported images and all was good.&lt;br /&gt;
==Extensions and Skins==&lt;br /&gt;
* The Skin was freshly installed from the latest version.  Not much of an issue there.&lt;br /&gt;
* This was a little more tedious: I matched up the default 1.39 extensions against the old site listings and then went looking to for the latest extensions.&lt;br /&gt;
** Some extensions were still in production&lt;br /&gt;
** Some were not&lt;br /&gt;
* Fiddled until things were working.  Had to fix some code for YouTube.&lt;br /&gt;
&lt;br /&gt;
=Summary=&lt;br /&gt;
* I tried this about seven months ago and I was attempting to update the extensions as I went: this was not the way to go.  Getting the database updated was the key and ignoring everything else made that easier to do.  All a wiki really is at the base is the information (database) and the images/... everything else is functionality.&lt;br /&gt;
&lt;br /&gt;
[[Category:Wiki]]&lt;br /&gt;
[[Category:Weblog-2026-08]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=ElasticSearch_on_MediaWiki&amp;diff=2042</id>
		<title>ElasticSearch on MediaWiki</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=ElasticSearch_on_MediaWiki&amp;diff=2042"/>
		<updated>2026-08-27T10:33:25Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Job */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installing and Configuring CirrusSearch with Elasticsearch ==&lt;br /&gt;
&lt;br /&gt;
Setting up &#039;&#039;&#039;CirrusSearch&#039;&#039;&#039; with Elasticsearch requires three main phases: installing the Elasticsearch cluster, downloading the required MediaWiki extensions (Elastica and CirrusSearch), and building the search index via MediaWiki maintenance scripts.&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
* &#039;&#039;&#039;MediaWiki 1.39+:&#039;&#039;&#039; Recommended Elasticsearch 7.10.2 (or OpenSearch 1.3+).&lt;br /&gt;
* &#039;&#039;&#039;PHP:&#039;&#039;&#039; The PHP &amp;lt;code&amp;gt;cURL&amp;lt;/code&amp;gt; extension must be enabled.&lt;br /&gt;
* &#039;&#039;&#039;Composer:&#039;&#039;&#039; See https://getcomposer.org/install for more information.&lt;br /&gt;
* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;DATABASE NAMES MUST BE ALL LOWERCASE!&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Composer Install====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
sudo apt install curl php-cli php-mbstring git unzip&lt;br /&gt;
php -r &amp;quot;copy(&#039;https://getcomposer.org/installer&#039;, &#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
php composer-setup.php --install-dir=/usr/local/bin --filename=composer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Install &amp;amp; Start Elasticsearch ===&lt;br /&gt;
Install Elasticsearch on your server (instructions below are for Ubuntu/Debian):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Install Java runtime if not already installed&lt;br /&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt install -y openjdk-17-jre-headless&lt;br /&gt;
&lt;br /&gt;
# Install Elasticsearch 7.x&lt;br /&gt;
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.2-amd64.deb&lt;br /&gt;
sudo dpkg -i elasticsearch-7.10.2-amd64.deb&lt;br /&gt;
&lt;br /&gt;
# Enable and start the service&lt;br /&gt;
sudo systemctl enable --now elasticsearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To verify it is running on &amp;lt;code&amp;gt;localhost:9200&amp;lt;/code&amp;gt;, test it in your terminal with &amp;lt;code&amp;gt;curl http://localhost:9200&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Download the MediaWiki Extensions ===&lt;br /&gt;
CirrusSearch depends on &#039;&#039;&#039;Extension:Elastica&#039;&#039;&#039; to serve as the PHP client bridge.&lt;br /&gt;
&lt;br /&gt;
# Navigate to your MediaWiki &amp;lt;code&amp;gt;extensions/&amp;lt;/code&amp;gt; directory:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /var/www/html/&amp;lt;yourWebDir&amp;gt;/extensions&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Download both Elastica and CirrusSearch (replace &amp;lt;code&amp;gt;REL1_39&amp;lt;/code&amp;gt; with your MediaWiki branch version, e.g., &amp;lt;code&amp;gt;REL1_40&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;REL1_43&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone -b REL1_43 https://gerrit.wikimedia.org/r/mediawiki/extensions/Elastica&lt;br /&gt;
git clone -b REL1_43 https://gerrit.wikimedia.org/r/mediawiki/extensions/CirrusSearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Install PHP Dependencies:&#039;&#039;&#039; If you cloned the extensions via Git, you must install the Composer dependencies inside both extension folders:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd Elastica &amp;amp;&amp;amp; composer config policy.advisories.block false &amp;amp;&amp;amp; composer install --no-dev &amp;amp;&amp;amp; cd ..&lt;br /&gt;
cd CirrusSearch &amp;amp;&amp;amp; composer config policy.advisories.block false &amp;amp;&amp;amp; composer install --no-dev &amp;amp;&amp;amp; cd ..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Configure LocalSettings.php ===&lt;br /&gt;
Open your &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file and add the following block at the bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// 1. Load the required extensions&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
&lt;br /&gt;
// 2. Specify your Elasticsearch server location&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
&lt;br /&gt;
// 3. Temporarily disable search updates during bootstrapping&lt;br /&gt;
$wgDisableSearchUpdate = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 4: Generate and Bootstrap the Search Index ===&lt;br /&gt;
Run the maintenance scripts from your MediaWiki root directory to build and populate the Elasticsearch index.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Configure the index structure:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php CirrusSearch:UpdateSearchIndexConfig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Re-enable live search updates:&#039;&#039;&#039; Go back into &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; and &#039;&#039;&#039;remove or comment out&#039;&#039;&#039; the &amp;lt;code&amp;gt;$wgDisableSearchUpdate = true;&amp;lt;/code&amp;gt; line.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Populate the index with your wiki&#039;s page content:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php CirrusSearch:ForceSearchIndex --skipLinks --indexOnSkip&lt;br /&gt;
php maintenance/run.php CirrusSearch:ForceSearchIndex --skipParse&lt;br /&gt;
php maintenance/run.php runJobs&lt;br /&gt;
&lt;br /&gt;
# if the above fails out, the db may be too big in various aspects, give the command more memory:&lt;br /&gt;
php -d memory_limit=1G maintenance/run.php runJobs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Verify the indexes, this should show your db with count details.  If 0, re-run the above commands again and re-test.&lt;br /&gt;
curl -X GET &amp;quot;localhost:9200/_cat/indices?v&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*: &#039;&#039;Note: For smaller wikis, running just &amp;lt;code&amp;gt;php maintenance/run.php CirrusSearch:ForceSearchIndex&amp;lt;/code&amp;gt; is usually sufficient.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Step 5: Switch MediaWiki to Use CirrusSearch ===&lt;br /&gt;
Once indexing completes successfully, add the final setting to &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; to hand search queries over to Elasticsearch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Direct default search traffic to CirrusSearch&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test a search query on your wiki&#039;s &amp;lt;code&amp;gt;Special:Search&amp;lt;/code&amp;gt; page. Your results should now be powered by Elasticsearch!&lt;br /&gt;
&lt;br /&gt;
=== Step 6: LocalSettings.php Cleanup ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
## CUSTOM ELASTIC SEARCH&lt;br /&gt;
// Force CirrusSearch overrides at the very end of LocalSettings.php&lt;br /&gt;
# https://gerrit.wikimedia.org/g/mediawiki/extensions/CirrusSearch/%2B/HEAD/docs/settings.txt&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
&lt;br /&gt;
// Ensure fallback to core MySQL is explicitly disabled for testing&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Force exact database prefix matching for CirrusSearch&lt;br /&gt;
$wgCirrusSearchClusterOverrides = [&lt;br /&gt;
    &#039;default&#039; =&amp;gt; [&lt;br /&gt;
        &#039;replica&#039; =&amp;gt; &#039;127.0.0.1&#039;&lt;br /&gt;
    ]&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
$wgJobRunRate = 0;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 7: Setup Crontab Job ===&lt;br /&gt;
====Logs====&lt;br /&gt;
# Setup a log dir (probably should revisit this some day and do a proper rotation)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /var/log/mediawiki&lt;br /&gt;
sudo chown it:it /var/log/mediawiki&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Log Rotate====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo nano /etc/logrotate.d/mediawiki&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
/var/log/mediawiki/*.log {&lt;br /&gt;
    daily&lt;br /&gt;
    missingok&lt;br /&gt;
    rotate 14&lt;br /&gt;
    compress&lt;br /&gt;
    delaycompress&lt;br /&gt;
    notifempty&lt;br /&gt;
    create 640 www-data www-data&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Job====&lt;br /&gt;
# Establish a job that runs every minute or every 5 minutes or ...&lt;br /&gt;
# crontab -e&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo -u www-data crontab -e&lt;br /&gt;
&lt;br /&gt;
* * * * * /usr/bin/php -d memory_limit=1G /var/www/html/&amp;lt;yourWebDir&amp;gt;/maintenance/run.php runJobs &amp;gt;&amp;gt; /var/log/mediawiki/yourWebSite_runjobs.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
*/5 * * * * /usr/bin/php -d memory_limit=1G /var/www/html/&amp;lt;yourWebDir&amp;gt;/maintenance/run.php runJobs &amp;gt;&amp;gt; /var/log/mediawiki/yourWebSite_runjobs.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Test====&lt;br /&gt;
# Wait at least 1 minute before doing the checking&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tail -f /var/log/mediawiki/YourWebSite_runjobs.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reverting to the Default MediaWiki Search ==&lt;br /&gt;
&lt;br /&gt;
If you are experiencing issues with CirrusSearch or simply want to revert to MediaWiki&#039;s native MySQL/MariaDB database search, follow these steps to safely disable the extension.&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Edit LocalSettings.php ===&lt;br /&gt;
Open your &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file and locate the configuration block for CirrusSearch.&lt;br /&gt;
&lt;br /&gt;
You must remove or comment out the line that sets the search engine type, as well as the extension loading commands.&lt;br /&gt;
&lt;br /&gt;
Change this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To this (commented out by adding &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
// wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
// $wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
// $wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &#039;&#039;Note: By removing &amp;lt;code&amp;gt;$wgSearchType&amp;lt;/code&amp;gt;, MediaWiki automatically falls back to its default internal search engine.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Clear the MediaWiki Cache ===&lt;br /&gt;
MediaWiki caches configuration settings. To ensure the wiki immediately recognizes that CirrusSearch has been disabled, purge the application cache from your terminal in the MediaWiki root directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php purgeCache&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Verify the Changes ===&lt;br /&gt;
Go to your wiki in a web browser and try using the search bar. The results should now load using the standard MediaWiki search interface.&lt;br /&gt;
&lt;br /&gt;
=== Step 4: (Optional) Stop the Elasticsearch Service ===&lt;br /&gt;
Elasticsearch consumes a significant amount of RAM (often 1GB+). If you do not plan to use it again or are permanently abandoning CirrusSearch, you should stop and disable the background service to free up your server resources:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl disable --now elasticsearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Step 5: Crontab ===&lt;br /&gt;
# Edit out or remove the schedule crontab job.&lt;br /&gt;
&lt;br /&gt;
[[Category:Wiki]]&lt;br /&gt;
[[Category:Weblog-2026-08]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=ElasticSearch_on_MediaWiki&amp;diff=2041</id>
		<title>ElasticSearch on MediaWiki</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=ElasticSearch_on_MediaWiki&amp;diff=2041"/>
		<updated>2026-08-27T10:29:46Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installing and Configuring CirrusSearch with Elasticsearch ==&lt;br /&gt;
&lt;br /&gt;
Setting up &#039;&#039;&#039;CirrusSearch&#039;&#039;&#039; with Elasticsearch requires three main phases: installing the Elasticsearch cluster, downloading the required MediaWiki extensions (Elastica and CirrusSearch), and building the search index via MediaWiki maintenance scripts.&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
* &#039;&#039;&#039;MediaWiki 1.39+:&#039;&#039;&#039; Recommended Elasticsearch 7.10.2 (or OpenSearch 1.3+).&lt;br /&gt;
* &#039;&#039;&#039;PHP:&#039;&#039;&#039; The PHP &amp;lt;code&amp;gt;cURL&amp;lt;/code&amp;gt; extension must be enabled.&lt;br /&gt;
* &#039;&#039;&#039;Composer:&#039;&#039;&#039; See https://getcomposer.org/install for more information.&lt;br /&gt;
* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;DATABASE NAMES MUST BE ALL LOWERCASE!&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Composer Install====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
sudo apt install curl php-cli php-mbstring git unzip&lt;br /&gt;
php -r &amp;quot;copy(&#039;https://getcomposer.org/installer&#039;, &#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
php composer-setup.php --install-dir=/usr/local/bin --filename=composer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Install &amp;amp; Start Elasticsearch ===&lt;br /&gt;
Install Elasticsearch on your server (instructions below are for Ubuntu/Debian):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Install Java runtime if not already installed&lt;br /&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt install -y openjdk-17-jre-headless&lt;br /&gt;
&lt;br /&gt;
# Install Elasticsearch 7.x&lt;br /&gt;
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.2-amd64.deb&lt;br /&gt;
sudo dpkg -i elasticsearch-7.10.2-amd64.deb&lt;br /&gt;
&lt;br /&gt;
# Enable and start the service&lt;br /&gt;
sudo systemctl enable --now elasticsearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To verify it is running on &amp;lt;code&amp;gt;localhost:9200&amp;lt;/code&amp;gt;, test it in your terminal with &amp;lt;code&amp;gt;curl http://localhost:9200&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Download the MediaWiki Extensions ===&lt;br /&gt;
CirrusSearch depends on &#039;&#039;&#039;Extension:Elastica&#039;&#039;&#039; to serve as the PHP client bridge.&lt;br /&gt;
&lt;br /&gt;
# Navigate to your MediaWiki &amp;lt;code&amp;gt;extensions/&amp;lt;/code&amp;gt; directory:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /var/www/html/&amp;lt;yourWebDir&amp;gt;/extensions&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Download both Elastica and CirrusSearch (replace &amp;lt;code&amp;gt;REL1_39&amp;lt;/code&amp;gt; with your MediaWiki branch version, e.g., &amp;lt;code&amp;gt;REL1_40&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;REL1_43&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone -b REL1_43 https://gerrit.wikimedia.org/r/mediawiki/extensions/Elastica&lt;br /&gt;
git clone -b REL1_43 https://gerrit.wikimedia.org/r/mediawiki/extensions/CirrusSearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Install PHP Dependencies:&#039;&#039;&#039; If you cloned the extensions via Git, you must install the Composer dependencies inside both extension folders:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd Elastica &amp;amp;&amp;amp; composer config policy.advisories.block false &amp;amp;&amp;amp; composer install --no-dev &amp;amp;&amp;amp; cd ..&lt;br /&gt;
cd CirrusSearch &amp;amp;&amp;amp; composer config policy.advisories.block false &amp;amp;&amp;amp; composer install --no-dev &amp;amp;&amp;amp; cd ..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Configure LocalSettings.php ===&lt;br /&gt;
Open your &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file and add the following block at the bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// 1. Load the required extensions&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
&lt;br /&gt;
// 2. Specify your Elasticsearch server location&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
&lt;br /&gt;
// 3. Temporarily disable search updates during bootstrapping&lt;br /&gt;
$wgDisableSearchUpdate = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 4: Generate and Bootstrap the Search Index ===&lt;br /&gt;
Run the maintenance scripts from your MediaWiki root directory to build and populate the Elasticsearch index.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Configure the index structure:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php CirrusSearch:UpdateSearchIndexConfig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Re-enable live search updates:&#039;&#039;&#039; Go back into &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; and &#039;&#039;&#039;remove or comment out&#039;&#039;&#039; the &amp;lt;code&amp;gt;$wgDisableSearchUpdate = true;&amp;lt;/code&amp;gt; line.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Populate the index with your wiki&#039;s page content:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php CirrusSearch:ForceSearchIndex --skipLinks --indexOnSkip&lt;br /&gt;
php maintenance/run.php CirrusSearch:ForceSearchIndex --skipParse&lt;br /&gt;
php maintenance/run.php runJobs&lt;br /&gt;
&lt;br /&gt;
# if the above fails out, the db may be too big in various aspects, give the command more memory:&lt;br /&gt;
php -d memory_limit=1G maintenance/run.php runJobs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Verify the indexes, this should show your db with count details.  If 0, re-run the above commands again and re-test.&lt;br /&gt;
curl -X GET &amp;quot;localhost:9200/_cat/indices?v&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*: &#039;&#039;Note: For smaller wikis, running just &amp;lt;code&amp;gt;php maintenance/run.php CirrusSearch:ForceSearchIndex&amp;lt;/code&amp;gt; is usually sufficient.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Step 5: Switch MediaWiki to Use CirrusSearch ===&lt;br /&gt;
Once indexing completes successfully, add the final setting to &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; to hand search queries over to Elasticsearch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Direct default search traffic to CirrusSearch&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test a search query on your wiki&#039;s &amp;lt;code&amp;gt;Special:Search&amp;lt;/code&amp;gt; page. Your results should now be powered by Elasticsearch!&lt;br /&gt;
&lt;br /&gt;
=== Step 6: LocalSettings.php Cleanup ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
## CUSTOM ELASTIC SEARCH&lt;br /&gt;
// Force CirrusSearch overrides at the very end of LocalSettings.php&lt;br /&gt;
# https://gerrit.wikimedia.org/g/mediawiki/extensions/CirrusSearch/%2B/HEAD/docs/settings.txt&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
&lt;br /&gt;
// Ensure fallback to core MySQL is explicitly disabled for testing&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Force exact database prefix matching for CirrusSearch&lt;br /&gt;
$wgCirrusSearchClusterOverrides = [&lt;br /&gt;
    &#039;default&#039; =&amp;gt; [&lt;br /&gt;
        &#039;replica&#039; =&amp;gt; &#039;127.0.0.1&#039;&lt;br /&gt;
    ]&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
$wgJobRunRate = 0;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 7: Setup Crontab Job ===&lt;br /&gt;
====Logs====&lt;br /&gt;
# Setup a log dir (probably should revisit this some day and do a proper rotation)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /var/log/mediawiki&lt;br /&gt;
sudo chown it:it /var/log/mediawiki&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Log Rotate====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo nano /etc/logrotate.d/mediawiki&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
/var/log/mediawiki/*.log {&lt;br /&gt;
    daily&lt;br /&gt;
    missingok&lt;br /&gt;
    rotate 14&lt;br /&gt;
    compress&lt;br /&gt;
    delaycompress&lt;br /&gt;
    notifempty&lt;br /&gt;
    create 640 www-data www-data&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Job====&lt;br /&gt;
# Establish a job that runs every minute&lt;br /&gt;
# crontab -e&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo -u www-data crontab -e&lt;br /&gt;
&lt;br /&gt;
* * * * * /usr/bin/php -d memory_limit=1G /var/www/html/&amp;lt;yourWebDir&amp;gt;/maintenance/run.php runJobs &amp;gt;&amp;gt; /var/log/mediawiki/yourWebSite_runjobs.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Test====&lt;br /&gt;
# Wait at least 1 minute before doing the checking&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tail -f /var/log/mediawiki/YourWebSite_runjobs.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reverting to the Default MediaWiki Search ==&lt;br /&gt;
&lt;br /&gt;
If you are experiencing issues with CirrusSearch or simply want to revert to MediaWiki&#039;s native MySQL/MariaDB database search, follow these steps to safely disable the extension.&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Edit LocalSettings.php ===&lt;br /&gt;
Open your &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file and locate the configuration block for CirrusSearch.&lt;br /&gt;
&lt;br /&gt;
You must remove or comment out the line that sets the search engine type, as well as the extension loading commands.&lt;br /&gt;
&lt;br /&gt;
Change this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To this (commented out by adding &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
// wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
// $wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
// $wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &#039;&#039;Note: By removing &amp;lt;code&amp;gt;$wgSearchType&amp;lt;/code&amp;gt;, MediaWiki automatically falls back to its default internal search engine.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Clear the MediaWiki Cache ===&lt;br /&gt;
MediaWiki caches configuration settings. To ensure the wiki immediately recognizes that CirrusSearch has been disabled, purge the application cache from your terminal in the MediaWiki root directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php purgeCache&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Verify the Changes ===&lt;br /&gt;
Go to your wiki in a web browser and try using the search bar. The results should now load using the standard MediaWiki search interface.&lt;br /&gt;
&lt;br /&gt;
=== Step 4: (Optional) Stop the Elasticsearch Service ===&lt;br /&gt;
Elasticsearch consumes a significant amount of RAM (often 1GB+). If you do not plan to use it again or are permanently abandoning CirrusSearch, you should stop and disable the background service to free up your server resources:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl disable --now elasticsearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Step 5: Crontab ===&lt;br /&gt;
# Edit out or remove the schedule crontab job.&lt;br /&gt;
&lt;br /&gt;
[[Category:Wiki]]&lt;br /&gt;
[[Category:Weblog-2026-08]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Emily_Beane&amp;diff=2040</id>
		<title>Emily Beane</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Emily_Beane&amp;diff=2040"/>
		<updated>2026-08-27T10:29:20Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I&#039;m prefacing this obituary entry with something from my deepest memory of Nana, which at the time seemed sage-like and ends up being simply a foreshadowing of life.  Your Pilot waits for you with open arms.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Crossing The Bar by Alfred Lord Tennyson&#039;&#039;&#039;&lt;br /&gt;
[[Image:NannyandGrampy.jpg|thumb|right|Nanny &amp;amp; Grampy Beane]]&lt;br /&gt;
&amp;lt;poem&amp;gt;Sunset and evening star,&lt;br /&gt;
And one clear call for me!&lt;br /&gt;
And may there be no moaning of the bar,&lt;br /&gt;
When I put out to sea,&lt;br /&gt;
&lt;br /&gt;
But such a tide as moving seems asleep,&lt;br /&gt;
Too full for sound and foam,&lt;br /&gt;
When that which drew from out the boundless deep&lt;br /&gt;
Turns again home.&lt;br /&gt;
&lt;br /&gt;
Twilight and evening bell,&lt;br /&gt;
And after that the dark!&lt;br /&gt;
And may there be no sadness of farewell,&lt;br /&gt;
When I embark;&lt;br /&gt;
&lt;br /&gt;
For tho’ from out our bourne of Time and Place&lt;br /&gt;
The flood may bear me far,&lt;br /&gt;
I hope to see my Pilot face to face&lt;br /&gt;
When I have crossed the bar.&amp;lt;/poem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;poem&amp;gt;&lt;br /&gt;
BENTON STATION -- Emily Beane, 88 3/4, of Benton Station, passed away peacefully on Saturday, March 10, 2007, surrounded by her family.&lt;br /&gt;
&lt;br /&gt;
She was born on May 26, 1918, in Boston, the daughter of John and Velma (Collemer) Brousaides.&lt;br /&gt;
&lt;br /&gt;
She was a graduate of Burdett College in Boston and worked as executive secretary at E.F. Mahady Co. in Boston. On Feb. 16, 1945, she married [[Eugene Beane|Eugene H. Beane]] of Bingham.&lt;br /&gt;
&lt;br /&gt;
Emily was a devoted and beloved wife, mother, aunt and grandmother. An energetic homemaker, she loved to cook, sew, and play cards, Scrabble, croquet and badminton.&lt;br /&gt;
&lt;br /&gt;
She instilled a love of reading in her children. Her zest for life included many happy hours picnicking, swimming, fishing and boating on the lakes and coast of Maine.&lt;br /&gt;
&lt;br /&gt;
In her youth, she spent summers with relatives in Lincolnville, and Lincolnville Beach held a special place in her heart.&lt;br /&gt;
&lt;br /&gt;
With her husband Eugene, she toured the Gaspe Peninsula, the Cabot Trail and Prince Edward Island. Throughout her life, her deep Christian faith and love of Jesus sustained her.&lt;br /&gt;
&lt;br /&gt;
Emily was a member of the First Baptist Church of Fairfield for 50 years.&lt;br /&gt;
&lt;br /&gt;
She served on the finance board, as a deaconess and a Sunday school and vacation Bible school teacher. She loved visiting the elderly and helping to support her church&#039;s missionary program.&lt;br /&gt;
&lt;br /&gt;
Later in life, Emily was employed by the Salvation Army, New Hampshire Hospital School of Nursing, and the New Hampshire Department of Health and Human Services.&lt;br /&gt;
&lt;br /&gt;
Emily was predeceased by her parents and brother Harry.&lt;br /&gt;
&lt;br /&gt;
She is survived by her husband, Eugene H. Beane of Benton; daughter [[Joyce Ray]] and husband [[Robert Ray|Robert]] of Dunbarton, N.H.; son [[Alan Beane]] and wife [[Janice Beane|Janice]] of Benton; daughter [[Valerie Otis]] and husband [[Paul Otis|Paul]] of Oakland; son [[David Beane]] and wife [[Rebecca Beane|Becky]] of Benton; brothers Frederick Brousaides of Wilmington, N.C., and George Brousaides of Largo, Fla.; grandchildren [[Jennifer Johnson]] of Bristol, R.I., [[Heather Radl]] and [[Rebecca Ray]] of Dunbarton, N.H., [[Michael Beane]] of Newport, [[Andrew Beane]] of Waterville, [[Kathryn Otis]], and [[Jonathan Beane|Jonathan]] and [[Samantha Beane]] of Benton; eight great-grandchildren, and many dear family and friends.&lt;br /&gt;
&lt;br /&gt;
A memorial service is planned for 2 p.m. Sunday, April 1, at the First Baptist Church, 12 Newhall St., Fairfield. A reception will follow.&lt;br /&gt;
&lt;br /&gt;
Burial will be later in the spring at the Falls Cemetery in Benton.&lt;br /&gt;
&lt;br /&gt;
Memorial donations may be made to the church&#039;s missionary program.&lt;br /&gt;
&lt;br /&gt;
The family is thankful for the loving care provided by MaineGeneral Medical Center, Thayer Unit, especially the staff of the Dialysis Unit and 2 Central.&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Family]]&lt;br /&gt;
[[Category:Obituaries]]&lt;br /&gt;
[[Category:Weblog-2007-03]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=ElasticSearch_on_MediaWiki&amp;diff=2039</id>
		<title>ElasticSearch on MediaWiki</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=ElasticSearch_on_MediaWiki&amp;diff=2039"/>
		<updated>2026-08-27T10:26:23Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Step 4: Generate and Bootstrap the Search Index */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installing and Configuring CirrusSearch with Elasticsearch ==&lt;br /&gt;
&lt;br /&gt;
Setting up &#039;&#039;&#039;CirrusSearch&#039;&#039;&#039; with Elasticsearch requires three main phases: installing the Elasticsearch cluster, downloading the required MediaWiki extensions (Elastica and CirrusSearch), and building the search index via MediaWiki maintenance scripts.&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
* &#039;&#039;&#039;MediaWiki 1.39+:&#039;&#039;&#039; Recommended Elasticsearch 7.10.2 (or OpenSearch 1.3+).&lt;br /&gt;
* &#039;&#039;&#039;PHP:&#039;&#039;&#039; The PHP &amp;lt;code&amp;gt;cURL&amp;lt;/code&amp;gt; extension must be enabled.&lt;br /&gt;
* &#039;&#039;&#039;Composer:&#039;&#039;&#039; See https://getcomposer.org/install for more information.&lt;br /&gt;
* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;DATABASE NAMES MUST BE ALL LOWERCASE&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Composer Install====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
sudo apt install curl php-cli php-mbstring git unzip&lt;br /&gt;
php -r &amp;quot;copy(&#039;https://getcomposer.org/installer&#039;, &#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
php composer-setup.php --install-dir=/usr/local/bin --filename=composer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Install &amp;amp; Start Elasticsearch ===&lt;br /&gt;
Install Elasticsearch on your server (instructions below are for Ubuntu/Debian):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Install Java runtime if not already installed&lt;br /&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt install -y openjdk-17-jre-headless&lt;br /&gt;
&lt;br /&gt;
# Install Elasticsearch 7.x&lt;br /&gt;
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.2-amd64.deb&lt;br /&gt;
sudo dpkg -i elasticsearch-7.10.2-amd64.deb&lt;br /&gt;
&lt;br /&gt;
# Enable and start the service&lt;br /&gt;
sudo systemctl enable --now elasticsearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To verify it is running on &amp;lt;code&amp;gt;localhost:9200&amp;lt;/code&amp;gt;, test it in your terminal with &amp;lt;code&amp;gt;curl http://localhost:9200&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Download the MediaWiki Extensions ===&lt;br /&gt;
CirrusSearch depends on &#039;&#039;&#039;Extension:Elastica&#039;&#039;&#039; to serve as the PHP client bridge.&lt;br /&gt;
&lt;br /&gt;
# Navigate to your MediaWiki &amp;lt;code&amp;gt;extensions/&amp;lt;/code&amp;gt; directory:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /var/www/html/&amp;lt;yourWebDir&amp;gt;/extensions&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Download both Elastica and CirrusSearch (replace &amp;lt;code&amp;gt;REL1_39&amp;lt;/code&amp;gt; with your MediaWiki branch version, e.g., &amp;lt;code&amp;gt;REL1_40&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;REL1_43&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone -b REL1_43 https://gerrit.wikimedia.org/r/mediawiki/extensions/Elastica&lt;br /&gt;
git clone -b REL1_43 https://gerrit.wikimedia.org/r/mediawiki/extensions/CirrusSearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Install PHP Dependencies:&#039;&#039;&#039; If you cloned the extensions via Git, you must install the Composer dependencies inside both extension folders:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd Elastica &amp;amp;&amp;amp; composer config policy.advisories.block false &amp;amp;&amp;amp; composer install --no-dev &amp;amp;&amp;amp; cd ..&lt;br /&gt;
cd CirrusSearch &amp;amp;&amp;amp; composer config policy.advisories.block false &amp;amp;&amp;amp; composer install --no-dev &amp;amp;&amp;amp; cd ..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Configure LocalSettings.php ===&lt;br /&gt;
Open your &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file and add the following block at the bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// 1. Load the required extensions&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
&lt;br /&gt;
// 2. Specify your Elasticsearch server location&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
&lt;br /&gt;
// 3. Temporarily disable search updates during bootstrapping&lt;br /&gt;
$wgDisableSearchUpdate = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 4: Generate and Bootstrap the Search Index ===&lt;br /&gt;
Run the maintenance scripts from your MediaWiki root directory to build and populate the Elasticsearch index.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Configure the index structure:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php CirrusSearch:UpdateSearchIndexConfig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Re-enable live search updates:&#039;&#039;&#039; Go back into &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; and &#039;&#039;&#039;remove or comment out&#039;&#039;&#039; the &amp;lt;code&amp;gt;$wgDisableSearchUpdate = true;&amp;lt;/code&amp;gt; line.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Populate the index with your wiki&#039;s page content:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php CirrusSearch:ForceSearchIndex --skipLinks --indexOnSkip&lt;br /&gt;
php maintenance/run.php CirrusSearch:ForceSearchIndex --skipParse&lt;br /&gt;
php maintenance/run.php runJobs&lt;br /&gt;
&lt;br /&gt;
# if the above fails out, the db may be too big in various aspects, give the command more memory:&lt;br /&gt;
php -d memory_limit=1G maintenance/run.php runJobs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Verify the indexes, this should show your db with count details.  If 0, re-run the above commands again and re-test.&lt;br /&gt;
curl -X GET &amp;quot;localhost:9200/_cat/indices?v&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*: &#039;&#039;Note: For smaller wikis, running just &amp;lt;code&amp;gt;php maintenance/run.php CirrusSearch:ForceSearchIndex&amp;lt;/code&amp;gt; is usually sufficient.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Step 5: Switch MediaWiki to Use CirrusSearch ===&lt;br /&gt;
Once indexing completes successfully, add the final setting to &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; to hand search queries over to Elasticsearch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Direct default search traffic to CirrusSearch&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test a search query on your wiki&#039;s &amp;lt;code&amp;gt;Special:Search&amp;lt;/code&amp;gt; page. Your results should now be powered by Elasticsearch!&lt;br /&gt;
&lt;br /&gt;
=== Step 6: LocalSettings.php Cleanup ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
## CUSTOM ELASTIC SEARCH&lt;br /&gt;
// Force CirrusSearch overrides at the very end of LocalSettings.php&lt;br /&gt;
# https://gerrit.wikimedia.org/g/mediawiki/extensions/CirrusSearch/%2B/HEAD/docs/settings.txt&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
&lt;br /&gt;
// Ensure fallback to core MySQL is explicitly disabled for testing&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Force exact database prefix matching for CirrusSearch&lt;br /&gt;
$wgCirrusSearchClusterOverrides = [&lt;br /&gt;
    &#039;default&#039; =&amp;gt; [&lt;br /&gt;
        &#039;replica&#039; =&amp;gt; &#039;127.0.0.1&#039;&lt;br /&gt;
    ]&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
$wgJobRunRate = 0;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 7: Setup Crontab Job ===&lt;br /&gt;
====Logs====&lt;br /&gt;
# Setup a log dir (probably should revisit this some day and do a proper rotation)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /var/log/mediawiki&lt;br /&gt;
sudo chown it:it /var/log/mediawiki&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Log Rotate====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo nano /etc/logrotate.d/mediawiki&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
/var/log/mediawiki/*.log {&lt;br /&gt;
    daily&lt;br /&gt;
    missingok&lt;br /&gt;
    rotate 14&lt;br /&gt;
    compress&lt;br /&gt;
    delaycompress&lt;br /&gt;
    notifempty&lt;br /&gt;
    create 640 www-data www-data&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Job====&lt;br /&gt;
# Establish a job that runs every minute&lt;br /&gt;
# crontab -e&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo -u www-data crontab -e&lt;br /&gt;
&lt;br /&gt;
* * * * * /usr/bin/php -d memory_limit=1G /var/www/html/&amp;lt;yourWebDir&amp;gt;/maintenance/run.php runJobs &amp;gt;&amp;gt; /var/log/mediawiki/yourWebSite_runjobs.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Test====&lt;br /&gt;
# Wait at least 1 minute before doing the checking&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tail -f /var/log/mediawiki/YourWebSite_runjobs.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reverting to the Default MediaWiki Search ==&lt;br /&gt;
&lt;br /&gt;
If you are experiencing issues with CirrusSearch or simply want to revert to MediaWiki&#039;s native MySQL/MariaDB database search, follow these steps to safely disable the extension.&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Edit LocalSettings.php ===&lt;br /&gt;
Open your &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file and locate the configuration block for CirrusSearch.&lt;br /&gt;
&lt;br /&gt;
You must remove or comment out the line that sets the search engine type, as well as the extension loading commands.&lt;br /&gt;
&lt;br /&gt;
Change this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To this (commented out by adding &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
// wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
// $wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
// $wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &#039;&#039;Note: By removing &amp;lt;code&amp;gt;$wgSearchType&amp;lt;/code&amp;gt;, MediaWiki automatically falls back to its default internal search engine.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Clear the MediaWiki Cache ===&lt;br /&gt;
MediaWiki caches configuration settings. To ensure the wiki immediately recognizes that CirrusSearch has been disabled, purge the application cache from your terminal in the MediaWiki root directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php purgeCache&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Verify the Changes ===&lt;br /&gt;
Go to your wiki in a web browser and try using the search bar. The results should now load using the standard MediaWiki search interface.&lt;br /&gt;
&lt;br /&gt;
=== Step 4: (Optional) Stop the Elasticsearch Service ===&lt;br /&gt;
Elasticsearch consumes a significant amount of RAM (often 1GB+). If you do not plan to use it again or are permanently abandoning CirrusSearch, you should stop and disable the background service to free up your server resources:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl disable --now elasticsearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Step 5: Crontab ===&lt;br /&gt;
# Edit out or remove the schedule crontab job.&lt;br /&gt;
&lt;br /&gt;
[[Category:Wiki]]&lt;br /&gt;
[[Category:Weblog-2026-08]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=ElasticSearch_on_MediaWiki&amp;diff=2038</id>
		<title>ElasticSearch on MediaWiki</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=ElasticSearch_on_MediaWiki&amp;diff=2038"/>
		<updated>2026-08-27T10:18:12Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Step 6: LocalSettings.php Cleanup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installing and Configuring CirrusSearch with Elasticsearch ==&lt;br /&gt;
&lt;br /&gt;
Setting up &#039;&#039;&#039;CirrusSearch&#039;&#039;&#039; with Elasticsearch requires three main phases: installing the Elasticsearch cluster, downloading the required MediaWiki extensions (Elastica and CirrusSearch), and building the search index via MediaWiki maintenance scripts.&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
* &#039;&#039;&#039;MediaWiki 1.39+:&#039;&#039;&#039; Recommended Elasticsearch 7.10.2 (or OpenSearch 1.3+).&lt;br /&gt;
* &#039;&#039;&#039;PHP:&#039;&#039;&#039; The PHP &amp;lt;code&amp;gt;cURL&amp;lt;/code&amp;gt; extension must be enabled.&lt;br /&gt;
* &#039;&#039;&#039;Composer:&#039;&#039;&#039; See https://getcomposer.org/install for more information.&lt;br /&gt;
* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;DATABASE NAMES MUST BE ALL LOWERCASE&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Composer Install====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
sudo apt install curl php-cli php-mbstring git unzip&lt;br /&gt;
php -r &amp;quot;copy(&#039;https://getcomposer.org/installer&#039;, &#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
php composer-setup.php --install-dir=/usr/local/bin --filename=composer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Install &amp;amp; Start Elasticsearch ===&lt;br /&gt;
Install Elasticsearch on your server (instructions below are for Ubuntu/Debian):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Install Java runtime if not already installed&lt;br /&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt install -y openjdk-17-jre-headless&lt;br /&gt;
&lt;br /&gt;
# Install Elasticsearch 7.x&lt;br /&gt;
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.2-amd64.deb&lt;br /&gt;
sudo dpkg -i elasticsearch-7.10.2-amd64.deb&lt;br /&gt;
&lt;br /&gt;
# Enable and start the service&lt;br /&gt;
sudo systemctl enable --now elasticsearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To verify it is running on &amp;lt;code&amp;gt;localhost:9200&amp;lt;/code&amp;gt;, test it in your terminal with &amp;lt;code&amp;gt;curl http://localhost:9200&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Download the MediaWiki Extensions ===&lt;br /&gt;
CirrusSearch depends on &#039;&#039;&#039;Extension:Elastica&#039;&#039;&#039; to serve as the PHP client bridge.&lt;br /&gt;
&lt;br /&gt;
# Navigate to your MediaWiki &amp;lt;code&amp;gt;extensions/&amp;lt;/code&amp;gt; directory:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /var/www/html/&amp;lt;yourWebDir&amp;gt;/extensions&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Download both Elastica and CirrusSearch (replace &amp;lt;code&amp;gt;REL1_39&amp;lt;/code&amp;gt; with your MediaWiki branch version, e.g., &amp;lt;code&amp;gt;REL1_40&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;REL1_43&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone -b REL1_43 https://gerrit.wikimedia.org/r/mediawiki/extensions/Elastica&lt;br /&gt;
git clone -b REL1_43 https://gerrit.wikimedia.org/r/mediawiki/extensions/CirrusSearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Install PHP Dependencies:&#039;&#039;&#039; If you cloned the extensions via Git, you must install the Composer dependencies inside both extension folders:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd Elastica &amp;amp;&amp;amp; composer config policy.advisories.block false &amp;amp;&amp;amp; composer install --no-dev &amp;amp;&amp;amp; cd ..&lt;br /&gt;
cd CirrusSearch &amp;amp;&amp;amp; composer config policy.advisories.block false &amp;amp;&amp;amp; composer install --no-dev &amp;amp;&amp;amp; cd ..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Configure LocalSettings.php ===&lt;br /&gt;
Open your &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file and add the following block at the bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// 1. Load the required extensions&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
&lt;br /&gt;
// 2. Specify your Elasticsearch server location&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
&lt;br /&gt;
// 3. Temporarily disable search updates during bootstrapping&lt;br /&gt;
$wgDisableSearchUpdate = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 4: Generate and Bootstrap the Search Index ===&lt;br /&gt;
Run the maintenance scripts from your MediaWiki root directory to build and populate the Elasticsearch index.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Configure the index structure:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php CirrusSearch:UpdateSearchIndexConfig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Re-enable live search updates:&#039;&#039;&#039; Go back into &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; and &#039;&#039;&#039;remove or comment out&#039;&#039;&#039; the &amp;lt;code&amp;gt;$wgDisableSearchUpdate = true;&amp;lt;/code&amp;gt; line.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Populate the index with your wiki&#039;s page content:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php CirrusSearch:ForceSearchIndex --skipLinks --indexOnSkip&lt;br /&gt;
php maintenance/run.php CirrusSearch:ForceSearchIndex --skipParse&lt;br /&gt;
php maintenance/run.php runJobs&lt;br /&gt;
&lt;br /&gt;
#if the above fails out, the db may be too big in various aspects, give the command more memory:&lt;br /&gt;
php -d memory_limit=1G maintenance/run.php runJobs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*: &#039;&#039;Note: For smaller wikis, running just &amp;lt;code&amp;gt;php maintenance/run.php CirrusSearch:ForceSearchIndex&amp;lt;/code&amp;gt; is usually sufficient.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Step 5: Switch MediaWiki to Use CirrusSearch ===&lt;br /&gt;
Once indexing completes successfully, add the final setting to &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; to hand search queries over to Elasticsearch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Direct default search traffic to CirrusSearch&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test a search query on your wiki&#039;s &amp;lt;code&amp;gt;Special:Search&amp;lt;/code&amp;gt; page. Your results should now be powered by Elasticsearch!&lt;br /&gt;
&lt;br /&gt;
=== Step 6: LocalSettings.php Cleanup ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
## CUSTOM ELASTIC SEARCH&lt;br /&gt;
// Force CirrusSearch overrides at the very end of LocalSettings.php&lt;br /&gt;
# https://gerrit.wikimedia.org/g/mediawiki/extensions/CirrusSearch/%2B/HEAD/docs/settings.txt&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
&lt;br /&gt;
// Ensure fallback to core MySQL is explicitly disabled for testing&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Force exact database prefix matching for CirrusSearch&lt;br /&gt;
$wgCirrusSearchClusterOverrides = [&lt;br /&gt;
    &#039;default&#039; =&amp;gt; [&lt;br /&gt;
        &#039;replica&#039; =&amp;gt; &#039;127.0.0.1&#039;&lt;br /&gt;
    ]&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
$wgJobRunRate = 0;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 7: Setup Crontab Job ===&lt;br /&gt;
====Logs====&lt;br /&gt;
# Setup a log dir (probably should revisit this some day and do a proper rotation)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /var/log/mediawiki&lt;br /&gt;
sudo chown it:it /var/log/mediawiki&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Log Rotate====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo nano /etc/logrotate.d/mediawiki&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
/var/log/mediawiki/*.log {&lt;br /&gt;
    daily&lt;br /&gt;
    missingok&lt;br /&gt;
    rotate 14&lt;br /&gt;
    compress&lt;br /&gt;
    delaycompress&lt;br /&gt;
    notifempty&lt;br /&gt;
    create 640 www-data www-data&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Job====&lt;br /&gt;
# Establish a job that runs every minute&lt;br /&gt;
# crontab -e&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo -u www-data crontab -e&lt;br /&gt;
&lt;br /&gt;
* * * * * /usr/bin/php -d memory_limit=1G /var/www/html/&amp;lt;yourWebDir&amp;gt;/maintenance/run.php runJobs &amp;gt;&amp;gt; /var/log/mediawiki/yourWebSite_runjobs.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Test====&lt;br /&gt;
# Wait at least 1 minute before doing the checking&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tail -f /var/log/mediawiki/YourWebSite_runjobs.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reverting to the Default MediaWiki Search ==&lt;br /&gt;
&lt;br /&gt;
If you are experiencing issues with CirrusSearch or simply want to revert to MediaWiki&#039;s native MySQL/MariaDB database search, follow these steps to safely disable the extension.&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Edit LocalSettings.php ===&lt;br /&gt;
Open your &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file and locate the configuration block for CirrusSearch.&lt;br /&gt;
&lt;br /&gt;
You must remove or comment out the line that sets the search engine type, as well as the extension loading commands.&lt;br /&gt;
&lt;br /&gt;
Change this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To this (commented out by adding &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
// wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
// $wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
// $wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &#039;&#039;Note: By removing &amp;lt;code&amp;gt;$wgSearchType&amp;lt;/code&amp;gt;, MediaWiki automatically falls back to its default internal search engine.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Clear the MediaWiki Cache ===&lt;br /&gt;
MediaWiki caches configuration settings. To ensure the wiki immediately recognizes that CirrusSearch has been disabled, purge the application cache from your terminal in the MediaWiki root directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php purgeCache&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Verify the Changes ===&lt;br /&gt;
Go to your wiki in a web browser and try using the search bar. The results should now load using the standard MediaWiki search interface.&lt;br /&gt;
&lt;br /&gt;
=== Step 4: (Optional) Stop the Elasticsearch Service ===&lt;br /&gt;
Elasticsearch consumes a significant amount of RAM (often 1GB+). If you do not plan to use it again or are permanently abandoning CirrusSearch, you should stop and disable the background service to free up your server resources:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl disable --now elasticsearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Step 5: Crontab ===&lt;br /&gt;
# Edit out or remove the schedule crontab job.&lt;br /&gt;
&lt;br /&gt;
[[Category:Wiki]]&lt;br /&gt;
[[Category:Weblog-2026-08]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=ElasticSearch_on_MediaWiki&amp;diff=2037</id>
		<title>ElasticSearch on MediaWiki</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=ElasticSearch_on_MediaWiki&amp;diff=2037"/>
		<updated>2026-08-27T10:11:50Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Step 4: Generate and Bootstrap the Search Index */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installing and Configuring CirrusSearch with Elasticsearch ==&lt;br /&gt;
&lt;br /&gt;
Setting up &#039;&#039;&#039;CirrusSearch&#039;&#039;&#039; with Elasticsearch requires three main phases: installing the Elasticsearch cluster, downloading the required MediaWiki extensions (Elastica and CirrusSearch), and building the search index via MediaWiki maintenance scripts.&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
* &#039;&#039;&#039;MediaWiki 1.39+:&#039;&#039;&#039; Recommended Elasticsearch 7.10.2 (or OpenSearch 1.3+).&lt;br /&gt;
* &#039;&#039;&#039;PHP:&#039;&#039;&#039; The PHP &amp;lt;code&amp;gt;cURL&amp;lt;/code&amp;gt; extension must be enabled.&lt;br /&gt;
* &#039;&#039;&#039;Composer:&#039;&#039;&#039; See https://getcomposer.org/install for more information.&lt;br /&gt;
* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;DATABASE NAMES MUST BE ALL LOWERCASE&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Composer Install====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
sudo apt install curl php-cli php-mbstring git unzip&lt;br /&gt;
php -r &amp;quot;copy(&#039;https://getcomposer.org/installer&#039;, &#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
php composer-setup.php --install-dir=/usr/local/bin --filename=composer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Install &amp;amp; Start Elasticsearch ===&lt;br /&gt;
Install Elasticsearch on your server (instructions below are for Ubuntu/Debian):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Install Java runtime if not already installed&lt;br /&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt install -y openjdk-17-jre-headless&lt;br /&gt;
&lt;br /&gt;
# Install Elasticsearch 7.x&lt;br /&gt;
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.2-amd64.deb&lt;br /&gt;
sudo dpkg -i elasticsearch-7.10.2-amd64.deb&lt;br /&gt;
&lt;br /&gt;
# Enable and start the service&lt;br /&gt;
sudo systemctl enable --now elasticsearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To verify it is running on &amp;lt;code&amp;gt;localhost:9200&amp;lt;/code&amp;gt;, test it in your terminal with &amp;lt;code&amp;gt;curl http://localhost:9200&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Download the MediaWiki Extensions ===&lt;br /&gt;
CirrusSearch depends on &#039;&#039;&#039;Extension:Elastica&#039;&#039;&#039; to serve as the PHP client bridge.&lt;br /&gt;
&lt;br /&gt;
# Navigate to your MediaWiki &amp;lt;code&amp;gt;extensions/&amp;lt;/code&amp;gt; directory:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /var/www/html/&amp;lt;yourWebDir&amp;gt;/extensions&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Download both Elastica and CirrusSearch (replace &amp;lt;code&amp;gt;REL1_39&amp;lt;/code&amp;gt; with your MediaWiki branch version, e.g., &amp;lt;code&amp;gt;REL1_40&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;REL1_43&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone -b REL1_43 https://gerrit.wikimedia.org/r/mediawiki/extensions/Elastica&lt;br /&gt;
git clone -b REL1_43 https://gerrit.wikimedia.org/r/mediawiki/extensions/CirrusSearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Install PHP Dependencies:&#039;&#039;&#039; If you cloned the extensions via Git, you must install the Composer dependencies inside both extension folders:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd Elastica &amp;amp;&amp;amp; composer config policy.advisories.block false &amp;amp;&amp;amp; composer install --no-dev &amp;amp;&amp;amp; cd ..&lt;br /&gt;
cd CirrusSearch &amp;amp;&amp;amp; composer config policy.advisories.block false &amp;amp;&amp;amp; composer install --no-dev &amp;amp;&amp;amp; cd ..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Configure LocalSettings.php ===&lt;br /&gt;
Open your &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file and add the following block at the bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// 1. Load the required extensions&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
&lt;br /&gt;
// 2. Specify your Elasticsearch server location&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
&lt;br /&gt;
// 3. Temporarily disable search updates during bootstrapping&lt;br /&gt;
$wgDisableSearchUpdate = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 4: Generate and Bootstrap the Search Index ===&lt;br /&gt;
Run the maintenance scripts from your MediaWiki root directory to build and populate the Elasticsearch index.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Configure the index structure:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php CirrusSearch:UpdateSearchIndexConfig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Re-enable live search updates:&#039;&#039;&#039; Go back into &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; and &#039;&#039;&#039;remove or comment out&#039;&#039;&#039; the &amp;lt;code&amp;gt;$wgDisableSearchUpdate = true;&amp;lt;/code&amp;gt; line.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Populate the index with your wiki&#039;s page content:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php CirrusSearch:ForceSearchIndex --skipLinks --indexOnSkip&lt;br /&gt;
php maintenance/run.php CirrusSearch:ForceSearchIndex --skipParse&lt;br /&gt;
php maintenance/run.php runJobs&lt;br /&gt;
&lt;br /&gt;
#if the above fails out, the db may be too big in various aspects, give the command more memory:&lt;br /&gt;
php -d memory_limit=1G maintenance/run.php runJobs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*: &#039;&#039;Note: For smaller wikis, running just &amp;lt;code&amp;gt;php maintenance/run.php CirrusSearch:ForceSearchIndex&amp;lt;/code&amp;gt; is usually sufficient.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Step 5: Switch MediaWiki to Use CirrusSearch ===&lt;br /&gt;
Once indexing completes successfully, add the final setting to &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; to hand search queries over to Elasticsearch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Direct default search traffic to CirrusSearch&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test a search query on your wiki&#039;s &amp;lt;code&amp;gt;Special:Search&amp;lt;/code&amp;gt; page. Your results should now be powered by Elasticsearch!&lt;br /&gt;
&lt;br /&gt;
=== Step 6: LocalSettings.php Cleanup ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
## CUSTOM ELASTIC SEARCH&lt;br /&gt;
// Force CirrusSearch overrides at the very end of LocalSettings.php&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
&lt;br /&gt;
// Ensure fallback to core MySQL is explicitly disabled for testing&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
$wgCirrusSearchEnableDynamicHighlighter = false;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Force exact database prefix matching for CirrusSearch&lt;br /&gt;
$wgCirrusSearchClusterOverrides = [&lt;br /&gt;
    &#039;default&#039; =&amp;gt; [&lt;br /&gt;
        &#039;replica&#039; =&amp;gt; &#039;127.0.0.1&#039;&lt;br /&gt;
    ]&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
$wgJobRunRate = 0;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 7: Setup Crontab Job ===&lt;br /&gt;
====Logs====&lt;br /&gt;
# Setup a log dir (probably should revisit this some day and do a proper rotation)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /var/log/mediawiki&lt;br /&gt;
sudo chown it:it /var/log/mediawiki&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Log Rotate====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo nano /etc/logrotate.d/mediawiki&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
/var/log/mediawiki/*.log {&lt;br /&gt;
    daily&lt;br /&gt;
    missingok&lt;br /&gt;
    rotate 14&lt;br /&gt;
    compress&lt;br /&gt;
    delaycompress&lt;br /&gt;
    notifempty&lt;br /&gt;
    create 640 www-data www-data&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Job====&lt;br /&gt;
# Establish a job that runs every minute&lt;br /&gt;
# crontab -e&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo -u www-data crontab -e&lt;br /&gt;
&lt;br /&gt;
* * * * * /usr/bin/php -d memory_limit=1G /var/www/html/&amp;lt;yourWebDir&amp;gt;/maintenance/run.php runJobs &amp;gt;&amp;gt; /var/log/mediawiki/yourWebSite_runjobs.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Test====&lt;br /&gt;
# Wait at least 1 minute before doing the checking&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tail -f /var/log/mediawiki/YourWebSite_runjobs.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reverting to the Default MediaWiki Search ==&lt;br /&gt;
&lt;br /&gt;
If you are experiencing issues with CirrusSearch or simply want to revert to MediaWiki&#039;s native MySQL/MariaDB database search, follow these steps to safely disable the extension.&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Edit LocalSettings.php ===&lt;br /&gt;
Open your &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file and locate the configuration block for CirrusSearch.&lt;br /&gt;
&lt;br /&gt;
You must remove or comment out the line that sets the search engine type, as well as the extension loading commands.&lt;br /&gt;
&lt;br /&gt;
Change this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To this (commented out by adding &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
// wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
// $wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
// $wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &#039;&#039;Note: By removing &amp;lt;code&amp;gt;$wgSearchType&amp;lt;/code&amp;gt;, MediaWiki automatically falls back to its default internal search engine.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Clear the MediaWiki Cache ===&lt;br /&gt;
MediaWiki caches configuration settings. To ensure the wiki immediately recognizes that CirrusSearch has been disabled, purge the application cache from your terminal in the MediaWiki root directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php purgeCache&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Verify the Changes ===&lt;br /&gt;
Go to your wiki in a web browser and try using the search bar. The results should now load using the standard MediaWiki search interface.&lt;br /&gt;
&lt;br /&gt;
=== Step 4: (Optional) Stop the Elasticsearch Service ===&lt;br /&gt;
Elasticsearch consumes a significant amount of RAM (often 1GB+). If you do not plan to use it again or are permanently abandoning CirrusSearch, you should stop and disable the background service to free up your server resources:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl disable --now elasticsearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Step 5: Crontab ===&lt;br /&gt;
# Edit out or remove the schedule crontab job.&lt;br /&gt;
&lt;br /&gt;
[[Category:Wiki]]&lt;br /&gt;
[[Category:Weblog-2026-08]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=ElasticSearch_on_MediaWiki&amp;diff=2036</id>
		<title>ElasticSearch on MediaWiki</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=ElasticSearch_on_MediaWiki&amp;diff=2036"/>
		<updated>2026-08-27T10:11:08Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Step 7: Setup Crontab Job */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installing and Configuring CirrusSearch with Elasticsearch ==&lt;br /&gt;
&lt;br /&gt;
Setting up &#039;&#039;&#039;CirrusSearch&#039;&#039;&#039; with Elasticsearch requires three main phases: installing the Elasticsearch cluster, downloading the required MediaWiki extensions (Elastica and CirrusSearch), and building the search index via MediaWiki maintenance scripts.&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
* &#039;&#039;&#039;MediaWiki 1.39+:&#039;&#039;&#039; Recommended Elasticsearch 7.10.2 (or OpenSearch 1.3+).&lt;br /&gt;
* &#039;&#039;&#039;PHP:&#039;&#039;&#039; The PHP &amp;lt;code&amp;gt;cURL&amp;lt;/code&amp;gt; extension must be enabled.&lt;br /&gt;
* &#039;&#039;&#039;Composer:&#039;&#039;&#039; See https://getcomposer.org/install for more information.&lt;br /&gt;
* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;DATABASE NAMES MUST BE ALL LOWERCASE&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Composer Install====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
sudo apt install curl php-cli php-mbstring git unzip&lt;br /&gt;
php -r &amp;quot;copy(&#039;https://getcomposer.org/installer&#039;, &#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
php composer-setup.php --install-dir=/usr/local/bin --filename=composer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Install &amp;amp; Start Elasticsearch ===&lt;br /&gt;
Install Elasticsearch on your server (instructions below are for Ubuntu/Debian):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Install Java runtime if not already installed&lt;br /&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt install -y openjdk-17-jre-headless&lt;br /&gt;
&lt;br /&gt;
# Install Elasticsearch 7.x&lt;br /&gt;
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.2-amd64.deb&lt;br /&gt;
sudo dpkg -i elasticsearch-7.10.2-amd64.deb&lt;br /&gt;
&lt;br /&gt;
# Enable and start the service&lt;br /&gt;
sudo systemctl enable --now elasticsearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To verify it is running on &amp;lt;code&amp;gt;localhost:9200&amp;lt;/code&amp;gt;, test it in your terminal with &amp;lt;code&amp;gt;curl http://localhost:9200&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Download the MediaWiki Extensions ===&lt;br /&gt;
CirrusSearch depends on &#039;&#039;&#039;Extension:Elastica&#039;&#039;&#039; to serve as the PHP client bridge.&lt;br /&gt;
&lt;br /&gt;
# Navigate to your MediaWiki &amp;lt;code&amp;gt;extensions/&amp;lt;/code&amp;gt; directory:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /var/www/html/&amp;lt;yourWebDir&amp;gt;/extensions&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Download both Elastica and CirrusSearch (replace &amp;lt;code&amp;gt;REL1_39&amp;lt;/code&amp;gt; with your MediaWiki branch version, e.g., &amp;lt;code&amp;gt;REL1_40&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;REL1_43&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone -b REL1_43 https://gerrit.wikimedia.org/r/mediawiki/extensions/Elastica&lt;br /&gt;
git clone -b REL1_43 https://gerrit.wikimedia.org/r/mediawiki/extensions/CirrusSearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Install PHP Dependencies:&#039;&#039;&#039; If you cloned the extensions via Git, you must install the Composer dependencies inside both extension folders:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd Elastica &amp;amp;&amp;amp; composer config policy.advisories.block false &amp;amp;&amp;amp; composer install --no-dev &amp;amp;&amp;amp; cd ..&lt;br /&gt;
cd CirrusSearch &amp;amp;&amp;amp; composer config policy.advisories.block false &amp;amp;&amp;amp; composer install --no-dev &amp;amp;&amp;amp; cd ..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Configure LocalSettings.php ===&lt;br /&gt;
Open your &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file and add the following block at the bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// 1. Load the required extensions&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
&lt;br /&gt;
// 2. Specify your Elasticsearch server location&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
&lt;br /&gt;
// 3. Temporarily disable search updates during bootstrapping&lt;br /&gt;
$wgDisableSearchUpdate = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 4: Generate and Bootstrap the Search Index ===&lt;br /&gt;
Run the maintenance scripts from your MediaWiki root directory to build and populate the Elasticsearch index.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Configure the index structure:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php CirrusSearch:UpdateSearchIndexConfig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Re-enable live search updates:&#039;&#039;&#039; Go back into &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; and &#039;&#039;&#039;remove or comment out&#039;&#039;&#039; the &amp;lt;code&amp;gt;$wgDisableSearchUpdate = true;&amp;lt;/code&amp;gt; line.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Populate the index with your wiki&#039;s page content:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php CirrusSearch:ForceSearchIndex --skipLinks --indexOnSkip&lt;br /&gt;
php maintenance/run.php CirrusSearch:ForceSearchIndex --skipParse&lt;br /&gt;
php maintenance/run.php runJobs&lt;br /&gt;
&lt;br /&gt;
#if the above fails out, the db may be too big in various aspects, give the command more memory:&lt;br /&gt;
php -d memory_limit=1G maintenance/run.php runJobs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*: &#039;&#039;Note: For smaller wikis, running just &amp;lt;code&amp;gt;php maintenance/run.php CirrusSearch:ForceSearchIndex&amp;lt;/code&amp;gt; is usually sufficient.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Step 5: Switch MediaWiki to Use CirrusSearch ===&lt;br /&gt;
Once indexing completes successfully, add the final setting to &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; to hand search queries over to Elasticsearch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Direct default search traffic to CirrusSearch&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test a search query on your wiki&#039;s &amp;lt;code&amp;gt;Special:Search&amp;lt;/code&amp;gt; page. Your results should now be powered by Elasticsearch!&lt;br /&gt;
&lt;br /&gt;
=== Step 6: LocalSettings.php Cleanup ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
## CUSTOM ELASTIC SEARCH&lt;br /&gt;
// Force CirrusSearch overrides at the very end of LocalSettings.php&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
&lt;br /&gt;
// Ensure fallback to core MySQL is explicitly disabled for testing&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
$wgCirrusSearchEnableDynamicHighlighter = false;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Force exact database prefix matching for CirrusSearch&lt;br /&gt;
$wgCirrusSearchClusterOverrides = [&lt;br /&gt;
    &#039;default&#039; =&amp;gt; [&lt;br /&gt;
        &#039;replica&#039; =&amp;gt; &#039;127.0.0.1&#039;&lt;br /&gt;
    ]&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
$wgJobRunRate = 0;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 7: Setup Crontab Job ===&lt;br /&gt;
====Logs====&lt;br /&gt;
# Setup a log dir (probably should revisit this some day and do a proper rotation)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /var/log/mediawiki&lt;br /&gt;
sudo chown it:it /var/log/mediawiki&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Log Rotate====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo nano /etc/logrotate.d/mediawiki&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
/var/log/mediawiki/*.log {&lt;br /&gt;
    daily&lt;br /&gt;
    missingok&lt;br /&gt;
    rotate 14&lt;br /&gt;
    compress&lt;br /&gt;
    delaycompress&lt;br /&gt;
    notifempty&lt;br /&gt;
    create 640 www-data www-data&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Job====&lt;br /&gt;
# Establish a job that runs every minute&lt;br /&gt;
# crontab -e&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo -u www-data crontab -e&lt;br /&gt;
&lt;br /&gt;
* * * * * /usr/bin/php -d memory_limit=1G /var/www/html/&amp;lt;yourWebDir&amp;gt;/maintenance/run.php runJobs &amp;gt;&amp;gt; /var/log/mediawiki/yourWebSite_runjobs.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Test====&lt;br /&gt;
# Wait at least 1 minute before doing the checking&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo tail -f /var/log/mediawiki/YourWebSite_runjobs.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reverting to the Default MediaWiki Search ==&lt;br /&gt;
&lt;br /&gt;
If you are experiencing issues with CirrusSearch or simply want to revert to MediaWiki&#039;s native MySQL/MariaDB database search, follow these steps to safely disable the extension.&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Edit LocalSettings.php ===&lt;br /&gt;
Open your &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file and locate the configuration block for CirrusSearch.&lt;br /&gt;
&lt;br /&gt;
You must remove or comment out the line that sets the search engine type, as well as the extension loading commands.&lt;br /&gt;
&lt;br /&gt;
Change this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To this (commented out by adding &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
// wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
// $wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
// $wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &#039;&#039;Note: By removing &amp;lt;code&amp;gt;$wgSearchType&amp;lt;/code&amp;gt;, MediaWiki automatically falls back to its default internal search engine.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Clear the MediaWiki Cache ===&lt;br /&gt;
MediaWiki caches configuration settings. To ensure the wiki immediately recognizes that CirrusSearch has been disabled, purge the application cache from your terminal in the MediaWiki root directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php purgeCache&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Verify the Changes ===&lt;br /&gt;
Go to your wiki in a web browser and try using the search bar. The results should now load using the standard MediaWiki search interface.&lt;br /&gt;
&lt;br /&gt;
=== Step 4: (Optional) Stop the Elasticsearch Service ===&lt;br /&gt;
Elasticsearch consumes a significant amount of RAM (often 1GB+). If you do not plan to use it again or are permanently abandoning CirrusSearch, you should stop and disable the background service to free up your server resources:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl disable --now elasticsearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Step 5: Crontab ===&lt;br /&gt;
# Edit out or remove the schedule crontab job.&lt;br /&gt;
&lt;br /&gt;
[[Category:Wiki]]&lt;br /&gt;
[[Category:Weblog-2026-08]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=ElasticSearch_on_MediaWiki&amp;diff=2035</id>
		<title>ElasticSearch on MediaWiki</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=ElasticSearch_on_MediaWiki&amp;diff=2035"/>
		<updated>2026-08-27T10:03:28Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Step 6: LocalSettings.php Cleanup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installing and Configuring CirrusSearch with Elasticsearch ==&lt;br /&gt;
&lt;br /&gt;
Setting up &#039;&#039;&#039;CirrusSearch&#039;&#039;&#039; with Elasticsearch requires three main phases: installing the Elasticsearch cluster, downloading the required MediaWiki extensions (Elastica and CirrusSearch), and building the search index via MediaWiki maintenance scripts.&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
* &#039;&#039;&#039;MediaWiki 1.39+:&#039;&#039;&#039; Recommended Elasticsearch 7.10.2 (or OpenSearch 1.3+).&lt;br /&gt;
* &#039;&#039;&#039;PHP:&#039;&#039;&#039; The PHP &amp;lt;code&amp;gt;cURL&amp;lt;/code&amp;gt; extension must be enabled.&lt;br /&gt;
* &#039;&#039;&#039;Composer:&#039;&#039;&#039; See https://getcomposer.org/install for more information.&lt;br /&gt;
* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;DATABASE NAMES MUST BE ALL LOWERCASE&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Composer Install====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
sudo apt install curl php-cli php-mbstring git unzip&lt;br /&gt;
php -r &amp;quot;copy(&#039;https://getcomposer.org/installer&#039;, &#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
php composer-setup.php --install-dir=/usr/local/bin --filename=composer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Install &amp;amp; Start Elasticsearch ===&lt;br /&gt;
Install Elasticsearch on your server (instructions below are for Ubuntu/Debian):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Install Java runtime if not already installed&lt;br /&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt install -y openjdk-17-jre-headless&lt;br /&gt;
&lt;br /&gt;
# Install Elasticsearch 7.x&lt;br /&gt;
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.2-amd64.deb&lt;br /&gt;
sudo dpkg -i elasticsearch-7.10.2-amd64.deb&lt;br /&gt;
&lt;br /&gt;
# Enable and start the service&lt;br /&gt;
sudo systemctl enable --now elasticsearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To verify it is running on &amp;lt;code&amp;gt;localhost:9200&amp;lt;/code&amp;gt;, test it in your terminal with &amp;lt;code&amp;gt;curl http://localhost:9200&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Download the MediaWiki Extensions ===&lt;br /&gt;
CirrusSearch depends on &#039;&#039;&#039;Extension:Elastica&#039;&#039;&#039; to serve as the PHP client bridge.&lt;br /&gt;
&lt;br /&gt;
# Navigate to your MediaWiki &amp;lt;code&amp;gt;extensions/&amp;lt;/code&amp;gt; directory:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /var/www/html/&amp;lt;yourWebDir&amp;gt;/extensions&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Download both Elastica and CirrusSearch (replace &amp;lt;code&amp;gt;REL1_39&amp;lt;/code&amp;gt; with your MediaWiki branch version, e.g., &amp;lt;code&amp;gt;REL1_40&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;REL1_43&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone -b REL1_43 https://gerrit.wikimedia.org/r/mediawiki/extensions/Elastica&lt;br /&gt;
git clone -b REL1_43 https://gerrit.wikimedia.org/r/mediawiki/extensions/CirrusSearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Install PHP Dependencies:&#039;&#039;&#039; If you cloned the extensions via Git, you must install the Composer dependencies inside both extension folders:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd Elastica &amp;amp;&amp;amp; composer config policy.advisories.block false &amp;amp;&amp;amp; composer install --no-dev &amp;amp;&amp;amp; cd ..&lt;br /&gt;
cd CirrusSearch &amp;amp;&amp;amp; composer config policy.advisories.block false &amp;amp;&amp;amp; composer install --no-dev &amp;amp;&amp;amp; cd ..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Configure LocalSettings.php ===&lt;br /&gt;
Open your &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file and add the following block at the bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// 1. Load the required extensions&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
&lt;br /&gt;
// 2. Specify your Elasticsearch server location&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
&lt;br /&gt;
// 3. Temporarily disable search updates during bootstrapping&lt;br /&gt;
$wgDisableSearchUpdate = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 4: Generate and Bootstrap the Search Index ===&lt;br /&gt;
Run the maintenance scripts from your MediaWiki root directory to build and populate the Elasticsearch index.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Configure the index structure:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php CirrusSearch:UpdateSearchIndexConfig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Re-enable live search updates:&#039;&#039;&#039; Go back into &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; and &#039;&#039;&#039;remove or comment out&#039;&#039;&#039; the &amp;lt;code&amp;gt;$wgDisableSearchUpdate = true;&amp;lt;/code&amp;gt; line.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Populate the index with your wiki&#039;s page content:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php CirrusSearch:ForceSearchIndex --skipLinks --indexOnSkip&lt;br /&gt;
php maintenance/run.php CirrusSearch:ForceSearchIndex --skipParse&lt;br /&gt;
php maintenance/run.php runJobs&lt;br /&gt;
&lt;br /&gt;
#if the above fails out, the db may be too big in various aspects, give the command more memory:&lt;br /&gt;
php -d memory_limit=1G maintenance/run.php runJobs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*: &#039;&#039;Note: For smaller wikis, running just &amp;lt;code&amp;gt;php maintenance/run.php CirrusSearch:ForceSearchIndex&amp;lt;/code&amp;gt; is usually sufficient.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Step 5: Switch MediaWiki to Use CirrusSearch ===&lt;br /&gt;
Once indexing completes successfully, add the final setting to &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; to hand search queries over to Elasticsearch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Direct default search traffic to CirrusSearch&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test a search query on your wiki&#039;s &amp;lt;code&amp;gt;Special:Search&amp;lt;/code&amp;gt; page. Your results should now be powered by Elasticsearch!&lt;br /&gt;
&lt;br /&gt;
=== Step 6: LocalSettings.php Cleanup ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
## CUSTOM ELASTIC SEARCH&lt;br /&gt;
// Force CirrusSearch overrides at the very end of LocalSettings.php&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
&lt;br /&gt;
// Ensure fallback to core MySQL is explicitly disabled for testing&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
$wgCirrusSearchEnableDynamicHighlighter = false;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Force exact database prefix matching for CirrusSearch&lt;br /&gt;
$wgCirrusSearchClusterOverrides = [&lt;br /&gt;
    &#039;default&#039; =&amp;gt; [&lt;br /&gt;
        &#039;replica&#039; =&amp;gt; &#039;127.0.0.1&#039;&lt;br /&gt;
    ]&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
$wgJobRunRate = 0;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 7: Setup Crontab Job ===&lt;br /&gt;
====Job====&lt;br /&gt;
# Establish a job that runs every minute&lt;br /&gt;
# crontab -e&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
* * * * * /usr/bin/php /var/www/html/&amp;lt;yourWebDir&amp;gt;/maintenance/run.php runJobs --maxtime=60 &amp;gt;&amp;gt; /var/log/mediawiki/runJobs.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
====Logs====&lt;br /&gt;
# Setup a log dir (probably should revisit this some day and do a proper rotation)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /var/log/mediawiki&lt;br /&gt;
sudo chown it:it /var/log/mediawiki&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reverting to the Default MediaWiki Search ==&lt;br /&gt;
&lt;br /&gt;
If you are experiencing issues with CirrusSearch or simply want to revert to MediaWiki&#039;s native MySQL/MariaDB database search, follow these steps to safely disable the extension.&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Edit LocalSettings.php ===&lt;br /&gt;
Open your &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file and locate the configuration block for CirrusSearch.&lt;br /&gt;
&lt;br /&gt;
You must remove or comment out the line that sets the search engine type, as well as the extension loading commands.&lt;br /&gt;
&lt;br /&gt;
Change this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To this (commented out by adding &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
// wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
// $wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
// $wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &#039;&#039;Note: By removing &amp;lt;code&amp;gt;$wgSearchType&amp;lt;/code&amp;gt;, MediaWiki automatically falls back to its default internal search engine.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Clear the MediaWiki Cache ===&lt;br /&gt;
MediaWiki caches configuration settings. To ensure the wiki immediately recognizes that CirrusSearch has been disabled, purge the application cache from your terminal in the MediaWiki root directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php purgeCache&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Verify the Changes ===&lt;br /&gt;
Go to your wiki in a web browser and try using the search bar. The results should now load using the standard MediaWiki search interface.&lt;br /&gt;
&lt;br /&gt;
=== Step 4: (Optional) Stop the Elasticsearch Service ===&lt;br /&gt;
Elasticsearch consumes a significant amount of RAM (often 1GB+). If you do not plan to use it again or are permanently abandoning CirrusSearch, you should stop and disable the background service to free up your server resources:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl disable --now elasticsearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Step 5: Crontab ===&lt;br /&gt;
# Edit out or remove the schedule crontab job.&lt;br /&gt;
&lt;br /&gt;
[[Category:Wiki]]&lt;br /&gt;
[[Category:Weblog-2026-08]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=ElasticSearch_on_MediaWiki&amp;diff=2034</id>
		<title>ElasticSearch on MediaWiki</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=ElasticSearch_on_MediaWiki&amp;diff=2034"/>
		<updated>2026-08-27T10:00:32Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Step 4: Generate and Bootstrap the Search Index */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installing and Configuring CirrusSearch with Elasticsearch ==&lt;br /&gt;
&lt;br /&gt;
Setting up &#039;&#039;&#039;CirrusSearch&#039;&#039;&#039; with Elasticsearch requires three main phases: installing the Elasticsearch cluster, downloading the required MediaWiki extensions (Elastica and CirrusSearch), and building the search index via MediaWiki maintenance scripts.&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
* &#039;&#039;&#039;MediaWiki 1.39+:&#039;&#039;&#039; Recommended Elasticsearch 7.10.2 (or OpenSearch 1.3+).&lt;br /&gt;
* &#039;&#039;&#039;PHP:&#039;&#039;&#039; The PHP &amp;lt;code&amp;gt;cURL&amp;lt;/code&amp;gt; extension must be enabled.&lt;br /&gt;
* &#039;&#039;&#039;Composer:&#039;&#039;&#039; See https://getcomposer.org/install for more information.&lt;br /&gt;
* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;DATABASE NAMES MUST BE ALL LOWERCASE&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Composer Install====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
sudo apt install curl php-cli php-mbstring git unzip&lt;br /&gt;
php -r &amp;quot;copy(&#039;https://getcomposer.org/installer&#039;, &#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
php composer-setup.php --install-dir=/usr/local/bin --filename=composer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Install &amp;amp; Start Elasticsearch ===&lt;br /&gt;
Install Elasticsearch on your server (instructions below are for Ubuntu/Debian):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Install Java runtime if not already installed&lt;br /&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt install -y openjdk-17-jre-headless&lt;br /&gt;
&lt;br /&gt;
# Install Elasticsearch 7.x&lt;br /&gt;
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.2-amd64.deb&lt;br /&gt;
sudo dpkg -i elasticsearch-7.10.2-amd64.deb&lt;br /&gt;
&lt;br /&gt;
# Enable and start the service&lt;br /&gt;
sudo systemctl enable --now elasticsearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To verify it is running on &amp;lt;code&amp;gt;localhost:9200&amp;lt;/code&amp;gt;, test it in your terminal with &amp;lt;code&amp;gt;curl http://localhost:9200&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Download the MediaWiki Extensions ===&lt;br /&gt;
CirrusSearch depends on &#039;&#039;&#039;Extension:Elastica&#039;&#039;&#039; to serve as the PHP client bridge.&lt;br /&gt;
&lt;br /&gt;
# Navigate to your MediaWiki &amp;lt;code&amp;gt;extensions/&amp;lt;/code&amp;gt; directory:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /var/www/html/&amp;lt;yourWebDir&amp;gt;/extensions&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Download both Elastica and CirrusSearch (replace &amp;lt;code&amp;gt;REL1_39&amp;lt;/code&amp;gt; with your MediaWiki branch version, e.g., &amp;lt;code&amp;gt;REL1_40&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;REL1_43&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone -b REL1_43 https://gerrit.wikimedia.org/r/mediawiki/extensions/Elastica&lt;br /&gt;
git clone -b REL1_43 https://gerrit.wikimedia.org/r/mediawiki/extensions/CirrusSearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Install PHP Dependencies:&#039;&#039;&#039; If you cloned the extensions via Git, you must install the Composer dependencies inside both extension folders:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd Elastica &amp;amp;&amp;amp; composer config policy.advisories.block false &amp;amp;&amp;amp; composer install --no-dev &amp;amp;&amp;amp; cd ..&lt;br /&gt;
cd CirrusSearch &amp;amp;&amp;amp; composer config policy.advisories.block false &amp;amp;&amp;amp; composer install --no-dev &amp;amp;&amp;amp; cd ..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Configure LocalSettings.php ===&lt;br /&gt;
Open your &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file and add the following block at the bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// 1. Load the required extensions&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
&lt;br /&gt;
// 2. Specify your Elasticsearch server location&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
&lt;br /&gt;
// 3. Temporarily disable search updates during bootstrapping&lt;br /&gt;
$wgDisableSearchUpdate = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 4: Generate and Bootstrap the Search Index ===&lt;br /&gt;
Run the maintenance scripts from your MediaWiki root directory to build and populate the Elasticsearch index.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Configure the index structure:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php CirrusSearch:UpdateSearchIndexConfig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Re-enable live search updates:&#039;&#039;&#039; Go back into &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; and &#039;&#039;&#039;remove or comment out&#039;&#039;&#039; the &amp;lt;code&amp;gt;$wgDisableSearchUpdate = true;&amp;lt;/code&amp;gt; line.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Populate the index with your wiki&#039;s page content:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php CirrusSearch:ForceSearchIndex --skipLinks --indexOnSkip&lt;br /&gt;
php maintenance/run.php CirrusSearch:ForceSearchIndex --skipParse&lt;br /&gt;
php maintenance/run.php runJobs&lt;br /&gt;
&lt;br /&gt;
#if the above fails out, the db may be too big in various aspects, give the command more memory:&lt;br /&gt;
php -d memory_limit=1G maintenance/run.php runJobs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*: &#039;&#039;Note: For smaller wikis, running just &amp;lt;code&amp;gt;php maintenance/run.php CirrusSearch:ForceSearchIndex&amp;lt;/code&amp;gt; is usually sufficient.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Step 5: Switch MediaWiki to Use CirrusSearch ===&lt;br /&gt;
Once indexing completes successfully, add the final setting to &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; to hand search queries over to Elasticsearch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Direct default search traffic to CirrusSearch&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test a search query on your wiki&#039;s &amp;lt;code&amp;gt;Special:Search&amp;lt;/code&amp;gt; page. Your results should now be powered by Elasticsearch!&lt;br /&gt;
&lt;br /&gt;
=== Step 6: LocalSettings.php Cleanup ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
## CUSTOM ELASTIC SEARCH&lt;br /&gt;
// Force CirrusSearch overrides at the very end of LocalSettings.php&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
&lt;br /&gt;
// Force exact database prefix matching for CirrusSearch&lt;br /&gt;
$wgCirrusSearchClusterOverrides = [&lt;br /&gt;
    &#039;default&#039; =&amp;gt; [&lt;br /&gt;
        &#039;replica&#039; =&amp;gt; &#039;127.0.0.1&#039;&lt;br /&gt;
    ]&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
// Ensure fallback to core MySQL is explicitly disabled for testing&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
$wgCirrusSearchEnableDynamicHighlighter = false;&lt;br /&gt;
&lt;br /&gt;
$wgJobRunRate = 0;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 7: Setup Crontab Job ===&lt;br /&gt;
====Job====&lt;br /&gt;
# Establish a job that runs every minute&lt;br /&gt;
# crontab -e&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
* * * * * /usr/bin/php /var/www/html/&amp;lt;yourWebDir&amp;gt;/maintenance/run.php runJobs --maxtime=60 &amp;gt;&amp;gt; /var/log/mediawiki/runJobs.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
====Logs====&lt;br /&gt;
# Setup a log dir (probably should revisit this some day and do a proper rotation)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /var/log/mediawiki&lt;br /&gt;
sudo chown it:it /var/log/mediawiki&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reverting to the Default MediaWiki Search ==&lt;br /&gt;
&lt;br /&gt;
If you are experiencing issues with CirrusSearch or simply want to revert to MediaWiki&#039;s native MySQL/MariaDB database search, follow these steps to safely disable the extension.&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Edit LocalSettings.php ===&lt;br /&gt;
Open your &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file and locate the configuration block for CirrusSearch.&lt;br /&gt;
&lt;br /&gt;
You must remove or comment out the line that sets the search engine type, as well as the extension loading commands.&lt;br /&gt;
&lt;br /&gt;
Change this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To this (commented out by adding &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
// wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
// $wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
// $wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &#039;&#039;Note: By removing &amp;lt;code&amp;gt;$wgSearchType&amp;lt;/code&amp;gt;, MediaWiki automatically falls back to its default internal search engine.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Clear the MediaWiki Cache ===&lt;br /&gt;
MediaWiki caches configuration settings. To ensure the wiki immediately recognizes that CirrusSearch has been disabled, purge the application cache from your terminal in the MediaWiki root directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php purgeCache&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Verify the Changes ===&lt;br /&gt;
Go to your wiki in a web browser and try using the search bar. The results should now load using the standard MediaWiki search interface.&lt;br /&gt;
&lt;br /&gt;
=== Step 4: (Optional) Stop the Elasticsearch Service ===&lt;br /&gt;
Elasticsearch consumes a significant amount of RAM (often 1GB+). If you do not plan to use it again or are permanently abandoning CirrusSearch, you should stop and disable the background service to free up your server resources:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl disable --now elasticsearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Step 5: Crontab ===&lt;br /&gt;
# Edit out or remove the schedule crontab job.&lt;br /&gt;
&lt;br /&gt;
[[Category:Wiki]]&lt;br /&gt;
[[Category:Weblog-2026-08]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=ElasticSearch_on_MediaWiki&amp;diff=2033</id>
		<title>ElasticSearch on MediaWiki</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=ElasticSearch_on_MediaWiki&amp;diff=2033"/>
		<updated>2026-08-26T08:56:25Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Prerequisites */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installing and Configuring CirrusSearch with Elasticsearch ==&lt;br /&gt;
&lt;br /&gt;
Setting up &#039;&#039;&#039;CirrusSearch&#039;&#039;&#039; with Elasticsearch requires three main phases: installing the Elasticsearch cluster, downloading the required MediaWiki extensions (Elastica and CirrusSearch), and building the search index via MediaWiki maintenance scripts.&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
* &#039;&#039;&#039;MediaWiki 1.39+:&#039;&#039;&#039; Recommended Elasticsearch 7.10.2 (or OpenSearch 1.3+).&lt;br /&gt;
* &#039;&#039;&#039;PHP:&#039;&#039;&#039; The PHP &amp;lt;code&amp;gt;cURL&amp;lt;/code&amp;gt; extension must be enabled.&lt;br /&gt;
* &#039;&#039;&#039;Composer:&#039;&#039;&#039; See https://getcomposer.org/install for more information.&lt;br /&gt;
* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&#039;&#039;&#039;DATABASE NAMES MUST BE ALL LOWERCASE&#039;&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Composer Install====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
sudo apt install curl php-cli php-mbstring git unzip&lt;br /&gt;
php -r &amp;quot;copy(&#039;https://getcomposer.org/installer&#039;, &#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
php composer-setup.php --install-dir=/usr/local/bin --filename=composer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Install &amp;amp; Start Elasticsearch ===&lt;br /&gt;
Install Elasticsearch on your server (instructions below are for Ubuntu/Debian):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Install Java runtime if not already installed&lt;br /&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt install -y openjdk-17-jre-headless&lt;br /&gt;
&lt;br /&gt;
# Install Elasticsearch 7.x&lt;br /&gt;
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.2-amd64.deb&lt;br /&gt;
sudo dpkg -i elasticsearch-7.10.2-amd64.deb&lt;br /&gt;
&lt;br /&gt;
# Enable and start the service&lt;br /&gt;
sudo systemctl enable --now elasticsearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To verify it is running on &amp;lt;code&amp;gt;localhost:9200&amp;lt;/code&amp;gt;, test it in your terminal with &amp;lt;code&amp;gt;curl http://localhost:9200&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Download the MediaWiki Extensions ===&lt;br /&gt;
CirrusSearch depends on &#039;&#039;&#039;Extension:Elastica&#039;&#039;&#039; to serve as the PHP client bridge.&lt;br /&gt;
&lt;br /&gt;
# Navigate to your MediaWiki &amp;lt;code&amp;gt;extensions/&amp;lt;/code&amp;gt; directory:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /var/www/html/&amp;lt;yourWebDir&amp;gt;/extensions&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Download both Elastica and CirrusSearch (replace &amp;lt;code&amp;gt;REL1_39&amp;lt;/code&amp;gt; with your MediaWiki branch version, e.g., &amp;lt;code&amp;gt;REL1_40&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;REL1_43&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone -b REL1_43 https://gerrit.wikimedia.org/r/mediawiki/extensions/Elastica&lt;br /&gt;
git clone -b REL1_43 https://gerrit.wikimedia.org/r/mediawiki/extensions/CirrusSearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Install PHP Dependencies:&#039;&#039;&#039; If you cloned the extensions via Git, you must install the Composer dependencies inside both extension folders:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd Elastica &amp;amp;&amp;amp; composer config policy.advisories.block false &amp;amp;&amp;amp; composer install --no-dev &amp;amp;&amp;amp; cd ..&lt;br /&gt;
cd CirrusSearch &amp;amp;&amp;amp; composer config policy.advisories.block false &amp;amp;&amp;amp; composer install --no-dev &amp;amp;&amp;amp; cd ..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Configure LocalSettings.php ===&lt;br /&gt;
Open your &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file and add the following block at the bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// 1. Load the required extensions&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
&lt;br /&gt;
// 2. Specify your Elasticsearch server location&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
&lt;br /&gt;
// 3. Temporarily disable search updates during bootstrapping&lt;br /&gt;
$wgDisableSearchUpdate = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 4: Generate and Bootstrap the Search Index ===&lt;br /&gt;
Run the maintenance scripts from your MediaWiki root directory to build and populate the Elasticsearch index.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Configure the index structure:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php CirrusSearch:UpdateSearchIndexConfig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Re-enable live search updates:&#039;&#039;&#039; Go back into &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; and &#039;&#039;&#039;remove or comment out&#039;&#039;&#039; the &amp;lt;code&amp;gt;$wgDisableSearchUpdate = true;&amp;lt;/code&amp;gt; line.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Populate the index with your wiki&#039;s page content:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php CirrusSearch:ForceSearchIndex --skipLinks --indexOnSkip&lt;br /&gt;
php maintenance/run.php CirrusSearch:ForceSearchIndex --skipParse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*: &#039;&#039;Note: For smaller wikis, running just &amp;lt;code&amp;gt;php maintenance/run.php CirrusSearch:ForceSearchIndex&amp;lt;/code&amp;gt; is usually sufficient.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Step 5: Switch MediaWiki to Use CirrusSearch ===&lt;br /&gt;
Once indexing completes successfully, add the final setting to &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; to hand search queries over to Elasticsearch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Direct default search traffic to CirrusSearch&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test a search query on your wiki&#039;s &amp;lt;code&amp;gt;Special:Search&amp;lt;/code&amp;gt; page. Your results should now be powered by Elasticsearch!&lt;br /&gt;
&lt;br /&gt;
=== Step 6: LocalSettings.php Cleanup ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
## CUSTOM ELASTIC SEARCH&lt;br /&gt;
// Force CirrusSearch overrides at the very end of LocalSettings.php&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
&lt;br /&gt;
// Force exact database prefix matching for CirrusSearch&lt;br /&gt;
$wgCirrusSearchClusterOverrides = [&lt;br /&gt;
    &#039;default&#039; =&amp;gt; [&lt;br /&gt;
        &#039;replica&#039; =&amp;gt; &#039;127.0.0.1&#039;&lt;br /&gt;
    ]&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
// Ensure fallback to core MySQL is explicitly disabled for testing&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
$wgCirrusSearchEnableDynamicHighlighter = false;&lt;br /&gt;
&lt;br /&gt;
$wgJobRunRate = 0;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 7: Setup Crontab Job ===&lt;br /&gt;
====Job====&lt;br /&gt;
# Establish a job that runs every minute&lt;br /&gt;
# crontab -e&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
* * * * * /usr/bin/php /var/www/html/&amp;lt;yourWebDir&amp;gt;/maintenance/run.php runJobs --maxtime=60 &amp;gt;&amp;gt; /var/log/mediawiki/runJobs.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
====Logs====&lt;br /&gt;
# Setup a log dir (probably should revisit this some day and do a proper rotation)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /var/log/mediawiki&lt;br /&gt;
sudo chown it:it /var/log/mediawiki&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reverting to the Default MediaWiki Search ==&lt;br /&gt;
&lt;br /&gt;
If you are experiencing issues with CirrusSearch or simply want to revert to MediaWiki&#039;s native MySQL/MariaDB database search, follow these steps to safely disable the extension.&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Edit LocalSettings.php ===&lt;br /&gt;
Open your &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file and locate the configuration block for CirrusSearch.&lt;br /&gt;
&lt;br /&gt;
You must remove or comment out the line that sets the search engine type, as well as the extension loading commands.&lt;br /&gt;
&lt;br /&gt;
Change this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To this (commented out by adding &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
// wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
// $wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
// $wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &#039;&#039;Note: By removing &amp;lt;code&amp;gt;$wgSearchType&amp;lt;/code&amp;gt;, MediaWiki automatically falls back to its default internal search engine.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Clear the MediaWiki Cache ===&lt;br /&gt;
MediaWiki caches configuration settings. To ensure the wiki immediately recognizes that CirrusSearch has been disabled, purge the application cache from your terminal in the MediaWiki root directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php purgeCache&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Verify the Changes ===&lt;br /&gt;
Go to your wiki in a web browser and try using the search bar. The results should now load using the standard MediaWiki search interface.&lt;br /&gt;
&lt;br /&gt;
=== Step 4: (Optional) Stop the Elasticsearch Service ===&lt;br /&gt;
Elasticsearch consumes a significant amount of RAM (often 1GB+). If you do not plan to use it again or are permanently abandoning CirrusSearch, you should stop and disable the background service to free up your server resources:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl disable --now elasticsearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Step 5: Crontab ===&lt;br /&gt;
# Edit out or remove the schedule crontab job.&lt;br /&gt;
&lt;br /&gt;
[[Category:Wiki]]&lt;br /&gt;
[[Category:Weblog-2026-08]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=ElasticSearch_on_MediaWiki&amp;diff=2032</id>
		<title>ElasticSearch on MediaWiki</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=ElasticSearch_on_MediaWiki&amp;diff=2032"/>
		<updated>2026-08-26T08:54:31Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installing and Configuring CirrusSearch with Elasticsearch ==&lt;br /&gt;
&lt;br /&gt;
Setting up &#039;&#039;&#039;CirrusSearch&#039;&#039;&#039; with Elasticsearch requires three main phases: installing the Elasticsearch cluster, downloading the required MediaWiki extensions (Elastica and CirrusSearch), and building the search index via MediaWiki maintenance scripts.&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
* &#039;&#039;&#039;MediaWiki 1.39+:&#039;&#039;&#039; Recommended Elasticsearch 7.10.2 (or OpenSearch 1.3+).&lt;br /&gt;
* &#039;&#039;&#039;PHP:&#039;&#039;&#039; The PHP &amp;lt;code&amp;gt;cURL&amp;lt;/code&amp;gt; extension must be enabled.&lt;br /&gt;
* &#039;&#039;&#039;Composer:&#039;&#039;&#039; See https://getcomposer.org/install for more information.&lt;br /&gt;
&lt;br /&gt;
====Composer Install====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt upgrade&lt;br /&gt;
sudo apt install curl php-cli php-mbstring git unzip&lt;br /&gt;
php -r &amp;quot;copy(&#039;https://getcomposer.org/installer&#039;, &#039;composer-setup.php&#039;);&amp;quot;&lt;br /&gt;
php composer-setup.php --install-dir=/usr/local/bin --filename=composer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Install &amp;amp; Start Elasticsearch ===&lt;br /&gt;
Install Elasticsearch on your server (instructions below are for Ubuntu/Debian):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Install Java runtime if not already installed&lt;br /&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt install -y openjdk-17-jre-headless&lt;br /&gt;
&lt;br /&gt;
# Install Elasticsearch 7.x&lt;br /&gt;
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.2-amd64.deb&lt;br /&gt;
sudo dpkg -i elasticsearch-7.10.2-amd64.deb&lt;br /&gt;
&lt;br /&gt;
# Enable and start the service&lt;br /&gt;
sudo systemctl enable --now elasticsearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To verify it is running on &amp;lt;code&amp;gt;localhost:9200&amp;lt;/code&amp;gt;, test it in your terminal with &amp;lt;code&amp;gt;curl http://localhost:9200&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Download the MediaWiki Extensions ===&lt;br /&gt;
CirrusSearch depends on &#039;&#039;&#039;Extension:Elastica&#039;&#039;&#039; to serve as the PHP client bridge.&lt;br /&gt;
&lt;br /&gt;
# Navigate to your MediaWiki &amp;lt;code&amp;gt;extensions/&amp;lt;/code&amp;gt; directory:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /var/www/html/&amp;lt;yourWebDir&amp;gt;/extensions&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Download both Elastica and CirrusSearch (replace &amp;lt;code&amp;gt;REL1_39&amp;lt;/code&amp;gt; with your MediaWiki branch version, e.g., &amp;lt;code&amp;gt;REL1_40&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;REL1_43&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone -b REL1_43 https://gerrit.wikimedia.org/r/mediawiki/extensions/Elastica&lt;br /&gt;
git clone -b REL1_43 https://gerrit.wikimedia.org/r/mediawiki/extensions/CirrusSearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Install PHP Dependencies:&#039;&#039;&#039; If you cloned the extensions via Git, you must install the Composer dependencies inside both extension folders:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd Elastica &amp;amp;&amp;amp; composer config policy.advisories.block false &amp;amp;&amp;amp; composer install --no-dev &amp;amp;&amp;amp; cd ..&lt;br /&gt;
cd CirrusSearch &amp;amp;&amp;amp; composer config policy.advisories.block false &amp;amp;&amp;amp; composer install --no-dev &amp;amp;&amp;amp; cd ..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Configure LocalSettings.php ===&lt;br /&gt;
Open your &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file and add the following block at the bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// 1. Load the required extensions&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
&lt;br /&gt;
// 2. Specify your Elasticsearch server location&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
&lt;br /&gt;
// 3. Temporarily disable search updates during bootstrapping&lt;br /&gt;
$wgDisableSearchUpdate = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 4: Generate and Bootstrap the Search Index ===&lt;br /&gt;
Run the maintenance scripts from your MediaWiki root directory to build and populate the Elasticsearch index.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Configure the index structure:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php CirrusSearch:UpdateSearchIndexConfig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Re-enable live search updates:&#039;&#039;&#039; Go back into &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; and &#039;&#039;&#039;remove or comment out&#039;&#039;&#039; the &amp;lt;code&amp;gt;$wgDisableSearchUpdate = true;&amp;lt;/code&amp;gt; line.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Populate the index with your wiki&#039;s page content:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php CirrusSearch:ForceSearchIndex --skipLinks --indexOnSkip&lt;br /&gt;
php maintenance/run.php CirrusSearch:ForceSearchIndex --skipParse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*: &#039;&#039;Note: For smaller wikis, running just &amp;lt;code&amp;gt;php maintenance/run.php CirrusSearch:ForceSearchIndex&amp;lt;/code&amp;gt; is usually sufficient.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Step 5: Switch MediaWiki to Use CirrusSearch ===&lt;br /&gt;
Once indexing completes successfully, add the final setting to &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; to hand search queries over to Elasticsearch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Direct default search traffic to CirrusSearch&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test a search query on your wiki&#039;s &amp;lt;code&amp;gt;Special:Search&amp;lt;/code&amp;gt; page. Your results should now be powered by Elasticsearch!&lt;br /&gt;
&lt;br /&gt;
=== Step 6: LocalSettings.php Cleanup ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
## CUSTOM ELASTIC SEARCH&lt;br /&gt;
// Force CirrusSearch overrides at the very end of LocalSettings.php&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
&lt;br /&gt;
// Force exact database prefix matching for CirrusSearch&lt;br /&gt;
$wgCirrusSearchClusterOverrides = [&lt;br /&gt;
    &#039;default&#039; =&amp;gt; [&lt;br /&gt;
        &#039;replica&#039; =&amp;gt; &#039;127.0.0.1&#039;&lt;br /&gt;
    ]&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
// Ensure fallback to core MySQL is explicitly disabled for testing&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
$wgCirrusSearchEnableDynamicHighlighter = false;&lt;br /&gt;
&lt;br /&gt;
$wgJobRunRate = 0;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 7: Setup Crontab Job ===&lt;br /&gt;
====Job====&lt;br /&gt;
# Establish a job that runs every minute&lt;br /&gt;
# crontab -e&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
* * * * * /usr/bin/php /var/www/html/&amp;lt;yourWebDir&amp;gt;/maintenance/run.php runJobs --maxtime=60 &amp;gt;&amp;gt; /var/log/mediawiki/runJobs.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
====Logs====&lt;br /&gt;
# Setup a log dir (probably should revisit this some day and do a proper rotation)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /var/log/mediawiki&lt;br /&gt;
sudo chown it:it /var/log/mediawiki&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reverting to the Default MediaWiki Search ==&lt;br /&gt;
&lt;br /&gt;
If you are experiencing issues with CirrusSearch or simply want to revert to MediaWiki&#039;s native MySQL/MariaDB database search, follow these steps to safely disable the extension.&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Edit LocalSettings.php ===&lt;br /&gt;
Open your &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file and locate the configuration block for CirrusSearch.&lt;br /&gt;
&lt;br /&gt;
You must remove or comment out the line that sets the search engine type, as well as the extension loading commands.&lt;br /&gt;
&lt;br /&gt;
Change this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To this (commented out by adding &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
// wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
// $wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
// $wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &#039;&#039;Note: By removing &amp;lt;code&amp;gt;$wgSearchType&amp;lt;/code&amp;gt;, MediaWiki automatically falls back to its default internal search engine.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Clear the MediaWiki Cache ===&lt;br /&gt;
MediaWiki caches configuration settings. To ensure the wiki immediately recognizes that CirrusSearch has been disabled, purge the application cache from your terminal in the MediaWiki root directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php purgeCache&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Verify the Changes ===&lt;br /&gt;
Go to your wiki in a web browser and try using the search bar. The results should now load using the standard MediaWiki search interface.&lt;br /&gt;
&lt;br /&gt;
=== Step 4: (Optional) Stop the Elasticsearch Service ===&lt;br /&gt;
Elasticsearch consumes a significant amount of RAM (often 1GB+). If you do not plan to use it again or are permanently abandoning CirrusSearch, you should stop and disable the background service to free up your server resources:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl disable --now elasticsearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Step 5: Crontab ===&lt;br /&gt;
# Edit out or remove the schedule crontab job.&lt;br /&gt;
&lt;br /&gt;
[[Category:Wiki]]&lt;br /&gt;
[[Category:Weblog-2026-08]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=ElasticSearch_on_MediaWiki&amp;diff=2031</id>
		<title>ElasticSearch on MediaWiki</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=ElasticSearch_on_MediaWiki&amp;diff=2031"/>
		<updated>2026-08-25T22:37:46Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: Created page with &amp;quot;== Installing and Configuring CirrusSearch with Elasticsearch ==  Setting up &amp;#039;&amp;#039;&amp;#039;CirrusSearch&amp;#039;&amp;#039;&amp;#039; with Elasticsearch requires three main phases: installing the Elasticsearch cluster, downloading the required MediaWiki extensions (Elastica and CirrusSearch), and building the search index via MediaWiki maintenance scripts.  === Prerequisites === * &amp;#039;&amp;#039;&amp;#039;MediaWiki 1.39+:&amp;#039;&amp;#039;&amp;#039; Recommended Elasticsearch 7.10.2 (or OpenSearch 1.3+). * &amp;#039;&amp;#039;&amp;#039;PHP:&amp;#039;&amp;#039;&amp;#039; The PHP &amp;lt;code&amp;gt;cURL&amp;lt;/code&amp;gt; extension mu...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installing and Configuring CirrusSearch with Elasticsearch ==&lt;br /&gt;
&lt;br /&gt;
Setting up &#039;&#039;&#039;CirrusSearch&#039;&#039;&#039; with Elasticsearch requires three main phases: installing the Elasticsearch cluster, downloading the required MediaWiki extensions (Elastica and CirrusSearch), and building the search index via MediaWiki maintenance scripts.&lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
* &#039;&#039;&#039;MediaWiki 1.39+:&#039;&#039;&#039; Recommended Elasticsearch 7.10.2 (or OpenSearch 1.3+).&lt;br /&gt;
* &#039;&#039;&#039;PHP:&#039;&#039;&#039; The PHP &amp;lt;code&amp;gt;cURL&amp;lt;/code&amp;gt; extension must be enabled.&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Install &amp;amp; Start Elasticsearch ===&lt;br /&gt;
Install Elasticsearch on your server (instructions below are for Ubuntu/Debian):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Install Java runtime if not already installed&lt;br /&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt install -y openjdk-17-jre-headless&lt;br /&gt;
&lt;br /&gt;
# Install Elasticsearch 7.x&lt;br /&gt;
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.2-amd64.deb&lt;br /&gt;
sudo dpkg -i elasticsearch-7.10.2-amd64.deb&lt;br /&gt;
&lt;br /&gt;
# Enable and start the service&lt;br /&gt;
sudo systemctl enable --now elasticsearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To verify it is running on &amp;lt;code&amp;gt;localhost:9200&amp;lt;/code&amp;gt;, test it in your terminal with &amp;lt;code&amp;gt;curl http://localhost:9200&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Download the MediaWiki Extensions ===&lt;br /&gt;
CirrusSearch depends on &#039;&#039;&#039;Extension:Elastica&#039;&#039;&#039; to serve as the PHP client bridge.&lt;br /&gt;
&lt;br /&gt;
# Navigate to your MediaWiki &amp;lt;code&amp;gt;extensions/&amp;lt;/code&amp;gt; directory:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /var/www/html/&amp;lt;yourWebDir&amp;gt;/extensions&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Download both Elastica and CirrusSearch (replace &amp;lt;code&amp;gt;REL1_39&amp;lt;/code&amp;gt; with your MediaWiki branch version, e.g., &amp;lt;code&amp;gt;REL1_40&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;REL1_43&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone -b REL1_43 https://gerrit.wikimedia.org/r/mediawiki/extensions/Elastica&lt;br /&gt;
git clone -b REL1_43 https://gerrit.wikimedia.org/r/mediawiki/extensions/CirrusSearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Install PHP Dependencies:&#039;&#039;&#039; If you cloned the extensions via Git, you must install the Composer dependencies inside both extension folders:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd Elastica &amp;amp;&amp;amp; composer install --no-dev &amp;amp;&amp;amp; cd ..&lt;br /&gt;
cd CirrusSearch &amp;amp;&amp;amp; composer install --no-dev &amp;amp;&amp;amp; cd ..&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Configure LocalSettings.php ===&lt;br /&gt;
Open your &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file and add the following block at the bottom:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// 1. Load the required extensions&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
&lt;br /&gt;
// 2. Specify your Elasticsearch server location&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
&lt;br /&gt;
// 3. Temporarily disable search updates during bootstrapping&lt;br /&gt;
$wgDisableSearchUpdate = true;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 4: Generate and Bootstrap the Search Index ===&lt;br /&gt;
Run the maintenance scripts from your MediaWiki root directory to build and populate the Elasticsearch index.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Configure the index structure:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php CirrusSearch:UpdateSearchIndexConfig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Re-enable live search updates:&#039;&#039;&#039; Go back into &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; and &#039;&#039;&#039;remove or comment out&#039;&#039;&#039; the &amp;lt;code&amp;gt;$wgDisableSearchUpdate = true;&amp;lt;/code&amp;gt; line.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Populate the index with your wiki&#039;s page content:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php CirrusSearch:ForceSearchIndex --skipLinks --indexOnSkip&lt;br /&gt;
php maintenance/run.php CirrusSearch:ForceSearchIndex --skipParse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*: &#039;&#039;Note: For smaller wikis, running just &amp;lt;code&amp;gt;php maintenance/run.php CirrusSearch:ForceSearchIndex&amp;lt;/code&amp;gt; is usually sufficient.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Step 5: Switch MediaWiki to Use CirrusSearch ===&lt;br /&gt;
Once indexing completes successfully, add the final setting to &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; to hand search queries over to Elasticsearch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Direct default search traffic to CirrusSearch&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test a search query on your wiki&#039;s &amp;lt;code&amp;gt;Special:Search&amp;lt;/code&amp;gt; page. Your results should now be powered by Elasticsearch!&lt;br /&gt;
&lt;br /&gt;
=== Step 6: LocalSettings.php Cleanup ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
## CUSTOM ELASTIC SEARCH&lt;br /&gt;
// Force CirrusSearch overrides at the very end of LocalSettings.php&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
&lt;br /&gt;
// Force exact database prefix matching for CirrusSearch&lt;br /&gt;
$wgCirrusSearchClusterOverrides = [&lt;br /&gt;
    &#039;default&#039; =&amp;gt; [&lt;br /&gt;
        &#039;replica&#039; =&amp;gt; &#039;127.0.0.1&#039;&lt;br /&gt;
    ]&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
// Ensure fallback to core MySQL is explicitly disabled for testing&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
$wgCirrusSearchEnableDynamicHighlighter = false;&lt;br /&gt;
&lt;br /&gt;
$wgJobRunRate = 0;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 7: Setup Crontab Job ===&lt;br /&gt;
====Job====&lt;br /&gt;
# Establish a job that runs every minute&lt;br /&gt;
# crontab -e&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
* * * * * /usr/bin/php /var/www/html/&amp;lt;yourWebDir&amp;gt;/maintenance/run.php runJobs --maxtime=60 &amp;gt;&amp;gt; /var/log/mediawiki/runJobs.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
====Logs====&lt;br /&gt;
# Setup a log dir (probably should revisit this some day and do a proper rotation)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /var/log/mediawiki&lt;br /&gt;
sudo chown it:it /var/log/mediawiki&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reverting to the Default MediaWiki Search ==&lt;br /&gt;
&lt;br /&gt;
If you are experiencing issues with CirrusSearch or simply want to revert to MediaWiki&#039;s native MySQL/MariaDB database search, follow these steps to safely disable the extension.&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Edit LocalSettings.php ===&lt;br /&gt;
Open your &amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt; file and locate the configuration block for CirrusSearch.&lt;br /&gt;
&lt;br /&gt;
You must remove or comment out the line that sets the search engine type, as well as the extension loading commands.&lt;br /&gt;
&lt;br /&gt;
Change this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
$wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
$wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To this (commented out by adding &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// wfLoadExtension( &#039;Elastica&#039; );&lt;br /&gt;
// wfLoadExtension( &#039;CirrusSearch&#039; );&lt;br /&gt;
// $wgCirrusSearchServers = [ &#039;127.0.0.1&#039; ];&lt;br /&gt;
// $wgSearchType = &#039;CirrusSearch&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &#039;&#039;Note: By removing &amp;lt;code&amp;gt;$wgSearchType&amp;lt;/code&amp;gt;, MediaWiki automatically falls back to its default internal search engine.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Clear the MediaWiki Cache ===&lt;br /&gt;
MediaWiki caches configuration settings. To ensure the wiki immediately recognizes that CirrusSearch has been disabled, purge the application cache from your terminal in the MediaWiki root directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php maintenance/run.php purgeCache&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Step 3: Verify the Changes ===&lt;br /&gt;
Go to your wiki in a web browser and try using the search bar. The results should now load using the standard MediaWiki search interface.&lt;br /&gt;
&lt;br /&gt;
=== Step 4: (Optional) Stop the Elasticsearch Service ===&lt;br /&gt;
Elasticsearch consumes a significant amount of RAM (often 1GB+). If you do not plan to use it again or are permanently abandoning CirrusSearch, you should stop and disable the background service to free up your server resources:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl disable --now elasticsearch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Step 5: Crontab ===&lt;br /&gt;
# Edit out or remove the schedule crontab job.&lt;br /&gt;
&lt;br /&gt;
[[Category:Wiki]]&lt;br /&gt;
[[Category:Weblog-2026-08]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Mermaid&amp;diff=2030</id>
		<title>Mermaid</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Mermaid&amp;diff=2030"/>
		<updated>2026-08-18T10:19:22Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Nested Diagrams */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
=Nested Diagrams=&lt;br /&gt;
How complex would nested diagrams be?  Would need to map everything out and have a naming convention for the nodes and levels.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;nodeShortName&amp;gt;_&amp;lt;A-Z&amp;gt; becomes the page to be created&lt;br /&gt;
** the 27th level could be AA, then AB, etc.  We would hope that we never got that deep.&lt;br /&gt;
* Does the naming really work?  Might need to prefix with the Subject.&lt;br /&gt;
* &amp;lt;projectShortName&amp;gt;_&amp;lt;nodeShortName&amp;gt;_&amp;lt;A-Z&amp;gt; becomes the page to be created&lt;br /&gt;
** Needs to be unique!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Original Link Test=&lt;br /&gt;
The chart below was started before the thoughts above.&lt;br /&gt;
&amp;lt;mermaid&amp;gt;&lt;br /&gt;
graph TD&lt;br /&gt;
    A[Start] --&amp;gt; B{Is it working?}&lt;br /&gt;
    B -- Yes --&amp;gt; C[Great!]&lt;br /&gt;
    B -- No --&amp;gt; D[Check Mermaid Lvl 2]&lt;br /&gt;
&lt;br /&gt;
click D &amp;quot;/index.php/MermaidLvl2&amp;quot; &amp;quot;Go to Mermaid Level 2&amp;quot;&lt;br /&gt;
style D fill:#2ecc71,stroke:#27ae60,color:#fff&lt;br /&gt;
&amp;lt;/mermaid&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Mermaid]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Mermaid&amp;diff=2029</id>
		<title>Mermaid</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Mermaid&amp;diff=2029"/>
		<updated>2026-08-18T10:19:04Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Nested Diagrams */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
=Nested Diagrams=&lt;br /&gt;
How complex would nested diagrams be?  Would need to map everything out and have a naming convention for the nodes and levels.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;nodeShortName&amp;gt;_&amp;lt;A-Z&amp;gt; becomes the page to be created&lt;br /&gt;
** the 27th level could be AA, then AB, etc.  We would hope that we never got that deep.&lt;br /&gt;
* Does the naming really work?  Might need to prefix with the Subject.&lt;br /&gt;
* &amp;lt;projectShortName&amp;gt;_&amp;lt;nodeShortName&amp;gt;_&amp;lt;A-Z&amp;gt; becomes the page to be created&lt;br /&gt;
** Needs to be unique!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The chart below was started before the thoughts above.&lt;br /&gt;
&amp;lt;mermaid&amp;gt;&lt;br /&gt;
graph TD&lt;br /&gt;
    A[Start] --&amp;gt; B{Is it working?}&lt;br /&gt;
    B -- Yes --&amp;gt; C[Great!]&lt;br /&gt;
    B -- No --&amp;gt; D[Check Mermaid Lvl 2]&lt;br /&gt;
&lt;br /&gt;
click D &amp;quot;/index.php/MermaidLvl2&amp;quot; &amp;quot;Go to Mermaid Level 2&amp;quot;&lt;br /&gt;
style D fill:#2ecc71,stroke:#27ae60,color:#fff&lt;br /&gt;
&amp;lt;/mermaid&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Mermaid]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Mermaid&amp;diff=2028</id>
		<title>Mermaid</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Mermaid&amp;diff=2028"/>
		<updated>2026-08-18T10:16:20Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
=Nested Diagrams=&lt;br /&gt;
How complex would nested diagrams be?  Would need to map everything out and have a naming convention for the nodes and levels.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;nodeShortName&amp;gt;_&amp;lt;A-Z&amp;gt; becomes the page to be created&lt;br /&gt;
** the 27th level could be AA, then AB, etc.  We would hope that we never got that deep.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;mermaid&amp;gt;&lt;br /&gt;
graph TD&lt;br /&gt;
    A[Start] --&amp;gt; B{Is it working?}&lt;br /&gt;
    B -- Yes --&amp;gt; C[Great!]&lt;br /&gt;
    B -- No --&amp;gt; D[Check Mermaid Lvl 2]&lt;br /&gt;
&lt;br /&gt;
click D &amp;quot;/index.php/MermaidLvl2&amp;quot; &amp;quot;Go to Mermaid Level 2&amp;quot;&lt;br /&gt;
style D fill:#2ecc71,stroke:#27ae60,color:#fff&lt;br /&gt;
&amp;lt;/mermaid&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Mermaid]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Powershell:_AD_Group_Membership_from_OU&amp;diff=2027</id>
		<title>Powershell: AD Group Membership from OU</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Powershell:_AD_Group_Membership_from_OU&amp;diff=2027"/>
		<updated>2026-08-18T10:12:58Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Purpose=&lt;br /&gt;
Using Powershell, Build a CSV of group membership from a designated OU.&lt;br /&gt;
&lt;br /&gt;
=Code=&lt;br /&gt;
&amp;lt;SyntaxHighlight lang=&amp;quot;powershell&amp;quot; line&amp;gt;&lt;br /&gt;
##################################################&lt;br /&gt;
## List Groups from Users found in target $OU ##&lt;br /&gt;
## V 0.1&lt;br /&gt;
##################################################&lt;br /&gt;
## To Do&lt;br /&gt;
## - Build Output to CSV [Done]&lt;br /&gt;
## - Build CLI variable for OU&lt;br /&gt;
###################################################&lt;br /&gt;
## Variables (System - Do Not Touch)&lt;br /&gt;
$DATE = (Get-Date -UFormat &amp;quot;%Y%m%d-%H%M%S-&amp;quot;)&lt;br /&gt;
###################################################&lt;br /&gt;
## Variables (User)&lt;br /&gt;
$DOMAIN = &amp;quot;DC=rabbibob,DC=com&amp;quot;&lt;br /&gt;
$OU = &amp;quot;OU=Users&amp;quot;&lt;br /&gt;
$csvFileName = &amp;quot;AD_Groups_OUScan_$DATE$OU.csv&amp;quot;&lt;br /&gt;
####################################################&lt;br /&gt;
## Do Not Edit Below This Line&lt;br /&gt;
####################################################&lt;br /&gt;
$USERS = @()&lt;br /&gt;
$SEARCH_OU = &amp;quot;$OU,$DOMAIN&amp;quot;&lt;br /&gt;
write-host $SEARCH_OU&lt;br /&gt;
####################################################&lt;br /&gt;
# Start Search and array population&lt;br /&gt;
####################################################&lt;br /&gt;
$GetOU = Get-ADUser -SearchBase $SEARCH_OU -Filter *&lt;br /&gt;
$USERS = foreach ($user in $GetOU) {&lt;br /&gt;
    $UserDN = $user.DistinguishedName&lt;br /&gt;
    $Name=$user.SamAccountName &lt;br /&gt;
    Write-Host &amp;quot;Processing&amp;quot; $Name&lt;br /&gt;
    Get-ADGroup -LDAPFilter &amp;quot;(member=$UserDN)&amp;quot; | Select-Object @{Name=&#039;User&#039;;Expression={$Name}},GroupCategory,GroupScope,Name,ObjectClass,SamAccountName &lt;br /&gt;
    }&lt;br /&gt;
####################################################&lt;br /&gt;
# Export to $csvFilename&lt;br /&gt;
    $users | Export-CSV $csvFileName&lt;br /&gt;
&amp;lt;/SyntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Powershell]]&lt;br /&gt;
[[Category:Weblog-2019-04]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=MermaidLvl2&amp;diff=2026</id>
		<title>MermaidLvl2</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=MermaidLvl2&amp;diff=2026"/>
		<updated>2026-08-18T10:12:02Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;mermaid&amp;gt;&lt;br /&gt;
graph TD&lt;br /&gt;
    A[Start &amp;lt;br&amp;gt;&amp;lt;i&amp;gt;Return to level 1&amp;lt;/i&amp;gt;] --&amp;gt; B{Did that work?}&lt;br /&gt;
    B -- Yes --&amp;gt; C[Great!]&lt;br /&gt;
    B -- No --&amp;gt; D[Oof]&lt;br /&gt;
    D -- Try Something Else--&amp;gt; E[Try A Random Page?]&lt;br /&gt;
click A &amp;quot;/index.php/Mermaid&amp;quot; &amp;quot;Go to Mermaid Level 1&amp;quot;&lt;br /&gt;
style A fill:#2ecc71,stroke:#27ae60,color:#fff&lt;br /&gt;
&lt;br /&gt;
click E &amp;quot;/index.php/Special:Random&amp;quot; &amp;quot;Random Page&amp;quot;&lt;br /&gt;
style E fill:#2ecc71,stroke:#27ae60,color:#fff&lt;br /&gt;
&amp;lt;/mermaid&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Mermaid]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=MermaidLvl2&amp;diff=2025</id>
		<title>MermaidLvl2</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=MermaidLvl2&amp;diff=2025"/>
		<updated>2026-08-18T10:11:24Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;mermaid&amp;gt;&lt;br /&gt;
graph TD&lt;br /&gt;
    A[Start &amp;lt;br&amp;gt;&amp;lt;i&amp;gt;Return to level 1&amp;lt;/i&amp;gt;] --&amp;gt; B{Did that work?}&lt;br /&gt;
    B -- Yes --&amp;gt; C[Great!]&lt;br /&gt;
    B -- No --&amp;gt; D[Oof]&lt;br /&gt;
    D -- Try Something Else--&amp;gt; E[Try A Random Page?]&lt;br /&gt;
click A &amp;quot;/index.php/Mermaid&amp;quot; &amp;quot;Go to Mermaid Level 1&amp;quot;&lt;br /&gt;
style A fill:#2ecc71,stroke:#27ae60,color:#fff&lt;br /&gt;
&lt;br /&gt;
click E &amp;quot;index.php/Special:Random&amp;quot; &amp;quot;Random Page&amp;quot;&lt;br /&gt;
style E fill:#2ecc71,stroke:#27ae60,color:#fff&lt;br /&gt;
&amp;lt;/mermaid&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Mermaid]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=MermaidLvl2&amp;diff=2024</id>
		<title>MermaidLvl2</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=MermaidLvl2&amp;diff=2024"/>
		<updated>2026-08-18T10:11:03Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;mermaid&amp;gt;&lt;br /&gt;
graph TD&lt;br /&gt;
    A[Start &amp;lt;br&amp;gt;&amp;lt;i&amp;gt;Return to level 1&amp;lt;/i&amp;gt;] --&amp;gt; B{Did that work?}&lt;br /&gt;
    B -- Yes --&amp;gt; C[Great!]&lt;br /&gt;
    B -- No --&amp;gt; D[Oof]&lt;br /&gt;
    D -- Maybe --&amp;gt; E[Try A Random Page?]&lt;br /&gt;
click A &amp;quot;/index.php/Mermaid&amp;quot; &amp;quot;Go to Mermaid Level 1&amp;quot;&lt;br /&gt;
style A fill:#2ecc71,stroke:#27ae60,color:#fff&lt;br /&gt;
&lt;br /&gt;
click E &amp;quot;index.php/Special:Random&amp;quot; &amp;quot;Random Page&amp;quot;&lt;br /&gt;
style E fill:#2ecc71,stroke:#27ae60,color:#fff&lt;br /&gt;
&amp;lt;/mermaid&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Mermaid]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=MermaidLvl2&amp;diff=2023</id>
		<title>MermaidLvl2</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=MermaidLvl2&amp;diff=2023"/>
		<updated>2026-08-18T10:09:16Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;mermaid&amp;gt;&lt;br /&gt;
graph TD&lt;br /&gt;
    A[Start &amp;lt;br&amp;gt;&amp;lt;i&amp;gt;Return to level 1&amp;lt;/i&amp;gt;] --&amp;gt; B{Did that work?}&lt;br /&gt;
    B -- Yes --&amp;gt; C[Great!]&lt;br /&gt;
    B -- No --&amp;gt; D[Oof]&lt;br /&gt;
&lt;br /&gt;
click A &amp;quot;/index.php/Mermaid&amp;quot; &amp;quot;Go to Mermaid Level 1&amp;quot;&lt;br /&gt;
style A fill:#2ecc71,stroke:#27ae60,color:#fff&lt;br /&gt;
&amp;lt;/mermaid&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Mermaid]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=MermaidLvl2&amp;diff=2022</id>
		<title>MermaidLvl2</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=MermaidLvl2&amp;diff=2022"/>
		<updated>2026-08-18T10:09:04Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: Created page with &amp;quot;&amp;lt;mermaid&amp;gt; graph TD     A[Start &amp;lt;br&amp;gt;&amp;lt;i&amp;gt;Return to level 1&amp;lt;/i&amp;gt;] --&amp;gt; B{Did that work?}     B -- Yes --&amp;gt; C[Great!]     B -- No --&amp;gt; D[Oof]  click A &amp;quot;/index.php?Mermaid&amp;quot; &amp;quot;Go to Mermaid Level 1&amp;quot; style A fill:#2ecc71,stroke:#27ae60,color:#fff &amp;lt;/mermaid&amp;gt;   Category:Mermaid&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;mermaid&amp;gt;&lt;br /&gt;
graph TD&lt;br /&gt;
    A[Start &amp;lt;br&amp;gt;&amp;lt;i&amp;gt;Return to level 1&amp;lt;/i&amp;gt;] --&amp;gt; B{Did that work?}&lt;br /&gt;
    B -- Yes --&amp;gt; C[Great!]&lt;br /&gt;
    B -- No --&amp;gt; D[Oof]&lt;br /&gt;
&lt;br /&gt;
click A &amp;quot;/index.php?Mermaid&amp;quot; &amp;quot;Go to Mermaid Level 1&amp;quot;&lt;br /&gt;
style A fill:#2ecc71,stroke:#27ae60,color:#fff&lt;br /&gt;
&amp;lt;/mermaid&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Mermaid]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Mermaid&amp;diff=2021</id>
		<title>Mermaid</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Mermaid&amp;diff=2021"/>
		<updated>2026-08-18T10:06:34Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;mermaid&amp;gt;&lt;br /&gt;
graph TD&lt;br /&gt;
    A[Start] --&amp;gt; B{Is it working?}&lt;br /&gt;
    B -- Yes --&amp;gt; C[Great!]&lt;br /&gt;
    B -- No --&amp;gt; D[Check Mermaid Lvl 2]&lt;br /&gt;
&lt;br /&gt;
click D &amp;quot;/index.php/MermaidLvl2&amp;quot; &amp;quot;Go to Mermaid Level 2&amp;quot;&lt;br /&gt;
style D fill:#2ecc71,stroke:#27ae60,color:#fff&lt;br /&gt;
&amp;lt;/mermaid&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Mermaid]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Mermaid&amp;diff=2020</id>
		<title>Mermaid</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Mermaid&amp;diff=2020"/>
		<updated>2026-08-18T10:06:10Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;mermaid&amp;gt;&lt;br /&gt;
graph TD&lt;br /&gt;
    A[Start] --&amp;gt; B{Is it working?}&lt;br /&gt;
    B -- Yes --&amp;gt; C[Great!]&lt;br /&gt;
    B -- No --&amp;gt; D[Check Mermaid Lvl 2]&lt;br /&gt;
&lt;br /&gt;
click D &amp;quot;/index.php?MermaidLvl2&amp;quot; &amp;quot;Go to Mermaid Level 2&amp;quot;&lt;br /&gt;
style D fill:#2ecc71,stroke:#27ae60,color:#fff&lt;br /&gt;
&amp;lt;/mermaid&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Mermaid]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Mermaid&amp;diff=2019</id>
		<title>Mermaid</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Mermaid&amp;diff=2019"/>
		<updated>2026-08-18T10:05:13Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;mermaid&amp;gt;&lt;br /&gt;
graph TD&lt;br /&gt;
    A[Start] --&amp;gt; B{Is it working?}&lt;br /&gt;
    B -- Yes --&amp;gt; C[Great!]&lt;br /&gt;
    B -- No --&amp;gt; D[Check LocalSettings.php]&lt;br /&gt;
&lt;br /&gt;
click D &amp;quot;/index.php?Minecraft&amp;quot; &amp;quot;Go to LocalSettings&amp;quot;&lt;br /&gt;
style D fill:#2ecc71,stroke:#27ae60,color:#fff&lt;br /&gt;
&amp;lt;/mermaid&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Mermaid]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Mermaid&amp;diff=2018</id>
		<title>Mermaid</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Mermaid&amp;diff=2018"/>
		<updated>2026-08-18T10:03:45Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: Created page with &amp;quot;&amp;lt;mermaid&amp;gt; graph TD     A[Start] --&amp;gt; B{Is it working?}     B -- Yes --&amp;gt; C[Great!]     B -- No --&amp;gt; D[Check LocalSettings.php]  click D &amp;quot;/index.php?Minecraft&amp;quot; &amp;quot;Go to LocalSettings&amp;quot; &amp;lt;/mermaid&amp;gt;   Category:Mermaid&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;mermaid&amp;gt;&lt;br /&gt;
graph TD&lt;br /&gt;
    A[Start] --&amp;gt; B{Is it working?}&lt;br /&gt;
    B -- Yes --&amp;gt; C[Great!]&lt;br /&gt;
    B -- No --&amp;gt; D[Check LocalSettings.php]&lt;br /&gt;
&lt;br /&gt;
click D &amp;quot;/index.php?Minecraft&amp;quot; &amp;quot;Go to LocalSettings&amp;quot;&lt;br /&gt;
&amp;lt;/mermaid&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Mermaid]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Minecraft&amp;diff=2017</id>
		<title>Minecraft</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Minecraft&amp;diff=2017"/>
		<updated>2026-08-18T09:29:07Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Coordinates */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Server Rules=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;I reserve the right to ban\remove anyone&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Respect the other players and their structures\work&lt;br /&gt;
* No griefing&lt;br /&gt;
* PG language&lt;br /&gt;
&lt;br /&gt;
=Server=&lt;br /&gt;
* &#039;&#039;&#039;Modpack&#039;&#039;&#039;: Tekkit (see details below)&lt;br /&gt;
* &#039;&#039;&#039;Address&#039;&#039;&#039;: Invite only&lt;br /&gt;
* &#039;&#039;&#039;Whitelist&#039;&#039;&#039;: Currently open&lt;br /&gt;
* &#039;&#039;&#039;Max Players&#039;&#039;&#039;: 10&lt;br /&gt;
&lt;br /&gt;
=Client=&lt;br /&gt;
* Grab the [http://www.technicpack.net/tekkit/ Technic Launcher]&lt;br /&gt;
** All the mods are included in the Launcher&lt;br /&gt;
** Be aware of the Java issue ([http://www.technicpack.net/article/view/concurrentmodificationexception-in-java-18020.89 notes here]) and get Java 1.7.0_67 or Java 1.8.0_11.  &lt;br /&gt;
*** If you are running a 64bit OS, get the 64bit version&lt;br /&gt;
*** Uninstall all other versions of Java before installing these&lt;br /&gt;
* Launch the launcher&lt;br /&gt;
** Sign in on your first time in to attach your Minecraft account to the Launcher&lt;br /&gt;
* Scroll down until you see Tekkit (not Hexxit, not Tekkit Classic, etc)&lt;br /&gt;
* Click Play&lt;br /&gt;
==Connecting==&lt;br /&gt;
* Get the server IP and port, add the server to the Server List and connect&lt;br /&gt;
=ModPack Details=&lt;br /&gt;
* Any questions about the Modpack or how to use the modpack (recipes, etc) can start [http://www.technicpack.net/tekkit/#mod-list here]&lt;br /&gt;
&lt;br /&gt;
=Starting Place=&lt;br /&gt;
&lt;br /&gt;
New players can utilize the starting home for temporary respite while getting situated in the new world.&lt;br /&gt;
&lt;br /&gt;
[[Image:MinecraftHomeSanctuary.png]]&lt;br /&gt;
&lt;br /&gt;
=Coordinates=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-128 73 135&lt;br /&gt;
-263 68 -71&lt;br /&gt;
1597 94 4106&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Minecraft]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Minecraft&amp;diff=2016</id>
		<title>Minecraft</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Minecraft&amp;diff=2016"/>
		<updated>2026-08-18T09:12:10Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Server Rules=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;I reserve the right to ban\remove anyone&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Respect the other players and their structures\work&lt;br /&gt;
* No griefing&lt;br /&gt;
* PG language&lt;br /&gt;
&lt;br /&gt;
=Server=&lt;br /&gt;
* &#039;&#039;&#039;Modpack&#039;&#039;&#039;: Tekkit (see details below)&lt;br /&gt;
* &#039;&#039;&#039;Address&#039;&#039;&#039;: Invite only&lt;br /&gt;
* &#039;&#039;&#039;Whitelist&#039;&#039;&#039;: Currently open&lt;br /&gt;
* &#039;&#039;&#039;Max Players&#039;&#039;&#039;: 10&lt;br /&gt;
&lt;br /&gt;
=Client=&lt;br /&gt;
* Grab the [http://www.technicpack.net/tekkit/ Technic Launcher]&lt;br /&gt;
** All the mods are included in the Launcher&lt;br /&gt;
** Be aware of the Java issue ([http://www.technicpack.net/article/view/concurrentmodificationexception-in-java-18020.89 notes here]) and get Java 1.7.0_67 or Java 1.8.0_11.  &lt;br /&gt;
*** If you are running a 64bit OS, get the 64bit version&lt;br /&gt;
*** Uninstall all other versions of Java before installing these&lt;br /&gt;
* Launch the launcher&lt;br /&gt;
** Sign in on your first time in to attach your Minecraft account to the Launcher&lt;br /&gt;
* Scroll down until you see Tekkit (not Hexxit, not Tekkit Classic, etc)&lt;br /&gt;
* Click Play&lt;br /&gt;
==Connecting==&lt;br /&gt;
* Get the server IP and port, add the server to the Server List and connect&lt;br /&gt;
=ModPack Details=&lt;br /&gt;
* Any questions about the Modpack or how to use the modpack (recipes, etc) can start [http://www.technicpack.net/tekkit/#mod-list here]&lt;br /&gt;
&lt;br /&gt;
=Starting Place=&lt;br /&gt;
&lt;br /&gt;
New players can utilize the starting home for temporary respite while getting situated in the new world.&lt;br /&gt;
&lt;br /&gt;
[[Image:MinecraftHomeSanctuary.png]]&lt;br /&gt;
&lt;br /&gt;
=Coordinates=&lt;br /&gt;
-128 73 135&lt;br /&gt;
-263 68 -71&lt;br /&gt;
1597 94 4106&lt;br /&gt;
&lt;br /&gt;
[[Category:Minecraft]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=File:Hdrtest-river-original.jpg&amp;diff=2015</id>
		<title>File:Hdrtest-river-original.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=File:Hdrtest-river-original.jpg&amp;diff=2015"/>
		<updated>2026-08-16T23:52:54Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: Rabbi Bob uploaded a new version of File:Hdrtest-river-original.jpg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=File:Gillette2006PatsDolphins2000.jpg&amp;diff=2014</id>
		<title>File:Gillette2006PatsDolphins2000.jpg</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=File:Gillette2006PatsDolphins2000.jpg&amp;diff=2014"/>
		<updated>2026-08-16T23:49:53Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: Rabbi Bob uploaded a new version of File:Gillette2006PatsDolphins2000.jpg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Backing_Up_Mediawiki&amp;diff=2013</id>
		<title>Backing Up Mediawiki</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Backing_Up_Mediawiki&amp;diff=2013"/>
		<updated>2026-08-15T19:43:48Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I typically run backups in a Weekly \ Monthly \ Annual mode (ongoing) approach so that at the start of the new year, I&#039;ve got 65 backups of the web directories and the databases shuttled off to another server.  The weekly\monthly overwrite as the year progresses, but the annual is there for all time.&lt;br /&gt;
&lt;br /&gt;
Below is the basis for my Weekly script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# ==============================================================================&lt;br /&gt;
# Weekly LAMP Backup Script&lt;br /&gt;
# ==============================================================================&lt;br /&gt;
&lt;br /&gt;
# #### Configuration Variables ####&lt;br /&gt;
SERVER_NAME=&amp;quot;MyServer2026&amp;quot;&lt;br /&gt;
PERIOD_TYPE=&amp;quot;Weekly&amp;quot;&lt;br /&gt;
# %V gives the ISO week number (01-53), resetting each year&lt;br /&gt;
PERIOD_COUNTER=$(date +%V)&lt;br /&gt;
BUNDLE_NAME=&amp;quot;${SERVER_NAME}_${PERIOD_TYPE}-${PERIOD_COUNTER}.tar.gz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
STAGING_DIR=&amp;quot;/home/somedirectory/backups&amp;quot;&lt;br /&gt;
LOG_FILE=&amp;quot;/home/somedirectory/scripts/BackupSync-$(date +%Y).log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# User Provided Lists&lt;br /&gt;
WEB_ROOT=&amp;quot;/var/www/html&amp;quot;&lt;br /&gt;
WEB_DIRS_FILE=&amp;quot;/home/somedirectory/scripts/web_dirs.txt&amp;quot;&lt;br /&gt;
DATABASES_FILE=&amp;quot;/home/somedirectory/scripts/databases.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mapfile -t WEB_DIRS &amp;lt; &amp;lt;(grep -vE &#039;^\s*#|^\s*$&#039; &amp;quot;$WEB_DIRS_FILE&amp;quot;)&lt;br /&gt;
mapfile -t DATABASES &amp;lt; &amp;lt;(grep -vE &#039;^\s*#|^\s*$&#039; &amp;quot;$DATABASES_FILE&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Database Credentials&lt;br /&gt;
MYSQL_USER=&amp;quot;dbBackup&amp;quot;&lt;br /&gt;
MYSQL_PASS_FILE=&amp;quot;/home/somedirectory/.backupCredsMySQL&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# QNAP NAS Configuration&lt;br /&gt;
QNAP_IP=&amp;quot;192.168.123.123&amp;quot;&lt;br /&gt;
QNAP_USER=&amp;quot;BackupUser&amp;quot;&lt;br /&gt;
QNAP_PASS_FILE=&amp;quot;/home/somedirectory/.qnapUpload&amp;quot;&lt;br /&gt;
QNAP_DEST_DIR=&amp;quot;/share/Public/WebserverBackups/MyServer2026/Weekly&amp;quot;     # Adjust to your actual QNAP share path&lt;br /&gt;
&lt;br /&gt;
# #### Functions ####&lt;br /&gt;
log_event() {&lt;br /&gt;
    # Standard log format: YYYY-MM-DD HH:MM:SS - Message&lt;br /&gt;
    echo &amp;quot;$(date &#039;+%Y-%m-%d %H:%M:%S&#039;) - $1&amp;quot; | tee -a &amp;quot;$LOG_FILE&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# #### Pre-flight Checks ####&lt;br /&gt;
# 1. Staging Directory Check&lt;br /&gt;
if [ ! -d &amp;quot;$STAGING_DIR&amp;quot; ]; then&lt;br /&gt;
    mkdir -p &amp;quot;$STAGING_DIR&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [ ! -w &amp;quot;$STAGING_DIR&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;$(date &#039;+%Y-%m-%d %H:%M:%S&#039;) - CRITICAL: Staging directory $STAGING_DIR is unavailable or not writable! Exiting.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# 2. QNAP Password File Check&lt;br /&gt;
if [ ! -f &amp;quot;$QNAP_PASS_FILE&amp;quot; ]; then&lt;br /&gt;
    log_event &amp;quot;CRITICAL: sshpass file $QNAP_PASS_FILE not found! Exiting.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# 3. MySQL Password File Check&lt;br /&gt;
if [ ! -f &amp;quot;$MYSQL_PASS_FILE&amp;quot; ]; then&lt;br /&gt;
    log_event &amp;quot;CRITICAL: MySQL password file $MYSQL_PASS_FILE not found! Exiting.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
# 4. List Files Check&lt;br /&gt;
if [ ! -f &amp;quot;$WEB_DIRS_FILE&amp;quot; ]; then&lt;br /&gt;
    log_event &amp;quot;CRITICAL: Web directory list file $WEB_DIRS_FILE not found! Exiting.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [ ! -f &amp;quot;$DATABASES_FILE&amp;quot; ]; then&lt;br /&gt;
    log_event &amp;quot;CRITICAL: Database list file $DATABASES_FILE not found! Exiting.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
log_event &amp;quot;=== Starting $PERIOD_TYPE Backup sequence ===&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# #### 1. MySQL Database Exports ####&lt;br /&gt;
log_event &amp;quot;Starting MySQL exports...&amp;quot;&lt;br /&gt;
for db in &amp;quot;${DATABASES[@]}&amp;quot;; do&lt;br /&gt;
    log_event &amp;quot;Exporting database: $db&amp;quot;&lt;br /&gt;
    if mysqldump -u &amp;quot;$MYSQL_USER&amp;quot; -p&amp;quot;$(cat &amp;quot;$MYSQL_PASS_FILE&amp;quot;)&amp;quot; &amp;quot;$db&amp;quot; &amp;gt; &amp;quot;$STAGING_DIR/${db}.sql&amp;quot;; then&lt;br /&gt;
        log_event &amp;quot;Successfully exported $db&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        log_event &amp;quot;ERROR: Failed to export $db&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
# #### 2. Web Directories Archiving ####&lt;br /&gt;
log_event &amp;quot;Starting Web Directory compression...&amp;quot;&lt;br /&gt;
for dir in &amp;quot;${WEB_DIRS[@]}&amp;quot;; do&lt;br /&gt;
    if [ -d &amp;quot;$WEB_ROOT/$dir&amp;quot; ]; then&lt;br /&gt;
        log_event &amp;quot;Compressing directory: $dir&amp;quot;&lt;br /&gt;
        # Added _web suffix to distinguish intermediate archives from the master bundle&lt;br /&gt;
        if tar -czf &amp;quot;$STAGING_DIR/${dir}_web.tar.gz&amp;quot; -C &amp;quot;$WEB_ROOT&amp;quot; &amp;quot;$dir&amp;quot;; then&lt;br /&gt;
            log_event &amp;quot;Successfully compressed $dir&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            log_event &amp;quot;ERROR: Failed to compress $dir.&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
    else&lt;br /&gt;
        log_event &amp;quot;WARNING: Directory $WEB_ROOT/$dir does not exist. Skipping.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
# #### 3. Final Bundling ####&lt;br /&gt;
log_event &amp;quot;Bundling files into $BUNDLE_NAME...&amp;quot;&lt;br /&gt;
cd &amp;quot;$STAGING_DIR&amp;quot; || exit 1&lt;br /&gt;
&lt;br /&gt;
# Exclude the destination bundle and specifically target intermediate files&lt;br /&gt;
if tar --exclude=&amp;quot;$BUNDLE_NAME&amp;quot; -czf &amp;quot;$BUNDLE_NAME&amp;quot; *.sql *_web.tar.gz; then&lt;br /&gt;
    log_event &amp;quot;Successfully created master bundle: $BUNDLE_NAME.&amp;quot;&lt;br /&gt;
    # Clean up intermediate files&lt;br /&gt;
    rm -f *.sql *_web.tar.gz&lt;br /&gt;
else&lt;br /&gt;
    log_event &amp;quot;CRITICAL: Failed to create master bundle! Exiting.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# #### 4. Rsync to QNAP ####&lt;br /&gt;
log_event &amp;quot;Initiating rsync transfer to QNAP NAS ($QNAP_IP)...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if sshpass -f &amp;quot;$QNAP_PASS_FILE&amp;quot; rsync -avz -e &amp;quot;ssh -o StrictHostKeyChecking=no&amp;quot; &amp;quot;$STAGING_DIR/$BUNDLE_NAME&amp;quot; &amp;quot;${QNAP_USER}@${QNAP_IP}:${QNAP_DEST_DIR}/&amp;quot;; then&lt;br /&gt;
    log_event &amp;quot;SUCCESS: Transfer of $BUNDLE_NAME to QNAP completed.&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    # #### 5. Cleanup ####&lt;br /&gt;
    log_event &amp;quot;Performing local cleanup...&amp;quot;&lt;br /&gt;
    rm -f &amp;quot;$STAGING_DIR/$BUNDLE_NAME&amp;quot;&lt;br /&gt;
    log_event &amp;quot;Removed local copy of $BUNDLE_NAME to conserve disk space.&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    log_event &amp;quot;ERROR: Rsync transfer failed! Leaving $BUNDLE_NAME in staging area for manual review.&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
log_event &amp;quot;=== $PERIOD_TYPE Backup sequence finished ===&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Weblog-2026-08]]&lt;br /&gt;
[[Category:Backups]]&lt;br /&gt;
[[Category:Webserver]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Backing_Up_Mediawiki&amp;diff=2012</id>
		<title>Backing Up Mediawiki</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Backing_Up_Mediawiki&amp;diff=2012"/>
		<updated>2026-08-15T19:09:17Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I typically run backups in a Weekly \ Monthly \ Annual mode (ongoing) approach so that at the start of the new year, I&#039;ve got 65 backups of the web directories and the databases shuttled off to another server.  The weekly\monthly overwrite as the year progresses, but the annual is there for all time.&lt;br /&gt;
&lt;br /&gt;
Below is the basis for my Weekly script.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# ==============================================================================&lt;br /&gt;
# Weekly LAMP Backup Script&lt;br /&gt;
# ==============================================================================&lt;br /&gt;
&lt;br /&gt;
# #### Configuration Variables ####&lt;br /&gt;
SERVER_NAME=&amp;quot;MyServer2026&amp;quot;&lt;br /&gt;
PERIOD_TYPE=&amp;quot;Weekly&amp;quot;&lt;br /&gt;
# %V gives the ISO week number (01-53), resetting each year&lt;br /&gt;
PERIOD_COUNTER=$(date +%V)&lt;br /&gt;
BUNDLE_NAME=&amp;quot;${SERVER_NAME}_${PERIOD_TYPE}-${PERIOD_COUNTER}.tar.gz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
STAGING_DIR=&amp;quot;/home/somedirectory/backups&amp;quot;&lt;br /&gt;
LOG_FILE=&amp;quot;/home/somedirectory/scripts/BackupSync-$(date +%Y).log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# User Provided Lists&lt;br /&gt;
WEB_ROOT=&amp;quot;/var/www/html&amp;quot;&lt;br /&gt;
WEB_DIRS_FILE=&amp;quot;/home/somedirectory/scripts/web_dirs.txt&amp;quot;&lt;br /&gt;
DATABASES_FILE=&amp;quot;/home/somedirectory/scripts/databases.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mapfile -t WEB_DIRS &amp;lt; &amp;lt;(grep -vE &#039;^\s*#|^\s*$&#039; &amp;quot;$WEB_DIRS_FILE&amp;quot;)&lt;br /&gt;
mapfile -t DATABASES &amp;lt; &amp;lt;(grep -vE &#039;^\s*#|^\s*$&#039; &amp;quot;$DATABASES_FILE&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Database Credentials&lt;br /&gt;
MYSQL_USER=&amp;quot;dbBackup&amp;quot;&lt;br /&gt;
MYSQL_PASS_FILE=&amp;quot;/home/somedirectory/.backupCredsMySQL&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# QNAP NAS Configuration&lt;br /&gt;
QNAP_IP=&amp;quot;192.168.123.123&amp;quot;&lt;br /&gt;
QNAP_USER=&amp;quot;BackupUser&amp;quot;&lt;br /&gt;
QNAP_PASS_FILE=&amp;quot;/home/somedirectory/.qnapUpload&amp;quot;&lt;br /&gt;
QNAP_DEST_DIR=&amp;quot;/share/Public/WebserverBackups/MyServer2026/Weekly&amp;quot;     # Adjust to your actual QNAP share path&lt;br /&gt;
&lt;br /&gt;
# #### Functions ####&lt;br /&gt;
log_event() {&lt;br /&gt;
    # Standard log format: YYYY-MM-DD HH:MM:SS - Message&lt;br /&gt;
    echo &amp;quot;$(date &#039;+%Y-%m-%d %H:%M:%S&#039;) - $1&amp;quot; | tee -a &amp;quot;$LOG_FILE&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# #### Pre-flight Checks ####&lt;br /&gt;
# 1. Staging Directory Check&lt;br /&gt;
if [ ! -d &amp;quot;$STAGING_DIR&amp;quot; ]; then&lt;br /&gt;
    mkdir -p &amp;quot;$STAGING_DIR&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [ ! -w &amp;quot;$STAGING_DIR&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;$(date &#039;+%Y-%m-%d %H:%M:%S&#039;) - CRITICAL: Staging directory $STAGING_DIR is unavailable or not writable! Exiting.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# 2. QNAP Password File Check&lt;br /&gt;
if [ ! -f &amp;quot;$QNAP_PASS_FILE&amp;quot; ]; then&lt;br /&gt;
    log_event &amp;quot;CRITICAL: sshpass file $QNAP_PASS_FILE not found! Exiting.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# 3. MySQL Password File Check&lt;br /&gt;
if [ ! -f &amp;quot;$MYSQL_PASS_FILE&amp;quot; ]; then&lt;br /&gt;
    log_event &amp;quot;CRITICAL: MySQL password file $MYSQL_PASS_FILE not found! Exiting.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
# 4. List Files Check&lt;br /&gt;
if [ ! -f &amp;quot;$WEB_DIRS_FILE&amp;quot; ]; then&lt;br /&gt;
    log_event &amp;quot;CRITICAL: Web directory list file $WEB_DIRS_FILE not found! Exiting.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [ ! -f &amp;quot;$DATABASES_FILE&amp;quot; ]; then&lt;br /&gt;
    log_event &amp;quot;CRITICAL: Database list file $DATABASES_FILE not found! Exiting.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
log_event &amp;quot;=== Starting $PERIOD_TYPE Backup sequence ===&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# #### 1. MySQL Database Exports ####&lt;br /&gt;
log_event &amp;quot;Starting MySQL exports...&amp;quot;&lt;br /&gt;
for db in &amp;quot;${DATABASES[@]}&amp;quot;; do&lt;br /&gt;
    log_event &amp;quot;Exporting database: $db&amp;quot;&lt;br /&gt;
    if mysqldump -u &amp;quot;$MYSQL_USER&amp;quot; -p&amp;quot;$(cat &amp;quot;$MYSQL_PASS_FILE&amp;quot;)&amp;quot; &amp;quot;$db&amp;quot; &amp;gt; &amp;quot;$STAGING_DIR/${db}.sql&amp;quot;; then&lt;br /&gt;
        log_event &amp;quot;Successfully exported $db&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        log_event &amp;quot;ERROR: Failed to export $db&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
# #### 2. Web Directories Archiving ####&lt;br /&gt;
log_event &amp;quot;Starting Web Directory compression...&amp;quot;&lt;br /&gt;
for dir in &amp;quot;${WEB_DIRS[@]}&amp;quot;; do&lt;br /&gt;
    if [ -d &amp;quot;$WEB_ROOT/$dir&amp;quot; ]; then&lt;br /&gt;
        log_event &amp;quot;Compressing directory: $dir&amp;quot;&lt;br /&gt;
        # Added _web suffix to distinguish intermediate archives from the master bundle&lt;br /&gt;
        if tar -czf &amp;quot;$STAGING_DIR/${dir}_web.tar.gz&amp;quot; -C &amp;quot;$WEB_ROOT&amp;quot; &amp;quot;$dir&amp;quot;; then&lt;br /&gt;
            log_event &amp;quot;Successfully compressed $dir&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            log_event &amp;quot;ERROR: Failed to compress $dir.&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
    else&lt;br /&gt;
        log_event &amp;quot;WARNING: Directory $WEB_ROOT/$dir does not exist. Skipping.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
# #### 3. Final Bundling ####&lt;br /&gt;
log_event &amp;quot;Bundling files into $BUNDLE_NAME...&amp;quot;&lt;br /&gt;
cd &amp;quot;$STAGING_DIR&amp;quot; || exit 1&lt;br /&gt;
&lt;br /&gt;
# Exclude the destination bundle and specifically target intermediate files&lt;br /&gt;
if tar --exclude=&amp;quot;$BUNDLE_NAME&amp;quot; -czf &amp;quot;$BUNDLE_NAME&amp;quot; *.sql *_web.tar.gz; then&lt;br /&gt;
    log_event &amp;quot;Successfully created master bundle: $BUNDLE_NAME.&amp;quot;&lt;br /&gt;
    # Clean up intermediate files&lt;br /&gt;
    rm -f *.sql *_web.tar.gz&lt;br /&gt;
else&lt;br /&gt;
    log_event &amp;quot;CRITICAL: Failed to create master bundle! Exiting.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# #### 4. Rsync to QNAP ####&lt;br /&gt;
log_event &amp;quot;Initiating rsync transfer to QNAP NAS ($QNAP_IP)...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if sshpass -f &amp;quot;$QNAP_PASS_FILE&amp;quot; rsync -avz -e &amp;quot;ssh -o StrictHostKeyChecking=no&amp;quot; &amp;quot;$STAGING_DIR/$BUNDLE_NAME&amp;quot; &amp;quot;${QNAP_USER}@${QNAP_IP}:${QNAP_DEST_DIR}/&amp;quot;; then&lt;br /&gt;
    log_event &amp;quot;SUCCESS: Transfer of $BUNDLE_NAME to QNAP completed.&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    # #### 5. Cleanup ####&lt;br /&gt;
    log_event &amp;quot;Performing local cleanup...&amp;quot;&lt;br /&gt;
    rm -f &amp;quot;$STAGING_DIR/$BUNDLE_NAME&amp;quot;&lt;br /&gt;
    log_event &amp;quot;Removed local copy of $BUNDLE_NAME to conserve disk space.&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    log_event &amp;quot;ERROR: Rsync transfer failed! Leaving $BUNDLE_NAME in staging area for manual review.&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
log_event &amp;quot;=== $PERIOD_TYPE Backup sequence finished ===&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Weblog-2026-08]]&lt;br /&gt;
[[Category:Backups]]&lt;br /&gt;
[[Category:Webserver]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Powershell:_Ping_Stuff&amp;diff=2011</id>
		<title>Powershell: Ping Stuff</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Powershell:_Ping_Stuff&amp;diff=2011"/>
		<updated>2026-08-15T19:04:45Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Powershell]]&lt;br /&gt;
[[Category:Weblog-2026-08]]&lt;br /&gt;
&lt;br /&gt;
Provide a list of IP addresses, run the script.  Checks DNS and outputs a results file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Code=&lt;br /&gt;
&amp;lt;SyntaxHighlight language=&amp;quot;powershell&amp;quot; line&amp;gt;&lt;br /&gt;
$deviceNames = Get-Content &amp;quot;devices.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
$results = @()&lt;br /&gt;
&lt;br /&gt;
foreach ($name in $deviceNames) {&lt;br /&gt;
  $status = &amp;quot;Unknown&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  try {&lt;br /&gt;
    # Attempt to resolve DNS&lt;br /&gt;
    [System.Net.Dns]::GetHostEntry($name)&lt;br /&gt;
    $status = &amp;quot;Resolving...&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    # Check if device pings (up to 4 attempts with 1 second timeout)&lt;br /&gt;
    if (Test-Connection -ComputerName $name -Count 1 -Quiet) {&lt;br /&gt;
      $status = &amp;quot;Up&amp;quot;&lt;br /&gt;
    } else {&lt;br /&gt;
      $status = &amp;quot;Down&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  } catch {&lt;br /&gt;
    # Handle DNS resolution failure&lt;br /&gt;
    $status = &amp;quot;NO DNS&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  # Create a custom object for each device&lt;br /&gt;
  $result = New-Object PSObject -Property @{&lt;br /&gt;
    Name = $name&lt;br /&gt;
    Status = $status&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # Add object to results array&lt;br /&gt;
  $results += $result&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Export results to CSV&lt;br /&gt;
$results | Export-Csv -Path &amp;quot;results.csv&amp;quot; -NoTypeInformation -Force&lt;br /&gt;
&lt;br /&gt;
Write-Host &amp;quot;Results exported to &#039;results.csv&#039;&amp;quot;&lt;br /&gt;
&amp;lt;/SyntaxHighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Powershell:_Ping_Range&amp;diff=2010</id>
		<title>Powershell: Ping Range</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Powershell:_Ping_Range&amp;diff=2010"/>
		<updated>2026-08-15T19:03:00Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Powershell]]&lt;br /&gt;
[[Category:Weblog-2026-08]]&lt;br /&gt;
&lt;br /&gt;
Not an original script.&lt;br /&gt;
=Usage=&lt;br /&gt;
&amp;lt;pre&amp;gt; .\Test-IPRange-Threaded.ps1 -startIP &amp;quot;192.168.1.1&amp;quot; -endIP &amp;quot;192.168.1.50&amp;quot; &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Script=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;SyntaxHighlight language=&amp;quot;powershell&amp;quot; line&amp;gt;&lt;br /&gt;
# 10.101.50.70	255.255.0.0&lt;br /&gt;
&amp;lt;#&lt;br /&gt;
.SYNOPSIS&lt;br /&gt;
    Pings a range of IP addresses concurrently to check their online status.&lt;br /&gt;
&lt;br /&gt;
.DESCRIPTION&lt;br /&gt;
    This script takes a start IP address and an end IP address. It iterates through&lt;br /&gt;
    each IP address in the specified range (primarily designed for ranges within&lt;br /&gt;
    the same /24 subnet) and sends two ping requests to each IP concurrently&lt;br /&gt;
    using PowerShell runspaces for improved efficiency.&lt;br /&gt;
&lt;br /&gt;
    - If an address responds to one or more pings, it&#039;s marked as &amp;quot;Online&amp;quot;.&lt;br /&gt;
    - If an address does not respond to either ping, it&#039;s marked as &amp;quot;Offline&amp;quot;.&lt;br /&gt;
    - Errors during a specific IP ping are marked as &amp;quot;Error&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
.PARAMETER startIP&lt;br /&gt;
    The starting IP address of the range (e.g., &amp;quot;192.168.1.1&amp;quot;). This is a mandatory parameter.&lt;br /&gt;
&lt;br /&gt;
.PARAMETER endIP&lt;br /&gt;
    The ending IP address of the range (e.g., &amp;quot;192.168.1.254&amp;quot;). This is a mandatory parameter.&lt;br /&gt;
&lt;br /&gt;
.PARAMETER ThrottleLimit&lt;br /&gt;
    The maximum number of concurrent ping operations. Default is 30.&lt;br /&gt;
    Adjust this based on your system&#039;s resources and network considerations.&lt;br /&gt;
&lt;br /&gt;
.EXAMPLE&lt;br /&gt;
    .\Test-IPRange-Threaded.ps1 -startIP &amp;quot;192.168.1.1&amp;quot; -endIP &amp;quot;192.168.1.50&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    This command will ping IP addresses from 192.168.1.1 to 192.168.1.50 concurrently&lt;br /&gt;
    (using the default throttle limit), sending two pings to each and reporting their status.&lt;br /&gt;
&lt;br /&gt;
.EXAMPLE&lt;br /&gt;
    .\Test-IPRange-Threaded.ps1 -startIP &amp;quot;10.0.0.1&amp;quot; -endIP &amp;quot;10.0.0.254&amp;quot; -ThrottleLimit 50&lt;br /&gt;
&lt;br /&gt;
    This command will ping IPs in the 10.0.0.x range with up to 50 concurrent operations.&lt;br /&gt;
&lt;br /&gt;
.NOTES&lt;br /&gt;
    - This script uses PowerShell Runspace Pools for threading, compatible with PowerShell 5.1+.&lt;br /&gt;
    - For PowerShell 7.0 and newer, ForEach-Object -Parallel offers a simpler syntax for parallel execution.&lt;br /&gt;
    - The script assumes the IP range is primarily within the same /24 subnet. It uses the first&lt;br /&gt;
      three octets of &#039;startIP&#039; as the base network prefix.&lt;br /&gt;
    - If &#039;startIP&#039; and &#039;endIP&#039; have different network prefixes, a warning is displayed, and the scan&lt;br /&gt;
      proceeds using &#039;startIP&#039;s&#039; network prefix.&lt;br /&gt;
    - To run this script:&lt;br /&gt;
        1. Save it as a .ps1 file (e.g., Test-IPRange-Threaded.ps1).&lt;br /&gt;
        2. Open PowerShell.&lt;br /&gt;
        3. Navigate to the directory where you saved the file.&lt;br /&gt;
        4. If needed, adjust your execution policy: Set-ExecutionPolicy RemoteSigned -Scope CurrentUser&lt;br /&gt;
        5. Run: .\Test-IPRange-Threaded.ps1 -startIP &amp;quot;YOUR_START_IP&amp;quot; -endIP &amp;quot;YOUR_END_IP&amp;quot; [-ThrottleLimit DESIRED_NUMBER]&lt;br /&gt;
#&amp;gt;&lt;br /&gt;
param (&lt;br /&gt;
    [Parameter(Mandatory=$true, HelpMessage=&amp;quot;Enter the starting IP address (e.g., 192.168.1.1)&amp;quot;)]&lt;br /&gt;
    [string]$startIP,&lt;br /&gt;
&lt;br /&gt;
    [Parameter(Mandatory=$true, HelpMessage=&amp;quot;Enter the ending IP address (e.g., 192.168.1.254)&amp;quot;)]&lt;br /&gt;
    [string]$endIP,&lt;br /&gt;
&lt;br /&gt;
    [Parameter(HelpMessage=&amp;quot;Maximum number of concurrent ping operations. Default is 30.&amp;quot;)]&lt;br /&gt;
    [ValidateRange(1,200)] # Practical limit for throttle&lt;br /&gt;
    [int]$ThrottleLimit = 30&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
# --- Script Body ---&lt;br /&gt;
&lt;br /&gt;
Write-Host &amp;quot;🚀 Initializing threaded ping scan...&amp;quot; -ForegroundColor Yellow&lt;br /&gt;
&lt;br /&gt;
# Basic IP address format validation (IPv4)&lt;br /&gt;
$ipPattern = &#039;^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$&#039;&lt;br /&gt;
if (-not ($startIP -match $ipPattern)) {&lt;br /&gt;
    Write-Error &amp;quot;Invalid format for Start IP: &#039;$startIP&#039;. Please use a valid IPv4 format (e.g., 192.168.1.1).&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
}&lt;br /&gt;
if (-not ($endIP -match $ipPattern)) {&lt;br /&gt;
    Write-Error &amp;quot;Invalid format for End IP: &#039;$endIP&#039;. Please use a valid IPv4 format (e.g., 192.168.1.254).&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Parse IP addresses&lt;br /&gt;
try {&lt;br /&gt;
    $startAddressBytes = [System.Net.IPAddress]::Parse($startIP).GetAddressBytes()&lt;br /&gt;
    $endAddressBytes = [System.Net.IPAddress]::Parse($endIP).GetAddressBytes()&lt;br /&gt;
} catch {&lt;br /&gt;
    Write-Error &amp;quot;Failed to parse one or both IP addresses. Ensure they are valid IPv4 addresses.&amp;quot;&lt;br /&gt;
    Write-Error &amp;quot;Error details: $($_.Exception.Message)&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$networkPrefix = &amp;quot;$($startAddressBytes[0]).$($startAddressBytes[1]).$($startAddressBytes[2])&amp;quot;&lt;br /&gt;
$startHostOctet = [int]$startAddressBytes[3]&lt;br /&gt;
$endHostOctetLoopEnd = [int]$endAddressBytes[3]&lt;br /&gt;
&lt;br /&gt;
if (($startAddressBytes[0] -ne $endAddressBytes[0]) -or `&lt;br /&gt;
    ($startAddressBytes[1] -ne $endAddressBytes[1]) -or `&lt;br /&gt;
    ($startAddressBytes[2] -ne $endAddressBytes[2])) {&lt;br /&gt;
    Write-Warning &amp;quot;The Start IP ($startIP) and End IP ($endIP) do not share the same first three octets.&amp;quot;&lt;br /&gt;
    Write-Warning &amp;quot;This script will use the network prefix of the Start IP (&#039;$networkPrefix.x&#039;) and iterate the last octet from $startHostOctet to $endHostOctetLoopEnd.&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ($startHostOctet -gt $endHostOctetLoopEnd) {&lt;br /&gt;
    Write-Error &amp;quot;The last octet of Start IP ($startHostOctet) is greater than the last octet of End IP ($endHostOctetLoopEnd) for the determined network prefix &#039;$networkPrefix.x&#039;. This forms an invalid range for this script&#039;s logic.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Generate list of IPs to test&lt;br /&gt;
$ipsToTest = [System.Collections.Generic.List[string]]::new()&lt;br /&gt;
for ($currentHostOctet = $startHostOctet; $currentHostOctet -le $endHostOctetLoopEnd; $currentHostOctet++) {&lt;br /&gt;
    $ipsToTest.Add(&amp;quot;$networkPrefix.$currentHostOctet&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ($ipsToTest.Count -eq 0) {&lt;br /&gt;
    Write-Warning &amp;quot;No IP addresses generated for the given range. Exiting.&amp;quot;&lt;br /&gt;
    exit 0&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$fullStartRangeIPToScan = $ipsToTest[0]&lt;br /&gt;
$fullEndRangeIPToScan = $ipsToTest[$ipsToTest.Count -1]&lt;br /&gt;
&lt;br /&gt;
Write-Host &amp;quot;Scanning IP addresses from $fullStartRangeIPToScan to $fullEndRangeIPToScan.&amp;quot;&lt;br /&gt;
Write-Host &amp;quot;Using up to $ThrottleLimit concurrent threads.&amp;quot;&lt;br /&gt;
Write-Host &amp;quot;Each IP will be pinged twice.&amp;quot;&lt;br /&gt;
Write-Host &amp;quot;--------------------------------------------------&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Define the script block to be executed in each thread&lt;br /&gt;
$scriptBlock = {&lt;br /&gt;
    param($targetIPToPing)&lt;br /&gt;
&lt;br /&gt;
    # Test-Connection sends ICMP echo requests.&lt;br /&gt;
    $pingReplies = Test-Connection -ComputerName $targetIPToPing -Count 2 -ErrorAction SilentlyContinue -WarningAction SilentlyContinue&lt;br /&gt;
    &lt;br /&gt;
    if ($pingReplies) {&lt;br /&gt;
        return [PSCustomObject]@{&lt;br /&gt;
            IPAddress = $targetIPToPing&lt;br /&gt;
            Status    = &amp;quot;Online&amp;quot;&lt;br /&gt;
            Timestamp = Get-Date&lt;br /&gt;
        }&lt;br /&gt;
    } else {&lt;br /&gt;
        return [PSCustomObject]@{&lt;br /&gt;
            IPAddress = $targetIPToPing&lt;br /&gt;
            Status    = &amp;quot;Offline&amp;quot;&lt;br /&gt;
            Timestamp = Get-Date&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Initialize Runspace Pool&lt;br /&gt;
$runspacePool = [runspacefactory]::CreateRunspacePool(1, $ThrottleLimit)&lt;br /&gt;
$runspacePool.Open()&lt;br /&gt;
&lt;br /&gt;
$activeJobs = [System.Collections.Generic.List[object]]::new()&lt;br /&gt;
$finalResults = [System.Collections.Generic.List[object]]::new()&lt;br /&gt;
&lt;br /&gt;
try {&lt;br /&gt;
    foreach ($ip in $ipsToTest) {&lt;br /&gt;
        $powershell = [powershell]::Create().AddScript($scriptBlock).AddArgument($ip)&lt;br /&gt;
        $powershell.RunspacePool = $runspacePool&lt;br /&gt;
        &lt;br /&gt;
        $activeJobs.Add([PSCustomObject]@{&lt;br /&gt;
            IP          = $ip&lt;br /&gt;
            Pipe        = $powershell&lt;br /&gt;
            AsyncHandle = $powershell.BeginInvoke()&lt;br /&gt;
        })&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    $totalIPs = $ipsToTest.Count&lt;br /&gt;
    $processedCount = 0&lt;br /&gt;
&lt;br /&gt;
    # Monitor and process completed jobs&lt;br /&gt;
    while ($activeJobs.Count -gt 0) {&lt;br /&gt;
        # Create a temporary list of jobs that have completed in this iteration&lt;br /&gt;
        $completedThisIteration = [System.Collections.Generic.List[object]]::new()&lt;br /&gt;
&lt;br /&gt;
        foreach ($jobHandle in $activeJobs) {&lt;br /&gt;
            if ($jobHandle.AsyncHandle.IsCompleted) {&lt;br /&gt;
                $completedThisIteration.Add($jobHandle)&lt;br /&gt;
                try {&lt;br /&gt;
                    $resultObject = $jobHandle.Pipe.EndInvoke($jobHandle.AsyncHandle)&lt;br /&gt;
                    if ($resultObject) {&lt;br /&gt;
                        $finalResults.Add($resultObject)&lt;br /&gt;
                    }&lt;br /&gt;
                } catch {&lt;br /&gt;
                    Write-Warning &amp;quot;Error processing IP $($jobHandle.IP): $($_.Exception.Message)&amp;quot;&lt;br /&gt;
                    $finalResults.Add([PSCustomObject]@{&lt;br /&gt;
                        IPAddress = $jobHandle.IP&lt;br /&gt;
                        Status    = &amp;quot;Error&amp;quot;&lt;br /&gt;
                        Message   = $_.Exception.Message&lt;br /&gt;
                        Timestamp = Get-Date&lt;br /&gt;
                    })&lt;br /&gt;
                } finally {&lt;br /&gt;
                    $jobHandle.Pipe.Dispose()&lt;br /&gt;
                    $processedCount++&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        # Remove all completed jobs from the active list&lt;br /&gt;
        if ($completedThisIteration.Count -gt 0) {&lt;br /&gt;
            $completedThisIteration | ForEach-Object { $activeJobs.Remove($_) }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if ($activeJobs.Count -gt 0) {&lt;br /&gt;
            Write-Progress -Activity &amp;quot;Pinging IPs&amp;quot; -Status &amp;quot;Processing... ($processedCount/$totalIPs completed)&amp;quot; -PercentComplete ([math]::Round(($processedCount / $totalIPs) * 100)) -CurrentOperation &amp;quot;$($activeJobs.Count) tasks remaining&amp;quot;&lt;br /&gt;
            Start-Sleep -Milliseconds 200 # Wait a bit before checking again&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    Write-Progress -Activity &amp;quot;Pinging IPs&amp;quot; -Completed&lt;br /&gt;
}&lt;br /&gt;
finally {&lt;br /&gt;
    # Close and dispose the runspace pool&lt;br /&gt;
    if ($runspacePool) {&lt;br /&gt;
        $runspacePool.Close()&lt;br /&gt;
        $runspacePool.Dispose()&lt;br /&gt;
    }&lt;br /&gt;
    Write-Host &amp;quot;Runspace pool closed.&amp;quot; -ForegroundColor DarkGray&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Sort and display all collected results&lt;br /&gt;
Write-Host &amp;quot;`n--- Scan Results (Sorted by IP) ---&amp;quot; -ForegroundColor Yellow&lt;br /&gt;
$sortedResults = $finalResults | Sort-Object { [System.Net.IPAddress]$_.IPAddress }&lt;br /&gt;
&lt;br /&gt;
foreach ($result in $sortedResults) {&lt;br /&gt;
    switch ($result.Status) {&lt;br /&gt;
        &amp;quot;Online&amp;quot;  { Write-Host &amp;quot;&amp;gt; $($result.IPAddress) - $($result.Status) ✅&amp;quot; -ForegroundColor Green }&lt;br /&gt;
        #&amp;quot;Offline&amp;quot; { Write-Host &amp;quot;&amp;gt; $($result.IPAddress) - $($result.Status) ❌&amp;quot; -ForegroundColor Red }&lt;br /&gt;
        #&amp;quot;Error&amp;quot;   { Write-Host &amp;quot;&amp;gt; $($result.IPAddress) - $($result.Status) ⚠️ (Message: $($result.Message))&amp;quot; -ForegroundColor Magenta }&lt;br /&gt;
        #default   { Write-Host &amp;quot;&amp;gt; $($result.IPAddress) - Status Unknown&amp;quot; }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Write-Host &amp;quot;--------------------------------------------------&amp;quot;&lt;br /&gt;
Write-Host &amp;quot;🎉 Threaded ping scan finished.&amp;quot; -ForegroundColor Yellow&lt;br /&gt;
&amp;lt;/SyntaxHighlight&amp;gt;&lt;br /&gt;
[[Category:Weblog-2026-07]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=WoW_Bots&amp;diff=2009</id>
		<title>WoW Bots</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=WoW_Bots&amp;diff=2009"/>
		<updated>2026-08-15T19:00:19Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Gaming]]&lt;br /&gt;
=Inviting=&lt;br /&gt;
# Bring up the Social box. Looks like a speech bubble in your hotbar&lt;br /&gt;
#* Hotkey: O&lt;br /&gt;
# Click the Who tab (Who opened for Iron Maiden tonight?  The Hu.  The who? No, not The Who, The Hu)&lt;br /&gt;
#* It might not populate immediately, so just click on Refresh and then it will pop.&lt;br /&gt;
# Review the list of available bots and find bots in your level range&lt;br /&gt;
# Click on one and click Invite button. &lt;br /&gt;
#* Rinse and repeat, you can have four companions in a  group.&lt;br /&gt;
&lt;br /&gt;
=Quick Commands=&lt;br /&gt;
Some quick commands for them:&lt;br /&gt;
* /p will turn on party chat which you need to be in for the commands to work. &lt;br /&gt;
** So you can do a &amp;quot;/p &amp;lt;command&amp;gt;&amp;quot; if you are not in party chat, or just the command if you are.&lt;br /&gt;
* summon - will bring your entire party to you. Even if they are dead, this will auto-rez them.&lt;br /&gt;
* stay - will make them stay in one spot and stop following&lt;br /&gt;
* follow - will make them follow you.&lt;br /&gt;
&lt;br /&gt;
=Playerbot Commands=&lt;br /&gt;
* https://github.com/mod-playerbots/mod-playerbots/wiki/Playerbot-Commands&lt;br /&gt;
[[Category:Weblog-2026-07]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=ProxMox&amp;diff=2008</id>
		<title>ProxMox</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=ProxMox&amp;diff=2008"/>
		<updated>2026-08-15T19:00:08Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
==Locked Snapshots==&lt;br /&gt;
* Sometimes a snapshot doesn&#039;t go as planned (especially when you stop it) and the VM gets locked.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qm listsnapshot 102&lt;br /&gt;
qm unlock 102&lt;br /&gt;
qm delsnapshot 102 SNAPSHOTNAME --force&lt;br /&gt;
## is it away:&lt;br /&gt;
 zfs list -t snapshot -o name -s creation | grep -E &#039;(^|/)vm-102-disk-0@|(^|/)vm-102-state-|102&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:ProxMox]]&lt;br /&gt;
[[Category:Weblog-2026-07]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Right_In_The_Pi-hole&amp;diff=2007</id>
		<title>Right In The Pi-hole</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Right_In_The_Pi-hole&amp;diff=2007"/>
		<updated>2026-08-15T18:59:43Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ran into issues with ubuntu-26.04-standard container in [[ProxMox]] in regards to dig: there was no output.  Tested 22.04 and it worked. Resorted 25.04.&lt;br /&gt;
&lt;br /&gt;
=Pi-hole=&lt;br /&gt;
&#039;&#039;&#039;REMEMBER TO SET YOUR DHCP UP!!!&#039;&#039;&#039; - Erin will find you&lt;br /&gt;
==Setup==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo rm -f /etc/resolv.conf&lt;br /&gt;
sudo bash -c &#039;cat &amp;lt;&amp;lt;EOF &amp;gt; /etc/resolv.conf&lt;br /&gt;
nameserver 1.1.1.1&lt;br /&gt;
nameserver 8.8.8.8&lt;br /&gt;
EOF&#039;&lt;br /&gt;
&lt;br /&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sudo apt install curl -y&lt;br /&gt;
&lt;br /&gt;
sudo systemctl stop systemd-resolved&lt;br /&gt;
sudo systemctl disable systemd-resolved&lt;br /&gt;
&lt;br /&gt;
curl -sSL https://install.pi-hole.net | sudo PIHOLE_SKIP_OS_CHECK=true bash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Selections==&lt;br /&gt;
Do the setup questions...&lt;br /&gt;
==Time==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl stop systemd-timesyncd&lt;br /&gt;
sudo systemctl disable systemd-timesyncd&lt;br /&gt;
sudo dpkg-reconfigure tzdata&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Password==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pihole setpassword&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==URL==&lt;br /&gt;
Go to http://IP:80/admin and login&lt;br /&gt;
&lt;br /&gt;
=Unbound=&lt;br /&gt;
jnTracks pointed me this way...&lt;br /&gt;
==Setup==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt update&lt;br /&gt;
sudo apt install unbound -y&lt;br /&gt;
sudo nano /etc/unbound/unbound.conf.d/pi-hole.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Pasta===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
server:&lt;br /&gt;
    verbosity: 0&lt;br /&gt;
    interface: 127.0.0.1&lt;br /&gt;
    port: 5335&lt;br /&gt;
    do-ip4: yes&lt;br /&gt;
    do-udp: yes&lt;br /&gt;
    do-tcp: yes&lt;br /&gt;
&lt;br /&gt;
    # May be set to yes if you have native IPv6 connectivity from your ISP&lt;br /&gt;
    do-ip6: no&lt;br /&gt;
&lt;br /&gt;
    # Use the root hints file downloaded earlier&lt;br /&gt;
    root-hints: &amp;quot;/var/lib/unbound/root.hints&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # Trust glue only if it is within the server&#039;s authority&lt;br /&gt;
    harden-glue: yes&lt;br /&gt;
&lt;br /&gt;
    # Require DNSSEC data for trust-anchored zones, if such data is absent, the zone becomes BOGUS&lt;br /&gt;
    harden-dnssec-stripped: yes&lt;br /&gt;
&lt;br /&gt;
    # Don&#039;t use Capitalization randomization (can cause issues with some upstream servers)&lt;br /&gt;
    use-caps-for-id: no&lt;br /&gt;
&lt;br /&gt;
    # Reduce EDNS reassembly fragmentation issues (recommended value per RFC)&lt;br /&gt;
    edns-buffer-size: 1232&lt;br /&gt;
&lt;br /&gt;
    # Perform prefetching of close-to-expired cache entries&lt;br /&gt;
    prefetch: yes&lt;br /&gt;
&lt;br /&gt;
    # Match this to your VM&#039;s CPU cores&lt;br /&gt;
    num-threads: 1&lt;br /&gt;
&lt;br /&gt;
    # Ensure kernel buffer is large enough to prevent losing messages during spikes&lt;br /&gt;
    so-rcvbuf: 4m&lt;br /&gt;
&lt;br /&gt;
    # Ensure privacy of local infrastructure IP ranges&lt;br /&gt;
    private-address: 192.168.0.0/16&lt;br /&gt;
    private-address: 169.254.0.0/16&lt;br /&gt;
    private-address: 172.16.0.0/12&lt;br /&gt;
    private-address: 10.0.0.0/8&lt;br /&gt;
    private-address: fd00::/8&lt;br /&gt;
    private-address: fe80::/10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Get Root Hints==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
curl -o /var/lib/unbound/root.hints https://www.internic.net/domain/named.root&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==PreFlight Check==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart unbound&lt;br /&gt;
sudo systemctl enable unbound&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Test both a pass and a servfail&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dig pi-hole.net @127.0.0.1 -p 5335&lt;br /&gt;
&lt;br /&gt;
dig sigfail.attrib.org @127.0.0.1 -p 5335&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=Point Pi-Hole to Unbound=&lt;br /&gt;
# Open your Pi-hole Admin Web Interface in a browser.&lt;br /&gt;
# Navigate to Settings &amp;gt; DNS.&lt;br /&gt;
# Uncheck any public Upstream DNS Servers you had enabled (e.g., Google, Cloudflare).&lt;br /&gt;
# Under the Custom DNS (IPv4) fields on the right, check the box and input:&lt;br /&gt;
#* 127.0.0.1#5335&lt;br /&gt;
# Click Save at the bottom of the page.&lt;br /&gt;
&lt;br /&gt;
=Nebula Sync=&lt;br /&gt;
==Set PiHole==&lt;br /&gt;
sudo pihole-FTL --config webserver.api.app_sudo true&lt;br /&gt;
==Install==&lt;br /&gt;
Don&#039;t do a round robin setup. It doesn&#039;t go well. Ask me how I know this...&amp;lt;br&amp;gt;&lt;br /&gt;
I also opted to do a non-full sync as I have split DHCP scopes running.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://github.com/lovelaze/nebula-sync/releases/latest/download/nebula-sync_0.11.2_linux_amd64.tar.gz&lt;br /&gt;
&lt;br /&gt;
tar -xzf nebula-sync_*_linux_amd64.tar.gz&lt;br /&gt;
sudo mv nebula-sync /usr/local/bin/&lt;br /&gt;
sudo chmod +x /usr/local/bin/nebula-sync&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/nebula-sync.env&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PRIMARY=http://192.168.1.9|PASSWORD&lt;br /&gt;
REPLICAS=http://192.168.1.10|PASSWORD&lt;br /&gt;
FULL_SYNC=false&lt;br /&gt;
SYNC_CONFIG_DHCP=false&lt;br /&gt;
SYNC_CONFIG_DNS=true&lt;br /&gt;
SYNC_CONFIG_NTP=true&lt;br /&gt;
SYNC_CONFIG_RESOLVER=true&lt;br /&gt;
SYNC_CONFIG_DATABASE=true&lt;br /&gt;
SYNC_CONFIG_MISC=true&lt;br /&gt;
SYNC_GRAVITY_AD_LIST=true&lt;br /&gt;
SYNC_GRAVITY_AD_LIST_BY_GROUP=true&lt;br /&gt;
SYNC_GRAVITY_DOMAIN_LIST=true&lt;br /&gt;
SYNC_GRAVITY_DOMAIN_LIST_BY_GROUP=true&lt;br /&gt;
SYNC_GRAVITY_CLIENT=true&lt;br /&gt;
SYNC_GRAVITY_CLIENT_BY_GROUP=true&lt;br /&gt;
SYNC_GRAVITY_GROUP=true&lt;br /&gt;
RUN_GRAVITY=true&lt;br /&gt;
CRON=0 * * * *&lt;br /&gt;
TZ=America/New_York&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo chmod 600 /etc/nebula-sync.env&lt;br /&gt;
&lt;br /&gt;
sudo nano /etc/systemd/system/nebula-sync.service&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Nebula Sync Service for Pi-hole v6&lt;br /&gt;
After=network-online.target&lt;br /&gt;
Wants=network-online.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
ExecStart=/usr/local/bin/nebula-sync run --env-file /etc/nebula-sync.env&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=10&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl daemon-reload&lt;br /&gt;
sudo systemctl enable --now nebula-sync&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo /usr/local/bin/nebula-sync run --env-file /etc/nebula-sync.env&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ctrl+X&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Pi-hole]]&lt;br /&gt;
[[Category:Weblog-2026-07]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Mediawiki_1.43_from_1.39&amp;diff=2006</id>
		<title>Mediawiki 1.43 from 1.39</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Mediawiki_1.43_from_1.39&amp;diff=2006"/>
		<updated>2026-08-15T18:59:23Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Background=&lt;br /&gt;
This was a WhatIf page to map out 1.39 to 1.43 with a thought of waiting until November for 1.47 LTS... but I went for it this past week.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=LTS=&lt;br /&gt;
Note: To upgrade MediaWiki, you can upgrade from the two most recent Long Term Support (LTS) versions directly.  If you are using an older version, you must first upgrade to one of the two latest LTS versions before proceeding to the latest version.&lt;br /&gt;
&lt;br /&gt;
=The Path=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Version !! MySQL !! PHP !! Jumps !! Status !! Notes &lt;br /&gt;
|-&lt;br /&gt;
| MediaWiki 1.39.5 LTS || MySQL 8.0.46 || PHP 8.1.2 || 0 || Current || &lt;br /&gt;
|-&lt;br /&gt;
| MediaWiki 1.43 LTS || MySQL 5.7.0+ (good) || PHP 8.1.0+ (good)  || 1 || Could do now ||  &lt;br /&gt;
|-&lt;br /&gt;
| MediaWiki 1.47 LTS || MySQL 5.7.0+ (good)  || PHP 8.3.0+ &#039;&#039;&#039;(need to update)&#039;&#039;&#039; || 2 ||  ||  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=The Process=&lt;br /&gt;
The last few times I&#039;ve done this I have been honing in on &#039;what is the basic approach to updating Mediawiki?&#039; and I think I&#039;m there now.&lt;br /&gt;
==Naming==&lt;br /&gt;
# Create the databases with the wiki version in the name. End it with _139 or something.&lt;br /&gt;
# Create the site directories in the same fashion.  Use symlinks for the actual &amp;quot;public&amp;quot; name.&lt;br /&gt;
## example: rabbibob\-&amp;gt;rabbibob_139\&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I started doing this so updates were more agile.  When I want to go to 143, I can create rabbibob_143\ and use that as a fresh area to configure, then shift the symlink when it is all done.  Copying the db from the _139 into a new _143 is the other key.  Editing LocalSettings.php allows for the ability to do this.  The limitation is if php or mysql requirements don&#039;t allow to the older or the new version to cohabitate.&lt;br /&gt;
&lt;br /&gt;
==Mediawiki==&lt;br /&gt;
# Know the requirements for where you are and where you need to get to in regards to MySQL and PHP requiremnts.&lt;br /&gt;
#* Sometimes a major revision upgrade of the OS carries these with them and it might be worth updating the OS or starting a fresh install&lt;br /&gt;
# BACK THINGS UP &lt;br /&gt;
# List your extensions (go to the Special:Version page, copy that page out to a Google Sheet so the links are intact)&lt;br /&gt;
# Create a new database_### and import the previous version db into that&lt;br /&gt;
# Create a new html dir mediawiki_### and import the target mediawiki into that&lt;br /&gt;
# Copy LocalSettings.php into the new dir from the old dir&lt;br /&gt;
# Edit LocalSettings.php&lt;br /&gt;
## Update the following with temporary values&lt;br /&gt;
##* $wgScriptPath&lt;br /&gt;
##* $wgServer&lt;br /&gt;
## Comment out all of the extensions&lt;br /&gt;
## Set the skin to one that comes stock&lt;br /&gt;
# run php maintenance\update.php from the command line&lt;br /&gt;
# Copy the images/ directory from the old install&lt;br /&gt;
# Update file permissions as needed during testing&lt;br /&gt;
# Work through the extensions&lt;br /&gt;
#* It is worth curating the extensions so you know what is custom and came with the new update&lt;br /&gt;
#* Comment out any that you are not using&lt;br /&gt;
#* Add ## or #! for ones that crash MW&lt;br /&gt;
# Work through the skins&lt;br /&gt;
# When everything is working, set the symlink to the new dir&lt;br /&gt;
# Edit LocalSettings.php&lt;br /&gt;
#* $wgScriptPath&lt;br /&gt;
#* $wgServer&lt;br /&gt;
===Clean Up Thoughts===&lt;br /&gt;
* Set up your backups if exporting the db and backing up the html directories.&lt;br /&gt;
&lt;br /&gt;
=OLD NOTES BELOW=&lt;br /&gt;
==Requirements==&lt;br /&gt;
Required software as of MediaWiki 1.47.0:&lt;br /&gt;
&lt;br /&gt;
* Web server with PHP 8.3.0 or higher, plus the following extensions:&lt;br /&gt;
** ctype&lt;br /&gt;
** dom&lt;br /&gt;
** fileinfo&lt;br /&gt;
** iconv&lt;br /&gt;
** intl&lt;br /&gt;
** libxml&lt;br /&gt;
** mbstring&lt;br /&gt;
** openssl&lt;br /&gt;
** xml&lt;br /&gt;
** xmlreader&lt;br /&gt;
* A SQL server, the following types are supported&lt;br /&gt;
** MariaDB 10.11 or higher&lt;br /&gt;
** MySQL 5.7.0 or higher&lt;br /&gt;
** PostgreSQL 10 or higher&lt;br /&gt;
** SQLite 3.31.0 or higher&lt;br /&gt;
&lt;br /&gt;
=June Notes=&lt;br /&gt;
==PHP 8.4==&lt;br /&gt;
* This can be done prior to the major jump as 1.39 supports 8.4&lt;br /&gt;
===Steps===&lt;br /&gt;
* dpkg -l | grep php&lt;br /&gt;
* sudo apt-get install php8.4&lt;br /&gt;
* sudo apt install php8.4-cli php8.4-common php8.4-mysql php8.4-zip php8.4-gd php8.4-mbstring php8.4-curl php8.4-xml php8.4-bcmath&lt;br /&gt;
* sudo apt install php8.4-redis php8.4-pcov php8.4-imagick php8.4-intl&lt;br /&gt;
* dpkg -l | grep php&lt;br /&gt;
* sudo update-alternatives --config php&lt;br /&gt;
* php -v&lt;br /&gt;
* sudo a2dismod php7.4 9&lt;br /&gt;
* sudo a2enmod php8.4&lt;br /&gt;
* sudo systemctl restart apache2&lt;br /&gt;
* Check wiki version, should be at 8.4.x&lt;br /&gt;
==MySQL==&lt;br /&gt;
# copy the existing db into a new db_1.43&lt;br /&gt;
# set permissions&lt;br /&gt;
&lt;br /&gt;
==Mediawiki Files==&lt;br /&gt;
# Make a list of the extensions...&lt;br /&gt;
# sudo mkdir it-wiki-1.43&lt;br /&gt;
# chown it:www-data it-wiki-1.43&lt;br /&gt;
# upload new files to 1.43&lt;br /&gt;
# cp /var/www/html/wiki-1.39/LocalSettings.php  /var/www/html/wiki-1.43&lt;br /&gt;
# cp -r /var/www/html/wiki-1.39/images/ /var/www/html/wiki-1.43/&lt;br /&gt;
# set permissions&lt;br /&gt;
#* sudo chown -R it:www-data /var/www/html/wiki-1.43/images&lt;br /&gt;
#* sudo chmod -R 775 /var/www/html/wiki-1.43/images&lt;br /&gt;
# edit LocalSettings.php to reflect url path for testing&lt;br /&gt;
# $wgScriptPath&lt;br /&gt;
# $wgServer&lt;br /&gt;
# change the db to 143&lt;br /&gt;
# set the skin to vector (shut off foreground)&lt;br /&gt;
# disable extensions&lt;br /&gt;
# Test&lt;br /&gt;
# sort out extensions and cleanup LocalSettings.php&lt;br /&gt;
&lt;br /&gt;
===Changeover===&lt;br /&gt;
After testing...&lt;br /&gt;
# Set the symlink to the new dir&lt;br /&gt;
# $wgScriptPath&lt;br /&gt;
# $wgServer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=The Approach=&lt;br /&gt;
* ALL THIS STUFF IS FROM THE LAST PAGE, REVAMP IT!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prepping the Databases==&lt;br /&gt;
# Backup the MW databases&lt;br /&gt;
# Find my Google sheet with notes&lt;br /&gt;
# Tally the extensions in use and find out what is still being maintained.&lt;br /&gt;
#* From the old sites I made copy of the Extensions that were installed via the Special:Version page&lt;br /&gt;
# Upgrade MySQL&lt;br /&gt;
# Upgrade PHP&lt;br /&gt;
* I installed the lowest version of MediaWiki I required and verified it worked.&lt;br /&gt;
** I then pulled in a backup of my two wiki sites&lt;br /&gt;
** I imported images/ from the same site&lt;br /&gt;
** I pointed mediawiki (via localsettings.php) at one of the databases&lt;br /&gt;
*** Ran maintenance/update.php --force&lt;br /&gt;
** Verified that the information loaded in the new site&lt;br /&gt;
* NOTE: I entirely ignored Skins and Extensions.&lt;br /&gt;
* Repeated for Site #2&lt;br /&gt;
* Once I had a working MW site for each database, I installed the next LTS MW version.&lt;br /&gt;
* Repeated the above steps&lt;br /&gt;
* Once I had a working MW site for each database, I installed the next LTS MW version.&lt;br /&gt;
* Repeated the above steps&lt;br /&gt;
* Eventually I had two working MW databases at 1.39&lt;br /&gt;
==New Ubuntu Server==&lt;br /&gt;
* I created a new Ubuntu 22.04 server and on this one, I took the time to set up various security related items.&lt;br /&gt;
* I opted to put&lt;br /&gt;
** MySQL at 8.0.35-0ubuntu0.22.04.1 &lt;br /&gt;
** php at 8.1.2-1ubuntu2.14 (apache2handler)&lt;br /&gt;
* Installed apache2, created a new MW1.39LTS site to verify it ran under the new software.&lt;br /&gt;
* From there, I imported the two site databases, copied the 1.39 directory to two separate directories, set up MW, imported images and all was good.&lt;br /&gt;
==Extensions and Skins==&lt;br /&gt;
* The Skin was freshly installed from the latest version.  Not much of an issue there.&lt;br /&gt;
* This was a little more tedious: I matched up the default 1.39 extensions against the old site listings and then went looking to for the latest extensions.&lt;br /&gt;
** Some extensions were still in production&lt;br /&gt;
** Some were not&lt;br /&gt;
* Fiddled until things were working.  Had to fix some code for YouTube.&lt;br /&gt;
&lt;br /&gt;
=Summary=&lt;br /&gt;
* I tried this about seven months ago and I was attempting to update the extensions as I went: this was not the way to go.  Getting the database updated was the key and ignoring everything else made that easier to do.  All a wiki really is at the base is the information (database) and the images/... everything else is functionality.&lt;br /&gt;
&lt;br /&gt;
[[Category:Wiki]]&lt;br /&gt;
[[Category:Weblog-2026-08]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Backing_Up_Mediawiki&amp;diff=2005</id>
		<title>Backing Up Mediawiki</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Backing_Up_Mediawiki&amp;diff=2005"/>
		<updated>2026-08-15T18:57:32Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: Created page with &amp;quot;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt; #!/bin/bash # ============================================================================== # Weekly LAMP Backup Script # ==============================================================================  # #### Configuration Variables #### SERVER_NAME=&amp;quot;MyServer2026&amp;quot; PERIOD_TYPE=&amp;quot;Weekly&amp;quot; # %V gives the ISO week number (01-53), resetting each year PERIOD_COUNTER=$(date +%V) BUNDLE_NAME=&amp;quot;${SERVER_NAME}_${PERIOD_TYPE}-${PERIOD_COUNTER}.tar.g...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# ==============================================================================&lt;br /&gt;
# Weekly LAMP Backup Script&lt;br /&gt;
# ==============================================================================&lt;br /&gt;
&lt;br /&gt;
# #### Configuration Variables ####&lt;br /&gt;
SERVER_NAME=&amp;quot;MyServer2026&amp;quot;&lt;br /&gt;
PERIOD_TYPE=&amp;quot;Weekly&amp;quot;&lt;br /&gt;
# %V gives the ISO week number (01-53), resetting each year&lt;br /&gt;
PERIOD_COUNTER=$(date +%V)&lt;br /&gt;
BUNDLE_NAME=&amp;quot;${SERVER_NAME}_${PERIOD_TYPE}-${PERIOD_COUNTER}.tar.gz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
STAGING_DIR=&amp;quot;/home/somedirectory/backups&amp;quot;&lt;br /&gt;
LOG_FILE=&amp;quot;/home/somedirectory/scripts/BackupSync-$(date +%Y).log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# User Provided Lists&lt;br /&gt;
WEB_ROOT=&amp;quot;/var/www/html&amp;quot;&lt;br /&gt;
WEB_DIRS_FILE=&amp;quot;/home/somedirectory/scripts/web_dirs.txt&amp;quot;&lt;br /&gt;
DATABASES_FILE=&amp;quot;/home/somedirectory/scripts/databases.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
mapfile -t WEB_DIRS &amp;lt; &amp;lt;(grep -vE &#039;^\s*#|^\s*$&#039; &amp;quot;$WEB_DIRS_FILE&amp;quot;)&lt;br /&gt;
mapfile -t DATABASES &amp;lt; &amp;lt;(grep -vE &#039;^\s*#|^\s*$&#039; &amp;quot;$DATABASES_FILE&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Database Credentials&lt;br /&gt;
MYSQL_USER=&amp;quot;dbBackup&amp;quot;&lt;br /&gt;
MYSQL_PASS_FILE=&amp;quot;/home/somedirectory/.backupCredsMySQL&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# QNAP NAS Configuration&lt;br /&gt;
QNAP_IP=&amp;quot;192.168.123.123&amp;quot;&lt;br /&gt;
QNAP_USER=&amp;quot;BackupUser&amp;quot;&lt;br /&gt;
QNAP_PASS_FILE=&amp;quot;/home/somedirectory/.qnapUpload&amp;quot;&lt;br /&gt;
QNAP_DEST_DIR=&amp;quot;/share/Public/WebserverBackups/MyServer2026/Weekly&amp;quot;     # Adjust to your actual QNAP share path&lt;br /&gt;
&lt;br /&gt;
# #### Functions ####&lt;br /&gt;
log_event() {&lt;br /&gt;
    # Standard log format: YYYY-MM-DD HH:MM:SS - Message&lt;br /&gt;
    echo &amp;quot;$(date &#039;+%Y-%m-%d %H:%M:%S&#039;) - $1&amp;quot; | tee -a &amp;quot;$LOG_FILE&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# #### Pre-flight Checks ####&lt;br /&gt;
# 1. Staging Directory Check&lt;br /&gt;
if [ ! -d &amp;quot;$STAGING_DIR&amp;quot; ]; then&lt;br /&gt;
    mkdir -p &amp;quot;$STAGING_DIR&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [ ! -w &amp;quot;$STAGING_DIR&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;$(date &#039;+%Y-%m-%d %H:%M:%S&#039;) - CRITICAL: Staging directory $STAGING_DIR is unavailable or not writable! Exiting.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# 2. QNAP Password File Check&lt;br /&gt;
if [ ! -f &amp;quot;$QNAP_PASS_FILE&amp;quot; ]; then&lt;br /&gt;
    log_event &amp;quot;CRITICAL: sshpass file $QNAP_PASS_FILE not found! Exiting.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# 3. MySQL Password File Check&lt;br /&gt;
if [ ! -f &amp;quot;$MYSQL_PASS_FILE&amp;quot; ]; then&lt;br /&gt;
    log_event &amp;quot;CRITICAL: MySQL password file $MYSQL_PASS_FILE not found! Exiting.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
# 4. List Files Check&lt;br /&gt;
if [ ! -f &amp;quot;$WEB_DIRS_FILE&amp;quot; ]; then&lt;br /&gt;
    log_event &amp;quot;CRITICAL: Web directory list file $WEB_DIRS_FILE not found! Exiting.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [ ! -f &amp;quot;$DATABASES_FILE&amp;quot; ]; then&lt;br /&gt;
    log_event &amp;quot;CRITICAL: Database list file $DATABASES_FILE not found! Exiting.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
log_event &amp;quot;=== Starting $PERIOD_TYPE Backup sequence ===&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# #### 1. MySQL Database Exports ####&lt;br /&gt;
log_event &amp;quot;Starting MySQL exports...&amp;quot;&lt;br /&gt;
for db in &amp;quot;${DATABASES[@]}&amp;quot;; do&lt;br /&gt;
    log_event &amp;quot;Exporting database: $db&amp;quot;&lt;br /&gt;
    if mysqldump -u &amp;quot;$MYSQL_USER&amp;quot; -p&amp;quot;$(cat &amp;quot;$MYSQL_PASS_FILE&amp;quot;)&amp;quot; &amp;quot;$db&amp;quot; &amp;gt; &amp;quot;$STAGING_DIR/${db}.sql&amp;quot;; then&lt;br /&gt;
        log_event &amp;quot;Successfully exported $db&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        log_event &amp;quot;ERROR: Failed to export $db&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
# #### 2. Web Directories Archiving ####&lt;br /&gt;
log_event &amp;quot;Starting Web Directory compression...&amp;quot;&lt;br /&gt;
for dir in &amp;quot;${WEB_DIRS[@]}&amp;quot;; do&lt;br /&gt;
    if [ -d &amp;quot;$WEB_ROOT/$dir&amp;quot; ]; then&lt;br /&gt;
        log_event &amp;quot;Compressing directory: $dir&amp;quot;&lt;br /&gt;
        # Added _web suffix to distinguish intermediate archives from the master bundle&lt;br /&gt;
        if tar -czf &amp;quot;$STAGING_DIR/${dir}_web.tar.gz&amp;quot; -C &amp;quot;$WEB_ROOT&amp;quot; &amp;quot;$dir&amp;quot;; then&lt;br /&gt;
            log_event &amp;quot;Successfully compressed $dir&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            log_event &amp;quot;ERROR: Failed to compress $dir.&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
    else&lt;br /&gt;
        log_event &amp;quot;WARNING: Directory $WEB_ROOT/$dir does not exist. Skipping.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
# #### 3. Final Bundling ####&lt;br /&gt;
log_event &amp;quot;Bundling files into $BUNDLE_NAME...&amp;quot;&lt;br /&gt;
cd &amp;quot;$STAGING_DIR&amp;quot; || exit 1&lt;br /&gt;
&lt;br /&gt;
# Exclude the destination bundle and specifically target intermediate files&lt;br /&gt;
if tar --exclude=&amp;quot;$BUNDLE_NAME&amp;quot; -czf &amp;quot;$BUNDLE_NAME&amp;quot; *.sql *_web.tar.gz; then&lt;br /&gt;
    log_event &amp;quot;Successfully created master bundle: $BUNDLE_NAME.&amp;quot;&lt;br /&gt;
    # Clean up intermediate files&lt;br /&gt;
    rm -f *.sql *_web.tar.gz&lt;br /&gt;
else&lt;br /&gt;
    log_event &amp;quot;CRITICAL: Failed to create master bundle! Exiting.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# #### 4. Rsync to QNAP ####&lt;br /&gt;
log_event &amp;quot;Initiating rsync transfer to QNAP NAS ($QNAP_IP)...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if sshpass -f &amp;quot;$QNAP_PASS_FILE&amp;quot; rsync -avz -e &amp;quot;ssh -o StrictHostKeyChecking=no&amp;quot; &amp;quot;$STAGING_DIR/$BUNDLE_NAME&amp;quot; &amp;quot;${QNAP_USER}@${QNAP_IP}:${QNAP_DEST_DIR}/&amp;quot;; then&lt;br /&gt;
    log_event &amp;quot;SUCCESS: Transfer of $BUNDLE_NAME to QNAP completed.&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    # #### 5. Cleanup ####&lt;br /&gt;
    log_event &amp;quot;Performing local cleanup...&amp;quot;&lt;br /&gt;
    rm -f &amp;quot;$STAGING_DIR/$BUNDLE_NAME&amp;quot;&lt;br /&gt;
    log_event &amp;quot;Removed local copy of $BUNDLE_NAME to conserve disk space.&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    log_event &amp;quot;ERROR: Rsync transfer failed! Leaving $BUNDLE_NAME in staging area for manual review.&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
log_event &amp;quot;=== $PERIOD_TYPE Backup sequence finished ===&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Weblog-2026-08]]&lt;br /&gt;
[[Category:Backups]]&lt;br /&gt;
[[Category:Webserver]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Mediawiki_1.43_from_1.39&amp;diff=2004</id>
		<title>Mediawiki 1.43 from 1.39</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Mediawiki_1.43_from_1.39&amp;diff=2004"/>
		<updated>2026-08-15T18:36:10Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Requirements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Background=&lt;br /&gt;
This was a WhatIf page to map out 1.39 to 1.43 with a thought of waiting until November for 1.47 LTS... but I went for it this past week.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=LTS=&lt;br /&gt;
Note: To upgrade MediaWiki, you can upgrade from the two most recent Long Term Support (LTS) versions directly.  If you are using an older version, you must first upgrade to one of the two latest LTS versions before proceeding to the latest version.&lt;br /&gt;
&lt;br /&gt;
=The Path=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Version !! MySQL !! PHP !! Jumps !! Status !! Notes &lt;br /&gt;
|-&lt;br /&gt;
| MediaWiki 1.39.5 LTS || MySQL 8.0.46 || PHP 8.1.2 || 0 || Current || &lt;br /&gt;
|-&lt;br /&gt;
| MediaWiki 1.43 LTS || MySQL 5.7.0+ (good) || PHP 8.1.0+ (good)  || 1 || Could do now ||  &lt;br /&gt;
|-&lt;br /&gt;
| MediaWiki 1.47 LTS || MySQL 5.7.0+ (good)  || PHP 8.3.0+ &#039;&#039;&#039;(need to update)&#039;&#039;&#039; || 2 ||  ||  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=The Process=&lt;br /&gt;
The last few times I&#039;ve done this I have been honing in on &#039;what is the basic approach to updating Mediawiki?&#039; and I think I&#039;m there now.&lt;br /&gt;
==Naming==&lt;br /&gt;
# Create the databases with the wiki version in the name. End it with _139 or something.&lt;br /&gt;
# Create the site directories in the same fashion.  Use symlinks for the actual &amp;quot;public&amp;quot; name.&lt;br /&gt;
## example: rabbibob\-&amp;gt;rabbibob_139\&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I started doing this so updates were more agile.  When I want to go to 143, I can create rabbibob_143\ and use that as a fresh area to configure, then shift the symlink when it is all done.  Copying the db from the _139 into a new _143 is the other key.  Editing LocalSettings.php allows for the ability to do this.  The limitation is if php or mysql requirements don&#039;t allow to the older or the new version to cohabitate.&lt;br /&gt;
&lt;br /&gt;
==Mediawiki==&lt;br /&gt;
# Know the requirements for where you are and where you need to get to in regards to MySQL and PHP requiremnts.&lt;br /&gt;
#* Sometimes a major revision upgrade of the OS carries these with them and it might be worth updating the OS or starting a fresh install&lt;br /&gt;
# BACK THINGS UP &lt;br /&gt;
# List your extensions (go to the Special:Version page, copy that page out to a Google Sheet so the links are intact)&lt;br /&gt;
# Create a new database_### and import the previous version db into that&lt;br /&gt;
# Create a new html dir mediawiki_### and import the target mediawiki into that&lt;br /&gt;
# Copy LocalSettings.php into the new dir from the old dir&lt;br /&gt;
# Edit LocalSettings.php&lt;br /&gt;
## Update the following with temporary values&lt;br /&gt;
##* $wgScriptPath&lt;br /&gt;
##* $wgServer&lt;br /&gt;
## Comment out all of the extensions&lt;br /&gt;
## Set the skin to one that comes stock&lt;br /&gt;
# run php maintenance\update.php from the command line&lt;br /&gt;
# Copy the images/ directory from the old install&lt;br /&gt;
# Update file permissions as needed during testing&lt;br /&gt;
# Work through the extensions&lt;br /&gt;
#* It is worth curating the extensions so you know what is custom and came with the new update&lt;br /&gt;
#* Comment out any that you are not using&lt;br /&gt;
#* Add ## or #! for ones that crash MW&lt;br /&gt;
# Work through the skins&lt;br /&gt;
# When everything is working, set the symlink to the new dir&lt;br /&gt;
# Edit LocalSettings.php&lt;br /&gt;
#* $wgScriptPath&lt;br /&gt;
#* $wgServer&lt;br /&gt;
===Clean Up Thoughts===&lt;br /&gt;
* Set up your backups if exporting the db and backing up the html directories.&lt;br /&gt;
&lt;br /&gt;
=OLD NOTES BELOW=&lt;br /&gt;
==Requirements==&lt;br /&gt;
Required software as of MediaWiki 1.47.0:&lt;br /&gt;
&lt;br /&gt;
* Web server with PHP 8.3.0 or higher, plus the following extensions:&lt;br /&gt;
** ctype&lt;br /&gt;
** dom&lt;br /&gt;
** fileinfo&lt;br /&gt;
** iconv&lt;br /&gt;
** intl&lt;br /&gt;
** libxml&lt;br /&gt;
** mbstring&lt;br /&gt;
** openssl&lt;br /&gt;
** xml&lt;br /&gt;
** xmlreader&lt;br /&gt;
* A SQL server, the following types are supported&lt;br /&gt;
** MariaDB 10.11 or higher&lt;br /&gt;
** MySQL 5.7.0 or higher&lt;br /&gt;
** PostgreSQL 10 or higher&lt;br /&gt;
** SQLite 3.31.0 or higher&lt;br /&gt;
&lt;br /&gt;
=June Notes=&lt;br /&gt;
==PHP 8.4==&lt;br /&gt;
* This can be done prior to the major jump as 1.39 supports 8.4&lt;br /&gt;
===Steps===&lt;br /&gt;
* dpkg -l | grep php&lt;br /&gt;
* sudo apt-get install php8.4&lt;br /&gt;
* sudo apt install php8.4-cli php8.4-common php8.4-mysql php8.4-zip php8.4-gd php8.4-mbstring php8.4-curl php8.4-xml php8.4-bcmath&lt;br /&gt;
* sudo apt install php8.4-redis php8.4-pcov php8.4-imagick php8.4-intl&lt;br /&gt;
* dpkg -l | grep php&lt;br /&gt;
* sudo update-alternatives --config php&lt;br /&gt;
* php -v&lt;br /&gt;
* sudo a2dismod php7.4 9&lt;br /&gt;
* sudo a2enmod php8.4&lt;br /&gt;
* sudo systemctl restart apache2&lt;br /&gt;
* Check wiki version, should be at 8.4.x&lt;br /&gt;
==MySQL==&lt;br /&gt;
# copy the existing db into a new db_1.43&lt;br /&gt;
# set permissions&lt;br /&gt;
&lt;br /&gt;
==Mediawiki Files==&lt;br /&gt;
# Make a list of the extensions...&lt;br /&gt;
# sudo mkdir it-wiki-1.43&lt;br /&gt;
# chown it:www-data it-wiki-1.43&lt;br /&gt;
# upload new files to 1.43&lt;br /&gt;
# cp /var/www/html/wiki-1.39/LocalSettings.php  /var/www/html/wiki-1.43&lt;br /&gt;
# cp -r /var/www/html/wiki-1.39/images/ /var/www/html/wiki-1.43/&lt;br /&gt;
# set permissions&lt;br /&gt;
#* sudo chown -R it:www-data /var/www/html/wiki-1.43/images&lt;br /&gt;
#* sudo chmod -R 775 /var/www/html/wiki-1.43/images&lt;br /&gt;
# edit LocalSettings.php to reflect url path for testing&lt;br /&gt;
# $wgScriptPath&lt;br /&gt;
# $wgServer&lt;br /&gt;
# change the db to 143&lt;br /&gt;
# set the skin to vector (shut off foreground)&lt;br /&gt;
# disable extensions&lt;br /&gt;
# Test&lt;br /&gt;
# sort out extensions and cleanup LocalSettings.php&lt;br /&gt;
&lt;br /&gt;
===Changeover===&lt;br /&gt;
After testing...&lt;br /&gt;
# Set the symlink to the new dir&lt;br /&gt;
# $wgScriptPath&lt;br /&gt;
# $wgServer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=The Approach=&lt;br /&gt;
* ALL THIS STUFF IS FROM THE LAST PAGE, REVAMP IT!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prepping the Databases==&lt;br /&gt;
# Backup the MW databases&lt;br /&gt;
# Find my Google sheet with notes&lt;br /&gt;
# Tally the extensions in use and find out what is still being maintained.&lt;br /&gt;
#* From the old sites I made copy of the Extensions that were installed via the Special:Version page&lt;br /&gt;
# Upgrade MySQL&lt;br /&gt;
# Upgrade PHP&lt;br /&gt;
* I installed the lowest version of MediaWiki I required and verified it worked.&lt;br /&gt;
** I then pulled in a backup of my two wiki sites&lt;br /&gt;
** I imported images/ from the same site&lt;br /&gt;
** I pointed mediawiki (via localsettings.php) at one of the databases&lt;br /&gt;
*** Ran maintenance/update.php --force&lt;br /&gt;
** Verified that the information loaded in the new site&lt;br /&gt;
* NOTE: I entirely ignored Skins and Extensions.&lt;br /&gt;
* Repeated for Site #2&lt;br /&gt;
* Once I had a working MW site for each database, I installed the next LTS MW version.&lt;br /&gt;
* Repeated the above steps&lt;br /&gt;
* Once I had a working MW site for each database, I installed the next LTS MW version.&lt;br /&gt;
* Repeated the above steps&lt;br /&gt;
* Eventually I had two working MW databases at 1.39&lt;br /&gt;
==New Ubuntu Server==&lt;br /&gt;
* I created a new Ubuntu 22.04 server and on this one, I took the time to set up various security related items.&lt;br /&gt;
* I opted to put&lt;br /&gt;
** MySQL at 8.0.35-0ubuntu0.22.04.1 &lt;br /&gt;
** php at 8.1.2-1ubuntu2.14 (apache2handler)&lt;br /&gt;
* Installed apache2, created a new MW1.39LTS site to verify it ran under the new software.&lt;br /&gt;
* From there, I imported the two site databases, copied the 1.39 directory to two separate directories, set up MW, imported images and all was good.&lt;br /&gt;
==Extensions and Skins==&lt;br /&gt;
* The Skin was freshly installed from the latest version.  Not much of an issue there.&lt;br /&gt;
* This was a little more tedious: I matched up the default 1.39 extensions against the old site listings and then went looking to for the latest extensions.&lt;br /&gt;
** Some extensions were still in production&lt;br /&gt;
** Some were not&lt;br /&gt;
* Fiddled until things were working.  Had to fix some code for YouTube.&lt;br /&gt;
&lt;br /&gt;
=Summary=&lt;br /&gt;
* I tried this about seven months ago and I was attempting to update the extensions as I went: this was not the way to go.  Getting the database updated was the key and ignoring everything else made that easier to do.  All a wiki really is at the base is the information (database) and the images/... everything else is functionality.&lt;br /&gt;
[[Category:Wiki]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
	<entry>
		<id>https://www.rabbibob.com/index.php?title=Mediawiki_1.43_from_1.39&amp;diff=2003</id>
		<title>Mediawiki 1.43 from 1.39</title>
		<link rel="alternate" type="text/html" href="https://www.rabbibob.com/index.php?title=Mediawiki_1.43_from_1.39&amp;diff=2003"/>
		<updated>2026-08-15T18:34:24Z</updated>

		<summary type="html">&lt;p&gt;Rabbi Bob: /* Clean Up Thoughts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Background=&lt;br /&gt;
This was a WhatIf page to map out 1.39 to 1.43 with a thought of waiting until November for 1.47 LTS... but I went for it this past week.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
=LTS=&lt;br /&gt;
Note: To upgrade MediaWiki, you can upgrade from the two most recent Long Term Support (LTS) versions directly.  If you are using an older version, you must first upgrade to one of the two latest LTS versions before proceeding to the latest version.&lt;br /&gt;
&lt;br /&gt;
=The Path=&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Version !! MySQL !! PHP !! Jumps !! Status !! Notes &lt;br /&gt;
|-&lt;br /&gt;
| MediaWiki 1.39.5 LTS || MySQL 8.0.46 || PHP 8.1.2 || 0 || Current || &lt;br /&gt;
|-&lt;br /&gt;
| MediaWiki 1.43 LTS || MySQL 5.7.0+ (good) || PHP 8.1.0+ (good)  || 1 || Could do now ||  &lt;br /&gt;
|-&lt;br /&gt;
| MediaWiki 1.47 LTS || MySQL 5.7.0+ (good)  || PHP 8.3.0+ &#039;&#039;&#039;(need to update)&#039;&#039;&#039; || 2 ||  ||  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=The Process=&lt;br /&gt;
The last few times I&#039;ve done this I have been honing in on &#039;what is the basic approach to updating Mediawiki?&#039; and I think I&#039;m there now.&lt;br /&gt;
==Naming==&lt;br /&gt;
# Create the databases with the wiki version in the name. End it with _139 or something.&lt;br /&gt;
# Create the site directories in the same fashion.  Use symlinks for the actual &amp;quot;public&amp;quot; name.&lt;br /&gt;
## example: rabbibob\-&amp;gt;rabbibob_139\&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I started doing this so updates were more agile.  When I want to go to 143, I can create rabbibob_143\ and use that as a fresh area to configure, then shift the symlink when it is all done.  Copying the db from the _139 into a new _143 is the other key.  Editing LocalSettings.php allows for the ability to do this.  The limitation is if php or mysql requirements don&#039;t allow to the older or the new version to cohabitate.&lt;br /&gt;
&lt;br /&gt;
==Mediawiki==&lt;br /&gt;
# Know the requirements for where you are and where you need to get to in regards to MySQL and PHP requiremnts.&lt;br /&gt;
#* Sometimes a major revision upgrade of the OS carries these with them and it might be worth updating the OS or starting a fresh install&lt;br /&gt;
# BACK THINGS UP &lt;br /&gt;
# List your extensions (go to the Special:Version page, copy that page out to a Google Sheet so the links are intact)&lt;br /&gt;
# Create a new database_### and import the previous version db into that&lt;br /&gt;
# Create a new html dir mediawiki_### and import the target mediawiki into that&lt;br /&gt;
# Copy LocalSettings.php into the new dir from the old dir&lt;br /&gt;
# Edit LocalSettings.php&lt;br /&gt;
## Update the following with temporary values&lt;br /&gt;
##* $wgScriptPath&lt;br /&gt;
##* $wgServer&lt;br /&gt;
## Comment out all of the extensions&lt;br /&gt;
## Set the skin to one that comes stock&lt;br /&gt;
# run php maintenance\update.php from the command line&lt;br /&gt;
# Copy the images/ directory from the old install&lt;br /&gt;
# Update file permissions as needed during testing&lt;br /&gt;
# Work through the extensions&lt;br /&gt;
#* It is worth curating the extensions so you know what is custom and came with the new update&lt;br /&gt;
#* Comment out any that you are not using&lt;br /&gt;
#* Add ## or #! for ones that crash MW&lt;br /&gt;
# Work through the skins&lt;br /&gt;
# When everything is working, set the symlink to the new dir&lt;br /&gt;
# Edit LocalSettings.php&lt;br /&gt;
#* $wgScriptPath&lt;br /&gt;
#* $wgServer&lt;br /&gt;
===Clean Up Thoughts===&lt;br /&gt;
* Set up your backups if exporting the db and backing up the html directories.&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
Required software as of MediaWiki 1.47.0:&lt;br /&gt;
&lt;br /&gt;
* Web server with PHP 8.3.0 or higher, plus the following extensions:&lt;br /&gt;
** ctype&lt;br /&gt;
** dom&lt;br /&gt;
** fileinfo&lt;br /&gt;
** iconv&lt;br /&gt;
** intl&lt;br /&gt;
** libxml&lt;br /&gt;
** mbstring&lt;br /&gt;
** openssl&lt;br /&gt;
** xml&lt;br /&gt;
** xmlreader&lt;br /&gt;
* A SQL server, the following types are supported&lt;br /&gt;
** MariaDB 10.11 or higher&lt;br /&gt;
** MySQL 5.7.0 or higher&lt;br /&gt;
** PostgreSQL 10 or higher&lt;br /&gt;
** SQLite 3.31.0 or higher&lt;br /&gt;
&lt;br /&gt;
=June Notes=&lt;br /&gt;
==PHP 8.4==&lt;br /&gt;
* This can be done prior to the major jump as 1.39 supports 8.4&lt;br /&gt;
===Steps===&lt;br /&gt;
* dpkg -l | grep php&lt;br /&gt;
* sudo apt-get install php8.4&lt;br /&gt;
* sudo apt install php8.4-cli php8.4-common php8.4-mysql php8.4-zip php8.4-gd php8.4-mbstring php8.4-curl php8.4-xml php8.4-bcmath&lt;br /&gt;
* sudo apt install php8.4-redis php8.4-pcov php8.4-imagick php8.4-intl&lt;br /&gt;
* dpkg -l | grep php&lt;br /&gt;
* sudo update-alternatives --config php&lt;br /&gt;
* php -v&lt;br /&gt;
* sudo a2dismod php7.4 9&lt;br /&gt;
* sudo a2enmod php8.4&lt;br /&gt;
* sudo systemctl restart apache2&lt;br /&gt;
* Check wiki version, should be at 8.4.x&lt;br /&gt;
==MySQL==&lt;br /&gt;
# copy the existing db into a new db_1.43&lt;br /&gt;
# set permissions&lt;br /&gt;
&lt;br /&gt;
==Mediawiki Files==&lt;br /&gt;
# Make a list of the extensions...&lt;br /&gt;
# sudo mkdir it-wiki-1.43&lt;br /&gt;
# chown it:www-data it-wiki-1.43&lt;br /&gt;
# upload new files to 1.43&lt;br /&gt;
# cp /var/www/html/wiki-1.39/LocalSettings.php  /var/www/html/wiki-1.43&lt;br /&gt;
# cp -r /var/www/html/wiki-1.39/images/ /var/www/html/wiki-1.43/&lt;br /&gt;
# set permissions&lt;br /&gt;
#* sudo chown -R it:www-data /var/www/html/wiki-1.43/images&lt;br /&gt;
#* sudo chmod -R 775 /var/www/html/wiki-1.43/images&lt;br /&gt;
# edit LocalSettings.php to reflect url path for testing&lt;br /&gt;
# $wgScriptPath&lt;br /&gt;
# $wgServer&lt;br /&gt;
# change the db to 143&lt;br /&gt;
# set the skin to vector (shut off foreground)&lt;br /&gt;
# disable extensions&lt;br /&gt;
# Test&lt;br /&gt;
# sort out extensions and cleanup LocalSettings.php&lt;br /&gt;
&lt;br /&gt;
===Changeover===&lt;br /&gt;
After testing...&lt;br /&gt;
# Set the symlink to the new dir&lt;br /&gt;
# $wgScriptPath&lt;br /&gt;
# $wgServer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=The Approach=&lt;br /&gt;
* ALL THIS STUFF IS FROM THE LAST PAGE, REVAMP IT!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prepping the Databases==&lt;br /&gt;
# Backup the MW databases&lt;br /&gt;
# Find my Google sheet with notes&lt;br /&gt;
# Tally the extensions in use and find out what is still being maintained.&lt;br /&gt;
#* From the old sites I made copy of the Extensions that were installed via the Special:Version page&lt;br /&gt;
# Upgrade MySQL&lt;br /&gt;
# Upgrade PHP&lt;br /&gt;
* I installed the lowest version of MediaWiki I required and verified it worked.&lt;br /&gt;
** I then pulled in a backup of my two wiki sites&lt;br /&gt;
** I imported images/ from the same site&lt;br /&gt;
** I pointed mediawiki (via localsettings.php) at one of the databases&lt;br /&gt;
*** Ran maintenance/update.php --force&lt;br /&gt;
** Verified that the information loaded in the new site&lt;br /&gt;
* NOTE: I entirely ignored Skins and Extensions.&lt;br /&gt;
* Repeated for Site #2&lt;br /&gt;
* Once I had a working MW site for each database, I installed the next LTS MW version.&lt;br /&gt;
* Repeated the above steps&lt;br /&gt;
* Once I had a working MW site for each database, I installed the next LTS MW version.&lt;br /&gt;
* Repeated the above steps&lt;br /&gt;
* Eventually I had two working MW databases at 1.39&lt;br /&gt;
==New Ubuntu Server==&lt;br /&gt;
* I created a new Ubuntu 22.04 server and on this one, I took the time to set up various security related items.&lt;br /&gt;
* I opted to put&lt;br /&gt;
** MySQL at 8.0.35-0ubuntu0.22.04.1 &lt;br /&gt;
** php at 8.1.2-1ubuntu2.14 (apache2handler)&lt;br /&gt;
* Installed apache2, created a new MW1.39LTS site to verify it ran under the new software.&lt;br /&gt;
* From there, I imported the two site databases, copied the 1.39 directory to two separate directories, set up MW, imported images and all was good.&lt;br /&gt;
==Extensions and Skins==&lt;br /&gt;
* The Skin was freshly installed from the latest version.  Not much of an issue there.&lt;br /&gt;
* This was a little more tedious: I matched up the default 1.39 extensions against the old site listings and then went looking to for the latest extensions.&lt;br /&gt;
** Some extensions were still in production&lt;br /&gt;
** Some were not&lt;br /&gt;
* Fiddled until things were working.  Had to fix some code for YouTube.&lt;br /&gt;
&lt;br /&gt;
=Summary=&lt;br /&gt;
* I tried this about seven months ago and I was attempting to update the extensions as I went: this was not the way to go.  Getting the database updated was the key and ignoring everything else made that easier to do.  All a wiki really is at the base is the information (database) and the images/... everything else is functionality.&lt;br /&gt;
[[Category:Wiki]]&lt;/div&gt;</summary>
		<author><name>Rabbi Bob</name></author>
	</entry>
</feed>