• WordPress TwentyTen Custom Header setting in the db

    When we move a WordPress site from development to production we update the URL in the following db values:

    • in the GUID value of each post in wp_posts
    • in the wp_options table, the option_name of home
    • in wp_options, the option_name of siteurl

    In a recent move, we found that the custom header in the TwentyTen theme was not displaying correctly when we moved across servers. Seems that when you use a TwentyTen theme or child theme, a wp_option is added to the table – theme_mods_twentyten. The value of this contains all the theme mods including the the URL of the header image. The query below would update the URL in this value:

    • mysql –batch –skip-column-names -e “use $CURRENTDB;UPDATE wp_options SET option_value = replace(option_value, ‘”$OLDSITENAME”‘, ‘”http://$NEWSITENAME”‘) WHERE option_name = ‘ theme_mods_twentyten’;”

    Note: When using a copy of the TwentyTen theme, the option_name value will be theme_mods_NameOfTheTheme.


  • MySQL replication of WordPress dbs over ssh

    I wanted to setup MySQL replication over ssh for a small WordPress database. I have a VM that lives in my house, I wanted to be able to bring it up, make it current, disconnect, and then hack away. Here is my proceedure.

    On the master:

    Setup the replication user (I had to use 127.0.0.1 becasue % did not let me connect from ssh):

    grant replication slave on *.* TO repl@"127.0.0.1" identified by '[repl password]';
    

    edit /etc/my.cnf

    server-id=1
    log-bin=mysql-bin
    replicate-do-db=DB_TO_REPLICATE   #the name of the db you want to replicate.
    

    From the slave:

    edit /etc/my.cnf

    server-id = 2
    master-host = 127.0.0.1
    master-user = repl
    master-password = password
    master-port = 7777
    replicate-do-db = DB_TO_REPLICATE   #the name of the db you want to replicate.
    

    Next, tunnel a ssh connection from slave to the source, and then make sure you can see the source databases:

    ssh -f -N -L7777:127.0.0.1:3306 [email protected]
    mysql -h 127.0.0.1 -P 7777 -e "show databases;"
    

    Next create a local database:

    mysql -e "create database DB_TO_REPLICATE;"
    

    Next we want to find where the master’s log is and its position:

    MASTERLOGPOS=$(mysql -h 127.0.0.1 -P 7777 --batch --skip-column-names -e "SHOW MASTER STATUS;" | cut -f2)
    MASTERLOGFILE=$(mysql -h 127.0.0.1 -P 7777 --batch --skip-column-names -e "SHOW MASTER STATUS;" | cut -f1)
    

    next we want to seed the local db

    mysqldump -h 127.0.0.1 -P 7777 DB_TO_REPLICATE | mysql -u root DB_TO_REPLICATE;
    

    and finally, tell the db to use the source as the Master:

    mysql -e "use DB_TO_REPLICATE;CHANGE MASTER TO MASTER_LOG_FILE='"$MASTERLOGFILE"',MASTER_LOG_POS=$MASTERLOGPOS;"
    mysql -e "start slave;"
    

    To test I run:

    mysql -e "show slave status\G;"
    

    and I compare the following on the master and the client:

    mysql -e "select id,post_parent,post_modified,post_title from jbmurphy_com.wp_posts"
    

  • DrivesMeNuts: Windows shutdown tracker

    You know that drop down box that looks like this (called the Shutdown Tracker):

    Every month when I patch servers it DrivesMeNuts that Microsoft did not put in a “Planned” option for “Operating System: Patching”

    Every time I click the shutdown tracker, I think: “Microsoft intentionally left “Patching” off the selection list, so that the logs don’t track the amount of patching we have to do!”


  • Dell OpenManage Server Administrator on ESX

    This is how I installed Dell OpenManage Server Administrator on our VMware ESX 4.1 box

    tar -xzf OM-SrvAdmin-Dell-Web-LX-6.4.0-1266_A00.4.tar.gz
    cd linux/supportscripts/
    ./srvadmin-install.sh -x
    esxcfg-firewall -o 1311,tcp,in,OpenManageRequest
    ./srvadmin-services.sh restart

    Mostly a reminder for me, but maybe a search engine will bring someone here, and it would be helpful.


  • My “Copy WordPress site to local” script

    I wanted to write a script that would copy a WordPress site to the local machine from a remote server (securely over ssh). This would allow me to set up a test environment or backup. First I need to make sure the site exists on the source server. Then I want to get the current wp-config settings, like the database name:

    echo "Checking $SRCSERVER for a site named $SRCSITENAME"
    CHECKCMD="ls /PATH/TO/$SRCSITENAME/wp-config.php | grep wp-config.php > /dev/null; echo \$?"
    CHECKFILE=$(ssh $SRCSERVER $CHECKCMD)
    if [ $CHECKFILE -eq 0 ]; then
            echo "Source Site $SRCSITENAME on $SRCSERVER exists"
            SRCMYSQLSITEUSER=$(ssh $SRCSERVER grep "DB_USER" /PATH/TO/$SRCSITENAME/wp-config.php | cut -f 2 -d " " | cut -f 2 -d "'")
            SRCMYSQLSITEPASS=$(ssh $SRCSERVER grep "DB_PASSWORD" /PATH/TO/$SRCSITENAME/wp-config.php | cut -f 2 -d " " | cut -f 2 -d "'")
            SRCMYSQLSITEDB=$(ssh $SRCSERVER grep "DB_NAME" /PATH/TO/$SRCSITENAME/wp-config.php | cut -f 2 -d " " | cut -f 2 -d "'")
            echo "Source mySQL Site Database:"$SRCMYSQLSITEDB
            echo "Source mySQL Site Username:"$SRCMYSQLSITEUSER
            echo "Source mySQL Site Password:"$SRCMYSQLSITEPASS
    else
            echo "Source Site $SRCSITENAME on $SRCSERVER does not exist"
            exit;
    fi
    

    Next I provision a new site with a new virtual host, and I copy over the files:

    echo "Copying site from $SRCSERVER:/PATH/TO/$SRCSITENAME/ to /PATH/TO/$DESTSITENAME"
    rsync --archive $SRCSERVER:/PATH/TO/$SRCSITENAME/ /PATH/TO/$DESTSITENAME
    

    Next I provision a new blank MySQL database with the name, username, and password received in the first part for code, then I copy over the db data via ssh:

    echo "Copying mysql data from $SRCSERVER to local database name $DESTSITENAME"
    ssh $SRCSERVER "mysqldump -u root $SRCMYSQLSITEDB" | mysql -u root $DESTSITENAME
    

    Finally I run a couple of SQL queries to change the URL that WordPress has inside the DB.

    
    echo "What is going to be the WordPress URL"
    read NEWURL
    
    OLDSITENAME=$(mysql --batch --skip-column-names -e "use $DESTSITENAME;select guid from wp_posts LIMIT 1;" | cut -d"/" -f3)
    echo "Changing the wp_posts guids from $OLDSITENAME to $NewURL
    
    mysql --batch --skip-column-names -e "use $DESTSITENAME;UPDATE wp_posts SET guid = REPLACE (guid, '"http://$OLDSITENAME"','"http://$NEWURL"');"
    
    echo "Changing the home and siterurl to $NewURL"
    
    mysql --batch --skip-column-names -e "use $DESTSITENAME;UPDATE wp_options SET option_value = replace(option_value, '"http://$OLDSITENAME"', '"http://$NEWURL"') WHERE option_name = 'home' OR option_name = 'siteurl';"
    

  • And we’re back – Chrome 12.0.725.0 dev restores notifications

    Phew.


  • My PowerShell PowerCLI VMware guest provisioning script

    This script will provision a 4GB Ram, 40 GB HD Server 2008 R2 VM, set the CD to an OSD iso, set the BootDelay to 5 seconds, and start the machine

    
    $vmhost = Get-VMHost "server.name.local"
    $ds = Get-Datastore "server:storage1"
    $rp = get-resourcepool -id "ResourcePool-resgroup-22"
    $nn = "NetworkName"
    $gi = "windows7Server64Guest"
    $iso = "[server:ISOs] Folder/OSD.iso"
    
    ####
    $vmname = "VMGeust01"
    New-VM -name $vmname -VMHost $vmhost -numcpu 1 -DiskMB 40960 -memoryMB 4096 -datastore $ds -guestID $gi -resourcepool $rp -cd -NetworkName $nn
    Get-VM $vmname | Get-CDDrive | Set-CDDrive -IsoPath $iso -StartConnected $true -Confirm:$false
    
    $value = "5000"
    $vm = Get-VM $vmname | Get-View
    $vmConfigSpec = New-Object VMware.Vim.VirtualMachineConfigSpec
    $vmConfigSpec.BootOptions = New-Object VMware.Vim.VirtualMachineBootOptions
    $vmConfigSpec.BootOptions.BootDelay = $value
    $vm.ReconfigVM_Task($vmConfigSpec)
    
    Start-VM -VM $vmname
    

  • OS X: Move files based on creation date

    I wanted to organize my flip videos – I wanted them moved into a folder named after their creation date.

    One of the scripts that I found uses ls’s “–time-style” parameter. BSD’s ls does not have this value. MacPorts’ coreutils port contains gls (GNU’s ls) that does support the parameter. So here is my script to move movies into a sub folder based on the movies creation date.

    for filename in *.MP4; do
        datepath="$(gls -l --time-style=+%Y-%m-%d $filename | awk '{print $6}')"
        echo "$datepath"
        if ! test -e "$datepath"; then
            mkdir -pv "$datepath"
        fi
        mv -v $filename $datepath
    done