Tag Archive: script

dpkg.log mit PHP auswerten

PHP

phpdpkg
dpkg.log mit PHP auswerten
Ein kleines quick-and-dirty Script, um die Datei dpkg.log mit PHP auszuwerten.
Zu sehen sind die X zuletzt installierten- sowie entfernten Pakete.

Die Logs rotieren in der Regel jeden Monat!

Getestet unter Debian Wheezy und Ubuntu 12.04 mit DPKG 1.16.x sowie PHP >= 5.3.

Falls „open_basedir“ via PHP-Option gesetzt ist, muss „/var/log“ freigegeben werden.

Einstellungsmöglichkeiten sind in den ersten 3 Variablen gegeben.








Installierte Pakete (max. )

"; echo ""; echo ""; echo ""; $at++; } } ?>
Installiert amNameArch.Version
", $date->format('d.m.Y H:i:s'), "", $pkgdetails[0], "", $pkgdetails[1], "", $lines_ex[5], "

Entfernte Pakete (max. )

"; echo ""; echo ""; echo ""; $at++; } } ?>
Entfernt amNameArch.Version
", $date->format('d.m.Y H:i:s'), "", $pkgdetails[0], "", $pkgdetails[1], "", $lines_ex[4], "

Apt-fast in Debian

Kurz und knapp, da meine Zeit momentan begrenzt ist: Ich möchte aufzeigen, wie Debian um den Helfer „apt-fast“ erweitert werden kann.
Vorab werde ich die schnellsten Debian Mirrors in meiner Nähe ermitteln und konfigurieren.

Kurze Beschreibung via „ubuntuusers.de“:

apt-fast ist ein von Matt Parnell und einigen Mitwirkenden geschriebener Shell-Wrapper für die Kommandozeilentools apt-get und aptitude. Mithilfe des Downloadhelfers aria2 werden die Debianpakete zur Aktualisierung oder Installation über mehrere Verbindungen heruntergeladen. Somit können je nach eigener Bandbreite erhebliche Geschwindigkeitsvorteile erzielt werden.

Für die Ermittlung der Mirrors verwende ich „netselect-apt“. Der Download-Manager „aria2“ wird direkt mitinstalliert:

sudo apt-get install netselect-apt aria2

„netselect-apt“ ausführen und die zehn schnellsten Mirrors ermitteln:

netselect-apt -t 10

Die Ausgabe der letzten Zeilen ist später wichtig, zum Beispiel:

The fastest 10 servers seem to be:
http://ftp.freenet.de/debian/
http://ftp.freenet.de/debian/
http://ftp.plusline.de/debian/
http://mirror.nl.leaseweb.net/debian/
http://ftp.surfnet.nl/os/Linux/distr/debian/
http://debian.netcologne.de/debian/
http://artfiles.org/debian/
http://mirror.de.leaseweb.net/debian/
http://mirror.1und1.de/debian/
http://ftp.informatik.uni-frankfurt.de/debian/

Das Script „apt-fast“ von Github herunterladen und installieren.
Gleichzeitig installiere ich die Datei für das Bash-Autocomplete, welches jedoch erst nach einem Neustart der Bash wirksam wird:

wget -O /etc/bash_completion.d/apt-fast https://raw.github.com/ilikenwf/apt-fast/master/completions/bash/apt-fast
wget -O /usr/bin/apt-fast https://raw.github.com/ilikenwf/apt-fast/master/apt-fast && chmod +x /usr/bin/apt-fast

Zum Abschluss die Konfiguration anlegen. Die Parameter für die Einstellung eines Proxys lasse ich weg, falls benötigt, bitte hier klicken.

Unter MIRRORS definiere ich die von „netselect-apt“ vorgeschalgenen Mirrors.
Achtung: Unbedingt auf die Syntax achten.

sudo nano /etc/apt-fast.conf

Mit Inhalt:
/etc/apt-fast.conf

# Pakete ohne Zustimmung direkt herunterladen (nicht installieren)
DOWNLOADBEFORE=true
# Gleichzeitges herunterladen von X Paketen
_MAXNUM=10
# "apt-get" benutzen, Alternative: "aptitude"
_APTMGR=apt-get
# Mirrors, "netselect-apt" Auswahl
MIRRORS=( 'http://ftp.plusline.de/debian/,http://ftp.freenet.de/debian/,http://mirror.nl.leaseweb.net/debian/'
	'http://ftp.freenet.de/debian/,http://ftp.nluug.nl/pub/os/Linux/distr/debian/,http://ftp.nluug.nl/pub/os/Linux/distr/debian/'
	'http://artfiles.org/debian/,http://mirror.de.leaseweb.net/debian/,http://mirror.1und1.de/debian/'
	'http://ftp.informatik.uni-frankfurt.de/debian/' )
# Download-Verzeichnis für "apt-fast"
DLDIR=/var/cache/apt/archives/apt-fast
# Apt Archive
APTCACHE=/var/cache/apt/archives
# Terminal-Farben
cGreen='\e[0;32m'
cRed='\e[0;31m'
cBlue='\e[0;34m'
endColor='\e[0m'

„Apt-fast“ kann nun verwendet werden.

„Mother Of All Ad-Blocking“

Im XDA-Forum gibt es die „Mother Of All Ad-Blocking“ für Android-Geräte. Hierbei wird eine individuelle „hosts“-Datei installiert und so Werbung blockiert.
Ob für den lokalen DNS-Server, den Desktop oder das Smartphone: Werbung blockieren tut in der heutigen Zeit immer gut, denn es spart Bandbreite und, ganz wichtig, schont die Nerven.

Changelog

  • 16.01.2014 – Cronjob ersetzt, da vorher nicht auf allen Debian/Ubuntu-Varianten gleichermaßen funktionsfähig

Die angebotene Liste ist eine große Zusammenfassung aus verschiedenen Quellen, weshalb ich sie lokal auf einem DNS-Server installieren möchte. Als Nameserver-Forwarder benutze ich „dnsmasq“, welcher, sofern nicht anders konfiguriert, die Einträge aus der „hosts“-Datei respektiert (=kein „no-hosts“ in der Konfiguration).
Der Download erfolgt via „http://adblock.mahakala.is“. Mit „wget“ und „curl“ funktioniert der Download nicht direkt, weshalb „Mozilla/5.0“ als User-Agent gesetzt wird. Außerdem hat die Liste eine eigene Kopfzeile, die weg geschnitten werden muss:

# AD BLOCKING by: Jake Thomas
# Last Update on: 07 January 2014
# Domain Block Count: 339285
# contact me on XDA: http://forum.xda-developers.com/member.php?u=4877037
# Copyright (c) 2007-2014, Jake Thomas (BSDgeek_Jake) (thomasj-gnugpl@usa.net)

# DEFAULT
127.0.0.1 localhost
127.0.0.1 localhost.localdomain
255.255.255.255 broadcasthost
127.0.0.1 android

Vorhandene/Eigene Einträge möchte ich zudem beibehalten. Der Einfachheit halber verwende ich „curl“ für den Download, dieses kann vorab installiert werden. Für Debian und Derivate:

sudo apt-get install curl

Der Befehl, um die Liste einmalig anzuhängen (als root):

curl -s -A "Mozilla/5.0" http://adblock.mahakala.is | \
sed -e '1,/android/d' >> /etc/hosts

Zum aktualisieren der Liste (ebenfalls als root):
ACHTUNG: Das Aktualisieren funktioniert nur, wenn die Liste bereits einmal angehängt wurde, da „sed“ nach „BLOCKING STARTS“ sucht.

sed -n "/BLOCKING STARTS/q;p" /etc/hosts >> /etc/hosts.new && curl -s -A "Mozilla/5.0" http://adblock.mahakala.is | sed -e "1,/android/d" >> /etc/hosts.new && mv /etc/hosts.new /etc/hosts && sed -i '/^$/d' /etc/hosts

Und als Cronjob jeden Tag aktualisieren:

sudo crontab -e

Einfügen:

0 0 */1 * * PATH=/usr/bin:/bin sed -n "/BLOCKING STARTS/q;p" /etc/hosts >> /etc/hosts.new && curl -s -A "Mozilla/5.0" http://adblock.mahakala.is | sed -e "1,/android/d" >> /etc/hosts.new && mv /etc/hosts.new /etc/hosts && sed -i '/^$/d' /etc/hosts

Das schöne ist, dass zusätzlich viel In-App Werbung blockiert wird, wenn das Smartphone im WLAN des eigenen DNS-Servers steht. Aber auch so, auf dem Desktop, ist es eine sehr umfangreiche Liste.

Optional: Alternative als dnsmasq-Konfigurationsdatei

Via „yoyo.org“ ist es möglich, eine etwas weniger umfangreiche, dennoch starke Liste, komplett im Konfigurations-Format des „dnsmasq“ herunterzuladen.
Einmalig herunterladen und aktivieren:

sudo wget -O /etc/dnsmasq.d/adblock.conf "http://pgl.yoyo.org/adservers/serverlist.php?hostformat=dnsmasq&showintro=0&mimetype=plaintext" && sudo service dnsmasq restart

Als Cronjob jeden Tag aktualisieren:

sudo crontab -e

Einfügen:

0 0 */1 * * wget -O /etc/dnsmasq.d/adblock.conf "http://pgl.yoyo.org/adservers/serverlist.php?hostformat=dnsmasq&showintro=0&mimetype=plaintext" && service dnsmasq restart

Anmerkung: Ich fühle mich verpflichtet zu sagen, dass Entwickler guter Software immer unterstützt werden sollten. Wer keine Werbung will, der kauft die „Pro/Ultra/Sonstwas“-Version von XY.
Leider gibt es auch dubiose Entwickler, die trotz Bezahlung noch vereinzelt Werbung einblenden, wofür ich kein Verständnis habe.

Debian und Ubuntu Backupscript

Gerne teile ich hier mein kleines Debian/Ubuntu Backupscript, welches ich vor einer Weile für mich geschrieben habe.
Das Script sorgt für ein komplettes Backup des Root-Verzeichnisses inkl. MySQL/(MariaDB)-Datenbanken und einer Liste der installierten Pakete nach Status.

Changelog

  • 12.03.2014 – v1.2 – Ausnahmen hinzugefügt und Backup auch bei unkritischen Fehlern
  • 12.03.2014 – v1.1.3 – Ausnahmen hinzugefügt
  • 14.01.2014 – v1.1.2 – Ausnahmen hinzugefügt
  • 12.01.2014 – v1.1.1 – „nice“-Priorität behoben
  • v1.1 – „nice“ benutzen, bessere Fehlermitteilung für „tar“
  • v1.0 – initial release

Der Aufbau des Backups

Es erfolgt die Erstellung des Ordners „FULL_BACKUP_$DATUM_$ZEIT“ im aktuellen Verzeichnis mit folgendem Inhalt:

  • dump.sql – ein komplettes Backup der MySQL-Datenbanken, exklusive „event“ Tabelle
  • packages.list – Eine Liste aller installierten Pakete
  • package-states-auto – Eine Liste automatisch installierter Pakete
  • package-states-manual – Eine Liste manuell installierter Pakete
  • fullbackup.tar – Das Backup des Root-Verzeichnisses

Konfiguration

Das Script ist im Standard so konfiguriert, dass der Wartungs-Benutzer „debian-sys-maintainer“ für den MySQL-Login verwendet wird. Das hat den Vorteil, dass kein Passwort in der Datei gesetzt werden muss.
Soll dieser Benutzer NICHT verwendet werden, wird MAINTAINERLOGIN=“yes“ zu MAINTAINERLOGIN=“no“ abgeändert. Folglich ist es notwendig, dass das Root-Passwort für den MySQL-Login in ROOTPW gesetzt wird. Das Ergebnis könnte dann so aussehen:

MAINTAINERLOGIN="no"
ROOTPW="meingeheimespasswort"

Außerdem ist es nun möglich, die Priorität des Backups zu setzen. -19 ist die höchte Priorität, 19 die niedrigste! Das ist kein Tippfehler. :) Standard ist 0, ergo „normal“:

PRIORITY="0"

Das Script

#!/bin/bash
if [ "$(id -u)" != "0" ]; then
    echo "This script must be run as root" 1>&2
    exit 1
fi

######################## CONFIG START ########################
MAINTAINERLOGIN="yes"
ROOTPW="" # Optional, leave empty if MAINTAINERLOGIN=yes
PRIORITY="0" # "-19" is highest, "19" is lowest
######################### CONFIG END #########################

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DATE=`date +%d%m%Y_%H%M`
TAR=`which tar`
DPKG=`which dpkg`
APTMARK=`which apt-mark`
NICE=`which nice`
MYSQLDUMP=`which mysqldump`
LOGINLINE="-uroot -p$ROOTPW"

function revertchanges {
	rm -r ./FULL_BACKUP_$DATE
}

if [ $MAINTAINERLOGIN == "yes" ] ; then
	echo -en "Testing debian-sys-maintainer login...\t\t\t"
	MAINTLOGIN=`mysqladmin --defaults-file=/etc/mysql/debian.cnf ping 2>&1 | grep "Access denied"`
	if [ ! -z "$MAINTLOGIN" ] ; then
		echo -e "\e[00;31m ERR: Login failed\e[00m"
		exit 1
	fi
	echo -e "\e[00;32m OK\e[00m"
	LOGINLINE="--defaults-file=/etc/mysql/debian.cnf"
else
	echo -en "Testing root login...\t\t\t\t\t"
	MAINTLOGIN=`mysqladmin -uroot -p$ROOTPW ping 2>&1 | grep "Access denied"`
	if [ ! -z "$MAINTLOGIN" ] ; then
		echo -e "\e[00;31m ERR: Login failed\e[00m"
		exit 1
	fi
	echo -e "\e[00;32m OK\e[00m"
fi

mkdir -p ./FULL_BACKUP_$DATE

echo -en "Full backup...\t\t\t\t\t\t"
GREPTAR=$($NICE -$PRIORITY $TAR -cpf FULL_BACKUP_$DATE/fullbackup.tar --directory=/ --exclude FULL_BACKUP_$DATE/fullbackup.tar --exclude=proc --exclude=sys --exclude=dev/pts --exclude=var/spool --exclude=var/run --exclude=run --exclude=tmp . 2>&1)
TAREXC=$?
if [ $TAREXC -eq 2 ] ; then
        echo -e "\e[00;31m FATAL ERR\e[00m"
        echo -e "\n\n\n$GREPTAR"
        revertchanges
        exit 1
fi
if [ $TAREXC -eq 1 ] ; then
        echo -e "\e[00;31m WARNING:\e[00m"
        echo -e "\n\n\n$GREPTAR"
fi
if [ $TAREXC -eq 0 ] ; then
        echo -e "\e[00;32m OK \e[00m"
fi

echo -en "Saving list of installed packages...\t\t\t"
$DPKG --get-selections | awk '!/deinstall|purge|hold/ {print $1}' >  ./FULL_BACKUP_$DATE/packages.list
$APTMARK showauto >  ./FULL_BACKUP_$DATE/package-states-auto
$APTMARK showmanual >  ./FULL_BACKUP_$DATE/package-states-manual
echo -e "\e[00;32m OK\e[00m"

echo -en "Backup all MySQL databases (skipping \"event\")... \t"
$NICE -$PRIORITY $MYSQLDUMP $LOGINLINE --all-databases --ignore-table=mysql.event > ./FULL_BACKUP_$DATE/dump.sql
if [ $? -ne 0 ] ; then
	echo -e "\e[00;31m ERR\e[00m"
	revertchanges
	exit 1
fi
echo -e "\e[00;32m OK\e[00m"
echo -e "\n\nSuccessfully saved backup to FULL_BACKUP_$DATE"
exit 0

Usage: # ./script.sh
Vorab als ausführbar markieren: chmod +x script.sh