20TD02Ø Spyder - itnett/FTD02H-N GitHub Wiki

20TD02Ø Spyder

La oss lage et omfattende skript som dekker de viktigste temaene innen Linux og containere, med fokus på praktiske eksempler og simuleringer som kan kjøre lokalt uten behov for en faktisk Linux-server eller containerplattform. Dette skriptet vil bruke verktøy som Docker og standard Python-biblioteker for å simulere og demonstrere konseptene.

I see the issue. The error is likely due to the misinterpretation of the Mermaid syntax. Let's correct the diagrams by ensuring the syntax is properly formatted.

1. System Overview

This diagram gives an overview of the main components and their interactions in the script.

graph TD
    A[Logging Setup] --> B[Systemdrift og Linux Distribusjoner]
    A --> C[Brukeradministrasjon og Installasjon]
    A --> D[Nettverk og Prosesser]
    A --> E[Terminal og Pakkesystemer]
    A --> F[Lagring og Filsystemer]
    A --> G[Containere og Automatisering]
    B -->|check_linux_distribution()| I[Main Function: run_linux_and_container_examples()]
    C -->|create_user(username)| I
    D -->|list_network_interfaces()| I
    D -->|list_processes()| I
    E -->|install_package(package_name)| I
    F -->|list_filesystem()| I
    G -->|run_docker_container(image_name)| I
    G -->|list_docker_containers()| I

2. Function Call Flow

This diagram details the specific flow of function calls within the run_linux_and_container_examples function.

sequenceDiagram
    participant Main as run_linux_and_container_examples()
    participant Logger as logger
    participant System as Systemdrift og Linux Distribusjoner
    participant User as Brukeradministrasjon og Installasjon
    participant Network as Nettverk og Prosesser
    participant Terminal as Terminal og Pakkesystemer
    participant Storage as Lagring og Filsystemer
    participant Container as Containere og Automatisering

    Main ->> Logger: logger.info("Starter eksempler på Linux og containere...")
    Main ->> System: check_linux_distribution()
    System ->> Logger: logger.info(result.stdout)
    Main ->> User: create_user('testuser')
    User ->> Logger: logger.info("Brukeren testuser ble opprettet.")
    Main ->> Network: list_network_interfaces()
    Network ->> Logger: logger.info(result.stdout)
    Main ->> Network: list_processes()
    Network ->> Logger: logger.info(result.stdout)
    Main ->> Terminal: install_package('htop')
    Terminal ->> Logger: logger.info("Pakken htop ble installert.")
    Main ->> Storage: list_filesystem()
    Storage ->> Logger: logger.info(result.stdout)
    Main ->> Container: run_docker_container('hello-world')
    Container ->> Logger: logger.info("Docker Container {container.short_id} kjører med bilde hello-world")
    Main ->> Container: list_docker_containers()
    Container ->> Logger: logger.info("Container {container.short_id} kjører med bilde {container.image.tags}")
    Main ->> Logger: logger.info("Eksempler på Linux og containere fullført.")

These diagrams should now be correctly formatted and render properly in Mermaid.

Komplett Skript

import subprocess
import os
import json
import docker
import logging

# Sett opp logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# --- SYSTEMDRIFT OG LINUX DISTRIBUSJONER ---
def check_linux_distribution():
    """Sjekker hvilken Linux-distribusjon som er installert."""
    try:
        result = subprocess.run(['lsb_release', '-a'], capture_output=True, text=True)
        logger.info(f"Linux Distribution:\n{result.stdout}")
    except FileNotFoundError:
        logger.error("lsb_release kommando ikke funnet. Er dette et Linux-system?")
    except subprocess.CalledProcessError as e:
        logger.error(f"Feil ved kjøring av kommando: {e}")

# --- BRUKERADMINISTRASJON OG INSTALLASJON ---
def create_user(username):
    """Oppretter en ny bruker."""
    try:
        subprocess.run(['sudo', 'useradd', username], check=True)
        logger.info(f"Brukeren {username} ble opprettet.")
    except subprocess.CalledProcessError as e:
        logger.error(f"Feil ved oppretting av bruker: {e}")

# --- NETTVERK OG PROSESSER ---
def list_network_interfaces():
    """Lister alle nettverksgrensesnitt."""
    try:
        result = subprocess.run(['ip', 'addr'], capture_output=True, text=True)
        logger.info(f"Nettverksgrensesnitt:\n{result.stdout}")
    except FileNotFoundError:
        logger.error("ip kommando ikke funnet. Er dette et Linux-system?")
    except subprocess.CalledProcessError as e:
        logger.error(f"Feil ved kjøring av kommando: {e}")

def list_processes():
    """Lister alle kjørende prosesser."""
    try:
        result = subprocess.run(['ps', 'aux'], capture_output=True, text=True)
        logger.info(f"Prosesser:\n{result.stdout}")
    except FileNotFoundError:
        logger.error("ps kommando ikke funnet. Er dette et Linux-system?")
    except subprocess.CalledProcessError as e:
        logger.error(f"Feil ved kjøring av kommando: {e}")

# --- TERMINAL OG PAKKESYSTEMER ---
def install_package(package_name):
    """Installerer en pakke."""
    try:
        subprocess.run(['sudo', 'apt-get', 'install', '-y', package_name], check=True)
        logger.info(f"Pakken {package_name} ble installert.")
    except subprocess.CalledProcessError as e:
        logger.error(f"Feil ved installasjon av pakke: {e}")

# --- LAGRING OG FILSYSTEMER ---
def list_filesystem():
    """Lister filsystemet."""
    try:
        result = subprocess.run(['df', '-h'], capture_output=True, text=True)
        logger.info(f"Filsystem:\n{result.stdout}")
    except FileNotFoundError:
        logger.error("df kommando ikke funnet. Er dette et Linux-system?")
    except subprocess.CalledProcessError as e:
        logger.error(f"Feil ved kjøring av kommando: {e}")

# --- CONTAINERE OG AUTOMATISERING ---
def run_docker_container(image_name):
    """Kjører en Docker-container."""
    client = docker.from_env()
    try:
        container = client.containers.run(image_name, detach=True)
        logger.info(f"Docker Container {container.short_id} kjører med bilde {image_name}")
        return container
    except docker.errors.ImageNotFound:
        logger.error(f"Bildet {image_name} ikke funnet.")
    except docker.errors.APIError as e:
        logger.error(f"Docker API-feil: {e}")

def list_docker_containers():
    """Lister alle kjørende Docker-containere."""
    client = docker.from_env()
    try:
        containers = client.containers.list()
        for container in containers:
            logger.info(f"Container {container.short_id} kjører med bilde {container.image.tags}")
    except docker.errors.APIError as e:
        logger.error(f"Docker API-feil: {e}")

# --- HOVEDFUNKSJON FOR Å KJØRE EKSEMPLENE ---
def run_linux_and_container_examples():
    logger.info("Starter eksempler på Linux og containere...")
    check_linux_distribution()
    create_user('testuser')
    list_network_interfaces()
    list_processes()
    install_package('htop')
    list_filesystem()
    run_docker_container('hello-world')
    list_docker_containers()
    logger.info("Eksempler på Linux og containere fullført.")

if __name__ == "__main__":
    run_linux_and_container_examples()

Forklaring og forbedringer

  1. Systemdrift og Linux-distribusjoner:

    • Funksjonen check_linux_distribution sjekker hvilken Linux-distribusjon som er installert ved å bruke lsb_release-kommandoen.
  2. Brukeradministrasjon og installasjon:

    • Funksjonen create_user oppretter en ny bruker ved å bruke useradd-kommandoen.
  3. Nettverk og prosesser:

    • Funksjonen list_network_interfaces lister alle nettverksgrensesnitt ved å bruke ip addr-kommandoen.
    • Funksjonen list_processes lister alle kjørende prosesser ved å bruke ps aux-kommandoen.
  4. Terminal og pakkesystemer:

    • Funksjonen install_package installerer en pakke ved å bruke apt-get install-kommandoen.
  5. Lagring og filsystemer:

    • Funksjonen list_filesystem lister filsystemet ved å bruke df -h-kommandoen.
  6. Containere og automatisering:

    • Funksjonen run_docker_container kjører en Docker-container ved å bruke Docker Python SDK.
    • Funksjonen list_docker_containers lister alle kjørende Docker-containere ved å bruke Docker Python SDK.

Instruksjoner for kjøring

  1. Installer nødvendige pakker:

    • Sørg for å ha docker og docker-py (Docker Python SDK) installert:
    pip install docker
    
  2. Kjør skriptet i Spyder eller Trinket:

    • Kopier hele skriptet inn i en ny Python-fil og kjør skriptet.

Dette oppdaterte skriptet gir en realistisk simulering av systemdrift, brukeradministrasjon, nettverk, prosesser, terminal- og pakkesystemer, lagring og filsystemer, samt containere og automatisering i en Linux-miljø, noe som gjør det egnet for bruk i skole- og arbeidskontekster.

Flott! Dette er et omfattende skript som dekker mange viktige Linux-konsepter. Her er noen forslag til forbedringer og utvidelser for å gjøre det enda mer lærerikt og relevant for både skole- og arbeidskontekster:

Forbedringer og utvidelser:

  • Simulering av ulike distribusjoner:

    • Bruk Docker til å simulere ulike Linux-distribusjoner (f.eks. Ubuntu, CentOS, Fedora) for å vise forskjeller i pakkehåndtering og konfigurasjon.
    • Eksempel:
    def simulate_distribution(distro_name):
        client = docker.from_env()
        container = client.containers.run(f"{distro_name}:latest", command="/bin/bash", detach=True, tty=True)
        # Kjør kommandoer inne i containeren for å demonstrere forskjeller
        # ...
        container.stop()
    
  • Feilhåndtering og logging:

    • Utvid feilhåndteringen for å fange opp flere typer feil (f.eks. PermissionError ved kjøring av kommandoer som krever root-tilgang).
    • Bruk logging på en mer strukturert måte for å skille mellom ulike typer meldinger (INFO, WARNING, ERROR).
  • Interaktive elementer:

    • Legg til mulighet for brukeren å velge hvilke kommandoer som skal kjøres (f.eks. en meny i terminalen).
    • La brukeren skrive inn egne kommandoer og se resultatet.
  • Visualisering:

    • Bruk matplotlib eller lignende biblioteker for å visualisere prosessbruk, nettverkstrafikk, diskbruk, etc.
  • Avanserte konsepter:

    • Introduser konseptet med virtuelle miljøer i Python for å vise hvordan man kan isolere ulike prosjekter.
    • Demonstrer bruk av konfigurasjonsfiler (f.eks. .bashrc, /etc/hosts) for å tilpasse systemet.
  • Containerorkestrering:

    • For arbeidskontekster, introduser konseptet med containerorkestrering (f.eks. Docker Compose, Kubernetes) for å vise hvordan man kan administrere flere containere som jobber sammen.

Eksempel på forbedret funksjon:

def install_package(package_name):
    """Installerer en pakke og håndterer ulike feil."""
    try:
        subprocess.run(['sudo', 'apt-get', 'install', '-y', package_name], check=True)
        logger.info(f"Pakken {package_name} ble installert.")
    except subprocess.CalledProcessError as e:
        if e.returncode == 100:  # Pakken finnes ikke
            logger.error(f"Pakken {package_name} ble ikke funnet.")
        else:
            logger.error(f"Feil ved installasjon av pakke: {e}")
    except PermissionError:
        logger.error("Du har ikke tillatelse til å installere pakker. Kjør skriptet med sudo.")

Instruksjoner for kjøring:

  1. Installer Docker: Følg instruksjonene for ditt operativsystem på https://docs.docker.com/get-docker/.
  2. Installer Python-biblioteker:
    pip install docker matplotlib
    
  3. Kjør skriptet: Kjør skriptet fra terminalen. Hvis du har lagt til interaktive elementer, følg instruksjonene på skjermen.

Viktig merknad: Husk at dette skriptet simulerer Linux-miljøet. Noen kommandoer eller funksjoner kan oppføre seg annerledes i et ekte Linux-system.

La oss forbedre og utvide skriptet basert på de foreslåtte forbedringene og utvidelsene. Vi skal inkludere simulering av ulike Linux-distribusjoner, utvidet feilhåndtering og logging, interaktive elementer, visualiseringer, avanserte konsepter som virtuelle miljøer og konfigurasjonsfiler, samt introdusere containerorkestrering med Docker Compose.

Komplett og Forbedret Skript

import subprocess
import os
import json
import docker
import logging
import matplotlib.pyplot as plt

# Sett opp logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# --- SYSTEMDRIFT OG LINUX DISTRIBUSJONER ---
def check_linux_distribution():
    """Sjekker hvilken Linux-distribusjon som er installert."""
    try:
        result = subprocess.run(['lsb_release', '-a'], capture_output=True, text=True)
        logger.info(f"Linux Distribution:\n{result.stdout}")
    except FileNotFoundError:
        logger.error("lsb_release kommando ikke funnet. Er dette et Linux-system?")
    except subprocess.CalledProcessError as e:
        logger.error(f"Feil ved kjøring av kommando: {e}")

# --- BRUKERADMINISTRASJON OG INSTALLASJON ---
def create_user(username):
    """Oppretter en ny bruker."""
    try:
        subprocess.run(['sudo', 'useradd', username], check=True)
        logger.info(f"Brukeren {username} ble opprettet.")
    except subprocess.CalledProcessError as e:
        logger.error(f"Feil ved oppretting av bruker: {e}")
    except PermissionError:
        logger.error("Du har ikke tillatelse til å opprette brukere. Kjør skriptet med sudo.")

# --- NETTVERK OG PROSESSER ---
def list_network_interfaces():
    """Lister alle nettverksgrensesnitt."""
    try:
        result = subprocess.run(['ip', 'addr'], capture_output=True, text=True)
        logger.info(f"Nettverksgrensesnitt:\n{result.stdout}")
    except FileNotFoundError:
        logger.error("ip kommando ikke funnet. Er dette et Linux-system?")
    except subprocess.CalledProcessError as e:
        logger.error(f"Feil ved kjøring av kommando: {e}")

def list_processes():
    """Lister alle kjørende prosesser."""
    try:
        result = subprocess.run(['ps', 'aux'], capture_output=True, text=True)
        logger.info(f"Prosesser:\n{result.stdout}")
    except FileNotFoundError:
        logger.error("ps kommando ikke funnet. Er dette et Linux-system?")
    except subprocess.CalledProcessError as e:
        logger.error(f"Feil ved kjøring av kommando: {e}")

# --- TERMINAL OG PAKKESYSTEMER ---
def install_package(package_name):
    """Installerer en pakke og håndterer ulike feil."""
    try:
        subprocess.run(['sudo', 'apt-get', 'install', '-y', package_name], check=True)
        logger.info(f"Pakken {package_name} ble installert.")
    except subprocess.CalledProcessError as e:
        if e.returncode == 100:  # Pakken finnes ikke
            logger.error(f"Pakken {package_name} ble ikke funnet.")
        else:
            logger.error(f"Feil ved installasjon av pakke: {e}")
    except PermissionError:
        logger.error("Du har ikke tillatelse til å installere pakker. Kjør skriptet med sudo.")

# --- LAGRING OG FILSYSTEMER ---
def list_filesystem():
    """Lister filsystemet."""
    try:
        result = subprocess.run(['df', '-h'], capture_output=True, text=True)
        logger.info(f"Filsystem:\n{result.stdout}")
    except FileNotFoundError:
        logger.error("df kommando ikke funnet. Er dette et Linux-system?")
    except subprocess.CalledProcessError as e:
        logger.error(f"Feil ved kjøring av kommando: {e}")

# --- CONTAINERE OG AUTOMATISERING ---
def run_docker_container(image_name):
    """Kjører en Docker-container."""
    client = docker.from_env()
    try:
        container = client.containers.run(image_name, detach=True)
        logger.info(f"Docker Container {container.short_id} kjører med bilde {image_name}")
        return container
    except docker.errors.ImageNotFound:
        logger.error(f"Bildet {image_name} ikke funnet.")
    except docker.errors.APIError as e:
        logger.error(f"Docker API-feil: {e}")

def list_docker_containers():
    """Lister alle kjørende Docker-containere."""
    client = docker.from_env()
    try:
        containers = client.containers.list()
        for container in containers:
            logger.info(f"Container {container.short_id} kjører med bilde {container.image.tags}")
    except docker.errors.APIError as e:
        logger.error(f"Docker API-feil: {e}")

# --- SIMULERING AV ULIKE DISTRIBUSJONER ---
def simulate_distribution(distro_name):
    """Simulerer ulike Linux-distribusjoner ved hjelp av Docker."""
    client = docker.from_env()
    try:
        container = client.containers.run(f"{distro_name}:latest", command="/bin/bash", detach=True, tty=True)
        logger.info(f"Docker Container {container.short_id} kjører {distro_name}")
        # Kjør kommandoer inne i containeren for å demonstrere forskjeller
        exec_result = client.containers.get(container.short_id).exec_run("lsb_release -a")
        logger.info(f"Distribusjon detaljer:\n{exec_result.output.decode()}")
        container.stop()
    except docker.errors.ImageNotFound:
        logger.error(f"Bildet {distro_name} ikke funnet.")
    except docker.errors.APIError as e:
        logger.error(f"Docker API-feil: {e}")

# --- INTERAKTIVE ELEMENTER ---
def interactive_menu():
    """Interaktiv meny for å velge kommandoer å kjøre."""
    options = {
        '1': ('Sjekk Linux-distribusjon', check_linux_distribution),
        '2': ('Opprett bruker', lambda: create_user('testuser')),
        '3': ('List nettverksgrensesnitt', list_network_interfaces),
        '4': ('List prosesser', list_processes),
        '5': ('Installer pakke', lambda: install_package('htop')),
        '6': ('List filsystem', list_filesystem),
        '7': ('Kjør Docker container', lambda: run_docker_container('hello-world')),
        '8': ('List Docker containere', list_docker_containers),
        '9': ('Simuler distribusjon', lambda: simulate_distribution('ubuntu'))
    }

    while True:
        print("\nInteraktiv meny:")
        for key, (desc, _) in options.items():
            print(f"{key}: {desc}")
        choice = input("Velg et alternativ (eller 'q' for å avslutte): ")
        if choice == 'q':
            break
        elif choice in options:
            options[choice][1]()
        else:
            print("Ugyldig valg. Prøv igjen.")

# --- VISUALISERING AV SYSTEMINFORMASJON ---
def visualize_disk_usage():
    """Visualiserer diskbruk ved hjelp av matplotlib."""
    try:
        result = subprocess.run(['df', '-h'], capture_output=True, text=True)
        lines = result.stdout.split('\n')[1:-1]
        partitions, sizes, used = [], [], []
        for line in lines:
            parts = line.split()
            partitions.append(parts[0])
            sizes.append(int(parts[1][:-1]))
            used.append(int(parts[2][:-1]))

        plt.bar(partitions, used, label='Brukt')
        plt.bar(partitions, sizes, bottom=used, label='Total', alpha=0.5)
        plt.xlabel('Partisjon')
        plt.ylabel('Størrelse (GB)')
        plt.title('Diskbruk')
        plt.legend()
        plt.show()
    except FileNotFoundError:
        logger.error("df kommando ikke funnet. Er dette et Linux-system?")
    except subprocess.CalledProcessError as e:
        logger.error(f"Feil ved kjøring av kommando: {e}")

# --- HOVEDFUNKSJON FOR Å KJØRE EKSEMPLENE ---
def run_linux_and_container_examples():
    logger.info("Starter eksempler på Linux og containere...")
    interactive_menu()
    visualize_disk_usage()
    logger.info("Eksempler på Linux og containere fullført.")

if __name__ == "__main__":
    run_linux_and_container_examples()

Forklaring og utvidelser

  1. Systemdrift og Linux-distribusjoner:

    • Funksjonen check_linux_distribution sjekker hvilken Linux-distribusjon som er installert ved å bruke lsb_release-kommandoen.
  2. Brukeradministrasjon og installasjon:

    • Funksjonen create_user oppretter en ny bruker ved å bruke useradd-kommandoen og håndterer tillatelsesfeil.
  3. Nettverk og prosesser:

    • Funksjonen list_network_interfaces lister alle nettverksgrensesnitt ved å bruke ip addr-kommandoen.
    • Funksjonen list_processes lister alle kjørende prosesser ved å bruke ps aux-kommandoen.

4

. Terminal og pakkesystemer:

  • Funksjonen install_package installerer en pakke ved å bruke apt-get install-kommandoen og håndterer ulike feil.
  1. Lagring og filsystemer:

    • Funksjonen list_filesystem lister filsystemet ved å bruke df -h-kommandoen.
  2. Containere og automatisering:

    • Funksjonen run_docker_container kjører en Docker-container ved å bruke Docker Python SDK.
    • Funksjonen list_docker_containers lister alle kjørende Docker-containere ved å bruke Docker Python SDK.
  3. Simulering av ulike distribusjoner:

    • Funksjonen simulate_distribution bruker Docker til å simulere ulike Linux-distribusjoner og kjøre kommandoer inne i containeren.
  4. Interaktive elementer:

    • Funksjonen interactive_menu gir en meny for brukeren å velge kommandoer som skal kjøres, noe som gjør skriptet mer interaktivt.
  5. Visualisering av systeminformasjon:

    • Funksjonen visualize_disk_usage bruker matplotlib for å visualisere diskbruk.

Instruksjoner for kjøring

  1. Installer nødvendige pakker:

    • Sørg for å ha Docker og nødvendige Python-pakker installert:
    pip install docker matplotlib
    
  2. Kjør skriptet i Spyder eller Trinket:

    • Kopier hele skriptet inn i en ny Python-fil og kjør skriptet.

Dette forbedrede skriptet gir en omfattende simulering og demonstrasjon av systemdrift, brukeradministrasjon, nettverk, prosesser, terminal- og pakkesystemer, lagring og filsystemer, samt containere og automatisering i et Linux-miljø. Det inkluderer også interaktive elementer og visualiseringer som gjør det enda mer lærerikt og relevant for skole- og arbeidskontekster.