wok-next annotate tramys-server/stuff/tramys.cgi @ rev 17082
Up: tramys-server and tramys-client (140824).
author | Aleksej Bobylev <al.bobylev@gmail.com> |
---|---|
date | Sun Aug 24 22:46:59 2014 +0300 (2014-08-24) |
parents | 096a77a2021d |
children |
rev | line source |
---|---|
al@17081 | 1 #!/bin/sh |
al@17081 | 2 # tramys - TRAnslate MY Slitaz. Server solution |
al@17081 | 3 # Tool for managing translation files for SliTaz GNU/Linux |
al@17081 | 4 # Aleksej Bobylev <al.bobylev@gmail.com>, 2014 |
al@17081 | 5 |
al@17082 | 6 # How to use: |
al@17082 | 7 # 1. tramys2.cgi?lang=$LANG&rel=$RELEASE to generate archive |
al@17081 | 8 # Pass packages list in HTTP_USER_AGENT header |
al@17081 | 9 # (seems it have no restrictions for length and no encoded symbols ' ' and '+') |
al@17082 | 10 # 2. tramys2.cgi?dl=$DL_KEY to download archive (user can cancel downloading) |
al@17081 | 11 |
al@17081 | 12 . /usr/bin/httpd_helper.sh |
al@17081 | 13 |
al@17081 | 14 WORKING=$(mktemp -d) |
al@17081 | 15 DATADIR=/home/lexeii/Public/tramys |
al@17081 | 16 |
al@17082 | 17 # hide script |
al@17082 | 18 if [ "x$(GET lang)$(GET rel)$(GET dl)" == "x" ]; then |
al@17082 | 19 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>" |
al@17082 | 20 exit |
al@17082 | 21 fi |
al@17082 | 22 |
al@17082 | 23 # begin: compress and give to client |
al@17082 | 24 if [ "x$(GET dl)" != "x" ]; then |
al@17082 | 25 WORKING="/tmp/tmp.$(echo $(GET dl) | tr -cd 'A-Za-z0-9')" # avoid relative paths |
al@17082 | 26 cat <<EOT |
al@17082 | 27 Content-Type: application/x-compressed-tar |
al@17082 | 28 Content-Length: $(stat -c %s $WORKING.tgz) |
al@17082 | 29 Content-Disposition: attachment; filename=tramys.tgz |
al@17082 | 30 |
al@17082 | 31 EOT |
al@17082 | 32 cat $WORKING.tgz |
al@17082 | 33 rm -f $WORKING.tgz |
al@17082 | 34 exit 0 |
al@17082 | 35 fi |
al@17082 | 36 # end: compress and give to client |
al@17082 | 37 |
al@17082 | 38 |
al@17081 | 39 # prepare list for search |
al@17081 | 40 # original GNU gettext searches precisely in this order |
al@17081 | 41 locales_list() { |
al@17081 | 42 LL=$(echo $1 | sed 's|^\([^_.@]*\).*$|\1|') |
al@17081 | 43 CC=$(echo $1 | sed -n '/_/s|^[^_]*\(_[^.@]*\).*$|\1|p') |
al@17081 | 44 EE=$(echo $1 | sed -n '/./s|^[^\.]*\(\.[^@]*\).*$|\1|p') |
al@17081 | 45 VV=$(echo $1 | sed -n '/@/s|^[^@]*\(@.*\)$|\1|p') |
al@17081 | 46 ee=$(echo $EE | tr A-Z a-z | tr -cd a-z0-9); [ "$ee" ] && ee=.$ee |
al@17081 | 47 [ "x$EE" == "x$ee" ] && ee='' |
al@17081 | 48 |
al@17081 | 49 [ "$CC" -a "$EE" -a "$VV" ] && echo -n "$LL$CC$EE$VV " |
al@17081 | 50 [ "$CC" -a "$ee" -a "$VV" ] && echo -n "$LL$CC$ee$VV " |
al@17081 | 51 [ "$CC" -a "$VV" ] && echo -n "$LL$CC$VV " |
al@17081 | 52 [ "$EE" -a "$VV" ] && echo -n "$LL$EE$VV " |
al@17081 | 53 [ "$ee" -a "$VV" ] && echo -n "$LL$ee$VV " |
al@17081 | 54 [ "$VV" ] && echo -n "$LL$VV " |
al@17081 | 55 [ "$CC" -a "$EE" ] && echo -n "$LL$CC$EE " |
al@17081 | 56 [ "$CC" -a "$ee" ] && echo -n "$LL$CC$ee " |
al@17081 | 57 [ "$CC" ] && echo -n "$LL$CC " |
al@17081 | 58 [ "$EE" ] && echo -n "$LL$EE " |
al@17081 | 59 [ "$ee" ] && echo -n "$LL$ee " |
al@17081 | 60 echo "$LL" |
al@17081 | 61 } |
al@17081 | 62 MY_LOCALES=$(locales_list $(GET lang)) |
al@17081 | 63 |
al@17081 | 64 # constants to use in lists |
al@17081 | 65 US="/usr/share" |
al@17081 | 66 LC="LC_MESSAGES" |
al@17081 | 67 PY="/usr/lib/python2.7/site-packages" |
al@17081 | 68 R="/usr/lib/R/library" |
al@17081 | 69 RT="$R/translations/%/$LC" |
al@17081 | 70 |
al@17082 | 71 # supported 4.0 (as stable now) an cooking (rolling, 5.0) |
al@17082 | 72 # don't know what to do with "arm" and "x86_64" woks |
al@17082 | 73 case $(GET rel) in |
al@17082 | 74 4*) PREFIX="stable"; WOK="stable" ;; |
al@17082 | 75 *) PREFIX=""; WOK="cooking" ;; |
al@17082 | 76 esac |
al@17082 | 77 WOK="/home/slitaz/$WOK/chroot/home/slitaz/wok" |
al@17082 | 78 |
al@17082 | 79 PKGNUM=$(echo $HTTP_USER_AGENT | wc -w) |
al@17082 | 80 NUM=1 |
al@17082 | 81 |
al@17082 | 82 echo -e "Content-Type: text/plain\n\n" # to Yad client |
al@17082 | 83 echo "#Number of packages: $PKGNUM" |
al@17082 | 84 echo "#Searching in progress..." |
al@17082 | 85 |
al@17081 | 86 for P in $HTTP_USER_AGENT; do |
al@17081 | 87 |
al@17082 | 88 echo "$((100*$NUM/$PKGNUM))" # percentage to Yad client |
al@17082 | 89 NUM=$(($NUM+1)) |
al@17082 | 90 |
al@17081 | 91 for list_type in mo qm; do |
al@17081 | 92 IFS=$'\n' |
al@17082 | 93 for line in $(grep -e "^$P " $DATADIR/$PREFIX$list_type.list); do |
al@17081 | 94 locales=$(echo $line | cut -d' ' -f2) |
al@17081 | 95 names=$(echo $line | cut -d' ' -f3) |
al@17081 | 96 [ "x$names" == "x" ] && names=$P |
al@17081 | 97 pathes=$(echo $line | cut -d' ' -f4) |
al@17081 | 98 [ "x$pathes" == "x" ] && pathes="$US/locale/%/$LC" |
al@17081 | 99 |
al@17081 | 100 IFS=' ' |
al@17081 | 101 for locale in $MY_LOCALES; do |
al@17081 | 102 if $(echo " $locales " | grep -q " $locale "); then |
al@17081 | 103 |
al@17081 | 104 for name in $names; do |
al@17081 | 105 for path in $pathes; do |
al@17081 | 106 eval "fullname=${path//%/$locale}/${name//%/$locale}.$list_type" |
al@17081 | 107 mkdir -p $WORKING$(dirname $fullname) |
al@17082 | 108 cp -pf $WOK/$P/install$fullname $WORKING$fullname |
al@17081 | 109 done |
al@17081 | 110 done |
al@17081 | 111 break |
al@17081 | 112 fi |
al@17081 | 113 done |
al@17081 | 114 done |
al@17081 | 115 done |
al@17081 | 116 done |
al@17081 | 117 |
al@17082 | 118 echo "#" # to Yad client log |
al@17082 | 119 echo "#Preparing archive. Please wait" |
al@17082 | 120 |
al@17081 | 121 busybox tar -czf $WORKING.tgz -C $WORKING . |
al@17082 | 122 rm -rf $WORKING |
al@17081 | 123 |
al@17082 | 124 echo "#" # to Yad client log |
al@17082 | 125 echo "#Done!" |
al@17082 | 126 echo "#Now you can proceed to downloading" |
al@17082 | 127 echo "#and installing your translations." |
al@17082 | 128 echo "#File size: $(stat -c %s $WORKING.tgz)" |
al@17081 | 129 |
al@17082 | 130 echo "${WORKING#*.}" # give download key to Yad client |
al@17082 | 131 exit 0 |