asterisk_user_conf.sh

#!/bin/bash

# skrypt generujący zbiorczą konfigurację uzytkowników asteriska w poarciu o pliki w katalogach użytkowników

# * podstawowy numer telefonu przydzielony użytkownikowi odpowiada jego UID'owi pomniejszonemu o $MIN_UID
#   i poprzedzonemu prefixem UID_NUM_PREF
# * nie przydziela się kont SIP z numerami w oparciu o GID
#   ze względu na brak konta shellowego które przechowywałoby konfiguracje ...
# * numery oparte o GID (numery wspólne grup urzytkowników) można tworzyć jako aliasy,
#   numery te powinny mieć inny prefix niż numey tworzone w oparciu o UID oraz niż normalne aliasy

PATH="/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin"

USER_REGISTER='/var/user_config/sip-register.conf'
USER_SIP_CONF='/var/user_config/sip.conf'
USER_DIALPLAN='/var/user_config/extensions.conf'
USER_ACCOUNT='/var/user_config/auto-account.conf'
USER_ACCOUNT_VOICEMAIL='/var/user_config/auto-account-voicemail.conf'
MAIL_DOMAIN=`cat /etc/mailname`
MIN_UID=1000
UID_NUM_PREF="4"

make_section_for_user() {
# wybiera podstawie pliku $3 (lub STDIN gdy niepodano) sekcje określoną przez $2
# do nazwy sekcji dodaje identyfikator właściciela określony przez $1
# $2 jest wyrażeniem regularnym zgodnym z notacją stosowaną w awk
  grep -v '$[ \t]*[;#]' "$3" | awk -v UID=$1 -v SECTION=$2 '
    BEGIN {
      RS="(^|[\n])[\t ]*[[]"
      FS="[]][ \t]*[\n]"
    }
    
    $1 ~ SECTION {
      sectionsubname=gensub("KONTO-?", "", 1, $1)
      if (sectionsubname == "")
        printf("[%s]\n%s\n", UID, $2)
      else
        printf("[%s-%s]\n%s\n", UID, sectionsubname, $2)
      
      # w sekcjach dial-out musimy dodać powrót w przypadku invalid
      # wymagane przez GoSub()
      if ($1 == "dial" && sectionsubname == "out")
        printf(" exten => i,1,Return\n")
    }
  ' | sed -e "s#KONTO#$1#g"
}


# konfiguracja bazy danych
for f in /home/*/.asterisk.db.in; do
  if [ -e "$f" ]; then
    # uzyskujemy identyfikator użytkownika
    #SIP_UID=$(id -u $(basename `dirname /home/rrp/.asterisk.cfg`))
    SIP_UID=$UID_NUM_PREF$(( $(id -u `ls -ld $f | cut -f3 -d' '`) - $MIN_UID ))
    
    mv $f $f.tmp
    while read key data; do
      if [ $key !="" ]; then
        if [ "$data" = "" ]; then
          asterisk -rx "database deltree $SIP_UID $key"
        else
          asterisk -rx "database put $SIP_UID $key $data"
        fi
      fi
    done < "$f"
    rm $f.tmp
  fi
done

# plik powinien być postaci: każda linia jeden wpis
# pierwsze pole w linii klucz (bez identyfikatora użytkownika),
# drugie (odzielone białymi znakami) dodawane do bazy danych dane
# gdy drugie puste to kasujemy drzewo podane w key

# konfiguracja z plików tekstowych i zrzut bazy danych
:> $USER_REGISTER
:> $USER_SIP_CONF
:> $USER_DIALPLAN
echo "[sip-dial-in]" >> ${USER_DIALPLAN}-1
for f in /home/*/.asterisk.cfg; do
  # uzyskujemy identyfikator użytkownika
  SIP_UID=$UID_NUM_PREF$(( $(id -u `ls -ld $f | cut -f3 -d' '`) - $MIN_UID ))
  
  # wybieramy register
  register=`make_section_for_user "$SIP_UID" '^register$' "$f"`

  # zapisujemy zmodyfikowany register
  echo "$register" | egrep '^[ \t]*register[ \t]*=>' | while read reg; do
    ext=`echo $reg | awk 'BEGIN {FS="[>:@/]"} {printf("%s-%s", $4, $2)}' | tr -d ' '`
    org_ext=`echo $reg | cut -f2 -s -d'/'`
    reg=`echo $reg | cut -f1 -d'/'`
    echo "$reg/$ext" >> "$USER_REGISTER"
    if [ $org_ext ]; then
      echo " exten => $ext,1,Goto($SIP_UID-dial-in,$org_ext,1)" >> ${USER_DIALPLAN}-1
    else
      echo " exten => $ext,1,Goto($SIP_UID-dial-in,s,1)" >> ${USER_DIALPLAN}-1
    fi
  done;
  
  # wybieramy sekcję związane z konfiguracją provider'ów SIP
  make_section_for_user "$SIP_UID" '^sipprovider-.*' "$f" |
    sed -e 's#[ \t]*context[ =].*$# context = sip-dial-in#g' >> $USER_SIP_CONF
  
  # wybieramy sekcję związane z konfiguracją SIP
  make_section_for_user "$SIP_UID" '^KONTO.*' "$f" >> $USER_SIP_CONF
  
  # wybieramy sekcję związane z konfiguracją kontekstów planu numeracyjnego
  make_section_for_user "$SIP_UID" '^dial-.*' "$f" >> ${USER_DIALPLAN}-2
  
  asterisk -rx "database show $SIP_UID" > `dirname $f`/.asterisk.db.dump
done

echo "" >> ${USER_DIALPLAN}-1
cat ${USER_DIALPLAN}-1 ${USER_DIALPLAN}-2 > ${USER_DIALPLAN}
rm -f ${USER_DIALPLAN}-1 ${USER_DIALPLAN}-2

# pliki użytkowników zawierają konteksty
# * [register] z wpisami register => dotyczącymi użytkownika
#  (jezeli podano /ext przychodzaca rozmowa trafi do ext,1,... w [dial-in])
# * [sipprovider-$nazwa] z konfiguracją dzwonienia przez providera $nazwa
# * [dial-in], z konfiguracją połączeń przychodzących od providerów SIP
#  (rozmowy na adresy standardowe SIP - loginy, UIDy, aliasy, ...
#   kierowane są domyślnie do int,1 w [dial-in])
# * [KONTO] lub [KONTO-$subid], z konfiguracją dla swoich telefonów IP itp
#  (konteksy wyjsciowe dla rozmow nalezy podawac jako KONTO-dial-out lub KONTO-dial-$nazwa-out)
# * [dial-out] lub [dial-$nazwa-out], z konfiguracją połączeń wychodzących z telefonu
#  (nazwa kontekstu musi odpowiadać podanej w konfiguracji konta telefonu)
#  (dzwonienie należy realizować na adresy @KONTO-sipprovider-$nazwa)
# słowo kluczowe KONTO jest automatycznie zamieniane na nazwę konta

# generowanie pliku automatycznych kont w oparciu o /etc/passwd
:> $USER_ACCOUNT
:> $USER_ACCOUNT_VOICEMAIL
while IFS=":" read name tmp1 uid tmp2 rname home; do
  if [ $MIN_UID -lt $uid -a "$name" != "nobody" ]; then
    SIP_UID=$UID_NUM_PREF$(( $uid - $MIN_UID ))
    echo " exten => $name,1,GoTo($SIP_UID,1)" >> $USER_ACCOUNT
    echo " exten => $SIP_UID,1,GoTo($SIP_UID-dial-in,int,1)" >> $USER_ACCOUNT
    if [ -e $home/.asterisk.cfg ]; then
      password=`make_section_for_user "$SIP_UID" '^general' "$home/.asterisk.cfg" |
        awk 'BEGIN {FS="=>"} $1 == "password" {print $2}'`
    else
      password="$RANDOM"
    fi
    echo " $SIP_UID => $RANDOM,$rname,$name@$MAIL_DOMAIN,,delete=1" >> $USER_ACCOUNT_VOICEMAIL
  fi
done < /etc/passwd

chown asterisk:asterisk $USER_REGISTER $USER_SIP_CONF $USER_DIALPLAN $USER_ACCOUNT $USER_ACCOUNT_VOICEMAIL
chmod 660 $USER_REGISTER $USER_SIP_CONF $USER_DIALPLAN $USER_ACCOUNT $USER_ACCOUNT_VOICEMAIL

# przeładowanie konfiguracji
asterisk -rx "reload" > /dev/null

XHTML generated by highlight (http://www.andre-simon.de/) from asterisk_user_conf.sh



Copyright (c) 1999-2015, Robert Paciorek (http://www.opcode.eu.org/), BSD/MIT-type license


Redystrybucja wersji źródłowych i wynikowych, po lub bez dokonywania modyfikacji JEST DOZWOLONA, pod warunkiem zachowania niniejszej informacji o prawach autorskich. Autor NIE ponosi JAKIEJKOLWIEK odpowiedzialności za skutki użytkowania tego dokumentu/programu oraz za wykorzystanie zawartych tu informacji.

This text/program is free document/software. Redistribution and use in source and binary forms, with or without modification, ARE PERMITTED provided save this copyright notice. This document/program is distributed WITHOUT any warranty, use at YOUR own risk.

Valid XHTML 1.1 Dokument ten (URL: http://www.opcode.eu.org/usage_and_config/network_services/user_config/asterisk_user_conf.sh) należy do serwisu OpCode. Autorem tej strony jest Robert Paciorek, wszelkie uwagi proszę kierować na adres e-mail serwisu: webmaster@opcode.eu.org.
Data ostatniej modyfikacji artykulu: '2014-01-07 19:27:43 (UTC)' (data ta może być zafałszowana niemerytorycznymi modyfikacjami artykułu).