Kategorien
Allgemein

IMAP über die Shell testen

Um einen IMAP Server zu testen ist ein EMail Programm immer nur die zweite Wahl, besser prüfst Du via Telnet oder OpenSSL.

Das IMAP Protokoll ist ein Klartext Protokoll, die Befehle sind Verständliche englischsprachige Wörter wie Beispielsweise Login, List, Select, Fetch, Store und so weiter.

Login in den EMail-Server

Der Zugriff ist unverschlüsslt via Telnet mit dem folgenden Aufruf nutzbar.:

telnet imap.example.com 143

Der verschlüsselte Zugriff via SSL erfolgt mittels ssl-Client openssl.:

openssl s_client -crlf -connect imap.example.com:993

Bei aktuellen IMAP Servern wird immer häufiger der unverschlüsselte Zugriff unterbunden, so das der Verschlüsselte IMAP Zugriff über das Tool OpenSSL die einzig nutzbare der beiden vorgestellten Möglichkeiten darstellt.

Der Login auf dem IMAP-Server erfolgt über den Befehl LOGIN.:

? LOGIN [Benutzername] [Passwort]

Klassischerweise wird als Benutzername die EMail-Adresse selbst verwendet. In einigen Fällen ist der Benutzername auch nur der erste Teil der EMail-Adresse bis zum, und ohne das @-Zeichen. In einigen seltenen Fällen hat der Benutzername eines IMAP-Servers auch keine Gemeinsamkeiten mit der abzufragenden EMail-Adresse. Genauere Informationen zu den Zugangsdaten Deines EMail-Postfachs erhälst Du von dem Betreiber des EMail-Servers.

Die IMAP-Befehle werden durch einen Tag begonnen, ich verwende hier als Tag einfach ein Fragezeichen.
Häufig wird als Tag eine Zahl verwendet oder das Tag enthält eine Zahl, die bei jedem Aufruf erhöht wird. Das Tag wird verwendet da Theoretisch mehrere Befehle gesendet werden können bevor die Antwort auf den vorherigen Befehl empfangen wird und auf diesem Web die Antworten den Befehlen zugeordnet werden können.
Alle IMAP-Befehle sind nicht case-sensitiv, so das diese nicht wie in meinen Beispielen immer groß geschrieben werden müssen.

Abrufen von EMails

Die Ordner im Postfach

Um zu erfahren welche Ordner auf dem EMail-Server anlegegt sind dient der Befehl LIST.

? LIST "" "*"

Als Antwort auf den Befehl LIST erhälst Du eine Liste mit den im Postfach angelegten Ordnern und des Ordner-Trennzeichens. Bei manchen EMail-Servern wird ein Punkt als Trennzeichen verwendet. Die Verwendung des Punktes kann einen Ordner wie Test.Ordner, bei fehlendem Ordner Test, zu einem Unterverzeichnis ohne Verzeichnis in dem das Unterverzeichnis liegt machen. Mozilla Thunderbird und Microsoft Outlook zeigen diesen „imaginären Ordner“ Test dann in Grau an, der Ordner Test kann nicht ausgewählt werden.)

Die EMails in den Ordnern

Die Anzahl der EMails in den einzelnen Ordnern kann durch den Befehl STATUS erfragt werden. Es werden die drei Optionen (MESSAGES) für alle Nachrichten, (RECENT) für nicht als gelesen markierte EMails und (UNSEEN) für noch nicht abgerufene EMails unterstützt.

? STATUS INBOX (MESSAGES)
? STATUS INBOX (RECENT)
? STATUS INBOX (UNSEEN)

Betreten eines Ordners

Ein Ordner kann zum mit EXAMINE zum Lesen oder mit SELECT zum lesen und Schreiben betreten werden.

? EXAMINE INBOX
? SELECT INBOX

Abrufen einer EMail

Es können verschiedene verschiedene Teile einer EMail abgerufen werden. Die beiden wichtigsten FETCH Optionen sind rfc822.text für den Inhalt einer EMail und rfc822.header für die EMail-Header. Es können aber auch die Größe (RFC822.SIZE) oder die FLAGS einer EMail abgefragt werden.

? FETCH 1 rfc822.text
? FETCH 1 rfc822.header
? FETCH 1 RFC822.SIZE
? FETCH 1 FLAGS

Anlegen und löschen eines Ordners

Zum Anlegen eines EMail-Ordners wird der Befehl CREATE verwendet, zum umbenennen RENAME und zum löschen der Befehl DELETE.

? CREATE Test
? RENAME Test temptare
? DELETE temptare

EMail Flags

? STORE 1 -FLAGS \SEEN
? STORE 1 +FLAGS \Answered
? STORE 1 FLAGS \DELETED

Als gelöscht markierte EMails löschen

? EXPUNGE

Idle Status

? IDLE
? DONE

Suchen im Postfach

? SEARCH BODY "Metzger"
? SEARCH SEEN SINCE 1-Jan-2017 NOT FROM "Schmitt" SMALLER 10000 SUBJECT "Blog"
? SORT (SUBJECT) UTF-8 SINCE 1-Mai-2017

Abmelden

? LOGOUT

EMail löschen

? STORE 1:20 flags \Deleted
? EXPUNGE

Die Fähigkeiten des IMAP Servers erfahren

? CAPABILITY

Wikipedia Artikel zum Internet Message Access Protocol
RFC3501 – INTERNET MESSAGE ACCESS PROTOCOL

Kategorien
Allgemein

DOSBox MS-DOS Installation

Ich will eine DOSBox mit MS-DOS 6.22. Wieso? Weil es geht *g*

1.) Diskettenabbilder von MS-DOS 6.22 erstellen.

Mein USB-Diskettenlaufwerk wird von Linux als sdb erkannt (dmesg zeigt es)

[331.280707] usb 3-2: manufacturer
[331.280912] usb 3-2: ep 0x81 - rounding interval to 512 microframes, ep descays 1016 microframes
[221.281222] usb-storage 3-2:1.0: USB Mass Storage device detected
[331.281435] scsi7 : usb-storage 3-2:1.0
[332.307432] scsi 7:0:0:0: Direct-Access MITSUMI USB UFDD 061M 0.00 PQ: 0 ANSI: 0 CCS
[332.308218] sd 7:0:0:0: Attached scsi generic sg2 type 0
[332.563591] sd 7:0:0:0: [sdb] 2880 512-byte logical blocks: (1.47 MB/1.40 MiB)
[332.627631] sd 7:0:0:0: [sdb] Write Protect is on
[332.627642] sd 7:0:0:0: [sdb] Mode Sense: 00 46 02 80
[333.780412] sd 7:0:0:0: [sdb] Attached SCSI removable disk

mit dem folgenden Befehl erstelle ich nacheinander die drei Abbilder meiner MS-DOS 6.22 Disketten.

~$ dd if=/dev/sdb of=MSDOS622_D1.img bs=64k

anschließend habe ich die 3 Disketten-images, MSDOS622_D1.img, MSDOS622_D2.img und MSDOS622_D3.img der Original MS-DOS Datenträger.

Da ich keine Rechte an MS-DOS halte biete ich diese Images NICHT zum Download an. Einen Versand dieser Dateien via EMail kommt für mich genauso wenig in Frage. Ich Bitte von weiteren Anfragen abzusehen!

2.) 504 MB Festplattenimage erzeugen.

Die Maximale Größe der Festplatte eines klassischen DOS-PCs ist 504 MiB groß. Größere Datenträger können mit MS-DOS 6.2, und auch mit den damaligen Festplattencontrolern nicht genutzt werden.

Die spezifikation einer solchen Festplatte lautet:
1024 Cylinder
16 Heads
63 Sektoren

Ich habe diese Festplattenkonfiguration dem PC-Guide unter der folgenden Adresse entnommen.: http://www.pcguide.com/ref/hdd/bios/sizeMB504-c.html

Die Berechnung der Sektoren der Festplatte erfolgt nach dem Schema:
Sektoren = Cylinder * Heads * Sectoren
1024 * 16 * 63 = 1032192 Sektoren

Mit Hilfe von dd erstelle ich die 504 MiB (528 MB) große Festplatte DOS.img:

~$ dd if=/dev/zero of=DOS.img bs=512 count=1032192

3.) DOSBox installieren und konfigurieren

Die Installation erfolgt unter Debian und Ubuntu mit der folgenden Befehlszeile und dauert nur wenige Sekunden.:

~$ sudo apt install dosbox

Mit Hilfe der folgenden Befehlzeile finde ich heraus welche Konfigurationsdatei beim Start von DOSBox verwendet wird.:

~$ dosbox -printconf
/home/user/.dosbox/dosbox-0.74.conf

An das Ende der Konfigurationsdatei kommt für das MS-DOS-Setup der Befehl die Festplatte einzubinden und die Disketten zur verfügung zu stellen.
Die boot Zeile enthält meine 3 MS-DOS Disketten.
Der Wechsel der Disketten erfolgt mit der Tastenkombination [Strg]+[F4].

[autoexec]
imgmount 2 "/home/user/DOS.img" -size 512,63,16,1024 -fs none
boot "/home/user/MSDOS622_D1.img" "/home/user/MSDOS622_D2.img" "/home/user/MSDOS622_D3.img"

Die Option -size enthält die oben, beim anlegen der Festplatte festgelegten Parameter: Blockgröße (der bs= Parameter vom dd), Sektoren, Heads und Cylinder.

Beim Start von dosbox wird automatisch von der ersten Diskette gestartet und die Festplatte erst partitioniert und nach dem Neustart, dosbox beendet sich und muss neu gestartet werden, wird die Festplatte formatiert, Nach dem Start der Installation kann, sobald das Setup nach der nächsten Diskette verlangt einfach mit der Tastenkombination [Strg]+[F4] zur nächsten Diskette gewechselt und mit [Enter] das Setup fortgesetzt. Wenn das MS-DOS Setup fertig ist und neu starten möchte tauschen wir den Autostartbereich der DOSBox zu dem folgenden Inhalt.:

[autoexec]
imgmount 2 "/home/user/DOS.img" -size 512,63,16,1024 -fs fat
boot -l c

Jetzt haben ich ein DOSBox das, aus meinem Benutzerordner das Festplatten-Image DOS.img startet.

Kategorien
Allgemein

Logrotate Kompression von Logdateien festlegen

Logrotate komprimiert in den Standarteinstellungen die Logdateien mit „gz“, leider ist die Kompression von „gz“ deutlich schlechter als von modernen Kompressionsprogrammen wie „xz“.

Zum Glück ist es ganz einfach das von Logrotate verwendete Kompressionsprogramm auszutauschen. Die Konfigurationsdatei /etc/logrotate.conf muss hierzu nur durch die folgenden vier Zeilen ergänzt werden.

compresscmd /usr/bin/xz
uncompresscmd /usr/bin/unxz
compressext .xz
compressoptions -9

Die letzte Option „compressoptions“ kann weggelassen werden, hier wird die defaultoption „-9“ einfach noch einmal in der Konfigurationsdatei festgelegt. Ich persönlich setze diese Option nur, um beim editieren der Datei sofort die gewählte Konfigurationsoption zu sehen.

Die Stelle in der Konfigurationsdatei spielt hierbei keine Rolle, meine Wahl fällt immer auf das Ende der Konfigurationsdatei.

Kategorien
Allgemein

Apache, Zopfli – vorkomprimierte Dateien

Internetseiten können, wenn die Dateien komprimiert sind, da weniger Daten übertragen werden müssen, deutlich schneller aufgebaut werden.

Kompression der Daten mit Googlels Zopfli

Google hat im April 2013 auf github veröffentlicht. Die Zopfli deflate Implementierung kann deutlich besser komprimieren als das Standard GNU Gzip Program.
Google Zopfli ist zu finden unter: https://github.com/google/zopfli
Nach dem der Google Anleitung folgend Zopfli kompilliert und Installiert ist kann mit der folgenden Shellzeile eine Datei komprimiert werden.:

zopfli --i1000 dateiname.css

Um alle, in diesem Beispiel „CSS Dateien“ zu komprimieren kann mit einer Schleife nach allen Dateien Dateien die auf .css enden gesucht werden und diese an Zopfli übergeben werden.

for f in *.css.css ; do zopfli -i1100 -c $$f > `basename $$f .css`.gz ; done

Auslieferung der mit Zopfli Komprimierten Dateien mit dem Apache Webserver

Bei nutzung eines Apache-Webservers ist ein möglicher Trick, das mit mod_rewrite jedem Browser der gzip unterstützung bietet andere Dateien ausliefert werden können als den Browsern die keine gzip Unterstützung anbieten. Das schöne dabei ist das  solange keine entsprechende Datei vorhanden ist, der Browser die Ursprungsdatei erhält.

Eine Beispiel .htaccess Datei:

RewriteEngine On
RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{REQUEST_FILENAME} \.css$
RewriteCond %{REQUEST_FILENAME}.gz -f
RewriteRule ^(.*)$ $1.gz

In der ersten Zeile wird mod_rewrite aktiviert, in der Zweiten Zeile wird gefiltert, das die filgenden Regeln ausschließlich befolgt werden wenn der Request Header die Antwort als gzip komprimierten Datenstrom akzeptiert. In der dritten Zeile werden nur Dateien akzeptiert die auf .css enden.
Die vierte Zeile sucht im Dateisystem ob eine Datei gleichen Namens mit der Dateierweiterung .gz existiert.
Die fünfte Zeile liefert anstelle der .css Datei die .css.gz Datei aus.

Die Rechenzeit die der Apache Webserver dafür benötigt ist zum glück minimal.

Ergänzung durch einen „Automatismus“

Ich persönlich nutze gerne einen make Makefile um nach Änderungen schnell alle Dateien wieder zu komprimieren.

all: clean build chown

build:
	find ./css/ -type f -name "[^.]*.css" -execdir yui-compressor -o {}.css {} \;
	cd ./css/ && for f in *.css.css ; do zopfli -i1100 -c $$f > `basename $$f .css`.gz ; done

clean:  
	find ./css/ -name "*.css.css" -delete
	find ./css/ -name "*.css.gz" -delete

chown:
	find ./css/ -type f -name "[^.]*.css" -execdir chown www-data:www-data {} \;
	find ./css/ -type f -name "[^.]*.gz" -execdir chown www-data:www-data {} \;

 

Kategorien
Allgemein

Vice Konfiguration für das SpielRegal

Im SpieleRegal verwenden wir die EMulationStation, für den RaspberryPi greifen über das GPIO-Interface Arcade-Knöpfe auf fest vorgegebene Buchstaben Tasten. In dieser Anleitung beschreibe ich die Vice Konfiguration, um die Cursortasten dem Joystik in Port 2 des C64, die Taste A der Feuertaste des Joystik und die für das Spiel Turrican die benötigten Tasten [Space] für die Energielinien, [F7] für die Granate und [CTRL] um den Pause-Modus zu aktivieren.

Die Tastaturbelegung für den C64 Emulator Vice wird in der Datei /home/pi/.vice/sdl-keymap.vkm festgelegt. diese Erhält den Folgenden Inhalt.:

!CLEAR
98 7 4 8 /* B => Space */
121 0 3 8 /* Y => F7 */
13 7 2 8 /* Start (enter) => CTRL (Pause) */

Die in den Bereichen /* Kommentar */ enthaltenen Kommentare erklären die Funktion der vorangegangenen Zahlenfolgen. Die erste Zahl ist der Tastaturcode, die zwei bis drei folgenden Tahlen was im C64 ankommen soll.

Die Joystick belegung kommt in die Datei /home/pi/.vice/sdl-joymap-C64.vjm und lautet wie folgt.:

276 -2 4 /* CRSR LEFT => joy2 left /*
273 -2 8 /* CRSR UP => joy2 up */
275 -2 6 /* CRSR RIGHT=> joy2 right */
274 -2 2 /* CRSR DOWN => joy2 down */
97 -2 0 /* A => joy2 fire */

Und zum Exit des Emulators legen wir noch die Datei /home/pi/.vice/sdl-hotkey-C64.vkm mit dem folgenden Inhalt an.:

KEY             27          IDM_EXIT                          X

Hier wird das Verlassen des EMulators auf die Taste [ESC] gemappt, ursprünglich ist dies die Tastenkombination [Alt]+[X]

Zu guter letzt geben wir in der Datei /home/pi/.vice/sdl-vicerc noch an, welche Konfigurationsdateien der C64 Emulator Vice laden soll:

[C64]
KeymapSymFile="/home/pi/.vice/sdl-keymap.vkm"
MachineVideoStandard=-1
JoyMapFile="/home/pi/.vice/sdl-joymap-C64.vjm"
HotkeyFile="/home/pi/.vice/sdl-hotkey-C64.vkm"

Im Anschlus funktioniert die Steuerung des Vice C64 Emulators vollständig über die Arcade Knöpfe. Das Anschließen einer Tastatur an den Raspberry Pi ist zum Spielen von C64 Spielen nicht länger notwendig.

Kategorien
Allgemein

Apache mit vorkomprimierten Dateien

Dateien gz koprimiert vom Webserver ausliefern zu lassen kann Internetseiten erheblich beschleunigen. Leider kommt es bei der Anfrage immer zu einer kurzen Verzögerung, wärend mod_gzip oder mod_deflate die Dateien Komprimieren.
Diese Zeit lässt sich erheblich verkürzen, wenn die Dateien nicht erst bei der Auslieferung komprimiert werden sondern bereits als fertig komprimierte Dateien auf dem Server vorliegen und direkt ausgeliefert wird.

Auch lassen sich viele Dateien mit Zopfli erheblich besser komprimieren als mit dem klassischen gzip Programm.

Mit mod_rewrite kann auf einfache Weise anstelle einer Datei, die parallel zur Datei hinterlegte *.gz Datei augeliefert werden.

RewriteEngine On
RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule ^(.*)\.css $1\.css\.gz [QSA]

Wenn eine Dateien deren Name der auf die Dateierweiterung „.css“ endet von einem Browser der bei der Anfrage der Datei angegeben hat das er gzip Unterstützung bietet angefragt wird, prüft mod_rewrite ob eine Datei gleichen Namens als „.css.gz“ im gleichen Verzeichnis vorliegt. Sollte die entsprechende Datei vorliegen, wird diese Datei an stelle der angefragten „.css“ Datei mit gzip header ausgeliefert.

Die letzte angegebene Zeile kann für weitere Dateierweiterungen angepasst werden. Für JavaScript Dateien wird jedes Vorkommen von „.css“ auf „.js“ geändert.:

RewriteRule ^(.*)\.js $1\.js\.gz [QSA]

Eine Kompression ist für alle statischen Dateien Sinnvoll, die nicht andeweitig bereits komprimiert vorliegen. Besonders ist eine Vorkompression für Javascript Dateien (.js), HTML-Dateien (.html, .htm), XML-Dateien (.xml), Textdateien (.txt) sowie Stylesheets (.css) angebracht.

Kategorien
Allgemein

SMTP via Telnet

Ein Beispiel für die manuelle EMail-Zustellung via Telnet:

~$ telnet mx.example.com 25
Trying 198.51.100.215…
Connected to mx.example.com.
Escape character is ‚^]‘.
220 mx.angststalt.de ESMTP Postfix (Debian/GNU)

Die Verbindung zum Server mx.example.com wird über port 25 Hergestellt

EHLO domain.tld
250-mx.example.com
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

„Helo“ mit dem Eigenen Hostnamen um die Verbindung aufzunehmen

MAIL FROM: <test@domain.tld>
250 2.1.0 Ok

Absenderangabe der EMail.

RCPT TO: <zieladresse@dieseserver.tld>
250 2.1.5 Ok

 

Empfänger der EMail angeben.

DATA
354 End data with <CR><LF>.<CR><LF>

Hier beginnt die EMail…

Subject:Hey, hier eine EMail für dich

Angabe des Betreffs der EMail

Ich habe hier eine EMail für dich,
in dieser EMail steht eine ganze Menge Text…

An dieser Stelle folgt der Inhalt der EMail…

.
250 2.0.0 Ok: queued as 112AE1B1

Mit einem Punkt wird die EMail beendet.

QUIT
221 2.0.0 Bye
Connection closed by foreign host.

und mit dem Befehl „Quit“ wird die Verbindung beendet.

Kategorien
Allgemein

shellshock II (RPM-Paket erstellen)

In der chroot-Umgebung aus der ersten Anleitung kann auch direkt ein rpm Paket erstellen, welches eine saubere Installation der aktualisierten Bash ermöglicht.

Die Anleitung beginnt an Punkt 2 (2. Bash Quellen bereitstellen) der ersten Anleitung!

In der chroot-Umgebung des Build Systems einen Benutzer für den Paketbau anlegen:

chroot /mnt/chroot
adduser builder  && su builder && cd ~

Im Anschluß werden die für rpmbuild notwendigen Verzeichnisse, die drei Bash Konfigurations-Dateien .bashrc, .bash_profile, .bash_logout und die Specs-Datei für den rpm-Paketbau angelegt und die Bash Quellcodes sowie Patches heruntergeaden.:

mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
cd ~/rpmbuild/SOURCES/
wget ftp://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
wget ftp://ftp.gnu.org/gnu/bash/bash-4.3-patches/ -m -nd
cat <<'EOF' > dot-bash_logout
# ~/.bash_logout: executed by bash(1) when login shell exits.

# when leaving the console clear the screen to increase privacy

if [ "$SHLVL" = 1 ]; then
[ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi
EOF
cat <<'EOF' > dot-bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH
EOF
cat <<'EOF' > dot-bashrc
# If not running interactively, don't do anything
[ -z "$PS1" ] && return

# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth

# append to the history file, don't overwrite it
shopt -s histappend

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=10000
HISTFILESIZE=20000

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

# make less more friendly for non-text input files, see lesspipe(1)
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"

# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
xterm-color) color_prompt=yes;;
esac

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
# We have color support; assume it's compliant with Ecma-48
# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
# a case would tend to support setf rather than setaf.)
color_prompt=yes
else
color_prompt=
fi
fi

if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
;;
*)
;;
esac

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls='ls --color=auto'
#alias dir='dir --color=auto'
#alias vdir='vdir --color=auto'

alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi

# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'

# Add an "alert" alias for long running commands. Use like so:
# sleep 10; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
. /etc/bash_completion
fi

export LANG=de_DE.utf8
export LC_CTYPE=de_DE.UTF-8

test "$SSH_AUTH_SOCK" || exec ssh-agent $SHELL -c "ssh-add; exec $SHELL -login"
EOF
cd ~/rpmbuild/SPECS
cat < <'EOF' > bash.spec
# BASH spec File TEST
#%define beta_tag rc1
%define patchlevel .30
%define baseversion 4.3

# Build auch mit unpackaged files abschliessen
%define _unpackaged_files_terminate_build 0
%define _missing_doc_files_terminate_build 0

Version: %{baseversion}%{patchlevel}
Name: bash
Summary: The GNU Bourne Again shell
Release: 1%{?dist}
Group: System Environment/Shells
License: GPLv3+
Url: http://www.gnu.org/software/bash
Source0: ftp://ftp.gnu.org/gnu/bash/bash-%{baseversion}.tar.gz

Source1: dot-bashrc
Source2: dot-bash_profile
Source3: dot-bash_logout

# Official upstream patches
Patch001: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-001
Patch002: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-002
Patch003: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-003
Patch004: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-004
Patch005: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-005
Patch006: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-006
Patch007: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-007
Patch008: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-008
Patch009: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-009
Patch010: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-010
Patch011: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-011
Patch012: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-012
Patch013: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-013
Patch014: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-014
Patch015: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-015
Patch016: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-016
Patch017: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-017
Patch018: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-018
Patch019: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-019
Patch020: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-020
Patch021: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-021
Patch022: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-022
Patch023: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-023
Patch024: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-024
Patch025: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-025
Patch026: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-026
Patch027: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-027
Patch028: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-028
Patch029: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-029
Patch030: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-030

Requires(post): ncurses-libs
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

BuildRequires: ncurses-devel
BuildRequires: autoconf, gettext

%description
The GNU Bourne Again shell (Bash) is a shell or command language
interpreter that is compatible with the Bourne shell (sh). Bash
incorporates useful features from the Korn shell (ksh) and the C shell
(csh). Most sh scripts can be run by bash without modification.

%define pkgdocdir %{_datadir}/doc/%{name}-%{version}

%prep
#%setup -q -a 2
%setup -q -n %{name}-%{baseversion}

# Official upstream patches
%patch001 -p0 -b .001
%patch002 -p0 -b .002
%patch003 -p0 -b .003
%patch004 -p0 -b .004
%patch005 -p0 -b .005
%patch006 -p0 -b .006
%patch007 -p0 -b .007
%patch008 -p0 -b .008
%patch009 -p0 -b .009
%patch010 -p0 -b .010
%patch011 -p0 -b .011
%patch012 -p0 -b .012
%patch013 -p0 -b .013
%patch014 -p0 -b .014
%patch015 -p0 -b .015
%patch016 -p0 -b .016
%patch017 -p0 -b .017
%patch018 -p0 -b .018
%patch019 -p0 -b .019
%patch020 -p0 -b .020
%patch021 -p0 -b .021
%patch022 -p0 -b .022
%patch023 -p0 -b .023
%patch024 -p0 -b .024
%patch025 -p0 -b .025
%patch026 -p0 -b .026
%patch027 -p0 -b .027
%patch028 -p0 -b .028
%patch029 -p0 -b .029
%patch030 -p0 -b .030

echo %{version} > _distribution
echo %{release} > _patchlevel

%build
autoconf
%configure --with-bash-malloc=no --with-afs --with-installed-readline
make "CPPFLAGS=-D_GNU_SOURCE -DRECYCLES_PIDS `getconf LFS_CFLAGS`"
%check
make check
strip bash
strip bashversion

%install
rm -rf $RPM_BUILD_ROOT

if [ -e autoconf ]; then
  export PATH=.:$PATH
fi

# Fix bug #83776
perl -pi -e 's,bashref\.info,bash.info,' doc/bashref.info

make DESTDIR=$RPM_BUILD_ROOT install

mkdir -p $RPM_BUILD_ROOT/etc

# Not for printf, true and false (conflict with coreutils)
rm -f $RPM_BUILD_ROOT/%{_mandir}/man1/printf.1
rm -f $RPM_BUILD_ROOT/%{_mandir}/man1/true.1
rm -f $RPM_BUILD_ROOT/%{_mandir}/man1/false.1

pushd $RPM_BUILD_ROOT
mkdir ./bin
mv ./usr/bin/bash ./bin
ln -sf bash ./bin/sh
rm -f .%{_infodir}/dir
popd
mkdir -p $RPM_BUILD_ROOT/etc/skel
install -c -m644 %SOURCE1 $RPM_BUILD_ROOT/etc/skel/.bashrc
install -c -m644 %SOURCE2 $RPM_BUILD_ROOT/etc/skel/.bash_profile
install -c -m644 %SOURCE3 $RPM_BUILD_ROOT/etc/skel/.bash_logout
LONG_BIT=$(getconf LONG_BIT)
mv $RPM_BUILD_ROOT%{_bindir}/bashbug \
   $RPM_BUILD_ROOT%{_bindir}/bashbug-"${LONG_BIT}"

%find_lang %{name}

# lua-code von Jesse Keating  so das keine Externen Abhängigkeiten benötigt werden.
# lua-Code von Ignacio Vazquez-Abrams
%post -p 
bashfound = false;
shfound = false;

f = io.open("/etc/shells", "r");
if f == nil
then
  f = io.open("/etc/shells", "w");
else
  repeat
    t = f:read();
    if t == "/bin/bash"
    then
      bashfound = true;
    end
    if t == "/bin/sh"
    then
      shfound = true;
    end
  until t == nil;
end
f:close()

f = io.open("/etc/shells", "a");
if not bashfound
then
  f:write("/bin/bash\n")
end
if not shfound
then
  f:write("/bin/sh\n")
end
f:close()

%postun
if [ "$1" = 0 ]; then
    /bin/grep -v '^/bin/bash$' < /etc/shells | \       /bin/grep -v '^/bin/sh$' > /etc/shells.new
    /bin/mv /etc/shells.new /etc/shells
fi

%files -f %{name}.lang
%defattr(-,root,root)
%config(noreplace) /etc/skel/.b*
/bin/sh
/bin/bash
%attr(0755,root,root) %{_bindir}/bashbug-*
EOF

Die bash.spec-Datei enthält die Konfigutarion des Paketes sowie die bei der Installation und deinstallation notwendigen Scripte. Die Vorliegende SPECS Datei ist eine bearbeitung der Original Quelle von Fedora Core 12, welche ich für die aktuelle BASH angepasst habe.

Jetzt kann mit rpmbuild das Paket erstellt werden, welches direkt im Anschluss mit rpm Installiert werden kann. Das alte Bash Paket wird hierbei durch das neue Paket ersetzt.

rpmbuild -ba  bash.spec
rpm -U --force --replacefiles /mnt/chroot/home/builder/rpmbuild/RPMS/armv6l/bash-4.3.30-1.fc12.armv6l.rpm

Das aus diesem Tutorial entstehende Bash-Binary und RPM-Datei zur Installation

Kategorien
Allgemein Linux

MAC-Adresse ändern (Linux, Apple, Windows)

Die MAC-Adresse ist für jede Netzwerkschnitstelle einzigartig. Die MAC-Adresse zu ändern geht in den verschiedenen Systemen wie folgt:

Linux

Unter Linux kann die MAC-Adresse unkompliziert über das Terminal geändert werden.:

ip link set dev [Interface] addr [MAC-Adresse]

Mac OS

Wie unter Linux kann auch unter dem Apple MAC OS die Adresse über das Terminal geändert werden.
Der Aufruf sieht dort wie folgt aus:

ifconfig [Interface] ether [MAC-Adresse]

oder alternativ

ifconfig [Interface] lladdr [MAC-Adresse]

Windows 7

Unter Windows 7 muss die Mac Adresse über einen Registry Eintrag geändert werden.
Hier gilt es „regedit.exe“ zu starten und im Anschluß der Eintrag

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}

Unter diese „key“ erscheint eine Nummern-Sequenz (000, 001, 002…), von welchem festgestellt werden muss welcher die Netzwerkkarte repräsentiert, in dem Feld  „DriverDesc“ steht der Name der Netzwerkkarte. (bei mit 007)

In diesem Key (bei mir 007) suche nach dem Schlüssel “NetworkAddress” und ändere diesen. Änderungen sind über doppelklick oder alternativ Rechtsklick + Ändern.
Gib die gewünschte MAC-Adresse als zusmmenhängende Zeichenfolge, ohne Leerzeichen, Punkte oder Minuszeichen ein.

Wenn der Schlüssel bei der Netzwerkkarte nicht vorhanden ist, Rechtsklick auf einen Freien Bereich und “Neu” – “Zeichenfolge” wählen. Gib als Name “NetworkAddress” und als Wert und als Daten die gewünschte MAC Adresse ein.

Anschleßend muss noch das Netzwerkinterface deaktiviert und in folge wieder aktiviert werden.

Kategorien
Allgemein

Cronjobs unter Android einrichten

Anforderungen

  • Das Android Gerät muß für diese Anleitung gerooted sein
  • Busybox muss auf dem Android Gerät installiert sein
  • das Android Gerät muss als Init-System init.d verwenden

Creating cronjob

Erstelle im Verzeichnis /data/crontab/ eine Datei mit dem Dateinamen „root„. Diese Datei wird die Cronjobs für den Unix-Benutzer Root enthalten. Schreibe alle deine Cronjobs in diese Datei, mache die Datei anschließend ausführbar.

mkdir -pv /data/crontab
touch /data/crontab/root
chmod +x /data/crontab/root

Führe nun die folgenden Befehle aus um zum Benutzer root zu wechseln und den Cron-Daemon die Cronjobs prüfen zu lassen:

su -
crond -b -c /data/cronjob

Jetzt kannst Du prüfen ob der Cron-Daemon erfolgreich gestartet wurde:

top|grep crond

Um den Cron-Daemon crond bereits beim Starten des Android Gerät mit starten zu lassen lege eine weitere Datei im Verzeichnis /system/etc/init.d mit dem folgenden und dem folgenden Inhalt an.

mkdir -pv /system/etc/init.d
cat > /system/etc/init.d/crond << "EOF"
crond -b -c /data/crond
EOF

cronjob Beispiel

Der folgende Beispiel-Cronjob startet das Gerät jede Stunde zur dreiundfünfzigsten Minute neu. (Ein wirklich minimales Beispiel, nichts was Du wirklich möchtest):

53 * * * * reboot

Eine Anleitung wie die Zeitangaben für den Cron-Daemon aufgebaut sein müssen findest Du zum unter anderem in der Wikipedia, einen kompfortabelen Editor auf der Seite crontab-generator.org.

Fehlerbehebung

Wenn es beim Einrichten einen Feler wegen eines  „read only file system“ gibt, kann das Dateisystem über den folgenden Befehl beschreibbar neu gemounted werden:

mount -o rw,remount /dev/stl12 /system

Nach dem Anlegen der Cronjobs kannst Du über den folgenden Befehl das Dateisystem wieder nur lesbar Mounten:

mount -o ro,remount /dev/stl12 /system