I call this nonsense host ‘Ghost’, for me it’s similar to a tape backup solution. Fairly simple concept, it’s an old Pi1 + external mechanical drive that sits dormant with its ethernet off. Once a month, at a random time and random date it enables the ethernet, spins up the drive and pulls data from the main server to update its drive then goes black until next month. The only way to check or maintain the pi is a push button that toggles the ethernet interface. I slapped it together with some scrap wood, spare hardware and screwed it to a 2x4 in a dark corner of my basement. It’s my 5th string backup, the ultimate insurance policy because I’m mental.
Sorry, I forgot to post the scripts. I’m a meathead electrical engineer so I don’t use GIT or anything so here is the code dump. To summarize the setup’s software:
The backup script is fairly boring, just runs rsync and pushes the rsync log files back to the primary server. If it fails it sends me an email before turning the ethernet back off and going black.
#So here is my python code that runs the button press:
#!/usr/bin/env python import RPi.GPIO as GPIO import subprocess import time from multiprocessing import Process #when this script first runs, at boot, disable ethernet time.sleep(5) #wait 5 seconds for system to boot, then try and disable ethernet. subprocess.call(['/home/pi/ethernet_updown.sh'], shell=False) GPIO.setmode(GPIO.BCM) GPIO.setup(3, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(22, GPIO.OUT) #controls TFT display backlight GPIO.setup(23, GPIO.IN) #pull up or down is optional, the TFT display buttons have a hardware 10k pull up. Measure low tranisitions GPIO.setup(24, GPIO.IN) #watches the button mounted above the USB port, in the Pi's case. def case_button_watch(): while True: GPIO.wait_for_edge(3, GPIO.FALLING) #wait 100ms then check if its still low, debounce timer time.sleep(.100) if GPIO.input(3) == GPIO.LOW: #do something as it's a button press print('Button is pressed!') time.sleep(.900) if GPIO.input(3) == GPIO.LOW: #if the button is pressed for over 1 second its a long press. Run the backup script print('Button long press (greater than 1 second), running an unscheduled backup') subprocess.call(['/home/pi/backup.sh'], shell=False) else: #the press was greater than 100mS but less than 1000mS, just toggle the ethernet print('Button short press (less than 1 second), toggling the ethernet') subprocess.call(['/home/pi/ethernet_updown.sh'], shell=False) else: #do nothing as its interference print('GPIO3 debounce failed, it was noise') #watches the buttons in the TFT display def TFT_display_button1(): while True: GPIO.wait_for_edge(23, GPIO.FALLING) #wait 100ms then check if its still low, debounce timer time.sleep(.100) if GPIO.input(23) == GPIO.LOW: #do something as it's a button press print('Button GPIO23 is pressed!') GPIO.output(22, GPIO.HIGH) #turn the backlight ON else: #do nothing as its interference print('GPIO23 debounce failed, it was noise') #watches the buttons in the TFT display def TFT_display_button2(): while True: GPIO.wait_for_edge(24, GPIO.FALLING) #wait 100ms then check if its still low, debounce timer time.sleep(.100) if GPIO.input(24) == GPIO.LOW: #do something as it's a button press print('Button GPIO24 is pressed!') GPIO.output(22, GPIO.LOW) #turn the backlight OFF else: #do nothing as its interference print('GPIO24 debounce failed, it was noise') if __name__ == '__main__': #run three parallel processes to watch all three buttons with software debounce proc1 = Process(target=case_button_watch) proc1.start() proc2 = Process(target=TFT_display_button1) proc2.start() proc3 = Process(target=TFT_display_button2) proc3.start()
#bash script that toggles the ethernet - if its on, it turns it off. if its off, it turns it on:
#!/bin/bash if sudo ifconfig | grep 'eth0' | grep 'RUNNING' > /dev/null; then wall -n "$(date +"%Y%m%d_%H%M%S"):Ethernet going down" sudo ifconfig eth0 down else wall -n "$(date +"%Y%m%d_%H%M%S"):Ethernet going up" sudo ifconfig eth0 up fi
I very much feel the desire to stay away from Git repos for singular scripts like this. Maybe consider making it a gist though. Easier to keep track of by starring it in GitHub and perhaps even iterate on it in the future. :)
I use Joplin notes to track my code revisions. It’s incredibly crude but it works and keeps my documention private and is also my wiki for each server so I know what the heck I setup and did.