Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
WebApi für Serverinformationen auf eigener Homepage
#11
@prissi

Es handelt sich nicht um Heimserver.

(04-05-2018, Friday-16:03:22 )kimahri schrieb: Interessant ist das beide server beim selben anbieter liegen, der Ubuntuserver ging ins listing, der Windows nicht. Bei beiden sind die Ports freigegeben.

Da es sich hierbei um Simutrans 120.2.2 r8163 handelt, kann ich nicht sagen ob sich da inzwischen was geändert hat. Dachte aber das da im Laufe der Zeit was beim Netzwerk geändert wurde.

Ich bekomme mit Version 120.2.2 auch keine Server angezeigt im Netzwerk-Dialog. Obwohl im Listing auf der Webseite einer angezeigt wird.
Bei Extended hingegen werden die Server im Dialog angezeigt die auch auf der Webseite gelistet sind.

Also wurde entweder was geändert oder bei dem Standard-Listserver klemmt was.



Und wo wir gerade dabei sind, auf was bezieht sich unten das Feld Alias im Netzwerk-Dialog?
Die Hilfe sagt dazu nämlich nichts aus.
Zitieren
#12
Also es ist definitiv ein Listserverproblem.

Die csv-Datei wird nicht erstellt bzw. kann nicht abgerufen werden.

Standard
servers.simutrans.org:80/list?format=csv

Extended
http://list.extended.simutrans.org:8080/list?format=csv

Bei Extended wird die Liste im Browser angezeigt ganau so wie bei der Webanzeige.

Bei Standard bleibt das Browserfenster leer, obwohl mindestens ein Server da gelistet ist laut der Webanzeige.
Zitieren
#13
Hier ist der Code. Mit meinen beschränkten node.js Kenntnissen sieht alles gut aus. Seit drei Jahren nicht mehr angefasst. Muss ein Update von node.js sein, dass da was kaputt gemacht hat.

Code:
//
// Simutrans Listing Server
//
//
// Copyright <C2><A9> 2011-2014 Timothy Baldock. All Rights Reserved.
//
// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
//
// 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission from the author.
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//

// Configured by environment parameters
var header_image      = process.env.HEADER_IMAGE || "simlogo.png";
var port              = process.env.PORT || 80;
var prune_interval    = process.env.PRUNE_INTERVAL || 604800;

// Includes
var express    = require('express');
var fs         = require("fs");
var mustache   = require('mustache');
var listing    = require('./lib/Listing.js');
var simutil    = require('./lib/SimUtil.js');
var translator = require('./lib/Translator.js');
//var ListingProvider = require('./lib/MongoDBListingProvider.js').ListingProvider;
var ListingProvider = require('./lib/MemoryListingProvider.js').ListingProvider;

var app = express();

app.use(express.bodyParser());
app.set('trust proxy', true);

var translate = (new translator.Translator()).translate;
var available_formats  = ["html", "csv"];
var templatefiles = [
   "header.html",
   "footer.html",
   "announce.html",
   "list.html"
];
var templates = {};

for (n in templatefiles) {
   if (templatefiles.hasOwnProperty(n)) {
       console.log("loading file: " + templatefiles[n] + "...");
       templates[templatefiles[n]] = fs.readFileSync("templates/" + templatefiles[n], "utf8");
   }
}

var listingProvider = new ListingProvider(function () {
   app.listen(port);
   console.log('Listening on port ' + port);
});

app.use('/static', express.static(__dirname + '/public'));

app.get('/', function(req, res) { res.redirect(301, '/list'); });

app.get('/announce', function(req, res) {
   res.writeHead(405, {"Content-Type": "text/html", "Allow": "POST"});
   res.write(mustache.to_html(templates["announce.html"], {}));
   res.end();
});

app.post('/announce', function(req, res) {
   //if (req.ip === '178.77.102.239') { res.send(403, ""); return; }

   if (!req.body.port) {
       res.send(400, "Bad Request - port field missing");
       return;
   }
   if (!listing.validate_port(listing.parse_port(req.body.port))) {
       res.send(400, "Bad Request - port field invalid");
       return;
   }
   if (!req.body.dns) {
       res.send(400, "Bad Request - DNS field missing");
       return;
   }

   listing.validate_dns(listing.parse_dns(req.body.dns), req.ip,
       function () {
           var new_listing = new listing.Listing(req.body.dns, req.body.port);
           console.log(JSON.stringify(req.body));
           if (new_listing.name === "") { new_listing.name = new_listing.id; }

           listingProvider.findById(new_listing.id, function (existing_listing) {
               new_listing.update_from_object(existing_listing);
               new_listing.update_from_body(req.body);

               listingProvider.save(new_listing, function () {});
               res.send(201, JSON.stringify(new_listing));
           });
       }, function () {
           res.send(400, "Bad Request - DNS field invalid");
       }
   );
});

app.get('/list', function(req, res) {
   var urlbase, key;

   // Process defaults
   if (!req.query.format) { req.query.format = "html"; }

   if (req.query.format === "html") {
       res.writeHead(200, {"Content-Type": "text/html"});

       // Write header
       res.write(mustache.to_html(templates["header.html"],
           {title: req.host + " - Server listing", translate: translate, headerimage: header_image}));

       urlbase = "./list";
       if (req.query.detail) {
           urlbase = urlbase + "?detail=" + req.query.detail;
       }

       listingProvider.findAll(function (listings) {
           var pakset_names = [];
           var pakset_groups = {};
           for (key in listings) {
               if (listings.hasOwnProperty(key)) {
                   var item = listings[key];
                   var timings = simutil.get_times(item.date, item.aiv);
                   if (timings.overdue_by > prune_interval * 1000) {
                       listingProvider.removeById(item.id, function(removed) {
                           console.log("Pruned stale server with id: " + removed.id);
                       });
                   } else {
                       if (timings.overdue_by > item.aiv * 1000) {
                           item.st = 0;
                       }
                       var pakset_name = item.pak.split(" ")[0];
                       if (pakset_names.indexOf(pakset_name) < 0) {
                           pakset_names.push(pakset_name);
                           pakset_groups[pakset_name] = [];
                       }
                       pakset_groups[pakset_name].push({
                           detail: (key === req.query.detail),
                           data: item,
                           timing: timings
                       });
                   }
               }
           }

           // Map paksets into output format for mustache
           var paksets_mapped = [];
           for (key in pakset_groups) {
               paksets_mapped.push({name: key, items: pakset_groups[key]});
           }

           res.write(mustache.to_html(templates["list.html"],
               {translate: translate, timeformat: simutil.format_time,
                paksets: paksets_mapped}));

           res.write(mustache.to_html(templates["footer.html"], {}));
           res.end();
       });
   } else if (req.query.format === "csv") {
       var response = "";

       listingProvider.findAll(function (listings) {
           for (key in listings) {
               if (listings.hasOwnProperty(key)) {
                   var item = listings[key];
                   var timings = simutil.get_times(item.date, item.aiv);
                   if (timings.overdue_by > prune_interval * 1000) {
                       listingProvider.removeById(item.id, function(removed) {
                           console.log("Pruned stale server with id: " + removed.id);
                       });
                   } else {
                       if (timings.overdue_by > item.aiv * 1000) {
                           item.st = 0;
                       }
                       if (item.dns
                           && item.port
                           && item.name
                           && item.rev
                           && item.pak && item.pak !== "unknown") {
                           response = response
                               + simutil.csv_escape(item.name)
                               + "," + simutil.csv_escape(item.dns
                               + ":" + item.port)
                               + "," + simutil.csv_escape(item.rev.toString())
                               + "," + simutil.csv_escape(item.pak)
                               + "," + simutil.csv_escape(item.st.toString()) + "\n";
                       }
                   }
               }
           }
           res.send(200, response);
       });
   } else {
       res.send(501, "501 Not Implemented - The specified output format is not supported, supported formats are: " + available_formats.toString());
   }
});
Zitieren
#14
Also ich bin mir nicht sicher ob er jetzt über die Versionsangabe stolpert oder über das doppelte item.pak in der If-Auswertung für die CSV-Ausgabe.

Versionsangabe auf der Webseite
Zitat:...
The server game version is: Simutrans "120" "." "2" "." "2" (r8163) built "Sep 20 2017"
...

Auswertungs-if
Code:
...
                      if (item.dns
                          && item.port
                          && item.name
                          && item.rev
                          && item.pak && item.pak !== "unknown") {
...

Auf jeden Fall dürfte einer der geprüften Werte im if ungültig sein.

Ohne die restlichen Dateien oder selber einen Listserver zu installieren kann ich da nicht weiter helfen.
Zitieren
#15
Die pakangabe wird automatisch erzeugt, kann eigentlich nicht leer sein. Das einzige, was bei meinem Testserver ist, war der fehlende Name. Den Test auf leerem Namen habe ich rausgenommen. Jetzt sollte auf jeden Fall der Server erscheinen.

In der nächsten Version werde ich noch die eigenen IP automatisch abfragen, wenn keine angegeben ist, um die Fehlerquelle auch noch auszuschalten. Dann sollte wirklich nur announce schon einen Eintrag auf dem Listserver erzeugen (so denn der Server erreichbar ist).
Zitieren
#16
Und was die Ermittlung der eigenen öffentlichen IP angeht ( in dem Fall vom Simutrans-Server aufgerufen ), das geht ganz einfach mit einer Zeile PHP.

Code:
<?PHP
echo getenv("REMOTE_ADDR");
?>

Auf diese Weise hat man praktisch sein eigenes DynDNS.

Hat den Vorteil, wenn die Datei auf dem selben Server wie der Listserver liegt, das keine dritten in der Kommunikation mit drin hängen.

Wobei das der Listserver selber eigentlich auch können sollte. Denn der Simutrans-Server ruft den ja auf um ihm mitzuteilen das es ihn gerade gibt.
Zitieren
#17
Das scheitert bei einem User-Server an verschiedenen Dingen; erstens muss derjenige zu Hause PHP haben, was praktisch keiner hat. Mein Forum-Server hat zwei IPs, je nach Namen, und PHP ist vermutlich an den Webserver mit dem Forum gebunden, was die falsche IP gibt. Ein externer Aufruf (wie eben http://api.ipify.org) scheint fast am zuverlässigsten.
Zitieren
#18
Du missverstehst das jetzt.

Die obige PHP-Datei liegt auf irgendeinem Server im Internet.

Die Zeile ermittelt die IP des Rechners, der die Datei abruft und gibt die aus. In Heimnetzen mit privaten IP-Adressen wird die öffentliche ermittelt, die der Router hat der den direkten Zugang zum Internet hat. Ggf liegt hier nämlich auch noch ein Fallstrick, wenn man nämlich die private IP einträgt ( es heist die IP des Rechners wo der Simutrans-Server drauf läuft ) statt der öffentlichen, dann geht das Listing auch daneben. Was die Portweiterleitungen angeht, das ist dann eh Userangelegenheit.

Nichts anderes machen die Seiten die Du weiter oben verlinkt hast. Nur das dort jede Menge anderer Kram mit drauf sein kann.

Speichere den oben geposteten PHP-Code in einer PHP-Datei auf Deinem Server. Ruf dann die Datei und die von Dir geposteten Links auf und Du wirst sehen das überall die gleiche IP angezeigt wird.

Der Unterschied ist nur, das Du mit Deinem eigenen Server die Daten bei Dir behälst und nicht an Dritte weiterleitest. Es sind zwar nur die Verkehrsdaten, aber die verraten auch so schon viel. Und Du weist nie was auf den externen Seiten noch so alles eingebunden ist. Gerade in Bezug auf die kommende DSGVO ist es von Vorteil nicht unnötig Server von dritten anzusteuern.
Zitieren
#19
Da hatte ich dich in der Tat missverstanden. Da mache ich in der Tat. Danke.
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste