Compare commits
117
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9e2b51de60 | ||
|
|
eb0f467aad | ||
|
|
da4b86f4d3 | ||
|
|
b5ef38bc0d | ||
|
|
c5b7e9dcde | ||
|
|
b611d41e8a | ||
|
|
c3ba43b0fa | ||
|
|
dc0e006e0f | ||
|
|
0b66858969 | ||
|
|
16c8fba623 | ||
|
|
852fccd95c | ||
|
|
316d07db61 | ||
|
|
bf99f618f6 | ||
|
|
534f0cb7cb | ||
|
|
974f6820d4 | ||
|
|
6ccf910e29 | ||
|
|
aaf1ced21c | ||
|
|
d05a3e2dc6 | ||
|
|
8be8b44584 | ||
|
|
4a028c04c9 | ||
|
|
1f1d7ab75d | ||
|
|
e0e5d9e290 | ||
|
|
181eb67501 | ||
|
|
8af976c528 | ||
|
|
beba1f16b4 | ||
|
|
76d0cbdb8d | ||
|
|
6ff0bb31d3 | ||
|
|
e78825b99f | ||
|
|
33a9d6fec7 | ||
|
|
b01145e6bd | ||
|
|
06024c82c1 | ||
|
|
ce4a4838f1 | ||
|
|
f80cfbeba7 | ||
|
|
61e5966083 | ||
|
|
f49a606693 | ||
|
|
2b866b32bb | ||
|
|
97896b5170 | ||
|
|
3647ff15e1 | ||
|
|
267f753452 | ||
|
|
c33e463e09 | ||
|
|
40cfc3c9f5 | ||
|
|
632ba5257e | ||
|
|
7127effdaf | ||
|
|
ca3f7e964e | ||
|
|
904e779b59 | ||
|
|
63054b4a3a | ||
|
|
871f3c5ba8 | ||
|
|
9c706bb9b1 | ||
|
|
06c57ca837 | ||
|
|
39a3ec055b | ||
|
|
401cf8e1a7 | ||
|
|
f50d624d22 | ||
|
|
4aeee1acb5 | ||
|
|
b6a9cfed19 | ||
|
|
a67dcf763b | ||
|
|
0f58c2dcae | ||
|
|
9cb1418b0d | ||
|
|
f62e6ca651 | ||
|
|
0c6ddd4904 | ||
|
|
14d4dbfe97 | ||
|
|
50d0c2cd4d | ||
|
|
4fe45169c3 | ||
|
|
78d93a16eb | ||
|
|
b94bf528be | ||
|
|
11ad57bce4 | ||
|
|
495a55f8c1 | ||
|
|
c611360c04 | ||
|
|
ada418374b | ||
|
|
3bf7f2a195 | ||
|
|
2d22cab6e7 | ||
|
|
96dcbe1798 | ||
|
|
ac6dc5b426 | ||
|
|
b4f22ffeea | ||
|
|
ca3ed630ed | ||
|
|
e2d3868a9e | ||
|
|
47314620be | ||
|
|
f26f3f2665 | ||
|
|
938b37e920 | ||
|
|
2c5a989306 | ||
|
|
88a6dd9316 | ||
|
|
77742c1d6f | ||
|
|
ba16c6475a | ||
|
|
1735098b3a | ||
|
|
2fdaaa47ab | ||
|
|
bd4e4aed27 | ||
|
|
94a8240ad4 | ||
|
|
be03af61ea | ||
|
|
4da34c98f3 | ||
|
|
12253f0621 | ||
|
|
369954f5d2 | ||
|
|
4eee702dce | ||
|
|
e90daa2e61 | ||
|
|
cc8570d02f | ||
|
|
98e5ea965c | ||
|
|
7a98ab1c6d | ||
|
|
70973a63fb | ||
|
|
ad82f73c1d | ||
|
|
e08016c103 | ||
|
|
a65e99b199 | ||
|
|
4853150f07 | ||
|
|
a341e66c13 | ||
|
|
874779d230 | ||
|
|
779e8a8b0f | ||
|
|
8f35e88ce4 | ||
|
|
71e874cfb4 | ||
|
|
622b8942b5 | ||
|
|
7aeb7d094c | ||
|
|
4ee80f8b7e | ||
|
|
4859fa6877 | ||
|
|
a1d831cdf2 | ||
|
|
a3ee639d77 | ||
|
|
cd274aea81 | ||
|
|
aaa548eb21 | ||
|
|
99f05a055d | ||
|
|
e614d50f9c | ||
|
|
20526c829c | ||
|
|
c9ed33f108 |
@@ -1,16 +0,0 @@
|
||||
FROM gitea.tryton.geeraert.eu/pi-ux-ce/python:3
|
||||
|
||||
ENV PYTHONUNBUFFERED 1
|
||||
|
||||
WORKDIR /code/
|
||||
|
||||
# Copy only the requirements file first (Changes infrequently)
|
||||
COPY requirements.txt ./
|
||||
|
||||
|
||||
RUN --mount=type=cache,target=/root/.cache/pip pip install --upgrade pip
|
||||
RUN --mount=type=cache,target=/root/.cache/pip pip list --outdated
|
||||
RUN --mount=type=cache,target=/root/.cache/pip pip install --upgrade wheel
|
||||
RUN --mount=type=cache,target=/root/.cache/pip pip install --upgrade setuptools
|
||||
RUN --mount=type=cache,target=/root/.cache/pip pip install -r requirements.txt
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
django
|
||||
psycopg2
|
||||
requests
|
||||
proxmoxer
|
||||
docker
|
||||
kubernetes
|
||||
ruamel.yaml
|
||||
pyyaml
|
||||
django-bootstrap-v5
|
||||
jinja2
|
||||
watchdog
|
||||
celery
|
||||
redis
|
||||
lxml
|
||||
requests
|
||||
@@ -2,96 +2,45 @@ name: Gitea Actions Demo
|
||||
run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀
|
||||
on:
|
||||
push:
|
||||
#paths-ignore:
|
||||
# - 'requirements.txt'
|
||||
branches:
|
||||
- main
|
||||
paths-ignore:
|
||||
- 'django_testing/dockerfile'
|
||||
issue_comment:
|
||||
types: [created]
|
||||
|
||||
jobs:
|
||||
# Job to check for file changes and set an output
|
||||
changes:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
requirements_changed: ${{ steps.filter.outputs.requirements }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: dorny/paths-filter@v3
|
||||
id: filter
|
||||
with:
|
||||
filters: |
|
||||
requirements:
|
||||
- 'requirements.txt'
|
||||
|
||||
Build-dockerfile:
|
||||
runs-on: ubuntu-latest
|
||||
needs: changes
|
||||
if: ${{ needs.changes.outputs.requirements_changed == 'true' }}
|
||||
steps:
|
||||
- run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}."
|
||||
- name: Check out repository code
|
||||
uses: actions/checkout@v4
|
||||
- run: echo "💡 The ${{ gitea.repository }} repository has been cloned to the runner."
|
||||
- name: List files in the repository
|
||||
run: |
|
||||
ls ${{ gitea.workspace }}
|
||||
|
||||
- name: Compute next version
|
||||
id: versioning
|
||||
run: |
|
||||
latest="${{ vars.PYTHON_VERSION }}"
|
||||
next_version=$(echo "$latest" | awk -F. -v OFS=. '{$NF += 1 ; print}')
|
||||
echo "next_version=$next_version" >> $GITHUB_ENV
|
||||
echo "Variables used :"
|
||||
echo "------------------------------------------------"
|
||||
echo "Next version: $next_version"
|
||||
|
||||
- uses: actions/cache@v3
|
||||
with:
|
||||
path: /root/.cache/pip
|
||||
key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pip-
|
||||
|
||||
|
||||
- name: inject cache into docker
|
||||
uses: reproducible-containers/buildkit-cache-dance@v3.1.0
|
||||
with:
|
||||
cache-source: /root/.cache/pip
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Login to gitea
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: gitea.tryton.geeraert.eu
|
||||
username: ${{ secrets.USERNAME_GITEA }}
|
||||
password: ${{ secrets.PASSWORD_GITEA }}
|
||||
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: "{{defaultContext}}:.gitea/python_build"
|
||||
push: true
|
||||
tags: |
|
||||
gitea.tryton.geeraert.eu/pi-ux-ce/modified-python:latest
|
||||
gitea.tryton.geeraert.eu/pi-ux-ce/modified-python:${{ env.next_version }}
|
||||
cache-from: type=registry,ref=gitea.tryton.geeraert.eu/pi-ux-ce/modified-python:buildcache
|
||||
cache-to: type=registry,ref=gitea.tryton.geeraert.eu/pi-ux-ce/modified-python:buildcache,mode=max
|
||||
|
||||
- name: update version in the variable
|
||||
run: |
|
||||
curl -X PUT -H "Content-Type: application/json" \
|
||||
--user ${{ secrets.USERNAME_GITEA }}:${{ secrets.PASSWORD_GITEA }} \
|
||||
https://gitea.tryton.geeraert.eu/api/v1/repos/pi-ux-ce/${{ github.event.repository.name }}/actions/variables/PYTHON_VERSION \
|
||||
-d "{\"Value\":\"$next_version\"}"
|
||||
Explore-Gitea-Actions:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
RUNNER_TOOL_CACHE: /toolcache
|
||||
DEBUG: True
|
||||
ALLOWED_HOSTS: "django.tryton.geeraert.eu"
|
||||
container:
|
||||
image: gitea.tryton.geeraert.eu/pi-ux-ce/custom-runner-debian-slim:1.0.6
|
||||
volumes:
|
||||
- act-toolcache:/opt/hostedtoolcache # this is where Runner store their cache default
|
||||
runs-on: host-runner
|
||||
steps:
|
||||
|
||||
- run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}."
|
||||
|
||||
- name: restore git folder if exist
|
||||
run: if [ -d "/opt/hostedtoolcache/${{ github.event.repository.name }}/" ]; then cp -r /opt/hostedtoolcache/${{ github.event.repository.name }}/ ${{ gitea.workspace }}; fi
|
||||
|
||||
- name: Check Docker Version
|
||||
run: whereis docker
|
||||
|
||||
- name: Check out repository code
|
||||
uses: actions/checkout@v4
|
||||
clean: false
|
||||
fetch-depth: 1
|
||||
ref: 'main'
|
||||
|
||||
# - name: Manually check out repository code
|
||||
# run: cd ${{ gitea.workspace }} ; git pull origin main
|
||||
|
||||
- run: echo "💡 The ${{ gitea.repository }} repository has been cloned to the runner."
|
||||
|
||||
- name: List files in the repository
|
||||
run: |
|
||||
ls ${{ gitea.workspace }}
|
||||
@@ -106,18 +55,19 @@ jobs:
|
||||
echo "------------------------------------------------"
|
||||
echo "Next version: $next_version"
|
||||
|
||||
- uses: actions/cache@v3
|
||||
- name: Cache Docker layers
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: /root/.cache/pip
|
||||
key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }}
|
||||
path: /opt/hostedtoolcache/.buildx-cache
|
||||
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pip-
|
||||
${{ runner.os }}-buildx-
|
||||
|
||||
|
||||
- name: inject cache into docker
|
||||
uses: reproducible-containers/buildkit-cache-dance@v3.1.0
|
||||
with:
|
||||
cache-source: /root/.cache/pip
|
||||
cache-source: /opt/hostedtoolcache/pip
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
@@ -133,19 +83,27 @@ jobs:
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
push: true
|
||||
build-args: |
|
||||
ALLOWED_HOSTS='django.tryton.geeraert.eu'
|
||||
DEBUG='True'
|
||||
tags: |
|
||||
gitea.tryton.geeraert.eu/pi-ux-ce/django-python:latest
|
||||
gitea.tryton.geeraert.eu/pi-ux-ce/django-python:${{ env.next_version }}
|
||||
cache-from: type=registry,ref=gitea.tryton.geeraert.eu/pi-ux-ce/django-python:buildcache
|
||||
cache-to: type=registry,ref=gitea.tryton.geeraert.eu/pi-ux-ce/django-python:buildcache,mode=max
|
||||
|
||||
gitea.tryton.geeraert.eu/pi-ux-ce/django-python:latest
|
||||
gitea.tryton.geeraert.eu/pi-ux-ce/django-python:${{ env.next_version }}
|
||||
cache-from: type=local,src=/opt/hostedtoolcache/.buildx-cache
|
||||
cache-to: type=local,dest=/opt/hostedtoolcache/.buildx-cache-new,mode=max
|
||||
|
||||
- name: Move cache
|
||||
run: |
|
||||
rm -rf /opt/hostedtoolcache/.buildx-cache
|
||||
mv /opt/hostedtoolcache/.buildx-cache-new /opt/hostedtoolcache/.buildx-cache
|
||||
|
||||
- name: Rollout Django to force pulling the new image
|
||||
uses: actions-hub/kubectl@master
|
||||
env:
|
||||
KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }}
|
||||
with:
|
||||
args: rollout restart deployment django -n django
|
||||
|
||||
|
||||
- name: Rollout Celery worker to force pulling the new image
|
||||
uses: actions-hub/kubectl@master
|
||||
env:
|
||||
@@ -159,4 +117,7 @@ jobs:
|
||||
curl -X PUT -H "Content-Type: application/json" \
|
||||
--user ${{ secrets.USERNAME_GITEA }}:${{ secrets.PASSWORD_GITEA }} \
|
||||
https://gitea.tryton.geeraert.eu/api/v1/repos/pi-ux-ce/${{ github.event.repository.name }}/actions/variables/VERSION \
|
||||
-d "{\"Value\":\"$next_version\"}"
|
||||
-d "{\"Value\":\"$next_version\"}"
|
||||
|
||||
- name: backup git for future use
|
||||
run: cp -r ${{ gitea.workspace }} /opt/hostedtoolcache/${{ github.event.repository.name }}/
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
name: Gitea Actions Demo
|
||||
run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- "testing"
|
||||
paths:
|
||||
- 'django_testing/dockerfile'
|
||||
tags-ignore:
|
||||
- '*'
|
||||
|
||||
jobs:
|
||||
Explore-Gitea-Actions:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}."
|
||||
- name: Check out repository code
|
||||
uses: actions/checkout@v4
|
||||
- run: echo "💡 The ${{ gitea.repository }} repository has been cloned to the runner."
|
||||
- name: List files in the repository
|
||||
run: |
|
||||
ls ${{ gitea.workspace }}
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Compute next version
|
||||
id: versioning
|
||||
run: |
|
||||
latest="${{ vars.VERSION_TESTING }}"
|
||||
next_version=$(echo "$latest" | awk -F. -v OFS=. '{$NF += 1 ; print}')
|
||||
echo "next_version=$next_version" >> $GITHUB_ENV
|
||||
echo "Variables used :"
|
||||
echo "------------------------------------------------"
|
||||
echo "Next version: $next_version"
|
||||
|
||||
|
||||
- name: Login to gitea
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: gitea.tryton.geeraert.eu
|
||||
username: ${{ secrets.USERNAME_GITEA }}
|
||||
password: ${{ secrets.PASSWORD_GITEA }}
|
||||
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: django_testing/
|
||||
push: true
|
||||
tags: |
|
||||
gitea.tryton.geeraert.eu/pi-ux-ce/django-testing:latest
|
||||
gitea.tryton.geeraert.eu/pi-ux-ce/django-testing:${{ env.next_version }}
|
||||
cache-from: type=registry,ref=gitea.tryton.geeraert.eu/pi-ux-ce/geoip2-nginx:buildcache
|
||||
cache-to: type=registry,ref=gitea.tryton.geeraert.eu/pi-ux-ce/geoip2-nginx:buildcache,mode=max
|
||||
|
||||
- name: update version in the variable
|
||||
run: |
|
||||
curl -X PUT -H "Content-Type: application/json" \
|
||||
--user ${{ secrets.USERNAME_GITEA }}:${{ secrets.PASSWORD_GITEA }} \
|
||||
https://gitea.tryton.geeraert.eu/api/v1/repos/pi-ux-ce/${{ github.event.repository.name }}/actions/variables/VERSION_TESTING \
|
||||
-d "{\"Value\":\"$next_version\"}"
|
||||
|
||||
- name: Rollout Django to force pulling the new image
|
||||
uses: actions-hub/kubectl@master
|
||||
env:
|
||||
KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }}
|
||||
with:
|
||||
args: rollout restart deployment django-testing -n django-testing
|
||||
|
||||
- run: echo "🍏 This job's status is ${{ job.status }}."
|
||||
@@ -0,0 +1,23 @@
|
||||
name: Gitea Actions Demo
|
||||
run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- "testing"
|
||||
tags-ignore:
|
||||
- '*'
|
||||
|
||||
jobs:
|
||||
Explore-Gitea-Actions:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}."
|
||||
|
||||
- name: Rollout Django to force pulling the new image
|
||||
uses: actions-hub/kubectl@master
|
||||
env:
|
||||
KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }}
|
||||
with:
|
||||
args: rollout restart deployment django-testing -n django-testing
|
||||
|
||||
- run: echo "🍏 This job's status is ${{ job.status }}."
|
||||
@@ -1,6 +1,7 @@
|
||||
*/__pycache__/*
|
||||
*/.idea
|
||||
venv/*
|
||||
.env/*
|
||||
*__pycache__*
|
||||
Webcal-python/*
|
||||
.idea/*
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: django-python
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: django-webserver
|
||||
namespace: django-python
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: django-python
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: django-python
|
||||
spec:
|
||||
containers:
|
||||
- name: django-python
|
||||
image: gitea.tryton.geeraert.eu/pi-ux-ce/django-python:latest
|
||||
imagePullPolicy: Always
|
||||
ports:
|
||||
- containerPort: 8000
|
||||
name: webserver-port
|
||||
volumeMounts:
|
||||
## - name: django-python-code
|
||||
# mountPath: /code
|
||||
- name: servarr-data
|
||||
mountPath: /data
|
||||
readOnly: true
|
||||
- name: secret-kubeconfig
|
||||
mountPath: /kubeconfig
|
||||
|
||||
|
||||
resources:
|
||||
limits:
|
||||
cpu: 100m
|
||||
memory: 200Mi
|
||||
volumes:
|
||||
- name: django-python-code
|
||||
persistentVolumeClaim:
|
||||
claimName: django-python-code
|
||||
- name: servarr-data
|
||||
hostPath:
|
||||
path: /data
|
||||
- name: secret-kubeconfig
|
||||
secret:
|
||||
defaultMode: 420
|
||||
secretName: kubeconfig
|
||||
|
||||
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: webserver
|
||||
namespace: django-python
|
||||
spec:
|
||||
ports:
|
||||
- name: http
|
||||
port: 8000
|
||||
protocol: TCP
|
||||
selector:
|
||||
app: django-python
|
||||
@@ -0,0 +1,7 @@
|
||||
|
||||
class sql:
|
||||
url = 'localhost'
|
||||
port = 5432
|
||||
user = 'postgres'
|
||||
password = 'example'
|
||||
database = 'cloudmanager'
|
||||
@@ -0,0 +1,132 @@
|
||||
import psycopg2
|
||||
#import function
|
||||
import credentials
|
||||
import datetime
|
||||
|
||||
|
||||
def DB_generation(host_in,port_in,user_in,password_in,db_in):
|
||||
db = psycopg2.connect(host=host_in, port=port_in, user=user_in, password=password_in,database=db_in)
|
||||
return db
|
||||
|
||||
|
||||
def Launch_sql_query(sql,db):
|
||||
# prepare a cursor object using cursor() method
|
||||
cursor = db.cursor()
|
||||
|
||||
try:
|
||||
# Execute the SQL command
|
||||
cursor.execute(sql)
|
||||
# Fetch all the rows in a list of lists.
|
||||
results = cursor.fetchall()
|
||||
result_machine = []
|
||||
#result_machine_type = []
|
||||
for row in results:
|
||||
result_machine_type = []
|
||||
id_scenario = row[0]
|
||||
id_hour = bool(row[1])
|
||||
name = row[2]
|
||||
proxmox = row[3]
|
||||
machine_type = row[4]
|
||||
|
||||
result_machine_type.append(proxmox)
|
||||
result_machine_type.append(machine_type)
|
||||
result_machine_type.append(name)
|
||||
result_machine.append(result_machine_type)
|
||||
return result_machine
|
||||
|
||||
except:
|
||||
print ("Error: unable to fetch data")
|
||||
|
||||
|
||||
#Return the day of the week as an integer, where Monday is 0 and Sunday is 6.
|
||||
def Give_current_weekday():
|
||||
weekday = datetime.datetime.today().weekday()
|
||||
return weekday
|
||||
|
||||
def Give_current_hour():
|
||||
now = datetime.datetime.now()
|
||||
return now.hour
|
||||
|
||||
|
||||
def Check_server_supposed_XXX(generated_db_in,wanted_status,Wanted_hour):
|
||||
sql_in=""
|
||||
if wanted_status == "up" or wanted_status == "start":
|
||||
sql_in = "select scenario_hour.id_scenario , scenario_hour.state_at_" + str(Wanted_hour) + " , machine.name, machine.id_proxmox, machine.type from scenario_hour,machine where state_at_" + str(Wanted_hour) + "=1 and machine.hour_behaviour_id=scenario_hour.id_scenario;"
|
||||
elif wanted_status == "down" or wanted_status == "stop":
|
||||
sql_in = "select scenario_hour.id_scenario , scenario_hour.state_at_" + str(Wanted_hour) + " , machine.name, machine.id_proxmox, machine.type from scenario_hour,machine where state_at_" + str(Wanted_hour) + "=0 and machine.hour_behaviour_id=scenario_hour.id_scenario;"
|
||||
else:
|
||||
print("error value")
|
||||
return_value = Launch_sql_query(sql_in, generated_db_in)
|
||||
return return_value
|
||||
|
||||
def Is_the_server_already_wanted_state(id_machine, wanted_state,instance_type):
|
||||
#stopped/running
|
||||
bool_result = ""
|
||||
proxmox = function.proxmox_connection(credentials.proxmox.zeus.url_proxmox,credentials.proxmox.zeus.user,credentials.proxmox.zeus.password)
|
||||
if str(function.check_state_mix(id_machine,wanted_state,proxmox,instance_type)) == str(wanted_state):
|
||||
bool_result = True
|
||||
else:
|
||||
bool_result = False
|
||||
return bool_result
|
||||
|
||||
def all_operations(wanted_state,list_machine):
|
||||
info_to_display = ""
|
||||
if wanted_state == "running":
|
||||
operation_to_perform = "start"
|
||||
elif wanted_state == "stopped":
|
||||
operation_to_perform = "stop"
|
||||
else:
|
||||
print("Incorrect wanted state")
|
||||
|
||||
|
||||
for machine_target in list_machine:
|
||||
if not(Is_the_server_already_wanted_state(machine_target[0], wanted_state,machine_target[1])):
|
||||
function.action(False,machine_target[0],operation_to_perform,machine_target[1])
|
||||
print(str(machine_target[0])+" is now "+str(wanted_state))
|
||||
elif Is_the_server_already_wanted_state(machine_target[0], wanted_state,machine_target[1]):
|
||||
info_to_display = "operation already performed for "+machine_target[2]
|
||||
print(info_to_display)
|
||||
#return info_to_display
|
||||
return ""
|
||||
|
||||
def main():
|
||||
|
||||
generated_db = DB_generation(credentials.sql.url, credentials.sql.port, credentials.sql.user, credentials.sql.password,credentials.sql.database)
|
||||
|
||||
###operation:
|
||||
|
||||
## Server(s) supposed to be UP
|
||||
list_servers_up = Check_server_supposed_XXX(generated_db, "up", Give_current_hour())
|
||||
print("------------------------------------------")
|
||||
print("-----------------UP-----------------------")
|
||||
print("------------------------------------------")
|
||||
print(list_servers_up)
|
||||
print(all_operations("running", list_servers_up))
|
||||
|
||||
|
||||
## Server(s) supposed to be DOWN
|
||||
list_servers_down = Check_server_supposed_XXX(generated_db, "down", Give_current_hour())
|
||||
|
||||
print("------------------------------------------")
|
||||
print("----------------DOWN----------------------")
|
||||
print("------------------------------------------")
|
||||
print(list_servers_down)
|
||||
print(all_operations("stopped",list_servers_down))
|
||||
|
||||
|
||||
# disconnect from server
|
||||
generated_db.close()
|
||||
|
||||
#print(Is_the_server_already_wanted_state(112, "stopped"))
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
|
||||
"""
|
||||
TO DO:
|
||||
EXTRACT TYPE OF MACHINE
|
||||
CREATE FUNCTION TO CHECK IF A MACHINE IS ALREADY DOWN OR NOT
|
||||
ADD FIELD IN SQL WITH PROJECT AND PUT DESCRIPTION -> ATTACH MACHINE TO PROJECT
|
||||
|
||||
"""
|
||||
@@ -0,0 +1,7 @@
|
||||
from django.conf import settings
|
||||
from django_hosts import patterns, host
|
||||
|
||||
host_patterns = patterns('',
|
||||
host(r"django-testing", settings.ROOT_URLCONF, name="django-testing"),
|
||||
host(r"redirect", 'website_redirection.urls', name="redirect"),
|
||||
)
|
||||
@@ -9,7 +9,7 @@ https://docs.djangoproject.com/en/4.2/topics/settings/
|
||||
For the full list of settings and their values, see
|
||||
https://docs.djangoproject.com/en/4.2/ref/settings/
|
||||
"""
|
||||
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
||||
@@ -23,10 +23,11 @@ BASE_DIR = Path(__file__).resolve().parent.parent
|
||||
SECRET_KEY = 'django-insecure-71%)_#e#o9-dl2o^6mfud-*rw+4+8vy-nd*bzeier&(34ap-p9'
|
||||
|
||||
# SECURITY WARNING: don't run with debug turned on in production!
|
||||
DEBUG = True
|
||||
#DEBUG = os.getenv("DEBUG")
|
||||
DEBUG = os.getenv("DEBUG", "False").lower() in ("true", "1", "t")
|
||||
|
||||
ALLOWED_HOSTS = ['reverse.tryton.geeraert.eu','192.168.4.100','django.tryton.geeraert.eu','localhost']
|
||||
|
||||
ALLOWED_HOSTS = os.getenv("ALLOWED_HOSTS").split(",")
|
||||
|
||||
# Application definition
|
||||
|
||||
@@ -38,9 +39,11 @@ INSTALLED_APPS = [
|
||||
'django.contrib.messages',
|
||||
'django.contrib.staticfiles',
|
||||
'bootstrap5',
|
||||
'django_hosts',
|
||||
]
|
||||
|
||||
MIDDLEWARE = [
|
||||
'django_hosts.middleware.HostsRequestMiddleware',
|
||||
'django.middleware.security.SecurityMiddleware',
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'django.middleware.common.CommonMiddleware',
|
||||
@@ -48,15 +51,19 @@ MIDDLEWARE = [
|
||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||
'django.contrib.messages.middleware.MessageMiddleware',
|
||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||
'django_hosts.middleware.HostsResponseMiddleware',
|
||||
]
|
||||
|
||||
ROOT_URLCONF = 'django_code.urls'
|
||||
ROOT_HOSTCONF = 'django_code.hosts'
|
||||
DEFAULT_HOST = 'django-testing'
|
||||
|
||||
|
||||
TEMPLATES = [
|
||||
{
|
||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||
#'DIRS': ["/code/django_code/templates","/code/django_code/dashboard/templates/"],
|
||||
'DIRS': [BASE_DIR / "templates","django_code/dashboard/templates/","django_code/stash_management/templates"],
|
||||
'DIRS': [BASE_DIR / "templates","django_code/dashboard/templates/","django_code/stash_management/templates","django_code/website_redirection/templates"],
|
||||
'APP_DIRS': True,
|
||||
'OPTIONS': {
|
||||
'context_processors': [
|
||||
|
||||
@@ -25,6 +25,8 @@ from dashboard import views as dashboardview
|
||||
from kubernetes_connection import apps as kubernetes_connection
|
||||
from stash_management import apps as stashapp
|
||||
from stash_management import views as stashview
|
||||
from website_redirection import apps as website_redirectionapp
|
||||
|
||||
|
||||
urlpatterns = [
|
||||
# path('admin/', admin.site.urls),
|
||||
@@ -34,7 +36,16 @@ urlpatterns = [
|
||||
path('simpsons/', random_simpsons.simpsons),
|
||||
path('download_file/', random_simpsons.download_file),
|
||||
|
||||
################### paperless ###################
|
||||
################### Redirect ###################
|
||||
path('redirect/hello/', website_redirectionapp.hello),
|
||||
path('redirect/set/', website_redirectionapp.redirect),
|
||||
path('redirect/get/<str:key>', website_redirectionapp.display_key),
|
||||
path('redirect/go/<str:key>', website_redirectionapp.redirect_to_key),
|
||||
path('redirect/redirect-form/', website_redirectionapp.redirect_process, name='submit_form'),
|
||||
path('redirect/clearkey/', website_redirectionapp.clearkey_process, name='submit_form'),
|
||||
|
||||
|
||||
################### paperless ###################
|
||||
path('paperless/hello/', paperless_django.hello),
|
||||
# path('simpsons/', random_simpsons.simpsons),
|
||||
|
||||
@@ -59,17 +70,18 @@ urlpatterns = [
|
||||
path('kubernetes_connection/scale_up/<str:namespace_name>/<str:deploy_name>', kubernetes_connection.scale_up),
|
||||
path('kubernetes_connection/scale_down/<str:namespace_name>/<str:deploy_name>', kubernetes_connection.scale_down),
|
||||
|
||||
################## kubernetes_connection#####
|
||||
################## stash#####
|
||||
path('stash/', stashview.home),
|
||||
path('stash/hello/', stashapp.hello),
|
||||
path('stash/form/', stashapp.form),
|
||||
path('stash/incremental/', stashapp.incremental),
|
||||
path('stash/album/', stashapp.album),
|
||||
path('stash/album-form/', stashapp.album_form, name='submit_form'),
|
||||
path('stash/simple/', stashapp.simple),
|
||||
path('stash/simple-form/', stashapp.simple_form, name='submit_form'),
|
||||
path('stash/submit-form/', stashapp.handle_survey_form, name='submit_form'),
|
||||
path('stash/incremental-form/', stashapp.incremental_form, name='submit_form'),
|
||||
|
||||
|
||||
# path('bookstack/', docker_connection.apps.hello),
|
||||
# path('test/', docker_connection.apps.http_call_test),
|
||||
# path('proxmox/', docker_connection.apps.proxmox),
|
||||
|
||||
@@ -2,7 +2,6 @@ from django.apps import AppConfig
|
||||
from django.http import HttpResponse
|
||||
from django.shortcuts import render
|
||||
from django.shortcuts import redirect
|
||||
#from jinja2 import Environment, FileSystemLoader
|
||||
from django.core.files import File
|
||||
from kubernetes import client, config
|
||||
from celery import shared_task
|
||||
@@ -10,6 +9,7 @@ from celery import shared_task
|
||||
from lxml import html
|
||||
import requests
|
||||
import os
|
||||
import json
|
||||
import time
|
||||
import random
|
||||
import mimetypes
|
||||
@@ -33,7 +33,7 @@ proxies = {
|
||||
"https" : proxy_url
|
||||
}
|
||||
|
||||
destination_folder = "/tmp/stash/"
|
||||
destination_folder = "/stash/"
|
||||
|
||||
def hello(request):
|
||||
return HttpResponse('<h1>Hello stash!</h1>')
|
||||
@@ -41,7 +41,8 @@ def form(request):
|
||||
return render(request, 'stash_form.html',{})
|
||||
def album(request):
|
||||
return render(request, 'album_form.html',{})
|
||||
|
||||
def simple(request):
|
||||
return render(request, 'simple_form.html',{})
|
||||
def check_and_create_destination_folder(name):
|
||||
#check if the output directory exist and create if not
|
||||
if not os.path.isdir(destination_folder):
|
||||
@@ -89,7 +90,7 @@ def album_downloader(name,url,external_galleries):
|
||||
#search for the href that contains the galleries
|
||||
webpage_all_album_url = webpage.xpath("//a[contains(@href,'pornpics.com/galleries/')]/@href")
|
||||
#print(webpage_all_album_url[3])
|
||||
#print(webpage_all_album_url)
|
||||
#print(webpage_all_album_url)
|
||||
|
||||
|
||||
for album in webpage_all_album_url:
|
||||
@@ -116,10 +117,67 @@ def images_downloader(name,images_url_list,destination_named_folder):
|
||||
opener = urlrequest.build_opener(proxy)
|
||||
|
||||
urlrequest.install_opener(opener)
|
||||
urlrequest.urlretrieve(image_url, filename )
|
||||
try:
|
||||
urlrequest.urlretrieve(image_url, filename )
|
||||
except:
|
||||
print("Can't download "+filename+" -- "+image_url)
|
||||
individual_image_downloader.delay(image_url=image_url, filename=filename)
|
||||
|
||||
return 0
|
||||
|
||||
@shared_task()
|
||||
def individual_image_downloader(image_url, filename ):
|
||||
print("Downloading again: "+filename+" -- "+image_url)
|
||||
|
||||
opener = urlrequest.build_opener(proxy)
|
||||
|
||||
urlrequest.install_opener(opener)
|
||||
try:
|
||||
urlrequest.urlretrieve(image_url, filename )
|
||||
except:
|
||||
print("Still Can't download "+filename+" -- "+image_url+" == Cancelling")
|
||||
return 0
|
||||
|
||||
def simple_form(request):
|
||||
name = request.GET.get('name')
|
||||
reddit_downloader(username=name)
|
||||
|
||||
text_generated = "successfully sent to the reddit downloader"
|
||||
return HttpResponse(text_generated, content_type="text/plain")
|
||||
|
||||
def reddit_downloader(username):
|
||||
|
||||
#create the prerequisites folder
|
||||
destination_named_folder = check_and_create_destination_folder(name=username)
|
||||
|
||||
|
||||
|
||||
url = "https://www.reddit.com/user/"+username+"/submitted/.json?limit=1000"
|
||||
opener = urlrequest.build_opener(proxy)
|
||||
urlrequest.install_opener(opener)
|
||||
|
||||
req = urlrequest.Request(url)
|
||||
urlcurl = urlrequest.urlopen(req).read()
|
||||
data = json.loads(urlcurl)
|
||||
|
||||
picture_list=[]
|
||||
for children in data['data']['children']:
|
||||
print("adding to the list : "+children['data']['url'])
|
||||
picture_list.append(children['data']['url'])
|
||||
|
||||
images_downloader.delay(name=username,images_url_list=picture_list,destination_named_folder=destination_named_folder)
|
||||
|
||||
return 0
|
||||
|
||||
def redgif_donloader(username):
|
||||
#on te front page of the user , https://www.redgifs.com/users/princesspizookie
|
||||
# F12 and search network , find something that start as api.redgifs.com
|
||||
# and the file is search?order=new&count=40&type=g
|
||||
# copy as curl and you got the bearer
|
||||
|
||||
#curl curl 'https://api.redgifs.com/v2/users/princesspizookie/search?order=new&count=40&type=g'
|
||||
#and you get the URLS , needs to be parsedw
|
||||
return 0
|
||||
def incremental(request):
|
||||
return render(request, 'incremental_form.html',{})
|
||||
|
||||
@@ -165,9 +223,10 @@ def increment_and_download(minimum_increment,maximum_increment,url,url_suffix,na
|
||||
increment_generated ='000' + str(increment)
|
||||
|
||||
url_generated = url+increment_generated+url_suffix
|
||||
print(url_generated)
|
||||
destination_filename = increment_generated+url_suffix
|
||||
destination_file = os.path.join(destination_named_folder,destination_filename)
|
||||
|
||||
print(destination_file)
|
||||
opener = urlrequest.build_opener(proxy)
|
||||
urlrequest.install_opener(opener)
|
||||
urlrequest.urlretrieve(url_generated, destination_file )
|
||||
|
||||
@@ -10975,7 +10975,7 @@
|
||||
</div>
|
||||
<!-- Product actions-->
|
||||
<div class="card-footer p-4 pt-0 border-top-0 bg-transparent">
|
||||
<div class="text-center"><a class="btn btn-outline-dark mt-auto" href="#">Add to cart</a></div>
|
||||
<div class="text-center"><a class="btn btn-outline-dark mt-auto" href="/stash/simple">Visit</a></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,275 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<title>Simple form</title>
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto|Varela+Round">
|
||||
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
|
||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
|
||||
|
||||
<style>
|
||||
@charset "UTF-8";
|
||||
.m-b-xs {
|
||||
margin-bottom: 2%;
|
||||
}
|
||||
|
||||
.m-b-md {
|
||||
margin-bottom: 10%;
|
||||
}
|
||||
|
||||
.m-t-xs {
|
||||
margin-top: 2%;
|
||||
}
|
||||
|
||||
.m-t-sm {
|
||||
margin-top: 5%;
|
||||
}
|
||||
|
||||
* {
|
||||
outline: 0 !important;
|
||||
}
|
||||
|
||||
body {
|
||||
padding: 2% 0;
|
||||
background-color: #37404a;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-family: "Roboto", sans-serif;
|
||||
font-size: 2.2em;
|
||||
font-weight: 300;
|
||||
color: #85ffc7;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
p {
|
||||
font-family: "Roboto", sans-serif;
|
||||
font-size: 1.1em;
|
||||
font-weight: 300;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #fff;
|
||||
}
|
||||
a:hover {
|
||||
text-decoration: none;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#survey-form label,
|
||||
#survey-form .labels {
|
||||
display: block;
|
||||
margin-bottom: 2%;
|
||||
font-family: "Roboto", sans-serif;
|
||||
font-size: 1.1em;
|
||||
font-weight: 300;
|
||||
color: #fff;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
#survey-form input::-webkit-input-placeholder {
|
||||
color: transparent !important;
|
||||
}
|
||||
#survey-form input::-moz-placeholder {
|
||||
color: transparent !important;
|
||||
}
|
||||
#survey-form input:-ms-input-placeholder {
|
||||
color: transparent !important;
|
||||
}
|
||||
#survey-form input:-moz-placeholder {
|
||||
color: transparent !important;
|
||||
}
|
||||
#survey-form input,
|
||||
#survey-form select {
|
||||
display: block;
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
outline: none;
|
||||
border: 2px solid #333;
|
||||
}
|
||||
#survey-form input {
|
||||
margin-top: 1.5%;
|
||||
padding: 0 0 5px 0;
|
||||
background: transparent;
|
||||
border: none;
|
||||
outline: none;
|
||||
border-bottom: 2px solid #fff;
|
||||
font-size: 1.1em;
|
||||
font-weight: 300;
|
||||
color: #85ffc7;
|
||||
}
|
||||
#survey-form input:focus {
|
||||
border-color: #85ffc7;
|
||||
}
|
||||
#survey-form [type=checkbox],
|
||||
#survey-form [type=radio] {
|
||||
display: inline-block;
|
||||
width: auto;
|
||||
margin: 0px 10px 0 0;
|
||||
}
|
||||
#survey-form [type=checkbox],
|
||||
#survey-form [type=radio] {
|
||||
display: inline-block;
|
||||
margin: 0 10px 0 0 !important;
|
||||
position: relative;
|
||||
top: 5px;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
-webkit-appearance: none;
|
||||
-moz-appearance: none;
|
||||
-o-appearance: none;
|
||||
appearance: none;
|
||||
height: 23px;
|
||||
width: 23px;
|
||||
transition: all 0.15s ease-out 0s;
|
||||
background: #37404a;
|
||||
color: #fff;
|
||||
cursor: pointer;
|
||||
outline: none;
|
||||
z-index: 1000;
|
||||
border: 1px solid #fff;
|
||||
}
|
||||
#survey-form [type=checkbox]:hover,
|
||||
#survey-form [type=radio]:hover {
|
||||
border-color: #85ffc7;
|
||||
}
|
||||
#survey-form [type=checkbox]:checked:before,
|
||||
#survey-form [type=radio]:checked:before {
|
||||
display: inline-block;
|
||||
height: 21px;
|
||||
width: 21px;
|
||||
position: relative;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
content: "";
|
||||
text-align: center;
|
||||
font-family: "Glyphicons Halflings";
|
||||
line-height: 20px;
|
||||
font-size: 15px;
|
||||
color: #85ffc7;
|
||||
}
|
||||
#survey-form [type=checkbox]:focus,
|
||||
#survey-form [type=radio]:focus {
|
||||
outline: none;
|
||||
border-color: #fff;
|
||||
}
|
||||
#survey-form [type=radio] {
|
||||
border-radius: 50%;
|
||||
}
|
||||
#survey-form [type=radio]:after {
|
||||
border-radius: 50%;
|
||||
}
|
||||
#survey-form [type=number] {
|
||||
width: 45px;
|
||||
}
|
||||
#survey-form [type=number]::-webkit-inner-spin-button, #survey-form [type=number]::-webkit-outer-spin-button {
|
||||
-webkit-appearance: none;
|
||||
-moz-appearance: none;
|
||||
appearance: none;
|
||||
margin: 0;
|
||||
}
|
||||
#survey-form select {
|
||||
height: 40px;
|
||||
padding-left: 5px;
|
||||
background-color: #37404a;
|
||||
border: 2px solid #fff;
|
||||
color: #85ffc7;
|
||||
}
|
||||
#survey-form select option {
|
||||
padding: 5px 10px;
|
||||
font-weight: 300;
|
||||
cursor: pointer;
|
||||
}
|
||||
#survey-form select option:hover {
|
||||
background-color: #85ffc7;
|
||||
}
|
||||
#survey-form textarea {
|
||||
resize: none;
|
||||
margin-top: 2%;
|
||||
padding: 10px 10px 0px 20px;
|
||||
width: 100%;
|
||||
height: 90px;
|
||||
color: #85ffc7;
|
||||
background-color: #37404a;
|
||||
border: 2px solid #fff;
|
||||
}
|
||||
#survey-form .btn {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
margin: 3% 0 0 0;
|
||||
height: 45px;
|
||||
text-transform: uppercase;
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
border: 3px solid #85ffc7;
|
||||
border-radius: 0;
|
||||
font-weight: 500;
|
||||
font-size: 1.2em;
|
||||
color: #85ffc7;
|
||||
text-align: center;
|
||||
background: none;
|
||||
transition: color 0.25s ease;
|
||||
}
|
||||
#survey-form .btn:after {
|
||||
position: absolute;
|
||||
content: "";
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 0;
|
||||
height: 100%;
|
||||
background-color: #85ffc7;
|
||||
transform-origin: left;
|
||||
transition: width 0.5s ease;
|
||||
z-index: -1;
|
||||
}
|
||||
#survey-form .btn:hover {
|
||||
color: #37404a;
|
||||
}
|
||||
#survey-form .btn:hover:after {
|
||||
width: 100%;
|
||||
}
|
||||
#survey-form fieldset {
|
||||
margin: 5% 0 0 0;
|
||||
}
|
||||
|
||||
.copyright {
|
||||
text-align: center;
|
||||
font-size: 10px;
|
||||
color: #fff;
|
||||
}
|
||||
.copyright i {
|
||||
color: #ef5350;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 600px) {
|
||||
body {
|
||||
padding: 8% 0;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<main id="main" class="container">
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-lg-offset-3 col-lg-6">
|
||||
<div class="m-b-md text-center">
|
||||
<h1 id="title">Stash Form</h1>
|
||||
<p id="description" class="description" class="text-center">Download form</p>
|
||||
</div>
|
||||
<form method="GET" action="/stash/simple-form/" id="survey-form" name="survey-form">
|
||||
|
||||
<fieldset>
|
||||
<label for="name" id="name-label">
|
||||
Name *
|
||||
<input class="" type="text" id="name" name="name" placeholder="Enter your name (required)" required />
|
||||
</label>
|
||||
</fieldset>
|
||||
<button id="submit" type="submit" class="btn">Submit the form</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</html>
|
||||
@@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
@@ -0,0 +1,53 @@
|
||||
import redis
|
||||
from django.http import HttpResponse
|
||||
from django.http import HttpResponseRedirect
|
||||
from django.shortcuts import render
|
||||
|
||||
r = redis.Redis(
|
||||
host='django-redis-svc',
|
||||
port=6379,
|
||||
db=0 # The default Redis database index
|
||||
)
|
||||
|
||||
def hello(request):
|
||||
return HttpResponse('<h1>Hello redirect!</h1>')
|
||||
|
||||
|
||||
def redirect(request):
|
||||
return render(request, 'redirect_form.html',{})
|
||||
|
||||
def clearkey_process(request):
|
||||
key = request.GET.get('key')
|
||||
r.delete(key)
|
||||
return 0
|
||||
|
||||
def redirect_process(request):
|
||||
key = request.GET.get('key')
|
||||
value = request.GET.get('value')
|
||||
key = key.lower()
|
||||
|
||||
r.set(key, value)
|
||||
|
||||
text_generated = "successfully set "+value+" to "+key
|
||||
return HttpResponse(text_generated, content_type="text/plain")
|
||||
|
||||
def display_key(request,key):
|
||||
value = r.get(key)
|
||||
value_extracted = str(value.decode())
|
||||
text_generated = key+" is set to "+value_extracted
|
||||
return HttpResponse(text_generated, content_type="text/plain")
|
||||
|
||||
|
||||
def redirect_to_key(request,key):
|
||||
value = r.get(key)
|
||||
if value == None:
|
||||
icon_url = r.get('icon')
|
||||
if icon_url == None:
|
||||
icon_url = "https://cdn-icons-png.flaticon.com/512/6402/6402576.png"
|
||||
print(key+" is not setup, displaying default page")
|
||||
return render(request, 'blank_page.html', {'title': key,'icon_url':icon_url})
|
||||
else:
|
||||
value_extracted = str(value.decode('utf-8'))
|
||||
print(key+" is setup to : "+value_extracted)
|
||||
print(value_extracted)
|
||||
return HttpResponseRedirect(value_extracted)
|
||||
@@ -0,0 +1,3 @@
|
||||
from django.db import models
|
||||
|
||||
# Create your models here.
|
||||
@@ -0,0 +1,9 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<link rel="icon" type="image/x-icon" href="https://cdn-icons-png.flaticon.com/512/6402/6402576.png">
|
||||
<title>{{ title }}</title>
|
||||
|
||||
</head>
|
||||
|
||||
</html>
|
||||
@@ -0,0 +1,294 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<title>Redirect form</title>
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto|Varela+Round">
|
||||
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
|
||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
|
||||
|
||||
<style>
|
||||
@charset "UTF-8";
|
||||
.m-b-xs {
|
||||
margin-bottom: 2%;
|
||||
}
|
||||
|
||||
.m-b-md {
|
||||
margin-bottom: 10%;
|
||||
}
|
||||
|
||||
.m-t-xs {
|
||||
margin-top: 2%;
|
||||
}
|
||||
|
||||
.m-t-sm {
|
||||
margin-top: 5%;
|
||||
}
|
||||
|
||||
* {
|
||||
outline: 0 !important;
|
||||
}
|
||||
|
||||
body {
|
||||
padding: 2% 0;
|
||||
background-color: #37404a;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-family: "Roboto", sans-serif;
|
||||
font-size: 2.2em;
|
||||
font-weight: 300;
|
||||
color: #85ffc7;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
p {
|
||||
font-family: "Roboto", sans-serif;
|
||||
font-size: 1.1em;
|
||||
font-weight: 300;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #fff;
|
||||
}
|
||||
a:hover {
|
||||
text-decoration: none;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#survey-form label,
|
||||
#survey-form .labels {
|
||||
display: block;
|
||||
margin-bottom: 2%;
|
||||
font-family: "Roboto", sans-serif;
|
||||
font-size: 1.1em;
|
||||
font-weight: 300;
|
||||
color: #fff;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
#survey-form input::-webkit-input-placeholder {
|
||||
color: transparent !important;
|
||||
}
|
||||
#survey-form input::-moz-placeholder {
|
||||
color: transparent !important;
|
||||
}
|
||||
#survey-form input:-ms-input-placeholder {
|
||||
color: transparent !important;
|
||||
}
|
||||
#survey-form input:-moz-placeholder {
|
||||
color: transparent !important;
|
||||
}
|
||||
#survey-form input,
|
||||
#survey-form select {
|
||||
display: block;
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
outline: none;
|
||||
border: 2px solid #333;
|
||||
}
|
||||
#survey-form input {
|
||||
margin-top: 1.5%;
|
||||
padding: 0 0 5px 0;
|
||||
background: transparent;
|
||||
border: none;
|
||||
outline: none;
|
||||
border-bottom: 2px solid #fff;
|
||||
font-size: 1.1em;
|
||||
font-weight: 300;
|
||||
color: #85ffc7;
|
||||
}
|
||||
#survey-form input:focus {
|
||||
border-color: #85ffc7;
|
||||
}
|
||||
#survey-form [type=checkbox],
|
||||
#survey-form [type=radio] {
|
||||
display: inline-block;
|
||||
width: auto;
|
||||
margin: 0px 10px 0 0;
|
||||
}
|
||||
#survey-form [type=checkbox],
|
||||
#survey-form [type=radio] {
|
||||
display: inline-block;
|
||||
margin: 0 10px 0 0 !important;
|
||||
position: relative;
|
||||
top: 5px;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
-webkit-appearance: none;
|
||||
-moz-appearance: none;
|
||||
-o-appearance: none;
|
||||
appearance: none;
|
||||
height: 23px;
|
||||
width: 23px;
|
||||
transition: all 0.15s ease-out 0s;
|
||||
background: #37404a;
|
||||
color: #fff;
|
||||
cursor: pointer;
|
||||
outline: none;
|
||||
z-index: 1000;
|
||||
border: 1px solid #fff;
|
||||
}
|
||||
#survey-form [type=checkbox]:hover,
|
||||
#survey-form [type=radio]:hover {
|
||||
border-color: #85ffc7;
|
||||
}
|
||||
#survey-form [type=checkbox]:checked:before,
|
||||
#survey-form [type=radio]:checked:before {
|
||||
display: inline-block;
|
||||
height: 21px;
|
||||
width: 21px;
|
||||
position: relative;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
content: "";
|
||||
text-align: center;
|
||||
font-family: "Glyphicons Halflings";
|
||||
line-height: 20px;
|
||||
font-size: 15px;
|
||||
color: #85ffc7;
|
||||
}
|
||||
#survey-form [type=checkbox]:focus,
|
||||
#survey-form [type=radio]:focus {
|
||||
outline: none;
|
||||
border-color: #fff;
|
||||
}
|
||||
#survey-form [type=radio] {
|
||||
border-radius: 50%;
|
||||
}
|
||||
#survey-form [type=radio]:after {
|
||||
border-radius: 50%;
|
||||
}
|
||||
#survey-form [type=number] {
|
||||
width: 45px;
|
||||
}
|
||||
#survey-form [type=number]::-webkit-inner-spin-button, #survey-form [type=number]::-webkit-outer-spin-button {
|
||||
-webkit-appearance: none;
|
||||
-moz-appearance: none;
|
||||
appearance: none;
|
||||
margin: 0;
|
||||
}
|
||||
#survey-form select {
|
||||
height: 40px;
|
||||
padding-left: 5px;
|
||||
background-color: #37404a;
|
||||
border: 2px solid #fff;
|
||||
color: #85ffc7;
|
||||
}
|
||||
#survey-form select option {
|
||||
padding: 5px 10px;
|
||||
font-weight: 300;
|
||||
cursor: pointer;
|
||||
}
|
||||
#survey-form select option:hover {
|
||||
background-color: #85ffc7;
|
||||
}
|
||||
#survey-form textarea {
|
||||
resize: none;
|
||||
margin-top: 2%;
|
||||
padding: 10px 10px 0px 20px;
|
||||
width: 100%;
|
||||
height: 90px;
|
||||
color: #85ffc7;
|
||||
background-color: #37404a;
|
||||
border: 2px solid #fff;
|
||||
}
|
||||
#survey-form .btn {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
margin: 3% 0 0 0;
|
||||
height: 45px;
|
||||
text-transform: uppercase;
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
border: 3px solid #85ffc7;
|
||||
border-radius: 0;
|
||||
font-weight: 500;
|
||||
font-size: 1.2em;
|
||||
color: #85ffc7;
|
||||
text-align: center;
|
||||
background: none;
|
||||
transition: color 0.25s ease;
|
||||
}
|
||||
#survey-form .btn:after {
|
||||
position: absolute;
|
||||
content: "";
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 0;
|
||||
height: 100%;
|
||||
background-color: #85ffc7;
|
||||
transform-origin: left;
|
||||
transition: width 0.5s ease;
|
||||
z-index: -1;
|
||||
}
|
||||
#survey-form .btn:hover {
|
||||
color: #37404a;
|
||||
}
|
||||
#survey-form .btn:hover:after {
|
||||
width: 100%;
|
||||
}
|
||||
#survey-form fieldset {
|
||||
margin: 5% 0 0 0;
|
||||
}
|
||||
|
||||
.copyright {
|
||||
text-align: center;
|
||||
font-size: 10px;
|
||||
color: #fff;
|
||||
}
|
||||
.copyright i {
|
||||
color: #ef5350;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 600px) {
|
||||
body {
|
||||
padding: 8% 0;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<main id="main" class="container">
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-lg-offset-3 col-lg-6">
|
||||
<div class="m-b-md text-center">
|
||||
<h1 id="title">Redirect Form</h1>
|
||||
<p id="description" class="description" class="text-center">Download form</p>
|
||||
</div>
|
||||
<form method="GET" action="/redirect-form/" id="survey-form" name="survey-form">
|
||||
|
||||
<fieldset>
|
||||
<label for="key" id="key-label">
|
||||
Key *
|
||||
<input class="" type="text" id="key" name="key" placeholder="Enter your key (required)" required />
|
||||
</label>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<label for="value" id="value-label">
|
||||
Value *
|
||||
<input class="" type="value" id="value" name="value" placeholder="Enter the value (required)" />
|
||||
</label>
|
||||
</fieldset>
|
||||
|
||||
<button id="submit" type="submit" class="btn">Submit the form</button>
|
||||
<button id="clearkey" type="submit" formaction="/clearkey/" class="btn">Clear the key</button>
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<button type="button" onclick="location.href='/go/streaming'" class="btn">Streaming</button>
|
||||
</div>
|
||||
<div class="col">
|
||||
<button type="button" onclick="location.href='/go/streaming-sam'" class="btn">Streaming Sam</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</main>
|
||||
</html>
|
||||
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
@@ -0,0 +1,35 @@
|
||||
"""
|
||||
URL configuration for django_code project.
|
||||
|
||||
The `urlpatterns` list routes URLs to views. For more information please see:
|
||||
https://docs.djangoproject.com/en/4.2/topics/http/urls/
|
||||
Examples:
|
||||
Function views
|
||||
1. Add an import: from my_app import views
|
||||
2. Add a URL to urlpatterns: path('', views.home, name='home')
|
||||
Class-based views
|
||||
1. Add an import: from other_app.views import Home
|
||||
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
|
||||
Including another URLconf
|
||||
1. Import the include() function: from django.urls import include, path
|
||||
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
||||
"""
|
||||
from django.contrib import admin
|
||||
from django.urls import path
|
||||
from website_redirection import apps as website_redirectionapp
|
||||
|
||||
urlpatterns = [
|
||||
# path('admin/', admin.site.urls),
|
||||
|
||||
################### Redirect ###################
|
||||
path('', website_redirectionapp.redirect),
|
||||
path('hello/', website_redirectionapp.hello),
|
||||
path('set/', website_redirectionapp.redirect),
|
||||
path('get/<str:key>', website_redirectionapp.display_key),
|
||||
path('go/<str:key>', website_redirectionapp.redirect_to_key),
|
||||
path('redirect-form/', website_redirectionapp.redirect_process, name='submit_form'),
|
||||
path('clearkey/', website_redirectionapp.clearkey_process, name='submit_form'),
|
||||
|
||||
|
||||
|
||||
]
|
||||
@@ -0,0 +1,8 @@
|
||||
from django.shortcuts import render
|
||||
|
||||
# Create your views here.
|
||||
from django.http import HttpResponse
|
||||
from django.shortcuts import render
|
||||
|
||||
def hello(request):
|
||||
return HttpResponse('<h1>Hello Django!</h1>')
|
||||
@@ -0,0 +1,32 @@
|
||||
# Stage 1: Build the module
|
||||
FROM python:3
|
||||
|
||||
MAINTAINER pi-ux-ce
|
||||
|
||||
ENV PYTHONUNBUFFERED 1
|
||||
|
||||
WORKDIR /code/
|
||||
|
||||
# Install build tools and MaxMind library
|
||||
RUN apt-get update && \
|
||||
apt-get install -y git nano && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Clone the specific GeoIP2 module project
|
||||
RUN git clone -b testing https://gitea.tryton.geeraert.eu/pi-ux-ce/Django_kube.git
|
||||
|
||||
RUN pip install --cache-dir=/opt/hostedtoolcache/pip --upgrade pip
|
||||
RUN pip list --cache-dir=/opt/hostedtoolcache/pip --outdated
|
||||
RUN pip install --cache-dir=/opt/hostedtoolcache/pip --upgrade wheel
|
||||
RUN pip install --cache-dir=/opt/hostedtoolcache/pip --upgrade setuptools
|
||||
RUN pip install --cache-dir=/opt/hostedtoolcache/pip -r Django_kube/requirements.txt
|
||||
|
||||
RUN python Django_kube/django_code/manage.py migrate
|
||||
|
||||
COPY entrypoint.sh /code/entrypoint.sh
|
||||
RUN chmod +x /code/entrypoint.sh
|
||||
|
||||
EXPOSE 8000
|
||||
|
||||
ENTRYPOINT ["/code/entrypoint.sh"]
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
#!/bin/bash
|
||||
|
||||
cd Django_kube
|
||||
|
||||
#another methid but needs to rm -rf before
|
||||
#git clone --depth 1 -b main https://gitea.tryton.geeraert.eu/pi-ux-ce/Django_kube.git
|
||||
|
||||
git pull
|
||||
|
||||
pip install -r requirements.txt
|
||||
|
||||
python django_code/manage.py migrate
|
||||
|
||||
python django_code/manage.py runserver "0.0.0.0:8000"
|
||||
|
||||
+7
-6
@@ -1,11 +1,12 @@
|
||||
services:
|
||||
db:
|
||||
image: django:local
|
||||
image: docker.io/library/postgres:latest
|
||||
restart: always
|
||||
volumes:
|
||||
- type: bind
|
||||
target: /code
|
||||
source: ./django_code
|
||||
command: python manage.py runserver 0.0.0.0:7000
|
||||
- db:/var/lib/postgresql/
|
||||
ports:
|
||||
- 7000:7000
|
||||
- 5432:5432
|
||||
environment:
|
||||
POSTGRES_PASSWORD: example
|
||||
volumes:
|
||||
db:
|
||||
|
||||
+18
-1
@@ -1,9 +1,26 @@
|
||||
FROM gitea.tryton.geeraert.eu/pi-ux-ce/modified-python:latest
|
||||
FROM gitea.tryton.geeraert.eu/pi-ux-ce/python:3
|
||||
|
||||
ENV PYTHONUNBUFFERED 1
|
||||
#ENV ALLOWED_HOSTS 'django.tryton.geeraert.eu'
|
||||
#ENV DEBUG 'True'
|
||||
|
||||
ARG ALLOWED_HOSTS
|
||||
ARG DEBUG
|
||||
ENV ALLOWED_HOSTS=$ALLOWED_HOSTS
|
||||
ENV DEBUG=$DEBUG
|
||||
|
||||
WORKDIR /code/
|
||||
|
||||
# Copy only the requirements file first (Changes infrequently)
|
||||
COPY requirements.txt ./
|
||||
|
||||
|
||||
RUN pip install --cache-dir=/opt/hostedtoolcache/pip --upgrade pip
|
||||
RUN pip list --cache-dir=/opt/hostedtoolcache/pip --outdated
|
||||
RUN pip install --cache-dir=/opt/hostedtoolcache/pip --upgrade wheel
|
||||
RUN pip install --cache-dir=/opt/hostedtoolcache/pip --upgrade setuptools
|
||||
RUN pip install --cache-dir=/opt/hostedtoolcache/pip -r requirements.txt
|
||||
|
||||
# Copy the rest of your application code (Changes frequently, invalidates subsequent cache)
|
||||
COPY . ./
|
||||
RUN python django_code/manage.py migrate
|
||||
|
||||
@@ -13,3 +13,4 @@ celery
|
||||
redis
|
||||
lxml
|
||||
requests
|
||||
django-hosts
|
||||
|
||||
Reference in New Issue
Block a user