HowTos/AdminScripts

From Scalix Wiki
Revision as of 12:10, 13 July 2008 by Dirk (Talk | contribs) (reset the imap-cache for a mailbox)

Jump to: navigation, search

Here are some scripts that aren't big enough for a own topic.

show the g-directory of a specific user

Sometimes we have to know the g-directory of a mailbox. If you don't want to deal with omshowu every time you can use this script:

if [ "$1" = "" ]
then
   echo "usage: $0 username"
   exit 1
fi
REALPATH=`/opt/scalix/bin/omrealpath "~/"`
OMSHOWU=`/opt/scalix/bin/omshowu -n "$1" -f 2>/dev/null| grep "User Folder"`
if [ $? -eq 0 ]
then
        FOLDER=`echo $OMSHOWU | awk -F/  '{print $2 "/" $3 }' `
        echo $REALPATH$FOLDER
else
        echo "Can not find $1"
fi

As we are using the command "omshowu", we can use the same syntax to specify the username.

You can try to use the script like this:

cd `name_of_script "Givenname Surname"`

reset the imap-cache for a mailbox

A logical follow-up from the script above. Scalix 11 only. Sometimes it might be necessary to reset the imap-cache.

There is also an extended version: http://downloads.it25.de/scripts/sx_clearimap


#!/bin/bash
if [ "$1" = "" ]
then
  echo "usage: $0 username"
  exit 1
fi
REALPATH=`/opt/scalix/bin/omrealpath "~/"`
OMSHOWU=`/opt/scalix/bin/omshowu -n "$1" -f 2>/dev/null| grep "User Folder"`
if [ $? -eq 0 ]
then
   FOLDER=`echo $OMSHOWU | awk -F/  '{print $2 "/" $3 }' `
   ID=`/opt/scalix/bin/omshowu -n "$1" | grep "System Login :" | awk -F: '{print $2}' `
  echo -n "Do you really want to remove the imap-cache for $1 (y/N)"
  read DOIT
  if [ "$DOIT" = "y" ]
  then
    echo "locking mail-account ..."
    /opt/scalix/bin/ommodu -o "$1" -K
    echo "killing IMAP-processes for user $1 (uid $ID) ..."
    pkill -u $ID in.imap41d
    echo "removing $REALPATH$FOLDER/imap-cache ..."
    rm -rf  $REALPATH$FOLDER/imap-cache
    fi
    echo "unlocking mail-account ..."
    /opt/scalix/bin/ommodu -o "$1" -k
    echo "done!"
  fi
else
  echo "Can not find $1"
fi

script to fill mailboxes

if you have any reason to need a full mailbox, for example to test a backup system, this script can deliver.

#!/bin/bash

#fillbox.sh
#cmeid, jan07

#global varz

#these must be changed
fromUser=tester
fromPass=password
toUser=cmeid
#if you want to use carbon copy and/or bcc, be sure to uncomment the appropriate lines below
#copyUser=
#bccUser=

#these should be acceptable defaults
dataFile=rawdatafile
dataSize=15k
subject="Test Mail"
bodyFile=rawbodyfile
bodySize=1k
messageCount=1000
displayIncrement=50

#no sanity checking. only for use on trusted systems!!!

#init attachments/bodymessages

if [ ${bodySize} != 0 ]; then
        dd bs=${bodySize} count=1 if=/dev/urandom of=${bodyFile}.tmp &>/dev/null
        cat ${bodyFile}.tmp | uuencode -m ${bodyFile} > ${bodyFile}
        rm ${bodyFile}.tmp
fi
 
if [ ${dataSize} != 0 ]; then 
        dd bs=${dataSize} count=1 if=/dev/urandom of=${dataFile} &>/dev/null
fi

#set up looping, go get a coffee and have a smoke

i=1
echo ""
echo -n Sending email ...

until [ ${i} -gt ${messageCount}  ]; do

        if [ ${dataSize} = 0 ] ; then 
#                omsend -q -u ${fromUser} -p ${fromPass} -s "${subject} ${i} from ${fromUser} body size ${bodySize}" -t ${toUser} -c ${copyUser} -b ${bccUser} -a ${bodyFile}
                omsend -q -u ${fromUser} -p ${fromPass} -s "${subject} ${i} from ${fromUser} body size ${bodySize}" -t ${toUser} -a ${bodyFile}
        else
#                omsend -q -u ${fromUser} -p ${fromPass} -s "${subject} ${i} from ${fromUser} bodysize ${bodySize}i datasize ${dataSize}" -t ${toUser} -c ${copyUser} -b ${bccUser} -a ${bodyFile} -r ${dataFile}
                omsend -q -u ${fromUser} -p ${fromPass} -s "${subject} ${i} from ${fromUser} bodysize ${bodySize}i datasize ${dataSize}" -t ${toUser}  -a ${bodyFile} -r ${dataFile}
        fi

        let i+=1

        remainder=`expr ${i} % ${displayIncrement}`

        if [ $remainder = 0 ]; then 
                echo ""
                echo -n ${i} email sent.
        else
                echo -n .
        fi

done

echo ""
echo Total `expr ${i} - 1` mails sent
echo $i
echo ""
exit 0

script to genererate login statistics

this script will parse your audit logs and generate a nicely formatted breakdown of the logins on your system.

you'll need to set up auditing on the appropriate services, check out omshowaud and omconfaud to do that.

#!/bin/bash

#logonstat.sh
#cmeid, 20070514

source /opt/scalix/global/config

export today=`date "+%a %b %d"`
#export today="Sun May 13"

declare -a times logons users

for i in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23; do 
#for i in 00 01; do
        j=$(expr $i + 0)
        times[$j]=$i
        logons[$j]=`grep -A1 user-signon $OMDATADIR/logs/audit | grep "$today $i" | wc -l`
        users[$j]=`grep -A6 user-signon $OMDATADIR/logs/audit | grep -A4 "$today $i"| grep user\ |awk '{print $((NF-1))}'|sort|uniq -c|wc -l`
done

tLogons=`grep -A1 user-signon $OMDATADIR/logs/audit | grep "$today" | wc -l`
tUsers=`grep -A6 user-signon $OMDATADIR/logs/audit | grep -A4 "$today"| grep user\ |awk '{print $((NF-1))}'|sort|uniq -c|wc -l`

function printemptycell() {
        printf '|---------------'
}

function printcontent() {
        printf '|'"     "${times[$1]}-${times[$(($1+1))]}"\t"
        printf '|'"      "${users[$1]}"\t"
        printf '|'"      "${logons[$1]}"\t"
}

function printtotals() {
        printf '|'"     "00-24"\t"
        printf '|'"     "$tUsers"\t"
        printf '|'"     "$tLogons"\t"
}

function printdiv() {
        printf '|'"\n"
        i=1
        while [ $i -le 3 ]; do
                printemptycell
                let "i+=1"
        done
        printf '|'"\n"
}

function printheader() {
        printf '| '"$@\t"
}

function printborder() {
        printf '|-----------------------------------------------|'"\n"
}

printf "\n"
printborder
printheader "Scalix Server `hostname --fqdn` Logins"
printdiv
printheader "Hour period"
printheader "Total Unique"
printheader "Total Logons"
printf '|'"\n"
printheader "Between"
printheader "Users Seen"
printheader "Handled"
printdiv
printtotals

k=1

while [ $k -lt ${#times[@]} ]; do

        printdiv
        printcontent $k

        let "k+=1"

done

printf '|'"\n"
printborder

and this is what it generates, isn't that cute? it took much longer to get the printf stuff together than the script itself...


|-----------------------------------------------|
| Scalix Server scalix.your-server.de Logins    |
|---------------|---------------|---------------|
| Hour period   | Total Unique  | Total Logons  |
| Between       | Users Seen    | Handled       |
|---------------|---------------|---------------|
|     00-24     |     1072      |     20478     |
|---------------|---------------|---------------|
|     01-02     |      0        |      0        |
|---------------|---------------|---------------|
|     02-03     |      0        |      0        |
|---------------|---------------|---------------|
|     03-04     |      32       |      74       |
|---------------|---------------|---------------|
|     04-05     |      32       |      156      |
|---------------|---------------|---------------|
|     05-06     |      32       |      336      |
|---------------|---------------|---------------|
|     06-07     |      61       |      713      |
|---------------|---------------|---------------|
|     07-08     |      183      |      836      |
|---------------|---------------|---------------|
|     08-09     |      180      |      529      |
|---------------|---------------|---------------|
|     09-10     |      220      |      729      |
|---------------|---------------|---------------|
|     10-11     |      202      |      689      |
|---------------|---------------|---------------|
|     11-12     |      404      |      1421     |
|---------------|---------------|---------------|
|     12-13     |      502      |      2226     |
|---------------|---------------|---------------|
|     13-14     |      466      |      2150     |
|---------------|---------------|---------------|
|     14-15     |      468      |      2673     |
|---------------|---------------|---------------|
|     15-16     |      376      |      2132     |
|---------------|---------------|---------------|
|     16-17     |      202      |      1305     |
|---------------|---------------|---------------|
|     17-18     |      95       |      877      |
|---------------|---------------|---------------|
|     18-19     |      67       |      800      |
|---------------|---------------|---------------|
|     19-20     |      74       |      789      |
|---------------|---------------|---------------|
|     20-21     |      56       |      737      |
|---------------|---------------|---------------|
|     21-22     |      46       |      697      |
|---------------|---------------|---------------|
|     22-23     |      44       |      609      |
|---------------|---------------|---------------|
|     23-       |      0        |      0        |
|-----------------------------------------------|

scripts to show queue state

these are very simple scripts to programatically retrieve statistics on queue status. i like to build them into monitoring scripts and pipe them to mail.

You may want to tack
egrep -v '0          0          0|Special queues'
on the end, or build it into the sed replacement-strings, to remove output relating to empty queues.
#!/bin/bash
date
echo -e "A$((`date +%d|sed -e's/^0//g'`+10))E\ns"|omqdump 2>/dev/null|sed -e '1,/Quit/ d' -e 's/Option?//g' -e 's/Done//g'|tr -s "\n"
#!/bin/bash
date
echo -e "A$((`date +%d|sed -e's/^0//g'`+10))E\nT"|omqdump 2>/dev/null|sed -e '1,/Quit/ d' -e 's/Option?//g' -e 's/Done//g'|tr -s "\n"

Example output (without egrep) as follows:

QUEUE         Messages     Active       Ever       Load [1min,5min,15min]
ARCHERR              0          0          0       0.00       0.00       0.00
ARCHIVE              0          0          0       0.00       0.00       0.00
BB                   0          0          0       0.00       0.00       0.00
DIRSYNC              0          0          0       0.00       0.00       0.00
DMM                  0          0          0       0.00       0.00       0.00
DUMP                 0          0          0       0.00       0.00       0.00
ERRMGR               0          0          0       0.00       0.00       0.00
ERROR                0          0          0       0.00       0.00       0.00
LICENSE              0          0          0       0.00       0.00       0.00
LOCAL                0          0        226       0.00       0.00       0.00
PRINT                0          0          0       0.00       0.00       0.00
REQ                  0          0          0       0.00       0.00       0.00
RESOLVE              0          0          0       0.00       0.00       0.00
ROUTER               0          0        226       0.00       0.00       0.00
SMERR                0          0          0       0.00       0.00       0.00
SMINTFC              0          0          0       0.00       0.00       0.00
TEST                 0          0          0       0.00       0.00       0.00
UNIX                 0          0          0       0.00       0.00       0.00
Special queues.
IDEL                 0          0        257       0.00       0.00       0.00
POISON               0          0          0       0.00       0.00       0.00

script to notify users on soon-expire password

Version: Scalix 11.0.2

OS: SLES 10

Users don't get notified on password expiration, if they use IMAP clients (Thunderbird, etc). Script is designed for daily cron job to scan Scalix server for the flagged accounts (ones that are near password expiration)

#!/bin/bash
# Log file to be emailed to SYSADMIN
LOG=<logfile>
WARNTEXT=<bodyofthewarningmessage>
EMAILSERVER=<servername>
SXADMIN=<sxadmin@google.com>
SYSADMIN=<sysadmin@google.com>

echo "---Password expiration warning-----------" | tee $LOG
echo "---user name------email address----------" | tee -a $LOG

omshowu -e -m $EMAILSERVER | while read expiredAccount
do
  userName=`echo $expiredAccount | cut -d"=" -f 2` >> $LOG 2>&1

  userAddress=`omshowu -n "$userName" | grep Address | sed 's/ *(.*)//; s/>.*//; s/.*[:<] *//'` >> $LOG 2>&
1

  if [[ "$userAddress" == *@* ]]
      then
      env MAILRC=/dev/null from="$SXADMIN" \
          nail -n -s "Password expiration warning for your Scalix account" \
          $userAddress < "$WARNTEXT" >> $LOG 2>&1

      echo "$userName $userAddress ** User notified, email sent" | tee -a $LOG
  else
      echo "$userName $userAddress ** WARN: Not valid email address" | tee -a $LOG
  fi
done

env MAILRC=/dev/null from="$SXADMIN" \
    nail -n -s "Scalix accounts with expired password" \
    "$SYSADMIN" < $LOG