itlsoft / lb

0 stars 0 forks source link

RestAPI #4

Open itlsoft opened 1 year ago

itlsoft commented 1 year ago
from flask import Flask, jsonify, request, abort
from flask_httpauth import HTTPBasicAuth
import subprocess

app = Flask(__name__)
auth = HTTPBasicAuth()

# Twoja baza użytkowników i haseł
# W prawdziwej aplikacji powinieneś używać bezpiecznego składowania haseł
users = {
    "admin": "password"
}

@auth.verify_password
def verify_password(username, password):
    if username in users and users.get(username) == password:
        return username

@app.route('/api/service/<service_name>/stop', methods=['POST'])
@auth.login_required
def stop_service(service_name):
    process = subprocess.run(f'net stop {service_name}', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    if process.returncode != 0:
        return jsonify({"error": process.stderr.decode()})
    return jsonify({"message": process.stdout.decode()})

@app.route('/api/service/<service_name>/start', methods=['POST'])
@auth.login_required
def start_service(service_name):
    process = subprocess.run(f'net start {service_name}', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    if process.returncode != 0:
        return jsonify({"error": process.stderr.decode()})
    return jsonify({"message": process.stdout.decode()})

@app.route('/api/service/<service_name>/restart', methods=['POST'])
@auth.login_required
def restart_service(service_name):
    stop_process = subprocess.run(f'net stop {service_name}', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    if stop_process.returncode != 0:
        return jsonify({"error": stop_process.stderr.decode()})

    start_process = subprocess.run(f'net start {service_name}', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    if start_process.returncode != 0:
        return jsonify({"error": start_process.stderr.decode()})

    return jsonify({"message": f'{stop_process.stdout.decode()} {start_process.stdout.decode()}'})

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8888, ssl_context='adhoc')  # ssl_context='adhoc' generuje tymczasowy certyfikat SSL
itlsoft commented 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)
itlsoft commented 1 year ago
{% 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 %}
itlsoft commented 1 year ago

dragon (2)

itlsoft commented 1 year ago
{% 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 %}
itlsoft commented 1 year ago
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 ...
itlsoft commented 1 year ago
<!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>
itlsoft commented 1 year ago
<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">&times;</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>
itlsoft commented 1 year ago
$(document).ready(function() {
    $('#removeModal').on('show.bs.modal', function(e) {
        var itemId = $(e.relatedTarget).data('id');
        $('#itemId').val(itemId);
    });
});
itlsoft commented 1 year ago
$(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);
    });
});
itlsoft commented 1 year ago
<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>
itlsoft commented 1 year ago
<!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>
itlsoft commented 1 year ago
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)
itlsoft commented 1 year ago

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.

itlsoft commented 1 year ago
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}")
itlsoft commented 1 year ago
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}.")
itlsoft commented 1 year ago
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)