Tag: raspberry pi

  • Raspberry Pi: Setting up backup

    I have a Raspberry Pi providing household automation and productivity services – WebDav, Backups and Calendar. I always worry about a jolt of power, a failed byte and something that is unrecoverable. Time for a Backup solution.

    I plugged in a USB stick – 64GB, and immediately checked the file system is there and visible as SDA (unmounted).

    pi@raspberrypi:~# sudo su - 
    
    root@raspberrypi:~# lsblk 
     NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
     sda           8:0    1 58.2G  1 disk 
     └─sda1        8:1    1 58.2G  1 part 
     mmcblk0     179:0    0 14.9G  0 disk 
     ├─mmcblk0p1 179:1    0 43.9M  0 part /boot
     └─mmcblk0p2 179:2    0 14.8G  0 part /

    I check to see which one is assigned to the SD card slot (mmc), I really don’t want to reformat Raspbian.  I see the USB stick is on /dev/sda. All of my subsequent commands use /dev/sda as part of the command.

    root@raspberrypi:~# parted -ls
    Warning: The driver descriptor says the physical block size is 2048 bytes, but Linux says it is 512 bytes.
     Model: JetFlash Transcend 64GB (scsi)
     Disk /dev/sda: 62.5GB
     Sector size (logical/physical): 512B/512B
     Partition Table: unknown
     Disk Flags: 
    
     Model: SD SC16G (sd/mmc)
     Disk /dev/mmcblk0: 15.9GB
     Sector size (logical/physical): 512B/512B
     Partition Table: msdos
     Disk Flags: 
     Number  Start   End     Size    Type     File system  Flags
      1      4194kB  50.2MB  46.0MB  primary  fat32        lba
      2      50.3MB  15.9GB  15.9GB  primary  ext4

    If you don’t see the relevant information on your HD or run into issues formatting the hard-drive, install hdparm.  and check with hdparm -r0 /dev/sda  .

    TIP: I did run into an issue with an ISO written to a USB drive which locks the partition table and makes it unwriteable.

    root@raspberrypi:~# apt-get install hdparm
     Reading package lists… Done
     Building dependency tree       
     Reading state information… Done
     The following package was automatically installed and is no longer required:
       realpath
     Use 'apt autoremove' to remove it.
     The following additional packages will be installed:
       powermgmt-base
     Suggested packages:
       apmd
     The following NEW packages will be installed:
       hdparm powermgmt-base
     0 upgraded, 2 newly installed, 0 to remove and 148 not upgraded.
     Need to get 114 kB of archives.
     After this operation, 278 kB of additional disk space will be used.
     Do you want to continue? [Y/n] y
     Get:1 http://raspbian.mirror.constant.com/raspbian stretch/main armhf hdparm armhf 9.51+ds-1+deb9u1 [105 kB]
     Get:2 http://raspbian-us.ngc292.space/raspbian stretch/main armhf powermgmt-base all 1.31+nmu1 [9,240 B]
     Fetched 114 kB in 0s (120 kB/s)           
     Selecting previously unselected package hdparm.
     (Reading database … 135688 files and directories currently installed.)
     Preparing to unpack …/hdparm_9.51+ds-1+deb9u1_armhf.deb …
     Unpacking hdparm (9.51+ds-1+deb9u1) …
     Selecting previously unselected package powermgmt-base.
     Preparing to unpack …/powermgmt-base_1.31+nmu1_all.deb …
     Unpacking powermgmt-base (1.31+nmu1) …
     Setting up powermgmt-base (1.31+nmu1) …
     Setting up hdparm (9.51+ds-1+deb9u1) …
     Processing triggers for man-db (2.7.6.1-2) …
    Preparing to unpack …/hdparm_9.51+ds-1+deb9u1_armhf.deb …
    
    Unpacking hdparm (9.51+ds-1+deb9u1) …
    
    Selecting previously unselected package powermgmt-base.
    
    Preparing to unpack …/powermgmt-base_1.31+nmu1_all.deb …
    
    Unpacking powermgmt-base (1.31+nmu1) …
    
    Setting up powermgmt-base (1.31+nmu1) …
    
    Setting up hdparm (9.51+ds-1+deb9u1) …
    
    Processing triggers for man-db (2.7.6.1-2) …
    root@raspberrypi:~# hdparm -r0 /dev/sda
     /dev/sda:
      setting readonly to 0 (off)
      readonly      =  0 (off)

    Now that I know the drive is writeable, I need to create the partition. I used

    cfdisk

    Navigate through the menu and select the maximum size
                                                                                            Disk: /dev/sda
    Size: 58.2 GiB, 62495129600 bytes, 122060800 sectors
    Label: dos, identifier: 0x00000000

    Device Boot Start End Sectors Size Id Type
    >> /dev/sda1 2048 122060799 122058752 58.2G 83 Linux

    Once you see “Syncing disks.”, you can format the disk. I formatted the partition sda1 with ext4 (I may want to encrypt in the future). Unmount and then format.

    root@raspberrypi:~# umount /dev/sda1
    root@raspberrypi:~# mkfs.ext4 /dev/sda1
    mke2fs 1.43.4 (31-Jan-2017)
    Found a dos partition table in /dev/sda1
    Proceed anyway? (y,N) y
    Creating filesystem with 2828032 4k blocks and 707136 inodes
    Filesystem UUID: 363f1b4a-b0f5-4c7b-bf91-66f3823032d6
    Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

    Allocating group tables: done
    Writing inode tables: done
    Creating journal (16384 blocks): done
    Writing superblocks and filesystem accounting information: done

    root@raspberrypi:~#

    Make the backup directory, edit fstab and mount the directory.  Insert into fstab with your uuid “UUID=363f1b4a-b0f5-4c7b-bf91-66f3823032d6 /backups auto nosuid,nodev,nofail 0 0
    ”   The second to last avoids backup and the last one enables fsck on reboot.

    root@raspberrypi:~# blkid 
    /dev/mmcblk0p1: LABEL="boot" UUID="DDAB-3A15" TYPE="vfat" PARTUUID="b53687e8-01"
    /dev/mmcblk0p2: LABEL="rootfs" UUID="5fa1ec37-3719-4b25-be14-1f7d29135a13" TYPE="ext4" PARTUUID="b53687e8-02"
    /dev/mmcblk0: PTUUID="b53687e8" PTTYPE="dos"
    /dev/sdb: UUID="363f1b4a-b0f5-4c7b-bf91-66f3823032d6" TYPE="ext4"
    root@raspberrypi:~# mkdir /backups 
    root@raspberrypi:~# vim /etc/fstab
    root@raspberrypi:~# mount -a
    root@raspberrypi:~# mount
    UUID=363f1b4a-b0f5-4c7b-bf91-66f3823032d6 /backups auto nosuid,nodev,nofail 0 0


    You should see backups listed. (Note: I bricked my Raspberry Pi with a bad FSTAB entry, and mounted it on my Mac using Paragon and removed the bad fstab entry. )

    Update Crontab with daily backups.

    crontab -e

    Setup an editor for crontab.

    root@raspberrypi:~# crontab -e
    no crontab for root - using an empty one

    Select an editor. To change later, run 'select-editor'.
    1. /bin/ed
    2. /bin/nano <---- easiest
    3. /usr/bin/vim.basic
    4. /usr/bin/vim.tiny

    Choose 1-4 [2]: 3
    crontab: installing new crontab

    I added this line and copied it to /etc/cron.daily/

    0 1 * * * /usr/bin/rsync -r /data/ /backups/`date +%w-%A`

    crontab -l > pi-backup
    mv /root/pi-backup /etc/cron.daily
    run-parts /etc/cron.daily

    Note, I had to add #!/bin/bash after I copied and remove the timing of the job.

    Also, check to see if rsync is installed with which rsync and apt-get install rsync.

    This enables backups on a daily basis rotating every 7 days.

    Check back on the following day to see your backups

    root@raspberrypi:~# /usr/bin/rsync -r /data/ /backups/`date +%w-%A`
    root@raspberrypi:~# find /backups
    /backups
    /backups/lost+found
    /backups/0-Sunday
    /backups/0-Sunday/startup.sh

    Good luck, I hope this helps you with your Raspberry Pi.

    References

  • Cups and Raspberry Pi – How to setup your print server

    Print Server is one of those things that makes life easier.  I hooked up my Raspberry Pi and a Docker image in order to have a CUPS server and the Bonjour configuration.

    Login to the Raspberry Pi and switch to root (sudo -s or sudo su –)

    Check lsusb to see if you can see the USB device.

     root@raspberrypi:~# lsusb 
    Bus 001 Device 005: ID 046d:c52b Logitech, Inc. Unifying Receiver
    Bus 001 Device 004: ID 8564:1000 Transcend Information, Inc. JetFlash
    Bus 001 Device 006: ID 0424:7800 Standard Microsystems Corp.
    Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
    Bus 001 Device 002: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    root@raspberryp:~#

    If you don’t see it, check to see that the device is properly plugged in.

    Check again, and you’ll see your manufacture for your printer listed. (highlighted in red)

     root@raspberrypi:~# lsusb 
    Bus 001 Device 007: ID 03f0:7411 Hewlett-Packard
    Bus 001 Device 005: ID 046d:c52b Logitech, Inc. Unifying Receiver
    Bus 001 Device 004: ID 8564:1000 Transcend Information, Inc. JetFlash
    Bus 001 Device 006: ID 0424:7800 Standard Microsystems Corp.
    Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
    Bus 001 Device 002: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    root@raspberrypi:~#

    Further, I am able to see the exact model that is connected:

     root@raspberrypi:~# lsusb -v | grep -A 20 Hewlett-Packard 
    Bus 001 Device 007: ID 03f0:7411 Hewlett-Packard
    Device Descriptor:
      bLength                18
      bDescriptorType         1
      bcdUSB               2.00
      bDeviceClass            0 (Defined at Interface level)
      bDeviceSubClass         0
      bDeviceProtocol         0
      bMaxPacketSize0        64
      idVendor           0x03f0 Hewlett-Packard
      idProduct          0x7411
      bcdDevice            1.00
      iManufacturer           1 HP
      iProduct                2 Photosmart C4600 series
      iSerial                 3 |||MASKED|||MASKED|||MASKED|||

    I’ll use these details downstream in order to install and use the HP driver.

    If you still don’t see the USB device, you should check dmesg and look at the pattern for USB.

     [3077006.701281] usb 1-1.2: new high-speed USB device number 7 using dwc_otg
    [3077006.831891] usb 1-1.2: New USB device found, idVendor=03f0, idProduct=7411
    [3077006.831908] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
    [3077006.831917] usb 1-1.2: Product: Photosmart C4600 series
    [3077006.831925] usb 1-1.2: Manufacturer: HP

    If you don’t see it, unplug and plug the device back in.

    You can also use usb-devices

     T:  Bus=01 Lev=02 Prnt=02 Port=01 Cnt=02 Dev#=  7 Spd=480 MxCh= 0
    D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
    P:  Vendor=03f0 ProdID=7411 Rev=01.00
    S:  Manufacturer=HP
    S:  Product=Photosmart C4600 series
    S:  SerialNumber=<<>><<>>
    C:  #Ifs= 4 Cfg#= 1 Atr=c0 MxPwr=2mA
    I:  If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=cc Prot=00 Driver=(none)
    I:  If#= 1 Alt= 0 #EPs= 2 Cls=07(print) Sub=01 Prot=02 Driver=usblp
    I:  If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
    I:  If#= 3 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage

    Copy the Dockerfile and the cupsd file locally (in the folder etc-cups/cupsd.conf). Cupsd is configured to listen on all interfaces: Listen 0.0.0.0:631

    Build the Docker image (based off of this image https://github.com/a0js/rpi-cups and uses a different base image https://hub.docker.com/r/arm32v7/debian/ ) docker build -t cups-pi/cups-pi .

     root@raspberrypi:/data/cups-printer# docker build -t cups-pi/cups-pi . 
    Sending build context to Docker daemon  8.192kB
    Step 1/9 : FROM arm32v7/debian:latest
     ---> 64b4748d266b
    Step 2/9 : ENV DEBIAN_FRONTEND noninteractive
     ---> Using cache
     ---> 38ebdf2f5bb6
    Step 3/9 : RUN apt-get update && apt-get install -y   sudo   locales   whois   cups   cups-client   cups-bsd   printer-driver-all   hpijs-ppds   hp-ppd   hplip
     ---> Using cache
     ---> 0b5b9eac6cef
    Step 4/9 : RUN sed -i "s/^#\ \+\(en_US.UTF-8\)/\1/" /etc/locale.gen && locale-gen en_US en_US.UTF-8
     ---> Using cache
     ---> fd55737901b8
    Step 5/9 : ENV LANG=en_US.UTF-8   LC_ALL=en_US.UTF-8   LANGUAGE=en_US:en
     ---> Using cache
     ---> d6cd104b40ec
    Step 6/9 : RUN useradd   --groups=sudo,lp,lpadmin   --create-home   --home-dir=/home/print   --shell=/bin/bash   --password=$(mkpasswd print)   print   && sed -i '/%sudo[[:space:]]/ s/ALL[[:space:]]*$/NOPASSWD:ALL/' /etc/sudoers   && apt-get clean   && rm -rf /var/lib/apt/lists/*   && mkdir /var/lib/apt/lists/partial
     ---> Using cache
     ---> 156dcd02e397
    Step 7/9 : COPY etc-cups/cupsd.conf /etc/cups/cupsd.conf
     ---> e1624a96970e
    Step 8/9 : EXPOSE 631
     ---> Running in a16705e0f3d9
    Removing intermediate container a16705e0f3d9
     ---> 60758af63011
    Step 9/9 : ENTRYPOINT ["/usr/sbin/cupsd", "-f"]
     ---> Running in add02d421ea9
    Removing intermediate container add02d421ea9
     ---> 8c6fe42423c8
    Successfully built 8c6fe42423c8
    Successfully tagged cups-pi/cups-pi:ltest

    Run the Docker image to start the print server

    root@raspberrypi:/data/cups-printer# docker run -d -p 631:631 --privileged -v /var/run/dbus:/var/run/dbus -v /dev/bus/usb:/dev/bus/usb -h myhostm.mydomain.org --name cupsm cups-pi/cups-pi:latest
    fe6d9bc34c66911f05b011ef185fce95947efb965e90ef2b4ecdd0f1c3a32d68

    It’s important to use the -h if you want to remotely access via hostname.

    Login to the console http://myserver.mydomain.org:631/admin using print:print

    Click Add Printer

    Select a local printer “HP Photosmart C4600 series (HP Photosmart C4600 series)”

    Click Continue

    Click Share This Printer

    Click Continue

    Click Add Printer

    Select Media Type – Letter

    Click Set Default Options

    Click Add

    When you find the Printer, you can add the printer

    You now have an image ready for use with a CUPS printer.  (If you rebuild, you may have to re-setup the default printer…. Just warning you ahead of time).  You can always look at http://myhost.mydomain.org:631/printers/HP_Photosmart_C4600_series

    If you need to connect to the console, you can look at the docker ps

    root@raspberrypi:/data/cups-printer# docker ps
    CONTAINER ID        IMAGE                    COMMAND                CREATED             STATUS              PORTS                                    NAMES
    fe6d9bc34c66        cups-pi/cups-pi:latest   "/usr/sbin/cupsd -f"   5 minutes ago       Up 5 minutes        0.0.0.0:631->631/tcp                     cups

    Extract the CONTAINER ID, and look at the /bin/sh

    root@raspberrypi:/data/cups-printer# docker exec
    -i -t fe6d9bc34c66 /bin/sh

    Then look at the /var/log/cups files, specifically the error_log

    Reference

    List USB Devices Linux https://linuxhint.com/list-usb-devices-linux/

    Dockerfile https://github.com/a0js/rpi-cups https://github.com/ryansch/docker-cups-rpi https://github.com/aadl/docker-cups/blob/master/2.2.1/Dockerfile

    Arm 7 https://hub.docker.com/r/arm32v7/debian/

    Cupsd.conf https://raw.githubusercontent.com/a0js/rpi-cups/master/etc-cups/cupsd.conf https://wiki.archlinux.org/index.php/CUPS/Printer_sharing

    SSL / Advanced Configuration http://chschneider.eu/linux/server/cups.shtml http://192.168.86.176:631/admin (use IP if receiving a bad request indicator to the admin interface)

    Advanced Ubuntu Configuration https://help.ubuntu.com/lts/serverguide/cups.html.en

  • Raspberry Pi – Part IV – Simple Wiring Test

    I am plugging away working with my Pi. I went back to the Ada Fruit Site, and started working on one of the tutorials from the part I purchased – https://www.adafruit.com/products/2125   I want to be able to demonstrate a simple wiring with my Pi works.

    I selected Email Notifier. I read through it, and realized I needed to convert it to work for the B+ model. The pi4j website has a nice diagram for the pins http://pi4j.com/images/j8header-b-plus-large.png and I simplified the test a bit.

    I launched the simple python file

    pi@seconds ~ $ sudo python testPi.py

    Pi with a Green Light - Using Python
    Pi with a Green Light – Using Python

    I added the pi4j dependency to my maven pom

    <dependency>
        <groupId>com.pi4j</groupId>
        <artifactId>pi4j-core</artifactId>
       <version>1.0</version>
    </dependency>

    I create a servlet which replicated the same code from before (GPIO).

    I copied the war file to the local webapp directory, and restarted jetty

    pi@seconds /opt/jetty/web/bbq/webapps $ sudo cp ~/pi.webapp.war ./
    pi@seconds /opt/jetty/web/bbq/webapps $ sudo chown jetty:jetty pi.webapp.war
    pi@seconds /opt/jetty/web/bbq/webapps $ sudo /etc/init.d/jetty restart

    Refer to https://wiki.eclipse.org/Jetty/Howto/Deploy_Web_Applications  and I did have to add –module=jsp to the start.ini for my web configuration.

    I hit the servlet – http://192.168.1.200/pi.webapp/Control?status=true

    Exception
    Exception

    Which makes sense, since “Software using the Pi4J library must be run with ROOT level permissions.” (actually it doesn’t since I am running as root)…

    Issues remain.  I’ll tackle them on a different day 🙂   … Part 5 …

  • Raspberry Pi – Part III – Setting up Jetty

    The Raspberry Pi is a device that has so many options open: You can extend the hardware. You can extend the software. I choose to tackle extending the software to start, so I can get the experience that I want setup, and running on the device.  The experience I am after is the web interface to control my Raspberry Pi.

    For a Java developer, I conclude that a lightweight interface hosted on a Jetty server is probably easiest.  The Jetty server is a 12.9M download and 30M expanded. It’s also used frequently in devices, and why reinvent the wheel, use the approach that Industry is using.  Jetty is designed for a small memory footprint.   (I did consider using Tomcat Embedded, and came to the conclusion I’d probably want to many features.)

    I downloaded the Jetty archive to my local user’s directory. Note, since I want to just use jetty.zip I’m renaming the output file with wget -O.

    wget -O jetty.zip http://download.eclipse.org/jetty/stable-9/dist/jetty-distribution-9.2.10.v20150310.zip

    I make a directory for the application server, and move over jetty.zip to that directory.

    sudo mkdir -p /opt/jetty
    sudo mv jetty.zip /opt/jetty

    Next I launched into the sudoers root shell, and extract the Jetty archive.  I decided to move it into the runtime folder, so I can have an easy place to backup from.  (Remove the extra space from the .zip)

    sudo -s 
    cd /opt/jetty
    unzip jetty.zip
    mv jetty-distribution-9.2.10.v20150310/ runtime
    rm jetty.zip

    Next, I wanted to setup Jetty as a service, and check that Jetty starts

    cp runtime/bin/jetty.sh /etc/init.d/jetty
    echo JETTY_HOME=`pwd`/runtime > /etc/default/jetty
    service jetty start
    Starting Jetty: . . . OK Sun Apr 12 15:38:40 UTC 2015
    service jetty stop
    Stopping Jetty: OK

    Next, I want to automatically start Jetty with the right runlevels

    update-rc.d jetty defaults

    I want to configure Jetty to run with a set user jetty.

    mkdir -p /opt/jetty/web/bbq
    mkdir -p /opt/jetty/temp
    useradd --user-group --shell /bin/false --home-dir /opt/jetty/temp jetty

    There is a base configuration that needs to be setup the base site.

    cd /opt/jetty/web/bbq
    java -jar /opt/jetty/runtime/start.jar --add-to-start=deploy,http,logging

    Next, edit the default port value.

    vi start.ini
    
    ## HTTP port to listen on
    jetty.port=80

    Finally, I wrap the configuration of the jetty service and app.

    chown -R jetty:jetty /opt/jetty
    echo "JETTY_HOME=/opt/jetty/runtime" > /etc/default/jetty
    echo "JETTY_BASE=/opt/jetty/web/bbq" >> /etc/default/jetty
    echo "TMPDIR=/opt/jetty/temp" >> /etc/default/jetty

    A good check is to look at service jetty status, and confirm the settings, and then restart your Raspberry Pi. I did find that the startup time was significantly effected by the additional service.  ( +25 seconds from the original 15)

    Navigate to http://192.168.1.200/ (or whatever IP you have used) and confirm the page loads Jetty.  If you see a 404, you’re off and ready for the next phase. (as am I) 🙂

    Jetty Starting Point
    Jetty Starting Point

  • Raspberry Pi – Part II – Get Up and Going with Java

    In recent weeks, I haven’t revisited the Raspberry Pi – Running, Vacation, Work have conspired to keep me away from hobby project.

    I’ve stared at the parts long enough, and decide to plug the Raspberry Pi base into the wired network. I plugged in the Raspberry Pi into the Power outlet, and I got the Red Light.  I logged into my router to see if the Pi picked up the Raspberry Pi, and I found the IP from my routers IP reservations table.   I was able to SSH into the Pi and quickly check the release version ( cat issue ) – Raspbian GNU/Linux 7 \n \l.

    Headless + SSH + Version

    I turned on the SSH server using sudo raspi-config and the advanced options.

    The first thing I thought – Upgrade / Update to get the latest environment for the Raspberry Pi.  It’s a good start – always good to be up-to-date. Per the documentation, it may be necessary to run – sudo apt-get clean.

    sudo apt-get upgrade
    sudo apt-get update

    The raspi-config is another item that may need to be updated.   The update goes out and queries for the latest raspi-config, installs and relaunches the raspi-config.

    sudo raspi-config
    Select Option 8 - Advanced Options
    Selection Option A0 - Update 
    Select Yes

    raspi-config
    raspi-config

    Next, I looked updated the Java version.  From reading the documentation, the next versions of the Pi are going to automatically include the Java installs.

    sudo apt-get update && sudo apt-get install oracle-java7-jdk

    Java Installation
    Java Installation

    I grabbed the Pi4J project jar files. The Pi4J is an opensource project which has some great details on PINOUT and boilerplate java code to access the underlying pin readouts.  I ran some quick code to get the latest snapshot installed.

    wget http://get.pi4j.com/download/pi4j-1.1-SNAPSHOT.deb
    sudo dpkg -i pi4j-1.1-SNAPSHOT.deb

    WGET
    WGET

    dpkg
    dpkg

    Pi4J is also installed on the Sonatype repositories and developed on GitHub.  Pi4J includes a script for managing updates.   It’s very convenient with the Apache 2.0 License.

    I was ready run a sample program – Get Sample, Compile and Run.

    wget https://raw.githubusercontent.com/Pi4J/pi4j/master/pi4j-example/src/main/java/ListenGpioExample.java
    pi4j ListenGpioExample.java
    pi4j -run ListenGpioExample

    First Sample
    First Sample

    Eventually, I am going to get to the point where I use the diagram from Pi4j.  The future efforts are going to take some time to get to – This step was the right step in the direction I want to go.  BBQ Champion.