Category Archives: Programmierung

Spamassassin support

Spamassassin mit spamc installieren:

“`bash
apt-get install spamassassin spamc
“`

In /etc/postfix/master.cf folgende Zeile editieren
(“-o content_filter=spamassassin” hinzufügen, das “-v” kann nach erfolgreicher Installation entfernt werden):

“`text
smtp inet n – – – – smtpd -v
-o content_filter=spamassassin
“`

Und am Ende einfügen:

“`text
spamassassin unix – n n – – pipe
user=debian-spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}
“`

Dann Postfix neu starten

“`bash
/etc/init.d/postfix restart
“`

Spamd in /etc/default/spamassassin folgendes einfügen

“`text
ENABLED=1
SAHOME=”/var/lib/spamassassin/”
OPTIONS=”–create-prefs –max-children 5 –username debian-spamd –helper-home-dir ${SAHOME} -s /var/lib/spamassassin/spamd.log”
PIDFILE=”${SAHOME}spamd.pid”
“`

Spamassassin neu starten

“`bash
/etc/init.d/spamassassin restart
“`

Testen ob spamd läuft

“`bash
ps aux | grep spamd
root 22759 1.3 0.3 125344 55520 ? Ss 13:26 0:01 /usr/sbin/spamd –create-prefs –max-children 5 –helper-home-dir -d –pidfile=/var/run/spamd.pid
“`

Die user_prefs befindet sich in: /var/lib/spamassassin/.spamassassin — hier können folgende Einstellungen vorgenommen werden:

Ab wann eine Mail als Spam deklariert wird:

“`text
required_score 10
“`

Bestimmte Empfänger-Domains nicht auf Spam prüfen:

“`text
all_spam_to *@domain1.de
all_spam_to *@domain2.net
“`

Bestimmte Absender-Domains blacklisten:

“`text
blacklist_from *@mxkli.com
“`

Android Emulator


title: “Android Emulator”
date: 2022-10-24T09:16:56
slug: android-emulator


mkdir -p ~/Android/Sdk

https://dl.google.com/android/repository/commandlinetools-linux-8512546_latest.zip (entpacken nach $HOME/Android/Sdk/cmdline-tools/latest)

.bashrc:
export ANDROID_HOME=$HOME/Android/Sdk
export ANDROID_SDK_ROOT=$HOME/Android/Sdk
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/platform-tools

./sdkmanager “emulator” “platform-tools” “platforms;android-31”
./sdkmanager “build-tools;33.0.0”
./sdkmanager “system-images;android-25;google_apis;x86”
./avdmanager create avd -n test -k “system-images;android-25;google_apis;x86”

Product Owner


title: “Product Owner”
date: 2022-03-01T20:46:32
slug: product-owner


Hauptaufgabe des Product Owner ist, Mehrwert für den Kunden zu schaffen. Er ist für die Gestaltung des Produktkerns verantwortlich. Sein wichtigstes Werkzeug ist das Product Backlog, in dem er User Storys, Epics und Tasks sammelt.

Der Product Owner sollte darauf achten, für das Scrum-Team stets verfügbar zu sein, um Antworten über die Ausgestaltung des neuen Produktes oder Services schnell zu liefern. So können die Mitglieder des Scrum-Teams ohne Unterbrechungen weiterarbeiten.

CheetSheet


title: “CheetSheet”
date: 2021-07-21T08:08:15
slug: cheetsheet-2


char name[] = "Thomas";
bool active = true;
double workingdays = {1,4,6}

Define Structure with Alias and access it:

typedef struct Point{
 int x;
 int y;
} Point;

Point one, two;
one.x=5;
one.y=7;

Nested Structure:

typedef struct Point{
 int x;
 int y;
} Point

typedef struct Location{
 int number;
 Point p;
} Location

Passing struct to function

#include
#include

struct student
{
 int id;
 char name[20];
 float percentage;
};

void func(struct student \*record);

int main()
{
 struct student record;

 record.id=1;
 strcpy(record.name, "Raju");
 record.percentage = 86.5;

 func(&record);
 return 0;
}

void func(struct student \*record)
{
 printf(" Id is: %d
", record->id);
 printf(" Name is: %s
", record->name);
 printf(" Percentage is: %f
", record->percentage);
}

jsGrid


title: “jsGrid”
date: 2021-06-06T16:25:06
slug: jsgrid


Onclick event, show id from clicked column

container.jsGrid({
 inserting: false,
 editing: false,
 sorting: false,
 paging: false,
 data: data,

 fields: [
 {name: "instrumentID", itemTemplate: function (value, item) {
 return value;
 }
 },
 ],
 rowClick: function (args) {
 selectShare(args.item.instrumentID);
 }
 });

Data load:

AES Decode Secret with Key


title: “AES Decode Secret with Key”
date: 2021-05-04T17:22:51
slug: aes-decode-secret-with-key


package main

import (
 "crypto/aes"
 "crypto/cipher"
 "encoding/base64"
 "errors"
 "fmt"
 "strings"
)

const (
 // EncryptHeaderV1 ...
 EncryptHeaderV1 = ""
)

func main() {

 fmt.Println(decrypt("K+aZKT/MGhPdy37RIMANJU3hGd1ypZiTyUxbxdC6x3MzSN2j1d9o5QD8OxPaO/rk+VQtmkh+yFR0gQNXo1SbpaweKlwcn82N/F6bjSa0Zcs="))

}

func decrypt(secret string) (string, error) {

 if len(secret) == 0 {
 return "", nil
 }

 decrypted, err := ReversibleDecrypt(secret, "JpF2PeV2TQvPcjIi")
 if err != nil {
 return "", err
 }

 return decrypted, nil
}

func ReversibleDecrypt(str, key string) (string, error) {
 if strings.HasPrefix(str, EncryptHeaderV1) {
 str = str[len(EncryptHeaderV1):]
 return decryptAES(str, key)
 }
 // fallback to base64
 return decodeB64(str)
}

func decodeB64(str string) (string, error) {
 cipherText, err := base64.StdEncoding.DecodeString(str)
 return string(cipherText), err
}

func decryptAES(str, key string) (string, error) {
 keyBytes := []byte(key)
 var block cipher.Block
 var cipherText []byte
 var err error

 if block, err = aes.NewCipher(keyBytes); err != nil {
 return "", err
 }
 if cipherText, err = base64.StdEncoding.DecodeString(str); err != nil {
 return "", err
 }
 if len(cipherText) < aes.BlockSize {
 err = errors.New("cipherText too short")
 return "", err
 }

 iv := cipherText[:aes.BlockSize]
 cipherText = cipherText[aes.BlockSize:]
 cfb := cipher.NewCFBDecrypter(block, iv)
 cfb.XORKeyStream(cipherText, cipherText)
 return string(cipherText), nil
}

Runtime Security – Auditing


title: “Runtime Security – Auditing”
date: 2020-12-16T08:15:32
slug: runtime-security-auditing


Enable / Configure Auditing

This Audit Rule Logs all Metadata

vi /etc/kubernetes/audit/policy.yaml

apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata

Enable an Configure Auditing in kupe-api manifest:

vi /etc/kubernetes/manifests/kube-apiserver.yaml

 - --audit-policy-file=/etc/kubernetes/audit/policy.yaml # add
 - --audit-log-path=/var/log/kubernetes/audit.log # add
 - --audit-log-maxsize=500 # add
 - --audit-log-maxbackup=5 # add

 - mountPath: /etc/kubernetes/audit # add
 name: audit # add

 volumes:
 - hostPath: # add
 path: /var/log/kubernetes/audit.log # add
 type: DirectoryOrCreate # add
 name: audit # add

Some Policy Examples:
Dont log Anything from Stage RequestReceived (omitStages)

apiVersion: audit.k8s.io/v1 # This is required.
kind: Policy
# Don't generate audit events for all requests in RequestReceived stage.
omitStages:
 - "RequestReceived"

Roles


title: “Roles”
date: 2020-10-20T19:04:45
slug: roles


Add Role edit and view to group devs (Namespaced)

oc policy add-role-to-group edit devs
oc policy add-role-to-group view devs

Add Cluster Creation Rights to group devs

oc adm policy add-cluster-role-to-group self-provisioner devs

Remove clusterwide Project Creation and limit to Group


title: “Remove clusterwide Project Creation and limit to Group”
date: 2020-10-20T12:52:39
slug: 1297-2


oc get clusterrolebinding -o wide | grep -E 'NAME|self-provisioner'
oc adm policy remove-cluster-role-from-group self-provisioner system:authenticated:oauth
oc adm policy add-cluster-role-to-group self-provisioner wp-mgrs

Match Hostname


title: “Match Hostname”
date: 2020-06-04T15:06:26
slug: match-hostname


---
- name: Install pt-stalk
 hosts: ~mar.\*\.cod\.vw-wecloud\.de
 gather\_facts: yes
 roles:
 - pt-stalk