Thursday, April 23, 2015

Emergency password reset Dell powerconnect 3248

For the 3248/5212/5224 products:

Note: This password recovery procedure involves rebooting the switch to the Factory Defaults. This will cause the loss of any current configuration on the switch. 

   1. Connect to the switch via the console port and manually reboot the switch
   2. As soon as power is applied, press and hold the <Ctrl> and <F> keys simultaneously
   3. At the menu, press R for the "[R]eturn to Factory Default" option
   4. The switch will reboot and all configuration changes and password information is cleared

then log in using admin/admin

Wednesday, January 21, 2015

Centos 7 PXE diskless

The guide is here:
http://www.server-world.info/en/note?os=CentOS_6&p=pxe&f=4

But I have installed Centos7 Desktop on PC(workstation) and rsynced files over to the server

ssh <workstation>
mount /dev/sda1 /mnt
rsync -avz /mnt/ <server>:/tftpboot/<Diskless Centos pxe root>

Problems:

dracut fatal don't know how to handle root=nfs

A start job is running for dev-nfs.device

And others like this could be fixed by using vmlinuz and initrd from here

( according to linuxquestions.org )


Working config:

[root@fox pxelinux.cfg]# cat default
default centos7


label centos7
   kernel pxeboot/centos7/sda/boot/vmlinuz
   append initrd=pxeboot/centos7/sda/boot/initrd.img root=nfs:192.168.44.10:/tftpboot/pxeboot/centos7/sda ip=dhcp rw selinux=0

Here is how to install Gnome on Centos 7 after Base installation
http://www.itzgeek.com/how-tos/linux/centos-how-tos/install-gnome-gui-on-centos-7-rhel-7.html#axzz3PTQP15yP

you can do it after you have copied the files to the server:

chroot /tftpboot/<Diskless Centos pxe root> 
yum groupinstall "GNOME Desktop" "Graphical Administration Tools"

Wednesday, September 17, 2014

use vim as default editor

echo "export EDITOR=vim" >> ~/.bashrc && export EDITOR=vim

Tuesday, August 19, 2014

Modify all LDAP users in one shot

Once I need to reset login shell for all users. Here is easy solution, one simple loop

SAVEIFS=$IFS;
IFS=$(echo -en "\n\b");
for i in $(ldapsearch -h localhost -p 389 -D "cn=Manager,dc=<yourdomain>,dc=com" -w "<Manager's passwd>" -s sub -b  "ou=Users,dc=<yourdomain>,dc=com" | grep -v root | grep "dn:")
do
LDIF_FILE=/tmp/loginShell.ldif;
echo "${i}" > $LDIF_FILE;
echo "changetype: modify" >> $LDIF_FILE;
echo "replace: loginShell" >> $LDIF_FILE;
echo "loginShell: /usr/sbin/user_shell" >> $LDIF_FILE;
/usr/bin/ldapmodify -h localhost -p 389 -D "cn=Manager,dc=<yourdomain>,dc=com" -w "<Manager's passwd>" -f $LDIF_FILE;
done;
IFS=$SAVEIFS;


Of course, you can put instead of  loginShell any other parameters. Don't forget, to change multiply parameters put  '-' separator:

*****
        echo "replace: userPassword" >> $LDIF_FILE
        echo "userPassword: $PASSWD_SSHA" >> $LDIF_FILE
        echo "-" >> $LDIF_FILE
        echo "replace: sambaNTPassword" >> $LDIF_FILE
        echo "sambaNTPassword: $sambaNTPassword" >> $LDIF_FILE
  

Friday, August 15, 2014

Asterisk(Bash): watching agents on call/waiting in color

#!/bin/bash
clear
while true
do
buffer=$(
clear
/usr/sbin/asterisk -rx "show queue <My_Queue>" \
| grep Agent \
| grep -v \(Unavailable\) \
| sort -t"(" -k 2 \
| GREP_COLOR='01;31' egrep -i --color=always '^.*[0-9] \(Not in use.*$|$' \
| GREP_COLOR='01;32' egrep -i --color=always '^.*[0-9] \(Busy.*$|$' \
| GREP_COLOR='01;34' egrep -i --color=always '^.*\(paused.*$|$' )

echo "$buffer"
sleep 2
done

exit 0

Thursday, August 14, 2014

ZFS::chmod: changing permissions of Operation not permitted

Problem: 

I can't change a folder permissions running on NFS client:

chmod: changing permissions of <somedir>: Operation not permitted


But from ZFS/NAS server the command is working


Solutiom: 


You need to add no_root_squash to your /etc/exports

But if you are running ZFS, you'll need to set

#sharemgr set -P nfs -p anon=0 zfs/data

Where zfs/data is name of your pool
Then you can check:

#sharemgr show -vp

Output:
default nfs=()

zfs

    zfs/rpool nfs=()
          /rpool
    zfs/data nfs=(anon="0")
          /data

read more:
http://prefetch.net/blog/index.php/2009/05/05/using-sharemgr-to-manage-nfs-file-systems-on-opensolaris-hosts/

Monday, August 11, 2014

GREP: colored output

http://stackoverflow.com/questions/17236005/grep-output-with-multiple-colors

EXAMPLE:  Colored output from asterisk CLI

 asterisk -rvvvvvvv | GREP_COLOR='01;36' egrep --color=always '^.*answered SIP.*$|$' | GREP_COLOR='01;31' egrep -i --color=always '^.*Got SIP response.*$|$' | grep -E '(answered SIP|Got SIP response)'

Thursday, August 7, 2014

BASH Shell: For Loop File Names With Spaces

http://www.cyberciti.biz/tips/handling-filenames-with-spaces-in-bash.html

BASH for loop works nicely under UNIX / Linux / Windows and OS X while working on set of files. However, if you try to process a for loop on file name with spaces in them you are going to have some problem. For loop uses $IFS variable to determine what the field separators are. By default $IFS is set to the space character. There are multiple solutions to this problem.

Set $IFS variable

Try it as follows:
#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for f in *
do
  echo "$f"
done
IFS=$SAVEIFS
OR
#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
# set me
FILES=/data/*
for f in $FILES
do
  echo "$f"
done
# restore $IFS
IFS=$SAVEIFS

More examples using $IFS and while loop

Now you know that if the field delimiters are not whitespace, you can set IFS. For example, while loop can be used to get all fields from /etc/passwd file:
....
while IFS=: read userName passWord userID groupID geCos homeDir userShell
do
      echo "$userName -> $homeDir"
done < /etc/passwd

Using old good find command to process file names

To process the output of find with a command, try as follows:
find . -print0 | while read -d $'\0' file
do
  echo -v "$file"
done
Try to copy files to /tmp with spaces in a filename using find command and shell pipes:
find . -print0 | while read -d $'\0' file; do cp -v "$file" /tmp; done

Processing filenames using an array

Sometimes you need read a file into an array as one array element per line. Following script will read file names into an array and you can process each file using for loop. This is useful for complex tasks:
#!/bin/bash
DIR="$1"
 
# failsafe - fall back to current directory
[ "$DIR" == "" ] && DIR="."
 
# save and change IFS 
OLDIFS=$IFS
IFS=$'\n'
 
# read all file name into an array
fileArray=($(find $DIR -type f))
 
# restore it 
IFS=$OLDIFS
 
# get length of an array
tLen=${#fileArray[@]}
 
# use for loop read all filenames
for (( i=0; i<${tLen}; i++ ));
do
  echo "${fileArray[$i]}"
done

Playing mp3s with spaces in file names

Place following code in your ~/.bashrc file:
mp3(){
 local o=$IFS
 IFS=$(echo -en "\n\b")
 /usr/bin/beep-media-player "$(cat  $@)" &
 IFS=$o
}
Keep list of all mp3s in a text file such as follows (~/eng.mp3.txt):
/nas/english/Adriano Celentano - Susanna.mp3
/nas/english/Nick Cave & Kylie Minogue - Where The Wild Roses Grow.mp3
/nas/english/Roberta Flack - Kiling Me Softly With This Song.mp3
/nas/english/The Beatles - Girl.mp3
/nas/english/John Lennon - Stand By Me.mp3
/nas/english/The Seatbelts, Cowboy Bebop - 01-Tank.mp3
To play just type:
$ mp3 eng.mp3.txt

Saturday, August 2, 2014

bash:: tolowercase,to uppercase

http://stackoverflow.com/questions/2264428/converting-string-to-lower-case-in-bash-shell-scripting

To lowercase
$ string="A FEW WORDS"
$ echo ${string,}
a FEW WORDS
$ echo ${string,,}
a few words
$ echo ${string,,[AEIUO]}
a FeW WoRDS

$ string="A Few Words"
$ declare -l string
$ string=$string; echo $string
a few words
To uppercase
$ string="a few words"
$ echo ${string^}
A few words
$ echo ${string^^}
A FEW WORDS
$ echo ${string^^[aeiou]}
A fEw wOrds

$ string="A Few Words"
$ declare -u string
$ string=$string; echo $string
A FEW WORDS
Toggle (undocumented)
$ string="A Few Words"
$ echo ${string~~}
a fEW wORDS
$ string="A FEW WORDS"
$ echo ${string~}
a fEW wORDS
$ string="a few words"
$ echo ${string~}
A Few Words
Capitalize (undocumented)
$ string="a few words"
$ declare -c string
$ string=$string
$ echo $string
A few words
Title case:
$ string="a few words"
$ string=($string)
$ string=${string[@]^}
$ echo $string
A Few Words

$ declare -c string
$ string=(a few words)
$ echo ${string[@]}
A Few Words

Saturday, July 26, 2014

BASH: running script with argument equal value ( ./script.sh VAR="value" VAR2="value")

This is an example:

#Parse argument
while [ $# -gt 0 ]; do
 case ${1%%=*} in
  MESSAGE|message)
   MESSAGE=${1#*=}
   ;;
  SPANS|spans)
   SPANS=${1#*=}
   ;;
  NUMBERS|numbers)
   NUMBERS=${1#*=}
   ;;
  ATTEMPT|attempt)
   ATTEMPT=${1#*=}
   ;;
  VERBOSE|verbose)
   VERBOSE=${1#*=}
   ;;
  REPEAT|repeat)
   REPEAT=${1#*=}
   ;;
   *)
   usage
   exit 1
   ;;
 esac
 shift
done


Now you run your script as follow:

./script.sh  MESSAGE="message" SPANS="spans" NUMBERS="numbers" ....

How this works? That's easy!

while [ $# -gt 0 ] - Do, till we are running out of arguments. If we invoke ./script.sh one two three, then our arguments will be:
$0 = name of script ('./script.sh')
$1 = 'one'
$2 = 'two'
$3 = 'three'

On the end of each iteration we cast shift, which removes the first element from arguments array, but not the element's number. Argument numbers will be shifted. So at first cycle $1 will be equal 'one', but at the second iteration $1 will be equal 'two'. Got it?

case ${1%%=*} - In case if the first part (before '=' ) of our argument $1 is equal to (below). If we invoke ./script.sh MESSAGE="sometext", then $1 will be equal 'MESSAGE="sometext"'. Then respectively:

$1 = 'MESSAGE="sometext"'
${1} = 'MESSAGE="sometext"'
${1%%=*}  =  'MESSAGE'
${1#*=} = "sometext"



P.S.

Example of usage function:
usage()
{
        echo "Usage:"
        echo
        echo "$0 MESSAGE=\"message\" SPANS=\"spans\" NUMBERS=\"numbers\" [ATTEMPT=\"attempt\"] [VERBOSE=\"verbose\"] [REPEAT=\"repeat\"]"
        echo "Defaults: ATTEMPT=always VERBOSE=3 REPEAT=1"
        echo "Example: $APP_NAME MESSAGE=\"hello\" SPANS=auto NUMBERS=\"135xxxxxxxx,136xxxxxxxx\""
        echo
}

Look as well at: http://tldp.org/LDP/abs/html/refcards.html#AEN22664

Friday, July 25, 2014

Postfix: controlling attachment size limits

One of the famous problems, if you're building up a corporate email server, might be an email attachment size, that is allowed for your users to send as emails. On newbie's questions on forums most of gurus are pointing to policyd. Obviously, this plugin is more than amazing, works more than perfect and pretty fast as well. But.. It wont control the attachment size. It's plugin "Quotas" is only to control the amount of sent messages and consumed bandwidth, but not to control a single message size.

NOTE: MessageCumulativeSize will never block your first message with attachment, even it's size is exceeding the limits of hundred times! The first message will always go through. Read this: https://www.mail-archive.com/users@lists.policyd.org/msg01962.html

So this is not what I expected. I'd like to have a simple plugin, that BLOCKS the message sending, if it's size is larger, than I would allow. And I came up with this simple path.

Go to /usr/lib64/policyd-2.0/cbp/modules/ or wherever your cbpolicyd files stored and modify  Quotas.pm or make a patch like this (name it Quotas.pm.patch):

[root@server modules]# cat Quotas.pm.patch

--- Quotas.pm.orig      2014-07-25 21:01:38.332494503 -0400
+++ Quotas.pm   2014-07-25 22:24:08.297785096 -0400
@@ -101,7 +101,6 @@
        #   stage
        #
        if ($sessionData->{'ProtocolState'} eq "RCPT") {
-
                # Key tracking list, if quotaExceeded is not undef, it will contain the msg
                my %newCounters;  # Indexed by QuotaLimitsID
                my @trackingList;
@@ -414,7 +413,24 @@
                                                        if (lc($limit->{'Type'}) eq "messagecumulativesize") {
                                                                # Bump up counter
                                                                my $currentCounter = $qtrack->{'Counter'} + $sessionData->{'Size'};
-
+
+#-------------------------------# Added by SHIRKER
+                                                              # $server->maillog("DEBUG Quota TESTTTTT START!! Quota=%s MessageSize=%s",
+                                                              #                $limit->{'CounterLimit'},
+                                                              #                $sessionData->{'Size'});
+
+                                                               if ($sessionData->{'Size'} > $limit->{'CounterLimit'}){
+                                                               # $server->maillog("DEBUG Quota TESTTTTT DONE!! Quota=%s MessageSize=%s" Verdict=%s",
+                                                               # $limit->{'CounterLimit'},
+                                                               # $sessionData->{'Size'},
+                                                              # $quota->{'Verdict'});
+
+                                                                       # Set verdict
+                                                                       $verdict = $quota->{'Verdict'};
+                                                               }
+#-------------------------------# END added by Shirker
+#
+#
                                                                # Update database
                                                                my $sth = DBDo("
                                                                        UPDATE

Then apply it:

patch Quotas.pm < Quotas.pm.patch

Saturday, May 31, 2014

OPENVPN working configuration

1) I have server inside a local network with eth0 192.168.0.14/24

2) A cheap modem with IP XX.XX.XX.166 and NAT  8460 port to 192.168.0.14

3) VPN network will be 172.26.0.0/24

We gonna use NAT since we cant add a static route to main gateway:

Windows openvpn client(172.26.0.6) <==>172.26.0.1 => NAT => 192.168.0.14



In general, my server configuration has been done according to this article: http://habrahabr.ru/post/194144/

/etc/openvpn/server.conf:


[root@gsm-gateway html]# cat /etc/openvpn/server.conf

local 192.168.0.14
port 8460
proto tcp-server
dev tun

ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt
cert /etc/openvpn/easy-rsa/2.0/keys/server.crt
key /etc/openvpn/easy-rsa/2.0/keys/server.key
dh /etc/openvpn/easy-rsa/2.0/keys/dh1024.pem

server 172.26.0.0 255.255.255.0
persist-key
persist-tun

ifconfig-pool-persist ipp.txt
route 172.26.0.0 255.255.255.0
client-to-client

push "route 192.168.0.0 255.255.255.0"
push "redirect-gateway def"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

keepalive 10 120
comp-lzo
max-clients 100
user openvpn
group openvpn
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3
tun-mtu 1500
tun-mtu-extra 32

/etc/sysconfig/iptables:

[root@gsm-gateway html]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Sun Jun  1 14:09:37 2014
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [2253:276759]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8460 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -i tun0 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 172.26.0.0/24 -d 192.168.0.0/24 -i tun0 -o eth0 -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -i tun0 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Sun Jun  1 14:09:37 2014
# Generated by iptables-save v1.4.7 on Sun Jun  1 14:09:37 2014
*nat
:PREROUTING ACCEPT [7656:717493]
:POSTROUTING ACCEPT [2631:164557]
:OUTPUT ACCEPT [2631:164557]
-A POSTROUTING -s 172.26.0.0/24 -o eth0 -j MASQUERADE
COMMIT
# Completed on Sun Jun  1 14:09:37 2014

Client (Windows 7) server.ovpn:

client
dev tun
proto tcp-client
remote XX.XX.XX.166 8460
resolv-retry infinite
nobind
tun-mtu 1500
tun-mtu-extra 32
mssfix 1450
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
auth-user-pass
comp-lzo
reneg-sec 0
verb 5

Run windows client as administrator!!!


Windows Username/Password annoying prompt 

To disable Username/Password prompt read this thread https://forums.openvpn.net/topic11342.html
Enough said:
1. Create a txt file on a folder alongside your .ovpn files name it what ever you want ex. 'pass.txt'
2. Put your user/pass inside the file in two(2) lines, like:

Code:
username
password


3. Then save it.
4. open up your .ovpn file in notepad and add:

Code:
auth-user-pass pass.txt


5. save and connect to your openvpn server.


Sunday, May 18, 2014

VIM: Disable automatic comment insertion

Sometimes vim does weird things, like when you copy/paste stuff, that contained a line started with comment, then vim ALL next inserted line will put with comment in front...

this post is about how to get rid of it:
http://vim.wikia.com/wiki/Disable_automatic_comment_insertion

OR

create .vimrc file, it its not exists yet and add there following line:

autocmd FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o

Monday, April 7, 2014

Bash: disk space alert

There are millions scripts and utilities for that.. Here is my input:
[root@gsm-gateway ~]# cat /usr/local/sbin/diskspace_alert

#!/bin/bash

ALERT=0
MAX_VALUE=$1
for i in `df -h | tr -s ' '| cut -d' ' -f5 | grep -oP "\d{1,3}?(?=%)"`
do
        [ "$i" -ge "$MAX_VALUE" ] && ALERT=$((ALERT+1)) && DF_OUTPUT=$(df -h)
done

[ "$ALERT" -gt 0 ] && /usr/local/sbin/php_mailer "The disk space is nearly full" "$DF_OUTPUT"


Replace /usr/local/sbin/php_mailer to your favorite Linux mailer

add to cron:

* */1 * * * /usr/local/sbin/diskspace_alert 80

where 80 - is the max percentage value

Wednesday, April 2, 2014

Sending emails via gmail with php

This script developed to send notifications (as well html and attachment)  to server admin through gmail account:

#!/usr/bin/php
<?php

/*

Please make sure, you have installed following pear modules:

pear install Mail
pear install Net_SMTP
pear install Mail_mime
pear install Mail_mimeDecode


IMPORTANT: Works only with utf-8 charset!!!

*/

$mailru_user = "YOUR_USER@gmail.com";
$mailru_passwd = "YOUR_PASS";
$to = '<TO_SERVER_ADMIN@gmail.com>';

require_once "Mail.php";
require_once('Mail/mime.php');

if(empty($argv[1]))exit("USAGE: $argv[0] 'Hello, how are you?' 'some text' '<h1>some html text</h1>' '/tmp/attachment.txt'");



function mail_via_gmail($subject,$text,$html,$file){
    global $mailru_user;
    $from = '<'.$mailru_user.'>';
    global $mailru_passwd;
    global $to;
    $crlf = "\r\n";
    if( empty($to) ){
        echo 'Please specify $to parameter';
        exit();
    }

    if( empty( $subject ) ) $subject = '';
    if( empty( $text ) ) $text = '';
    if( empty( $html ) ) $html = '';
    if( empty( $file ) ) $file = '';

    $headers = array(
        'From' => $from,
        'To' => $to,
        'Subject' => $subject,
        'Content-Type'  => 'text/html; charset=UTF-8'
    );


    $mime_params = array(
        'text_encoding' => '7bit',
        'text_charset'  => 'UTF-8',
        'html_charset'  => 'UTF-8',
        'head_charset'  => 'UTF-8'
    );

    $mime = new Mail_mime($crlf);

    $mime->setTXTBody($text);
    $mime->setHTMLBody($html);
    $mime->addAttachment($file,'application/octet-stream');

    $body = $mime->get($mime_params);
    $headers = $mime->headers($headers);

    $smtp = Mail::factory('smtp', array(
        'host' => 'ssl://smtp.gmail.com',
        'port' => '465',
        'auth' => true,
        'username' => $mailru_user,
        'password' => $mailru_passwd
    ));

    $mail = $smtp->send($to, $headers, $body);

    if (PEAR::isError($mail)) {
        echo('<p>' . $mail->getMessage() . '</p>');
    } else {
        echo("Message successfully sent!\n");
    }
}

@mail_via_gmail($argv[1],$argv[2],$argv[3],$argv[4]);

?>



Friday, January 24, 2014

My own fail to ban script for asterisk

This is script /usr/local/sbin/block_sip_ip.sh. It has some options, but i doubt if you really need all of them
you can just add it to your crontab:

*/3 * * * * /usr/local/sbin/block_sip_ip.sh -n 1000

where
-n 1000 - amount of las lines of asterisk log to parse. You need to adjust that part accordingly of intensity  of your calls. by default its only 200 lines.

-q - how many attempts allowed before IP will be banned. 3 by default

#!/bin/bash
# checking, is someone is getting "wrong password" in last 200 lines of asterisk log:
DEBUG=0
# email to notify about banned IPs
ADMIN_EMAIL="admin@domain.com"

# our internal network. First part only
LOCAL_NET="10.0.0"


# our own external IP:
OWNIP1="111.221.211.111"
LINES=200
INFO="Use: $0 -l /PATH/TO/LOG -q ATTEMPTS -n LINES"
while getopts ":dl:q:n:" optname
    do
      case "$optname" in
        "d")
             DEBUG=1
             echo "debugging is on"
          ;;
        "n")
             LINES=$OPTARG
          ;;
        "l")
             LOG_FILE=$OPTARG
          ;;
        "q")
            ATTEMPTS=$OPTARG
          ;;
        "?")
          echo "Unknown option $OPTARG"
                  echo $INFO
                  exit 0
          ;;
        ":")
          echo "No argument value for option $OPTARG"
                  echo $INFO
                  exit 0
          ;;
        *)
      echo "Unknown error while processing options"
          exit 0
          ;;
      esac
    done
if [ -z "$LOG_FILE" ]
then
  LOG_FILE="/var/log/sip_hackers_ips"
fi

[ "$DEBUG" -eq 1 ] &&  echo "logfile : $LOG_FILE"
[ "$DEBUG" -eq 1 ] &&  echo "lines : $LINES"

if [ -z "$ATTEMPTS" ]
then
    ATTEMPTS=2
fi

[ "$DEBUG" -eq 1 ] &&  echo "failed ext. allowed : $ATTEMPTS"

for i in `tail -$LINES /var/log/asterisk/full | grep -v $LOCAL_NET | grep -E '(Wrong password| failed for )' | grep -Eo '(([0-9]{1,3}\.){3}[0-9]{1,3})' | sort | uniq | grep -v "$OWNIP1"`
do
    # checking amount of attempted extensions
    EXT_CNT=$(tail -$LINES /var/log/asterisk/full | grep -oc "$i")
    # if its geater than 3, block it!!
    if [ "$EXT_CNT" -gt "$ATTEMPTS" ];
    then
       IPTABLES_CNT=$(/sbin/iptables -nvL | grep -c $i);
       if [ "$IPTABLES_CNT" -eq 0 ]; 
       then
            [ "$DEBUG" -eq 1 ] && echo "To BLOCK: $i";
            echo -n "[`date`]">> $LOG_FILE
            echo $i >> $LOG_FILE
            /sbin/iptables -I INPUT -s $i -j DROP
            /sbin/iptables -A OUTPUT -d $i -j DROP
            [ "$DEBUG" -eq 1 ] && echo "IP $i has been blocked"
            echo "VPBX: $i has been blocked" | mail -s "VPBX: $i has been blocked" $ADMIN_EMAIL
         fi
      fi
done

Saturday, January 18, 2014

freepbx moving all .conf.old files back to original

Hi, all

Once by mistake I recompiled all .conf files from asterisk source, and some freepbx files were moved into <FILE>.conf.old. So this is the script to change it back :
mv <FILE>.conf to <FILE>.conf_orig
mv <FILE>.conf.old mv <FILE>.conf
just go to /etc/asterisk
and run:

for i in `ls | grep "\.old$"`;do echo "${i%.old} will be saved as ${i%.old}_orig"; mv ${i%.old} ${i%.old}_orig; echo " moving $i to ${i%.old}" ; mv $i ${i%.old};done

Thursday, January 16, 2014

How to merge wav files in linux for asterisk IVR

For example, for lazy admins, its possible to combine some asterisk system sounds into IVR. This is how to merge them and insert a pause. And on the end - sending to specified email for checking:


# Making first part. After it we need a pause:
wavmerge good-morning.wav thank-you-for-calling.wav

# Renaming from default
mv -f merge.wav merge1.wav

# Inserting pause in 1 second:
sox merge1.wav "|sox our-business-hours.wav -p pad 1" merge2.wav


# Adding more files
wavmerge merge2.wav 9.wav hours.wav 12.wav hours.wav 13.wav hours.wav 18.wav hours.wav and.wav day-1.wav day-5.wav

# Renaming from default
mv -f merge.wav merge3.wav


# Inserting pause in 1 second:
sox merge3.wav "|sox this-call-may-be-monitored-or-recorded.wav -p pad 1" merge1_4.wav

# Sending by email:
echo "This is latest recording" | mutt -a "merge1_4.wav" -s "new recordimg out" -- youremail@gmail.com

Monday, January 13, 2014

cbpolicy email notifier

I come up with a script, that parses maillog and sends email notification to specified admin's email. take a look:

#!/bin/bash
# Usage:
# cbpolicy_notifier <LINES TO PARSE> <MAIL TO>

LINES=$1
MAIL_TO=$2

if [ -z "$2" ] || [ ! -z "$3" ];then
    echo ""
    echo "ERROR: $0 requires number munber of lines to parse and valid email to notify you"
    echo ""
    echo "Usage: $0 <LINES TO PARSE> <MAIL TO>"
    echo ""
    exit
fi

EMAILMESSAGE="/tmp/cbpolicy_notifier_`date +%Y-%m-%d_%H-%M`.txt"
HOST_NAME=$(hostname)
MAIL_FROM=postmaster@$HOST_NAME

for i in `tail -$LINES /var/log/maillog  | grep cbpolicy | grep reject | grep -v "from=root@" | grep "track=Sender" | grep -oP '(?<=from=).*?(?=,)' | uniq`;
do
        echo $i
        V_EMAIL=$i
        MSG_SUBJECT_ADMIN="$HOST_NAME::Outbound email quota was exceeded for $V_EMAIL"
        MSG_SUBJECT_USER="WARNING::Your outbound email hourly quota was exceeded"
        echo "We have encountered outbound email overlimiting for $V_EMAIL" > $EMAILMESSAGE
        echo "" >> $EMAILMESSAGE
        LOG_SAMPLE=$(tail -$LINES /var/log/maillog  | grep cbpolicy | grep reject | grep -v "from=root@" | grep $V_EMAIL )
        echo "This is the log sample" >> $EMAILMESSAGE
        echo "" >> $EMAILMESSAGE
        echo "$LOG_SAMPLE" >> $EMAILMESSAGE
        /bin/mailx -r "$MAIL_FROM" -s "$MSG_SUBJECT_ADMIN" "$MAIL_TO" < $EMAILMESSAGE

        echo "Dear customer." > $EMAILMESSAGE
        echo "" >> $EMAILMESSAGE
        echo "Your hourly outbound email quota was overlimited. Please reduce amount of emails you are sending out." >> $EMAILMESSAGE
        /bin/mailx -r "$MAIL_FROM" -s "$MSG_SUBJECT_USER" "$V_EMAIL" < $EMAILMESSAGE
done
add this to cron, just specify num of lines to parse and email. Like this:
*/15 * * * * /usr/local/sbin/cbpolicy_notifier 500 support@example.com

monitor HDD script via hpacucli

I have written some useful script to monitor HDD on HP server via hpacucli and send email notification

[root@hp-proliant]# cat /usr/local/sbin/hpacucli_mon
#!/bin/bash
# Usage:
# hpacucli_mon <NUM OF ARRAYS> <NUM OF PHISYCAL DISKS> <MAIL TO>
HP_SLOT=`/usr/sbin/hpacucli ctrl all show status | grep -o -P 'Slot.{0,2}'| awk -F" " '{print $2}'`
if [ "$3" = "" ] || [ "$4" != "" ];then
    echo ""
    echo "ERROR: hpacucli_mon requires number of arrays, disks and valid email"
    echo ""
    echo "Usage: hpacucli_mon <NUM OF ARRAYS> <NUM OF PHISYCAL DISKS> <MAIL TO>"
    echo ""
    echo "To find amount of arrays and disks you do have run:"
    echo "/usr/sbin/hpacucli ctrl slot=$HP_SLOT ld all show status"
    echo "and"
    echo "/usr/sbin/hpacucli ctrl slot=$HP_SLOT pd all show status"
    exit
fi
EMAILMESSAGE="/tmp/hpacucli_message.txt"
LOCAL_IP=`/sbin/ifconfig   eth0 | grep -Eo '(([0-9]{1,3}\.){3}[0-9]{1,3})' | grep -v ".255"`
MSG_SUBJECT="Smart HP array failure at $LOCAL_IP"
OK_ARRAY_CNT=`/usr/sbin/hpacucli ctrl slot=$HP_SLOT ld all show status | grep -o "OK" | wc -l`
OK_DISKS_CNT=`/usr/sbin/hpacucli ctrl slot=$HP_SLOT pd all show status | grep -o "OK" | wc -l`
if [ "$OK_ARRAY_CNT" -ne $1 ] || [ "$OK_DISKS_CNT" -ne $2 ]; then
    echo "We have encountered a problem at $LOCAL_IP" > $EMAILMESSAGE
    echo "Take look at this: " >> $EMAILMESSAGE
    /usr/sbin/hpacucli ctrl slot=$HP_SLOT ld all show status >> $EMAILMESSAGE
    /usr/sbin/hpacucli ctrl slot=$HP_SLOT pd all show status >> $EMAILMESSAGE
    echo "===============================================" >> $EMAILMESSAGE
    echo "INFORMATION PROVIDED BY SMARTCTL:"  >> $EMAILMESSAGE
    echo "" >> $EMAILMESSAGE
    for (( i=0; i<$2; i++ ))
    do
        /usr/sbin/smartctl -a -d cciss,$i /dev/cciss/c0d0 | grep -E '(Serial|Health)' >> $EMAILMESSAGE
        echo "" >> $EMAILMESSAGE
    done
    mail -s "$MSG_SUBJECT" "$3" < $EMAILMESSAGE
fi



To use this, just add to crontab:
00 */1 * * * /usr/local/sbin/hpacucli_mon <NUM OF LOGICAL HDD> <NUM OF PHYSICAL HDD> <YOUR@EMAIL> 

To find amount of disks, run
export HP_SLOT=$(/usr/sbin/hpacucli ctrl all show status | grep -o -P 'Slot.{0,2}'| awk -F" " '{print $2}') && /usr/sbin/hpacucli ctrl slot=$HP_SLOT ld all show status && /usr/sbin/hpacucli ctrl slot=$HP_SLOT pd all show status


Then count them

howto debug SIP and RTP

Low level debug:
tcpdump -A host 188.232.87.xxx

High level debug:
asterisk -r
CLI> sip set debug ip 188.232.87.xxx

RTP debug:
tcpdump -n dst portrange 10000-20000

Wednesday, October 23, 2013

rebuild php module in centos6 (pdo_pgsql for example)

We have installed latest PostgreSQL 9.3, but pdo_pgsql from remi supports only 8.4
this is simple instruction, how to rebuild a php extension


cd /usr/src/
mkdir php
cd php/
wget http://www.php.net/get/php-5.5.5.tar.gz/from/de1.php.net/mirror
tar -xzvf php-5.5.5.tar.gz
cd php-5.5.5/ext/pdo_pgsql

go configure it and build. Use ./configure --help to see available options

phpize
aclocal
./configure --help
./configure  --with-pdo-pgsql=/usr/pgsql-9.3
make
ls modules
ls /usr/lib64/php/modules
rm -f /usr/lib64/php/modules/pdo_pgsql.so
cp modules/pdo_pgsql.so /usr/lib64/php/modules/
service httpd restart

Программный RAID в Linux

source http://xgu.ru/wiki/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D1%8B%D0%B9_RAID_%D0%B2_Linux

mdadm

Управление программным RAID-массивом в Linux выполняется с помощью программы mdadm.
У программы mdadm есть несколько режимов работы.
Assemble (сборка)
Собрать компоненты ранее созданного массива в массив. Компоненты можно указывать явно, но можно и не указывать — тогда выполняется их поиск по суперблокам.
Build (построение)
Собрать массив из компонентов, у которых нет суперблоков. Не выполняются никакие проверки, создание и сборка массива в принципе ничем не отличаются.
Create (создание)
Создать новый массив на основе указанных устройств. Использовать суперблоки размещённые на каждом устройстве.
Monitor (наблюдение)
Следить за изменением состояния устройств. Для RAID0 этот режим не имеет смысла.
Grow (расширение или уменьшение)
Расширение или уменьшение массива, включаются или удаляются новые диски.
Incremental Assembly (инкрементальная сборка)
Добавление диска в массив.
Manage (управление)
Разнообразные операции по управлению массивом, такие как замена диска и пометка как сбойного.
Misc (разное)
Действия, которые не относятся ни к одному из перечисленных выше режимов работы.
Auto-detect (автоообнаружение)
Активация автоматически обнаруживаемых массивов в ядре Linux.

Формат вызова
 mdadm [mode] [array] [options]

Режимы:
  • -A--assemble — режим сборки
  • -B--build — режим построения
  • -C--create — режим создания
  • -F--follow--monitor — режим наблюдения
  • -G--grow — режим расширения
  • -I--incremental — режим инкрементальной сборки


Настройка программного RAID-массива

Рассмотрим как выполнить настройку RAID-массива 5 уровня на трёх дисковых разделах. Мы будем использовать разделы:
   /dev/hde1
   /dev/hdf2
   /dev/hdg1
В том случае если разделы иные, не забудьте использовать соответствующие имена файлов.


Создание разделов

Нужно определить на каких физических разделах будет создаваться RAID-массив. Если разделы уже есть, нужно найти свободные (fdisk -l). Если разделов ещё нет, но есть неразмеченное место, их можно создать с помощью программ fdisk или cfdisk.
Просмотреть какие есть разделы:
   %# fdisk -l
   Disk /dev/hda: 12.0 GB, 12072517632 bytes
   255 heads, 63 sectors/track, 1467 cylinders
   Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot    Start       End    Blocks   Id  System
   /dev/hda1   *         1        13    104391   83  Linux
   /dev/hda2            14       144   1052257+  83  Linux
   /dev/hda3           145       209    522112+  82  Linux swap
   /dev/hda4           210      1467  10104885    5  Extended
   /dev/hda5           210       655   3582463+  83  Linux
   ...
   ...
   /dev/hda15         1455      1467    104391   83  Linux
Просмотреть, какие разделы куда смонтированы, и сколько свободного места есть на них (размеры в килобайтах):
   %# df -k
   Filesystem           1K-blocks      Used Available Use% Mounted on
   /dev/hda2              1035692    163916    819164  17% /
   /dev/hda1               101086      8357     87510   9% /boot
   /dev/hda15              101086      4127     91740   5% /data1
   ...
   ...
   ...
   /dev/hda7              5336664    464228   4601344  10% /var


Размонтирование

Если вы будете использовать созданные ранее разделы, обязательно размонтируйте их. RAID-массив нельзя создавать поверх разделов, на которых находятся смонтированные файловые системы.
   %# umount /dev/hde1
   %# umount /dev/hdf2
   %# umount /dev/hdg1


Изменение типа разделов

Желательно (но не обязательно) изменить тип разделов, которые будут входить в RAID-массив и установить его равным FD (Linux RAID autodetect). Изменить тип раздела можно с помощью fdisk.
Рассмотрим как это делать на примере раздела /dev/hde1.
    %# fdisk /dev/hde
    The number of cylinders for this disk is set to 8355. 
    There is nothing wrong with that, but this is larger than 1024,
    and could in certain setups cause problems with:
    1) software that runs at boot time (e.g., old versions of LILO)
    2) booting and partitioning software from other OSs
    (e.g., DOS FDISK, OS/2 FDISK)

    Command (m for help):

    Use FDISK Help

    Now use the fdisk m command to get some help:

    Command (m for help): m
    ...
    ...
    p   print the partition table
    q   quit without saving changes
    s   create a new empty Sun disklabel
    t   change a partition's system id
    ...
    ...
    Command (m for help):

    Set The ID Type To FD

    Partition /dev/hde1 is the first partition on disk /dev/hde. 
    Modify its type using the t command, and specify the partition number 
    and type code. 
    You also should use the L command to get a full listing 
    of ID types in case you forget.

    Command (m for help): t
    Partition number (1-5): 1
    Hex code (type L to list codes): L

    ...
    ...
    ...
    16  Hidden FAT16    61   SpeedStor       f2  DOS secondary
    17  Hidden HPFS/NTF 63  GNU HURD or Sys fd  Linux raid auto
    18  AST SmartSleep  64  Novell Netware  fe  LANstep
    1b  Hidden Win95 FA 65  Novell Netware  ff  BBT
    Hex code (type L to list codes): fd
    Changed system type of partition 1 to fd (Linux raid autodetect)

    Command (m for help):


    Make Sure The Change Occurred

    Use the p command to get the new proposed partition table:

    Command (m for help): p

    Disk /dev/hde: 4311 MB, 4311982080 bytes
    16 heads, 63 sectors/track, 8355 cylinders
    Units = cylinders of 1008 * 512 = 516096 bytes

    Device Boot    Start       End    Blocks   Id  System
    /dev/hde1             1      4088   2060320+  fd  Linux raid autodetect
    /dev/hde2          4089      5713    819000   83  Linux
    /dev/hde4          6608      8355    880992    5  Extended
    /dev/hde5          6608      7500    450040+  83  Linux
    /dev/hde6          7501      8355    430888+  83  Linux

    Command (m for help):


    Save The Changes

    Use the w command to permanently save the changes to disk /dev/hde:

    Command (m for help): w
    The partition table has been altered!

    Calling ioctl() to re-read partition table.

    WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
    The kernel still uses the old table.
    The new table will be used at the next reboot.
    Syncing disks.
Аналогичным образом нужно изменить тип раздела для всех остальных разделов, входящих в RAID-массив.


Создание RAID-массива

Создание RAID-массива выполняется с помощью программы mdadm (ключ --create). Мы воспользуемся опцией --level, для того чтобы создать RAID-массив 5 уровня. С помощью ключа --raid-devices укажем устройства, поверх которых будет собираться RAID-массив.
    %# mdadm --create --verbose /dev/md0 --level=5  --raid-devices=3 /dev/hde1 /dev/hdf2 /dev/hdg1

    mdadm: layout defaults to left-symmetric
    mdadm: chunk size defaults to 64K
    mdadm: /dev/hde1 appears to contain an ext2fs file system
        size=48160K  mtime=Sat Jan 27 23:11:39 2007
    mdadm: /dev/hdf2 appears to contain an ext2fs file system
        size=48160K  mtime=Sat Jan 27 23:11:39 2007
    mdadm: /dev/hdg1 appears to contain an ext2fs file system
        size=48160K  mtime=Sat Jan 27 23:11:39 2007
    mdadm: size set to 48064K
    Continue creating array? y
    mdadm: array /dev/md0 started.
Если вы хотите сразу создать массив, где диска не хватает (degraded) просто укажите слово missing вместо имени устройства. Для RAID5 это может быть только один диск; для RAID6 — не более двух; для RAID1 — сколько угодно, но должен быть как минимум один рабочий.


Проверка правильности сборки

Убедиться, что RAID-массив проинициализирован корректно можно просмотрев файл /proc/mdstat. В этом файле отражается текущее состояние RAID-массива.
    %# cat /proc/mdstat
    Personalities : [raid5]
    read_ahead 1024 sectors
    md0 : active raid5 hdg1[2] hde1[1] hdf2[0]
        4120448 blocks level 5, 32k chunk, algorithm 3 [3/3] [UUU]

    unused devices: <none>
Обратите внимание на то, как называется новый RAID-массив. В нашем случае он называется /dev/md0. Мы будем обращаться к массиву по этому имени.


Создание файловой системы поверх RAID-массива

Новый RAID-раздел нужно отформатировать, т.е. создать на нём файловую систему. Сделать это можно при помощи программы из семейства mkfs. Если мы будем создавать файловую систему ext3, воспользуемся программой mkfs.ext3. :
    %# mkfs.ext3 /dev/md0
    mke2fs 1.39 (29-May-2006)
    Filesystem label=
    OS type: Linux
    Block size=1024 (log=0)
    Fragment size=1024 (log=0)
    36144 inodes, 144192 blocks
    7209 blocks (5.00%) reserved for the super user
    First data block=1
    Maximum filesystem blocks=67371008
    18 block groups
    8192 blocks per group, 8192 fragments per group
    2008 inodes per group
    Superblock backups stored on blocks: 
            8193, 24577, 40961, 57345, 73729

    Writing inode tables: done                            
    Creating journal (4096 blocks): done
    Writing superblocks and filesystem accounting information: done

    This filesystem will be automatically checked every 33 mounts or
    180 days, whichever comes first.  Use tune2fs -c or -i to override.
Имеет смысл для лучшей производительности файловой системы указывать при создании количество дисков в рейде и количество блоков файловой системы которое может поместиться в один страйп ( chunk ), это особенно важно при создании массивов уровня RAID0,RAID5,RAID6,RAID10. Для RAID1 ( mirror ) это не имеет значения так как запись идет всегда на один device, a в других типах рейдов дата записывается последовательно на разные диски порциями соответствующими размеру stripe.Например если мы используем RAID5 из 3 дисков, с дефолтным размером страйпа в 64К и используем файловую систему ext3 с размером блока в 4К то можно вызывать команду mkfs.ext вот так:
   
      %# mkfs.ext3 -b 4096 -E stride=16 stripe-width=32 /dev/md0

stripe-width обычно расчитывается как stride * N ( N это дата диски в массиве - например в RAID5 - два дата диска и один parity ) Для неменее популярной файловой системы XFS надо указывать не количество блоков файловой системы соответствующих размеру stripe в массиве, а непосредственно размер самого страйпа
      %# mkfs.xfs -d su=64k,sw=3 /dev/md0


Создание конфигурационного файла mdadm.conf

Система сама не запоминает какие RAID-массивы ей нужно создать и какие компоненты в них входят. Эта информация находится в файлеmdadm.conf.
Строки, которые следует добавить в этот файл, можно получить при помощи команды
 mdadm --detail --scan --verbose
Вот пример её использования:
    %# mdadm --detail --scan --verbose
    ARRAY /dev/md0 level=raid5 num-devices=4 
    UUID=77b695c4:32e5dd46:63dd7d16:17696e09
    devices=/dev/hde1,/dev/hdf2,/dev/hdg1
Если файла mdadm.conf ещё нет, можно его создать:
    %# echo "DEVICE partitions" > /etc/mdadm/mdadm.conf
    %# mdadm --detail --scan --verbose | awk '/ARRAY/ {print}' >> /etc/mdadm/mdadm.conf


Создание точки монтирования для RAID-массива

Поскольку мы создали новую файловую систему, вероятно, нам понадобится и новая точка монтирования. Назовём её /raid.
    %# mkdir /raid


Изменение /etc/fstab

Для того чтобы файловая система, созданная на новом RAID-массиве автоматически монтировалась при загрузке, добавим соответствующую запись в файл /etc/fstab хранящий список автоматически монтируемых при загрузке файловых систем.
   /dev/md0      /raid     ext3    defaults    1 2
Если мы объединяли в RAID-массив разделы, которые использовались раньше, нужно отключить их монтирование: удалить или закомментировать соответствующие строки в файле /etc/fstab. Закомментировать строку можно символом #.
    #/dev/hde1       /data1        ext3    defaults        1 2
    #/dev/hdf2       /data2        ext3    defaults        1 2
    #/dev/hdg1       /data3        ext3    defaults        1 2


Монтирование файловой системы нового RAID-массива

Для того чтобы получить доступ к файловой системе, расположенной на новом RAID-массиве, её нужно смонтировать. Монтирование выполняется с помощью команды mount.
Если новая файловая система добавлена в файл /etc/fstab, можно смонтировать её командой mount -a (смонтируются все файловые системы, которые должны монтироваться при загрузке, но сейчас не смонтированы).
   %# mount -a
Можно смонтировать только нужный нам раздел (при условии, что он указан в /etc/fstab).
   %# mount /raid
Если раздел в /etc/fstab не указан, то при монтировании мы должны задавать как минимум два параметра — точку монтирования и монтируемое устройство:
   %# mount /dev/md0 /raid


Проверка состояния RAID-массива

Информация о состоянии RAID-массива находится в файле /proc/mdstat.
    %# raidstart /dev/md0
    %# cat /proc/mdstat
    Personalities : [raid5]
    read_ahead 1024 sectors
    md0 : active raid5 hdg1[2] hde1[1] hdf2[0]
        4120448 blocks level 5, 32k chunk, algorithm 3 [3/3] [UUU]

    unused devices: <none>
Если в файле информация постоянно изменяется, например, идёт пересборка массива, то постоянно изменяющийся файл удобно просматривать при помощи программы watch:
%$ watch cat /proc/mdstat

Как выполнить проверку целостности программного RAID-массива md0:
echo 'check' >/sys/block/md0/md/sync_action

Как посмотреть нашлись ли какие-то ошибки в процессе проверки программного RAID-массива по команде check или repair:
cat /sys/block/md0/md/mismatch_cnt


Проблема загрузки на многодисковых системах

В некоторых руководствах по mdadm после первоначальной сборки массивов рекомендуется добавлять в файл /etc/mdadm/mdadm.conf вывод команды "mdadm --detail --scan --verbose":
ARRAY /dev/md/1 level=raid1 num-devices=2 metadata=1.2 name=linuxWork:1 UUID=147c5847:dabfe069:79d27a05:96ea160b
  devices=/dev/sda1
ARRAY /dev/md/2 level=raid1 num-devices=2 metadata=1.2 name=linuxWork:2 UUID=68a95a22:de7f7cab:ee2f13a9:19db7dad
  devices=/dev/sda2
, в котором жёстко прописаны имена разделов (/dev/sda1, /dev/sda2 в приведённом примере).
Если после этого обновить образ начальной загрузки (в Debian вызвать 'update-initramfs -u' или 'dpkg-reconfigure mdadm'), имена разделов запишутся в файл mdadm.conf образа начальной загрузки и вы не сможете загрузиться с массива, если конфигурация жёстких дисков изменится (нужные разделы получат другие имена). Для этого не обязательно добавлять или убирать жёсткие диски: в многодисковых системах их имена могут меняться от загрузки к загрузке.
Решение: записывать в /etc/mdadm/mdadm.conf вывод команды "mdadm --detail --scan" (без --verbose).
При этом в файле mdadm.conf будут присутствовать UUID разделов, составляющих каждый RAID-массив. При загрузке системы mdadm находит нужные разделы независимо от их символических имён по UUID.
mdadm.conf, извлечённый из образа начальной загрузки Debian:
DEVICE partitions
HOMEHOST <system>
ARRAY /dev/md/1 metadata=1.2 UUID=147c5847:dabfe069:79d27a05:96ea160b name=linuxWork:1
ARRAY /dev/md/2 metadata=1.2 UUID=68a95a22:de7f7cab:ee2f13a9:19db7dad name=linuxWork:2
Результат исследования раздела командой 'mdadm --examine'"
/dev/sda1:
         Magic : a92b4efc
       Version : 1.2
   Feature Map : 0x0
    Array UUID : 147c5847:dabfe069:79d27a05:96ea160b
          Name : linuxWork:1
 Creation Time : Thu May 23 09:17:01 2013
    Raid Level : raid1
  Raid Devices : 2
Раздел c UUID 147c5847:dabfe069:79d27a05:96ea160b войдёт в состав массива, даже если станет /dev/sdb1 при очередной загрузке системы.
Вообще, существует 2 файла mdadm.conf, влияющих на автоматическую сборку массивов:
  • один при загрузке системы, записывется в образ начальной загрузки при его обновлении;
  • другой находится в каталоге /etc/mdadm/ и влияет на автосборку массивов внутри работающей системы.
Соответственно, вы можете иметь информацию:
1) в образе начальной загрузки (ОНЗ) и в /etc/mdadm/mdadm.conf;
2) только в ОНЗ (попадает туда при его создании обновлении);
3) только в /etc/mdadm/mdadm.conf;
4) нигде.
В том месте, где есть mdadm.conf, сборка происходит по правилам; где нет - непредсказуемо.

Примечание: если вы не обновили ОНЗ после создания RAID-массивов, их конфигурация всё равно в него попадёт - при обновлении образа другой программой / при обновлении системы (но вы не будете об этом знать со всеми вытекающими).


Дальнейшая работа с массивом


Пометка диска как сбойного

Диск в массиве можно условно сделать сбойным, ключ --fail (-f):
    %# mdadm /dev/md0 --fail /dev/hde1
    %# mdadm /dev/md0 -f     /dev/hde1


Удаление сбойного диска

Сбойный диск можно удалить с помощью ключа --remove (-r):
    %# mdadm /dev/md0 --remove /dev/hde1
    %# mdadm /dev/md0 -r       /dev/hde1


Добавление нового диска

Добавить новый диск в массив можно с помощью ключей --add (-a) и --re-add:
    %# mdadm /dev/md0 --add /dev/hde1
    %# mdadm /dev/md0 -a    /dev/hde1


Сборка существующего массива

Собрать существующий массив можно с помощью mdadm --assemble. Как дополнительный аргумент указывается, нужно ли выполнять сканирование устройств, и если нет, то какие устройства нужно собирать.
    %# mdadm --assemble /dev/md0 /dev/hde1 /dev/hdf2 /dev/hdg1
    %# mdadm --assemble --scan


Расширение массива

Расширить массив можно с помощью ключа --grow (-G). Сначала добавляется диск, а потом массив расширяется:
    %# mdadm /dev/md0 --add /dev/hdh2
Проверяем, что диск (раздел) добавился:
    %# mdadm --detail /dev/md0
    %# cat /proc/mdstat
Если раздел действительно добавился, мы можем расширить массив:
    %# mdadm -G /dev/md0 --raid-devices=4
При необходимости, можно регулировать скорость процесса расширения массива, указав нужное значение в файлах
    /proc/sys/dev/raid/speed_limit_min
    /proc/sys/dev/raid/speed_limit_max
Убедитесь, что массив расширился:
    %# cat /proc/mdstat
Нужно обновить конфигурационный файл с учётом сделанных изменений:
    %# mdadm --detail --scan >> /etc/mdadm/mdadm.conf
    %# vi /etc/mdadm/mdadm.conf


Возобновление отложенной синхронизации

Отложенная синхронизация:
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active(auto-read-only) raid1 sda1[0] sdb1[1]
      78148096 blocks [2/2] [UU]
        resync=PENDING

Возобновить:
echo idle > /sys/block/md0/md/sync_action
P.S.: Если вы увидели «active (auto-read-only)» в файле /proc/mdstat, то возможно вы просто ничего не записывали в этот массив. К примеру, после монтирования раздела и любых изменений в примонтированном каталоге, статус автоматически меняется:
md0 : active raid1 sdc[0] sdd[1]


Переименование массива

Для начала отмонтируйте и остановите массив:
    %# umount /dev/md0
    %# mdadm --stop /dev/md0
Затем необходимо пересобрать как md5 каждый из разделов sd[abcdefghijk]1
    %# mdadm --assemble /dev/md5 /dev/sd[abcdefghijk]1 --update=name
или так
    %# mdadm --assemble /dev/md5 /dev/sd[abcdefghijk]1 --update=super-minor


Удаление массива

Для начала отмонтируйте и остановите массив:
    %# umount /dev/md0
    %# mdadm -S /dev/md0
Затем необходимо затереть superblock каждого из составляющих массива:
    %# mdadm --zero-superblock /dev/hde1
    %# mdadm --zero-superblock /dev/hdf2
Если действие выше не помогло, то затираем так:
    %# dd if=/dev/zero of=/dev/hde1 bs=512 count=1
    %# dd if=/dev/zero of=/dev/hdf2 bs=512 count=1