Patterson EagleSoft v18 crashing during auto-backups

We’re running Patterson EagleSoft v18.10.05 on a Windows 2008 R2 Standard server.

We have auto-backup configured to run when ever the database starts up and to keep 14 backups:

We have a scheduled task on the server that runs¬†“D:\EagleSoft\Shared Files\techaid.exe -stop” at 3:00am and then “D:\EagleSoft\Shared Files\techaid.exe -start” at 3:15am to trigger a nightly automatic backup while the database isn’t in use.

We just noticed that backups haven’t been occurring since 2017-12-31. Funny how they stopped 2018-01-01.

Then around 2018-02-12 the EagleSoft database would stop as planned at 3:00am and then crash/fail to start at 3:15am with no backup being generated. We’d then have to manually start EagleSoft’s database the next day so users could access it.

We found files like these in the EagleSoft auto backup directory:

  • DotNetZip-5tusrxsj.tmp
  • DotNetZip-fybwnf0z.tmp
  • DotNetZip-hete0py2.tmp
  • DotNetZip-zjlqhwj0.tmp

After contacting Patterson for support they informed us this is a known issue with EagleSoft v18 and the fix was to upgrade to v19.

I dug into the backup zip files and found they contain only three files:

  • Eaglesoft.Server.Configuration.data
  • PattersonPM.db
  • PattersonPM.log

All of which are located in “<EAGLESOFT INSTALL DIR>\Data”.

Some further digging showed there were additional LOG and DB files in the Data DIR that aren’t being backed up by auto backup.

Upgrading right now isn’t exactly an option for us so I wrote a PowerShell script to replace EagleSofts built-in auto backup. We run full backups of the server with Veeam so this script is just a little extra insurance for the database specifically.

Note: This script requires PowerShell v5.0 or newer. As of this writing v5.1 appears to be the newest and can be installed on Windows Server 2008 R2 or newer.

# EagleSoft Backup Script
#
# Written by: Eric Schewe ([email protected])
# Created on: 2018-02-19
#
# This script replaces the auto backup feature built into EagleSoft which appears to have broken as of 2018-01-01 in v18.
# Patterson recommends upgrading to v19 to resolve the issue. In the mean time this script can replace the auto backup.
#
# This script will stop the EagleSoft database, copy the database files, start EagleSoft and the compress the database copies.
#
# This script requires PowerShell v5.0 or newer
#
# Important: Make sure auto backup is disabled or EagleSoft may not start up properly after this script runs
#
# Installation: 
#   1. Configure this as a scheduled task that runs on your server when no one is using EagleSoft
#   2. Set $eagleSoftDirectory and $backupsLocation
#   3. Set $backupsToKeep to how many days of backups you want to keep
#

# <-------- Start User Configuration -------->

# Where is EagleSoft installed?
# Example: "C:\EagleSoft"
$eagleSoftDirectory = "C:\EagleSoft" 

# Where do you want the backups to go?
# Example: "D:\EagleSoft-Backups"
$backupsLocation = "D:\EagleSoft-Backups"

# How many days of backups do you want to keep?
$backupsToKeep = 14

# <-------- End User Configuration -------->


$goToRunBackups = $true; # Initialize variable
$date = (Get-Date -Format yyyy-MM-dd) # Todays date
$dateTime = (Get-Date -Format yyyyMMdd-HHmmss) # Right now

# Make sure the backup location exists
if(!(Test-Path -Path $backupsLocation )){
    Write-Host "$(Get-Date -Format "yyyy-MM-dd HH:mm:ss") - Error: Backup destination directory does not exist or cannot be accessed"
    $goToRunBackups = $false;
}
# Make sure the EagleSoft installation dir is set correctly
if(!(Test-Path -Path "$($eagleSoftDirectory)\Shared Files\techaid.exe" )){
    Write-Host "$(Get-Date -Format "yyyy-MM-dd HH:mm:ss") - Error: Cannot find techaid.exe. Make sure EagleSoft installation directory is correct"
    $goToRunBackups = $false;
}


if ($goToRunBackups -eq $true) {

    # Setup some variables
    $scratchDir = "$($backupsLocation)\scratchDir-$($dateTime)"
    $backupFilename = "EagleSoft-Backup-$($dateTime).zip"
    $databasesToBackup = (Get-Item -Path "$($eagleSoftDirectory)\Data\*.db")

    # Create a scratch directory for us to use
    Write-Host "$(Get-Date -Format "yyyy-MM-dd HH:mm:ss") - Creating scratch directory"
    New-Item -Force -ItemType directory -Path $scratchDir | Out-Null

    # Stop the EagleSoft database
    Write-Host "$(Get-Date -Format "yyyy-MM-dd HH:mm:ss") - Stopping EagleSoft"
    & "$($eagleSoftDirectory)\Shared Files\techaid.exe" -stop

    Write-Host "$(Get-Date -Format "yyyy-MM-dd HH:mm:ss") - Waiting 60 seconds for everything to stop"
    Start-Sleep 60

    Write-Host "$(Get-Date -Format "yyyy-MM-dd HH:mm:ss") - Copying database and log files"
    foreach ($database in $databasesToBackup) {

        Write-Host "$(Get-Date -Format "yyyy-MM-dd HH:mm:ss") - Copying $($database.Name)"
        Copy-Item -path "$($eagleSoftDirectory)\Data\$($database.Name)" -destination $scratchDir

        # Check if a matching log file exists and grab it to
        $logFile = $($database.Name) -replace ".db", ".log"
        if(Test-Path -Path "$($eagleSoftDirectory)\Data\$logFile"){

            Write-Host "$(Get-Date -Format "yyyy-MM-dd HH:mm:ss") - Copying $logFile"
            Copy-Item -path "$($eagleSoftDirectory)\Data\$logFile" -destination $scratchDir

        }

    }

    # Backup configuration file
    Write-Host "$(Get-Date -Format "yyyy-MM-dd HH:mm:ss") - Copying configuration file"
    Copy-Item -path "$($eagleSoftDirectory)\Data\Eaglesoft.Server.Configuration.data" -destination $scratchDir

    # Start the EagleSoft database
    Write-Host "$(Get-Date -Format "yyyy-MM-dd HH:mm:ss") - Starting EagleSoft"
    & "$($eagleSoftDirectory)\Shared Files\techaid.exe" -start

    # Compress the backed up files
    Write-Host "$(Get-Date -Format "yyyy-MM-dd HH:mm:ss") - Compressing files"
    Compress-Archive -Path $scratchDir -DestinationPath "$($backupsLocation)\$($backupFilename)"

    # Clean-up scratch directory
    Write-Host "$(Get-Date -Format "yyyy-MM-dd HH:mm:ss") - Removing scratch directory and files"
    Remove-Item -path $scratchDir -recurse -force

    # Clean-up old backups
    Write-Host "$(Get-Date -Format "yyyy-MM-dd HH:mm:ss") - Purging old backups"
    Get-ChildItem $backupsLocation | Where-Object { $_.LastWriteTime -lt $(Get-Date).AddDays("-$($backupsToKeep)") } | Remove-Item

}

You can save this as ‘eagleSoftBackups.ps1‘ (or anything really) on your EagleSoft server and then use ‘Scheduled Tasks’ to schedule it to run nightly or how ever often you want.

Script to install Oyster Protocol (PRL) Hooknode

Update – 2018-02-19: There were a few bugs in the first version of this script. If you ran any version of it previous to v1.3 you’ll want to wipe your CentOS machine and re-run the script from scratch. You can check the script version number by looking at it in a text editor.

 

Saw these scripts in the official Oyster Protocol Github that would automatically build you a Oyster Protocol Hooknode if you have a clean Ubuntu 16.04 installation. I’m more of a fan of CentOS so I thought I’d try porting the script over to CentOS 7.

Disclaimer: This script will likely not result in a super secure installation of CentOS. It will however get you a working deployment of Oyster Protocol (PRL) Hooknode on a blank CentOS 7 VM (or physical system if you prefer) with the firewall still enabled. I do not recommend using this in production with out performing additional hardening yourself or altering the script to perform it for you. The script will configure the system to automatically download and install security updates.

It is generally bad practice to run random scripts from the internet so please review the script before executing it to make sure you are OK with everything it is doing.

I am going to assume you’ve built a VM in your preferred hypervisor (I’m using VMware Workstation) and you have the CentOS Minimal Installation ISO mounted to it’s CDROM so it will boot the CentOS installer. I am also going to assume you have DHCP and DNS working on your network¬† so the VM will automatically get a IP and be able to access the internet.

I am not going to cover setting up a static IP, public/private DNS configuration, LetsEncrypt SSL, etc. All this script will do is get you a CentOS 7 VM with a Oyster Protocol (PRL) Hooknode running on it.

I’ve built a VM with 2vCPUs, 2GB of RAM and a 40GB HD.

Installing CentOS into the VM

  1. Power on the VM
  2. Choose ‘Install CentOS 7’ and press <ENTER>
  3. Press <ENTER> to start the installation
  4. Click ‘Contiune’ on the language/keyboard selection screen
  5. Click ‘Network & Hostname’
  6. Change the hostname to whatever you’d like your VM to be called and click ‘Apply’
  7. Click the ‘Off’ button in the top right to turn on the network connection
  8. Verify you have an IP address and note it down so you can SSH in post installation, if not you have some fixing to do, if you do click ‘Done’
  9. Click ‘Date & Time’
  10. Pick your timezone
  11. Make sure ‘Network Time’ is set to ‘On’
  12. Click ‘Done’
  13. Click ‘Installation Destination’
  14. Select the VMs disk and click ‘Done’
  15. Click ‘Begin Installation’
  16. Click ‘Root password’, set a password and click ‘Done’
  17. Click ‘User creation’, fill out the boxes for your normal user account, check mark ‘Make this user administrator’ and click ‘Done’
  18. Wait for the installation to complete
  19. Click ‘Reboot’ when it’s done

SSH into your server, disable SELinux, reboot and run the install script

Note: If you didn’t write down the IP of your VM from the OS installation you can login with the root account or your non-root account and run “ip addr show” and you will see the IP of your VM under ‘ens##’ next to ‘inet’

  1. SSH into your VM using your non-root account you created during the installation
  2. Run the following command to disable SELinux and automatically reboot
    sudo su - -c "sed -i -e 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config; shutdown -r now"
  3. SSH back into your VM using your non-root account
  4. Download the installation script by running the following:
    curl https://www.pickysysadmin.ca/static/hk_install_centos7.sh > hk_install_centos7.sh
  5. Verify the the file by running the following command. The output should say “OK”
    echo "76d440b145cdc2915751b40dd98818efb0f8b0ab hk_install_centos7.sh" | sha1sum -c
  6. Inspect the script using vim or some other text editor to make sure you are OK with everything happening in the script. Running scripts randomly from the internet is usually a bad idea.
  7. Run the script and enter your password when prompted
    NOTE: This script will take a while to complete due to a large, download required as part of the installation. Be patient.

    sudo sh hk_install_centos7.sh
  8. Wait for installation to complete