Wij gebruiken sinds 2018 Python in plaats van Perl Perl is een programmeertaal die bij ons uitsluitend wordt gebruikt in het Flora systeem op de server en wel om daar op gezette tijden data op te halen van alle flora stations en deze data op te slaan in een PostgreSQL database. Deze database wordt dan bijvoorbeeld gebruikt om grafieken te maken. Om de server zo min mogelijk te belasten wordt een Deamon gemaakt die op de achtergrond loopt. Deze moet vanzelf starten als de server wordt gestart. Anno Ubuntu 18.04 is het natuurlijk de vraag wat er al is geïnstalleerd en wat we verder nog nodig hebben.
Eerste test |
We gaan eerst kijken of Perl is geïnstalleerd en zo ja welke versie door in een terminal perl -V uit te voeren. Een Perl programma kan geschreven worden met een gewone tekstverwerker. Als het programma is opgeslagen moeten de rechten worden aangepast zodat het een uitvoerbaar programma wordt. Vervolgens kan het programma met
perl /var/www/cgi-bin/test1.pl worden uitgevoerd. Dit zal laten zien dat we de module DBI missen.
Er bestaan diverse methodes om een module te installeren, die allen niet werken bij mij:
cpanminus |
Om makkelijk modules in Perl te kunnen installeren moet eerst cpanminus worden geïnstalleerd. Dit kan in een terminal worden gedaan met: sudo apt install cpanminus. sudo cpan App::cpanminus Vanaf nu kan iedere module worden geïnstalleerd met sudo cpanm Module::Name. |
make install |
sudo apt install make. Installeer vervolgens DBI.
perl Makefile.PL
make
make test
make install
|
|
export PERL5LIB=$HOME/perllib
DBI |
DBI is een database onafhankelijke interface voor Perl. Het is dus een soort abstractielaag tussen Perl en de database drivers. DBI kan op zichzelf nog niets, er zal dus ook nog een databasedriver moeten worden geïnstalleerd. DBI kan worden gevonden op metacpan. Installeer DBI met cpanm Module::DBI --sudo. tar xzf tar xzf DBI-1.641.tar.gz
Deze kan worden worden geïnstalleerd via het Ubuntu software centrum. Als test kan nu perl /var/www/cgi-bin/intro1.pl. worden gedraaid.DBI-1.607 (20080722) is een module voor perl die de communicatie met de database interfaces verzorgt. De onderstaande database driver heeft deze module nodig om correct te kunnen functioneren. Download de module naar een temp directory. Ga in een terminal naar deze directory en voer daar uit . Dit zal een nieuwe directory creëren. Ga daar in. Lees eerst de readme en volg de daar gegeven instructies. Voer de volgende stappen in deze directory uit:
DBI-1.51
DBI-1.51 (20060619) is een module voor perl die de communicatie met de database interfaces verzorgt. Het is dus een soort laag tussen perl en de perl-postgres driver. De onderstaande postgres driver heeft deze module nodig om correct te kunnen functioneren. Download de module naar een temp directory. Ga in een terminal naar deze directory en voer daar uit gzip -dc DBI-1.51.tar.gz | tar -xof -. Dit zal een nieuwe directory creeren. Ga daar in. Lees eerst de readme en volg de daar gegeven instructies. Voer de volgende stappen in deze directory uit:
perl Makefile.PL
make
In een terminal enter perl -v. Antwoord hier: This is perl, v5.8.8 built for i386-linux-thread-multi make test
make install |
DBD PostgreSQL |
pg_config executable
In een terminal enter which pg_config. Antwoord hier: /usr/bin/pg_config.
Indien pg_config niet gevonden wordt, dan krijgt u iets te zien zoals: not available. In dat geval moet u de pg_config executable installeren. Dit programmapakket is de ontwikkelomgeving voor PostgreSQL. Het is zelfs noodzakelijk dat u het installeert indien u PostgreSQL al lopend heeft, want DBD::Pg heeft het nodig tijdens zijn installatie. U kunt het pakket als su installeren met: yum install postgresql-devel. DBD-Pg-1.49
Zorg dat u geen root bent, maar een gewone user. DBD-Pg-1.49 (20060505) is een module voor perl die de communicatie met een postgres database verzorgt. Het is noodzakelijk om eerst de bovenstaande module te installeren. Download de module naar de Desktop. Ga in een terminal naar deze directory en voer daar uit gzip -dc DBD-Pg-1.49.tar.gz | tar -xof -. Dit zal een nieuwe directory creeren. Ga daar in. Lees eerst de readme en volg de daar gegeven instructies. De readme zegt: |
Nu kan perl met PostgreSQL werken. Deze interface wordt onderhouden door pgfoundry.org. Deze organisatie heeft meerdere tools en interfaces voor PostgreSQL.
CPAN Device-SerialPort LEGACY |
Om de seriële poort uit te kunnen lezen is een programma nodig dat in staat is om op de achtergrond de seriële poort uit te lezen en de gegevens op te slaan in een database. Onder Windows is het steeds moeilijker om met de seriële poort te werken. Dat is één van de redenen dat ik voor Linux heb gekozen. Onder Linux zal er een daemon module moeten worden gebouwd die deze taken op zich neemt. De serial port module verzorgt het uitlezen van de seriële poort. Het is een aangename module om als eerste te installeren omdat hij de standaard regels voor een installatie van Cpan helemaal volgt. Lees eerst de readme en volg de daar gegeven instructies. Zorg dat er niets op de seriële poorten is aangesloten.
javascript:post_action(12)sudo su -
cd /opt/perl/lib/5.10.1/modules
wget http://search.cpan.org/CPAN/authors/id/C/CO/Cook/Device-SerialPort-1.04.tar.gz
tar xzf Device-SerialPort-1.04.tar.gz
cd Device-SerialPort-1.04
perl Makefile.PL TESTPORT=/dev/ttyUSB0
make
make test
make install
Hij geeft tijdens het testen bij mij een klein testfoutje, maar alles werkt verder uitstekend. Voor het uitlezen van de poort heb ik een combinatie gebruikt van voorbeeld1 (poort instellen) en voorbeeld8 (poort uitlezen). Dit werkt uitstekend in een terminal. De volgende stap is om de gegevens die worden ontvangen op te slaan in een database. |
Installatie Legacy |
Ubuntu installeert Perl voor eigen gebruik. U kunt dit controleren in een terminal met Perl -v Het wordt afgeraden om deze versie van Perl te wijzigen omdat je nooit weet waar het schip zal stranden. Kan zijn, maar nu weet je zeker dat je bij iedere update een probleem hebt. Het wordt daarom geadviseerd om een extra versie van Perl te installeren. Deze methode is zoals vroeger alles gebeurde onder Linux:
sudo su -
cd /opt
mkdir perl-5.10.1
mkdir src
cd src
wget http://cpan.org/src/perl-5.10.1.tar.gz
tar xzf perl-5.10.1.tar.gz
cd perl-5.10.1
rm -f config.sh Policy.sh
./Configure -Dprefix=/opt/perl-5.10.1
make
make test
make install
cd /opt
ln -s perl-5.10.1 perl
exit
?? Verder moet u in uw scripts altijd duidelijk aangeven welke versie van perl u wilt gebruiken met: #!/opt/perl/bin/perl... |
Perl daemon maken |
Dit klinkt ingewikkeld en dat zou het ook zijn zonder een uitstekende handleiding op het internet. Het principe komt er in het kort op neer dat tijdens het opstarten een programma wordt opgestart. Dit programma forkt zichzelf naar een zelfstandig lopend dochterprogramma en doet daarna zichzelf afsluiten. Vanaf dat moment loopt het uitleesprogramma op de achtergrond. Onder Windows is deze stap overigens iets ingewikkelder, maar ook uitvoerbaar. Het programma moet onder Fedora worden aangeroepen vanuit /etc/rc.d/rc.local. |
Inleiding |
Perl is een programmeertaal die zowel werkt onder Windows alsook onder Linux. Deze beschrijving gaat over een installatie onder Ubuntu. Perl werkt met een interpreter en is ong. 23 keer zo langzaam als C++ maar weer wel dubbel zo snel als bijvoorbeeld PHP. Learn.perl.org/ bevat veel informatie. Het is niet verstandig om mijn programma’s in Perl rechtstreeks te kopiëren om te gebruiken voor uw eigen programma’s. Aangezien mijn kennis van Perl beperkt is zijn mijn programma’s in ieder geval niet erg efficiënt en mogelijk soms zelfs fout. U bent gewaarschuwd :)
Om sommige specifieke taken kunnen uitvoeren moeten er diverse modules aan Perl worden toegevoegd. Perl is een programmeertaal, waarmee ook daemons gemaakt kunnen worden. Om de data in een PostgreSQL database te kunnen opslaan, moeten er een aantal plug-ins worden gecompileerd en geïnstalleerd. Let op de volgorde van installatie, want die is belangrijk. De beste site om plug-in modules te halen voor Perl is Cpan. Er bestaat weliswaar een algemene beschrijving over hoe modules in Perl dienen te worden geïnstalleerd, maar iedere module van CPAN levert een eigen installatiebeschrijving mee die absoluut gevolgd moet worden. |
DBD MySQL Legacy |
DBD-msql-4.011 (20090414) is een module voor Perl die de communicatie tussen Perl en een databasemodule verzorgt. Het is noodzakelijk om eerst de bovenstaande module te installeren. Deze module kan simpel worden geïnstalleerd door CPAN te gebruiken. |
//This is an include, so no parsing needed
$qry2 = ("SELECT onderdelen.*,
soortonderdeel.id
FROM onderdelen
JOIN soortonderdeel ON onderdelen.idsrtodd = soortonderdeel.id
WHERE onderdelen.partid = $idpart
;");
$result2 = pg_query($con1, $qry2);
$row4 = pg_fetch_array($result2); //Make the fields accesible
foreach( $row4 AS $key => $val ){
$$key = stripslashes( $val );
}
$jaar = substr($changeddate,0,4);
$maand = substr($changeddate,5,2);
$dag = substr($changeddate,8,2);
$lastupdate = ("$jaar $maand $dag");
$prtsrttxt = get_txt($con1, 26, 1, $idsrtodd);
$jaar = substr($createddate,0,4);
$maand = substr($createddate,5,2);
$dag = substr($createddate,8,2);
$create_stamp = ("$dag $maand $jaar");
//GENERAL INFO FOR EVERY USER **************************************************
echo (" ");
echo (""); //Header
$tmp = get_txt($con1, 9, $koekje[2], 3923); //Fieldname at screen
if ($koekje[3]=="1") { //If this user wants to translate then
echo ("$tmp"); //If desired
}else{ echo ("$tmp"); } //Else just show if no need to translate
if ($koekje[0]>0 and $koekje[3]>0){ //User is logged in and translates
echo (" (edit)");
}
echo ("Algemene informatie test | ");
if ($codetext) { //Code like KY-026 or NA-41
echo ("");
$tmp = get_txt($con1, 9, $koekje[2], 3739); //Fieldname at screen
if ($koekje[3]=="1") { //If this user wants to translate then
echo ("$tmp"); //Class for colour
}else{ //So you are not allowed to translate
echo $tmp; //Show screenname of this field in user language
} //End of If you want to translate this fieldname at screen
echo ("  | ");
if ($codelink) {
echo ("$codetext");
}else{
echo ("$codetext");
} //End of if ($pinoutlink)
echo (" | ");
} //End of if ($codetext)
$tmp = get_txt($con1, 9, $koekje[2], 3741); //Fieldname at screen
if ($prijseurinclbtw > 0){ //Show price indication
$prijs_formatted = number_format($prijseurinclbtw / 100, 2, ',', '.');
echo ("$tmp   | ");
echo ("");
if ($urlprijs){
echo ("€  $prijs_formatted");
}else{
echo ("€  $prijs_formatted");
} //End of if ($urlprijs > "")
echo (" | ");
} //End of if ($prijseurinclbtw > 0)
if ($sketchtext) { //Link to OWN SOFTWARE
$tmp = get_txt($con1, 9, $koekje[2], 3738); //Fieldname at screen
echo ("$tmp   | ");
if ($sketchlink) {
echo ("$sketchtext");
}else{
echo ("$sketchtext");
} //End of if ($sketchlink)
echo (" | ");
} //End of if ($sketchtext)
$tmp = get_txt($con1, 9, $koekje[2], 3744); //Fieldname at screen
if ($pinouttext) { //Pinout
echo ("$tmp   | ");
if ($pinoutlink) {
echo ("$pinouttext");
}else{
echo ("$pinouttext");
} //End of if ($pinoutlink)
echo (" | ");
}
$tmp = get_txt($con1, 9, 1, 3735); //Fieldname at screen
$tmp2 = get_txt($con1, 26, 1, $row4[16]); //Group name in its language
echo ("$tmp   | "); //MENU GROUP
echo ("");
echo ("$tmp2 | ");
if ($koekje[0]>0 and $koekje[3]>0){ //User is logged in and translates
$tmp = get_txt($con1, 9, $koekje[2], 3918); //Fieldname at screen LANGUAGE
if ($row4[26] == 1) {$imgname = "nederland.png";}
if ($row4[26] == 2) {$imgname = "deutschland.png";}
if ($row4[26] == 3) {$imgname = "uk.png";}
if ($row4[26] == 4) {$imgname = "france.png";}
echo ("$tmp | ");
echo ("");
echo (" | ");
$tmp = get_txt($con1, 9, $row4[27], 3919); //Fieldname at screen
$statuskey = get_status_key($con1, $status);
$tmp2 = get_txt($con1, 61, $koekje[2], $statuskey); //Fieldname at screen
echo ("$tmp   | "); //STATUS
echo ("$status $tmp2 | ");
}
$tmp = get_txt($con1, 9, 1, 3966); //Fieldname at screen
echo ("$tmp   | "); //LAST CHANGED
$tmp = substr($changeddate, 0, 10);
echo ("$tmp | ");
echo (" ");
return;
////////////////////////////////////////////////////////////////////////////////
function get_status_key($con, $num){
$qry = ("SELECT id FROM status WHERE nr = $num ;");
$result = pg_query($con, $qry);
$row = pg_fetch_array($result);
return ("$row[0]");
}
// LIST ALL SOFTWARE THAT WILL RUN OM THIS PART *****************************
// INCLUDED IN ALL ROBOTS TO CHECK THEIR DIRECTORY
$qry2=("SELECT tblsystext.txtname
, software.urlmain
, software.sftname
, software.sftid
, software.controller
FROM software
LEFT JOIN tblsystext ON software.controller = tblsystext.recordid
WHERE position(' $idpart ' in software.prtlst) > 0
AND software.rstid = 2
AND tblsystext.lanid = $koekje[2]
AND tblsystext.txlid = 19
ORDER BY sftname ASC
, controller ASC
;");
$result = pg_query($con1, $qry2);
if (pg_num_rows($result)>0) { //Only if at least 1 program exists
echo (' ');
echo (""); //Header
$tmp = get_txt($con1, 9, $koekje[2], 3922); //Fieldname at screen
if ($koekje[3]=="1") { //If this user wants to translate then
echo ("$tmp"); //If desired
}else{ echo ("$tmp"); } //Else just show if no need to translate
echo (" |
---|
");
while($col = pg_fetch_array($result)){
$col[0] = ("$col[0]");
echo (" ");
echo ("$col[2]   | ");
echo ("$col[0] | ");
if ($koekje[0] > 0 and $koekje[3]>0){ //User is logged in and translates
echo ("");
echo ("(Edit) | ");
}
echo (' ');
}
echo (' ');
}
?>
// LIST ALL ROBOTS THAT INCLUDE THIS PART ***********************************
// $idpart
// INCLUDED IN ALL ROBOTS TO CHECK THEIR DIRECTORY
$qry_bpp=("SELECT farmbotversie.id
, farmbotversie.part_list
, tblsystext.txtname
FROM farmbotversie
LEFT JOIN tblsystext ON farmbotversie.id = tblsystext.recordid
WHERE tblsystext.txlid = 27
AND tblsystext.lanid = $koekje[2]
ORDER BY tblsystext.txtname ASC
;");
$result_bpp = pg_query($con1, $qry_bpp);
$header = 0;
while($colbpp = pg_fetch_array($result_bpp)){ //Only if at least 1 robot exists
if(substr_count($colbpp[1], " $idpart ") > 0){
if ($header == 0) {
echo ("");
echo (""); //Header
$tmp = get_txt($con1, 9, $koekje[2], 3879); //Fieldname at screen
if ($koekje[3]=="1") { //If this user wants to translate then
echo ("$tmp"); //If desired
}else{ echo ("$tmp"); } //Else just show if no need to translate
echo (" | ");
$header++;
} //End of if ($header == 0)
echo ("");
echo ("$colbpp[2]");
//Show software van deze bot
$qry=("SELECT software_basedir
FROM farmbotversie
WHERE id = $colbpp[0];");
$result = pg_query($con1, $qry);
$col = pg_fetch_array ($result ,0);
$dir1 = "/var/www/html/robotigs/software/$col[0]";
$arr1 = glob($dir1, GLOB_ONLYDIR);
if (isset($arr1[0])){
$folder = $arr1[0];
$countertmp = 0;
echo ("");
foreach (scandir($folder, 1) as $filename) {
if ($filename<>"." AND $filename <>".."){
if ($countertmp == 0){
$countertmp++;
} //End of if ($countertmp == 0)
$tmp = "/";
$dir = substr($folder, 14) ."/";
$link = $tmp .$dir .$filename;
$showname = substr($filename, 0 ,-4);
echo ("- ");
echo "$showname";
echo ("
");
} //End of if ($filename<>"." AND $filename <>".."){
} //End of foreach (scandir($folder, 1) as $filename)
echo ("");
} //End of if (isset($arr1[0]))
echo (" | ");
}
}
if ($header > 0){
echo (" ");
}
?>
Warning: include(/var/www/html/robotigs/includes/wishlistperpart.php): Failed to open stream: No such file or directory in /var/www/html/robotigs/includes/parts_header.php on line 128
Warning: include(): Failed opening '/var/www/html/robotigs/includes/wishlistperpart.php' for inclusion (include_path='.:/usr/share/php') in /var/www/html/robotigs/includes/parts_header.php on line 128
| //Location:/robotigs/includes/ picts_show.php
// Requieres: $pict_list and several picture handling javascript routines
//*** FROM HERE ON THE PICTURE CORNER STARTS -----------------------------------
if ($pict_list){ //There are 1 or more pictures to be printed
echo ("");
$counter = 0;
$aantal = str_word_count($pict_list, 0, "0123456789");
$lijst = str_word_count($pict_list, 1, "0123456789");
while($counter < $aantal){
$pictkey = $lijst[$counter];
$qryy1 = ("SELECT *
FROM illustrations
WHERE ill_id = $pictkey
;");
$resulty1 = pg_query($con1, $qryy1);
while($row = pg_fetch_array($resulty1)){ //Fields accesible by their name
foreach( $row AS $key => $val ){
$$key = stripslashes( $val );
}
}
$image = ("/robotigs/documentatie/plaatjes/$ill_name");
$pictfull = str_replace('_small', '', $image); //Pictfull=biggest version
$alt = ("Just wait till your 57....");
$txtname = get_txt($con1, 18, $koekje[2], $ill_id); //Robot illustrations subtitles
echo ("");
echo (' ');
$nummer = $counter + 1;
$txtAfb = get_txt($con1, 9, $koekje[2], 3865); //Pic Afb
if ($koekje[0]>0 and $koekje[3]>0){ //User is logged in and translates
echo ("$txtAfb $nummer: ");
echo ("$txtname");
echo (" ");
echo ("Ontkoppelen ");
if ($counter==0){
echo ("Up ");
}else{
echo ("Up ");
}
if ($nummer == $aantal){
echo ("Down");
}else{
echo ("Down");
}
}else{ //Else of if Meaning the current useer is logged in
echo ("$txtAfb $nummer: $txtname");
}
echo (''); //End of this picture
$counter++; //Prepair for next picture
}
echo (' | '); //All pictures are printed
} //End of if there are 1 or more pictures to be printed ----------------------
?>