Git : User / Passwortabfrage bei git push

Bei dem Versuch ein git push zu machen erfolgt eine Abfrage nach Passwort & User. Der Hash des SSH Keys war aber sauber im Server registriert. Mit dem Befehl git remote -v habe ich mir erstmal die Quellen angesehen. Der initiale pull wurde scheinbar mit https ausgeführt, somit wird der ssh key gar nicht angefragt.
git remote -v
origin https://[URL]/[GRUPPE]/[PROJEKT].git (fetch)
origin https://[URL]/[GRUPPE]/[PROJEKT].git (push)
Nachdem ich die Quelle auf ssh konfiguriert habe lief auch alles so wie erwartet.
git remote set-url origin git@[FQDN]:[GRUPPE]/[PROJEKT].git
Ein erneutes Abfragen der Konfiguration
git remote -v
origin	git@[FQDN]:[GRUPPE]/[PROJEKT].git (fetch)
origin	git@[FQDN]:[GRUPPE]/[PROJEKT].git (push)

Bash : Video aus Webcam Bildern erstellen

Da ich es einfacher finde für die Archivierung von Webcam Bildern Videos zu verwenden habe ich diese Script geschrieben. Die Webcam erstellt ein Bild wenn Sie Bewegung wahrnimmt. Diese werden von diesem Skript zu einen einzelnen Video vereint.
Ihr müsst nur die Variablen euren Gegebenheiten anpassen.
Variablen :
{FTP-USER} = der FTP Benutzer
{FTP-GROUP} = die FTP Gruppe
{QUELL-PFAD} = quelle der Snapshots
{ZIEL-PFAD} = wo soll das Video abgelegt werden ?
Script :
#!/bin/bash
#
# Konvertiert Einzelbilder zu Video mit ffmpeg
_src_folder={QUELL-PFAD}
_src_file_format=jpg
_tar_folder={ZIEL-PFAD}
_tar_file_format=mpg
_tar_file_name="video_$(date +%Y-%m-%d_%R)"
_temp_folder=$(mktemp -d)
_length=5
_cnt_files_in_src=$(ls -l ${_src_folder}/*.${_src_file_format} 2>/dev/null | wc -l)
_ftp_user={FTP-USER}
_ftp_group={FTP-GROUP}
_bin_ffmpeg=$(which ffmpeg)
_bin_chown=$(which chown)
_bin_rm=$(which rm)
_bin_find=$(which find)
# Bilder nach konvertieren löschen ?
DELFILESAFTERVIDEO=TRUE # TRUE OR FALSE
# setze symlinks in tempfolder
cnt=1
if [ ${_cnt_files_in_src} != "0" ]; then
        if [[ -d  "${_temp_folder}" && -d "${_src_folder}" ]]; then
                for i in ${_src_folder}/*.${_src_file_format};
                do
                        ln -s "${i}" "${_temp_folder}/$(printf %0${_length}d $cnt).jpg"
                        ((cnt++))
                done
                ${_bin_ffmpeg} -f image2 -i "${_temp_folder}/%0${_length}d.jpg" -r 25 -vcodec libx264 "${_tar_folder}/${_tar_file_name}.${_tar_file_format}" > /dev/null 2>&1
                ${_bin_rm} -rf "${_temp_folder}"
                ${_bin_chown} ${_ftp_user}:${_ftp_group} "${_tar_folder}/${_tar_file_name}.${_tar_file_format}"
                # löscht alle vorhanden bilder
                if [ ${DELFILESAFTERVIDEO} == "TRUE" ]; then
                ${_bin_find} ${_src_folder}/ -name "*.${_src_file_format}" -exec ${_bin_rm} {} \;
                fi
        else
                echo "ERROR : TEMP FOLDER OR SOURCE FOLDER DO NOT EXISTS"
                exit 99
        fi
else
                echo "found no files in source exit"
                exit 99
fi

RaspberryPI : DHT22 Sensor - Temperatur & Luftfeuchtigkeit monitoren

Wenn man zuhause Temperatur & Luftfeuchtigkeit monitoren will bietet sich der DHT22 an. Ich habe mich für diesen hier entschieden.
Um den Sensor in Betreib zu nehmen benötigen wir erst noch einiges an Software auf dem kleinen.
Dazu werden wir erstmal Admin auf dem Raspberry
sudo -s
dann installieren wir die benötigten Packete mit
apt install build-essential python-dev python-openssl git-core vim
wir benötigen jetzt noch die python module für den sensor das können wir mit dem folgenden Befehl erledigen.
cd ~ && git clone https://github.com/adafruit/Adafruit_Python_DHT.git && cd Adafruit_Python_DHT && python setup.py install
jetzt sollte alles installiert sein was wir benötigen.

Jetzt schließen wir noch den Sensor nach dem unten aufgeführten Schema an.

DHT22 an Raspberry PI 3
DHT22 an Raspberry PI 3

DHT22 an Raspberry PI 3 Schema
Adafruit liefert hier ein kleines example mit zum testen.
~/Adafruit_Python_DHT/example/Adafruit.py 22 4
Wenn alles richtig gemacht wurde erhällt man jetzt einen Output der so oder so ähnlich aussieht.
~/Adafruit_Python_DHT/examples/AdafruitDHT.py 22 4
Temp=22.7*  Humidity=44.5%
22 = der Sensor DHT22
4 = der gpio Pin an dem die Sensor Leitung hängt

Jetzt bekommen wir Werte vom Sensor um diese aber zu Monitoren brauchen wir noch eine Software die das erledigt. Da ich hier bereits eine fertige Grafana Installation habe verwende ich natürlich diese. Die Werte erhält Grafana bereits über den collectd Agent, deswegen habe ich mich dazu entschieden auch die Temperaturen über diesen Weg zu reporten.

Ich habe bei meinem Skript schon darauf geachtet das der Sensor justiert werden kann (ADJUST SETTINGS DHT22)

Hier mein Skript für collectd, das legt ihr unter dem Namen dht22.py im Pfad /usr/lib/collectd/python ab
import collectd
import Adafruit_DHT
from decimal import Decimal

SENSOR = Adafruit_DHT.DHT22
PIN = 4

# ADJUST SETTINGS DHT22

# mögliche werte + / - / NULL
ADJ_TEMP_DO = "-"
ADJ_TEMP_VAR = "1.2"

# mögliche werte + / - / NULL
ADJ_HUM_DO = ""
ADJ_HUM_VAR = "0"

def config_func(config):
    pin_set = False
    for node in config.children:
        key = node.key.lower()
        val = node.values[0]
        if key == 'gpio_pin':
            global PIN
            PIN = val
            pin_set = True
        else:
            collectd.info('DHT22 Plugin: Unknown config key "%s"' % key)
    if pin_set:
        collectd.info('DHT22 Plugin : Using override PIN %s' % PIN)
    else:
        collectd.info('DHT22 Plugin : Using default PIN  %s' % PIN)
def read_measurements():
    humidity, temperature = Adafruit_DHT.read_retry(SENSOR, PIN)
    if humidity is not None and temperature is not None:
        if ADJ_TEMP_DO == "-":
            _temp = round(Decimal(temperature),2) - round(Decimal(ADJ_TEMP_VAR),2)
        elif ADJ_TEMP_DO == "+":
            _temp = round(Decimal(temperature),2) + round(Decimal(ADJ_TEMP_VAR),2)
        else:
            _temp = round(Decimal(temperature),2)
        if ADJ_HUM_DO == "-":
            _hum =  round(Decimal(humidity),2) - round(Decimal(ADJ_HUM_VAR),2)
        elif ADJ_HUM_DO == "+":
            _hum =  round(Decimal(humidity),2) + round(Decimal(ADJ_HUM_VAR),2)
        else:
            _hum =  round(Decimal(humidity),2)
    val = collectd.Values(type='temperature')
    val.plugin = 'DHT22_SENSOR'
    val.dispatch(values=[_temp])
    val = collectd.Values(type='humidity')
    val.plugin = 'DHT22_SENSOR'
    val.dispatch(values=[_hum])
collectd.register_config(config_func)
collectd.register_read(read_measurements)

Damit collectd das Skript auch verwendet muss es natürlich erstmal konfiguriert sein.
Auszug aus collectd.conf
.....
.....
LoadPlugin python
.....
.....
<Plugin python>
    ModulePath "/usr/lib/collectd/python"
    Import dht22
    <Module dht22>
        gpio_pin "4"
    </Module>
</python>
dann noch einen Restart von collectd
systemctl restart collectd
wenn ihr alles richtig gemacht habt könnt ihr jetzt dieses Panel in Grafana anlegen.

DHT22 in Grafana
DHT22 in Grafana

Python3 : Kleiner Portscanner

Ist jetzt zwar kein Hexenwerk aber hier ein kleiner Portscanner in Python3

#!/usr/bin/env python3
import argparse , socket , sys , logging
from datetime import datetime

SOCKET_STATES = {
    0: "open",
    11: "firewalled",
    111: "closed",
}

def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument("hostname", metavar="HOSTNAME",
                        help="define the hostname to be checked")
    parser.add_argument("start_port", type=int, metavar="START_PORT",
                        help="define the start port")
    parser.add_argument("end_port", type=int, metavar="END_PORT",
                        help="define the end port")
    parser.add_argument("-a", "--all-ports", action="store_true",
                        help="shows all (default is show only open ports)")
    parser.add_argument("-l", "--logfile", type=str, 
    					help="if set i will write an logfile (you have to set an logfile incl path)")
    parser.add_argument("-t", "--timeout", type=int, default=3, 
    					help=("set the TIMEOUT for socket operations (default is 3 seconds)"))
    parser.add_argument("-v", "--verbose", action="store_true",
                        help="set debug mode (set --all-ports)")
    args = parser.parse_args()
    
    if args.end_port < args.start_port:
    	sys.exit("END_PORT must be higher then START_PORT")

    if 0 < args.start_port <= 65535 and 0 < args.end_port <= 65535:
        return args
    else:
        sys.exit("The Portrange must between 1-65535")

def get_ip_address(hostname):
    try:
        return socket.gethostbyname(hostname)
    except socket.error as err:
        # print (str(err))
        print ('Hostname could not be resolved. Exiting')
        sys.exit(4)

def check_port(ip, port):
    try:
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
            result = s.connect_ex((ip, port))
            return SOCKET_STATES.get(result, result)
    except KeyboardInterrupt:
    	sys.exit(1)
    except socket.gaierror:
        print ('Hostname could not be resolved. Exiting')
        sys.exit(3)
    except socket.error:
        print ("Couldn't connect to server")
        sys.exit(2)

def write_log(entry,state):
	if state in ['info', 'warning', 'critical','error']:
		log_method = getattr(logging,state)
		log_method(str(entry))

def scan_ports(remote_host, start_port, end_port, logfile , debug=False, show_all=False):
    ip = get_ip_address(remote_host)
    # Print Banner
    print ("-" * 90)
    print ("please wait, scanning remote host {0} , takes some time !".format(ip))
    print ("-" * 90)
    print ("\n")

    t_start = datetime.now()
    for port in range(start_port, end_port + 1):
        if debug:
            print ("\n--> check port {0} on ip {1}\n".format(port, ip))
        port_state = check_port(ip, port)
        if logfile:
        	write_log ("--> check port {0} on ip {1} its {2}".format(port, ip, port_state),"info")
        if port_state == "open" or show_all or debug:
            print ("Port {0: >5}: {1: >10}".format(port, port_state))
    duration = datetime.now() - t_start

    print ("\n")
    print ("-" * 90)
    print ("scanning completed in : {0}".format(duration))

if __name__ == '__main__':
    args = parse_args()
    socket.setdefaulttimeout(int(args.timeout))
    logging.basicConfig(format='%(asctime)s | %(levelname)s | %(message)s',filename=args.logfile,filemode='w',level=logging.DEBUG)
    scan_ports(remote_host=args.hostname,
               start_port=args.start_port, end_port=args.end_port,
               debug=args.verbose, show_all=args.all_ports,logfile=args.logfile)
“Sicher ist, dass nichts sicher ist. Selbst das nicht.”
Joachim Ringelnatz