From 8ecde30969b257ca2cd7e4363658e206f6b93f8a Mon Sep 17 00:00:00 2001 From: "oscar.garcia" Date: Mon, 6 Oct 2025 16:07:51 -0500 Subject: [PATCH] Inicial --- .gitignore | 2 + README.md | 75 +++ asterisk/asterisk_issabel.tar.gz | Bin 0 -> 270901 bytes config_certificates.sh | 72 +++ fail2ban/action.d/iptables-common.conf | 91 +++ .../action.d/iptables-multiport-asterisk.conf | 58 ++ fail2ban/filter.d/asterisk.conf | 55 ++ fail2ban/jail.d/asterisk.conf | 9 + fail2ban/jail.d/defaults-debian.conf | 3 + install-issabel-debian.sh | 587 ++++++++++++++++++ issabel/patch/functions_inc.patch | 13 + issabel/patch/install_amp.patch | 13 + issabel_var.env | 16 + issabel_var.env.sample | 15 + logrotate/asterisk_logrotate.conf | 12 + script/login-info.sh | 48 ++ 16 files changed, 1069 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 asterisk/asterisk_issabel.tar.gz create mode 100644 config_certificates.sh create mode 100644 fail2ban/action.d/iptables-common.conf create mode 100644 fail2ban/action.d/iptables-multiport-asterisk.conf create mode 100644 fail2ban/filter.d/asterisk.conf create mode 100644 fail2ban/jail.d/asterisk.conf create mode 100644 fail2ban/jail.d/defaults-debian.conf create mode 100644 install-issabel-debian.sh create mode 100644 issabel/patch/functions_inc.patch create mode 100644 issabel/patch/install_amp.patch create mode 100644 issabel_var.env create mode 100644 issabel_var.env.sample create mode 100644 logrotate/asterisk_logrotate.conf create mode 100644 script/login-info.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4a91e6e --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Environment file +issabel_ver.env diff --git a/README.md b/README.md new file mode 100644 index 0000000..af1e031 --- /dev/null +++ b/README.md @@ -0,0 +1,75 @@ +IssabelPBX +========== + +IssabelPBX is an opensource GUI (graphical user interface) that controls and manages Asterisk (PBX). + +IssabelPBX is derived/forked from FreePBX that was also forked/renamed from the original AMP released +on 2004 by Coalescent Systems Inc. + +#### Environmental Variables: +Prior to running `install-issabel-debian.sh`, an `issabel_var.env` file must be created. There is +a sample file, `issabel_var.env.sample` here which provides a template. The values are needed: + +- **ASTERISK_URL_CERTIFIED**: It is the url to download asterisk certified version, by default the value +is https://downloads.asterisk.org/pub/telephony/certified-asterisk/releases + +- **ASTERISK_URL**: It is the url to download asterisk version, the possible value are +for new version https://downloads.asterisk.org/pub/telephony/asterisk and old releases +https://downloads.asterisk.org/pub/telephony/asterisk/old-releases + +- **ASTERISK_SRC_FILE**: It is the source asterisk files that we are going to install. + + For get a list the asterisk certified version run: +```sh +curl -s https://downloads.asterisk.org/pub/telephony/certified-asterisk/releases/ | grep -Po '">\K.+.tar.gz' | grep -v "patch"` +``` + + For new asterisk version run: +```sh +curl -s https://downloads.asterisk.org/pub/telephony/asterisk/ | grep -Po '">\K.+.tar.gz' | grep -v "patch"` +``` + + For old releases asterisk version run: + +```sh +curl -s https://downloads.asterisk.org/pub/telephony/asterisk/old-releases/ | grep -Po '">\K.+.tar.gz' | grep -Pv "patch|addons|sounds" +``` + +- **ISSABEL_ADMIN_PASSWORD**: It is the password for user 'admin' that will +be used for: Issabel Web Login and IssabelPBX. + +- **LANGUAGE**: This should be the English "en_EN" or EspaƱol "es_ES" + +- **ISSABLE_SETTINGS_TABLE**: It is the mysql table that contains the issabel setting. +By default the values is: issabelpbx_settings + +- **LETSENCRYPT_HTTPS_URL**: It is Domain that your associated with your public ip. + +- **LETSENCRYPT_EMAIL**: This is your email for generate the certificate with +letsencrypt. + +- **HTTPSCERTFILE**: It is the location of the ssl certificate file +/etc/asterisk/keys/asterisk_cert_file.pem + +- **HTTPSPRIVATEKEY**: It is the location of the ssl certificate private key file +/etc/asterisk/keys/asterisk_privkey.pem + +Installation +------------ + +Clone repository + +Fill issabel_var.env + +Run +```sh +./install-issabel-debian.sh +``` + +Generates and config certificates +--------------------------------- + +Run +```sh +./config_certificates.sh +``` \ No newline at end of file diff --git a/asterisk/asterisk_issabel.tar.gz b/asterisk/asterisk_issabel.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..6b95a56d5ac6d25eb35bc99e15832edb63b50239 GIT binary patch literal 270901 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