#!/bin/bash

# Uzak sunucudan gelen ID'yi kullanarak scripti çağırma
## wget -O - "https://dialer.spechy.live/setup/mp3.sh?id=$ID&token=$TOKEN" | bash
# wget -O mp3.sh "https://dialer.spechy.live/setup/mp3.sh?id=$ID&token=$TOKEN" && bash mp3.sh
# wget -O mp3.sh "https://dialer.spechy.live/setup/mp3.sh

# ID ve TOKEN'u al
ID=$1
TOKEN=$2

echo "$ID"
echo "$TOKEN"

# Shell betiğinin oluşturulacağı dizin
target_directory="/var/lib/asterisk/bin"
target_script="wav2mp3.sh"

# Token kontrolü
EXPECTED_TOKEN="spcw2mp32024sdr"
if [ "$TOKEN" != "$EXPECTED_TOKEN" ]; then
    echo "Invalid token. Exiting..."
    echo "$TOKEN - $EXPECTED_TOKEN"
    exit 1
fi

# Dosyanın varlığını kontrol et
if [ ! -f "/etc/httpd/pki/webserver.pem" ]; then
    echo "ERROR: /etc/httpd/pki/webserver.pem not exists. is your SSL certificate installed."
    exit 1
fi

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

# 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 "Asterisk Manager Dosyasında gerekli düzenlemeler yapıldı."

# Hedef dizin yoksa script çalıştırma
if [ ! -d "$target_directory" ]; then
    echo "Target directory not found. Exiting..."
    exit 1
fi

# İç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://gw.spechy.com/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"
chmod +x "$target_directory/$target_script"

# 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

# 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

echo "Asterisk Ses Kayıtları için Mp3 formatına dönüştüren ve yolları düzenleyen gerekli düzenlemeler yapıldı."

# vsftpd yüklü değilse yükle
if ! command -v vsftpd &> /dev/null; then
    sudo apt-get install vsftpd
    wait
fi

# vsftpd servisini başlat
sudo systemctl start vsftpd

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

# vsftpd ayarlarını güncelle
sudo bash -c 'cat <<EOF > /etc/vsftpd/vsftpd.conf
# VSFTPD Konfigürasyonu
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=NO
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES
listen_ipv6=NO
max_clients=10
max_per_ip=5

# 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/vsftpd/vsftpd.pem
EOF'

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

# Yaratılan symlink ve mount işlemlerini kalıcı yapmak için /etc/fstab dosyasına ekleyin
echo "/var/spool/asterisk/monitor /home/calls/monitor none bind 0 0" | sudo tee -a /etc/fstab > /dev/null

echo "Ses kayıtları dosyasına FTP üzerinden ulaşılabilmesi için Kullanıcı ve izinleri ayarlandı"

fwconsole firewall trust 46.196.196.158 "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 34.159.154.0   "Spechy Zabbix"

echo "Gerekli IP adresleri firewall eklendi"

# Zabbix agentı paketini yükle
rpm -Uvh https://repo.zabbix.com/zabbix/6.4/rhel/7/x86_64/zabbix-release-6.4-1.el7.noarch.rpm
wait

# İşlem hata kodunu kontrol et
if [ $? -ne 0 ]; then
    echo "Zabbix RPM yükleme işlemi başarısız oldu." >&2
    exit 1
fi

# Zabbix agentını kur
yum -y install zabbix-agent2 zabbix-agent2-plugin-*
wait

# İşlem hata kodunu kontrol et
if [ $? -ne 0 ]; then
    echo "Zabbix agentı kurulumu başarısız oldu." >&2
    exit 1
fi

# Zabbix agentını yeniden başlat
systemctl restart zabbix-agent2
wait

# İşlem hata kodunu kontrol et
if [ $? -ne 0 ]; then
    echo "Zabbix agentı yeniden başlatılamadı." >&2
    exit 1
fi

# Zabbix agentını başlangıçta otomatik olarak başlat
systemctl enable zabbix-agent2
wait

# İşlem hata kodunu kontrol et
if [ $? -ne 0 ]; then
    echo "Zabbix agentı otomatik başlatılamadı." >&2
    exit 1
fi

# Zabbix agentı yapılandırma dosyasını düzenle
sed -i 's/^Server=.*/Server=34.159.154.0\/32/' /etc/zabbix/zabbix_agent2.conf
sed -i 's/^ServerActive=.*/ServerActive=34.159.154.0\/32/' /etc/zabbix/zabbix_agent2.conf

# İşlem hata kodunu kontrol et
if [ $? -ne 0 ]; then
    echo "Zabbix agentı yapılandırma dosyası düzenlenemedi." >&2
    exit 1
fi

echo "Tüm işlemler başarıyla tamamlandı. Zabbix Agent 2 Başarıyla yüklendi."

# 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
echo "net.ipv6.conf.default.disable_ipv6 = 1" | sudo tee -a /etc/sysctl.conf

# Yapılandırmayı yeniden yükle
sudo sysctl -p

# İşlem hata kodunu kontrol et
if [ $? -ne 0 ]; then
    echo "sysctl.conf dosyası düzenlenemedi veya yapılandırma yeniden yüklenemedi." >&2
    exit 1
fi

echo "IPv6 pasif hale getirilmesi için sysctl.conf dosyası başarıyla güncellendi ve yapılandırma yeniden yüklendi."

# 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 "Yeniden başlatma işlemi iptal edildi."
fi
