Aktuelles
Digital Eliteboard - Das Digitale Technik Forum

Registriere dich noch heute kostenlos, um Mitglied zu werden! Sobald du angemeldet bist, kannst du auf unserer Seite aktiv teilnehmen, indem du deine eigenen Themen und Beiträge erstellst und dich über deinen eigenen Posteingang mit anderen Mitgliedern unterhalten kannst! Zudem bekommst du Zutritt zu Bereichen, welche für Gäste verwehrt bleiben

Registriere dich noch heute kostenlos, um Mitglied zu werden! Sobald du angemeldet bist, kannst du auf unserer Seite aktiv teilnehmen, indem du deine eigenen Themen und Beiträge erstellst und dich über deinen eigenen Posteingang mit anderen Mitgliedern unterhalten kannst! Zudem bekommst du Zutritt zu Bereichen, welche für Gäste verwehrt bleiben

Portals

salidos

Moderator
Teammitglied
Registriert
17. Februar 2008
Beiträge
14.328
Lösungen
3
Reaktionspunkte
9.765
Punkte
1.093
Portals Docker

Dockerversion installieren:

Dateien auf Server entpacken.
Dann: sudo bash portals.sh und Anweisungen folgen.

Standalone Version:

Auf Server entpacken.
Alle Rechte für alle Dateien und Ordner rekursiv auf www-data und 755 setzen

Nach Installation:
im Browser öffnen.

Beim erstmaligen Start zum Einloggen eure gewünschten Daten ein geben, die ihr ab dann nutzen möchtet.

(Falls etwas nicht funktionieren sollte, setzt einmal testweise alle files und folders im Host-System für Portals auf 33 (nicht auf www-data))


(Einzelversionen in der Historie)

Was ihr machen müsst:

M3U-Editor und Cron
Code:
CRON JOBS MANAGING HINZUGEFÜGT

VORAUSSETZUNG:
Cron und sudo muss installiert und cron im Docker gestartet worden sein
Befehl im DOCKER Image ausführen

docker exec -it your-container-name apt install -y sudo

docker exec -it your-container-name service cron start

docker exec -it your-container-name /bin/bash

bash -c "echo 'www-data ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/www-data && chmod 440 /etc/sudoers.d/www-data && chown -R www-data:www-data /var/spool/cron && chmod -R 755 /var/spool/cron && (pgrep cron || cron)"

Kontrollieren ab alle jeder Ordner im Pfad auf www-data gesetzt wurde:

ls -ld /var /var/spool /var/spool/cron /var/spool/cron/crontabs /var/spool/cron/crontabs/www-data

Wenn nicht. Händisch erledigen.

Cron für re-check auf Sonntag gelegt.

/cron/crontabs/www-data

Wenn nicht. Händisch erledigen.

Cron für re-check auf Sonntag gelegt.




M3U EDITOR

Im Docker Image muss die php.ini angepasst werden, um alle dateigrößen verarbeiten zu können.

post_max_size = 100M
upload_max_filesize = 100M

docker ps

docker exec -it CONTAINER_NAME bash -c "sed -i -e 's/^post_max_size = [0-9]\\+M/post_max_size = 100M/' -e 's/^upload_max_filesize = [0-9]\\+M/upload_max_filesize = 100M/' /etc/php/8.2/apache2/php.ini"

Danach Container neu starten.


Du musst Regestriert sein, um das angehängte Bild zusehen.

Du musst Regestriert sein, um das angehängte Bild zusehen.

Du musst Regestriert sein, um das angehängte Bild zusehen.

Du musst Regestriert sein, um das angehängte Bild zusehen.

Du musst Regestriert sein, um das angehängte Bild zusehen.

Du musst Regestriert sein, um das angehängte Bild zusehen.

Du musst Regestriert sein, um das angehängte Bild zusehen.

Du musst Regestriert sein, um das angehängte Bild zusehen.


Du musst Regestriert sein, um das angehängte Bild zusehen.

Du musst Regestriert sein, um das angehängte Bild zusehen.

Du musst Regestriert sein, um das angehängte Bild zusehen.

Du musst Regestriert sein, um das angehängte Bild zusehen.

Du musst Regestriert sein, um das angehängte Bild zusehen.

Du musst Regestriert sein, um das angehängte Bild zusehen.

Du musst Regestriert sein, um das angehängte Bild zusehen.

Du musst Regestriert sein, um das angehängte Bild zusehen.

Du musst Regestriert sein, um das angehängte Bild zusehen.

Eingabe im Player:

Für Stalker
URL: eure Server URL
Mac: die Mac die unter eurem erstellen Portal in der Übersicht angezeigt wird.
(wird hier die 22 in z.B. DE ausgetauscht, erhält der Player nur DE Daten)

Für Xtream
URL: eure Server URL
Username: xuser@portalname (Portalname ist der Name eures angelegten xtream Portals: also z.B. xuser@mainlight)
Password: xuser

Für M3U
Eure Stalker-Portale: hxxp://euer.server/m3us/eure.m3u
Für Xtream-Portale (nach externem Download): hxxp://euer.server/m3us/eure.m3u
Für Xtream-Portal (eure Portale): hxxp://euer.server/get.php?username=xuser@portalname&password=xsuer&type=m3u_plus

Kleines Testscript bei Problemen.
In ./data2 kopieren und mit sudo php test.php ausführen.

PHP:
<?php
function checkPermissions($path, $expectedOwner, $expectedPerms)
{
    $currentOwner = posix_getpwuid(fileowner($path));
    $currentPerms = substr(sprintf('%o', fileperms($path)), -3);

    return $currentOwner && $currentOwner['name'] === $expectedOwner && $currentPerms === $expectedPerms;
}

function setPermissions($path, $owner, $perms)
{
    chown($path, $owner);
    chmod($path, octdec($perms));
}

function isPortOpen($host, $port)
{
    $connection = @fsockopen($host, $port, $errno, $errstr, 5);
    if ($connection) {
        fclose($connection);
        return true;
    }
    return false;
}

function isUrlAccessible($url)
{
    $headers = @get_headers($url);
    return $headers && strpos($headers[0], '200') !== false;
}

function loadLsJson($file)
{
    return file_exists($file) ? json_decode(file_get_contents($file), true) : [];
}

function saveLsJson($file, $data)
{
    file_put_contents($file, json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
    chown($file, 'www-data');
    chmod($file, 0755);
}

function checkOrCreateUser($userName, $userId = null)
{
    if ($userName) {
        $userInfo = posix_getpwnam($userName);
        if ($userInfo) {
            return $userInfo['name'];
        }
    } else if ($userId !== null) {
        $userInfo = posix_getpwuid($userId);
        if ($userInfo) {
            return $userInfo['name'];
        }
    }

    $promptName = $userName ? $userName : "User ID $userId";
    echo "$promptName does not exist. Do you want to create it? (y/n): ";
    $input = trim(fgets(STDIN));

    if (strtolower($input) === 'y') {
        $command = $userName
            ? "sudo useradd -M -r $userName"
            : "sudo useradd -u $userId -M -r placeholder_name";

        exec($command, $output, $returnVar);

        if ($returnVar === 0) {
            echo "$promptName created successfully.\n";
            return $userName ? $userName : "placeholder_name";
        } else {
            die("Failed to create $promptName. Please check your system configuration.\n");
        }
    } else {
        die("Required $promptName not found. Exiting.\n");
    }
}

function getUserOwner()
{
    $wwwData = checkOrCreateUser('www-data');
    if ($wwwData) {
        return $wwwData;
    }

    $user33 = checkOrCreateUser(null, 33);
    return $user33;
}

function checkAndInstallPackages()
{
    $corePackages = ['apache2', 'php'];
    $phpExtensions = ['curl', 'json', 'xml', 'mbstring', 'zip'];
    $pythonPackages = ['aiohttp', 'argparse', 'asyncio', 'base64', 'datetime', 'json', 'os', 'random', 'subprocess', 'sys', 'tqdm', 'typing', 'urllib'];

    $missingCore = [];
    $missingPhp = [];
    $missingPython = [];

    foreach ($corePackages as $package) {
        exec("command -v $package", $output, $returnVar);
        if ($returnVar !== 0) {
            $missingCore[] = $package;
        }
    }

    $loadedExtensions = explode("\n", shell_exec("php -m"));
    foreach ($phpExtensions as $extension) {
        if (!in_array($extension, $loadedExtensions)) {
            $missingPhp[] = "php-$extension";
        }
    }

    foreach ($pythonPackages as $package) {
        exec("python3 -c \"import $package\" 2>/dev/null", $output, $returnVar);
        if ($returnVar !== 0) {
            $missingPython[] = $package;
        }
    }

    if (!empty($missingCore) || !empty($missingPhp) || !empty($missingPython)) {
        echo "The following packages are missing:\n";
        if (!empty($missingCore)) {
            echo "Core packages: " . implode(', ', $missingCore) . "\n";
        }
        if (!empty($missingPhp)) {
            echo "PHP extensions: " . implode(', ', $missingPhp) . "\n";
        }
        if (!empty($missingPython)) {
            echo "Python packages: " . implode(', ', $missingPython) . "\n";
        }

        echo "Do you want to install the missing packages? (y/n): ";
        $input = trim(fgets(STDIN));
        if (strtolower($input) === 'y') {
            if (!empty($missingCore)) {
                exec("sudo apt-get install -y " . implode(' ', $missingCore));
            }
            if (!empty($missingPhp)) {
                exec("sudo apt-get install -y " . implode(' ', $missingPhp));
            }
            if (!empty($missingPython)) {
                exec("sudo pip3 install " . implode(' ', $missingPython));
            }
            echo "All missing packages have been installed.\n";
        } else {
            die("Missing packages not installed. Exiting.\n");
        }
    }
}

checkAndInstallPackages();

$basePath = dirname(__DIR__, 1);
$expectedOwner = getUserOwner();
$expectedPerms = '755';

$directoryIterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($basePath));
$incorrectItems = [];

foreach ($directoryIterator as $file) {
    if (in_array($file->getFilename(), ['.', '..'])) {
        continue;
    }

    $fullPath = $file->getPathname();

    if (!checkPermissions($fullPath, $expectedOwner, $expectedPerms)) {
        $incorrectItems[] = $fullPath;
    }
}

if (!empty($incorrectItems)) {
    echo "Some files or folders have incorrect ownership or permissions.\n";
    echo "Do you want to list the items? (l/n): ";
    $input = trim(fgets(STDIN));
    if (strtolower($input) === 'l') {
        foreach ($incorrectItems as $item) {
            $currentPerms = substr(sprintf('%o', fileperms($item)), -3);
            $ownerInfo = posix_getpwuid(fileowner($item));
            $currentOwner = $ownerInfo ? $ownerInfo['name'] : 'Unknown';
            echo "- $item (Owner: $currentOwner, Permissions: $currentPerms)\n";
        }
        echo "Do you want to update permissions for all listed items? (y/n): ";
        $input = trim(fgets(STDIN));
        if (strtolower($input) === 'y') {
            foreach ($incorrectItems as $item) {
                setPermissions($item, $expectedOwner, $expectedPerms);
                echo "Permissions updated for '$item'.\n";
            }
        }
    } elseif (strtolower($input) === 'y') {
        foreach ($incorrectItems as $item) {
            setPermissions($item, $expectedOwner, $expectedPerms);
            echo "Permissions updated for '$item'.\n";
        }
    }
}

$lsFile = './ls.json';
$lsData = loadLsJson($lsFile);

if (empty($lsData)) {
    echo "The ls.json file is empty. Please set the Local Server Address:\n";
    $input = trim(fgets(STDIN));
    $lsData = [$input];
    saveLsJson($lsFile, $lsData);
    echo "Local Server Address saved.\n";
}

foreach ($lsData as $url) {
    $parsedUrl = parse_url($url);
    if (!$parsedUrl || !isset($parsedUrl['host'], $parsedUrl['port'])) {
        echo "Invalid URL in ls.json: $url\n";
        continue;
    }

    $host = $parsedUrl['host'];
    $port = $parsedUrl['port'];

    if (!isPortOpen($host, $port)) {
        echo "Port $port on $host is not open.\n";
        continue;
    }

    if (!isUrlAccessible($url)) {
        echo "URL $url is not accessible.\n";
        continue;
    }

    echo "URL $url is accessible and port $port is open.\n";
}

?>
 

Anhänge

Du musst angemeldet sein, um die Anhangsliste zu sehen.
Zuletzt bearbeitet:
Könntest du mal erklären wie man das Plagiat von dir verwendet?
 
Auf Server entpacken.
(direkt im webordner)

sudo -i
pip install requests
apt Install php-curl


Ihr braucht Macs oder User/Pass
In ./data/scan ist ein Scanner dazu.
(wie überall geht's nicht mit jedem Portal)
Der Scanner liefert ne json, ne txt mit Mac und ne txt mit User/Pass(falls vorhanden) in leicht weiter verarbeitbarem Format.

Script starten: python3 start.py

Alles andere sollte fast selbsterklärend sein.
Als erstes einen Server mit EINER Mac erstellen.
Rest wird angesagt.

M3us liegen dann im entsprechenden Portalordner.

Mac/User/Pass Check dauert je nach Anzahl.
Resolution/Framerate sollte man auch durchlaufen lassen. Is dann nachher netter.

xtream Proxy für User/Pass Portale gibt's auch.

Weiteres nachher.
 
Zuletzt bearbeitet:
Dann aber bitte für Blöde.(y)
Weil auch das bekomm ich nicht im ganzen zum laufen bzw fehlen mir Ansätze und Grundwissen.

Mault immer noch wegen pip.

metz@metz-Extensa-5620:~/IPTV/salidos$ sudo -i pip install requests
[sudo] Passwort für metz:
error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
python3-xyz, where xyz is the package you are trying to
install.

If you wish to install a non-Debian-packaged Python package,
create a virtual environment using python3 -m venv path/to/venv.
Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
sure you have python3-full installed.

If you wish to install a non-Debian packaged Python application,
it may be easiest to use pipx install xyz, which will manage a
virtual environment for you. Make sure you have pipx installed.

See /usr/share/doc/python3.12/README.venv for more information.

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.
 
Zuletzt bearbeitet:
Das war jetzt eigentlich für "Blöde". ;)

Allgemein: Jeder channel request wird mit random mac/user/pass ans Portal weitergeleitet. Vorher wird gecheckt, ob die mac/user/pass frei ist und ob die mac/user/pass den gewünschten Channel überhaupt "kann".

xtream.proxy:

Legt ihr einen server an, der auch user/pass kann wird Das Portal in der ./data/xuser.json hinterlegt.
Es können natürlich auch mehrere xtream Portale hinterlegt werden.

In eurem Player gebt ihr dann unter xtream codes:
URL:
User: xuser@portal (@Portal hier dann das hinterlegte Portal angeben. z.B.: xuser@destiny oder xuser@mainlight)
Passs: xuser

oder als m3u: /get.php?username=xuser@portal&password=xuser&type=m3u_plus

Alle requests mit den fake Credentials werden in reale Daten für die Anfrage ans Portal umgewandelt und auch hier bei jedem Request ein random user/pass genommen und auch kontrolliert, ob der Request auch für den user/pass funktioniert.

Also erstmal einfach:

Dateien im Webordner entpacken

Jetzt alles im Terminal:

sudo -i
pip install requests
apt get install php-curl

nebenebei: python3, apache, php sollten vorhanden sein.

zu eurem Webordner navigieren
python3 start.py

Rest sollte fast selbsterklärend sein.

This environment is externally managed
Ich kann dir nur ans Herz legen ein "richtiges" Linux aufzustellen.
Diese externally managed sind ungünstig, störrisch und anfällig.

Einfachster Weg für dich vielleicht über pipx gehen.

sudo apt update
sudo apt install pipx
pipx ensurepath
 
Zuletzt bearbeitet:
Ne Frage von nem Blöden wäre da schonmal, ist der Ordner den ich verwende OK? Schau bitte kurz in meinen Spoiler.
Das mit pip wird schon irgendwann mal.
Ich stör mich allein schon an dem Begriff "Webordner".
Weil welcher soll das bei einem Notebook mit Ubuntu sein? Der var/www/html?

Edit: Wie gesagt, es ist ein Notebook mit Ubuntu. Nichts Virtuelles.
 
Der default Webordner bei apache ist /var/www/html.
Ich würde aber immer empfehlen einen andern vserver mit apache aufzuachen und auch einen anderen Port als 80 zu nehmen.
Aber das ist Geschmackssache.
Läuft zu viel über den gleichen Ordner mit 80 dann gibts meinst Ärger und irgend etwas funktioniert nicht.


Spielt erstmal mit der Sache rum.
Nicht gleich bei jedem kleinen Fehler schreien. ;)

Wenn euer System passt, dann läuft das Script auch.
Stimmt irgendetwas nicht, läuft es nicht.
Nur müsstet ihr das dann schon selbst raus finden. Das können immer 1000 Dinge sein.

Wichtig ist:

Apache2
Python3
Php
 
Zuletzt bearbeitet:
@all
Wer noch keine alte Version installiert hatte oder seine server.json überspielt hat, konnte keinen Server anlegen. Da war ein "j" zuviel im Script.
Update bei den Downloads. Jetzt könnt ihr loslegen. ;)

@orhan.drsn
Es macht es anders.
Anderer Ansatzpunkt, anderes Vorgehen, anderes Aussehen.
Wenn clevers Script läuft, kannst du gerne meins testen.
Aber ansonsten gilt wie immer: never touch a running system.;)

Ich bin ja für ein Video.
Du willst keine Videos von mir.:ROFLMAO:

Wenn du keinen Server anlegen konntest, dann liegt es an einem kleinen aber entscheidenden Fehler. 'j' ---> ''
Update bei den Downloads.
 
Zurück
Oben