Kompilacja na serwerze

Z UMP

Spis treści

Uwaga dokument wysoce techniczny

potrzebny w zasadzie tylko nielicznym developerom lub na wypadek przejechania mnie przez tramwaj.

aliasy dla punktów

czyli końcówka na samym początku. Żeby dodać nowy typ dla punktów, lub zmienić istniejący, należy:

  • dla kompilacji: zmienić pnt2poi.awk
  • dla edytorów: zmienić mont-demont-multi2.pl (i ewentualnie exe)
  • dla mapy na www: zmienić ump-www/mapnik_style/settings/styles_points.xml oraz ump-www/ump2osm/rules.xml

crontab woła

#!/bin/sh

skrypty=$HOME/skrypty
logi=$skrypty/logi
mapy=/home/httpd/html/ump/update
#naboku=$skrypty/naboku
mapa=$mapy/48000003.zip
mapatmp=/var/tmp/48000003.zip
tempfile=/var/tmp/gps.$$

$skrypty/replikuj-cvs

# ------ jak mamy nowe dane, można je skompilować -------------------
# sprawdź jakie są nowe dane na cvs
cvs_log=$logi/cvs.log
kiedycvs=`grep -n 200.$ $cvs_log | tail -n 1 | cut -d : -f 1`
#kiedynury=`grep -n nury $cvs_log | tail -n 1 | cut -d : -f 1`
kiedyikonki=`grep -n narzedzia\/ikonki\/ $cvs_log | tail -n 1 | cut -d : -f 1`

kiedybialystok=`grep -n UMP-Bialystok\/src $cvs_log | tail -n 1 | cut -d : -f 1`
kiedyciechanow=`grep -n UMP-Ciechanow\/src $cvs_log | tail -n 1 | cut -d : -f 1`
itd. itd.
kiedyanglia=`grep -n UMP-GB-Anglia\/src $cvs_log | tail -n 1 | cut -d : -f 1`

kiedycokolwiek=`grep -n -e UMP -e ump $cvs_log | tail -n 1 | cut -d : -f 1`

if [ $kiedycokolwiek -gt $kiedycvs ]; then $skrypty/listuj-nazwy; $skrypty/generuj-cvslog; cp -uf $mapa $mapatmp; fi

if [ $kiedyszlaki -gt $kiedycvs ]; then $skrypty/generuj-szlaki; fi
if [ $kiedyradary -gt $kiedycvs ]; then $skrypty/generuj-radary; fi

if [ $kiedybialystok -gt $kiedycvs ]; then $skrypty/kompiluj-bialystok; fi
if [ $kiedyciechanow -gt $kiedycvs ]; then $skrypty/kompiluj-ciechanow; fi
itd. itd.
if [ $kiedyanglia -gt $kiedycvs ]; then $skrypty/kompiluj-gb-anglia; fi

if [ $kiedyikonki -gt $kiedycvs ]; then $skrypty/generuj-typy; fi

if [ $kiedycokolwiek -gt $kiedycvs ]; then $skrypty/generuj-indeksy; fi

$skrypty/sprawdz-www

replikuj cvs

trywialne

#!/bin/sh

# ----------------- zreplikuj cvs i spakuj nowe pliczki
homek=$HOME
cvs_log=$homek/skrypty/logi/cvs.log

# (uwaga: nie zauważa skasowania pliku więc rzeczy wywalone z cvs zostają w zipie)
cd $homek/cvs
date +'%n%c' >> $cvs_log
# i żeby najpierw były zmiany w szlakach czyli *.szlaki.topo.txt
cvs -d:pserver:aldziew@localhost:/home/cvsroot up UMP-szlaki -Pd 1>> $cvs_log 2>> /dev/null
cvs -d:pserver:aldziew@localhost:/home/cvsroot up -Pd 1>> $cvs_log 2>> /dev/null
# nie trzeba cvs checkout bo nowe pliki się i tak pojawiają - ale nowe katalogi nie
# znowuż co chyba nie wypisuje danych do logu :-o

# lista autorów
cp -u $homek/cvs/narzedzia/opisy/autorzy $homek/html/ump/autorzy
chmod go+r $homek/html/ump/autorzy

# pakiet install
zip -fj $homek/html/ump/pliki/instaluj.zip $homek/cvs/narzedzia/install/instaluj.*

generuj cvslog

kompiluj

wywołania "krajowe" to po prostu

#!/bin/sh
~/skrypty/kompiluj Andora 37600001

a główny skrypt kompiluj

#!/bin/bash

if [ $# -gt 0 ]; then miasto=$1; ID=$2; shift; shift; else echo Należy się podać dwa parametry - $0 miasto ID; exit; fi

topo=nietopo; ogonki=nie; NI=nie; # ogonkowatość implikuje NI czyli brak kompilowania
while [ $# -gt 0 ]; do
   if [ "$1" = "topo" ]; then topo=topo; fi
   if [ "$1" = "ogonki" ]; then ogonki=tak; fi
   if [ "$1" = "NI" ]; then NI=tak; fi
   shift
done
# nie ma sensu wersja ogonki nie-NI
if [ $ogonki = tak ]; then NI=tak; fi
# jeśli wersja zwykła, to trzaśnij źródła do wersji NI (i ogonkowej?)
if [ $NI = nie ]; then
   if [ $topo = nietopo ]; then
       $0 $miasto $ID NI
       $0 $miasto $ID ogonki
   fi
fi

homek=$HOME
skad=$homek/cvs/UMP-$miasto
#pnt2poi=$homek/gps/pnt2poi
#\ -c\ nic\ -r\ $miasto
skrypty=$homek/skrypty
narzedzia=$homek/cvs/narzedzia
pnt2poi=$narzedzia/pnt2poi

logi=$skrypty/logi
netgenlog=$logi/routing-$miasto.log
kompillog=$logi/kompiluj-$miasto.log
wojeklog=$logi/wojek-$miasto.log
naboku=$homek/gps/naboku-$topo
#komumaile=aldziew,starazie@interia.pl
komumaile=ump
#komumaile=aldziew
#,Piotr.Frasunkiewicz@eranet.pl
wojekmapa=$narzedzia/mapka_woj.mp
pid=$$
wyslac=/tmp/mail.$pid
temp=/tmp/tmp.$pid
#lockfile=/tmp/cgpsmapper.pid
region=`echo $miasto | cut -f 2 -d "-"`

wynik=$homek/tmp/zrodla/UMP-$miasto-caly-$topo.mp
mapy=/home/httpd/html/ump/update
mapa=$mapy/48000003-$topo.zip
mapatmp=/var/tmp/48000003-$topo.zip
# img musi być lokalnie, bo inaczej zip na siłę zachowuje ścieżkę
img=img/$ID.img

#cat > $wynik << KONIEC-NAGL
echo [IMG ID] > $wynik
echo ID=$ID >> $wynik
echo FamilyID=4800 >> $wynik
echo Name=UMP-$miasto-`date +%d%b` >> $wynik
echo Datum=W84 >> $wynik
# było 2048
echo TreSize=3096 >> $wynik
echo RgnLimit=1024 >> $wynik
echo Levels=6 >> $wynik
echo Level0=24 >> $wynik
echo Level1=22 >> $wynik
echo Level2=20 >> $wynik
# było: 17 15 13
echo Level3=18 >> $wynik
echo Level4=16 >> $wynik
echo Level5=15 >> $wynik
if [ $ogonki = tak ]; then echo NT=Y >> $wynik; fi
echo POIIndex=Y >> $wynik
echo MG=Y >> $wynik
echo Numbering=Y >> $wynik
echo POINumberFirst=N >> $wynik
echo POIZipFirst=Y >> $wynik
echo Routing=Y >> $wynik
# lower first, default 25
echo DrawPriority=23 >> $wynik
echo Copyright=ump.waw.pl debest >> $wynik
echo Elevation=m >> $wynik
#echo DefaultRegionCountry=$miasto >> $wynik
#echo DefaultCityCountry=Polska~[0x1d]PL >> $wynik
if [ $ogonki = tak ]; then
   echo LBLcoding=9 >> $wynik
   echo Codepage=1250 >> $wynik
#    else
   #echo LBLcoding=6 >> $wynik
   #echo Codepage=0 >> $wynik
fi
# lewostronni: Brytania * 3, Irlandia, Cypr, Malta
if [ $ID = 44100001 ]; then echo LeftSideTraffic=Y >> $wynik; fi
if [ $ID = 44130001 ]; then echo LeftSideTraffic=Y >> $wynik; fi
if [ $ID = 44280001 ]; then echo LeftSideTraffic=Y >> $wynik; fi
if [ $ID = 35300001 ]; then echo LeftSideTraffic=Y >> $wynik; fi
if [ $ID = 35700001 ]; then echo LeftSideTraffic=Y >> $wynik; fi
if [ $ID = 35600001 ]; then echo LeftSideTraffic=Y >> $wynik; fi
echo [END-IMG ID] >> $wynik
#KONIEC-NAGL

#cat $homek/cvs/ump-wawa/src/dictionary.txt >> $wynik
##########cat $narzedzia/regions.txt >> $wynik
if [ -f $skad/$miasto-big.mp ]; then gawk '$0 ~ "END-IMG ID", EOF' < $skad/$miasto-big.mp >> $wynik; fi

# można uprościć: żeby miasta dodawało za każdym razem osobno, a nie wspólne
for pnt in `ls $skad/src/cities-*.pnt 2> /dev/null`; do cat $pnt | $pnt2poi >> $wynik; done
echo \;\; punkty >> $wynik
if [ $topo = nietopo ]; then
    for pnt in `ls $skad/src/*.pnt 2> /dev/null | grep -v \.topo\. | grep -v cities`; \
        do cat $pnt | grep -vf $narzedzia/md-filtr-bez | $pnt2poi -c nic >> $wynik; done
else
    for pnt in `ls $skad/src/*.pnt 2> /dev/null | grep -v cities`; \
        do cat $pnt | $pnt2poi -c nic >> $wynik; done
fi;
echo \;\; koniec >> $wynik

$narzedzia/formatuj_numery_telefonow.pl < $wynik > $temp 2> $wyslac
mv $temp $wynik

if [ -d $skad/src ]; then
   for m in `ls $skad/src/*.ulice.txt 2> /dev/null | grep -v inne`; do
#      nie przerabiaj na miasto
#      zpliku=`echo $miasto | cut -d "/" -f 8`
#      miastko=`echo $zpliku | cut -d "." -f 1`
#      cat $skad/src/$zpliku | gawk '{sub(/^\[POLYLINE\]/,"\[POLYLINE\]\nMiasto='$miastko'");print}' >> $wyniky
       gawk -f $narzedzia/md-montaz.awk $m | grep -v Plik= >> $wynik
   done
cat $skad/src/*inne.ulice.txt >> $wynik 2> /dev/null
cat $skad/src/*.drogi.txt >> $wynik 2> /dev/null

cd $skad/src
cat `ls -1 | grep -f $narzedzia/md-filtr | grep -v \.ulice\.txt | grep -v \.drogi\.txt | grep -v \.zakazy\.txt` >> $wynik
if [ $topo = topo ]; then cat *.topo.txt 2> /dev/null >> $wynik; fi

# SERIA PODMIAN - może to można uprościć, albo zmienić kolejność, ale po co?
# zamiana typów dwubajtowych na trzybajtowe
   cat $wynik | sed -e 's/Type=0xe0/Type=0x010e0/g' \
       -e 's/Type=0xe1/Type=0x010e1/g' > $temp; mv $temp $wynik
#       -e 's/Type=0xf0/Type=0x010f0/g' \
#       -e 's/Type=0xf1/Type=0x010f1/g' > $temp; mv $temp $wynik
cd -> /dev/null

# zmiana typów
# $skrypty/zamien_rampy.pl $wynik 2> /dev/null
# zamień myślniki w nazwach na spacje
sed '/Label/s/-/ /g' $wynik > $temp
# dodaj Label2, jeśli Label ma tabliczkę i nazwę
gawk -f $narzedzia/label2.awk < $temp > $wynik
# mv $temp $wynik

#if [ -a $skad/src/*.zakazy.txt ]; then
 cat $skad/src/*.zakazy.txt >> $wynik 2> /dev/null
#; fi

if [ $ogonki = tak ]; then
   # zamiana 0x2d-f na 0x04-6 (kodowanie 8bit)
   sed -e 's/~\[0x2d/~\[0x04/g' -e 's/~\[0x2e/~\[0x05/g' -e 's/~\[0x2f/~\[0x06/g' $wynik > $temp; mv $temp $wynik
fi;

 if [ $NI = nie ]; then
 # ucinamy też dzielnice vel drugie miasta
 cut -f 1 -d @ $wynik > $temp; mv $temp $wynik;  fi

## granice wspólne i obszar - tylko właściwe (szuka całych słów)
grep -w -A 5 $region $narzedzia/granice.txt >> $wynik
grep -w -A 6 $region $narzedzia/obszary.txt >> $wynik
fi

wojekbledy=$logi/wojek-bledy-$miasto.wpt
/usr/local/bin/wojek -s $homek/gps/wojek-slownik.txt -k $wojekmapa -d -e $wojekbledy < $wynik > $temp 2> $wojeklog
mv $temp $wynik
if [ `grep -c . $wojekbledy` -eq 4 ]
   then rm $wojekbledy
   else cat $wojekbledy | mail aldziew -s wojek-$miasto
fi

### seria podmianek:
# zamiana Miasto= na CityName=, kod pocztowy też
# oraz rozwiązanie sklejania ][ przez dodawanie entera między obiektami
sed -e 's/Miasto=/CityName=/g' -e 's/^KodPoczt=/ZIP=/g' -e 's/^\[POLY/\n\[POLY/g' $wynik > $temp; mv $temp $wynik

# dla Polski - tłumaczenie ISO-8859-2 na CP1250
if [ `echo $ID | cut -c 1,2` -eq 48 ]; then
   #   ąB1 śB6 źBC ĄA1 ŚA6 ŹAC    šB9 <9C>9C <9F>9F ĽA5 <8C>8C <8F>8F
   cat $wynik | tr '\261\266\274\241\246\254' '\271\234\237\245\214\217' > $temp; mv $temp $wynik
fi

# tłumaczenie CP1250 na bezogonkowe
if [ $ogonki = nie ]
   then
   cat $wynik | \
   sed -e 's/ß/ss/g' | \
   tr    '<80><8A><8C><8D><8E><8F><99><9A><9C><9D><9E><9F>ŁĽŠŞŽŻłšşźžżŔŕÁáÂâĂăÄäĹĺĆćÇçČčÉéĘęËëĚěÍíÎîĎďĐđŃńŇňÓóÔôŐőÖöŘřŮůÚúŰűÜüÝýŢţß_' \
       'ESSTZZtsstzzLAcSrZlasLlzRrAaAaAaAaLlCcCcCcEeEeEeEeIiIiDdDdNnNnOoOoOoOoRrUuUuUuUuYyTtB ' > $temp;
   else
   # dla wszystkich - tylko zamiana podkreślenia na spację (bo wieloczłonowe nazwy miast brane z nazw plików *.ulice.txt
   cat $wynik | tr "_" " " > $temp;
fi
mv $temp $wynik

zip -qDj $homek/ftp/zrodla/net-$miasto $wynik ; chmod go+r $homek/ftp/zrodla/net-$miasto.zip

#cp $wynik ~/skrypty/dla-netgena.mp
/usr/local/bin/netgen -b -j -k -R -T$narzedzia/netgen.cfg < $wynik > $temp 2> $netgenlog
# -e0.00002 -p5
mv $temp $wynik

# KONIEC MONTOWANIA

if [ $ogonki = nie ]; then
   cat $wynik | tr '{}' '()' > $temp
   mv $temp $wynik
fi

# poprawka (podnoszenie) leveli - skrypt Michała Jankowskiego
cat $wynik | $skrypty/podnies-poziom.pl > $temp
mv $temp $wynik

# topo albo ogonki - koniec roboty bo serwer nie kompiluje kolorowych szlaków
if [ $topo = topo ]; then zip -q -Dj $homek/ftp/zrodla/srt-$miasto $wynik; chmod go+r $homek/ftp/zrodla/srt-$miasto.zip; rm $wyslac; exit; fi
if [ $ogonki = tak ]; then zip -q -Dj $homek/ftp/zrodla/sro-$miasto $wynik; chmod go+r $homek/ftp/zrodla/sro-$miasto.zip; rm $wyslac; exit; fi
if [ $NI = tak ]; then zip -q -Dj $homek/ftp/zrodla/src-$miasto $wynik; chmod go+r $homek/ftp/zrodla/src-$miasto.zip; rm $wyslac; exit; fi
# zwykłe - nie potrzeba źródeł

# KOMPILACJA
#while [ -a $lockfile ]; do sleep 15s ; done
#touch $lockfile
mkdir img
date > $kompillog
date +%s >> $kompillog
nice -5 /usr/local/bin/cgpsmapper ac -m -e -l $wynik -o $img >> $kompillog
#rm $lockfile
date +%s >> $kompillog
date >> $kompillog
rm img/$ID.img.idx
#sed -e 's/^0095/0097/g' img/$ID.img.idx > $temp; mv $temp img/$ID.img.idx
#chmod go+r img/$ID.img.idx
#if [ -s img/$ID.img.idx ]; then mv img/$ID.img.idx $homek/html/ump/update/idx; else rm mv img/$ID.img.idx; fi

# sposób: luzem (na boku)
mv $img $naboku/$img
## uwaga to był mv

# sposób: do zipa
#if [ ! -f $mapatmp ]; then cp $mapa $mapatmp; fi
#zip -qm $mapatmp $img
#rm $mapatmp
rmdir img


### SPRAWDZANIE BŁĘDÓW ###
## sprawdzmy tylko dla wersji roboczej... żeby nie wypisywał tych samych błędów trzy razy
if [ $ogonki = tak ]; then exit; fi
if [ $NI = tak ]; then exit; fi

# $wynik = plik źródłowy
# Warning: Too many nodes (64) in road 102 (~[0x2c]69).
# albo
# Error R009: Limit of 60 segments for a single road exceed.
if [ `grep -c "Warning: Too many" $netgenlog` -gt 0 ]; then
    echo -------- Błąd zbyt wielu skrzyżowań >> $wyslac
    grep "Warning: Too many" $netgenlog | cut -d " " -f 8 | tr " " "\n" | gawk '{print "RoadID="$0"$"}' > $temp
    grep -A 5 -f $temp $wynik | cut -d "," -f 1-7 >> $wyslac
    #
   grep -A 1 "Error R009: Limit of 60 segments" $kompillog | grep RoadID | tr -d " " | gawk '{print $0"\$"}' > $temp
   grep -B 2 -A 9 -f $temp $wynik | cut -d "," -f 1-7 | grep -E "Label|CityName|Data0|--" >> $wyslac
   rm $temp
fi

ilerozjazd=`grep -c "Warning: Road with" $netgenlog`
if [  $ilerozjazd -gt 0 ]
   then echo -------- Rozcialem droge z numeracją $ilerozjazd razy >> $wyslac
   grep -B 1 "Warning: Road with" $netgenlog >> $wyslac
   #else rm $mapka
fi

#Traffic restriction for unknown points/streets
#Points: 8347 , 8479
#Road: 11817
#Note - traffic restrictions can be created only between routable points.
if [ `grep -c "Traffic restriction for unknown" $kompillog` -gt 0 ]; then
   echo Traffic restriction for unknown points/streets >> $wyslac
   grep -A 8 RoadID=`grep "Traffic restriction for" -A 3 $kompillog | grep Road: | cut -d " " -f 2`$ $wynik | \
       grep Data0 | cut -d "," -f 1-7 >> $wyslac
   #| mail aldziew -s "Zakaz się sypnął w $miasto"
fi

# kompiler

# BŁĄD cgpsmapper
# RoadID = 4288
# Error R008: Too short road to be routable - coordinates were aligned to same place.

#Error R010: No data for routing - remove 'ROUTING=Y' from [IMG ID] for non routable maps!

# /home/users/aldziew/skrypty/UMP-Olsztyn-caly.mp(18185) : Warning W004: Cannot determine type
# of element, type cannot be defined before RGNTYPE.
# (typ 0x0) bo źle wklepano składnię pnt?


# Błędy KOMPILATORA
#Distance is below 5.4, NODID1: 2269, NODID2: 2268 RgnID: 629
#Error R011: NODID points cannot be closer than 5.4 meter!
if [ `grep -c "Distance is below 5.4" $kompillog` -gt 0 ]; then
   echo -------- Za blisko węzły >> $wyslac
   grep "Distance is below 5.4" $kompillog | cut -d " " -f 10 | tr " " "\n" | gawk '{print "RoadID="$0"$"}' > $temp
   grep -B 2 -A 9 -f $temp $wynik | cut -d "," -f 1-7 | grep -E "Label|CityName|Data0|--" >> $wyslac
   rm $temp
# =?iso-8859-2?Q?  i na końcu ?=
fi

# UMP-Kalisz-caly.mp(9411) : Error E019: Street cannot intersect with itself! Split this element!


#Warning: Road 544 (~[0x2e]41) passes through node 2099 (50.46705,17.34140) more than once.
if [ `grep -c "Warning.*more than once" $netgenlog` -gt 0 ]; then
   echo -------- Za duże zapętlenie >> $wyslac; grep "more than once" $netgenlog >> $wyslac
fi

# cannot parse coordinates ?

# /home/users/aldziew/skrypty/UMP-Zamosc-caly.mp(29114) : Error E038: Type of element cannot be 0.
if [ `grep -c "Error E038" $kompillog` -gt 0 ]; then
   echo -------- Linia typ zero >> $wyslac
   for linia in `grep "Error E038:" $kompillog $wynik | cut -d "(" -f 2 | cut -d ")" -f 1`; do
       head -n $linia $wynik | tail -n 3 | cut -d "," -f 1-8 >> $temp
   done
   cat $temp >> $wyslac
fi


# Błędy NETGEN
# Restriction: TYTUŁ. Number of roads connecting node 3398 with node 3390 (0) is other than 1.
ilerozjazd=`grep -c "Restralnum:*:" $netgenlog`
if [  $ilerozjazd -gt 0 ]
   then echo -------- Restrykcje sztuk $ilerozjazd się nie wpasowało >> $wyslac; grep "Restr[a-z]*:" $netgenlog >> $wyslac
   #else rm $mapka
fi

# UMP-Szczecin-caly.mp(119665) : Warning W005: Error reading data.
if [ `grep -c "Warning W005:" $kompillog` -gt 0 ]; then
   echo -------- Dziwna pomylka >> $wyslac
   echo > $temp
   for linia in `grep "Warning W005:" $kompillog | cut -d "(" -f 2 | cut -d ")" -f 1`; do
       head -n $linia $wynik | tail -n 3 | cut -d "," -f 1-8 >> $temp
   done
   cat $temp >> $wyslac
fi

if [ -s $wyslac ]; then
(
cat <<EOT
MIME-Version: 1.0
Content-Type: text/plain; charset="iso-8859-2"
Content-Transfer-Encoding: 8bit
From: bledy <bledy@ump.waw.pl>
To: $komumaile
Reply-To: aldziew@ump.waw.pl
Subject: [blad] Bledy w UMP-$miasto

EOT
cat $wyslac
) | /usr/sbin/sendmail -t
fi

rm $wyslac
chmod go+r $wynik 2> /dev/null
#mv $wynik $homek/skrypty

generuj indeksy

też trywialny

#!/bin/sh

homek=$HOME
cvslogstat=/tmp/cvslog-stat.$$
tmp=/tmp/cvslogtmp.$$
skrypty=$homek/skrypty
html=/home/services/httpd/html/ump
wynik=$html/cvslog.html

#lockfile=/tmp/cgpsmapper.pid
#while [ -a $lockfile ]; do sleep 15s ; done

cd $homek/cvs
#cvs -d:pserver:aldziew@localhost:/home/cvsroot log -d 31day -d now > $cvslogstat 2> /dev/null
cvs -d:pserver:aldziew@localhost:/home/cvsroot log -d "> `date -d "1 month ago" "+%F"`" > $cvslogstat 2> /dev/null
#cd - > /dev/null

gawk '{sub(/aldziew;/,"Alf/red/"); \
   sub(/blackpeter;/,"BlackPeter") \
itd. itd.
   sub(/Zachu;/,"Tomek_Z") \
   sub(/Jarek_K;/,"Jarek_Ko") \
       ;print}' $cvslogstat > $tmp
       ## pamiętaj nie dawać spacji w nazwach !
mv $tmp $cvslogstat

rm -f $html/logi/*
gawk -f $skrypty/cvslog_filter.awk $cvslogstat > $wynik
chgrp http $html/logi/*
chmod g+r $html/logi/*
rm $cvslogstat