Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit näytille: PHP: *.dy.fi-osoitteen päivitys (vain IPv4)

Sivu 1 / 1

Sivun loppuun

Metabolix [18.10.2007 16:16:39]

Lainaa #

Kun kotikonetta käyttää palvelimena, on kätevää hankkia sille jostain ilmainen osoite. Eräs ilmaisia osoitteita tarjoava palvelu on dy.fi. Palvelusta hankitun osoitteen voi ohjata omalle koneelle dy.fi:n hallintapaneelin kautta, mutta pidemmän päälle on kätevämpää käyttää automaattista skriptiä – siis tätä vinkkiä.

Huomio! Ennen tämän vinkin käyttöä pitää rekisteröityä dy.fi-palveluun ja varata sieltä osoite! Lisäksi seuraaviin koodeihin pitää tietenkin kirjoittaa oma tunnus, salasana ja osoite.

(Vinkkiä päivitetty 2.10.2011.)

Päivitysfunktio

<?php
// $osoite = ???.dy.fi, osoite, jonka varasit palvelusta.
// $tunnus = käyttäjätunnuksesi dy.fi-sivustolla.
// $salasana = salasanasi dy.fi-sivustolla.
function paivita_dy_fi($osoite, $tunnus, $salasana = false) {
	// Luodaan tunnistetieto. Jos on annettu vain tunnus,
	// oletetaan, että se on valmiiksi oikeassa muodossa.
	if ($salasana === false) {
		$auth = $tunnus;
	} else {
		$auth = base64_encode("$tunnus:$salasana");
	}

	// Asetetaan oikea HTTP-otsikko pyyntöä varten.
	$context = stream_context_create(array("http" => array(
		"header" => "Authorization: Basic {$auth}",
		"ignore_errors" => true,
	)));

	// Lähetetään pyyntö ja palautetaan vastauksen ensimmäinen sana.
	// Mahdolliset tulokset: http://www.dy.fi/page/specification
	$url = "http://www.dy.fi:8180/nic/update";
	$osoite = rawurlencode($osoite);
	$ret = file_get_contents("{$url}?hostname={$osoite}", false, $context);
	sscanf($ret, "%s", $ret);
	return $ret;
}

Käyttöesimerkki

Funktiolla voi päivittää yhden osoitteen näin:

<?php
require_once("funktio.php");
$osoite = "oma.dy.fi";
$tunnus = "tunnus@tunnus.fi";
$salasana = "salasana";
echo paivita_dy_fi($osoite, $tunnus, $salasana);

Palvelun sääntöjen mukaan IP-osoitetta ei saa päivittää turhaan. Toisaalta osoite on päivitettävä vähintään kerran viikossa, ettei se vanhene, ja lisäksi osoite pitää tietenkin päivittää, jos se on muuttunut. Seuraava skripti säilyttää tiedostossa viimeisintä osoitetta, tarkistaa tiedoston muokkaushetkestä, milloin on viimeksi päivitetty, ja päivittää uudestaan vain, jos osoite on vaihtunut tai edellisestä päivityksestä on kulunut jo monta päivää.

<?php
// Käytetään ensimmäisen koodilistauksen funktiota.
require_once("funktio.php");
$osoite = "oma.dy.fi";
$tunnus = "tunnus@tunnus.fi";
$salasana = "salasana";

// Tähän tiedostoon tallennetaan tieto viimeisimmästä päivityksestä.
$tiedosto = 'viimeksi.txt';

// Skripti ilmoittaa lopputuloksen tekstinä.
header("Content-Type: text/plain");

// Selvitetään oma IP-osoite checkip.dy.fi-palvelun avulla.
$ip = @file_get_contents('http://checkip.dy.fi/');
if (!preg_match('/\d+\.\d+\.\d+\.\d+/', $ip, $tmp)) {
	echo "Virhe IP-osoitteen hakemisessa!\n";
	exit(1);
}
$ip = $tmp[0];

// Haetaan vanhat tiedot tiedostosta.
$paivitetty = $vanha_ip = null;
if (file_exists($tiedosto)) {
	$vanha_ip = (string) @file_get_contents($tiedosto);
	$paivitetty = (int) @filemtime($tiedosto);
}

// Jos IP-osoite on entisellään ja aikaa on kulunut alle kuusi päivää, ei tehdä mitään.
if ($ip == $vanha_ip && time() < $paivitetty + 60 * 60 * 24 * 6) {
	echo "Vanha kelpaa.\n";
	exit(0);
}

// Päivitetään.
$tulos = paivita_dy_fi($osoite, $tunnus, $salasana);

// Jos onnistui, tallennetaan uusi IP-osoite.
// Tulokset "nochg" (ei muutosta) ja "good" (hyvä) ovat ok.
// Mahdolliset tulokset: http://www.dy.fi/page/specification
if ($tulos == "nochg" || $tulos == "good") {
	echo "Ok: {$tulos}.\n";
	file_put_contents($tiedosto, $ip);
	exit(0);
} else {
	echo "Virhe: {$tulos}!\n";
	exit(1);
}

Skripti täytyy tietenkin tavalla tai toisella ajaa aina silloin tällöin. Tähän sopii Linux-palvelimella cron ja Windowsissa ajoitetut tehtävät.

Kray [19.10.2007 16:04:30]

Lainaa #

Öh... Kun Nat antaa ulos reitittimen osoitteen, ja tuossa ei näyttäisi olevan missään sellaista, jossa annetaan ip erikseen, niin eikös se dy.fi silloin siis ota osoitteksi sen reitittimen? Eli siis ei toimi Natilla tuo päivitys...?

Laakkonen [19.10.2007 20:05:30]

Lainaa #

Joo, dy.fi laittaa kyseisen nimen osoittamaan siihen ipsiin mistä pyyntö on tullut.

Kray [20.10.2007 10:26:25]

Lainaa #

Eli siis... Natilla se täytyy tehdä niin, että yhteys pyydetään tulemaan reitittimen osoitteeseen ja tiettyyn porttiin, josta yhteys ohjataan palvelimeen sisäisen kiinteän ip-osoitteen avulla...?

Metabolix [20.10.2007 10:27:12]

Lainaa #

Ja juuri silloinhan se toimii NATin kanssa. Mitä järkeä on laittaa dy.fi-nimi osoittamaan johonkin yksityiseen osoitteeseen (192.168.0.123)? Tietenkin sen pitää osoittaa julkiseen, että sitä voi joku käyttääkin. Reititintä pitää sitten vain käskeä reitittämään haluttu liikenne sisäisessä verkossa palvelinkoneelle.

Meitzi [21.10.2007 10:36:54]

Lainaa #

Kuten Metabolix sanoi, se että onko sulla NAT vai ei, ei vaikuta tuon toimintaan. Kyllä se liikenne pitää ohjata sinne palvelimelle samaaa reittiä mitä se on sille palvelimelle tullutkin. Eli ensimmäinen IP on se mahdollinen reititin.

Tieten jos erehdyt käyttämään proxya tuon pyynnön kanssa niin silloin menee metsään.

Teknkik [04.10.2010 22:13:21]

Lainaa #

Jees! Otin tämän käyttöön :)
Crontabilla pyörähtelee 6pv välein tällähetkellä..

uid-11960 [20.02.2013 20:19:35]

Lainaa #

C++-versio tästä olisi kiva lisäksi. No, taidampa tehdä sellaisen itse.

tmub [22.02.2013 08:58:05]

Lainaa #

Myös tämä on toimiva ja helppo ratkaisu:
http://wiki.ubuntu-fi.org/Dynaaminen_DNS

uid-11960 [03.09.2013 13:45:40]

Lainaa #

Toimiiko tuo Windows 7lla

Metabolix [03.09.2013 15:45:07]

Lainaa #

Tietenkin toimii, miksei toimisi? Olisit myös voinut vain testata.

uid-11960 [01.06.2014 16:46:48]

Lainaa #

Ihan hyvä niille joiden ip-osoite vaihtuu aina, kun modeemi sammutetaan.

LukeSW [13.10.2019 17:37:52]

Lainaa #

Toisen koodilistauksen rivin 16 perusteella skripti ei taida toimia IPv6-osoitteilla?

Miten noita pitäisi muuttaa että ne toimisi myös IPv6:lla?

Löysin yhden skriptin joka päivittää IPv6-osoitteen dy.fi-palveluun. Tuo on tehty Bourne shell-skriptillä, enkä osaa muuttaa sitä php-skriptiksi.

Omassa kotipalvelinkäytössä on tällä hetkellä Windows 10, johon on asennettu Apache-httpd ja php.

Metabolix [13.10.2019 18:16:01]

Lainaa #

Tämä dy.fi-palvelun nopea rajapinta tukee vain IPv4-osoitteen päivittämistä. IPv6-osoitteet (kuten myös MX-palvelimet) täytyy syöttää palvelussa aivan erilliseen tekstikenttään, eli niiden päivitys ei onnistu tämän helpon rajapinnan kautta vaan vaatii ensin kirjautumisen sivustolle ja sitten lomakkeen lähetyksen.

Lisäys:

Nyt on uusi versio (sis. IPv4, IPv6, MX) erillisenä viestinä.


Sivun alkuun

Vastaus

Muista lukea kirjoitusohjeet.
Tietoa sivustosta