#!/bin/bash

########################################################################################
########################################################################################
## Spechy PBX Özel Santral ayarları yapılandırma dosyası
##
## Yapılandırılan Adımlar
## 1 - Kurulum için gerekli tanımlamaların yapılması
## 2 - Yapılandırma dosyasının çalışması için öncelikli kontroller
##      a - ID , DOMAIN Check
##      b - Asterisk Kurulu mu? Dosyaların kontrolü
## 3 - Domain kontrolü
##      a - Domain tanımlımı
##      b - Domain tanımlı ise SSL kurulumu
##      c - SSL kurulu değil ise SSL kurulumunun yapılması
##      d - SSL kontrolü
## 4 - Donanım Bilgilerinin Alınması
## 5 - Asterisk AMI ye erişim için yapılması gereken düzenlemeler
##      a - Asterisk de AMI'yi aktif et
##      b - AMI kullanıcısı olustur
## 6 - Asterisk Feature Kodlarında Spechy Özel kodların tanımlanması
## 7 - Asterisk Optimizasyon ayarlarının yapılması
## 8 - Ses kayıtları için MP3 donusturucusun olusturulması
## 9 - Ses kayıtları için FTP kullanıcısının olusturulması
## 10 - VOICEMAIL Duzenlemeleri
## 11 - FIREWALL kurallarının oluşturulması
## 12 - Network performans ayarlarının yapılması
## 13 - MariaDB/Mysql Optimizasyon ayarlarının kısmen tanımlanması
## 14 - FREEPBX Modullerinin guncellenmesi
## 15 - FREEPBX Ayarlarının import edilmesi
## 16 - FREEPBX Ayarlarının gerekli olanlarının DB ye işlenmesi
## 17 - FREEPBX Ayarlarının yetkilerinin guncellenmesi ( chown )
## 18 - FREEPBX Ayarlarının RELOAD edilmesi
## 19 - Otomatik LetsEncrypt SSL güncelleme için Cronjob satırını tanımla
## 20 - APACHE status sayfasının aktif edilmesi
## 21 - Zabbix uygulamasının yüklenmesi ve ayarlanması
## 22 - Rclone uygulamasının yüklenmesi ve ayarlanması - rclone.org
## 23 - FTP Yedekleme için gerekli ayarların yapılandırılması
## 24 - Reboot

# Uzak sunucudan gelen ID'yi kullanarak scripti çağırma
# wget -O setup.sh "https://dialer.spechy.live/setup/setup.sh

########################################################################################
## Tanımlamalar
##

# SPC Company ID
ID=$1
PBXNAME='Spechy'
DOMAINNAME=""     #etc: 'pbx.spechy.live'

# Veritabanı bağlantı bilgileri
DB_HOST="localhost"
DB_USER="root"
DB_PASS=""
DB_NAME="asterisk"

# Ses Kayitları yedeklemek icin FTP Sunucusu
FTP_HOST=""
FTP_USER="ftpuser"
FTP_PASS="ftppass"
FTP_NAME="remoteftp"
FTP_PATH="recordings"

########################################################################################
########################################################################################

# Ses kayıt dönüştürücü dosyasının shell betiğinin oluşturulacağı dizin
target_directory="/var/lib/asterisk/bin"
target_script="wav2mp3.sh"

# Renk Kodları
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # No Color, varsayılan rengi geri döndürür
EXTIPADDRESS=$(curl -s ifconfig.me)
wait

# Renkli metin örnekleri
echo -e "${GREEN}Spechy FREEPBX kurulum script'ine hoşgeldiniz.${NC}"
echo -e "${YELLOW}Bu Script bir çok ayarı ve özelliği otomatik olarak belirlenen standartlar doğrultusunda düzenleme yapmaktadır .${NC}"
echo -e "${RED}Standart olmayan, extension, queue , IVR, Port açma gibi işlemleri FREEPBX arayüzünden yapmanız gerekmektedir.${NC}"
echo -e "${RED}Sunucunun DIŞ IP ADRESİ ${EXTIPADDRESS} olarak tespit edilmiştir.${NC}"

########################################################################################
########################################################################################
########################################################################################

# Boş olup olmadığını kontrol et
if [ -z "$ID" ]; then
    echo -e "${RED}---------------> Company ID boş olamaz.${NC}"
    exit 1
fi

# Sadece integer olup olmadığını kontrol et
if ! [[ "$ID" =~ ^[0-9]+$ ]]; then
    echo -e "${RED}---------------> Company ID sadece rakamlardan oluşmalıdır.${NC}"
    exit 1
else
    echo -e "${GREEN}--------------->  Company ID geçerli: $ID ${NC}"
fi

# Hedef dizin yoksa script çalıştırma
if [ ! -d "$target_directory" ]; then
    echo -e "${RED}---------------> Hata: asterisk /var/lib/asterisk/bin dosya yolu bulunamadı. Bu sunucuda asterisk kurulu mu?${NC}"
    exit 1
fi

# Dosyanın varlığını kontrol et
if [ ! -f "/etc/asterisk/manager.conf" ]; then
    echo -e "${RED}---------------> Hata: asterisk manager.conf dosyası bulunamadı. Bu sunucuda asterisk kurulu mu?${NC}"
    exit 1
fi

# Sunucu tipini tespit etmemiz gerekiyor.
# /etc/os-release yoksa diğer yöntemlere geç
if command -v apt &>/dev/null; then
    echo -e "${GREEN}--------------->  Debian tabanlı bir sistem (APT bulundu)"
    server_type='debian'
elif command -v dnf &>/dev/null || command -v yum &>/dev/null; then
    echo -e "${GREEN}--------------->  RHEL tabanlı bir sistem (DNF veya YUM bulundu)"
    server_type='rhel'
fi

# Apache versiyonunu kontrol et ve ilgili dizini belirle
apache_installed=false
if command -v httpd > /dev/null; then
    apache_version="httpd"
    apache_dir="/etc/httpd"
    conf_directory="${apache_dir}/conf.d"
    apache_installed=true
elif command -v apache2 > /dev/null; then
    apache_version="apache2"
    apache_dir="/etc/apache2"
    conf_directory="${apache_dir}/sites-available"
    apache_installed=true
else
    echo -e "${RED}---------------> Apache sunucusu bulunamadı. Apache ile ilgili işlemler atlanacak.${NC}"
fi

# Dosyanın varlığını kontrol et
if [ ! -f "${apache_dir}/pki/webserver.pem" ]; then
    echo -e "${RED}---------------> ERROR: ${apache_dir}/pki/webserver.pem not exists. is your SSL certificate installed.${NC}"
    exit 1
fi

## SSL kontrolü ve kurulumu / Apache ile ilgili sorun çıktığı için iptal edildi. 

if [ -z "$DOMAINNAME" ]; then
    echo -e "${YELLOW}---------------> DOMAINNAME değişkeni tanımlı değil. SSL işlemleri atlanıyor."
else
    # fwconsole komutunu çalıştır ve çıktısını JSON olarak al
    output=$(fwconsole certificates --list --json)

    # DOMAINNAME ile eşleşen bir kayıt var mı kontrol et
    ##if echo "$output" | jq -e '.[] | select(.[2] == "'"$DOMAINNAME"'")' > /dev/null; then ##kullanmak için yum install jq
    if echo "$output" | grep -q "\"$DOMAINNAME\""; then
        echo -e "${YELLOW}---------------> DOMAINNAME ile eşleşen bir sertifika mevcut. İşlemler Atlanıyor"
    else
        echo -e "${YELLOW}---------------> DOMAINNAME ile eşleşen bir sertifika bulunamadı. SSL işlemlerine başlanıyor."
        # Default sertifikayı kaldır
        fwconsole certificates --delete=0
        wait
        fwconsole certificates --delete=0
        wait
        if [ $? -ne 0 ]; then
            echo -e "${RED}---------------> Varolan sertifikalar kaldırılamadı."
        else
            echo -e "${GREEN}---------------> Varolan sertifikalar başarıyla kaldırıldı."
        fi

        # Let's Encrypt sertifikasını kur
        fwconsole certificates --generate --type=le --hostname=$DOMAINNAME  --country-code=TR --state=ANKARA --email=pbx@spechy.com
        wait
        if [ $? -ne 0 ]; then
            echo -e "${RED}---------------> SSL işlemlerinde $DOMAINNAME için Let's Encrypt sertifikası kurulamadı."
        else
            echo -e "${GREEN}---------------> SSL işlemlerinde $DOMAINNAME için Let's Encrypt sertifikası başarıyla kuruldu."
            fwconsole certificate --default 0
            wait
            echo -e "${YELLOW}---------------> SSL işlemlerinde $DOMAINNAME için Let's Encrypt sertifikası DEFAULT olarak tanımlandı."
            fwconsole firewall lerules disable
            wait
            echo -e "${YELLOW}---------------> SSL işlemlerinde $DOMAINNAME için Let's Encrypt sertifikası FIREWALL ayarları düzenlendi."
            fwconsole certificates --import
            wait
            ## fwconsole certificates --updateall
            ## wait
        fi
    fi
fi

#######################################################################
## Donanım Bilgileri

# İşlemcinin çekirdek sayısının yarısını al ve yuvarla
total_cores=$(nproc) ## Core Sayısı
core_count=$((total_cores / 2))
total_memory=$(free -m | awk '/^Mem:/{print $2}') # Sunucudaki toplam bellek miktarını al
mysql_memory=$((total_memory * 75 / 100)) # Toplam belleğin %75'ini hesapla
total_memory_gb=$((total_memory / 1024)) # Belleği GB cinsine dönüştür

if [ $total_cores -eq 2 ]; then
    echo -e "${GREEN}---------------> Çekirdek sayısı 2 olduğu için default değerler atanacak.${NC}"
    asterisk_cores=2
    mysql_cores=1
    other_cores=1
else
    asterisk_cores=$(( ($total_cores - 2) / 3 ))
    mysql_cores=$(( ($total_cores - 2) / 3 ))
    other_cores=$(( ($total_cores - 2) - $asterisk_cores - $mysql_cores ))
fi

echo -e "${YELLOW}---------------> Optimizasyon için gerekli olan bilgiler ${NC}"
echo -e "${YELLOW}---------------> Toplam İşlemci Çekirdeği: ${total_cores} ${NC}"
echo -e "${YELLOW}---------------> Toplam Bellek: ${total_memory} ${NC}"
echo -e "${YELLOW}---------------> MYSQL için ayrılan bellek miktarı: ${mysql_memory} (${total_memory_gb}GB) ${NC}"
echo -e "${GREEN}---------------> Asterisk için hesaplanan çekirdek sayısı: $(seq -s ',' 0 $((asterisk_cores - 1))) ${NC}"
echo -e "${GREEN}---------------> MySQL için hesaplanan çekirdek sayısı: $(seq -s ',' $asterisk_cores $((asterisk_cores + mysql_cores - 1))) ${NC}"
echo -e "${GREEN}---------------> Diğer uygulama çekirdekleri: $(seq -s ',' $((asterisk_cores + mysql_cores)) $((total_cores - 1))) ${NC}"

#######################################################################
## AMI Duzenlemeleri

# Satırı değiştir
degistirilecek_satir="bindaddr = 127.0.0.1"
yeni_deger="bindaddr = 127.0.0.1,34.79.167.228,34.159.154.0"
sed -i "s/$degistirilecek_satir/$yeni_deger/g" "/etc/asterisk/manager.conf"
sed -i '/\[general\]/a webenabled = yes' "/etc/asterisk/manager.conf"

echo -e "${GREEN}---------------> Asterisk Manager Dosyasında gerekli düzenlemeler yapıldı.${NC}"

SECRET=$(openssl rand -hex 16) # Rastgele 32 karakterli bir secret oluşturma
#SQL="INSERT INTO manager (name, secret, deny, permit, read, write) VALUES ('spcAmiUsr', '$SECRET', '0.0.0.0/0.0.0.0', '127.0.0.1/255.255.255.0&34.79.167.228/255.255.255.0&34.159.154.0/255.255.255.0', 'system,call,log,verbose,command,agent,user,config', 'system,call,log,verbose,command,agent,user,config');"
#mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -e "$SQL"
#mysql -h "$DB_HOST" -u "$DB_USER" "$DB_NAME" -e "$SQL"

mysql -h localhost -u root -e "use asterisk; INSERT INTO manager (name, secret, deny, permit, \`read\`, \`write\`,writetimeout) VALUES ('spcAmiUsr$ID', '$SECRET', '0.0.0.0/0.0.0.0', '127.0.0.1/255.255.255.0&34.79.167.228/255.255.255.0&34.159.154.0/255.255.255.0', 'system,call,log,verbose,command,agent,user,config,dtmf,reporting,cdr,dialplan,originate', 'system,call,log,verbose,command,agent,user,config,dtmf,reporting,cdr,dialplan,originate',3000);"
wait
if [ $? -eq 0 ]; then
    echo -e "${GREEN}---------------> Asterisk AMI Kullanıcı Kayıdı başarıyla eklendi.${NC}"
else
    echo -e "${RED}---------------> Asterisk AMI Kullanıcı Kayıdı eklenirken bir hata oluştu.${NC}"
fi
wait
##### BUG AMI Yetkileri FULL verilmiyor.
#####

#######################################################################
## SPC ozel Feature Kodlarının eklenmesi

# Eklenecek içerik
ftr_content="
[ext-local-custom]
;transfer to IVR - card
exten => _*996XXX.,1,NoOp(Redirecting call to IVR)
exten => _*996XXX.,n,Goto(dynroute-1,s,1)

;listen
exten => _*997XXX.,1,Macro(user-callerid,)
exten => _*997XXX.,n,Answer
exten => _*997XXX.,n,NoCDR
exten => _*997XXX.,n,Wait(1)
exten => _*997XXX.,n,ChanSpy(PJSIP/\${EXTEN:4},q)
exten => _*997XXX.,n,Hangup

;whisper
exten => _*998XXX.,1,Macro(user-callerid,)
exten => _*998XXX.,n,Answer
exten => _*998XXX.,n,NoCDR
exten => _*998XXX.,n,Wait(1)
exten => _*998XXX.,n,ChanSpy(PJSIP/\${EXTEN:4},qw)
exten => _*998XXX.,n,Hangup

;barge
exten => _*999XXX.,1,Macro(user-callerid,)
exten => _*999XXX.,n,Answer
exten => _*999XXX.,n,NoCDR
exten => _*999XXX.,n,Wait(1)
exten => _*999XXX.,n,ChanSpy(PJSIP/\${EXTEN:4},qB)
exten => _*999XXX.,n,Hangup

[spy-listen]
exten => s,1,Answer()
exten => s,n,Noop(spylisten request)
exten => s,n,Verbose(3,--------------------------------------> SPYLISTEN \${MyExten})
exten => s,n,ChanSpy(PJSIP/\${MyExten}, qs)

[spy-whisper]
exten => s,1,Answer()
exten => s,n,Noop(spywhisper request)
exten => s,n,Verbose(3,--------------------------------------> SPYWHISPER \${MyExten})
exten => s,n,ChanSpy(PJSIP/\${MyExten}, qsw)

[spy-barge]
exten => s,1,Answer()
exten => s,n,Noop(spybarge request)
exten => s,n,Verbose(3,--------------------------------------> SPYBARGE \${MyExten})
exten => s,n,ChanSpy(PJSIP/\${MyExten}, qsB)
"

# Dosyanın varlığını kontrol et ve içerik varsa sonuna ekle
if [ -f "/etc/asterisk/extension_customs.conf" ]; then
    echo -e "$ftr_content" >> /etc/asterisk/extension_customs.conf
else
    # Dosya yoksa oluştur ve içeriği ekle
    echo -e "$ftr_content" > /etc/asterisk/extension_customs.conf
fi
wait
echo -e "${GREEN}---------------> Asterisk Feature Kodları başarıyla eklendi.${NC}"

#######################################################################
## Asterisk Performans Duzenlemeleri

conf_file="/etc/asterisk/stasis.conf"
content="[threadpool]\ninitial_size = 10\nidle_timeout_sec = 60\nmax_size = 100"

# Dosya var mı kontrol et
if [ -f "$conf_file" ]; then
    # Dosya varsa içeriğini kontrol et
    if ! grep -qF "[threadpool]" "$conf_file"; then
        # İstenen kısımlar eksikse ekle
        echo -e "$content" | sudo tee -a "$conf_file" > /dev/null
        echo -e "${GREEN}---------------> Asterisk Optimizasyon için stasis.conf dosyasına gerekli içerik eklendi.${NC}"
    else
        echo -e "${YELLOW}---------------> Asterisk Optimizasyon için stasis.conf zaten mevcut ve gerekli içeriğe sahip.${NC}"
    fi
else
    # Dosya yoksa oluştur ve içeriği ekle
    echo -e "$content" | sudo tee "$conf_file" > /dev/null
    echo -e "${GREEN}---------------> Asterisk Optimizasyon için stasis.conf oluşturuldu ve gerekli içerik eklendi.${NC}"
fi


if [ $total_cores -eq 2 ]; then
    # Asterisk yapılandırma dosyasına maxload parametresini ekle veya değiştir
    if grep -q "^\[options\]" /etc/asterisk/asterisk.conf; then
        # [options] bölümü varsa, maxload parametresini ekle veya değiştir
        if grep -q "^maxload" /etc/asterisk/asterisk.conf; then
            # maxload parametresi zaten varsa, değerini değiştir
            sed -i "s/^maxload *=.*/maxload = \"$asterisk_cores\"/" /etc/asterisk/asterisk.conf
        else
            # maxload parametresi yoksa, [options] bölümüne ekle
            sed -i "/^\[options\]/a maxload = \"$asterisk_cores\"" /etc/asterisk/asterisk.conf
        fi
    else
        # [options] bölümü yoksa, dosyanın sonuna ekle
        echo -e "[options]\nmaxload = \"$asterisk_cores\"" >> /etc/asterisk/asterisk.conf
    fi
    echo -e "${GREEN}---------------> Asterisk Optimizasyon için asterisk.conf dosyasına maxload > \"$asterisk_cores\" olarak eklendi/düzenlendi.${NC}"
else
    echo -e "${YELLOW}---------------> CPU Core sayısı düşük olduğundan Asterisk Optimizasyon için asterisk.conf dosyasında bir düzenleme yapılmadı.${NC}"    
fi

# Eklenecek veya değiştirilecek parametreler
new_config="[system]\ntimer_t1=250\ntimer_b=6400\nthreadpool_initial_size=20\nthreadpool_auto_increment=5\nthreadpool_idle_timeout=60\nthreadpool_max_size=100"

# Dosyanın varlığını kontrol et
if [ -f "/etc/asterisk/pjsip_custom.conf" ]; then
    # Dosya varsa, [system] bölümüne eklenen parametreleri kontrol et veya değiştir
    if grep -q "\[system\]" /etc/asterisk/pjsip_custom.conf; then
        # [system] bölümü varsa parametreleri değiştir
        sed -i "s/\[system\].*/$new_config/" /etc/asterisk/pjsip_custom.conf
    else
        # [system] bölümü yoksa dosyanın sonuna ekle
        echo -e "$new_config" >> /etc/asterisk/pjsip_custom.conf
    fi
else
    # Dosya yoksa oluştur ve içeriği ekle
    echo -e "$new_config" > /etc/asterisk/pjsip_custom.conf
fi

echo -e "${GREEN}---------------> Asterisk Optimizasyon için pjsip_custom.conf dosyasına gerekli içerik eklendi/düzenlendi.${NC}"

#######################################################################
## MP3 Donusturucu Duzenlemeleri

# İçerik
script_content=$(cat <<EOL
#!/bin/bash
# ---
# Dizin: /var/lib/asterisk/bin/wav2mp3.sh:
# chown asterisk:asterisk /var/lib/asterisk/bin/wav2mp3.sh
# chmod +x /var/lib/asterisk/bin/wav2mp3.sh
# ---
# FreePBX POST Recording script: /var/lib/asterisk/bin/wav2mp3.sh ^{CALLFILENAME} ^{UNIQUEID}
# /var/lib/asterisk/bin/wav2mp3.sh ^{CALLFILENAME} ^{UNIQUEID} ^{CALLERID(number)} ^{CALLERID(dnid)} ^{AMPUSER} ^{CALLERID(number)} ^{CDR(dst)} ^{CDR(start)} ^{CDR(src)}
# ---

# Ayarlar
keepwav=false
sendftp=false
sendssh=false
sendapi=true
delete_file_after_transfer=false

# Backup sunucusuna SSH ile baglanmamız gerekiyorsa erisim bilgilerini tanimlayiniz.
# sshpass in sunucu da yüklü oldugundan emin olunuz. ( sudo apt install sshpass )
SSH_HOST="1.2.3.4"
SSH_USERNAME="user"
SSH_PASSWORD="pass"
export SSHPASS="\$SSH_PASSWORD"

# Spechy API servislerine ait bilgiler
spcapi_user="spc_phone_server"
spcapi_pass="BuxjmIPJHq/0SmYkUaXX58P7V1yHI+J/mRAaeiAa2m8M4QvSSy3MoTPkH1WgXJQD"
spcapi_url="https://app.spechy.com/gw/api/integrations/phone-server/set-recording-name"
spcapi_companyid="99999999"

# Backup sunucusuna FTP ile baglanmamız gerekiyorsa erisim bilgilerini tanimlayiniz.
ftp_user="ftp_username"
ftp_pass="ftp_password"
ftp_server="ftp_server_address"

# dosyaların yuklenecegi uzak sunucudaki dosya yolu ( sonuna / koymayınız )
REMOTE_DIR="/recordings/\$dy/\$dm/\$dd"

# Başlamadan önce 7 sn bekliyoruz.
sleep 7

# Klasorlerdeki Tarih yolunu olusturmak icin tarih bilgilerini çekiyoruz.
dy=\$(date '+%Y')
dm=\$(date '+%m')
dd=\$(date '+%d')

# Dosyaların okunacağı ve kayıt edileceği yolları tanımlıyoruz
dtpath="/var/spool/asterisk/monitor/\$dy/\$dm/\$dd"     # işlem yapılacak dosyanın yolu
wavpath="/var/spool/asterisk/monitor/\$dy/\$dm/\$dd"    # wav dosyalarının saklanacagı klasor yolu
mp3path="/var/spool/asterisk/monitor/\$dy/\$dm/\$dd"    # mp3 dosyalarının kayıt edilecegi klasor yolu
aripath=/\$dy/\$dm/\$dd                 # ari den sorgulamak için gerekli

# Dosya boş ise direk siliyoruz.
if [ \$(wc -c < "\$dtpath/\$1.wav" | cut -d ' ' -f1) -eq 44 ]; then
    rm -f "\$dtpath/\$1.wav"
    exit 0
fi

# LAME ile MP3 e ceviriyoruz
nice lame -b 32 -m m "\$dtpath/\$1.wav" "\$mp3path/\$1.mp3"

# Cevirme islemi bittiginde veritabanını guncelliyoruz
if [ \$? -eq 0 ]; then
    mysql -u root -s -D asteriskcdrdb -e "UPDATE cdr SET recordingfile = '\$1.mp3' WHERE uniqueid = '\$2'"

    # Dosya saklanmasi isteniyorsa, saklanacak yere tasiyoruz.
    if [ "\$keepwav" = true ]; then
        echo "Wav dosyasını saklıyoruz."
        mkdir -p "\$wavpath"
        mv "\$dtpath/\$1.wav" "\$wavpath/\$1.wav"
    else
        # kalan wav dosyasını siliyoruz
        rm -f "\$dtpath/\$1.wav"
    fi

    # yeni olusturdugumuz MP3 dosyasını tasiyoruz
    mkdir -p "\$mp3path"
    mv "\$dtpath/\$1.mp3" "\$mp3path/\$1.mp3"

    # MP3 dosyasını SSH ile uzak sunucuya transfer ediyoruz
    LOCAL_FILE="\$mp3path/\$1.mp3"
    API_FILE="\$aripath/\$1.mp3"
    REMOTE_FILE="\$1.mp3"

    if [ "\$sendssh" = true ]; then
        sshpass -e ssh -t -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null "\${SSH_USERNAME}@\${SSH_HOST}" "mkdir -p \${REMOTE_DIR}"

        # Dosyayı uzak sunucuya kopyala
        sshpass -e scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "\${LOCAL_FILE}" "\${SSH_USERNAME}@\${SSH_HOST}:\${REMOTE_DIR}/\${REMOTE_FILE}"

        # SCP çıkış kodunu kontrol et
        EXIT_CODE=\$?
        if [[ \${EXIT_CODE} -eq 0 ]]; then
            echo "SCP bağlantısı başarılı!"
        else
            echo "SCP bağlantısı başarısız. Hata kodu: \${EXIT_CODE}"
        fi
    fi

    if [ "\$sendapi" = true ]; then
        spcapi_data="{\"company_id\": \"\$spcapi_companyid\", \"unique_id\": \"\$2\", \"recording_name\": \"\$API_FILE\"}"
        RESULT=\$(curl -s -u "\$spcapi_user:\$spcapi_pass" -H "Content-Type: application/json" -d "\$spcapi_data" "\$spcapi_url")
    fi

    # MP3 dosyasını FTP ile uzak sunucuya transfer ediyoruz
    if [ "\$sendftp" = true ]; then
        ftp -inv \$ftp_server <<EOF
user \$ftp_user \$ftp_pass
cd "\$REMOTE_DIR"
put "\$mp3path/\$1.mp3"
bye
EOF
        # transfer success
        if [ \$? -eq 0 ]; then
            echo "MP3 file transferred via FTP successfully."
        else
            echo "FTP transfer failed. MP3 file will be kept on local server."
        fi
    fi

    # MP3 dosyasını da sunucudan siliyoruz.
    if [ "\$delete_file_after_transfer" = true ]; then
        rm -f "\$mp3path/\$1.mp3"
    fi
else
    exit 1
fi
EOL
)

# Shell betiğini oluştur
echo "$script_content" > "$target_directory/$target_script"
wait
chmod +x "$target_directory/$target_script"
wait
# Uzak sunucudan gelen ID'yi spcapi_companyid değişkenine atama
sed -i "s/spcapi_companyid=\"99999999\"/spcapi_companyid=\"$ID\"/" /var/lib/asterisk/bin/wav2mp3.sh
wait
# Ses kayıtları klasörüne HTTP üzerinden erişim sağlamak için symlink oluştur
ln -s /var/spool/asterisk/monitor /var/www/html/recording >/dev/null 2>&1
ln -s /var/spool/asterisk/voicemail/default /var/www/html/recording_vm >/dev/null 2>&1

wait
echo -e "${GREEN}---------------> Asterisk Ses Kayıtları için Mp3 formatına dönüştüren ve yolları düzenleyen gerekli düzenlemeler yapıldı.${NC}"

#######################################################################
## FTP Duzenlemeleri

# vsftpd yüklü değilse yükle
if ! command -v vsftpd &> /dev/null; then
    if [ "$server_type" = 'debian' ]; then
        sudo apt-get install vsftpd -y
        wait
    else
        sudo yum install vsftpd -y
        wait
    fi
fi

# vsftpd servisini başlat
sudo systemctl start vsftpd
wait

# vsftpd servisini otomatik olarak başlangıçta başlat
sudo systemctl enable vsftpd
wait

# vsftpd ayarlarını güncelle
sudo bash -c 'cat <<EOF > /etc/vsftpd/vsftpd.conf
# VSFTPD Konfigürasyonu
anonymous_enable=NO
local_enable=YES
write_enable=NO
local_umask=022
dirmessage_enable=YES
idle_session_timeout=600
data_connection_timeout=120
ftpd_banner=Welcome to the Spechy FTP service.
chroot_local_user=YES
allow_writeable_chroot=YES
listen=YES
listen_ipv6=NO
pasv_min_port=10000
pasv_max_port=10010
pasv_address='${EXTIPADDRESS}'

xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
log_ftp_protocol=YES
pam_service_name=vsftpd

# SSL/TLS Ayarlar
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
ssl_ciphers=HIGH
rsa_cert_file=/etc/httpd/pki/webserver.crt
rsa_private_key_file=/etc/httpd/pki/webserver.key

EOF'
wait

# Kullanıcı ekleyip gerekli ayarları yap
sudo useradd calls
wait
echo "calls:callsftp2024" | sudo chpasswd
wait
sudo cp /etc/httpd/pki/webserver.pem /etc/vsftpd/vsftpd.pem
wait
sudo ln -s /var/spool/asterisk/monitor /home/calls/astmon >/dev/null 2>&1
wait
sudo mkdir -p /home/calls/monitor
wait
sudo mount --bind /var/spool/asterisk/monitor /home/calls/monitor
wait

# fstab dosyasında satırın olup olmadığını kontrol et
if ! grep -q "^/var/spool/asterisk/monitor /home/calls/monitor none bind 0 0" /etc/fstab; then
    echo "/var/spool/asterisk/monitor /home/calls/monitor none bind 0 0" | sudo tee -a /etc/fstab > /dev/null
    wait
    echo -e "${GREEN}---------------> Ses kayıtları erişim için fstab güncellendi.${NC}"
fi

echo -e "${GREEN}---------------> Ses kayıtları dosyasına FTP üzerinden ulaşılabilmesi için Kullanıcı ve izinleri ayarlandı${NC}"
echo -e "${YELLOW}---------------> Dışarıdan erişim için FTP üzerinde varsa doğrudan Sabit IP adresine, yoksa 990,21,20,10000:10010 TCP portlarına izin verilmesi gerekiyor${NC}"

#######################################################################
## VOICEMAIL Duzenlemeleri

target_directory="/var/spool/asterisk/voicemail/default/" # Hedef klasör
htaccess_file="${target_directory}.htaccess" # .htaccess dosyasının yolu

# Hedef klasör yoksa oluştur
if [ ! -d "$target_directory" ]; then
    echo -e "${GREEN}---------------> Voicemail için hedef klasör mevcut değil, oluşturuluyor: $target_directory ${NC}"
    sudo mkdir -p "$target_directory"
    wait
    echo "Options +Indexes" > "$htaccess_file" # .htaccess dosyasını oluştur ve içine "Options +Indexes" ekle
    wait
    # Dosyanın oluşturulup oluşturulmadığını kontrol et
    if [ -f "$htaccess_file" ]; then
        echo -e "${GREEN}---------------> Voicemail dosyalarına erişim için htaccess dosyası başarıyla oluşturuldu ve 'Options +Indexes' eklendi.${NC}"

        # Ses kayıtları klasörüne HTTP üzerinden erişim sağlamak için symlink oluştur
        ln -s /var/spool/asterisk/voicemail/default /var/www/html/recording_vm >/dev/null 2>&1
        echo -e "${GREEN}---------------> Voicemail altında bulunan ses kayıtlarına erişim için symlink oluşturuldu.${NC}"
    else
        echo -e "${RED}---------------> Voicemail htaccess dosyası oluşturulamadı.${NC}"
    fi
else
    echo -e "${RED}---------------> Voicemail için hedef klasör oluşturulamadı${NC}"
fi

#######################################################################
## VOICEMAIL Duzenlemeleri - 1 haftadan eski kayıtları siliyoruz

VCRONJOB="30 0 * * * /usr/bin/find /var/spool/asterisk/voicemail -type f -name msg* -mtime +7 -delete"

# Cronjob dosyasını kontrol et ve varsa ekle
(crontab -l 2>/dev/null | grep -v -F "$VCRONJOB" ; echo "$VCRONJOB") | crontab -

#######################################################################
## Firewall Duzenlemeleri

fwconsole firewall trust 46.196.196.230 "Spechy Sidar"
fwconsole firewall trust 35.195.233.37  "Spechy VPN1"
fwconsole firewall trust 35.187.84.87   "Spechy VPN2"
fwconsole firewall trust 34.79.167.228  "Spechy ConfigProd"
fwconsole firewall trust 35.187.3.243   "Spechy RecordingListener"
fwconsole firewall trust 34.159.154.0   "Spechy Zabbix"
fwconsole firewall trust 104.199.103.212   "Spechy Text2Speech"
fwconsole firewall trust 35.189.251.132   "Spechy Voicemail"

echo -e "${GREEN}---------------> Sisteme erişim için gerekli IP adresleri firewall eklendi${NC}"

#######################################################################
## Network Duzenlemeleri

# sysctl.conf dosyasına gerekli satırları ekle / IPv6 yı disable et
echo "net.ipv6.conf.all.disable_ipv6 = 1" | sudo tee -a /etc/sysctl.conf >/dev/null
echo "net.ipv6.conf.default.disable_ipv6 = 1" | sudo tee -a /etc/sysctl.conf >/dev/null

# Yapılandırmayı yeniden yükle
sudo sysctl -p >/dev/null

# İşlem hata kodunu kontrol et
if [ $? -ne 0 ]; then
    echo -e "${RED}---------------> Network optimizasyonu için sysctl.conf dosyası düzenlenemedi veya yapılandırma yeniden yüklenemedi.${NC}" >&2
    #exit 1
else 
    echo -e "${GREEN}---------------> Network optimizasyonu için IPv6 pasif hale getirilmesi için sysctl.conf dosyası başarıyla güncellendi ve yapılandırma yeniden yüklendi.${NC}"
fi

############################################################################
## Mysql/MariaDB optimizasyonu

# MYSQL için düzenlenecek değerler
max_connections=$((core_count * 10))
innodb_buffer_pool_size=$((total_memory_gb * 70 / 100))
innodb_buffer_pool_instance=$((innodb_buffer_pool_size / 8))
thread_cache_size=$((max_connections * 5 / 100))
thread_concurrency=$((core_count * 2))
query_cache_size=$((total_memory_gb * 10 / 100))

join_buffer_size=$((total_memory / 100)) # %1 of total memory
read_buffer_size=$((total_memory / 200)) # %0.5 of total memory
read_rnd_buffer_size=$((total_memory / 200)) # %0.5 of total memory

table_cache=$((total_memory / 10)) # Sunucu belleğinin yüzde 10'u
table_definition_cache=$((total_memory / 20)) # Sunucu belleğinin yüzde 5'i
table_open_cache=500

# my.cnf dosyasına ek parametrelerin ekleneceği kısmı ayarla
config_block="[mariadb]
character-set-server  = utf8mb4
collation-server      = utf8mb4_general_ci
performance_schema = ON
innodb_stats_on_metadata = OFF
innodb_file_per_table=ON
log-queries-not-using-indexes
skip-name-resolve = 1
skip-external-locking 

expire_logs_days    = 10
max_binlog_size   = 100M
back_log = 100

slow-query-log = 0
slow-query-log-file = /var/log/mariadb/mysql-slow.log
long_query_time = 7

connect_timeout = 90
interactive_timeout = 90
wait_timeout = 90

table_open_cache = 500"

# my.cnf dosyasının sonuna ek parametreleri yaz
echo "$config_block" >> /etc/my.cnf

# İhtiyacımız olan diğer değerleri de ekleyelim
sed -i "s/^max_connections.*$/max_connections = $max_connections/" /etc/my.cnf
sed -i "s/^innodb_buffer_pool_size.*$/innodb_buffer_pool_size = ${innodb_buffer_pool_size}M/" /etc/my.cnf
sed -i "s/^innodb_buffer_pool_instances.*$/innodb_buffer_pool_instances = $innodb_buffer_pool_instance/" /etc/my.cnf
sed -i "s/^thread_cache_size.*$/thread_cache_size = $thread_cache_size/" /etc/my.cnf
sed -i "s/^thread_concurrency.*$/thread_concurrency = $thread_concurrency/" /etc/my.cnf
sed -i "s/^query_cache_size.*$/query_cache_size = ${query_cache_size}M/" /etc/my.cnf
sed -i "s/^join_buffer_size.*$/join_buffer_size = ${join_buffer_size}M/" /etc/my.cnf
sed -i "s/^read_buffer_size.*$/read_buffer_size = ${read_buffer_size}M/" /etc/my.cnf
sed -i "s/^read_rnd_buffer_size.*$/read_rnd_buffer_size = ${read_rnd_buffer_size}M/" /etc/my.cnf
sed -i "s/^table_cache.*$/table_cache = ${table_cache}M/" /etc/my.cnf
sed -i "s/^table_definition_cache.*$/table_definition_cache = ${table_definition_cache}M/" /etc/my.cnf

echo -e "${GREEN}---------------> MYSQL/MARIADB Optimizasyon için my.cnf dosyasına gerekli içerik eklendi/düzenlendi.${NC}"

# FREEPBX Modulleri güncellenmesi
fwconsole moduleadmin upgradeall
wait
echo -e "${GREEN}---------------> FREEPBX modulleri güncellendi.${NC}"
fwconsole moduleadmin disable sangomartapi
wait
echo -e "${GREEN}---------------> FREEPBX gereksiz moduller pasif edildi.${NC}"

#######################################################################
## FREEPBX Ayarlarının import edilmesi

# JSON verisini içeren değişken
json_data='{"AS_DISPLAY_FRIENDLY_NAME":1,"AS_DISPLAY_READONLY_SETTINGS":1,"AS_OVERRIDE_READONLY":1,"HTTPENABLESTATIC":0,"HTTPENABLED":1,"HTTPTLSENABLE":1,"HTTPWEBSOCKETMODE":"pjsip","HTTPBINDADDRESS":"::","HTTPBINDPORT":8088,"HTTPPREFIX":"","HTTPTLSBINDADDRESS":"::","HTTPTLSBINDPORT":8089,"TLSDISABLEV1":1,"TLSDISABLEV11":0,"TLSDISABLEV12":0,"HTTPTLSCERTFILE":"\/etc\/asterisk\/keys\/integration\/certificate.pem","HTTPTLSPRIVATEKEY":"\/etc\/asterisk\/keys\/integration\/webserver.key","HTTPSESSIONINACTIVITY":30000,"HTTPSESSIONKEEPALIVE":15000,"HTTPSESSIONLIMIT":10000,"ASTMANAGERHOST":"localhost","AMPMGRPASS":"QcFu9jKc+TJW","ASTMANAGERPORT":5038,"ASTMANAGERPROXYPORT":"","AMPMGRUSER":"admin","ASTMGRWRITETIMEOUT":5000,"ENABLE_ARI":1,"FPBX_ARI_USER":"u9R6FqawGsYt","ARI_ALLOWED_ORIGINS":"localhost:8088","FPBX_ARI_PASSWORD":"be52ded029063e2e032ed5a427c0be4f","ENABLE_ARI_PP":0,"ARI_WS_WRITE_TIMEOUT":100,"CA_CALL_DECK_PRIORITY":"Trunks","DAYNIGHTTCHOOK":0,"CALLREC_BEEP_PERIOD":"","CALL_REC_OPTION":1,"CDR_BATCH_ENABLE":1,"CDR_BATCH":0,"CDR_BATCH_SIZE":200,"CDR_BATCH_TIME":300,"CDR_BATCH_SCHEDULE_ONLY":0,"CDR_BATCH_SAFE_SHUT_DOWN":1,"CEL_ENABLED":0,"CELDBNAME":"","CELDBTABLENAME":"","CERT_DAYS_VAL":"730","FORCEALLOWCONFRECORDING":0,"ENABLE_FAVORITE_CONTACTS":0,"CONTACTMANLOOKUPLENGTH":7,"JOBSRANDOMSLEEP":0,"FWJOBS_LOGS":0,"DAHDISHOWDIGITALCHANS":0,"DAHDIEXEC":"\/etc\/init.d\/dahdi","DAHDIMODULESLOC":"\/etc\/dahdi\/modules","DAHDIDISABLEWRITE":1,"DAHDIMODPROBELOC":"\/etc\/modprobe.d\/dahdi.conf","DAHDIECHOCAN":"oslec","DAHDISYSTEMLOC":"\/etc\/dahdi\/system.conf","DAHDIMOCKHW":0,"SYS_STATS_DISABLE":0,"VIEW_FW_STATUS":1,"SYS_STATS_MAXAGE":50,"FORCE_JS_CSS_IMG_DOWNLOAD":0,"AMPLOCALBIN":"","FPBXDBUGFILE":"\/var\/log\/asterisk\/freepbx_dbug","DEVEL":0,"FPBXDBUGDISABLE":1,"DISABLE_CSS_AUTOGEN":0,"MODULEADMIN_SKIP_CACHE":0,"DISPLAY_MONITOR_TRUNK_FAILURES_FIELD":0,"JQMIGRATE":1,"FPBXPERFLOGGING":0,"DEVELRELOAD":0,"MIXMON_POST":"\/var\/lib\/asterisk\/bin\/wav2mp3.sh ^{CALLFILENAME} ^{UNIQUEID}","POST_RELOAD_DEBUG":0,"POST_RELOAD":"","PRE_RELOAD":"","DIE_FREEPBX_VERBOSE":0,"USE_PACKAGED_JS":1,"DEVICE_STRONG_SECRETS":1,"DEVICE_REMOVE_MAILBOX":0,"DEVICE_SIP_CANREINVITE":"no","DEVICE_SIP_DTMF":"rfc2833","DEVICE_SIP_TRUSTRPID":"yes","DEVICE_SIP_SENDRPID":"pai","DEVICE_SIP_NAT":"yes","DEVICE_SIP_ENCRYPTION":"no","DEVICE_SIP_QUALIFYFREQ":60,"DEVICE_QUALIFY":"yes","DEVICE_ALLOW":"","DEVICE_DISALLOW":"","DEVICE_CALLGROUP":"","DEVICE_PICKUPGROUP":"","DIAL_OPTIONS":"HhTtr","TRUNK_OPTIONS":"T","ATTTRANSALERTINFO":"inherit","BLINDTRANSALERTINFO":"inherit","BLOCK_OUTBOUND_TRUNK_CNAM":0,"CFRINGTIMERDEFAULT":"0","REC_POLICY":"caller","CLEARGLOBALVARS":0,"ASTCONFAPP":"app_confbridge","ZAP2DAHDICOMPAT":1,"TONEZONE":"us","ENABLECW":1,"DISABLECUSTOMCONTEXTS":0,"INBOUND_NOTRANS":1,"OUTBOUND_CID_UPDATE":1,"OUTBOUND_DIAL_UPDATE":1,"CONNECTEDLINE_PRESENCESTATE":1,"DITECH_VQA_INBOUND":"7","DITECH_VQA_OUTBOUND":"7","DYNAMICHINTS":0,"RFC7462":1,"CONCURRENCYLIMITDEFAULT":"3","FCBEEPONLY":0,"FORCE_INTERNAL_AUTO_ANSWER_ALL":0,"DIVERSIONHEADER":0,"INTERNALALERTINFO":"inherit","DEFAULT_INTERNAL_AUTO_ANSWER":"disabled","LAUNCH_AGI_AS_FASTAGI":1,"NOOPTRACE":"0","CWINUSEBUSY":1,"CID_PREPEND_REPLACE":1,"ASTSTOPPOLLINT":"2","RINGTIMER":"15","ASTSIPDRIVER":"chan_pjsip","TIMEFORMAT":"24 Hour Format","TRUNK_RING_TIMER":300,"AMPBADNUMBER":1,"DIALPARTIESDIALPLAN":0,"USEGOOGLEDNSFORENUM":0,"ASTSTOPTIMEOUT":"120","ASTAGIDIR":"\/var\/lib\/asterisk\/agi-bin","ASTVARLIBDIR":"\/var\/lib\/asterisk","ASTETCDIR":"\/etc\/asterisk","ASTLOGDIR":"\/var\/log\/asterisk","ASTMODDIR":"\/usr\/lib64\/asterisk\/modules","ASTRUNDIR":"\/var\/run\/asterisk","ASTSPOOLDIR":"\/var\/spool\/asterisk","AMPPLAYBACK":"\/var\/lib\/asterisk\/playback","CERTKEYLOC":"\/etc\/asterisk\/keys","AMPCGIBIN":"\/var\/www\/cgi-bin","AMPBIN":"\/var\/lib\/asterisk\/bin","AMPSBIN":"\/usr\/sbin","AMPWEBROOT":"\/var\/www\/html","MOHDIR":"moh","MIXMON_DIR":"","FOPWEBROOT":"cxpanel","FOLLOWME_AUTO_CREATE":0,"FOLLOWME_DISABLED":1,"FOLLOWME_TIME":"20","FOLLOWME_PRERING":"7","FOLLOWME_RG_STRATEGY":"ringallv2-prim","BADDESTABORT":0,"XTNCONFLICTABORT":0,"CHECKREFERER":1,"ENABLEOLDDIALPATTERNS":0,"SERVERINTITLE":0,"CUSTOMASERROR":1,"RELOADCONFIRM":1,"MODULEADMINEDGE":0,"SHOWLANGUAGE":1,"SIPSECRETSIZE":32,"USE_FREEPBX_MENU_CONF":0,"MODULEADMINWGET":0,"CACHE_CLEANUP_DAYS":30,"SESSION_TIMEOUT":2592000,"BLACKLIST_DISABLE_GRID_COUNT":0,"ALLOW_MODULE_HOOK_IN":0,"PAGINGMAXPARTICIPANTS":40,"PAGING_D_P_AlertInfo":"ring-answer","DPMAapps_LOG":0,"ENABLE_RESTAPPS_TOKEN_SEC":0,"PM2DISABLELOG":0,"PM2PROXY":"http:\/\/mirror.freepbx.org:6767\/","PM2SHELL":"\/bin\/bash","PM2USECACHE":1,"PM2USEPROXY":0,"PROXY_ENABLED":0,"PROXY_ADDRESS":"","PROXY_USERNAME":"","PROXY_PASSWORD":"","VQPLUSRETENTION":"20","QSTATSDATARETENTION":30,"QSTATSSYNCCUTOFF":"1 week","QUEUES_PESISTENTMEMBERS":1,"QUEUES_SHARED_LASTCALL":1,"QUEUES_UPDATECDR":0,"QUEUES_MIX_MONITOR":1,"QUEUES_EVENTS_WHEN_CALLED_DEFAULT":0,"QUEUES_EVENTS_MEMEBER_STATUS_DEFAULT":0,"QXACTDATARETENTION":90,"QLOGDATARETENTION":0,"QXACTREMOTEDBTABLENAME":"","CDRDBHOST":"","CDRDBNAME":"","CDRDBPASS":"","CDRDBPORT":"","CDRDBTABLENAME":"","CDRDBTYPE":"","CDRDBUSER":"","CDRUSEGMT":0,"EXTENSION_LIST_RINGGROUPS":0,"CRM_CACHE_EXPIRE":300,"CRM_CUSTOM_URL":"","CRM_LOG":1,"SANGOMA_RTAPI_LOG_LEVELS":"ERROR","RTAPI_HEAP_MEMORY":1024,"SANGOMA_RTAPI_ENABLE_LOGS":0,"SANGOMA_RTAPI_DISABLE_SSL_VERIFY":1,"RTAPI_JAVA_CMD_PARAMS":"","SANGOMA_RTAPI_PROXY":"","SANGOMA_RTAPI_HOST":"localhost","SANGOMA_RTAPI_PORT":"8088","SANGOMA_RTAPI_SECURE_PORT":"8089","SCHMOOZELINK":"www.schmoozecom.com","MODCHECK_INTERVAL":"60","MODCHECK_TURN":2,"SHOWNEWUPDATES":0,"FCBEEP":1,"RINGGROUP_INDEX":0,"RETRIEVALTIMEOUT":15,"RINGTIMERDEFAULT":15,"IVR_INDEX":0,"EXTENSION_INDEX":0,"CONFERENCE_INDEX":0,"HINTS_PJSIP":0,"SIPDOMAIN":"","SIPMULTIDOMAIN":0,"SIPDIRECTMEDIA":1,"SIPUSERAGENT":"FPBX-15.0.17.24(16.15.1)","IOTENABLED":0,"IOTEXPOSEWEB":0,"IOTDOMAIN":"","IOTBINDPORT":8100,"IOTDISPLAYNAME":"SmartOffice","IOTTLSCERTFILE":"","IOTTLSPRIVATEKEY":"","BRAND_IMAGE_TANGO_LEFT":"images\/tango.png","BRAND_IMAGE_FREEPBX_FOOT":"images\/freepbx_small.png","BRAND_IMAGE_SPONSOR_FOOT":"images\/sangoma-horizontal_thumb.png","BRAND_FREEPBX_ALT_LEFT":"FreePBX","BRAND_FREEPBX_ALT_FOOT":"FreePBX\u00ae","BRAND_SPONSOR_ALT_FOOT":"www.sangoma.com","BRAND_IMAGE_FREEPBX_LINK_LEFT":"http:\/\/www.freepbx.org","BRAND_IMAGE_FREEPBX_LINK_FOOT":"http:\/\/www.freepbx.org","BRAND_IMAGE_SPONSOR_LINK_FOOT":"http:\/\/www.sangoma.com","BRAND_CSS_ALT_MAINSTYLE":"","BRAND_CSS_ALT_POPOVER":"","BRAND_CSS_CUSTOM":"","WHICH_asterisk":"\/usr\/sbin\/asterisk","WHICH_at":"\/usr\/bin\/at","WHICH_fail2ban-client":"\/usr\/bin\/fail2ban-client","WHICH_ffmpeg":"\/usr\/bin\/ffmpeg","WHICH_fwconsole":"\/usr\/sbin\/fwconsole","WHICH_gs":"\/usr\/bin\/gs","WHICH_ifconfig":"\/usr\/sbin\/ifconfig","WHICH_ipset":"\/usr\/sbin\/ipset","WHICH_lame":"\/usr\/bin\/lame","WHICH_mailq":"\/usr\/bin\/mailq","WHICH_mpg123":"\/usr\/bin\/mpg123","WHICH_netstat":"\/usr\/bin\/netstat","WHICH_openssl":"\/usr\/bin\/openssl","WHICH_route":"\/usr\/sbin\/route","WHICH_sox":"\/usr\/bin\/sox","WHICH_tail":"\/usr\/bin\/tail","WHICH_tiff2pdf":"\/usr\/bin\/tiff2pdf","WHICH_tiffinfo":"\/usr\/bin\/tiffinfo","WHICH_touch":"\/usr\/bin\/touch","AMPSYSLOGLEVEL":"FILE","AMPDISABLELOG":0,"LOG_OUT_MESSAGES":1,"AUTOMODULEUPDATESANDRELOAD":0,"AMPSHOWUPDATESONSSH":0,"LOG_NOTIFICATIONS":1,"MDATETIMEFORMAT":"llll","MDATEFORMAT":"l","FPBX_LOG_FILE":"\/var\/log\/asterisk\/freepbx.log","MTIMEFORMAT":"LT","PHP_CONSOLE":0,"PHP_CONSOLE_PASSWORD":"batteryhorsestaplegf","PHP_ERROR_HANDLER_OUTPUT":"freepbxlog","PHP_ERROR_LEVEL":"ALL_NOSTRICTNOTICEWARNINGDEPRECIATED","AGGRESSIVE_DUPLICATE_CHECK":0,"AMPEXTENSIONS":"extensions","EXPOSE_ALL_FEATURE_CODES":0,"AUTHTYPE":"usermanager","AMP_ACCESS_DB_CREDS":0,"FORCED_ASTVERSION":"","AMPVMUMASK":"007","BROWSER_STATS":0,"CACHERTCLASSES":1,"MIXMON_FORMAT":"wav","UIDEFAULTLANG":"en_US","SIGNATURECHECK":1,"AMPTRACKENABLE":1,"AMPWEBADDRESS":"","PHPTIMEZONE":"Europe\/Istanbul","RSSFEEDS":"http:\/\/www.freepbx.org\/rss.xml\r\nhttp:\/\/feeds.feedburner.com\/InsideTheAsterisk","AMPASTERISKGROUP":"asterisk","AMPASTERISKUSER":"asterisk","AMPDEVGROUP":"asterisk","AMPDEVUSER":"asterisk","FREEPBX_SYSTEM_IDENT":"'${PBXNAME}' VoIP Server","AMPASTERISKWEBGROUP":"asterisk","AMPASTERISKWEBUSER":"asterisk","AMPENGINE":"asterisk","USE_GOOGLE_CDN_JS":0,"TCMAINT":1,"TCINTERVAL":"60","NODEJSENABLED":1,"NODEJSTLSENABLED":1,"NODEJSBINDADDRESS":"::","NODEJSBINDPORT":8001,"NODEJSHTTPSBINDADDRESS":"::","NODEJSHTTPSBINDPORT":8003,"NODEJSTLSCERTFILE":"\/etc\/asterisk\/keys\/integration\/certificate.pem","NODEJSTLSPRIVATEKEY":"\/etc\/asterisk\/keys\/integration\/webserver.key","UCPCHANGEPASSWORD":1,"UCPCHANGEUSERNAME":1,"UCPRSSFEEDS":"","UCPSESSIONTIMEOUT":"30","AMPUSERMANEMAILFROM":"","USERMAN_ENABLE_CALL_ACTIVITY_GROUPS":0,"USERMAN_CALL_ACTIVITY_GRP_USER_LIMIT":30,"VMX_CONTEXT":"from-internal","VMX_LOOPDEST_CONTEXT":"","VMX_LOOPDEST_EXT":"dovm","VMX_LOOPDEST_PRI":1,"VMX_PRI":1,"VMX_TIMEDEST_CONTEXT":"","VMX_TIMEDEST_EXT":"dovm","VMX_TIMEDEST_PRI":1,"USERESMWIBLF":0,"VM_SHOW_IMAP":0,"UCP_MESSAGE_LIMIT":3000,"ZULUENABLED":0,"ZULUMAXVIDEOSTREAMS":8,"ZULURTCMAXPORT":59999,"ZULURTCMINPORT":40000,"ZULUBINDADDRESS":"0.0.0.0","ZULUBINDPORT":8002,"ZULUCOMMANDBINDPORT":7999,"ZULUCONFERENCEPREFIX":"*89","ZULUTLSCERTFILE":"\/etc\/asterisk\/keys\/integration\/certificate.pem","ZULUTLSPRIVATEKEY":"\/etc\/asterisk\/keys\/integration\/webserver.key"}'
json_file="settings.json"

# JSON verisini dosyaya yaz
echo $json_data > $json_file
wait
sleep 5

# Dosyanın oluşturulup oluşturulmadığını kontrol et
if [ -f "$json_file" ]; then
    fwconsole setting -q -i $json_file
    wait
    sleep 5
    echo -e "${GREEN}---------------> FREEPBX için Spechy özel ayarları JSON dosyası başarıyla sisteme uyarlandı.${NC}"
else
    echo -e "${RED}---------------> FREEPBX için Spechy özel ayarları JSON dosyası sisteme aktarılamadı.${NC}"
fi

#######################################################################
## FREEPBX Ayarlarının database e işlenmesi

mysql -h localhost -u root -e "use asterisk; UPDATE kvstore_Sipsettings SET val = '{\"ulaw\":1,\"opus\":2,\"g729\":3,\"alaw\":4}', type = 'json-arr' WHERE \`key\` = 'voicecodecs';"
wait
echo -e "${GREEN}---------------> FREEPBX SIP Settings altındaki Codecler ayarlandı.${NC}"

# stunaddr için insert veya update
mysql -h localhost -u root -e "use asterisk; INSERT INTO kvstore_Sipsettings (\`key\`, val,id) VALUES ('stunaddr', 'stun4.l.google.com:19302','noid') ON DUPLICATE KEY UPDATE val = 'stun4.l.google.com:19302';"
wait
echo -e "${GREEN}---------------> FREEPBX SIP Settings altındaki STUN server ayarlandı.${NC}"

# webrtcstunaddr için insert veya update
mysql -h localhost -u root -e "use asterisk; INSERT INTO kvstore_Sipsettings (\`key\`, val,id) VALUES ('webrtcstunaddr', 'stun4.l.google.com:19302','noid') ON DUPLICATE KEY UPDATE val = 'stun4.l.google.com:19302';"
wait
echo -e "${GREEN}---------------> FREEPBX SIP Settings altındaki WEBRTC STUN Server ayarlandı.${NC}"

# protocoller için insert veya update
mysql -h localhost -u root -e "use asterisk; INSERT INTO kvstore_Sipsettings (\`key\`, val, id,type) VALUES ('binds', '{\"udp\":{\"0.0.0.0\":\"on\"},\"tcp\":{\"0.0.0.0\":\"off\"},\"tls\":{\"0.0.0.0\":\"off\"},\"ws\":{\"0.0.0.0\":\"on\"},\"wss\":{\"0.0.0.0\":\"on\"}}', 'noid','json-arr') ON DUPLICATE KEY UPDATE val = '{\"udp\":{\"0.0.0.0\":\"on\"},\"tcp\":{\"0.0.0.0\":\"off\"},\"tls\":{\"0.0.0.0\":\"off\"},\"ws\":{\"0.0.0.0\":\"on\"},\"wss\":{\"0.0.0.0\":\"on\"}}', type='json-arr';"
wait
echo -e "${GREEN}---------------> FREEPBX SIP Settings altındaki PROTOCOL listesi ayarlandı.${NC}"

# webrtc için insert veya update
mysql -h localhost -u root -e "use asterisk; INSERT INTO kvstore_FreePBX_modules_Firewall (\`key\`, val,id,type) VALUES ('webrtc', '[\"external\",\"internal\"]','servicesettings','json-arr') ON DUPLICATE KEY UPDATE val = '[\"external\",\"internal\"]',id ='servicesettings', type='json-arr';"
wait
echo -e "${GREEN}---------------> FREEPBX FIREWALL Services altındaki WEBRTC Servisi ayarlandı.${NC}"

# vpn için insert veya update
mysql -h localhost -u root -e "use asterisk; INSERT INTO kvstore_FreePBX_modules_Firewall (\`key\`, val,id,type) VALUES ('vpn', '[\"internal\"]','servicesettings','json-arr') ON DUPLICATE KEY UPDATE val = '[\"internal\"]',id ='servicesettings',type='json-arr';"
wait
echo -e "${GREEN}---------------> FREEPBX SIP Settings altındaki VPN ayarlandı.${NC}"

fwconsole chown
wait
echo -e "${GREEN}---------------> FREEPBX ( chown ) yetkileri düzenlendi."
echo -e "${YELLOW}-------------------------------------------------------------------------------->${NC}"
echo -e "${YELLOW}---------------> FREEPBX - APPLY CONFIG(Reload) çalıştırıldı.${NC}"
fwconsole reload --verbose
wait
echo -e "${GREEN}---------------> FREEPBX Reload Tamamlandı.${NC}"
echo -e "${YELLOW}-------------------------------------------------------------------------------->${NC}"
echo -e "${YELLOW}-------------------------------------------------------------------------------->${NC}"
echo -e "${YELLOW}-------------------------------------------------------------------------------->${NC}"
echo -e "${YELLOW}-------------------------------------------------------------------------------->${NC}"

#######################################################################
# Otomatik LetsEncrypt SSL güncelleme için Cronjob satırını tanımla

CRONJOB="0 7 */5 * * fwconsole certificates --updateall"

# Cronjob dosyasını kontrol et ve varsa ekle
(crontab -l 2>/dev/null | grep -v -F "$CRONJOB" ; echo "$CRONJOB") | crontab -

#######################################################################
## Apache Status Sayfa yapılandırması

# Apache yüklü ise status.conf dosyasını oluştur ve yapılandır
if [ "$apache_installed" = true ]; then
    status_conf="${conf_directory}/status.conf"
    #echo "Creating ${status_conf}..."

    cat <<EOL > ${status_conf}
ExtendedStatus On
<Location /server-status>
    SetHandler server-status
    Require all denied
    Require local
</Location>
EOL

    # Apache versiyonu apache2 ise a2ensite komutunu çalıştır
    if [ "$apache_version" == "apache2" ]; then
        echo -e "${YELLOW}---------------> Running a2ensite for status.conf...${NC}"
        a2ensite status.conf
        wait
    fi
    echo -e "${GREEN}---------------> Apache için /server-status düzenlenmesi tamamlandı.${NC}"
else
    echo -e "${RED}---------------> Apache ile ilgili işlemler atlandı.${NC}"
fi

#######################################################################
## Zabbix Duzenlemeleri
echo -e "${YELLOW}---------------> ZABBIX Kurulumu <--------------.${NC}"

# Zabbix agentı paketini yükle
if [ "$server_type" = 'debian' ]; then
    wget https://repo.zabbix.com/zabbix/6.4/debian/pool/main/z/zabbix-release/zabbix-release_latest_6.4+debian12_all.deb
    wait
    dpkg -i zabbix-release_latest_6.4+debian12_all.deb
    wait
    apt update
else
    rpm -Uvh https://repo.zabbix.com/zabbix/6.4/rhel/7/x86_64/zabbix-release-6.4-1.el7.noarch.rpm
    wait
fi

if [ $? -ne 0 ]; then
    echo -e "${RED}---------------> Zabbix RPM yükleme işlemi başarısız oldu.${NC}" >&2
else
    # Zabbix agentını kur
    if [ "$server_type" = 'debian' ]; then
        apt install zabbix-agent2 zabbix-agent2-plugin-*
    else
        yum -y install zabbix-agent2 zabbix-agent2-plugin-*
    fi
    if [ $? -ne 0 ]; then
        echo -e "${RED}---------------> Zabbix agentı kurulumu başarısız oldu.${NC}" >&2
    else
        # Zabbix agentını yeniden başlat
        systemctl restart zabbix-agent2
        if [ $? -ne 0 ]; then
            echo -e "${RED}---------------> Zabbix agentı yeniden başlatılamadı.${NC}" >&2
        fi

        # Zabbix agentını başlangıçta otomatik olarak başlat
        systemctl enable zabbix-agent2
        if [ $? -ne 0 ]; then
            echo -e "${RED}---------------> Zabbix agentı otomatik başlatılamadı.${NC}" >&2
        fi

        # Zabbix agentı yapılandırma dosyasını düzenle

        # Zabbix active agentı yapılandırma
        sed -i 's/^Server=.*/Server=34.159.154.0/' /etc/zabbix/zabbix_agent2.conf
        sed -i 's/^ServerActive=.*/ServerActive=34.159.154.0/' /etc/zabbix/zabbix_agent2.conf

        # Hostname ayarı
        if grep -q "^#\?Hostname=" /etc/zabbix/zabbix_agent2.conf; then
            echo -e "${YELLOW}---------------> #\?Hostname= bulundu, düzenleniyor...${NC}"
            sed -i 's/^#\?Hostname=.*/Hostname=PBX-'${PBXNAME}'/' /etc/zabbix/zabbix_agent2.conf
        else
            echo -e "${YELLOW}---------------> #\?Hostname= bulunamadı, sonuna ekleniyor...${NC}"
            echo "Hostname=PBX-${PBXNAME}" >> /etc/zabbix/zabbix_agent2.conf
        fi

        # HostMetadata ayarı
        if grep -q "^#\?HostMetadata=" /etc/zabbix/zabbix_agent2.conf; then
            echo -e "${YELLOW}---------------> #\?HostMetadata= bulundu, düzenleniyor...${NC}"
            sed -i 's/^#\?HostMetadata=.*/HostMetadata=SPCPBX/' /etc/zabbix/zabbix_agent2.conf
        else
            echo -e "${YELLOW}---------------> #\?HostMetadata= bulunamadı, sonuna ekleniyor...${NC}"
            echo "HostMetadata=SPCPBX" >> /etc/zabbix/zabbix_agent2.conf
        fi

        if [ $? -ne 0 ]; then
            echo -e "${RED}---------------> Zabbix agentı yapılandırma dosyası düzenlenemedi.${NC}" >&2
        else
            echo -e "${GREEN}---------------> Tüm işlemler başarıyla tamamlandı. Zabbix Agent 2 başarıyla yüklendi.${NC}"    
        fi
    fi
fi

#######################################################################
## Rclone Duzenlemeleri - https://rclone.org/install/
echo -e "${YELLOW}---------------> Rclone kurulumu başlatılıyor....${NC}"

# Rclone indirme ve yükleme
curl https://rclone.org/install.sh | sudo bash

wait

# Kurulum kontrolü
if [ $? -eq 0 ]; then
    echo -e "${GREEN}---------------> Rclone başarıyla kuruldu.${NC}"
else
    echo -e "${RED}---------------> Rclone kurulumu sırasında bir hata oluştu!${NC}"
    exit 1
fi

# Rclone sürüm kontrolü
rclone --version
if [ $? -eq 0 ]; then
    echo -e "${GREEN}---------------> Rclone çalışıyor ve kurulumu doğrulandı.${NC}"
else
    echo -e "${RED}---------------> Rclone kurulum doğrulama başarısız.${NC}"
fi

########################################################################
## FTP Yedekleme için gerekli yapılandırma

if [ -z "$FTP_HOST" ]; then
    echo -e "${YELLOW}---------------> FTP_HOST değişkeni tanımlı değil. FTP Yedekleme işlemleri atlanıyor."
else

    rclone config create $FTP_NAME ftp host $FTP_HOST user $FTP_USER pass $FTP_PASS

echo -e "${GREEN}---------------> Rclone Config oluşturuldu.${NC}"

BACKUP_SCRIPT="/opt/rclone_backup.sh"
cat << EOF > "${BACKUP_SCRIPT}"
#!/bin/bash

# Bir önceki günün tarihini alın
YESTERDAY=\$(date -d "yesterday" '+%Y/%m/%d')
time=\$(date '+%Y-%m-%d-%H-%M-%S')

# Kaynak dizin (asterisk kayıtlarının tutulduğu dizin)
SOURCE_DIR="/var/spool/asterisk/monitor/\${YESTERDAY}"

# Hedef (FTP sunucusunda hedef dizin)
DESTINATION="$FTP_NAME:$FTP_PATH/\${YESTERDAY}"

# Log dosyası
LOG_FILE="/var/log/rclone_sync_\${time}.log"

# Rclone ile dosyaları FTP sunucusuna senkronize et
rclone copy "\${SOURCE_DIR}" "\${DESTINATION}" -vv >> "\${LOG_FILE}" 2>&1
wait

# Son 3 aydan eski klasörleri bul ve sil
# Burada -mtime +90, 90 günden eski dosya veya klasörleri bulur.
find /var/spool/asterisk/monitor/ -mtime +90 -exec rm -rf {} \; >> "\${LOG_FILE}" 2>&1
wait

echo "Aktarma ve silme islemleri tamamlandi.  \${time}"
EOF

    chmod +x $BACKUP_SCRIPT

    # 4. Cronjob Ekleme
    (crontab -l ; echo "0 1 * * * $BACKUP_SCRIPT") | crontab -
    echo -e "${GREEN}---------------> Cronjob dosyası oluşturulup aktif edildi.${NC}"

fi

########################################################################
## Ses Kayıtları silme için gerekli yapılandırma

MBACKUP_SCRIPT="/opt/recordings_check.sh"
cat << EOF > "${MBACKUP_SCRIPT}"
#!/bin/bash

time=\$(date '+%Y-%m-%d-%H-%M-%S')

# Log dosyası
LOG_FILE="/var/log/recordingCheck_\${time}.log"

# Son 3 aydan eski klasörleri bul ve sil
# Burada -mtime +90, 90 günden eski dosya veya klasörleri bulur.
find /var/spool/asterisk/monitor/ -mtime +90 -exec rm -rf {} \; >> "\${LOG_FILE}" 2>&1
wait

echo "Aktarma ve silme islemleri tamamlandi.  \${time}"
EOF

    chmod +x $MBACKUP_SCRIPT

    # 4. Cronjob Ekleme
    (crontab -l ; echo "0 4 * * * $MBACKUP_SCRIPT") | crontab -
    echo -e "${GREEN}---------------> Recordings için Cronjob dosyası oluşturulup aktif edildi.${NC}"


# Tüm işlemler bittikten sonra kullanıcıya yeniden başlatma işlemini onaylamasını sor
read -p "---------------> Tüm düzenlemelerin aktif olabilmesi için sistemin yeniden başlatılması gerekiyor. Sistemi yeniden başlatmak istediğinizden emin misiniz? (y/n): " confirm_reboot
if [ "$confirm_reboot" == "y" ]; then
    sudo reboot
else
    echo -e "${YELLOW}---------------> Yeniden başlatma işlemi iptal edildi.${NC}"
fi
