Seiten

Montag, 22. März 2021

Wieviel den noch nebenher?

Es ist einigen bekannt, dass ich nicht gerade als Programmierer glänze. Das kann damit einher gehen das ich nicht der größte Freund von entwickelnden Admin oder administrierenden Entwicklern bin, jeder geht Lösungen gern anders an. Die Notlösung wenn es nicht geht es als Root laufen zu lassen ist nur bedingt befriedigend. Ich schreibe mir kleine Scripte die für mich die Aufgaben erledigen damit ich meinen geliebten Kaffee schlürfen kann und dabei mich auf SPAM umschauen kann oder versuche Webcomis zu verstehen.

Letztens hatte ich fast die Befürchtung das ich meinen warmen Kaffe stehen lassen müsste und was machen müsste. Die Aufgabe der Umzug von mehren tausend Emailpostfächern von einem Server zu einen anderen.

Der Helfer der einem da gleich ein fällt ist Imapsync. Seit einiger seit schon ein Quasistandart auch wenn sich weitere Mitstreiter empfehlen Da haste nicht gekleckert, trainiert als gäbe es kein morgen mehr war imapsync mein Helfer der Wahl.

Die IMAP-Server waren jeweil ein Courier, bei dem mir nicht klar wurde ob ich einen Superuseracccount für die Migration nützen könnte. Ich entschloss mich einfach für jeden User einen Migrationsuser mit jeweils mir bekannten Passwort anzulegen.
Userer User werden in einem LDAP gehalten, dort wollte ich die migrationsuser aufkeinen Fall haben, die Einbindung einer weiteren authmethode  lösste diese Problem

#!/bin/bash
ldapsearch_output="ldapsearch_output"
searchstring="gidNumber"
#Enthält die Daten der User die Migriert werden soll
maildaten="migration_accounts.csv"
logpfad="/opt/mig/scripte/create_userdb"
log=$logpfad/mkuserdb_$(date +%s).log
ldap_host="example.de"
ldap_user="uid=mmuster,ou=intern,o=example.de"
ldap_pwd="xxx"
ldap_base="o=example.de"
search="uidNumber gidNumber maildir"
mig_pwd=""
if [[ ! -d $logpfad ]]
then
 mkdir -p $logpfad
fi

if [[ -f $maildaten ]]
then
 while read line
 do 
   uid=$(echo $line| cut -f12 -d",")
   filter="(uid="$uid")"
   #pwd in crypt und maskiert
   mig_pwd=$(echo $line| cut -f17 -d",")
   status=$(echo $line| cut -f3 -d",")
   if [[ $status -gt 4  ]] 
   then
    echo " [400] Status !< 5" | tee -a $log
   else
   # if [[  -n $uid ]] || [[ $uid == "" ]]
    if [[ -n "$uid" ]] ||  [[ $uid != "" ]]
    then
    #im Ldap nach uidnummer gidnummer homedir suchen
     search=$(ldapsearch -h $ldap_host -D "$ldap_user" -w $ldap_pwd -b 
\\$ldap_base -LLL "$filter" $search | tee $ldapsearch_output)
    if [[ $? == 0 ]] && [[ $(grep -c \\
"$searchstring" $ldapsearch_output) -eq 1 ]]
    then
      add=$(echo $search |  sed 's/dn: uid=/userdb default\//; \\
s/,.*uid/-migration set uid/;s/uidNumber: /uid=/;s/gidNumber: /gid=/;\\
s/maildir: /home=/; s/$/ systempw=$mig_pwd')
      echo "$add" >> create_userdb4couri
      $add
      if [[ $? != 0 ]]
      then
       echo "[500] Eintrag von $uid in die Userdb nicht erfolgreich"\\
| tee -a $log
      else
       echo "[200] Eintrag von $uid in die Userdb erfolgreich"\\
| tee -a $log
      fi
    else
      echo "[502] Probleme bei der LDAP-Abfrage " | tee -a $log
    fi
    else
    echo "[404] keine Uid gefunden in $line " | tee -a $log
    fi
   fi
  done < $maildaten
 cd /etc/courier/
 makeuserdb
else
 echo "[404]  Maildaten fehlen" | tee -a $log
 exit 1
fi


#!/bin/bash

###Mailmigration
#Anzahl der zulaufenden imasyncs
PMAX=10

maildaten="migration_accounts.csv"
logpfad="/opt/mig/scripte/imapsynclog"
sed_logpfad=$(echo $logpfad| sed 's/\//\\\//g; s/$/\\\//')
log="$logpfad/sync.log"
echo "" > $log
#Pfad zu imapsync
imapsync="/opt/mig/scripte/imapsync-master/imapsync"


pwd=""
uid=""
account=""
user=""
domain=""
status=""
email=""

function create_logpfad() {
 if [[ ! -d $logpfad ]]
 then 
  mkdir $logpfad
  if [[ $? -gt 0 ]]
  then
   exit 1
  fi
 fi
}

function sync_imap() {

 
 login_1=$uid
 pwd_1=$pwd

 host_1="imap.example.net"

 login_2=$(echo $uid"-migration")

 pwd_2=$mig_pwd
 host_2="imap.example.de"
 imap_log=$logpfad/$user"."$(date +%s)".log"
 
 #imasync von server 1 zu server 2
  
 $imapsync --host1 $host_1 -user1 $login_1 -password1 $pwd_1\\
--authmech1 login --host2 $host_2  -user2 $login_2 -password2 $pwd_2 \\
--authmech2 login --subscribe_all --useuid --tmpdir /dev/shm >> $imap_log 
 #checklog
 if [[ $(grep -c "Detected 0 errors" $imap_log ) -eq 1 ]]
 then
  echo "[200] User $user(uid: $uid) erfolgreich gesynct" \\
| tee -a $log
 else
  echo "[500] Fehler beim syncen von user $user(uid: $uid) für \\
Details schau in $imap_log "| tee -a $log
 fi
 
}

function run_sync_p() {

  while [ $(jobs -rp | wc -l) -ge $PMAX ]
  do
   sleep 0.5
  done
  sync_imap &
}



function start_sync() {
 if [[ -f $maildaten ]]
 then
  while read line
   do 
    #echo "line $line"
    pwd=$(echo $line| cut -f7 -d",")
    uid=$(echo $line| cut -f12 -d",")
    account=$(echo $line| cut -f2 -d",")
    user=$(echo $line| cut -f6 -d","|cut -f1 -d@)
    domain=$(echo $line| cut -f5 -d",")
    status=$(echo $line| cut -f3 -d",")
    email=$(echo $line | cut -f2 -d","|cut -f1 -d@)
    mig_pwd=$(echo $line| cut -f17 -d",")
    
    if [[ $status -lt 5 ]]  
    then
     if [[ ! -n $uid ]] || [[ $uid == "" ]]
     then
      echo "[404] keine Uid zu user $user gefunden \\
in: $line" | tee -a $log
     else
      if [[ $user == "N" ]] || [[ ! -n $user ]]
      then
        if [[ -n $email ]]
        then
        user=$email
        run_sync_p
       else
        echo "[409] kein Nutzerinformationen in\\
 $line zu finden" | tee -a $log
       fi
      else
       run_sync_p
      fi
     fi
    else
     echo "[400] Staus >= 5  in $line "  | tee -a $log
    fi
    
    
   done < $maildaten
 else
  echo "[404] Maildaten fehlen" | tee -a $log
  exit 1
 fi
}

function create_report() {
     while [ $(jobs -rp | wc -l) -gt 0 ]
        do
             sleep 1
        done

 
 #Anzahl erfolgreiche Sync
 anz_status_200=$( grep -c "\[200\]" $log )
 #Anzahl fehlerhafte Sync
 anz_status_500=$( grep -c "\[500\]" $log )
 if [[ $anz_status_500 -gt 0 ]]
 then
  anz_status_500=$(expr $anz_status_500 - 1 )
 fi
 status_500=$( grep  "\[500\]" $log )
 
 anz_status_409=$( grep -c "\[409\]" $log )
 anz_status_400=$( grep -c "\[400\]" $log )
 anz_status_404=$( grep -c "\[404\]" $log )
 anzahl_zeilen_csv=$( wc -l $maildaten | cut -d" " -f1)
 error_lis=$(grep "\[500\]" $log | sed 's/.*\/opt\//\/opt\//')
 
echo -e "
 REPORT:
 ####################################
 Erfolgreich:                     $anz_status_200 
 Fehler bei Sync:                 $anz_status_500
 keine UID gefunden:              $anz_status_404 
 kein Userinformationen gefunden: $anz_status_409 
 user Status >= 5:                $anz_status_400 
 in CSV:                          $anzahl_zeilen_csv
 ####################################
 "
 l_nr=1
 if [[  $anz_status_500 -gt 0 ]]
 then
  draw=0
  #echo -e "Fehlerhafte Syncs \n $status_500"
  for line in $error_lis
  do
   if [[ $(grep "Failure: error login on " $line | grep -c \\
"example.de") -gt 0 ]]
   then
    if [[ $draw -eq 0 ]]
    then
     echo -e "Fehlerhaftes Login imap.example.de\n------\n"
     draw=1
    fi
    echo -e "$l_nr:\t $(grep "Failure: error login on " \\
$line | grep "wodan")"
    l_nr=$(expr $l_nr + 1 )
   fi 
  done
  draw=0
  for line in $error_lis
  do
   if [[ $(grep "Failure: error login on " $line | grep -cv \\
"example.de" ) -gt 0 ]]
   then
    if [[ $draw -eq 0 ]]
    then
     echo -e "\n------\nFehlerhaftes Login bei \\
imap.example.net\n------\n"
     draw=1
    fi
    echo -e "$l_nr:\t $(grep "Failure: error login on " \\
$line | grep -v "wodan")"
    l_nr=$(expr $l_nr + 1 )
   fi
  done
  draw=0
  for line in $error_lis
  do
   if [[ $(grep -ie "Detected [0-9]* errors" $line | grep -v \\
"Detected 0 errors" |wc -l ) -gt 0 ]]
   then
    if [[ $draw -eq 0 ]]
    then
     echo -e "\n------\nSyncfehler\n------\n"
     draw=1
    fi
    echo -e "$l_nr:\tuser: $(grep -i "Detected [0-9]* \\
errors" $line | grep -v "Detected 0 errors" | sed 's/$sed_logpfad//; \\
s/\..*//')\nDetails $(grep -i "Detected [0-9]* errors" $line | grep -v \\
"Detected 0 errors" | cut -d: -f1)"
    l_nr=$(expr $l_nr + 1 )
   fi
  done 
 fi 
 

  
  
}

function main () {
 create_logpfad
 
 start_sync
 
 create_report
}

main

zzzz

/etc unter Versionskontrolle

Schon vor einige Zeit bin ich über einen Artikel zu etckeeper gestollpert

http://www.linux-magazin.de/ausgaben/2016/07/einfuehrung2/

ein sehr interesanter Ansatz, auch ein sehr netter Artikel zum Thema https://www.thomas-krenn.com/de/wiki/Etc-Verzeichnis_mit_etckeeper_versionieren

in den Artikel und Anleitungen die ich zu den Thema gefunden habe, gibt es einen Hinweis wie man cronjob einrichtet um einen Dailycommit durchzuführen, schon eine gute Idee, doch wenn man nicht der einzige Sysadmin auf einem System ist und diese noch schusseliger sind, als einer selbst, oder auch mal ein script oder Anwendung etwa in etc ändert dann wäre es tolle wenn die Versionierung denoch stattfindet.

Normalerweise kann man wohl davon ausgehen das eine Konfigdatei nicht mehrfach an einen Tag geändert wird, und so ein dailycomit ausreicht, man könnte auch per cron geringere Intervalle wählen.

ich hatte eine andere Idee, warum nicht einen commit wenn es eine Änderung gibt.

Also etc überwachen da fiel mir Inotify ein
https://en.wikipedia.org/wiki/Inotify
https://wiki.ubuntuusers.de/inotify/

Mit Inotify hatte ich schon Erfahrungen gesammelt.
Damals hatte ich mit Inotify bzw den Vorgänger (dnotify) ein FTP-Eingangsverzeichniss überwacht.¹


ich hatte die Idee einen eigenen Dämon zu nutzen der wenn gestartet etc überwacht und einen Commit durchführt

als ich dies tat war SysVinit bei mir noch der vorwiegende Initprozess, systemd gab es am horizont und ebenso upstart, so richtig freude hatte ich damals daran nicht.
also erstmal ein init script schreiben

--- /etc/init.d/autoetckeeper ---
#!/bin/bash

# Start/stop the autoetckeeper daemon.
#
### BEGIN INIT INFO
# Provides:          autoetckeeper
# Required-Start:    $remote_fs
# Required-Stop:     $remote_fs
# Should-Start:      $network $syslog
# Should-Stop:       $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Regular background program processing daemon
# Description:       /usr/sbin/autoetckeeper is UNIX program that auto commit changes in /etc 
### END INIT INFO

PATH=/bin:/usr/bin:/sbin:/usr/sbin
DESC="autoetckeeper daemon"
NAME=autoetckeeper
DAEMON=/usr/sbin/autoetckeeper
PIDFILE=/var/run/autoetckeeper
SCRIPTNAME=/etc/init.d/"$NAME"

test -f $DAEMON || exit 0

#. /lib/lsb/init-functions



case "$1" in
start)    echo "Starting autoetckeeper"
         $DAEMON &
        #log_end_msg $?
    ;;
stop)    echo "Stopping autoetckeeper" 
        pid=$( head /var/run/etckeeperauto.pid )
    kill -15 $pid
        #log_end_msg $RETVAL
        ;;
restart) #log_daemon_msg "Restarting periodic command scheduler" "cron" 
        $0 stop
        $0 start
        ;;
status)
    pid=$( head /var/run/etckeeperauto.pid )
    if [[ $(ps -eaf | grep  $pid | grep -c "inotifywait") -gt 0 ]]
    then
        echo "autoetckeeper [OK]"
    else
        echo "autoetckeeper [FALSE]"
    fi
        ;;
*)    echo "Usage: /etc/init.d/autoetckeeper {start|stop|status|restart}"
        exit 2
        ;;
esac
exit 0


dann bedraf es noch den Dämon den es zu starten gab

--- /usr/sbin/autoetckeeper ---



#!/bin/bash
###################################################################################################################################################
## Copyright (c) 2015,"fridy"                                                                                                                    ##
## All rights reserved.                                                                                                                          ##
##-----------------------------------------------------------------------------------------------------------------------------------------------##
## Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:##
##-----------------------------------------------------------------------------------------------------------------------------------------------##
## * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.                ##
## * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the       ##
##   documentation and/or other materials provided with the distribution.                                                                        ##
## * Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this ##
##   software without specific prior written permission.                                                                                         ##
##-----------------------------------------------------------------------------------------------------------------------------------------------##
## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ##
## TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR   ##
## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,     ##
## PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF     ##
## LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS       ##
## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                                                                                  ##
##-----------------------------------------------------------------------------------------------------------------------------------------------##
###################################################################################################################################################

#Pfad zum  logger
LOGGER=/usr/bin/logger

##Traphandling

trap_exit () {
 exit 0
}


trap_int() {
 clean
 exit 1
}

trap_term () {
 clean
 exit 3
}

lock () {
 $LOGGER -p info -t autoetckeeper "auto etckeeper start"
 if [[ -d $lock ]]
 then
  pids=$(head -1 $pid)
  ps_liste=$(ps -eaf | grep $pids | grep "inotifywait" | awk '{print $2}')
  #echo "pids: $pids psliste $psliste') "
   if [[ $(ps -eaf | grep $pids | grep "inotifywait" | awk '{print $2}'| wc -l) -eq 0 ]]
  th
   rm -fr $lock
  else
   for inotify_pid in $(ps -eaf | grep $pids | grep "inotifywait" | awk '{print $2}')
   do
     #echo "pids: $pids inotify_pid $inotify_pid"
     kill -HUP $inotify_pid 
   done
  # exit 1

   rm -fr $lock
  fi
 fi

 mkdir $lock
 if [[ $? -eq 0 ]]
 then
  echo -e   $(date +%d'.'%m'.'%Y' '%X)":\t Lock erfolgreich gesetzt" >> $log
 else
  echo -e   $(date +%d'.'%m'.'%Y' '%X)":\t Lock nicht erfolgreich gesetzt" >> $log

  $LOGGER -p info -t autoetckeeper "Lock nicht erfolgreich gesetzt"
  
  exit 1
 fi
}



trap trap_exit EXIT
trap trap_int INT
trap trap_term TERM
 
function clean () {

 if [[ -f "$lock" ]] || [[ -d "$lock" ]]
 then
  #rm -frv $lock
  rm -fr $lock
 fi
 pids=$(head -1 $pid)
 for inotify_pid in $(ps -eaf | grep $pids | grep "inotifywait" | awk '{print $2}')
 do
  kill -15 $inotify_pid  
 done
 sleep 1
 
 for inotify_pid in $(ps -eaf | grep $pids | grep "inotifywait" | awk '{print $2}')
 do
  kill -9 $inotify_pid  
 done
}

log=/var/log/etckeeperauto.log
pid=/var/run/etckeeperauto.pid
pid_new=/tmp/etckeeperpid.new
lock=/var/lock/etckeeperauto




function autocommit () {
 pushd /etc > /dev/null
 while  inot=$(inotifywait -q -r -e modify -e create -e delete  -e move /etc)
 do
  if [[ $(echo $inot | grep -v "swp"| grep -v ".git/" | wc -l ) -gt 0 ]]
  then
   lockfile=/var/cache/etckeeper/packagelist.pre-install
   if [ -e "$lockfile" ] && [ -n "$(find "$lockfile" -mmin +15)" ]; then
    rm -f "$lockfile" # stale
   fi

   if [ ! -e "$lockfile" ]; then
    if etckeeper unclean; then    
     msg=$(git status --short)
     etckeeper commit -m "Auto change by script \n $msg" >> $log
     echo "$(date) : git gc" >> $log
     git gc --quiet
    fi
   fi
  fi

 done
 popdi > /dev/null
}


function main () {
  echo $$ > $pid_new
  lock
  mv $pid_new $pid
  set -e
  if [ -x /usr/bin/etckeeper ] && [ -e /etc/etckeeper/etckeeper.conf ]; then
   . /etc/etckeeper/etckeeper.conf
   autocommit
  else
   $LOGGER -p err -t autoetckeeper "etckeeper didn't find"
   exit 1
  fi
  exit 0 

}

main





--
[Unit]
Description=Automatischer commit etckeeper
After=network.target auditd.service

[Service]
EnvironmentFile=-/etc/default/autoetckeeper
ExecStart=/usr/sbin/autoetckeeper -D OPTS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target
Alias=autoetckeeper.service
--


mit systemd hatte ich noch keine Erfarungen, bzw die ersten waren nicht so gut, und wenn es auf systemen schon da war nutze ich auch die kompatibilität zu SysVinit also init scripte. heute finde ich die Eventmaschine systemd sehr hilfreich und mag viele ihrer Fähigkeiten.²

jetzt mal noch ein systemd service

--

--




¹Es war eine Datenanlieferung, bei der die angelieferten Daten in einen workflow gingen. Die vorherige Lösung war ein Script das jede minute das Verzeichniss überprüfte, wenn eine Datei im Verzeichniss war wurde nach einem sleep die dateigröße verglichen wenn sie sich nicht verändert hatte, wurde die Datei in den Workflow geschickt, wenn sie sich verändert hatte würde die Datei übergangen, so das sie beim einen nächsten Durchlauf in den Workflow geschickt wird. Die Lösung funktioniert recht gut hatte ihre schwächen wenn die Datenübertragung wären des sleeps nicht stafand aber die Datei denoch nicht vollständig übertragen wurde. eine eraste damalige Idee den schreibpointer der Datei mitels lsof zu prüfen, wenn es keinen gab war die Datei fertig. das war schon viel besser als die Lösung davor. Aber der Ansprüch das es doch auch noch "schöner" gehen muss führte zu eine lösung mit dnotify und nach upgrade auf eine neueren Kernelversion zu inotify.

²vielleicht werde ich mich hier auch mal tiefgreifender zu systemd äußern


Kleine ESX helper


Manschmal möchte man einen esxi host freigeben und vorher auch alle Datastorage unmapen


       

#!/bin/bash

echo "Willkommen zum VMWare esxi unmap Helfer"


read -er -p "Geben sie den esxi Host an: " -i "$default_host" host
read -er -p "User: " -i "$default_user" user
read -rs -p "Passwort: " passwd


#Create storagelist

for storage in $(esxcli -u $user  -s $host -p $passwd storage filesystem list | awk '($4 == "true") && ($5 == "VMFS-5"){print $2} ')
do
 echo "unmap $storage on $host"
 esxcli -u $user  -s $host -p $passwd storage vmfs unmap -l $storage
 
done


       
 

Wenn man eine 3par hat und die luns mit der falschen Policy laufen und man auch die default policy ändern will dann hilft der Helper es lässt sich auch für andere Storageanbieter anpassen


#!/bin/bash

echo "Willkommen zum VMWare esxi_pfad_helper Helfer"


for esx in [liste: host1 host2 ...]
do
 echo "auf Host $esx"
 echo "aendern der Police zu Roundrounbin wenn falsch eingestellt !"
 for i in $( ssh -x -l root $esx 'esxcli storage nmp device list | egrep -B 4 "Path Selection Policy: VMW_PSP_MRU|Path Selection Policy: VMW_PSP_FIXED" | egrep -B1 "Device Display Name: 3PARdata Fibre"| grep "^naa."; exit' )
 do 
  echo "3Par Device ohne Round Roubin: $i"
  ssh -x -l root $esx 'esxcli storage nmp device set --device $i --psp VMW_PSP_RR; exit '
 done
 echo "aendern der Default Path Selection Policy VM_SATP_ALUA zu VMW_PSP_RR"
 ssh -x -l root $esx `esxcli storage nmp satp set --default-psp=VMW_PSP_RR --satp=VMW_SATP_ALUA; exit`
done

 
 
       

#!/bin/bash

echo "Willkommen zum VMWare esxi pfad helper Helfer"

for esx in [liste host1 ... hostn]
 
 echo "auf Host $esx"
 ssh -x -l root $esx '
  hostname;
  echo "aendern der Police zu Roundrounbin wenn falsch eingestellt !"
  for i in $(esxcli storage nmp device list | egrep -B 4 "Path Selection Policy: VMW_PSP_MRU|Path Selection Policy: VMW_PSP_FIXED" | egrep -B1 "Device Display Name: 3PARdata Fibre"| grep "^naa.")
  do 
   echo "3Par Device ohne Round Roubin: $i"
   esxcli storage nmp device set --device $i --psp VMW_PSP_RR
  done
  
  echo "aender der Default Path Selection Policy VM_SATP_ALUA zu VMW_PSP_RR"
  esxcli storage nmp satp set --default-psp=VMW_PSP_RR --satp=VMW_SATP_ALUA
  esxcli storage nmp satp set --default-psp=VMW_PSP_RR --satp=VMW_SATP_DEFAULT_AA
  esxcli storage nmp satp set --default-psp=VMW_PSP_RR --satp=VMW_SATP_LOCAL
  exit;
 '
done

       
 
Schnell mal einen anderen loghost ausrollen statt der IP sollte auch FQDN funktionieren
       
#!/bin/bash
           for esx in [liste host1 ... hostn ] 
do
 echo "#### $esx ######"
 echo "#### set loghost ######"
 ip=ip_from_loghost
 ssh -l root $esx  ' esxcli system syslog config set --loghost='tcp://$ip:514'; esxcli system syslog config set --loghost='udp://$ip:514';  esxcli system syslog reload '
done

       
 
wenn man eine Disks grown will auf einen host
       
for vmdisk in [liste disk1 ...diskn]
do
 partion=$(vmkfstools -P "/vmfs/volumes/$vmdisk" | grep "naa"|sed 's/ //g')
 disk=$(vmkfstools -P "/vmfs/volumes/$vmdisk" | grep "naa"| cut -d":" -f1|sed 's/ //g')
 echo "partion: $partion disk: $disk"
 partedUtil get "/vmfs/devices/disks/$(echo $disk|sed 's/ //g')"
 partedUtil fixGpt "/vmfs/devices/disks/$(echo $disk|sed 's/ //g')"
 
 start=$(partedUtil get "/vmfs/devices/disks/$(echo $disk|sed 's/ //g')"| awk '/^1 /{print $2}')
 end=$(partedUtil getUsableSectors "/vmfs/devices/disks/$(echo $disk|sed 's/ //g')" | cut -d" " -f2 )
 echo "Start $start end: $end"
 
 echo " partedUtil resize \"/vmfs/devices/disks/$disk\" 1 $start $end "
 
 partedUtil resize "/vmfs/devices/disks/$(echo $disk|sed 's/ //g')" 1 $start $end
 
 partedUtil fixGpt "/vmfs/devices/disks/$(echo $disk|sed 's/ //g')"
 echo -e " vmkfstools --growfs \"/vmfs/devices/disks/$partion\" \"/vmfs/devices/disks/\$dpartion\" \n"
 vmkfstools --growfs "/vmfs/devices/disks/$(echo $partion|sed 's/ //g')" "/vmfs/devices/disks/$(echo $partion|sed 's/ //g')"

done


       
 

Montag, 1. April 2019

Ergänzung zu "Weiß ich, was auf meinem Server ausgeführt wird?"

Es gab eine Frage zu Snoopy:

Sieht man mit Snoopy was in Docker passiert?

Die Frage werde ich mir noch annehmen

Eine Sache die mir jetzt aufgefallen ist, für eine statischgelinkte Shell ist Snoopy blind.

Freitag, 29. März 2019

Der Blog ist nicht tot sondern nur etwas eingeschlafen

 

Lange Zeit war es still, doch nun soll es iweder mal weiter gehen .

Diese Jahr habe ich bei CLT 2019 3 Vorträge gehalten

das will ich zum Anlass nehmen auch weiterführendes Material zu den Vorträgen zu veröffentlichen und auch neue Erkennisse zu den Themen.

Ich habe auch vor mich mit weitere Themen  zu beschäfftigen und hier zu berichten


Freitag, 5. Mai 2017

Danke für 1200 Switche

Was macht man wenn man mehr als 1200 Switchen und etliche Router geerbt hat aber kaum was vom Aufbau weiß?
Dazu habe ich einen Vortrag bei CLT gehalten Den Vortrag findet ihr hier

Freitag, 11. April 2014

Überall Hintertüren

Diese Woche bin ich zu einer grassen Erkentniss gekommen, gibt es einen Webserver da hat er meist auch ein Hintertürschen. Deshalb werde ich damit beschäfftigen wie man diese Hintertürschen findet oder erkennen kann, wie man seinen Webserver absichert. Was man in log sehen kann, schauen was die Hintertürchen so "anstellen"

ich kann schon mal sagen clamav erkennt die Hintertürchen die mir jetzt so über den Weg gekommen sind nicht.  Doch gefunden habe ich sie mit dem Freund des Admins grep -nur muss man wissen wonach man sucht- dazu das nächste Mal