Jacek Kowalski
2019-06-30 bcd661488de087afab096c18aa55eda42e8c5226
lib/Fetch.php
New file
@@ -0,0 +1,70 @@
<?php
class Fetch {
   static function ftp($url, $file = NULL) {
      $url = parse_url($url);
      if(!isset($url['scheme']) || $url['scheme'] != 'ftp') {
         throw new Exception('Only FTP URLs are supported');
      }
      if(!isset($url['host'])) {
         throw new Exception('Hostname not present in the URL');
      }
      if(!isset($url['path'])) {
         throw new Exception('Path component not present in the URL');
      }
      if(!isset($url['port'])) {
         $url['port'] = 21;
      }
      if(!isset($url['user'])) {
         $url['user'] = 'anonymous';
      }
      if(!isset($url['pass'])) {
         $url['pass'] = 'anonymous@mpk.jacekk.net';
      }
      if($file == NULL) {
         $file = basename($url['path']);
      }
      $localTime = -1;
      $localSize = -1;
      if(is_file($file)) {
         $localTime = filemtime($file);
         $localSize = filesize($file);
      }
      $ftp = FtpConnection::create($url['host'], $url['port'], $url['user'], $url['pass']);
      $remoteSize = $ftp->size($url['path']);
      $remoteTime = $ftp->mdtm($url['path']);
      $updated = FALSE;
      if($localTime < $remoteTime || ($localTime == $remoteTime && $localSize != $remoteSize)) {
         if(file_exists($file.'.tmp')) {
            unlink($file.'.tmp');
         }
         $ftp->get($file.'.tmp', $url['path'], FTP_BINARY);
         touch($file.'.tmp', $remoteTime);
         if(!rename($file.'.tmp', $file)) {
            throw new Exception('Temporary file rename failed');
         }
         $updated = TRUE;
      }
      return $updated;
   }
   static function generic($url, $file = NULL) {
      if($file == NULL) {
         $file = basename($url['url']);
      }
      $data = file_get_contents($url);
      if($data === FALSE) {
         throw new Exception('URL fetch failed');
      }
      if(file_put_contents($file.'.tmp', $data) === FALSE) {
         throw new Exception('Temporary file creation failed');
      }
      if(!rename($file.'.tmp', $file)) {
         throw new Exception('Temporary file rename failed');
      }
   }
}