#/usr/bin/perl -w
###############################################################################
# Perl-skripti harjoitustyon ottamiseksi WWW:sta tai laittamiseksi sinne
#
# Kutsun syntaksi:
# lue.pl KOMENTO ohjetiedosto kone kayttaja kurssi [comps-hakemisto] [passwd]
#
# Esim:
#
# perl lue.pl GET files.txt www.jyu.fi vesal gko
# - hakee ensin tiedoston http://www.jyu.fi/~vesal/gko/files.txt
# ja sitten sen ohjeiden mukaan tekee paikalliselle levylle
# tarvittavat alihakemistot ja hakee sitten tarvittavat tiedostot
# Jos koneen nimen perässä on polku, niin mitään ei lisätä
# Eli esim:
# perl lue.pl GET files.txt www.it.jyu.fi/users/vesal/gko
# - hakee ensin tiedoston
# http://www.it.jyu.fi/users/vesal/gko/files.txt
# ja sitten sen ohjeiden mukaan tekee paikalliselle levylle
# tarvittavat alihakemistot ja hakee sitten tarvittavat tiedostot
# perl lue.pl FTP files.txt www.jyu.fi vesal gko
# - lukee paikallisen levyn oletushakemistosta tiedoston
# files.txt ja sen ohjeiden mukaan kopioi paikalliselta levylta
# ftp:lla tiedostoja www.jyu.fi-koneessa käyttäjän vesal kotihakemisto
# ja sen alla www/gko hakemistoon luoden tarvittaessa uusia
# hakemistoja
# Tekee lisäksi saman kuin HTML
# perl lue.pl HTML files.txt tukki vesal gko
# - lukee paikallisen levyn oletushakemistosta tiedoston
# files.txt ja tekee siitä tiedostot files.html ja index.html, jotka
# kopioidaan ftp:lla tukki-koneeseen käyttäjän vesal kotihakemistoon
# hakemistoon www/gko.
# perl lue.pl HTML files.txt tukki vesal gko comps -
# - lukee paikallisen levyn oletushakemistosta tiedoston
# files.txt ja tekee siitä tiedostot files.html ja index.html, joita
# ei kopioida mihinkään muualle, sillä salasanana on -
#
# perl lue.pl PUREHTML files.txt tukki vesal gko srcreplacement
# - lukee paikallisen levyn oletushakemistosta tiedoston
# files.txt ja tekee siitä tiedostot files.html ja index.html, joita
# ei kopioida mihinkään muualle
# srcreplacement on hakemiston nimi, jolla java-tiedostoissa oleva src
# merkkijono korvataan (jos src halutaa poistaa, on tämä tyhjä, jos säilyttää, niin src/)
#
# perl lue.pl COPY files.txt w: vesal gko
# - lukee paikallisen levyn oletushakemistosta tiedoston
# files.txt ja tekee siitä tiedostot files.html ja index.html, ja
# kopioi ne paikkaa w:\gko
#
# perl lue.pl SVN files.txt
# - lukee paikallisen levyn oletushakemistosta tiedoston
# files.txt ja lisää sen mukaan kaikki siinä olevat tiedostot
# oletushakemiston
# kopioi ne paikkaa w:\gko
#
# Javadoc tehdään javadoc -ohjelmalla ja sen on oltava polussa
# jos files.txt:ssä on .java -tiedostoja
# c# doc tehdään doxygen-ohjelmalla ja sen on oltava polussa
# jos on .cs-tiedostoja. doxyfile-tiedostossa on ohjeet dokumentin
# tekoon. doxyfile-tiedostoa etsitään oletushakemistosta ylöspäin.
# Oletushakemistoa lähintä doxyfile-tiedostoa käytetään.
# Jos doxyfile tiedostoa ei löydy, käytetään lue.pl:n hakemistosta
# löytyvää versiota.
# doxyfile-tiedostossa voidaan (ja kannattaa) ottaa mukaan
# d.dox tiedosto joka generoidaan lue.pl ajossa.
#
# Jos tiedoston nimi on muotoa (files.tx:n sijaan) nimiN.txt
# (missä N on luku)
# niin tulostiedostot ovat vastaavasti filesN.html, indexN.html
# Esim. files2.txt => files2.html ja index2.html
#
# Tiedoston files.txt muoto on yksinkertaisimmillaan:
# oma/tiedosto.c = kommentti
# oma/ali/ali.c = kommentti 2
#
# Tahan voidaan lisata myos koristeita,
# =-- => WWW-sivulle
, eli viiva
# = Otsikko => WWW-sivulle Pelkastaan teksti Otsikko
#
# =------------------------------
# = Otsikko
# =------------------------------
# oma/tiedosto.c = kommentti
# oma/ali/ali.c = kommentti 2
# =------------------------------
#
# Huom! =-merkin jälkeen on oltava välilyönti tai - (jos piirretään hr)
#
# Jos tiedostoon halutaan linkki, se voidaan tehdä tyyliin:
#
# @https://trac.cc.jyu.fi/projects/ohj2k11/wiki/suunnitelmat/vesal=Suunnitelma Wikissä
#
# tai yksi linkki tyyliin
# !https://trac.cc.jyu.fi/projects/ohj2k11/wiki/suunnitelmat/vesal=Suunnitelma Wikissä
#
# jolloin tästä linkistä tulee framen oletuslinkki (näkyy framessa oletuksena).
# Muuten oletuslinkkinä on 1. löytynyt tiedosto
#
# Jos kommenttiosa on pelkkä linkki tyyliin:
#
# = http://user.jyu.fi/~vesal
#
# niin se muutetaan linkiksi. Jos rivillä on muuta, ei muuteta linkiksi.
#
# Jos projektiin tarvitaan esim. muiden tekemia komponentteja, niin
# nehan tietysti luetaan aivan jostakin muusta paikasta ja niita
# ei kirjoiteta FTP-komennossa takaisin (ei me pilata muiden tekemia).
# Talloin files.txt voisi olla esimerkiksi:
#
# =--------------------
# =Delphi työ
# =--------------------
# delphi/vespacad.dpr = projektitiedosto VespaCadia varten
# delphi/vespacadf.dfm = päälomake
# delphi/vespacadf.pas = lähdekoodi
# =--------------------
# =Muut tarvittavat komponentit
# =--------------------
# $DESTINATION=$COMPS
# $SOURCEPATH=http://www.mit.jyu.fi/~vesal/kurssit/winohj/winohj/delphi/comps/editpnl/
# savepos.pas = komponentti paikan tallettamiseksi
# SavePos.dcr = komponentin kuvake
#
# Selityksia files.txt -tiedostosta
# tiedoston nimi= suhteellinen nimi nykyiseen $SOURCEPATH-muuttujaan
# ja paikallisen levyn hakemistoon verrattuna.
# Oletuksena $SOURCEPATH riippuu konetorivin parametreista.
# Eli esimerkissa luetaan
# (komento: GET, tiedosto: delphi/vespacadf.pas)
# http://www.jyu.fi/~vesal/gko/delphi/vespacadf.pas
# -tiedosto, luodaan paikalliselle levylle delphi
# niminen alihakemisto ja kopioidaan tiedosto sinne.
# Vastaavasti FTP-komennolla otetaan paikallisen levyn
# tiedosto delphi/vespacadf.pas ja kirjoitetaan se
# www.jyu.fi-koneessa kayttajan vesal kotihakemistosta
# alkaen tiedostoksi www/gko/delphi/vespacad.pas
#
# $DESTINATION = paikallisen levyn hakemisto, jonne tiedosto laitetaan
# Apumuuttuja $COMPS on komentorivilta annetun
# comps-hakemiston arvo (pitaa sisaltaa /-merkki lopussa).
# Oletuksena comps-hakemisto on ../comps/
# $SOURCEPATH = www-polku, joka lisataan seuraavien tiedostojen nimien
# eteen kun tiedostoa haetaan WWW:sta.
# Oletuksena tama on tyhja. Ja jos kirjoitetaan
# $SOURCEPATH =, palataan kayttamaan alkuperaista hakemistoa
# joka maaraytyy komentorivin parametreista
# Ne tiedostot, joiden aikana $SOURCEPATH on epatyhja, ovat
# ReadOnly-tiedostoja, eli niita ei kopioda FTP-komennolla
# takaisin verkkoon. $SOURCEPATH ja $DESTINATION voidaan
# muuttaa kuinka monta kertaa tahansa, ja ne vaikuttavat
# seuraavaan muutokseen saakka.
#
# Kayttovinkkeja:
# ================
#
# A. Aloitus ja tallettaminen
# ----------------------------
# 1) kirjoita paikalliselle levylle tiedosto files.txt
# 2a)anna komento:
# perl lue.pl FTP files.txt www.jyu.fi vesal gko
# (Tietenkin korvaten www.jyu.fi, vesal ja gko vastaavilla koneen nimella,
# omalla tunnuksellasi ko. koneessa ja kurssin nimella).
# 2b)anna komento
# perl lue.pl COPY files.txt w: vesal gko
# 3) Nain sinulle syntyy www.jyu.fi-koneeseen hakemisto www/gko ja sen alle
# tarvittavat alihakemistot. Hakemistoon gko tulee tiedostot
# files.html ja index.html, joilla tiedostojasi voi selata kivasti.
# 4) Kun jatkossa lisaat uusia tiedostoja projektiisi tai paivitat
# vanhoja, niin tarpeen mukaan muutat paikallisessa koneessa
# (siis kayttamassasi mikrossa) tiedostoa files.txt tarpeen mukaan.
# Sitten annat aina kohdassa 2) mainitun komennon
#
# B. Tyon jatkaminen toisessa koneessa
# ------------------------------------
# 1) siirry paikallisessa koneessa omaan hakemistoosi, esim
# d:\omat\vesal\gko
# 2a)anna komentorivilta komento
# perl lue.pl GET files.txt www.jyu.fi vesal gko
# (Tietenkin taas korvaten nimet vastaavilla)
# 2b)anna komentorivilta komento
# perl lue.pl GET files.txt www.infotec.jyu.fi/users/vesal/gko
# (Tietenkin taas korvaten nimet vastaavilla)
# 3) Jatkat ohjelmointia ja lopettaessasi annat komennon kohdasta A.2)
#
# C. Helpottaminen
# ----------------
# 1) Jos osaat yhtaan kirjoittaa DOS-komentoja .bat -tiedostoon, niin
# kirjoitat itsellesi komento ht.bat:
# lue.pl %1 files.txt www.jyu.fi vesal gko
# 2) Lukeminen:
# ht GET
# 3) Tallettaminen:
# ht FTP
#
# D. Harjoitustyon nayttaminen
# -----------------------------
# 1) Kun saavut nayttamaan harjoitustyotasi kerro ohjaajalle
# a) tunnuksesi (esim. vesal)
# b) koneen nimi (esim. www.jyu.fi)
# c) kurssin tunnus (esim. gko)
#
# Vesa Lappalainen
# 26.5.1999
# 5.8.1999
# 26.10.1999
# + luodaan kurssihakemisto www-koneeseenkin jos se puuttuu
# 30.10.1999
# + vaihdettu käyttämään vlftplib.pl, koska alkup. ftplib.pl ei
# osannut binääristä siirtoa :-(
# 27.12.1999
# + salasana - katkaisee lopun skriptin suorituksen
# 19.11.2000
# + COPY - komento
# + PUREHTML -komento
# + GET-komentoon / tulkinta estämään polun muokkaus
# + Tuotettu HTML paremmin kelpaamaan validaattorille
# + hakemisotn nimen pakkomuuttaminen pieneksi poistettu =>
# PITÄÄ olla huolellinen hakemistojen nimiä kirjoitettaessa
#
# 27.12.2000
# + COPY luo kaikki tarvittavat kohdepolussa olevat hakemistot
#
# 20.1.2001
# + tulostetaan :iä kommenttirivien perään
# + tarkistetaan paremmin milloin lisätään http: ja milloin ei
#
# 27.1.2001
# + muuttaa välilyönnilliset tiedoston nimet linkeissä muotoon %20
# myös % muuteteen %25
# + tekee myös FTP:llä tarvittavat alihakemistot ennen siirtoa
#
# 12.1.2003 Heikki Kainulainen
# + tekee java-koodista javadocin ja sorsat html-muotoon
# käytetään ohjelmaa java2html (http://www.java2html.com)
#
# 27.1.2011 Vesa Lappalainen
# + tekee .cs tiedosta doxygen dokut ja linkit vastaavasti
#
###############################################################################
# require('vlftplib.pl'); # siirretty vain niihin kohti, joissa tarvitaan
use strict;
###############################################################################
sub trim($) { # merkkijono => merkkijono
my($s) = @_;
# Poistetaan merkkijonosta alkutyhjat, lopputyhjat ja rivinvaihdot (lopusta)
# Esim. " kissa istuu\n " => "kissa istuu"
$s =~ s/^\s*//; # alkutyhjat
$s =~ s/\s*$//; # lopputyhjat (myös rivinvaihdot)
# s/^\s*(.*?)\s*$/\1/;
return $s;
}
###############################################################################
sub ToHtmlName($) { # merkkijono => merkkijono
my($s) = @_;
# Poistetaan merkkijonosta alkutyhjat, lopputyhjat ja rivinvaihdot (lopusta)
# Esim. " kissa istuu\n " => "kissa istuu"
$s =~ s/%/%25/g; # välilyönnit
$s =~ s/ /%20/g; # välilyönnit
return $s;
}
###############################################################################
sub CheckHTTP($) { # merkkijono => merkkijono
my($s) = @_;
# Jos jonossa ei ole http://, niin se lisätään
# Samoin loppu / jos se puuttuu
# Esim. "www.mit.jyu.fi/~vesal" => "http://www.mit.jyu.fi/~vesal/"
# Tyhjästä jonosta palautetaan tyhjä jono
#
if ( $s eq "" ) { return $s; }
if ( !( $s =~ /\/$/ ) ) { $s = "$s/"; }
if ( !( $s =~ /^http:/ ) ) {
if ( !( $s =~ /^\// ) ) { $s = "/$s"; }
if ( !( $s =~ /^\/\// ) ) { $s = "/$s"; }
$s = "http:$s";
}
return $s;
}
use Time::localtime;
use File::stat;
###############################################################################
sub GetWWWFileDate($) # => mtime
#------------------------------------------------------------------------------
# Hakee WWW-tiedoston päiväyksen
# Esim: GetWWWFileDate('http://www.jyu.fi/~vesal/gko/delphi/vespacadf.dfm')
###############################################################################
{
my ($url) = @_;
$url = ToHtmlName(trim($url));
require LWP;
# Create the user agent object
my $ua =new LWP::UserAgent;
# Set up a request. We will use the same request object for all URLs.
my $request = new HTTP::Request "GET";
# Send the request and get a response back from the server
$request->url($url);
my $response = $ua->request($request);
if ($response->is_success) {
$response->headers->last_modified;
} else {
0;
}
}
#open(VSTDERR,">c:\\temp\\error.txt");
###############################################################################
sub GetWWWFile($$) {
my ($url,$file) = map {trim($_)} @_;
$url = ToHtmlName($url);
# $file = trim($file);
#------------------------------------------------------------------------------
# Hakee WWW-tiedoston ja tallettaa sen lokaalisti valituksi tiedostoksi
# Esim: GetWWWFile('http://www.jyu.fi/~vesal/gko/delphi/vespacadf.dfm',
# 'delphi/vespacadf.dfm');
# Mahdollisesti tarvittavat alihakemistot pitää jo olla olemassa
# Otetaan vain tiedostot, jotka ovat uudempia kuin kohdekoneessa
###############################################################################
my $filedate = 0;
my $filestat;
$filestat = stat($file) and $filedate = $filestat->mtime;
# my $filedate = $filestat->mtime if $filestat = stat($file);
require LWP;
# Create the user agent object
my $ua =new LWP::UserAgent;
# Set up a request. We will use the same request object for all URLs.
my $request = new HTTP::Request "GET";
# Send the request and get a response back from the server
$request->url($url);
my $response = $ua->request($request);
if ($response->is_success) {
if ( $response->headers->last_modified > $filedate ) {
print "$url => $file\n";
# print ctime($response->headers->last_modified) . " " . ctime($filedate) . "\n";
# print $response->headers->last_modified . " $filedate"\n";
open(OUT, ">$file") or die "Error opening output file $file: $!\n";
binmode OUT;
print OUT $response->content;
close(OUT) if ($file);
utime $response->headers->last_modified,$response->headers->last_modified,$file;
}
# else { print ctime($response->headers->last_modified) . " " . ctime($filedate) . "\n"; }
# else { print "@{[ctime($response->headers->last_modified) ctime($filedate)\n"; }
# else { print "$response->headers->last_modified";
} else {
print STDERR "ERROR: $url\n";
print STDERR $response->error_as_HTML;
}
}
###############################################################################
sub CopyTrim($$) {
my ($source,$dest) = map {trim($_)} @_;
# $url = trim($url);
# $file = trim($file);
#------------------------------------------------------------------------------
# Kopioi lokaalin tiedoston toiselle levylle
# Ei kopioi tyhjiä rivejä
# Esim: CopyTrim('delphi/vespacadf.dfm','w:/gko/delphi/vespacadf.dfm');
# Mahdollisesti tarvittavat alihakemistot pitää jo olla olemassa
# Kopioidaan vain tiedostot, jotka ovat uudempia kuin kohdekoneessa
###############################################################################
unless ( open(SOURCE,"<$source") ) { return 0; }
my @array =