Sivut

tiistai 13. joulukuuta 2016

MySQL tietokantojen varmistus PHP -koodilla


On aika suutarinkin rakentaa itselle omat kengät.
Tässä tapauksessa automaattinen varmistus tietyille SQL -tietokannoille.

Sitä tarkoitusta varten on maailma tulvillaan koodia, mutta niitä ei vain tule käytettyä tai ehkä ne ovat liian monimutkaisia. Pienten ja keskisuurten tietokantojen varmistamiseen löysin erään mielenkiintoisen PHP -koodin.

Tässä on pieni koodinpätkä varmistusten tekemiseen, joka käyttää backupmysql.class.php kirjastoa. Se taas löytyy otsikossa kerrotusta paikasta.

<?php
/*
 * http://coursesweb.net/php-mysql/simple-backup-mysql-database_s2
 *
 * - Using backupmysql class to create backup of all the tables in mysql database.
 * - Modify for Hotel database, JoH 30.11.2016
 *
 * cron: 0     1     *     *     *
 * wget -qO- -t 1 http://www.hotelli.fi/db/do_backup.php
 * file: date('d-m-Y'). '@'. date('h.i.s') .'.sql';
 *
 */

$host = '127.0.0.1';
$user = 'username';
$pwd = 'salasana';
 
// Set object of backupmysql class
include 'backupmysql.class.php';

// Perform the backup for all databases
makeBackup($host, $user, $pwd, 'hotelli_customers');
makeBackup($host, $user, $pwd, 'hotelli_staff');
makeBackup($host, $user, $pwd, 'hotelli_reservations');
makeBackup($host, $user, $pwd, 'hotelli_rooms');

// Do backup
function makeBackup($h, $u, $p, $db) {

    $lang ='en';        // Indice of the "lang_...json" file with texts
    $dir ='backup/';    // Folder to store the ZIP archive with SQL backup

    $bk = new backupmysql($lang, $dir);

    // Data for connecting to MySQL
    $conn_data = ['host' => $h,
                  'user' => $u,
                  'pass' => $p,
                  'dbname' => $db];
   
    $bk->setMysql($conn_data);  // Set connection
    $tables = $bk->getTables(); // Get array with all the tables in database

    // If no error
    if($bk->error === false) {
        // If tables, creates the SQL backup of all the tables
        // and saves it in ZIP archive (get succesful or error message)
        $bk_sql = (count($tables) > 0) ? $bk->saveBkZip($tables) : 'No tables in database';

        // Use BR when print out to browser
        echo $bk_sql . "<br />";
    }
        else echo $bk->error;

    // Kill or Close PDO object
    $bk = null;
  
    return;
}
?>

Siitä vaan varmistamaan!

torstai 3. marraskuuta 2016

Seurataan julkisen IP osoitteen vaihtumista



Tässä on melko lopullinen PHP koodi, joka seuraa IP -osoitteen vaihtumista julkisessa verkossa. Tämä koodi tallentaa aikaisemman IP -osoitteen ja vertaa sitä uuteen vastaavaan. Muutoksesta ilmoitetaan.

Asenna tämä scripti web -palvelimelle ja laita se Cron -taulukkoon,
niin saat joka aamu uuden raportin IP -osoitteesta tai sen vaihtumisesta.

<?php
// https://www.ipify.org/
// Check Public IP Address

define('TIMEZONE', 'Europe/Helsinki');
date_default_timezone_set(TIMEZONE);
$thisDate = date('d-m-Y H:i');

// Get current Public IP address
$n_ip = file_get_contents('https://api.ipify.org');

// Current IP address in file and last modified
$ip_file = 'ip_addr.txt';
$fileDate = date('d-m-Y H:i', filemtime($ip_file));

// Get IP address from file
$content = file_get_contents($ip_file);
$ip_array = explode("\n", $content);
$c_ip = strtok($ip_array[0], '@');

// Compare Public address and fileaddress
if(strcmp($n_ip, $c_ip) == 0) {
    // No change!
    echo "Public IP address has remained the same: " . $c_ip . "@ Last changed: " . $fileDate . "\n";
} else {
    // Write NEW IP address to file
    $content = $n_ip . "@ " . $thisDate . "\n";
    file_put_contents($ip_file, $content);
    echo "Public IP address has changed: <b>" . $n_ip . "</b>@ " . $thisDate . " Last changed: " . $fileDate . " \n";   
}

?>

Avain tietokoneeseen


Avain tietokoneeseen.

Onhan se ollut jo monessa palvelimessa mukana. Eli kone ei lähde käyntiin eikä sammu ilman avainta. Mutta entäpä täydellinen käynnistymisen ja tietomurtojen estävä avain? ORWL on sellainen. Jos sen yrittää ohittaa ilman omaa avainta, niin se tuhoaa tiedot tietokoneelta eikä rosvo saa käsiinsä kuin tyhjän koneen.

Siihen tietysti tarvitaan hieman älyä, salausta ja koodia. ORWL on avointa koodia. Niin koodia! Sillä sillä koodiakin siihen tosiaan tarvitaan, ei pelkkää fyysistä avainta. Tietysti kysymys kuuluu: onko tällaiseen suojaukseen tarvetta? Minusta tietyissä palvelimissa on.

-- oo -- 
 
ORWL basic specs include Intel Skylake M3 processor, USB-C & micro HDMI ports, 8GB memory, 120GB Solid State Drive, Bluetooth, Wifi and NFC technology. Currently it supports Ubuntu 16.04, Qubes OS and Windows 10 out-of-the-box.
All you need is a monitor, keyboard and mouse to get started.
ORWL is Open Source - ORWL is totally open source.
It means that the schematic and layout files, software, firmware,
everything is up for grab if anyone wants to make one themselves or make improvements.

Log Reportico Use Count



Tässä PHP koodi, jolla voidaa laskea ja kirjata lokiin Reportico käytäjien määrä.

<?php
/*
 * Remember to remove <?php ?> tags when include Reportico
 *
 */

define('TIMEZONE', 'Europe/Helsinki');
date_default_timezone_set(TIMEZONE);

$dbfile = 'reports_all.db';
$cur_ip = getIP();
$name = "Report name";
$created = date('d-m-Y H:i:s');

if (file_exists($dbfile)) {
    $data = seekLastLine($dbfile);
    $count = (int)strpbrk($data, "0123456789");
    $count = $count + 1;
    $out = sprintf("%04d", $count);
    $data = $out . " : " . $cur_ip . " : " . $name . " : " . $created . "\n";
    $fh = fopen($dbfile, "a+");
    fwrite($fh, $data);
}
else {
    $fh = fopen($dbfile, "w");
    $data = "1 : " . $cur_ip  . " : " . $name . " : " . $created . "\n";
    fwrite($fh, $data);
    fclose($fh);
}

function seekLastLine($f) {
    $f = escapeshellarg($f); // for the security concious
    $line = `tail -n 1 $f`;
    return $line;
}

function getIP() {
  if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  elseif(isset($_SERVER['REMOTE_ADDR'])) $ip = $_SERVER['REMOTE_ADDR'];
  else $ip = "0";
  return $ip;
}
?>

Facebook editorin toimimattomuus



Olenko minä ainut tällä planeetalla, jolla Facebook editori ei hyväksy tavallista Liitä - Liimaa - Askartele toimintoa? Eli Copy - Paste tai Kopioi - Liitä?

Nimittäin, yritän kopioida tekstiä jostakin toisesta dokumentista. Vaikka Word, Writer, Kate tai toiselta www -sivulta.  Poikkeuksetta käy niin, että kun liitän tekstin Facebook editoriin ja haluan Julkaista tai Tallentaa tekstin, niin Facebook editori menee sekaisin ja ilmoittaa, että julkaisu näyttää olevan tyhjä! Kirjoita jotakin!


Ja minähän kirjoitan ja haluan liittää sitaatin toisesta kirjoituksesta - omastani - ja taas sama juttu.

Hetken jo luulin, että vika oli muotoiluissa. Otin sitten käyttöön aivan tavalliset tekstieditorit: Nano ja Gedit sekä Windows puolella Notepad.
Jotka eivät lisää tekstiin ja tiedostoon mitään muotoiluja.

Kierrätin tekstin näiden editoriohjelmien kautta ja poistin kaikki muotoilut.

Sama juttu! Ei vaan toimi.

Olen kokeillut kaikkea: Hiirellä Copy ja Paste, näpäimistöllä Ctrl-C ja Ctrl-V sekä harvemmin tunnettu vanha konsti Ctrl-Ins ja Shift-Ins


Tietääkö kukaan Facebook moderaattori ratkaisua tähän ongelmaan?

Yksi tai kaksi, mitkä tulevat mieleeni, ovat nämä rivinvaihdot.
- next line ("\n") tarkoittaa Unix ja Linux koneissa rivin vaihtoa
- next line ja carriage return yhdessä ("\nr\cr\") ovat pelkästään Windowsille varattu muoto
- sitten on vielä merkistön koodaus. Voiko sillä olla vaikutusta.
Itse käytän UTF-8 Unicode muotoa

Mutta jos kopiointi tehdään sellaisen editorin kautta, joka ei tiettävästi lisää mitään muotoiluja sisältöönsä, niin miksi näin käy?








keskiviikko 6. heinäkuuta 2016

PHP: Tarkistetaan sähköposti IMAP postilaatikosta


Monessa työpöytäympäristössä (Desktop) on käytössä saapuvan sähköpostin tarkistamiseen tarkoitettu ilmoitus. Niin sanottu Mail Notify. Tämä toimii vaikka itse sähköpostiohjelma (Outlook tai Thunderbird) ei olisikaan käynnissä.

Ainakin Ubuntu, Debian ja openSUSE sisälsivät aikoinaan tämän ominaisuuden, mutta yllätys oli, että uudesta 64 -bittisestä Ubuntusta se puuttui. Tai ainakaan se ei toiminut toivotulla tavalla.

Silloin kun joku toiminto tietokoneesta puuttuu, niin minä yleensä koodaan sen itse. Niin siis tässäkin tapauksessa. Apuun tuli PHP -kieleen ympätty ominaisuus IMAP -postilaatikon käsittelyyn. Sen avulla pystyy kirjautumaan omaan postilaatikkoon ja tarkistamaan tilanteen: paljonko laatikossa on postia ja montako kirjettä on lukematta.

Kirjoitetaan siis PHP -ohjelma joka tarkistaa postilaatikon ja ilmoittaa saapuneesta postista käyttäjälle. Se vaatii tietysti, että PHP -kielen vaatimat palikat on asennettu tietokoneelle ja ohjelma voidaan suorittaa ajastetusti vaikkapa cron -ajastuksella (Linux).

Itse PHP -ohjelma on varsin yksinkertainen. Tässä siitä listaus, joka tarkistaa kaksi postilaatikkoa:


<?php

/*
 imap_open — Open an IMAP stream to a mailbox
  All names which start with { are remote names,
  and are in the form "{" remote_system_name [":" port] [flags] "}" [mailbox_name] where:
    remote_system_name - Internet domain name or bracketed IP address of server.
    port - optional TCP port number, default is the default port for that service
    flags - optional flags, see following table.
    mailbox_name - remote mailbox name, default is INBOX

 imap_status — Returns status information on a mailbox
 Valid flags are
    SA_MESSAGES - set $status->messages to the number of messages in the mailbox
    SA_RECENT     - set $status->recent to the number of recent messages in the mailbox
    SA_UNSEEN     - set $status->unseen to the number of unseen (new) messages in the mailbox
    SA_UIDNEXT     - set $status->uidnext to the next uid to be used in the mailbox
    SA_UIDVALIDITY - set $status->uidvalidity to a constant that changes when uids for the mailbox may no longer be valid
    SA_ALL - set all of the above

*/

# MyHost imap with ssl
$myhost="{myserver.org:993/imap/ssl/novalidate-cert}";

# Google with imap
$gmailhost="{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX";

$user="username@myhost.org";
$pass="********";

$gmailuser = "user.name@gmail.com";
$gmailpass = "********";

// In crontab All commands need to reference their location eg. /usr/bin $notify_cmd = "/home/user/bin/notify-send-user.sh -U user -i info 'Sinulle on postia!' ";

// Status file. Append and clear after a month, maybe joskus?
$file = "/home/user/bin/mail/mail_status.txt";
file_put_contents( $file, "\n--- ooo ---\n\n", FILE_APPEND );

date_default_timezone_set('Europe/Helsinki');
$t=time();
file_put_contents( $file, (date("d-m-Y H:i",$t))."\n", FILE_APPEND );

# ------ Myhost Mailbox -----

if ($mbox=imap_open( $host, $user, $pass ))
  {
    file_put_contents( $file, "Host Connected\n", FILE_APPEND );
  } else
  {
    file_put_contents( $file, "Host Connection FAIL!\n", FILE_APPEND );
    exit(1);
  }

$data_unread = 0;

$status = imap_status($mbox, "{myserver.org:993}INBOX", SA_ALL);
if ($status) {
  $msgs = $status->messages;
  $data_unread = $status->unseen;   
 
  $notify_msg = "'Host: $data_unread";    // Alkaa hipsulla
  file_put_contents( $file, "Datatuki\n"."-Messages: ".$msgs."\n-Unread  : " . $data_unread . "\n", FILE_APPEND );
 
} else {
  file_put_contents( $file, "Host imap_status failed: " . imap_last_error() . "\n", FILE_APPEND );
}

imap_close($mbox);

# ------- Google Gmail Mailbox -------------

if ($mbox=imap_open( $gmailhost, $gmailuser, $gmailpass ))
  {
    file_put_contents( $file, "Gmail Connected\n", FILE_APPEND );
  } else
  {
    file_put_contents( $file, "Gmail Connection FAIL!\n", FILE_APPEND );
    exit(1);
  }

$gmail_unread = 0;

$status = imap_status($mbox, "{imap.gmail.com:993}INBOX", SA_ALL);
if ($status) {
  $msgs = $status->messages;
  $gmail_unread = $status->unseen; 
  // Append messages
  $notify_msg .= " Gmail: $gmail_unread'";  // Loppuu hipsuun
  file_put_contents( $file, "Gmail\n"."-Messages: ".$msgs."\n-Unread  : " . $gmail_unread . "\n", FILE_APPEND );
 
} else {
  file_put_contents( $file, "Gmail imap_status failed: " . imap_last_error() . "\n", FILE_APPEND );
}

imap_close($mbox);


# ------ If there is any email ------

if( $data_unread != 0 || $gmail_unread != 0 ) {
  // Sinulle on jotakin postia!
  $notify_cmd .= $notify_msg; 
  exec($notify_cmd);
  exec($play_cmd);
  } else {
    file_put_contents( $file, "Nothing to do ...\n", FILE_APPEND );
  }

?>

Että silleen.
Tämä koodi ilmoittaa kun uutta postia on saapunut.


Vaihtuva IP -osoite ... taas

Pitkästä aikaa blogia kirjoittamassa.
Mennyt vuosi meni mökillä remonttia tehdessä, siten tuli muutto uuteen kotiin ja kas vain, en huomannutkaan, että blogi oli jäänyt kirjoittamatta.

Pitäisikö kirjoittaa kuten pysäköinninvalvojahenkilö minulle huomautti: pysähtymiskieltomerkin noudattamatta jättämisestä seuraamuksena huomautusmaksu.

Kirjoitan siitä, mihin viimeksi jäin, eli IP -osoitteen vaihtumisesta.

Uuden 3G/4G tekniikan aikakaudella ei millään saa omaa IP -osoitettaan pysymään vakiona, vaan se vaihtuu ainakin kerran viikossa. Vaikka reitittimen asetuksia kuinka muuttaisi.

Siksi kirjoitin omalle Ubuntu koneelle seuraavan scriptin, joka tarkistaa IP -osoitteen koneen käynnistyksessä ja ilmoittaa minulle, jos osoite on vaihtunut.

#!/bin/bash
#
# Vertaillaan julkista IP -osoitetta
#
# Current eli nykyinen IP-osoite. Kirjoita tai lue tiedostosta
cip='109.XXX.YYY.ZZZ'
# New eli uusi IP-osoite haetaan ipify -palvelimelta
nip=$(curl -s https://api.ipify.org)
# Verrataan osoitteita kekenään
if [ "$cip" != "$nip" ]; then
  # Jos oli muuttunut, niin ilmoitetaan siitä minulle
  notify-send "Public IP address has changed!"
  exit 1;
fi

Tällä menetelmällä ainakin huomaan koska asialle pitää tehdä jotakin.