home » search tags
Die Suche tag = python ergab 12 Treffer:

Oktober
21
janitor » #useless #code #python
Für ein Projekt (u.a. GIS) nutze ich das Tool pythonwhois. Leider kommt es bei manchen Abfragen zur Fehlermeldung.
Exception Type:	UnicodeDecodeError
Exception Value:
'utf8' codec can't decode byte 0xdf in position 706: invalid continuation byte

Der Grund liegt an der fehlerhaften Dekodierung des Rückgabewerts der Abfrage.

Als workaround kann man in pythonwhois/net.py (Zeile 94) die folgende Änderung durchführen:
return buff.decode("utf-8")

ersetzen mit
return buff.decode("utf-8", "replace")

Mai
4
Nicht jeder Dienst der auf einem System laufen soll verfügt über ein praktisches init-Script (oder man hat einfach keine Lust selbst eins zu erstellen).

Wie soll man seine Dienste dann aber starten, stoppen oder neu starten?

Hierfür bietet sich der in Python geschriebene supervisord an.

Supervisor is a client/server system that allows its users to monitor and control a number of processes on UNIX-like operating systems.

It shares some of the same goals of programs like launchd, daemontools, and runit. Unlike some of these programs, it is not meant to be run as a substitute for init as “process id 1”. Instead it is meant to be used to control processes related to a project or a customer, and is meant to start like any other program at boot time.

Installation

Die Installation gelingt einfach und schnell mittels

pip install supervisor



In diesem Beispiel gehe ich davon aus das alle Konfigurationsdateien die den Dienst supervisord betreffen unter /etc/supervisord/ und die der betreffenden Dienste unter /etc/supervisord/conf.d/ liegen.

mkdir -p /etc/supervisord/conf.d/



Nun kann man eine Basiskonfiguration erstellen

echo_supervisord_conf > /etc/supervisord/supervisord.conf



Um /etc/supervisord/conf.d/ zu aktivieren, muss am Ende der Datei /etc/supervisord/supervisord.conf folgender EIntrag hinzugefügt werden

[include]
files = /etc/supervisord/conf.d/*.ini



Nach dem starten von supervisord

supervisord -c /etc/supervisord/supervisord.conf



kann man nun auf das CLI zugreifen

supervisorctl



Die wichtigsten Funktionen sind

status => zeigt den Status der einzelnen Dienste
reread => liest die Konfigurationsdateien neu ein
update => aktualisiert den Dienst, falls Änderungen an der Konfiguration vorgenommen wurden.
exit => beendet die CLI

Dienst hinzufügen

Um z.B. elasticsearch mittels supervisord zu verwalten, muss zuerst eine passende Konfigurationsdatei unter /etc/supervisord/conf.d/ erstellen werden (z.B. elasticsearch.ini)

[program:elasticsearch]
autostart = false
environment=JAVA_HOME="/opt/java/",PATH="/usr/bin:/sbin:/bin:",HOME="/opt/elasticsearch/"
command=/opt/elasticsearch/bin/elasticsearch



Nach dem einlesen der Konfiguration mit

supervisorctl reread && supervisorctl update



kann der aktuelle Status mit:

supervisorctl status



abgefragt werden.

Ausgabe:

elasticsearch    STOPPED    Not started



Um den Dienst (in diesem Beispiel elasticsearch) zu starten genügt

supervisorctl start elasticsearch



Eine erneute Statusabfrage sollte nun

elasticsearch    RUNNING    pid 2538, uptime 0:00:03



ergeben.

Sonstiges

supervisord bietet darüber hinaus noch weiter Möglichkeiten der Konfiguration, so ist es z.B. möglich die Dienste über ein Webinterface zu nutzen oder eine Authentifizierung zu aktivieren.

April
19
janitor » #useless #python #code
Wann immer man Bytes summiert und Werte wie 32184729924 als Ergebnis bekommt, fragt man sich wieviele MB bzw. GB sind das?

In Python nutze ich in meinem Skripten immer die folgende Funktion

import math

def convertSize(size):
size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
i = int(math.floor(math.log(size,1024)))
p = math.pow(1024,i)
s = round(size/p,2)
if (s > 0):
return '%s %s' % (s,size_name[i])
else:
return '0B'



Wann immer ich einen Wert in eine benutzerfreundliche Form bringen will/muss genügt der Aufruf

convertSize(float("32184729924"))



und erhalte als Rückgabewert 29.97 GB
März
27
Was macht man nun mit seiner frischen Installation von elasticsearch?

Als kleines Beispiel habe ich einen Indexer erstellt, der ein definiertes Verzeichnis nach Dateien durchsucht und deren Inhalt in ES ablegt.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import magic
import os
import elasticsearch
from datetime import datetime

indexName = "local-fs"

baseDir = "/home/user"

wantedMime = ['text/x-python', 'text/x-perl', 'text/x-shellscript', 'text/plain']

#-- initialize elasticsearch connection
es = elasticsearch.Elasticsearch("localhost:9200")

#-- read given directory
for dirName, dirNameList, fileNameList in os.walk(baseDir):
for fileName in fileNameList:
filePath = os.path.join(dirName, fileName)
#-- guess file/mime type
mimeType = magic.from_file(filePath, mime=True)
#-- if mimetype is wanted
if mimeType in wantedMime:
#-- read content
with open(filePath, 'r') as infile:
filedata = infile.read()
#-- write everything to elasticsearch
es.index(index=indexName,
doc_type="fs",
body = {
"timestamp": datetime.now(),
"filename": fileName,
"filepath": dirName,
"mimetype": mimeType,
"content": filedata,
})



Das benötigte Pythonmodul magic lässt sich wie immer einfach per pip installieren

sudo pip install python-magic



Wie kommt man aber wieder an die gespeicherten Daten ran? Ein einfacher/schneller weg ist curl

Möchte man z.B. alle Dokumente mit dem mimetype python sehen, genügt der folgende Aufruf:

curl -XGET 'http://localhost:9200/local-fs/_search?pretty' -d \
'{"query":{"bool":{"must":[{"query_string":{"default_field":"fs.mimetype","query":"python"}}],\
"must_not":[],"should":[]}},"from":0,"size":50,"sort":[],"facets":{}}'

Februar
18
Wie hier bereits erwähnt möchte ich gerne wissen wenn ein Zombie sein Unwesen auf eines meiner Systeme treibt, daher habe ich einen passenden check für Nagios geschrieben...

Wie immer kann man die aktuellste Version in meinem öff. GIT repo finden.
Februar
17
Da ich auf den alternativen logshipper beaver setzte, nutze ich einen Nagioscheck um zu überprüfen ob dieser Dienst noch läuft.

Der check wird wie folgt aufgerufen:

./check_beaver -P /var/run/beaver.pid



Wie immer kann man diesen check im passenden GIT repo finden.
Februar
14
In einer Umgebung mit vielen RedHat-Installation möchte man gerne den Überblick behalten ob auch wirklich alle Systeme im RHN angemeldet sind.

Hierfür habe ich einen check für Nagios erstellt, der genau dieses automatisch prüft.

Die aktuellste Version kann man in meinem GIT finden.
Januar
31
janitor » #useless #code #python
Wer auf seinem System fail2ban betreibt um unliebsame Besucher zu blockieren kann sich mit ein paar Zeilen Pythoncode eine Übersicht generieren lassen, welche Adressen wieoft blockiert wurden

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re
import operator

f2bLog = "/var/log/fail2ban.log"
f = open(f2bLog, "r").readlines()

addrList = {}

for i in f:
if re.search(r'Ban', i):
line = i.strip()
date, time, info, severity, module, action, addr = line.split(' ')
if not addr in addrList:
count = 1
addrList[addr] = count
else:
addrList[addr] = count + 1

allAddr = sorted(addrList.iteritems(), key=operator.itemgetter(1), reverse=True)

print 10*"="
print " ALL BANNED IPs"
print 10*"="

for i in allAddr:
print "%16s => %s" % (i[0], i[1])
print 10*"="



Die Ausgabe wäre dann z.B.

==========
ALL BANNED IPs
==========
212.122.xxx.xxx => 6
208.97.xxx.xxx => 6
88.247.xxx.xxx => 4
90.145.xxx.xxx => 2
105.236.xxx.xxx => 2
89.216.xxx.xxx => 1


Die xxx in der Adresse wurden von mir manuell eingesetzt
Dezember
19
Nutzt man matlib um Grafiken zu erzeugen, kann es vorkommen das man mit folgender Fehlermeldung "belohnt" wird

no display name and no $DISPLAY environment variable



Der Grund liegt in der Tatsache das matlib versucht nach dem erstellen des Bildes dieses mittels .show() anzuzeigen, was bei einer Webanwendung nur bedingt Sinn ergibt.
Abhilfe schafft die Wahl des passenden backends, in diesem Falle Agg beim import von matlib

import matplotlib

matplotlib.use('Agg')



Wichtig hierbei ist, das vor allen anderen Zuweisungen das backend ausgewählt wird.
Dezember
11
janitor » #code #python
Wie überprüfe ich (unter Linux) mit Python ob z.B eine Festplatte eingehängt ist und ob die Berechtigung passt? Hierfür bietet Python zwei passende Module an, zum einen os und zum anderen stat

Prüfen wir zunächst ob der mountpoint vorhanden ist

>>> import os
>>> os.path.ismount('/')
True



Scheinbar ist / vorhanden (da True), dann schauen wir uns mal die Berechtigung an

>>> import os, stat
>>> os.stat('/')
posix.stat_result(st_mode=16877, st_ino=2, st_dev=65024L, \
st_nlink=26, st_uid=0, st_gid=0, st_size=4096, st_atime=1386747118,\
st_mtime=1384790336, st_ctime=1384790336)



Die genaue Erläuterung der einzelnen Wert kann man hier nachlesen, für uns ist st_mode von Interesse.

>>> import os, stat
>>> os.stat('/').st_mode
16877



Die Ausgabe von 16877 ist nun nicht unbedingt das erwartete Ergebnis, daher muss das Ergebnis durch S_IMODE gewandelt werden.

>>> import os, stat
>>> stat.S_IMODE(os.stat('/').st_mode)
493



Eine Berechtigung von 493 scheint eher unwahrscheinlich, Daher werfen wir mal einen Blick in die Dokumentation des Modul stat und finden folgendes:

stat.S_IMODE(mode)
Return the portion of the file’s mode that can be set by os.chmod()—that is,
the file’s permission bits, plus the sticky bit, set-group-id, and set-user-id
bits (on systems that support them).


Die Lösung ist oct
>>> import os, stat
>>> oct(stat.S_IMODE(os.stat('/').st_mode))
'0755'

Dezember
9
janitor » #code #puppet #python
Wie bereits hier und hier beschrieben bietet Puppet eine REST API... abgesehen der Zugriffe mittels curl kann man (natürlich) auch mit Python darauf zugreifen.

Das folgende Script erstellt die gleiche Abfrage wie in Teil1 bzw. Teil2
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import requests
import urllib
import simplejson as json

# --
# config
# --

apiURL = 'https://[PUPPETDB]:8081'
apiPath = 'v2/nodes'
apiKey = '/etc/puppetlabs/puppet/ssl/certs/ca.pem'
apiMethod = 'get'
clientKey = ('/etc/puppetlabs/puppet/ssl/certs/[LOCALNAME].pem',
'/etc/puppetlabs/puppet/ssl/private_keys/[LOCALNAME].pem')

apiQuery = {'query':'["=", "name", "operatingsystem"]'}

def puppetApiRequest(api_base_url, path='',
method=None,
data=None,
params={},
verify=True,
cert=list()):
method = method.lower()
headers = {
'Accept': 'application/json',
'Content-type': 'application/json',
}
methods = {
'get': requests.get,
'post': requests.post,
}

if path[0] != '/':
path = '/{0}'.format(path)
if params:
path += '?{0}'.format(urllib.urlencode(params))
url = '{0}{1}'.format(api_base_url, path)
resp = methods[method](url, data=json.dumps(data), headers=headers,
verify=verify, cert=cert)
return resp

def makePuppetApiRequest(api_url=None,
path=None,
verify=False,
cert=list(),
params={}):
resp = puppetApiRequest(api_url,
path,
apiMethod,
params=params,
verify=verify,
cert=cert)
data = json.loads(resp.content)
return data

output = makePuppetApiRequest(apiURL,
'v2/facts',
apiKey,
clientKey,
apiQuery)

for i in output:
print "%s | %s" % (i['certname'], i['value'])

November
27
janitor » #code #python
Hier und da will man einfach wissen (wieso auch immer) welcher epoch die letzte Mitternacht entspricht, in python kann man das z.B. mit der folgenden Funktion realisieren:

import datetime
import time

def getMidnight():
now = datetime.datetime.now()
year = now.year
month = now.month
day = now.day
hour = "00"
minute = "00"
epoch = datetime.datetime(year, month, day, 0, 0).strftime('%s')
return epoch