Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement