Open itlsoft opened 1 year ago
from flask import Flask, render_template, request, redirect, url_for, flash
from flask_bootstrap import Bootstrap
import requests
from requests.auth import HTTPBasicAuth
app = Flask(__name__)
app.config['SECRET_KEY'] = 'my-secret-key' # W prawdziwej aplikacji użyj bezpiecznego klucza
Bootstrap(app)
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
service_name = request.form.get('service_name')
action = request.form.get('action')
response = requests.post(
f'https://appmanager.com:8888/api/service/{service_name}/{action}',
auth=HTTPBasicAuth('admin', 'password'),
verify=False # To powinno być ustawione na True w prawdziwej aplikacji, ale wymaga prawidłowego certyfikatu SSL
)
if response.status_code == 200:
flash(f'Usługa {service_name} została {action}ed.', 'success')
else:
flash(f'Błąd podczas {action}ing usługi {service_name}: {response.content.decode()}', 'danger')
return redirect(url_for('index'))
return render_template('index.html')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
{% extends "bootstrap/base.html" %}
{% block content %}
<div class="container">
<h1>Zarządzanie usługami</h1>
<form method="POST">
<div class="form-group">
<label for="service_name">Nazwa usługi</label>
<input type="text" class="form-control" id="service_name" name="service_name" required>
</div>
<button type="submit" class="btn btn-primary" name="action" value="stop">Zatrzymaj usługę</button>
<button type="submit" class="btn btn-primary" name="action" value="start">Uruchom usługę</button>
<button type="submit" class="btn btn-primary" name="action" value="restart">Restartuj usługę</button>
</form>
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
{% for category, message in messages %}
<div class="alert alert-{{ category }} mt-4">
{{ message }}
</div>
{% endfor %}
{% endif %}
{% endwith %}
</div>
{% endblock %}
{% extends "bootstrap/base.html" %}
{% block content %}
<div class="container">
<h1>Zarządzanie usługami</h1>
<table class="table" id="services">
<thead>
<tr>
<th>Nazwa usługi</th>
<th>Status</th>
</tr>
</thead>
<tbody>
{% for service in services %}
<tr>
<td>{{ service }}</td>
<td id="{{ service }}-status">Trwa ładowanie...</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
$(document).ready(function() {
var services = {{ services|tojson }}; // Przekształcamy listę usług na format JSON
var token = "{{ token }}"; // Pobieramy token JWT
services.forEach(function(service) {
$.ajax({
url: "https://appmanager.com:8888/api/service/" + service + "/status",
headers: { "Authorization": "Bearer " + token },
success: function(data) {
$("#" + service + "-status").text(data.status); // Aktualizujemy status usługi w tabeli
},
error: function() {
$("#" + service + "-status").text("Błąd ładowania statusu"); // Wyświetlamy błąd, jeśli nie udało się pobrać statusu
}
});
});
});
</script>
{% endblock %}
from flask import Flask, render_template, session
from flask_bootstrap import Bootstrap
app = Flask(__name__)
app.config['SECRET_KEY'] = 'my-secret-key' # W prawdziwej aplikacji użyj bezpiecznego klucza
Bootstrap(app)
@app.route('/')
def index():
if 'access_token' in session:
services = ["Service1", "Service2", "Service3"] # Tutaj wprowadź prawdziwe nazwy usług
return render_template('index.html', services=services, token=session['access_token'])
else:
return redirect(url_for('login'))
# ... pozostały kod ...
<!DOCTYPE html>
<html>
<head>
<title>Formularz</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
$(document).ready(function() {
// Sprawdź, czy wszystkie pola są wypełnione
function checkFields() {
let allFilled = true;
$('input, select').each(function() {
if ($(this).val() === '') {
allFilled = false;
return false; // Przerwij pętlę
}
});
return allFilled;
}
// Aktualizuj stan przycisku submit przy każdej zmianie w polach formularza
$('input, select').change(function() {
if (checkFields()) {
$('#submit-button').removeAttr('disabled');
} else {
$('#submit-button').attr('disabled', 'disabled');
}
});
});
</script>
</head>
<body>
<form>
<input type="text" name="input1">
<input type="text" name="input2">
<input type="text" name="input3">
<select name="select1">
<option value="">Wybierz...</option>
<option value="option1">Opcja 1</option>
<option value="option2">Opcja 2</option>
</select>
<select name="select2">
<option value="">Wybierz...</option>
<option value="option1">Opcja 1</option>
<option value="option2">Opcja 2</option>
</select>
<input type="submit" id="submit-button" disabled>
</form>
</body>
</html>
<table>
{% for item in items %}
<tr>
<td>{{ item.name }}</td>
<td>{{ item.description }}</td>
<td>
<button type="button" class="btn btn-danger remove" data-toggle="modal" data-target="#removeModal" data-id="{{ item.id }}">
Remove
</button>
</td>
</tr>
{% endfor %}
</table>
<!-- Modal -->
<div class="modal fade" id="removeModal" tabindex="-1" role="dialog" aria-labelledby="removeModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="removeModalLabel">Czy na pewno chcesz usunąć?</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<form id="removeForm" action="/remove" method="POST">
<input type="hidden" id="itemId" name="item_id" value="">
<button type="submit" class="btn btn-danger">Usuń</button>
<button type="button" class="btn btn-secondary" data-dismiss="modal">Anuluj</button>
</form>
</div>
</div>
</div>
</div>
$(document).ready(function() {
$('#removeModal').on('show.bs.modal', function(e) {
var itemId = $(e.relatedTarget).data('id');
$('#itemId').val(itemId);
});
});
$(document).ready(function() {
$('#removeModal').on('show.bs.modal', function(e) {
var button = $(e.relatedTarget);
var itemId = button.data('id');
var appID = button.siblings('.AppID').val();
var appDescr = button.siblings('.AppDescr').val();
$('#itemId').val(itemId);
$('#modalAppID').val(appID);
$('#modalAppDescr').val(appDescr);
});
});
<script type="text/javascript" charset="utf-8">
var socket = io.connect('http://' + document.domain + ':' + location.port);
socket.on('connect', function() {
setInterval(function() {
var deploymentid = $('#deploymentid').val(); // Przyjmując, że 'deploymentid' to identyfikator elementu formularza, z którego pobierasz wartość
socket.emit('request_for_data', { 'deploymentid': deploymentid });
}, 5000); // Odpowiednie zapytanie co 5 sekund
});
socket.on('update_data', function(msg) {
$('#data').html('');
for(var i=0; i<msg.data.length; i++) {
$('#data').append($('<p>').text(msg.data[i]));
}
});
</script>
<!DOCTYPE html>
<html>
<head>
<title>Socket.IO Example</title>
</head>
<body>
<div class="progress">
<div class="progress-bar" role="progressbar" aria-valuenow="" aria-valuemin="0" aria-valuemax="100" style="width: 0%;">
<span id="status"></span>
</div>
</div>
<input type="hidden" name="deploymentid" id="deploymentid" value="your_value">
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js"></script>
<script type="text/javascript" charset="utf-8">
var socket = io.connect('http://' + document.domain + ':' + location.port);
socket.on('connect', function() {
setInterval(function() {
var deploymentid = $('#deploymentid').val();
socket.emit('request_for_data', { 'deploymentid': deploymentid });
}, 5000);
});
socket.on('update_data', function(msg) {
$('.progress-bar').attr('aria-valuenow', msg.ProgressValue).css('width', msg.ProgressValue + '%');
$('#status').text(msg.StatusName);
});
</script>
</body>
</html>
import os
import shutil
def remove_directory(dir_path):
# Usuń wszystkie pliki w katalogu
for root, dirs, files in os.walk(dir_path, topdown=False):
for name in files:
file_path = os.path.join(root, name)
os.chmod(file_path, 0o777)
os.remove(file_path)
# Usuń wszystkie podkatalogi
for name in dirs:
dir_path = os.path.join(root, name)
os.rmdir(dir_path)
# Usuń katalog
os.rmdir(dir_path)
# A potem wywołaj funkcję:
if os.path.exists(repo_path):
remove_directory(repo_path)
aplikacja sprawdza status deploymentu np id=5, scheduler przechwytuje rzadzanie wraz z wartoscia kolumny "Data" w tabeli Deployment. Przekazujemy wartosc "data" czyli nazwe pliku zip (unikalna)
chyba zostaniemy przy opcji rownoleglego repo na serwerze AppDeployera i najpierw Clone, pozniej Pull. Jesli Pull i to korzystamy z obecnej logiki i pakujemy wszystkie pliki do ZIpa i wysylamy na serwer. Tam rozpakowujemy jakas metoda trzeba porowna unzipped z aktuyalnym repo i skopiowac.
import os
import shutil
import datetime
def create_backup(GitLocalPath, excluded_from_backup):
# Krok 1: Tworzenie folderu _tempzip i określenie temp_path
temp_zip_folder = os.path.join(GitLocalPath, '_tempzip')
last_folder_name = os.path.basename(GitLocalPath)
temp_path = os.path.join(temp_zip_folder, last_folder_name)
os.makedirs(temp_path, exist_ok=True)
# Krok 2: Kopiowanie plików/folderów z wyjątkiem tych w excluded_from_backup i _tempzip
for item in os.listdir(GitLocalPath):
source_item = os.path.join(GitLocalPath, item)
dest_item = os.path.join(temp_path, item)
if item not in excluded_from_backup and item != '_tempzip':
if os.path.isdir(source_item):
shutil.copytree(source_item, dest_item)
else:
shutil.copy2(source_item, dest_item)
# Krok 3: Tworzenie archiwum .zip
current_datetime = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
zip_name = os.path.join(temp_zip_folder, f"{last_folder_name}_{current_datetime}")
created_zip = shutil.make_archive(zip_name, 'zip', temp_zip_folder, last_folder_name)
# Krok 4: Przenoszenie archiwum do GitLocalPath
shutil.move(created_zip, GitLocalPath)
created_zip = os.path.join(GitLocalPath, os.path.basename(created_zip))
# Krok 5: Usuwanie folderu _tempzip
shutil.rmtree(temp_zip_folder)
return created_zip
# Przykład użycia:
GitLocalPath = 'C:\\Temp\\App'
excluded_from_backup = ['__pycache__', '_DragonDeployment', 'venv', 'cert', '.flaskenv', 'config.py']
backup_zip = create_backup(GitLocalPath, excluded_from_backup)
print(f"Created backup at: {backup_zip}")
import os
def synchronize_folders(source_path, destination_path, excluded_files=[]):
"""
Synchronizuje zawartość source_path z destination_path za pomocą narzędzia robocopy.
Tylko zmienione pliki zostaną zaktualizowane, ale stare pliki i foldery nie zostaną usunięte.
Pliki i foldery z listy excluded_files są pomijane podczas synchronizacji.
Parametry:
- source_path (str): Ścieżka źródłowa.
- destination_path (str): Ścieżka docelowa.
- excluded_files (list): Lista plików i folderów do wykluczenia z synchronizacji.
Zwraca:
- int: Kod wynikowy wywołania komendy robocopy (0 oznacza sukces).
"""
# Bazowa komenda robocopy
command = f'robocopy "{source_path}" "{destination_path}"'
# Dodanie flag do komendy
command += " /XO" # Wykluczenie starszych plików
command += " /E" # Kopiowanie podfolderów, również pustych
# Dodanie plików i folderów do wykluczenia
for item in excluded_files:
command += f' /XD "{item}"' # Wykluczenie folderów
command += f' /XF "{item}"' # Wykluczenie plików
# Wywołanie komendy i zwrócenie kodu wynikowego
return os.system(command)
# Przykład użycia:
source = "C:\\Temp\\DragonDeploymentTest\\AppX"
destination = "C:\\Temp\\AppX"
excluded = ['C:\\Temp\\AppX\\config.py', 'C:\\Temp\\AppX\\temp']
result = synchronize_folders(source, destination, excluded)
if result == 0:
print("Synchronizacja zakończona pomyślnie!")
else:
print(f"Wystąpił błąd podczas synchronizacji. Kod błędu: {result}.")
import os
import shutil
def apply_git_changes(source_path, destination_path, excluded, db_changes):
"""
Aplikuje zmiany z repozytorium Git do folderu docelowego.
Parametry:
- source_path (str): Ścieżka źródłowa (repozytorium Git).
- destination_path (str): Ścieżka docelowa (folder, który ma zostać zaktualizowany).
- excluded (list): Lista plików/folderów, które mają zostać pominięte podczas aktualizacji.
- db_changes (list): Lista zmian z bazy danych. Każda zmiana to krotka (ścieżka_pliku, status).
"""
for file_path, status in db_changes:
absolute_source = os.path.join(source_path, file_path)
absolute_dest = os.path.join(destination_path, file_path)
if file_path in excluded:
continue
if status == "git_changed":
if os.path.exists(absolute_dest):
os.remove(absolute_dest)
shutil.copy(absolute_source, absolute_dest)
elif status == "git_renamed":
# W przypadku zmiany nazwy potrzebujemy zarówno starej, jak i nowej nazwy. Zakładam, że nowa nazwa jest w `file_path`,
# a stara nazwa jest zapisana jako część wartości `status` (np. "git_renamed:old_name.txt")
old_name = status.split(":")[1]
old_dest = os.path.join(destination_path, old_name)
if os.path.exists(old_dest):
os.rename(old_dest, absolute_dest)
elif status == "git_deleted":
if os.path.exists(absolute_dest):
os.remove(absolute_dest)
elif status == "git_new":
shutil.copy(absolute_source, absolute_dest)
# Przykład użycia:
source = "C:\\Temp\\YourGitRepo"
destination = "C:\\Temp\\DestinationFolder"
excluded_files = ['C:\\Temp\\DestinationFolder\\config.py', 'C:\\Temp\\DestinationFolder\\temp']
# Zakładam, że te zmiany pochodzą z bazy danych
db_changes_list = [
('file1.txt', 'git_changed'),
('file2.txt', 'git_deleted'),
('file3.txt', 'git_new'),
('old_name.txt', 'git_renamed:new_name.txt')
]
apply_git_changes(source, destination, excluded_files, db_changes_list)