wok rev 17086
tramys-client, tramys-server: now using http headers only (no more additional info in the server logs); added a lot of comments.
author | Aleksej Bobylev <al.bobylev@gmail.com> |
---|---|
date | Tue Aug 26 13:31:50 2014 +0300 (2014-08-26) |
parents | ce9cbd90365a |
children | 46f8c5dbe3be |
files | tramys-client/receipt tramys-client/stuff/tramys2 tramys-client/stuff/tramys2.desktop tramys-server/receipt tramys-server/stuff/tramys2.cgi |
line diff
1.1 --- a/tramys-client/receipt Mon Aug 25 10:52:38 2014 +0200 1.2 +++ b/tramys-client/receipt Tue Aug 26 13:31:50 2014 +0300 1.3 @@ -1,7 +1,7 @@ 1.4 # SliTaz package receipt. 1.5 1.6 PACKAGE="tramys-client" 1.7 -VERSION="140824" 1.8 +VERSION="140826" 1.9 CATEGORY="system-tools" 1.10 SHORT_DESC="Tool for managing translation files for SliTaz GNU/Linux, client part" 1.11 MAINTAINER="al.bobylev@gmail.com"
2.1 --- a/tramys-client/stuff/tramys2 Mon Aug 25 10:52:38 2014 +0200 2.2 +++ b/tramys-client/stuff/tramys2 Tue Aug 26 13:31:50 2014 +0300 2.3 @@ -6,6 +6,7 @@ 2.4 . /etc/slitaz/slitaz.conf 2.5 . /lib/libtaz.sh 2.6 2.7 +# Ask for root access in order to install the files in the system. 2.8 if [ $(id -u) != 0 ]; then 2.9 exec tazbox su $0 $@; exit 0 2.10 fi 2.11 @@ -14,8 +15,14 @@ 2.12 WORKING=$(mktemp -d) 2.13 LOG="/tmp/tramys.log" 2.14 TGZ="/tmp/tramys.tgz" 2.15 +URL="http://cook.slitaz.org/tramys2.cgi" 2.16 + 2.17 +# Common Yad options. 2.18 YADCONF="--center --window-icon=config-language --image=config-language --image-on-top" 2.19 2.20 +# First step. Describes the functions of the program. 2.21 +# It is possible to set the language. 2.22 +# Also here the user has the ability to stop the program. 2.23 yad $YADCONF --title="tramys (1/3)" --text="$(_ \ 2.24 'Now translations for all installed programs will be found and downloaded. 2.25 You can change locale if you want, or proceed. 2.26 @@ -27,23 +34,44 @@ 2.27 1) exit 0 ;; 2.28 esac 2.29 2.30 -busybox wget -U "$(cd $INSTALLED; ls -1 | tr '\n' ' ')" \ 2.31 - "http://cook.slitaz.org/tramys2.cgi?lang=$LANG&rel=$(cat /etc/slitaz-release)" \ 2.32 - -O - | tee $LOG | \ 2.33 +# your locale -> HTTP_ACCEPT_LANGUAGE 2.34 +# your SliTaz release -> HTTP_ACCEPT (different releases have different translations) 2.35 +# your installed packages list -> HTTP_COOKIE (list=...) 2.36 +# Note clean address "tramys2.cgi" in the server access logs. 2.37 +# 2.38 +# Server sending and Yad shows user useful info using log widget. 2.39 +# We are temporarily stored this log in the $LOG file in order to get 2.40 +# a download token (see below). 2.41 +# Here the user can refuse to download the file. 2.42 +busybox wget --header "Accept-Language: $LANG" \ 2.43 + --header "Accept: $(cat /etc/slitaz-release)" \ 2.44 + --header "Cookie: list=$(cd $INSTALLED; ls -1 | tr '\n' ' ')" \ 2.45 + $URL -O - | tee $LOG | \ 2.46 yad $YADCONF --title="tramys (2/3)" --progress --width=320 --text="$(_ \ 2.47 'The server processes the request. 2.48 Please wait.')" \ 2.49 --enable-log --log-expanded \ 2.50 --button "gtk-cancel:1" --button "gtk-go-forward:0" 2.51 -case $? in 2.52 - 1) exit 0 ;; 2.53 +ANSWER=$? 2.54 + 2.55 +# In the last line of log server gives us a download token. 2.56 +# We can download archive which the server has prepared for us. 2.57 +# Get download token and remove log. 2.58 +DLKEY=$(tail -n1 $LOG); rm -f $LOG 2.59 + 2.60 +case $ANSWER in 2.61 + 1) 2.62 + # We need to remove archive that the user has refused to download. 2.63 + # This command passed in HTTP_COOKIE (rm=...) 2.64 + busybox wget --header "Cookie: rm=$DLKEY" $URL -O /dev/null; exit 0 ;; 2.65 esac 2.66 2.67 -DLKEY=$(tail -n1 $LOG); rm -f $LOG 2.68 - 2.69 -busybox wget "http://cook.slitaz.org/tramys2.cgi?dl=$DLKEY" -O $TGZ 2>&1 | \ 2.70 -yad $YADCONF --title="tramys (3/3)" --progress --pulsate --width=320 \ 2.71 - --text="$(_ \ 2.72 +# We want to download the file. Show pulsate progress bar. 2.73 +# This command passed in HTTP_COOKIE (dl=...) 2.74 +# Also here the user can terminate file downloading. 2.75 +busybox wget --header "Cookie: dl=$DLKEY" $URL -O $TGZ 2>&1 | \ 2.76 + yad $YADCONF --title="tramys (3/3)" --progress --pulsate --width=320 \ 2.77 + --text="$(_ \ 2.78 'Downloading in progress. 2.79 Please wait.')" \ 2.80 --button "gtk-cancel:1" --button "gtk-ok:0" 2.81 @@ -51,11 +79,21 @@ 2.82 1) exit 0 ;; 2.83 esac | \ 2.84 2.85 +# Unpack archive content to a temporary folder. 2.86 busybox tar -xz -C $WORKING -f $TGZ 2.87 +# All folders and files in the archive are owned by user www and group www. 2.88 +# This is because the CGI script on the server is executed by the user www. 2.89 +# If we had just unpacked the archive content into our file system, then there 2.90 +# would be a big trouble. For example, all folders: /, /usr, /usr/share, 2.91 +# /usr/share/locale, etc. would be owned by user www and become unavailable 2.92 +# for a regular user. So force all folders and files to root own. 2.93 chown -R root:root $WORKING 2.94 +# copy all translation files to root file system. 2.95 cp -fpr $WORKING/* / 2.96 +# remove temporary folder and file, they are no longer needed. 2.97 rm -f $TGZ 2.98 rm -rf $WORKING 2.99 2.100 +# Final message. 2.101 yad $YADCONF --title="tramys" --text="$(_ \ 2.102 'Translation files have been installed in your system.')"
3.1 --- a/tramys-client/stuff/tramys2.desktop Mon Aug 25 10:52:38 2014 +0200 3.2 +++ b/tramys-client/stuff/tramys2.desktop Tue Aug 26 13:31:50 2014 +0300 3.3 @@ -2,6 +2,7 @@ 3.4 Type=Application 3.5 Name=tramys 3.6 Comment=Translate My SliTaz! 3.7 +Comment[ru]=Переведите свой SliTaz! 3.8 Exec=tramys2 3.9 Icon=config-language 3.10 Categories=GTK;Settings;DesktopSettings;
4.1 --- a/tramys-server/receipt Mon Aug 25 10:52:38 2014 +0200 4.2 +++ b/tramys-server/receipt Tue Aug 26 13:31:50 2014 +0300 4.3 @@ -1,7 +1,7 @@ 4.4 # SliTaz package receipt. 4.5 4.6 PACKAGE="tramys-server" 4.7 -VERSION="140824" 4.8 +VERSION="140826" 4.9 CATEGORY="system-tools" 4.10 SHORT_DESC="Tool for managing translation files for SliTaz GNU/Linux, server part" 4.11 MAINTAINER="al.bobylev@gmail.com"
5.1 --- a/tramys-server/stuff/tramys2.cgi Mon Aug 25 10:52:38 2014 +0200 5.2 +++ b/tramys-server/stuff/tramys2.cgi Tue Aug 26 13:31:50 2014 +0300 5.3 @@ -4,40 +4,34 @@ 5.4 # Aleksej Bobylev <al.bobylev@gmail.com>, 2014 5.5 5.6 # How to use: 5.7 -# 1. tramys2.cgi?lang=$LANG&rel=$RELEASE to generate archive 5.8 -# Pass packages list in HTTP_USER_AGENT header 5.9 -# (seems it have no restrictions for length and no encoded symbols ' ' and '+') 5.10 -# 2. tramys2.cgi?dl=$DL_KEY to download archive (user can cancel downloading) 5.11 +# 1. Request for archive: 5.12 +# HTTP_ACCEPT_LANGUAGE -> users locale 5.13 +# HTTP_ACCEPT -> SliTaz release 5.14 +# HTTP_COOKIE (list=...) -> space-separated list of packages to process 5.15 +# 5.16 +# 2. Remove archive that the user has refused to download: 5.17 +# HTTP_COOKIE (rm=DLKEY) -> remove /tmp/tmp.DLKEY.tgz file 5.18 +# 5.19 +# 3. Send archive to user: 5.20 +# HTTP_COOKIE (dl=DLKEY) -> send /tmp/tmp.DLKEY.tgz file 5.21 5.22 . /usr/bin/httpd_helper.sh 5.23 5.24 -WORKING=$(mktemp -d) 5.25 -DATADIR=/usr/share/tramys 5.26 +WORKING=$(busybox mktemp -d) # make temp working dir /tmp/tmp.?????? 5.27 +DATADIR=/usr/share/tramys # this folder contains lists 5.28 5.29 -# hide script 5.30 -if [ "x$(GET lang)$(GET rel)$(GET dl)" == "x" ]; then 5.31 - echo -e "HTTP/1.1 404 Not Found\nContent-Type: text/html\n\n<!DOCTYPE html><html><head><title>404 - Not Found</title></head><body><h1>404 - Not Found</h1></body></html>" 5.32 - exit 5.33 -fi 5.34 +# Get user settings from HTTP headers. 5.35 +lang="$HTTP_ACCEPT_LANGUAGE" 5.36 +rel="$HTTP_ACCEPT" 5.37 +cmd="${HTTP_COOKIE%%=*}" 5.38 +arg="${HTTP_COOKIE#*=}" 5.39 5.40 -# begin: compress and give to client 5.41 -if [ "x$(GET dl)" != "x" ]; then 5.42 - WORKING="/tmp/tmp.$(echo $(GET dl) | tr -cd 'A-Za-z0-9')" # avoid relative paths 5.43 - cat <<EOT 5.44 -Content-Type: application/x-compressed-tar 5.45 -Content-Length: $(stat -c %s $WORKING.tgz) 5.46 -Content-Disposition: attachment; filename=tramys.tgz 5.47 +#-----------# 5.48 +# Functions # 5.49 +#-----------# 5.50 5.51 -EOT 5.52 - cat $WORKING.tgz 5.53 - rm -f $WORKING.tgz 5.54 - exit 0 5.55 -fi 5.56 -# end: compress and give to client 5.57 - 5.58 - 5.59 -# prepare list for search 5.60 -# original GNU gettext searches precisely in this order 5.61 +# Prepare list for search. 5.62 +# Original GNU gettext searches precisely in this order. 5.63 locales_list() { 5.64 LL=$(echo $1 | sed 's|^\([^_.@]*\).*$|\1|') 5.65 CC=$(echo $1 | sed -n '/_/s|^[^_]*\(_[^.@]*\).*$|\1|p') 5.66 @@ -59,73 +53,127 @@ 5.67 [ "$ee" ] && echo -n "$LL$ee " 5.68 echo "$LL" 5.69 } 5.70 -MY_LOCALES=$(locales_list $(GET lang)) 5.71 +MY_LOCALES=$(locales_list $lang) 5.72 5.73 -# constants to use in lists 5.74 -US="/usr/share" 5.75 -LC="LC_MESSAGES" 5.76 -PY="/usr/lib/python2.7/site-packages" 5.77 -R="/usr/lib/R/library" 5.78 -RT="$R/translations/%/$LC" 5.79 +# Search and copy translation files 5.80 +copy_translations() { 5.81 + # for all packages in list 5.82 + for P in $arg; do 5.83 5.84 -# supported 4.0 (as stable now) an cooking (rolling, 5.0) 5.85 -# don't know what to do with "arm" and "x86_64" woks 5.86 -case $(GET rel) in 5.87 - 4*) PREFIX="stable_"; WOK="stable" ;; 5.88 - *) PREFIX=""; WOK="cooking" ;; 5.89 -esac 5.90 -WOK="/home/slitaz/$WOK/chroot/home/slitaz/wok" 5.91 + echo "$((100*$NUM/$PKGNUM))" # send percentage to Yad client 5.92 + NUM=$(($NUM+1)) # next package 5.93 5.94 -PKGNUM=$(echo $HTTP_USER_AGENT | wc -w) 5.95 -NUM=1 5.96 + # for all list types 5.97 + for list_type in mo qm; do 5.98 + IFS=$'\n' 5.99 + for line in $(grep -e "^$P " $DATADIR/$PREFIX$list_type.list); do 5.100 + locales=$(echo $line | cut -d' ' -f2) 5.101 + names=$(echo $line | cut -d' ' -f3) 5.102 + [ "x$names" == "x" ] && names=$P 5.103 + paths=$(echo $line | cut -d' ' -f4) 5.104 + [ "x$paths" == "x" ] && paths="$US/locale/%/$LC" 5.105 5.106 -echo -e "Content-Type: text/plain\n\n" # to Yad client 5.107 -echo "#Number of packages: $PKGNUM" 5.108 -echo "#Searching in progress..." 5.109 + IFS=' ' 5.110 + # for all valid locale variants 5.111 + for locale in $MY_LOCALES; do 5.112 + if $(echo " $locales " | grep -q " $locale "); then 5.113 5.114 -for P in $HTTP_USER_AGENT; do 5.115 + # for all file names 5.116 + for name in $names; do 5.117 + # for all paths 5.118 + for path in $paths; do 5.119 + # substitute variables and "%" 5.120 + eval "fullname=${path//%/$locale}/${name//%/$locale}.$list_type" 5.121 5.122 - echo "$((100*$NUM/$PKGNUM))" # percentage to Yad client 5.123 - NUM=$(($NUM+1)) 5.124 - 5.125 - for list_type in mo qm; do 5.126 - IFS=$'\n' 5.127 - for line in $(grep -e "^$P " $DATADIR/$PREFIX$list_type.list); do 5.128 - locales=$(echo $line | cut -d' ' -f2) 5.129 - names=$(echo $line | cut -d' ' -f3) 5.130 - [ "x$names" == "x" ] && names=$P 5.131 - pathes=$(echo $line | cut -d' ' -f4) 5.132 - [ "x$pathes" == "x" ] && pathes="$US/locale/%/$LC" 5.133 - 5.134 - IFS=' ' 5.135 - for locale in $MY_LOCALES; do 5.136 - if $(echo " $locales " | grep -q " $locale "); then 5.137 - 5.138 - for name in $names; do 5.139 - for path in $pathes; do 5.140 - eval "fullname=${path//%/$locale}/${name//%/$locale}.$list_type" 5.141 - mkdir -p $WORKING$(dirname $fullname) 5.142 - cp -pf $WOK/$P/install$fullname $WORKING$fullname 5.143 + # copy translation file to working dir 5.144 + mkdir -p $WORKING$(dirname $fullname) 5.145 + cp -pf $WOK/$P/install$fullname $WORKING$fullname 5.146 + done 5.147 done 5.148 - done 5.149 - break 5.150 - fi 5.151 + break 5.152 + fi 5.153 + done 5.154 done 5.155 done 5.156 done 5.157 -done 5.158 +} 5.159 5.160 -echo "#" # to Yad client log 5.161 -echo "#Preparing archive. Please wait" 5.162 +#----------# 5.163 +# Main # 5.164 +#----------# 5.165 5.166 -busybox tar -czf $WORKING.tgz -C $WORKING . 5.167 -rm -rf $WORKING 5.168 +# Branch commands: list, rm, dl. 5.169 +case "x$cmd" in 5.170 + xlist) # Main actions: get list, search translations, make an archive. 5.171 + # constants to use in lists 5.172 + US="/usr/share" 5.173 + LC="LC_MESSAGES" 5.174 + PY="/usr/lib/python2.7/site-packages" 5.175 + R="/usr/lib/R/library" 5.176 + RT="$R/translations/%/$LC" 5.177 5.178 -echo "#" # to Yad client log 5.179 -echo "#Done!" 5.180 -echo "#Now you can proceed to downloading" 5.181 -echo "#and installing your translations." 5.182 -echo "#File size: $(stat -c %s $WORKING.tgz)" 5.183 + # Supported 4.0 (as stable now) and cooking (rolling, 5.0) 5.184 + # Don't know what to do with "arm" and "x86_64" woks ??? 5.185 + case "x$rel" in 5.186 + x4*|xstable) PREFIX="stable_"; WOK="stable" ;; 5.187 + *) PREFIX=""; WOK="cooking" ;; 5.188 + esac 5.189 + # Path to the specified WOK in the SliTaz server. 5.190 + WOK="/home/slitaz/$WOK/chroot/home/slitaz/wok" 5.191 5.192 -echo "${WORKING#*.}" # give download key to Yad client 5.193 + PKGNUM=$(echo $arg | wc -w) # number of packages in the list 5.194 + NUM=1 # initial value 5.195 + 5.196 + echo -e "Content-Type: text/plain\n\n" # to Yad client 5.197 + echo "#Number of packages: $PKGNUM" # Message to Yad log 5.198 + echo "#Searching in progress..." # And another one 5.199 + 5.200 + copy_translations 5.201 + 5.202 + echo "#" # Message to Yad log 5.203 + echo "#Preparing archive. Please wait..." # And another one 5.204 + 5.205 + # Make the archive from working dir and remove temp working dir. 5.206 + busybox tar -czf $WORKING.tgz -C $WORKING . 5.207 + rm -rf $WORKING 5.208 + 5.209 + echo "#" # to Yad client log 5.210 + echo "#Done!" 5.211 + echo "#Now you can proceed to downloading" 5.212 + echo "#and installing your translations." 5.213 + echo "#File size: $(stat -c %s $WORKING.tgz) bytes." 5.214 + 5.215 + echo "${WORKING#*.}" # give download token to Yad client 5.216 + exit 0 ;; 5.217 + 5.218 + xrm) # Remove archive. 5.219 + # Avoid relative path to avoid removing of any system file. 5.220 + archive="/tmp/tmp.$(echo $arg | tr -cd 'A-Za-z0-9').tgz" 5.221 + rm -f $archive 5.222 + cat <<EOT 5.223 +Content-Type: text/plain 5.224 +Content-Length: 0 5.225 + 5.226 +EOT 5.227 + exit 0 ;; 5.228 + 5.229 + xdl) # Send archive to client. 5.230 + # Avoid relative path to avoid hijacking of any system file. 5.231 + archive="/tmp/tmp.$(echo $arg | tr -cd 'A-Za-z0-9').tgz" 5.232 + cat <<EOT 5.233 +Content-Type: application/x-compressed-tar 5.234 +Content-Length: $(stat -c %s $archive) 5.235 +Content-Disposition: attachment; filename=tramys.tgz 5.236 + 5.237 +EOT 5.238 + cat $archive 5.239 + # Remove archive after sending. 5.240 + rm -f $archive 5.241 + exit 0 ;; 5.242 + 5.243 + *) # Hide the script from the web bots and browsers. 5.244 + echo -e "HTTP/1.0 404 Not Found\nContent-Type: text/html\n\n<!DOCTYPE html><html><head><title>404 - Not Found</title></head><body><h1>404 - Not Found</h1></body></html>" 5.245 + exit ;; 5.246 +esac 5.247 + 5.248 exit 0