diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml index 4b103f8..52649e6 100644 --- a/.github/workflows/build-and-publish.yml +++ b/.github/workflows/build-and-publish.yml @@ -1,4 +1,7 @@ +name: 'Docker Image' + on: + workflow_dispatch: push: branches: - 'master' @@ -7,45 +10,45 @@ on: jobs: build-and-push-docker-image: - name: Build Docker image and push to repositories + name: Build Docker Image runs-on: ubuntu-latest steps: - - name: Checkout code + - name: Repository Checkout uses: actions/checkout@v2 - - name: Docker meta + - name: Docker Image Metadata id: meta uses: docker/metadata-action@v3 with: images: | - ngoduykhanh/powerdns-admin + powerdnsadmin/pda-legacy tags: | type=ref,event=tag type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=semver,pattern={{major}} - - name: Set up Docker Buildx + - name: Docker Buildx Setup id: buildx uses: docker/setup-buildx-action@v1 - - name: Login to DockerHub + - name: Docker Hub Authentication uses: docker/login-action@v1 with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} + username: ${{ secrets.DOCKERHUB_USERNAME_V2 }} + password: ${{ secrets.DOCKERHUB_TOKEN_V2 }} - - name: Build latest image + - name: Docker Image Build uses: docker/build-push-action@v2 if: github.ref == 'refs/heads/master' with: context: ./ file: ./docker/Dockerfile push: true - tags: ngoduykhanh/powerdns-admin:latest + tags: powerdnsadmin/pda-legacy:latest - - name: Build release image + - name: Docker Image Release Tagging uses: docker/build-push-action@v2 if: ${{ startsWith(github.ref, 'refs/tags/v') }} with: diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index ad59382..bba8c1f 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -12,6 +12,7 @@ name: "CodeQL" on: + workflow_dispatch: push: branches: [ master ] pull_request: diff --git a/README.md b/README.md index 8067855..ce12f62 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # PowerDNS-Admin A PowerDNS web interface with advanced features. -[![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/PowerDNS-Admin/PowerDNS-Admin.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/PowerDNS-Admin/PowerDNS-Admin/context:python) -[![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/PowerDNS-Admin/PowerDNS-Admin.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/PowerDNS-Admin/PowerDNS-Admin/context:javascript) +[![CodeQL](https://github.com/PowerDNS-Admin/PowerDNS-Admin/actions/workflows/codeql-analysis.yml/badge.svg?branch=master)](https://github.com/PowerDNS-Admin/PowerDNS-Admin/actions/workflows/codeql-analysis.yml) +[![Docker Image](https://github.com/PowerDNS-Admin/PowerDNS-Admin/actions/workflows/build-and-publish.yml/badge.svg?branch=master)](https://github.com/PowerDNS-Admin/PowerDNS-Admin/actions/workflows/build-and-publish.yml) #### Features: - Multiple domain management @@ -24,8 +24,8 @@ There are several ways to run PowerDNS-Admin. The easiest way is to use Docker. If you are looking to install and run PowerDNS-Admin directly onto your system check out the [Wiki](https://github.com/PowerDNS-Admin/PowerDNS-Admin/wiki#installation-guides) for ways to do that. ### Docker -This are two options to run PowerDNS-Admin using Docker. -To get started as quickly as possible try option 1. If you want to make modifications to the configuration option 2 may be cleaner. +Here are two options to run PowerDNS-Admin using Docker. +To get started as quickly as possible, try option 1. If you want to make modifications to the configuration option 2 may be cleaner. #### Option 1: From Docker Hub The easiest is to just run the latest Docker image from Docker Hub: @@ -34,7 +34,7 @@ $ docker run -d \ -e SECRET_KEY='a-very-secret-key' \ -v pda-data:/data \ -p 9191:80 \ - ngoduykhanh/powerdns-admin:latest + powerdnsadmin/pda-legacy:latest ``` This creates a volume called `pda-data` to persist the SQLite database with the configuration. diff --git a/deploy/docker/portainer.yaml b/deploy/docker/portainer.yaml new file mode 100644 index 0000000..84402ef --- /dev/null +++ b/deploy/docker/portainer.yaml @@ -0,0 +1,15 @@ +version: '3.3' +services: + + core: + image: powerdnsadmin/pda-legacy:latest + restart: unless-stopped + environment: + - SECRET_KEY=INSECURE-CHANGE-ME-9I0DAtfkfj5JmBkPSaHah3ECAa8Df5KK + ports: + - "12000:9191" + volumes: + - "core_data:/data" + +volumes: + core_data: diff --git a/docker/Dockerfile b/docker/Dockerfile index 5296e02..f0a0731 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,5 +1,4 @@ FROM alpine:3.13 AS builder -LABEL maintainer="k@ndk.name" ARG BUILD_DEPENDENCIES="build-base \ libffi-dev \ diff --git a/docs/wiki/database-setup/Setup-MySQL-or-MariaDB.md b/docs/wiki/database-setup/Setup-MySQL-or-MariaDB.md index 246a0a5..00586a5 100644 --- a/docs/wiki/database-setup/Setup-MySQL-or-MariaDB.md +++ b/docs/wiki/database-setup/Setup-MySQL-or-MariaDB.md @@ -18,6 +18,11 @@ quit ## Install required packages: ### Red-hat based systems: +``` +yum install MariaDB-shared mariadb-devel mysql-community-devel +``` + +If you use MariaDB ( from [MariaDB repositories](https://mariadb.com/resources/blog/installing-mariadb-10-on-centos-7-rhel-7/) ) ### Debian based systems: ``` diff --git a/docs/wiki/database-setup/Setup-PostgreSQL.md b/docs/wiki/database-setup/Setup-PostgreSQL.md index 40c1287..74af46f 100644 --- a/docs/wiki/database-setup/Setup-PostgreSQL.md +++ b/docs/wiki/database-setup/Setup-PostgreSQL.md @@ -53,4 +53,24 @@ docker run --name pdnsadmin-test -e BIND_ADDRESS=0.0.0.0 -e SQLA_DB_HOST='192.168.0.100' -e SQLA_DB_NAME='powerdns_admin_test' -v /data/node_modules:/var/www/powerdns-admin/node_modules -d -p 9191:9191 ixpict/powerdns-admin-pgsql:latest -``` \ No newline at end of file +``` + +## Install required packages: +### Red-hat based systems: +``` +sudo yum install postgresql-libs +``` + +### Debian based systems: +``` +apt install libpq-dev python-dev +``` + +### Install python packages: +``` +pip3 install psycopg2 +``` + +## Known Issues: + +** To fill in ** diff --git a/docs/wiki/install/Running-PowerDNS-Admin-on-Centos-7.md b/docs/wiki/install/Running-PowerDNS-Admin-on-Centos-7.md index 18d57f6..cee272c 100644 --- a/docs/wiki/install/Running-PowerDNS-Admin-on-Centos-7.md +++ b/docs/wiki/install/Running-PowerDNS-Admin-on-Centos-7.md @@ -1,59 +1,43 @@ +# Installing PowerDNS-Admin on CentOS 7 + ``` NOTE: If you are logged in as User and not root, add "sudo", or get root by sudo -i. ``` -
-**Remove old Python 3.4**
-If you had it installed because of older instructions
-``` -yum remove python34* -yum autoremove -``` -
+## Install required packages: +### Install needed repositories: -## Install required packages -**Install needed repositories:** -
``` yum install epel-release yum install https://repo.ius.io/ius-release-el7.rpm https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm ``` -**Install Python 3.6 and tools** +### Install Python 3.6 and tools: +First remove python 3.4 if installed +``` +yum remove python34* +yum autoremove +``` + ``` yum install python3 python3-devel python3-pip pip3.6 install -U pip pip install -U virtualenv ``` -**Install required packages for building python libraries from requirements.txt file** +### Install required packages for building python libraries from requirements.txt file: ``` ---> NOTE: I am using MySQL Community server as the database backend. - So `mysql-community-devel` is required. For MariaDB, - and PostgreSQL the required package will be different. +yum install gcc openldap-devel xmlsec1-devel xmlsec1-openssl libtool-ltdl-devel ``` -If you use MariaDB ( from [MariaDB repositories](https://mariadb.com/resources/blog/installing-mariadb-10-on-centos-7-rhel-7/) ) - -``` -yum install gcc MariaDB-devel MariaDB-shared openldap-devel xmlsec1-devel xmlsec1-openssl libtool-ltdl-devel -``` - -If you use default Centos mariadb (5.5) -``` -yum install gcc mariadb-devel openldap-devel xmlsec1-devel xmlsec1-openssl libtool-ltdl-devel -``` - - -**Install yarn to build asset files + Nodejs 14** +### Install yarn to build asset files + Nodejs 14: ``` curl -sL https://rpm.nodesource.com/setup_14.x | bash - curl -sL https://dl.yarnpkg.com/rpm/yarn.repo -o /etc/yum.repos.d/yarn.repo yum install yarn ``` -
-## Checkout source code and create virtualenv +### Checkout source code and create virtualenv: NOTE: Please adjust `/opt/web/powerdns-admin` to your local web application directory ``` @@ -68,15 +52,14 @@ Activate your python3 environment and install libraries: pip install python-dotenv pip install -r requirements.txt ``` -
-## Running PowerDNS-Admin +## Running PowerDNS-Admin: NOTE: The default config file is located at `./powerdnsadmin/default_config.py`. If you want to load another one, please set the `FLASK_CONF` environment variable. E.g. ```bash export FLASK_CONF=../configs/development.py ``` -**Then create the database schema by running:** +### Create the database schema: ``` export FLASK_APP=powerdnsadmin/__init__.py flask db upgrade @@ -97,4 +80,4 @@ Open your web browser and access to `http://localhost:9191` to visit PowerDNS-Ad At the first time you login into the PDA UI, you will be redirected to setting page to configure the PDNS API information. -_**Note:**_ For production environment, i would recommend you to run PowerDNS-Admin with gunicorn or uwsgi instead of flask's built-in web server, take a look at WIKI page to see how to configure them. \ No newline at end of file +_**Note:**_ For production environment, i would recommend you to run PowerDNS-Admin with gunicorn or uwsgi instead of flask's built-in web server, take a look at WIKI page to see how to configure them. diff --git a/docs/wiki/install/Running-PowerDNS-Admin-on-Docker.md b/docs/wiki/install/Running-PowerDNS-Admin-on-Docker.md index 2f23845..1e3ef50 100644 --- a/docs/wiki/install/Running-PowerDNS-Admin-on-Docker.md +++ b/docs/wiki/install/Running-PowerDNS-Admin-on-Docker.md @@ -1,6 +1,6 @@ # Installation on docker -The Docker image is ngoduykhanh/powerdns-admin available on [DockerHub](https://hub.docker.com/r/ngoduykhanh/powerdns-admin) +The Docker image is powerdnsadmin/pda-legacy available on [DockerHub](https://hub.docker.com/r/powerdnsadmin/pda-legacy) The supported environment variables to configure the container are located [here](../configuration/Environment-variables.md). @@ -10,5 +10,5 @@ docker run -d \ -e SECRET_KEY='a-very-secret-key' \ -v pda-data:/data \ -p 9191:80 \ - ngoduykhanh/powerdns-admin:latest + powerdnsadmin/pda-legacy:latest ``` diff --git a/docs/wiki/install/Running-PowerDNS-Admin-on-Fedora-30.md b/docs/wiki/install/Running-PowerDNS-Admin-on-Fedora-30.md index bbd9f03..53f1c7c 100644 --- a/docs/wiki/install/Running-PowerDNS-Admin-on-Fedora-30.md +++ b/docs/wiki/install/Running-PowerDNS-Admin-on-Fedora-30.md @@ -14,11 +14,6 @@ dnf install python37 python3-devel python3-pip ```bash dnf install mariadb-devel mariadb-common openldap-devel xmlsec1-devel xmlsec1-openssl libtool-ltdl-devel ``` -**Install Postgres dependencies** -```bash -$ sudo yum install postgresql-libs -$ pip3 install psycopg2 -``` **Install Development tools** ```bash dnf install gcc gc make @@ -31,8 +26,6 @@ pip3.7 install -U pip ```bash pip install -U virtualenv ``` - - **Install Yarn for building NodeJS asset files:** ```bash dnf install npm diff --git a/powerdnsadmin/models/domain.py b/powerdnsadmin/models/domain.py index bbd71e1..09b697e 100644 --- a/powerdnsadmin/models/domain.py +++ b/powerdnsadmin/models/domain.py @@ -110,6 +110,22 @@ class Domain(db.Model): 'Domain does not exist. ERROR: {0}'.format(e)) return None + def search_idn_domains(self, search_string): + """ + Search for IDN domains using the provided search string. + """ + # Compile the regular expression pattern for matching IDN domain names + idn_pattern = re.compile(r'^xn--') + + # Search for domain names that match the IDN pattern + idn_domains = [ + domain for domain in self.get_domains() if idn_pattern.match(domain) + ] + + # Filter the search results based on the provided search string + return [domain for domain in idn_domains if search_string in domain] + + def update(self): """ Fetch zones (domains) from PowerDNS and update into DB @@ -906,4 +922,4 @@ class Domain(db.Model): current_app.logger.error('Domain already exists as a record: {} under domain: {}'.format(r['name'].rstrip('.'), upper_domain_name)) return upper_domain_name upper_domain_name = '.'.join(upper_domain_name.split('.')[1:]) - return None \ No newline at end of file + return None diff --git a/requirements.txt b/requirements.txt index 29f62d7..1fc2864 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,6 +4,7 @@ Flask-Login==0.5.0 Flask-SQLAlchemy==2.4.4 Flask-Migrate==2.5.3 SQLAlchemy==1.3.19 +mysqlclient==2.0.1 configobj==5.0.6 bcrypt>=3.1.7 requests==2.24.0