grep -Fxv -f first-file.txt second-file.txt
Basically looks for all lines in second-file.txt which don’t match any line in first-file.txt. Might be slow if the files are large.
grep -Fxv -f first-file.txt second-file.txt
Basically looks for all lines in second-file.txt which don’t match any line in first-file.txt. Might be slow if the files are large.
This is a very basic step-by-step guide to create a CentOS7 NFS server that shares a folder /nfsshare over 192.168.4.0/24 network. This share will be owned by apache and mountable on a CentOS web server.
Here the instructions how to create the server and how to setup the client.
Add this line in IPTABLES:
-A INPUT -s 192.168.4.0/24 -m comment --comment "NFS Network" -j ACCEPT
Run the following to create a share folder and setup NFS:
mkdir /nfsshare yum install nfs-utils nfs-utils-lib -y systemctl enable nfs-server echo "/nfsshare 192.168.4.0/24(rw,sync,no_root_squash)" >> /etc/exports sed -i 's/#Domain = local.domain.edu/Domain = nfsdomain.loc/' /etc/idmapd.conf systemctl start rpcbind systemctl start nfs-server # Create apache user/group # (NFS clients will read/write using this user so we want to have # the same set also on the server for an easier ownership management) groupadd -g 48 apache useradd -g 48 -u 48 apache
e.g. assuming that NFS server’s IP is 192.168.4.1
Add this line in IPTABLES:
-A INPUT -s 192.168.4.0/24 -m comment --comment "NFS Network" -j ACCEPT
Then, run this:
yum install nfs-utils rpcbind sed -i 's/#Domain = local.domain.edu/Domain = nfsdomain.loc/' /etc/idmapd.conf echo "192.168.4.1 NFS01" >> /etc/hosts mount -t nfs4 -o noatime,proto=tcp,actimeo=3,hard,intr,acl,_netdev NFS01:/nfsshare tail -1 /proc/mounts >> /etc/fstab
NOTE: we are hardly mapping the NFS server’s IP in /etc/hosts to make easier to recognise the mount (in case of multiple mounts).
If you are facing the issue where you mount /nfsshare and you see the owner of the files and folders showing as nobody:nobody, it could be related to rpcidmapd and DNS. To fix this, try to update /etc/hosts on the Client with <hostname>.nfsdomain.loc
# ============= # # Ubuntu Notes # # ============= # !! Same users on Server and Client - for the exported partition !! SERVER apt-get install nfs-kernel-server vim /etc/exports /var/www/vhosts 192.168.3.*(rw,sync,no_root_squash,no_subtree_check) service nfs-kernel-server restart exportfs -a CLIENT apt-get install nfs-common mount -t nfs4 192.168.3.1:/var/www/vhosts /var/www/vhosts/ !! CHECK the output of cat /proc/mounts and you can get the correct rsize/wsize. If the firewall/network can handle, keep this value as big as possible: e.g. noatime,proto=tcp,actimeo=3,hard,intr,acl,_netdev,rsize=1048576,wsize=1048576 vim /etc/fstab 192.168.3.1:/var/www/vhosts /var/www/vhosts nfs4 noatime,actimeo=3,hard,intr,acl,_netdev,rsize=32768,wsize=32768 0 0
# VSFTPD chroot configuration
>> Create a no-shell user
useradd -d $HOME_PATH -s /sbin/nologin $FTPUSER && passwd $FTPUSER
!!!MAKE SURE TO CHMOD 755 the parent directory!!!
yum -y install vsftpd
chkconfig vsftpd on
sed -i -e 's/IPTABLES_MODULES=""/IPTABLES_MODULES="ip_conntrack_ftp"/g' /etc/sysconfig/iptables-config
modprobe ip_conntrack_ftp
echo "rack" >> /etc/vsftpd/vsftpd.chroot_list
mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.ORIG
cat >/etc/vsftpd/vsftpd.conf <<EOF
# vsftpd.conf - PASSIVE
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
listen_port=21
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
pasv_min_port=60000
pasv_max_port=65000
# Add in /etc/vsftpd/vsftpd.chroot_list who you do *NOT* want to be chrooted
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/vsftpd.chroot_list
# RackConnect
# pasv_enable=YES
# pasv_min_port=60000
# pasv_max_port=60100
# pasv_address=<publicRCip> (might not be required)
# Logging
xferlog_enable=YES
log_ftp_protocol=NO
syslog_enable=NO
vsftpd_log_file=/var/log/vsftpd.log
EOF
>> Make sure to comment out "auth required pam_shells.so" in /etc/pam.d/vsftpd (errors in authenticate users with /bin/false shell):
sed -i 's/^\(auth.*required.*pam_shells\.so.*$\)/#\1/' /etc/pam.d/vsftpd
>> Enable firewall ports (in Rackconnect, open the same on the physical firewall):
iptables -I INPUT -p tcp --dport 21 -m comment --comment "FTP" -j ACCEPT
iptables -I INPUT -p tcp -m multiport --dports 60000:65000 -m comment --comment "FTP passive mode ports" -j ACCEPT
/etc/init.d/iptables save
>> Restart the service
service vsfptd restart
If -> vsftpd: refusing to run with writable root inside chroot ()
=> allow_writable_chroot=YES
=======================================================
SFTP Jailed:
!!!! remember that the users home directory must be owned by root
groupadd sftponly
>> 1 domain managed by 1 or more users:
useradd -d /var/www/vhosts -s /bin/false -G sftponly bob
>> 1 user managing multiple domains:
useradd -d /var/www/vhosts -s /bin/false -G sftponly bob
SFTPUSER=bob
SFTPUSERPASS=$(tr -cd '[:alnum:]' < /dev/urandom | fold -w12 | head -n1)
echo "$SFTPUSERPASS" | passwd --stdin $SFTPUSER && echo -e "\nsfptuser: $SFTPUSER\npassword: $SFTPUSERPASS"
>> /etc/ssh/sshd_config
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
>> 1 domain managed by 1 or more users:
Match Group sftponly
ChrootDirectory %h
X11Forwarding no
AllowTCPForwarding no
ForceCommand internal-sftp
>> 1 user managing multiple domains:
Match Group sftponly
ChrootDirectory /var/www/vhosts/%u
X11Forwarding no
AllowTCPForwarding no
ForceCommand internal-sftp
sshd -t
service sshd restart
>> Set correct permissions!!!
chmod 755 /var/www/
chown root:root /var/www
chown -R root:sftponly /var/www/*
find /var/www/ -type d | xargs chmod 2775
find /var/www/ -type f | xargs chmod 644
Manually create list.txt with user:doc_root
e.g.:
mydomain.com:/var/www/vhost/mydomain.com example.com:/var/www/vhost/example.com
Get commands to create FTP users
cat list.txt | awk -F: '{print "useradd -d ",$2, "-s /bin/false -c TICKET_NUMBER ",$1 }'
Get commands to set FTP permissions (if doc_root exists already)
cat list.txt | awk -F: '{print "chown -R",$1, $2 }'
Generate and Assign random passwords to the users.
# for USER in $(awk -F: '{print $1}' list.txt) ; do PASS=$(tr -cd '[:alnum:]' < /dev/urandom | fold -w12 | head -n1) ; echo $PASS | passwd --stdin $USER ; echo -e "username: $USER\npassword: $PASS\n" | tee -a pass.txt ; done ; echo -e "\n========================\nHere the credentials:" ; cat pass.txt
Create a list of vhosts’ paths: vhosts.txt
Example with only .com domains:
/var/www/domain1.com
/var/www/domain2.com
/var/www/domain3.com
Use a regex for sed to extract the vhost name, removing dots (example based on the example above)
This will return a list of PATH and VHOSTNAME. We will use VHOSTNAME as USER for that path
for i in `cat vhosts.txt` ; do echo "$i" | tr '\n' ' ' ; echo "$i" | sed 's/^.*www\/\(.*\)com.*$/\1/' | sed 's/\.//g' ; done >> list.txt
Print out the commands to run to add FTP users (no SSH)
Once checked the output, run these lines
cat list.txt | awk '{print "useradd -d ",$1, "-s /bin/false -c COMMENT_HERE ",$2 }'
(for sftp only):
cat list.txt | awk '{print "useradd -d ",$1, "-s /bin/false -G sftponly -cCOMMENT_HERE ",$2 }'
This will print out commands to run to assign user:apache_group to the vhosts’ paths
cat list.txt | awk '{print "chown -R ",$2 ":www-data ",$1 }'
(for sftp only):
cat list.txt | awk '{print "chown root:root",$1 }'
cat list.txt | awk '{print "chown -R ",$2":"$2 ,$1"/*"}'
Set g+s on vhosts to preserve directory owner
[TO CHECK]
for i in `cat list.txt` ; do echo "chmod g+s $i" ; done
[THIS EXECUTE]
for i in `cat list.txt` ; do chmod g+s "$i" ; done
Create list of random passwords using pwgen
for i in `cat list.txt` ; do p=$(pwgen -s -B 16 1) ; echo "$i:$p" ; done > list_u_p.txt
Create list of random passwords using openssl
for i in `cat list.txt` ; do p=$(openssl rand -base64 12) ; echo "$i:$p" ; done > list_u_p.txt
Apply these passwords automatically
for i in `cat list_u_p.txt` ; do USER=`echo "$i" | awk -F":" '{print $1}'` ; PASS=`echo "$i" | awk -F":" '{print $2}'` ; echo -e "$PASS\n$PASS" | passwd "$USER" ; done
Print output for reference
hostname ; cat list_u_p.txt | awk -F":" '{print "\nusername:", $1, "\npassword:", $2}'
There are multiple ways to make your mac mounting shares at login.
What I was trying to achieve is mounting Documents, Desktop and all the main data folders shared from my Linux host machine into my MAC VM.
And yes, I’m running MAC OS within a VMWare Virtual Machine from an Ubuntu computer.
Here the way that worked for me 🙂
Create a bash script called mount_all.sh with all your lines and I have stored it into /Users/macuser:
#!/bin/bash sudo mount -t vmhgfs .host:/Desktop /Users/macuser/Desktop sudo mount -t vmhgfs .host:/Documents /Users/macuser/Documents sudo mount -t vmhgfs .host:/Downloads /Users/macuser/Downloads sudo mount -t vmhgfs .host:/Movies /Users/macuser/Movies sudo mount -t vmhgfs .host:/Music /Users/macuser/Music sudo mount -t vmhgfs .host:/Pictures /Users/macuser/Pictures
Than, I have created the following file in /Library/LaunchAgents/ (as root) called com.vmware.launchd.z-custom-mount.plist:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.vmware.custom-mount</string> <key>Program</key> <string>/Users/macuser/mount_all.sh</string> <key>RunAtLoad</key> <true/> </dict> </plist>
After, I have verified that the syntax was ok with this plutil command:
root:/Library/LaunchAgents # plutil com.vmware.launchd.z-custom-mount.plist com.vmware.launchd.z-custom-mount.plist: OK
Last step is to load the file:
launchctl load com.vmware.launchd.z-custom-mount.plist
DONE!
At your next boot, once login, the script mount_all.sh will be executed 🙂
The nice thing here is that you have the flexibility to add/remove shares simply modifying that script, without really need to change any System configuration.
NOTE: I had to add this in visudo
macuser ALL=(ALL) NOPASSWD: /sbin/mount,/sbin/umount
sed -e '/MatchThisString/ s/^/#/' -i file
This will add a # in front of all the lines that are matching the string “MatchThisString“
How to configure automatic updates on your raspberry pi and make sure it reboots in the night (if required)
apt-get install unattended-upgrades apt-listchanges sed -i 's/^\/\/ "o=Raspbian,n=jessie"/ "o=Raspbian,n=jessie"/g' /etc/apt/apt.conf.d/50unattended-upgrades sed -i 's/^\/\/Unattended-Upgrade::Mail "root";/Unattended-Upgrade::Mail "root";/g' /etc/apt/apt.conf.d/50unattended-upgrades sed -i 's/^\/\/Unattended-Upgrade::Automatic-Reboot "false";/Unattended-Upgrade::Automatic-Reboot "true";/g' /etc/apt/apt.conf.d/50unattended-upgrades sed -i 's/^\/\/Unattended-Upgrade::Automatic-Reboot-Time "02:00";/Unattended-Upgrade::Automatic-Reboot-Time "02:00";/g' /etc/apt/apt.conf.d/50unattended-upgrades tee /etc/apt/apt.conf.d/20auto-upgrades > /dev/null <<EOF APT::Periodic::Update-Package-Lists "1"; APT::Periodic::Unattended-Upgrade "1"; EOF
Check the next day the log /var/log/unattended-upgrades/unattended-upgrades.log to see if it worked 🙂
Source: here
Do you want to command your Raspberry Pi via Whatsapp and have this system monitored and brought up by Nagios in case it dies?
Follow this guide! 🙂
Step 1: Put your SIM in the phone and make sure the SIM can receive text messages (no data is required)
Step 2: Install/configure your Raspberry Pi
To make all this magic happening, we’re going to use Yowsup
Here some easy steps to install on Raspian: (you can use also pip install yowsup2):
$ sudo apt-get install git python-dev libncurses5-dev $ git clone git://github.com/tgalal/yowsup.git $ cd yowsup $ sudo python setup.py install
Once installed, you need to register your phone number, extract the password and use it to configure the following scripts.
To register, create a file called mydetails and add the following (replace country code and phone number accordingly):
cc=44 phone=447711111123
After that, run this:
python yowsup-cli registration --config mydetails --requestcode sms
You should receive a text on your phone with a 6 digits code (xxx-xxx format). Use the following command to get the password:
python yowsup-cli registration --config mydetails --register xxx-xxx
After a little while, you should see some output like this:
status: ok kind: free pw: 9BkIpOaLpCk1LxuQIK8Vrt6XwNkj= price: 0.79 price_expiration: 1434674994 currency: GBP cost: 0.79 expiration: 1463544490 login: 4425784541474 type: new
Grab the pw bit and add append to your mydetails file:
cc=44 phone=447711111123 password=9BkIpOaLpCk1LxuQIK8Vrt6XwNkj=
Now you can test using the below bash script (demo.sh):
#!/bin/bash echo -e "\e[31m" echo 'Once you get the prompt just use /L to go online' echo 'After that you can send a message in this way:' echo '/message send 449988776655 "Hello from the Raspberry Pi!"' echo -e "\e[0m\n" yowsup-cli demos --yowsup --config mydetails
All should (hopefully) work! 🙂
The following scripts and configurations are based on the following:
In /home/piuser/WhatsappOnPi/scripts create the following scripts:
This script is the one that keeps layer.py script up and running.
from yowsup.stacks import YowStackBuilder
from yowsup.common import YowConstants
from yowsup.layers import YowLayerEvent
from layer import EchoLayer
from yowsup.layers.auth import YowAuthenticationProtocolLayer
from yowsup.layers.coder import YowCoderLayer
from yowsup.layers.network import YowNetworkLayer
from yowsup.env import YowsupEnv
from mysettings import *
#Uncomment to log
#import logging
#logging.basicConfig(level=logging.DEBUG)
CREDENTIALS = (phone, password)
if __name__== "__main__":
stackBuilder = YowStackBuilder()
stack = stackBuilder\
.pushDefaultLayers(True)\
.push(EchoLayer)\
.build()
stack.setProp(YowAuthenticationProtocolLayer.PROP_CREDENTIALS, CREDENTIALS) #setting credentials
stack.broadcastEvent(YowLayerEvent(YowNetworkLayer.EVENT_STATE_CONNECT)) #sending the connect signal
stack.setProp(YowNetworkLayer.PROP_ENDPOINT, YowConstants.ENDPOINTS[0]) #whatsapp server address
stack.setProp(YowCoderLayer.PROP_DOMAIN, YowConstants.DOMAIN)
stack.setProp(YowCoderLayer.PROP_RESOURCE, YowsupEnv.getCurrent().getResource()) #info about us as WhatsApp client
stack.loop( timeout = 0.5, discrete = 0.5 )
This script is the main one that you need to customise as you’d like:
# -*- coding: utf-8 -*-
import os, subprocess, time, re
from yowsup.layers import YowLayer
from yowsup.layers.interface import YowInterfaceLayer, ProtocolEntityCallback
from yowsup.layers.protocol_messages.protocolentities import TextMessageProtocolEntity
from yowsup.layers.protocol_receipts.protocolentities import OutgoingReceiptProtocolEntity
from yowsup.layers.protocol_acks.protocolentities import OutgoingAckProtocolEntity
from mysettings import *
ap = set(allowedPersons)
# Message on Start Up
startcommand='yowsup-cli demos -l %s:%s -s %s "*[INFO] System Started*: `uptime`" 2>&1 > /dev/null ' % (phone, password, destphone)
subprocess.call(startcommand , shell=True)
def sendMessage(self, messageProtocolEntity, msg):
outgoingMessageProtocolEntity = TextMessageProtocolEntity(
''+msg+'',
to = messageProtocolEntity.getFrom())
self.toLower(outgoingMessageProtocolEntity)
class EchoLayer(YowInterfaceLayer):
@ProtocolEntityCallback("message")
def onMessage(self, messageProtocolEntity):
#send receipt otherwise we keep receiving the same message over and over
if True:
receipt = OutgoingReceiptProtocolEntity(messageProtocolEntity.getId(), messageProtocolEntity.getFrom(), 'read', messageProtocolEntity.getParticipant())
self.toLower(receipt)
if messageProtocolEntity.getFrom(False) in ap:
message_body = messageProtocolEntity.getBody().lower().strip(' \t\r\n\0')
#print (message_body)
# Local System Control
if 'help' in (message_body):
msg='Commands available:\nrestart <device>\nuptime\ndf\nlast\nrouter'
sendMessage(self, messageProtocolEntity, msg)
#elif 'reboot' in (message_body):
# result=subprocess.check_output(["sudo", "reboot"])
# msg='reboot: '+result+''
# sendMessage(self, messageProtocolEntity, msg)
elif 'uptime' in (message_body):
result=subprocess.check_output(["uptime"])
msg=''+result+''
sendMessage(self, messageProtocolEntity, msg)
elif 'df' in (message_body):
result=subprocess.check_output(["df", "-h"])
msg=''+result+''
sendMessage(self, messageProtocolEntity, msg)
elif 'last' in (message_body):
result=subprocess.check_output(["last"])
msg=''+result+''
sendMessage(self, messageProtocolEntity, msg)
elif 'router' in (message_body):
result=subprocess.check_output(["/usr/lib/nagios/plugins/check_router_speed"])
msg=''+result+''
sendMessage(self, messageProtocolEntity, msg)
# Reboots Control
# ---------------
# this uses a wrapper called 'restart_device'
# bash script with 'case' that issues specific commands over ssh
# to restart different hosts
elif message_body.startswith('restart'):
cmd = message_body.split('restart', 1)[1]
if 'skyhub' in (cmd):
result=subprocess.check_output(["sudo", "restart_device", "router1"])
msg=''+result+''
sendMessage(self, messageProtocolEntity, msg)
elif 'asus8uk' in (cmd):
result=subprocess.check_output(["sudo", "restart_device", "router2"])
msg=''+result+''
sendMessage(self, messageProtocolEntity, msg)
elif 'raspberrino' in (cmd):
result=subprocess.check_output(["sudo", "restart_device", "raspberrypi"])
msg=''+result+''
sendMessage(self, messageProtocolEntity, msg)
elif 'raspbxino' in (cmd):
result=subprocess.check_output(["sudo", "restart_device", "pbx"])
msg=''+result+''
sendMessage(self, messageProtocolEntity, msg)
else:
msg='Usage: restart (router1|router2|raspberrypi|pbx)'
sendMessage(self, messageProtocolEntity, msg)
else:
msg='Command '+messageProtocolEntity.getBody()+' unknown.\nUse: help'
sendMessage(self, messageProtocolEntity, msg)
else:
# Report
msg='** Alert** \nSender: '+messageProtocolEntity.getFrom()+' '+messageProtocolEntity.getBody()+''
outgoingMessageProtocolEntity = TextMessageProtocolEntity(
''+msg+'',
to = '%[email protected]' % destphone )
self.toLower(outgoingMessageProtocolEntity)
# Reply
msg='No'
sendMessage(self, messageProtocolEntity, msg)
@ProtocolEntityCallback("receipt")
def onReceipt(self, entity):
ack = OutgoingAckProtocolEntity(entity.getId(), "receipt", entity.getType(), entity.getFrom())
self.toLower(ack)
This is included in both scripts and it needs to be updated accordingly:
################################################################################################# # TO EDIT - add your phone number and password # phone="447711111123" password="9BkIpOaLpCk1LxuQIK8Vrt6XwNkj=" destphone="<your_personal_number>" #allowedPersons=['<your_personal_number>','<another_number_allowed_to_talk_with_your_pi>'] allowedPersons=['<your_personal_number>'] # #################################################################################################
Now let’s create a wrapper to start the script: /usr/local/bin/whatsapp_start
#!/bin/bash
# kill process if running
for PID in $(ps aux | grep -i "[p]ython.*whatsapp" | awk '{print $2}') ; do
kill -9 $PID > /dev/null 2>&1
done
# restart process
python /home/piuser/WhatsappOnPi/scripts/whatsapp.py &
And now let’s append this into /etc/rc.local:
echo "Starting whatsapp service" su - piuser -c /usr/local/bin/whatsapp_start
Done!
Every time we reboot the server, the script will start!
But… what happens if the script dies or something goes wrong?
Create custom plugin script for Nagios and save it in /usr/lib/nagios/plugins/check_whatsapp
NOTE: Make sure to follow the notes in this script to proper setup visudo
#!/bin/bash #################################################################################### # user 'nagios' needs to be allowed to run 'netstat' using sudo # and /usr/local/bin/whatsapp_start to run as 'piuser' # # Required lines in visudo: # # Cmnd_Alias WHATSAPP_CMD = /bin/su - piuser -c /usr/local/bin/whatsapp_start # nagios ALL=(ALL) NOPASSWD:/bin/netstat,WHATSAPP_CMD # #################################################################################### sudo netstat -pant | grep -q "ESTABLISHED.*python" if [ $? -eq 0 ] ; then echo "OK- Whatsapp is up and running" exit 0 else echo "CRITICAL- Whatsapp service stopped or not connected. Attempting restart." sudo su - piuser -c /usr/local/bin/whatsapp_start exit 2 fi
Now let’s enable this script in /etc/nagios/nrpe_local.cfg:
command[check_whatsapp]=/usr/lib/nagios/plugins/check_whatsapp
On the Nagios SERVER, let’s add the new service.
Following my current setup mentioned here, I’m going to add the following in /etc/nagios3/conf.d/hostgroups_services.cfg
#######################################################################################
# Check Whatsapp Service
define hostgroup {
hostgroup_name whatsapp-servers
alias whatsapp servers
}
define service {
hostgroup_name whatsapp-servers
service_description whatsapp service
normal_check_interval 5
retry_check_interval 2
check_command check_nrpe_1arg!check_whatsapp
use generic-service
}
#######################################################################################
When the service is configured, we need to append this service on the host where we want the check to be executed and verified (config in /etc/nagios3/conf.d/hosts.cfg – eg:)
hostgroups allservers,ssh-servers,http-servers,whatsapp-servers
A couple of restarts/reloads (nagios client and nagios server), and the check should be now visible in the web interface! 🙂
NOTE: You might see “Waiting for this message. This may take a while.” on your Whatsapp while trying to talk with your Pi. And you can wait as much as you like, but it won’t get fixed by itself.
So… how make things working again?
What I’ve done to fix it is:
This always fixed this issue for me 🙂
Apologies for the typos and mistakes. This has been published more as a note for me than a proper how-to
Source: http://www.techradar.com/how-to/computing/how-to-control-a-raspberry-pi-using-whatsapp-1315610/2
Many thanks to Paul for the initial python scripts templates 🙂
I have a Sky Hub router, the SR102 (black). Previously I had the white version as well.
Nice routers, pretty stable, but badly locked. You can change the SID of your wifi, change the password… not either sure if you can do a proper port forwarding. So… perfect for my mum, but a pain for whoever wants a little bit of extra control.
I had already an ASUS RT-N16 with DD-WRT firmware so I used the DMZ function on the Sky router to have some sort of “link” of the public IP of my broadband directly on the WAN interface of the router. In this way it’s like that is my ASUS router that does the connection and I can play as freely as I want, without caring much about the Sky router.
However, it happens that sometimes you need to give a full reboot to the main Sky router. And maybe do this automatically or via command line/script. And here it’s when things are getting more complicated.
The Sky Hub router allows you to reboot it via HTTP. Using the DMZ anyway will bypass the router itself and forward all the requests to the ASUS router. Also, I have never liked the idea to expose my router management page to the Internet, but I rather prefer to connect via SSH on a Raspberry Pi and issue commands from the terminal (telnet/ssh).
So, beside my multiple attempts to find a way to curl the button on the page, I had to find an alternative way to makes this happen. Of course, it didn’t help either to call the Sky Helpline asking if there was a remote possibility to have telnet enabled.
After a bit of talks on Facebook with some friends, here the solution: Remote Controlled Sockets with Pi-mote
Yes. If I can’t reboot from inside, let’s to that from outside!
The process was pretty straight forward.
First of all, I had to turn off my Raspberry Pi, and plug the “little green piece of board” as mentioned in here
After that, I’ve turned the pi on again, and installed the required packages. Happily I found that there is now the python library available for energenie, so I have installed them as well, making my life easier 🙂
apt-get install python-rpi.gpio python-pip pip install energenie
Once done, I have created these two basic script and I have run one a time, to configure the socket plugs.
Make sure to plug the ONE SOCKET PLUG A TIME and run the relative script.
You can find more information in the previous PDF, but these sockets learn who they are based on which commands they are receiving during the learning mode (enabling keeping the green button pressed for about 5 seconds when switched off). So if you run the first script with both plugs connected and in learning mode, they will do exactly the same, and unless you want to control two sockets at the same time, better to follow the instructions 🙂
Script to configure the first socket:
from energenie import switch_on, switch_off from time import sleep # turn the first plug socket ON and then OFF switch_on(1) sleep(5) switch_off(1)
Script to configure the second socket:
from energenie import switch_on, switch_off from time import sleep # turn the second plug socket ON and then OFF switch_on(2) sleep(5) switch_off(2)
And now, my simple script to make… “the magic”: plugs.py
from energenie import switch_on, switch_off
from time import sleep
import sys
if len(sys.argv) == 1:
print "Use:\n# python plug.py <plug_ID> <ON/OFF>\ne.g. # python plug.py 1 ON"
exit(1)
else:
plug = sys.argv[1]
status = sys.argv[2]
if status.lower() == 'on':
switch_on(int(plug))
else:
switch_off(int(plug))
You can use this script to control any sockets (up to 4 – hardware limitation).
And here a bash wrapper (I’m not really good in python sorry) that calls plugs.py and restart the router: restart_sky_router
#!/bin/bash # This script requires plug.py script if [ "$EUID" -ne 0 ] then echo "Please run as root or use 'sudo'" exit fi echo "Switching OFF and then ON the physical socket" # Uses ENERGENIE Radio controlled Sockets python plug.py 1 off sleep 10 python plug.py 1 on
Now, I can have my Nagios system to check for the speed as documented here and eventually issue restart_sky_router script to see if it fixes the issue. Or simply be able to have a command to integrate in your scripts!
>> set your variables:
TOKEN=""
REGION="lon"
DDI="" < this is the account number
>> Generate a list of backup agents
curl -sH "X-Auth-Token: $TOKEN" -H "Content-type: application/json" -X GET https://$REGION.backup.api.rackspacecloud.com/v1.0/$DDI/user/agents | python -m json.tool | egrep "MachineName|MachineAgentId" | awk -F":" '{print $2}' | sed 's/ //g' | sed '{N;s/\n//}' > list.txt
>> Manually remove WANTED backup agents (leave only the ones you want to remove):
vim list.txt
>> Generate remove list
awk -F, '{print $1}' list.txt > remove.txt
>> generate the exec file to review
for AGENTID in `cat remove.txt`; do echo curl -sH \"X-Auth-Token: $TOKEN\" -H \"Content-type: application/json\" -X POST https://$REGION.backup.api.rackspacecloud.com/v1.0/$DDI/agent/delete -d \'{\"MachineAgentId\": $AGENTID}\' ; done >> exec_me
>> exec the API calls
/bin/bash exec_me