Created
November 26, 2015 19:49
-
-
Save jasonraimondi/691cde1bba0e776ffae7 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
# install figlet to enable ASCII art | |
apt-get install figlet | |
# create directory | |
mkdir /etc/update-motd.d/ | |
# change to new directory | |
cd /etc/update-motd.d/ | |
# create dynamic files | |
touch 00-header && touch 10-sysinfo && touch 20-updates && touch 90-footer | |
# make files executable | |
chmod +x /etc/update-motd.d/* | |
# remove MOTD file | |
rm /etc/motd | |
# symlink dynamic MOTD file | |
ln -s /var/run/motd /etc/motd | |
cat <<EOF >> 00-header | |
#!/bin/sh | |
# | |
# 00-header - create the header of the MOTD | |
# Copyright (c) 2013 Nick Charlton | |
# Copyright (c) 2009-2010 Canonical Ltd. | |
# | |
# Authors: Nick Charlton <hello@nickcharlton.net> | |
# Dustin Kirkland <kirkland@canonical.com> | |
# | |
# This program is free software; you can redistribute it and/or modify | |
# it under the terms of the GNU General Public License as published by | |
# the Free Software Foundation; either version 2 of the License, or | |
# (at your option) any later version. | |
# | |
# This program is distributed in the hope that it will be useful, | |
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
# GNU General Public License for more details. | |
# | |
# You should have received a copy of the GNU General Public License along | |
# with this program; if not, write to the Free Software Foundation, Inc., | |
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
[ -r /etc/lsb-release ] && . /etc/lsb-release | |
if [ -z "$DISTRIB_DESCRIPTION" ] && [ -x /usr/bin/lsb_release ]; then | |
# Fall back to using the very slow lsb_release utility | |
DISTRIB_DESCRIPTION=$(lsb_release -s -d) | |
fi | |
figlet $(hostname) | |
printf "\n" | |
printf "Welcome to %s (%s).\n" "$DISTRIB_DESCRIPTION" "$(uname -r)" | |
printf "\n" | |
EOF | |
cat <<EOF >> 10-sysinfo | |
#!/bin/bash | |
# | |
# 10-sysinfo - generate the system information | |
# Copyright (c) 2013 Nick Charlton | |
# | |
# Authors: Nick Charlton <hello@nickcharlton.net> | |
# | |
# This program is free software; you can redistribute it and/or modify | |
# it under the terms of the GNU General Public License as published by | |
# the Free Software Foundation; either version 2 of the License, or | |
# (at your option) any later version. | |
# | |
# This program is distributed in the hope that it will be useful, | |
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
# GNU General Public License for more details. | |
# | |
# You should have received a copy of the GNU General Public License along | |
# with this program; if not, write to the Free Software Foundation, Inc., | |
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
date=`date` | |
load=`cat /proc/loadavg | awk '{print $1}'` | |
root_usage=`df -h / | awk '/\// {print $(NF-1)}'` | |
memory_usage=`free -m | awk '/Mem:/ { total=$2 } /buffers\/cache/ { used=$3 } END { printf("%3.1f%%", used/total*100)}'` | |
swap_usage=`free -m | awk '/Swap/ { printf("%3.1f%%", "exit !$2;$3/$2*100") }'` | |
users=`users | wc -w` | |
time=`uptime | grep -ohe 'up .*' | sed 's/,/\ hours/g' | awk '{ printf $2" "$3 }'` | |
processes=`ps aux | wc -l` | |
ip=`ifconfig $(route | grep default | awk '{ print $8 }') | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'` | |
echo "System information as of: $date" | |
echo | |
printf "System load:\t%s\tIP Address:\t%s\n" $load $ip | |
printf "Memory usage:\t%s\tSystem uptime:\t%s\n" $memory_usage "$time" | |
printf "Usage on /:\t%s\tSwap usage:\t%s\n" $root_usage $swap_usage | |
printf "Local Users:\t%s\tProcesses:\t%s\n" $users $processes | |
echo | |
EOF | |
cat <<EOF >> 20-updates | |
#!/usr/bin/python | |
# | |
# 20-updates - create the system updates section of the MOTD | |
# Copyright (c) 2013 Nick Charlton | |
# | |
# Authors: Nick Charlton <hello@nickcharlton.net> | |
# Based upon prior work by Dustin Kirkland and Michael Vogt. | |
# | |
# This program is free software; you can redistribute it and/or modify | |
# it under the terms of the GNU General Public License as published by | |
# the Free Software Foundation; either version 2 of the License, or | |
# (at your option) any later version. | |
# | |
# This program is distributed in the hope that it will be useful, | |
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
# GNU General Public License for more details. | |
# | |
# You should have received a copy of the GNU General Public License along | |
# with this program; if not, write to the Free Software Foundation, Inc., | |
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
import sys | |
import subprocess | |
import apt_pkg | |
DISTRO = subprocess.Popen(["lsb_release", "-c", "-s"], | |
stdout=subprocess.PIPE).communicate()[0].strip() | |
class OpNullProgress(object): | |
'''apt progress handler which supresses any output.''' | |
def update(self): | |
pass | |
def done(self): | |
pass | |
def is_security_upgrade(pkg): | |
''' | |
Checks to see if a package comes from a DISTRO-security source. | |
''' | |
security_package_sources = [("Ubuntu", "%s-security" % DISTRO), | |
("Debian", "%s-security" % DISTRO)] | |
for (file, index) in pkg.file_list: | |
for origin, archive in security_package_sources: | |
if (file.archive == archive and file.origin == origin): | |
return True | |
return False | |
# init apt and config | |
apt_pkg.init() | |
# open the apt cache | |
try: | |
cache = apt_pkg.Cache(OpNullProgress()) | |
except SystemError, e: | |
sys.stderr.write("Error: Opening the cache (%s)" % e) | |
sys.exit(-1) | |
# setup a DepCache instance to interact with the repo | |
depcache = apt_pkg.DepCache(cache) | |
# take into account apt policies | |
depcache.read_pinfile() | |
# initialise it | |
depcache.init() | |
# give up if packages are broken | |
if depcache.broken_count > 0: | |
sys.stderr.write("Error: Broken packages exist.") | |
sys.exit(-1) | |
# mark possible packages | |
try: | |
# run distro-upgrade | |
depcache.upgrade(True) | |
# reset if packages get marked as deleted -> we don't want to break anything | |
if depcache.del_count > 0: | |
depcache.init() | |
# then a standard upgrade | |
depcache.upgrade() | |
except SystemError, e: | |
sys.stderr.write("Error: Couldn't mark the upgrade (%s)" % e) | |
sys.exit(-1) | |
# run around the packages | |
upgrades = 0 | |
security_upgrades = 0 | |
for pkg in cache.packages: | |
candidate = depcache.get_candidate_ver(pkg) | |
current = pkg.current_ver | |
# skip packages not marked as upgraded/installed | |
if not (depcache.marked_install(pkg) or depcache.marked_upgrade(pkg)): | |
continue | |
# increment the upgrade counter | |
upgrades += 1 | |
# keep another count for security upgrades | |
if is_security_upgrade(candidate): | |
security_upgrades += 1 | |
# double check for security upgrades masked by another package | |
for version in pkg.version_list: | |
if (current and apt_pkg.version_compare(version.ver_str, current.ver_str) <= 0): | |
continue | |
if is_security_upgrade(version): | |
security_upgrades += 1 | |
break | |
print "%d updates to install." % upgrades | |
print "%d are security updates." % security_upgrades | |
print "" # leave a trailing blank line | |
EOF | |
cat <<EOF >> 90-footer | |
#!/bin/sh | |
# | |
# 90-footer - write the admin's footer to the MOTD | |
# Copyright (c) 2013 Nick Charlton | |
# Copyright (c) 2009-2010 Canonical Ltd. | |
# | |
# Authors: Nick Charlton <hello@nickcharlton.net> | |
# Dustin Kirkland <kirkland@canonical.com> | |
# | |
# This program is free software; you can redistribute it and/or modify | |
# it under the terms of the GNU General Public License as published by | |
# the Free Software Foundation; either version 2 of the License, or | |
# (at your option) any later version. | |
# | |
# This program is distributed in the hope that it will be useful, | |
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
# GNU General Public License for more details. | |
# | |
# You should have received a copy of the GNU General Public License along | |
# with this program; if not, write to the Free Software Foundation, Inc., | |
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
[ -f /etc/motd.tail ] && cat /etc/motd.tail || true | |
EOF |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment