Posts mit dem Label BASH werden angezeigt. Alle Posts anzeigen
Posts mit dem Label BASH werden angezeigt. Alle Posts anzeigen

Donnerstag, 22. September 2022

Versenden von E-Mails via CURL

 

Ich war erstaunt wie universell CURL doch ist. Hier ein Beispiel zum Versenden von Emails.

from="service.accout.1@xyz.com" 

mail_template_text="Hello!\n"

 
file=$(echo -e "From: $from\nTo: mirko@xyz.com\nSubject: Dringend\n\n $mail_template_text\n")


curl    --url       "smtp://mail.xyz.com:587" \
--mail-from "$from" \
--mail-rcpt "mirko@xyz.com" \
--mail-rcpt "mirko.ebert@xyz.com" \
--mail-rcpt "other.guy@xyz.com" \ 
--user      "$from:smtpPassword" \
-sS \
-T -  <<<"$file"


Zuerst wird ein String für die Email zusammengebaut. Dann wird dieser String per CURL an mehrere Empfänger verschickt.

Donnerstag, 6. April 2017

R Package Helper: Finden aller benötigten R Pakete

So kann man alle R Pakete in einem Projekt finden und in eine Datei schreiben.

RUN grep -r -h library src | tr '()' ' ' | tr '"' ' ' | awk '{print $2}' > DEPENDENCIES.txt

Später kann man diese Datei im Dockerfile verwenden um im Docker alle benutzen R Pakete zu installieren:

RUN cat DEPENDENCIES.txt  | xargs -i Rscript -e 'install.packages("{}", repos="http://cran.us.r-project.org")'

Mittwoch, 8. März 2017

Robustness Test Scenario: Slow Down Connection via Command tc

Ein Robustness Test Szenario ist die langsame Verbindung zwischen Servern. Der Grund für so eine Störung können vielfältig sein, liegen aber meistens im Bereich Last, Lastenverteilung und fehlerhafte Software. Konkret können massives Logging (Debug Schalter in Live vergessen) zu massiven Schreiboperationen führen, wenn die Festplatte nicht lokal ist sondern per NAS bereitgestellt wird, kann dieses Logging auch andere Diensten Beeinträchtigen, weil das NAS ausgelastet ist.

Dieses Szenario kann jetzt auf verschiedenen Wege simuliert werden. Man kann das Logging simulieren oder man kann die Netzwerkschnittstelle drosseln. Bei SSH Verbindungen ist dies einfach, dort gibt es einen passenden Schalter, den gibt es auch bei CURL und Webbrowser wie Chrome können das auch. Aber es gibt für Linux auch einen allgemeineren Weg mit dem Commando tc. TC steht für Traffic Control und erlaubt das Drosseln der Verbindungsgeschwindigkeit (Bandbreite, bandwidth) und eine Erhöhung der Netzwerklatenz (ping, trafic shaping).

Hier ein kleines Beispiel.
Ein Ping auf Google.com Dauer etwas länger als 9ms.

Jetzt fügen wir 500ms Latenz hinzu.
sudo tc qdisc add dev eth0 root netem delay 500ms


Jetzt benötigt der Ping 509 ms.

Danach noch alle Änderungen rückgängig machen.
sudo tc qdisc del dev eth0 root

Das gleich funktioniert auch mit der Begrenzung des Traffic Durchsatzes. Neben Robustness Test lassen sich auch Web Performance Messungen mit unterschiedlichen Anbindungen (3G, UMTS, ...) simulieren.

Link:

  1. http://mark.koli.ch/slowdown-throttle-bandwidth-linux-network-interface
  2. https://github.com/markkolich/blog/blob/master/content/entries/slowdown-throttle-bandwidth-linux-network-interface.md

Sonntag, 1. Januar 2017

Identifizieren von allen Geräten im lokalen Netzwerk

Mittels Ping findet man einfach heraus ob ein Server läuft. Mittels einer Schleife kann man so z.B. ein Netzwerksegment scannen Leider antwortet nicht jedes Gerät auf einen Ping. Eine Alternative ist Nmap. Z.B kann man mit einem Einzeiler ein lokales Netzwerksegment scannen:
nmap -sn 192.168.0.0-255 

Am Beste man schickt gleich ARP hinterher um alle Netzwerk Elemente zu finden:
arp -a | grep -v '^?'

So werden auch Handys gefunden.

Nmap und Arp lassen sich über die üblichen Paketmanager installieren, auch mit brew auf dem Mac.

Mittwoch, 12. Oktober 2016

Berechnen der CPU Nutzung in Bash

Für Last-Analysen, Performance-Analysen und Robustheitsanalysen ist es sinnvoll die CPU Auslastung des Zielsystems zu kennen um auf mögliche Ressourcenprobleme bei des CPU zu schliessen. Dabei sind die Programme top und stop die ersten Anlaufpunkte. Um aber die gesamte CPU Auslastung automatisch per BASH Script zu erfassen sind nur begrenzt geeignet. Alternativ kann man sysstat benutzen, welches aber erst installiert werden muss. Hier nun eine sehr einfache Methode die CPU Auslastung per BASH Script ohne Zusatzsoftware zu erfassen:

ps -A -o pcpu | tail -n+2 | paste -s -d '+' - | tr , . |bc

Dieser Wert muss dann noch durch die Anzahl der CPUs geteilt werden um die Auslastung des Servers zu ermitteln. Das tr ist nur auf Systemen notwendig, die ein Komma als Dezimal-Separator haben, sonst schadet es aber auch nicht.


Die Anzahl der Kerne eines Servers kann man auf verschiedene Weisen ermitteln. Hier die meine, welche für Linux als auch für macOS funktioniert:

getCores () {
    os=`uname`
    if [[ "$os" == 'Linux' ]]; then
        core=`nproc`
    elif [[ "$os" == 'Darwin' ]]; then
        core=`sysctl -n hw.ncpu`
    else
        echo "Error: Unsupported platform: $os"
        core=-1
        exit
    fi
}

Die Anzahl der Kerne wird in die BASH Variable $core geschrieben.



Mittwoch, 14. September 2016

Robust Code: Update von Daten mittels Switch

Stell dir vor du downloadest regelmäßig eine Datei, die du danach weiter verarbeitest. Hier zur Illustration als Bash:

curl -sS "http://eber-p.com/report.csv" | wc -l

Wenn jetzt der Download aus irgend einem Grund fehlschlägt, dann bricht die Datenverarbeitung ab. Dein Service liefert keine Ergebnis mehr. Hier pflanzt sich ein Fehler durch mehrere Systeme fort. Das kann gewollt sein, meistens möchte man aber eine robuste Lösung die nicht bei jedem Downloadfehler zusammenbricht. Dies kann man erreichen, in dem man die alte Datei nicht überschreibt, sondern als Fall Back behält und sie ggf. erst nach einem erfolgreichen Download überschreibt.

wget "http://eber-p.com/report.csv" 
r=`ls -t report.csv* | head -n 1`
cat $r | wc -l   


Wichtig ist nur, dass man die Benutzung des Fall Backs dokumentiert, im Log File und oder in der Antwort des Services. Letztere wird hier nicht gemacht.

Kurz zusammengefasst die robuste Softwarelösung:

  1. Lose Kopplung von Programmteilen die unterschiedliche Funktionen hat, hier Datenbeschaffung und Logik (hier zählen der Zeilen des Reports). 
  2. Puffern von alten Daten und Nutzung von diesen Daten als Fallback.

Zum Thema hier noch ein passender Link. Dort wird diese Problematik unter dem Begriff Be Atomic beschrieben.

Hier das ganze Beispiel-Skript:
#! /bin/sh

echo "Test with right URL"
u="http://ebert-p.com/report.csv"

echo "Non robust code"
curl -sS  $u | wc -l

echo "Robust code"
wget -q -a log.log  $u
r=`ls -t report.csv* | head -n 1`
cat $r | wc -l         


echo "Test with wrong URL"
u="http://ebert-p.com/report_wrong.csv"

echo "Non robust code"
curl -sS  $u | wc -l

echo "Robust code"
wget -q -a log.log  $u
r=`ls -t report.csv* | head -n 1`
cat $r | wc -l   

Und die Konsolen Ausgabe:
Test with right URL
Non robust code
    1518
Robust code
    1518
Test with wrong URL
Non robust code
      24
Robust code
    1518

Dienstag, 14. Juni 2016

Löschen von Digital Ocean Droplets via REST API in der BASH Kommandozeile mit CURL

Das Löschen eines Droplets geht sehr einfach, vorher muss man die Droplet ID (hier 17401233) ermittelt haben:
curl -X DELETE -H "Authorization: Bearer $TOKEN" "https://api.digitalocean.com/v2/droplets/17401233"

Anmerkung: Natürlich muss man die hier verwendete BASH Variable TOKEN mit dem Digital Ocean API Token füllen.

Bilder Vergleichen auf der Kommandozeile

Wie vergleicht man am besten Bilder? Dazu muss man zuerst wissen, was man genau wissen möchte. Um die Identität zweier Bilder nachzuweisen reicht in der Regel die Berechnung des MD5 Wertes. Komplizierter wird es, wenn ein und das selbe Bild auf zwei Weisen komprimiert wurde, sind die Bilder gleich und wenn nein, wo sind die Unterschiede.

Zuerst sollte man den Blick auf die Bildgrösse, nicht die Dateigrösse, richten. Dabei hilft das Programm exvi2, auch wenn es eigentlich sonst der Manipulation von Bild-Metadaten dient.
metalpro2:test-diffimage mirkoebert$ exiv2 15556649?_f*
15556649A_formatz.jpg File name       : 15556649A_formatz.jpg
15556649A_formatz.jpg File size       : 103058 Bytes
15556649A_formatz.jpg MIME type       : image/jpeg
15556649A_formatz.jpg Image size      : 720 x 960
15556649A_formatz.jpg: No Exif data found in the file
15556649S_formatz.jpg File name       : 15556649S_formatz.jpg
15556649S_formatz.jpg File size       : 156172 Bytes
15556649S_formatz.jpg MIME type       : image/jpeg
15556649S_formatz.jpg Image size      : 720 x 960

15556649S_formatz.jpg: No Exif data found in the file

Hier sind beide Bilder gleich gross. Jetzt geht es weiter mit dem Vergleich des Inhalts mittels Imagemagic und der Funktion compare.
compare 15556649A_formatz.jpg 15556649S_formatz 15556649_diff.png 

Hier wird ein simples Differenzbild erzeugt, dass man dann begutachten kann. Im Bild unten sieht bei der Vergrösserung des Bildes Unterschiede (Weichzeichnung, Farbe) vor allem an den Kanten. Das obere, rechte Bild verliert Tiefe, Schärfe und Farbe. Alternativ kann man compare auch eine Metrik mitgeben, mit der man das Differenzbild errechnet.



Weiter Links:

  1. Automated Visual Regression Tests with JLineup im OTTO DEV Blog

Montag, 13. Juni 2016

Wie bekomme ich die IPs von meinen Digital Ocean Servern?

Erzeuge einen API Token bei Digital Ocean, oben im Menü und setze eine Shell Variable, der Einfachheit halber.
export TOKEN=e21558xx1111111111111222333

Hole alle Informationen deiner Droplets via Digital Ocean REST API:
curl  -sS -X GET "https://api.digitalocean.com/v2/droplets?per_page=200" -H "Authorization: Bearer $TOKEN"  > droplets.json

Vorsicht mit der Aufteilung der Antwort in mehrere Seiten. Dazu gibt es in der Antwort die Links:
cat droplets.json | jq '.links'
{
  "pages": {
    "last": "https://api.digitalocean.com/v2/droplets?page=2&per_page=200",
    "next": "https://api.digitalocean.com/v2/droplets?page=2&per_page=200"
  }


}

Die nächste Seite erhält man:
curl  -sS -X GET "https://api.digitalocean.com/v2/droplets?page=2&per_page=200" -H "Authorization: Bearer $TOKEN"  > droplets.json

Filter aus den Agenten die dich interessieren z.B. bezüglich des Namens und hole dir die IP4 Adressen.


cat droplets.json | jq '.droplets[] | .name+";"+.networks.v4[].ip_address' | tr -d "\"" | grep imageservertest-agent | awk -F ';' '{ print $2}' > agents.txt


Das ergibt dann ein schöne IP Liste als Datei. 
wc -l agents.txt 
22 agents.txt

Erweiterung um Droplet IDs
Die Droplet Ids benötigt man z.B. wenn man automatisiert seine Droplet zerstören (löschen) möchte.

cat droplets.json | jq -r '.droplets[] | [ .name+";"+.networks.v4[].ip_address, .id|tostring] | join(";")' | grep "imageservertest-agent" > agents.csv

Interessant sind die beiden Verkettungen in JQ. Einmal werden zwei String via + verkettet. Das zweite mal wird eine Zahl in einen Stein umgewandelt und danach mittels join zu eine CSV Datei verkettet.

Anmerkung: Durch die JQ option -r werden die umschliessenden Double Ticks verhindert. Dadurch kann im zweiten Beispiel der tr Schritt ausgelassen werden.

Dienstag, 12. Januar 2016

HTTP2

HTTP2 is the new, better, faster HTTP and it replaces Googles SPDY (http://programming-2.blogspot.de/search?q=SPDY). One really informative site to HTTP2 is https://http2-explained.readthedocs.org/en/latest/index.html

To use HTTP2, you need an client. CURL support it, but not as default. To use HTTP2 with CURL on MacOSX, you have to install CURL with brew:

brew install curl --with-nghttp2

Now you can check out HTTP2 with CURL

If you got following error:
curl: (1) Unsupported protocol
You use an CURL without compiled HTTP2 support. On MacOSX brew doesn't replace the existing CURL. You have to use the full path to the CURL from brew:

/usr/local/opt/curl/bin/curl --http2 -I -v https://google.com

Montag, 8. Juni 2015

Json Processing in der BASH mit JQ

JSON ist nicht das schönste Datenformat, so gibt es keine Kommentare in JSON. Aber zur Zeit braucht man JSON es an vielen Stellen, z.B. um Elastic Search Abfragen zu stellen bzw. die Elastic Search Results auszuwerten. Wer mit der Bash arbeitet wird JQ als Anfragewerkzeug zu schätzen wissen. Ein immer wieder auftauchendes Problem sind Keys in JSON, die böse Zeichen enthalten wie / oder - (Slash, Minus) die bei Abfragen via JQ escaped werden müssen.

jq .hits.hits[3]._source.http-rc result2.0.json 
error: rc is not defined

.hits.hits[3]._source.http-rc                           1 compile error

So geht es richtig:

jq '.hits.hits[3]._source["http-rc"]' result2.0.json 
"200"


Was lernen wir daraus? Bezeichner, Keys, Namen im Camel Case setzen! Das spart viel Zeit, bei deinen Kollegen.

Hier als Ergänzung der Link zu Googles JSON Style Guide: http://google-styleguide.googlecode.com/svn/trunk/jsoncstyleguide.xml#Property_Name_Format

Dienstag, 2. Dezember 2014

Use latest Vim on MacOSX and Setup

Vim ist neben Eclipse mein zweit liebster Editor für Sourcecode. MacOSX kommt mit einem nicht ganz aktuellem Vim daher, dies ist oft kein grosses Problem.  Man kann mit  dem MacOSX Packetmanager Homebrew eine aktuelle Vim Version installieren:
brew install vim 

Bei einem Aufruf von Vim wird jetzt aber immer noch das alte Vim gestartet. die kann man wie folgt im Terminal beheben:
sudo mv /usr/bin/vim /usr/bin/vim73
sudo ln -s  /usr/local/Cellar/vim/7.4.488/bin/vim /usr/bin/vim

Das alte Vim bleibt so erhalten.

Dann hat man aber auf dem MacBook Pro das Problem dass die Pfeiltasten nicht korrekt funktionieren, sie liefern die Buchstaben A, B, C, D. Ausserdem funktioniert die Backspace Taste nicht. Um dies Beides zu beheben, muss man die die Datei .vimrc im Home-Vereichnis des Users anlegen und sie mit folgen Inhalt versehen:
set nocp

set backspace=2

Neben dem alten Vim bietet MacOSX auch ein veraltetes Git und Maven. 

Donnerstag, 4. Juli 2013

BASH Hacks 1

Das Escaping in BASH ist immer wieder eine Herausforderung. Hier ein Beispiel: das Kopieren von Dateien via SCP die im Dateinamen Leerzeichen enthalten:
scp  boss@42.ath.cx:"'/share/Public/Dokumente/JUGHRO/2011-06-16 Clean Code.odp'" .