slitaz-tools annotate tazbox/tazbox @ rev 1030

tazbox: may speedup reboot
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon Apr 15 10:15:58 2019 +0200 (2019-04-15)
parents 491239328786
children aa81af0a90f9
rev   line source
pankso@553 1 #!/bin/sh
pankso@553 2 #
pankso@569 3 # SliTaz tiny GUI boxes for the desktop (su, logout, locale, etc)
pankso@569 4 # and as usual, please: KISS
pankso@553 5 #
al@939 6 # Copyright (C) 2011-2015 SliTaz GNU/Linux - GNU GPL v3
pankso@553 7 # - Christophe Lincoln <pankso@slitaz.org>
al@845 8 # - Aleksej Bobylev <al.bobylev@gmail.com>
pankso@553 9 #
al@939 10
al@813 11 . /lib/libtaz.sh
al@813 12 export TEXTDOMAIN='tazbox' # i18n
pankso@553 13
al@939 14
al@949 15 # Get SliTaz settings
al@949 16
al@949 17 . /etc/slitaz/slitaz.conf
al@949 18
al@949 19
al@813 20 # download dir (may be in a config file)
al@939 21
al@943 22 DOWNLOADS="$HOME/Downloads"
pankso@562 23
al@939 24
claudinei@611 25 # some constants to be used inside functions
al@939 26
al@943 27 tmp='/tmp/keymap.list'
al@943 28 db='/usr/share/i18n/locales'
al@943 29 zi='/usr/share/zoneinfo/'
al@943 30 ztab="${zi}zone-mini.tab"
al@943 31 csv='/tmp/freegeoip.csv'
claudinei@611 32
al@939 33
pankso@553 34 #
pankso@553 35 # Functions
pankso@553 36 #
pankso@553 37
pankso@553 38 usage() {
al@813 39 newline; _ 'SliTaz tiny GUI boxes for the desktop'
pankso@553 40
al@813 41 newline; boldify $(_ 'Usage:')
al@813 42 echo " $(basename $0) [$(_n 'command')]"
pankso@553 43
al@813 44 newline; boldify $(_ 'Commands:')
al@813 45 optlist "\
al@813 46 usage $(_ 'Display this short help usage')
al@813 47 su $(_ 'Execute a command as super-user')
al@813 48 logout $(_ 'Desktop logout box with actions')
al@813 49 out $(_ 'Pipe a command output into a GTK window')
al@813 50 out-dl $(_ 'Pipe wget output into a GTK window')
al@813 51 locale $(_ 'Configure system language (root)')
al@813 52 keymap $(_ 'Configure system keymap (root)')
al@813 53 tz $(_ 'Configure system timezone (root)')
al@813 54 setup $(_ 'System initial setup (locale, keymap & timezone)')
al@813 55 new-file $(_ 'Create a new file or folder on the desktop')
al@813 56 all-apps $(_ 'Display icons of all installed applications')
al@813 57 notify $(_ 'Notify user with a desktop centered box')
pascal@967 58 tazapps $(_ 'Configure SliTaz default applications')
pascal@1028 59 vnc $(_ 'Launch a framebuffer VNC viewer')
pascal@1028 60 ssh $(_ 'Open a remote terminal')"
al@813 61 newline
pankso@553 62 }
pankso@553 63
al@939 64
al@813 65 # try to find icon in .desktop files
al@939 66
al@813 67 find_icon() {
al@943 68 local_desktop=$(find $HOME/.local/share/applications \
al@880 69 -name ${1##*/}.desktop 2&>/dev/null | head -n1)
al@939 70 system_desktop=$(find /usr/share/applications \
al@939 71 -name ${1##*/}.desktop 2&>/dev/null | head -n1)
al@939 72 desktop="${local_desktop:-$system_desktop}"
al@939 73 [ -n "$desktop" ] && cat $desktop | sed '/\[Desktop\ Entry\]/,/^\[/!d' | \
al@813 74 sed '/^Icon=/!d' | head -n1 | cut -d= -f2
al@813 75 }
al@813 76
al@939 77
paul@835 78 # su frontend GUIs
al@939 79
pankso@587 80 su_main() {
al@943 81 CMD1="${1%% *}"; CMD2="$(echo "${1#* }" | sed 's|&|&amp;|g')"
al@813 82 : ${icon=$(find_icon $CMD1)}
al@939 83 icon="${icon:-dialog-password}"
al@813 84
al@813 85 yad --title="$(_n 'SliTaz admin password')" --window-icon=$icon \
al@813 86 --width=520 --on-top --center \
al@813 87 --image=$icon --image-on-top \
al@813 88 --text="$(_n 'Please enter root password (default root) to execute:')\n
al@813 89 <span foreground=\"red\"><tt><b>$CMD1</b> $CMD2</tt></span>\n" \
al@813 90 --form \
al@813 91 --field="$(_n 'Password:'):H" $PASSWD \
al@813 92 --field="$(_n 'Autosave password'):CHK" $CHECKED
pankso@587 93 }
pankso@587 94
al@939 95
pankso@587 96 su_error() {
al@939 97 icon='dialog-error'
al@813 98 yad --title="$(_n 'Error')" --window-icon=$icon \
al@813 99 --width=320 --on-top --center \
al@813 100 --image=$icon --image-on-top \
al@813 101 --text="\n<b>$(_n 'Error: wrong password!')</b>\n" \
al@813 102 --button="gtk-close:1"
pankso@587 103 }
pankso@587 104
al@939 105
al@813 106 # user may press cancel on download.
al@939 107
pankso@562 108 cancel_dl() {
al@943 109 if [ "$?" -eq 1 ]; then
al@813 110 _ "CANCEL"
pankso@562 111 rm -f $DOWNLOADS/$(basename $url)
pankso@562 112 fi
pankso@562 113 }
pankso@562 114
al@939 115
al@813 116 # output a command in a GTK window
al@939 117
pankso@744 118 output_command() {
al@813 119 : ${title=$(_n 'TazBox Output')}
al@939 120 : ${icon=dialog-information}
al@813 121
al@943 122 yad --title="$title" --window-icon="$icon" \
al@943 123 --geometry='600x220+0-24' --fore='#ffffff' --back='#000000' \
al@813 124 --text-info --fontname=monospace --wrap $opts \
al@943 125 --button='gtk-close:1'
pankso@562 126 }
pankso@562 127
al@939 128
al@813 129 # logout GUI function
al@939 130
pankso@553 131 logout_main() {
al@939 132 icon='/usr/share/pixmaps/slitaz-icon.png'
al@943 133 yad --title="$(_n 'SliTaz Logout')" --window-icon="$icon" \
al@943 134 --on-top --center --height='130' \
al@943 135 --image="$icon" --image-on-top \
pankso@823 136 --text="<b>$(_n 'SliTaz Logout - Please choose an action:')</b>" \
al@813 137 --always-print-result \
al@878 138 --button "$(_n 'Close X session')!system-log-out:4" \
al@939 139 --button "$(_n 'Reboot system')!system-reboot:3" \
al@878 140 --button "$(_n 'Shutdown system')!system-shutdown:2"
al@813 141 }
pankso@553 142
al@939 143
al@1004 144 # logout functions with auto-confirmation
al@1004 145
al@1004 146 logout_confirm() {
al@1004 147 timeout=5
al@1004 148 case $1 in
al@1004 149 exit) action="$(_n 'Closing the X session...')"; icon='system-log-out';;
al@1004 150 reboot) action="$(_n 'Rebooting the system...')"; icon='system-reboot';;
al@1004 151 halt) action="$(_n 'Shutting down the system...')"; icon='system-shutdown';;
al@1004 152 *) exit;;
al@1004 153 esac
al@1004 154 warning="$(_ 'Selected action will be executed automatically in %s seconds.' "$timeout")"
al@1004 155 yad --title="$(_n 'SliTaz Logout')" --window-icon="$icon" \
al@1004 156 --on-top --center --width='300' --image="$icon" --image-on-top \
al@1004 157 --text="<b>$action</b>\n\n$warning" \
al@1004 158 --timeout $timeout --timeout-indicator=bottom \
pascal@1030 159 --button "gtk-cancel:252" --button "gtk-ok:0"
al@1004 160 [ "$?" -ne 252 ] || exit 0
al@1004 161 }
al@1004 162
al@1004 163
al@1004 164 # make logout menu in the right edge of LXPanel
al@1004 165
al@1004 166 mkmenu() {
al@1004 167 # (re)make the menu button with the user log name
al@1004 168 dd="$HOME/.local/share/desktop-directories"; mkdir -p "$dd"
al@1004 169 echo -e "[Desktop Entry]\nType=Directory\nName=$(whoami)" > "$dd/user.directory"
al@1004 170
al@1004 171 # check the panel config file existence, copy from default config if needed
al@1004 172 panels=$(find $HOME/.config/lxpanel -type f -name panel 2>/dev/null)
al@1004 173 if [ -z "$panels" ]; then
al@1004 174 mkdir -p "$HOME/.config/lxpanel"
al@1004 175 cp -a /etc/skel/.config/lxpanel/* "$HOME/.config/lxpanel"
al@1004 176 fi
al@1004 177
al@1004 178 for panel in $panels; do
al@1004 179 conf=$(tr '\n' '`' < $panel | sed 's|Plugin|\n&|g') # each plugin on its own line
al@1004 180 if fgrep -q 'user.directory' "$panel"; then
al@1004 181 # if menu already exists - shrink it to '@@@'
al@1004 182 newconf=$(echo "$conf" | sed 's|.*user\.directory.*$|@@@|')
al@1004 183 else
al@1019 184 # otherwise do nothing
al@1019 185 newconf="$conf"
al@1004 186 fi
al@1004 187 menu=$(cat <<EOT
al@1004 188 Plugin {
al@1004 189 type = menu
al@1004 190 Config {
al@1004 191 name=user.directory
al@1004 192 image=avatar-default
al@1004 193 tintcolor=#33230D
al@1004 194 item {
al@1004 195 image=system-log-out-panel
al@1004 196 name=$(_ 'Close X session')
al@1004 197 action=tazbox logout exit
al@1004 198 }
al@1004 199 item {
al@1004 200 image=system-reboot-panel
al@1004 201 name=$(_ 'Reboot system')
al@1004 202 action=tazbox logout reboot
al@1004 203 }
al@1004 204 item {
al@1004 205 image=system-shutdown-panel
al@1004 206 name=$(_ 'Shutdown system')
al@1004 207 action=tazbox logout halt
al@1004 208 }
al@1004 209 }
al@1004 210 }
al@1004 211
al@1004 212 EOT
al@1004 213 )
al@1004 214 # rebuild the menu: change '@@@' to the menu content
al@1004 215 echo "$newconf" | \
al@1004 216 awk -vmenu="$menu" '{if ($1=="@@@") {printf ("%s\n\n", menu)} else {print}}' | \
al@1004 217 tr '`' '\n' > $panel
al@1004 218 done
al@1004 219 }
al@1004 220
al@1004 221
al@813 222 # generate keymap list
al@939 223
pankso@610 224 gen_kmap_list() {
pankso@610 225 echo > $tmp
pankso@610 226 cd /usr/share/kbd/keymaps/i386
al@813 227 # we first need a list to sort and then use \n for Yad list.
al@813 228 for i in $(find -type f | sed '/include/d; s|./||'); do
al@813 229 echo "$(basename $i .map.gz)|$(dirname $i)" >> $tmp
pankso@610 230 done
pankso@610 231 }
pankso@610 232
al@939 233
pankso@610 234 # Initial Config functions
al@939 235
pankso@610 236 setup_main() {
al@958 237 icon='preferences-desktop-locale'
pankso@610 238 gen_kmap_list
pascal@1010 239 locale=$(ls -1 $db 2> /dev/null | grep ^[a-z][a-z]_[A-Z][A-Z] | tr "\n" "!")
al@813 240 keymap=$(cat $tmp | sort | tr "\n" "!")
al@880 241 timezone=$(find $zi -type f | sed s,$zi,,g | grep -v -F '.tab' | tr "\n" "!")
al@813 242 yad --title="$(_n 'SliTaz Initial Setup')" --window-icon=$icon \
al@943 243 --width='500' \
al@943 244 --image="$icon" --image-on-top \
al@813 245 --text="<big>$(_n 'Here you can set your preferences \n for <b>locale, keymap and timezone</b>.')</big>" \
al@813 246 --form \
al@813 247 --field "$(_n 'Locale'):CB" $locale \
al@813 248 --field "$(_n 'Keymap'):CB" $keymap \
al@813 249 --field "$(_n 'Timezone'):CB" $timezone
pankso@610 250 }
pankso@610 251
al@939 252
pankso@610 253 setup() {
pankso@610 254 choices=$(setup_main)
al@943 255 locale=$( echo $choices | cut -d'|' -f1)
al@943 256 keymap=$( echo $choices | cut -d'|' -f2)
al@943 257 timezone=$(echo $choices | cut -d'|' -f3)
al@943 258 [ -n "$locale" ] && tazlocale init $locale
al@943 259 [ -n "$keymap" ] && tazkeymap init $keymap
al@943 260 [ -n "$timezone" ] && echo $timezone > /etc/TZ
pankso@610 261 }
pankso@610 262
al@880 263
al@880 264 #
pankso@569 265 # Locale functions
al@880 266 #
al@880 267
pankso@569 268 locale_main() {
al@939 269 icon='preferences-desktop-locale'
pascal@1010 270 for locale in $(ls -1 $db 2> /dev/null | grep '[a-z]_[A-Z]'); do
al@813 271 desc=$(fgrep -m1 title $db/$locale | cut -d'"' -f2)
al@886 272 ll_CC=${locale%%@*}
al@886 273 echo -e "${ll_CC##*_}\n$locale\n$desc"
pankso@569 274 done | \
al@943 275 yad --title="$(_n 'SliTaz locale')" --window-icon="$icon" \
al@943 276 --width='600' --height='380' --sticky --on-top --center \
al@943 277 --image="$icon" --image-on-top \
al@880 278 --text="<b>$(_n 'Language configuration')</b> \
paul@884 279 \n\n$(_ 'Tip: manage locales list by installing/removing locale packages.')" \
al@880 280 --list --column="$(_n 'Flag'):IMG" --column $(_n 'Name') \
al@880 281 --column $(_n 'Description') \
al@943 282 --print-column='2' --separator='' \
al@957 283 --button="$(_n 'Manage')!document-properties:2" \
al@880 284 --button="gtk-cancel:1" --button="gtk-ok:0"
pankso@569 285 }
pankso@569 286
al@939 287
pankso@569 288 locale() {
pankso@569 289 locale=$(locale_main)
pankso@569 290 # Deal with --button values
pankso@569 291 case $? in
al@880 292 2) tazbox manage_i18n main ;;
pankso@569 293 1) exit 0 ;;
pankso@569 294 *) continue ;;
pankso@569 295 esac
pankso@573 296 # System language configuration.
al@880 297 if [ "$locale" ]; then
al@880 298 tazlocale $locale
al@943 299 tazbox notify "$(_ 'Locale was set to %s' "$locale")" \
al@880 300 preferences-desktop-locale 3
al@880 301 fi
pankso@569 302 }
pankso@569 303
al@939 304
pankso@569 305 # Keymap functions
al@939 306
pankso@569 307 keymap_main() {
al@939 308 icon='preferences-desktop-keyboard'
pankso@610 309 gen_kmap_list
al@813 310 for i in $(sort $tmp); do
al@813 311 echo "$i" | tr '|' '\n'
pankso@569 312 done | \
al@813 313 yad --title="$(_ 'SliTaz keymap')" --window-icon=$icon \
al@813 314 --width=500 --height=380 --sticky --on-top --center \
al@813 315 --image=$icon --image-on-top \
al@813 316 --text="<b>$(_n 'Keyboard configuration')</b>" \
al@813 317 --list --column $(_n 'Keymap') --column $(_n 'Type') \
al@813 318 --print-column=1 --separator=''
pankso@573 319 rm -f $tmp
pankso@569 320 }
pankso@569 321
al@939 322
pankso@569 323 keymap() {
pankso@569 324 keymap=$(keymap_main)
pankso@569 325 # Deal with --button values
al@943 326 [ "$?" -eq 1 ] && exit 0
pankso@573 327 # System keymap configuration
al@943 328 [ -n "$keymap" ] && tazkeymap $keymap
pankso@569 329 }
pankso@569 330
al@939 331
al@845 332 # Free GeoIP service
al@938 333 # Response: IP,CountryCode,CountryName, ...
al@939 334
al@845 335 geoip() {
al@958 336 # freegeoip.net can be in the blocked hosts list. Return only correct answer or nothing
al@958 337 [ ! -e $csv ] && wget -q -T3 -O - http://freegeoip.net/csv/ 2&>/dev/null | \
al@958 338 grep '[0-9.]*,.*,.*,.*,.*,.*,.*,.*,[0-9.]*,[0-9.]*' > $csv
al@938 339 [ -e $csv ] && cut -d, -f2 $csv
al@845 340 }
al@845 341
al@939 342
al@880 343 #
pankso@604 344 # TZ functions
al@880 345 #
al@880 346
al@939 347
al@880 348 # list of all existing available locations for country
al@939 349
al@880 350 tz_list() {
al@880 351 find $zi | \
al@957 352 grep -E "$(awk -F$'\t' -vv="$1" '{if ($1 == v || $2 ~ v) print $2}' $ztab | tr ' ' '|')" | \
al@880 353 grep -v -E "posix|right" | \
al@880 354 sed 's|.*/||g' | sort
al@880 355 }
al@880 356
al@939 357
al@880 358 # ask for confirmation only if we have what to choose
al@939 359
al@845 360 tz_suggest() {
al@845 361 CountryCode=$(geoip)
al@943 362 if [ -n "$CountryCode" ]; then
al@943 363 if [ -n "$(tz_list $CountryCode)" ]; then
al@939 364 CountryName=$(cut -d, -f3 $csv)
al@943 365 yad --title="$(_ 'SliTaz TZ')" --window-icon="$icon" \
al@845 366 --on-top --center \
al@943 367 --image="$CountryCode" --image-on-top \
al@845 368 --text="$(_ 'Suggested location:') <b>$CountryName</b>\n
paul@861 369 $(_ 'Are you agreed?')" \
al@943 370 --button='gtk-yes:0' --button='gtk-no:1'
al@943 371 [ "$?" -eq 0 ] && echo $CountryCode
al@880 372 fi
al@845 373 fi
al@813 374 }
al@813 375
al@939 376
al@813 377 tz_select() {
al@813 378 case x$1 in
al@813 379 x)
al@813 380 # first pass - country
al@845 381 tmpcc=$(mktemp)
al@845 382
al@845 383 for tzfile in $(find $zi -type f -regex '.*info/[ABCEIMP].*'); do
al@845 384 grep -m1 $(basename $tzfile) $ztab
al@943 385 done | cut -d$'\t' -f1 | sort -u > $tmpcc
al@845 386
al@845 387 for CC in $(cat $tmpcc); do
al@813 388 cat << EOT
al@813 389 $CC
al@813 390 $CC
al@957 391 $(grep -m1 "$CC " ${zi}iso3166.tab | cut -d$'\t' -f2 | sed 's|\&|&amp;|g')
al@813 392 EOT
al@813 393 done | \
al@943 394 yad --title="$(_ 'SliTaz TZ')" --window-icon="$icon" \
al@943 395 --width='500' --height='380' --on-top --center \
al@943 396 --image="$icon" --image-on-top \
al@880 397 --text="<b>$(_ 'TimeZone Configuration')</b> \
paul@884 398 \n$(_ 'Select country and press "Forward" or manually select timezone file.') \
paul@884 399 \n\n$(_ 'Tip: manage timezones list by installing/removing locale packages.')" \
al@813 400 --list \
al@813 401 --column="$(_n 'Flag'):IMG" --column=$(_n 'Code') --column=$(_n 'Country') \
al@957 402 --button="$(_n 'Manage')!document-properties:4" \
al@880 403 --button="$(_n 'Manual')!gtk-index:2" \
al@880 404 --button="gtk-go-forward:0" \
al@813 405 --button="gtk-cancel:1" --always-print-result \
al@943 406 --print-column='2' --separator=''
al@813 407 ;;
al@813 408 xindex)
al@813 409 # manual selection of file with timezone info
al@943 410 yad --title="$(_ 'SliTaz TZ')" --window-icon="$icon" \
al@943 411 --width='500' --on-top --center \
al@943 412 --image="$icon" --image-on-top \
al@813 413 --text="<b>$(_ 'TimeZone Configuration')</b>\n$(_ 'Select time zone')" \
al@845 414 --form --field=":FL" ${zi}UTC --separator='' | \
al@845 415 sed "s|$zi||"
al@813 416 ;;
al@813 417 *)
al@813 418 # second pass - city/place
al@880 419 list=$(tz_list $1)
al@943 420 icon="$1"
al@813 421 if [ $(echo "$list" | wc -l) != 1 ]; then
al@813 422 echo "$list" | \
al@943 423 yad --title="$(_ 'SliTaz TZ')" --window-icon="$icon" \
al@943 424 --width='500' --height='380' --on-top --center \
al@943 425 --image="$icon" --image-on-top \
al@813 426 --text="<b>$(_ 'TimeZone Configuration')</b>\n$(_ 'Select location')" \
al@813 427 --list --column $(_n 'Location/City') --separator=''
al@813 428 else
al@813 429 echo $list
al@813 430 fi
al@813 431 ;;
al@813 432 esac
pankso@604 433 }
pankso@604 434
al@939 435
pankso@604 436 tz() {
al@957 437 icon='preferences-system-time'
al@845 438 arg=$(tz_suggest)
al@845 439
al@845 440 timezone=$(tz_select $arg)
al@813 441 case $? in
al@813 442 1) exit 0 ;;
al@957 443 0)
al@957 444 [ -n "$timezone" ] && timezone=$(tz_select "$timezone")
al@943 445 [ -z "$timezone" ] && exit 0
al@880 446 timezone=$(find $zi -name $timezone | grep -v -E "posix|right" | \
al@957 447 sed "s|$zi||")
al@957 448 ;;
al@813 449 2) timezone=$(tz_select "index") ;;
al@880 450 4) tazbox manage_i18n main;;
al@813 451 esac
al@845 452
al@943 453 [ -z "$timezone" ] && exit 0
al@813 454 echo $timezone > /etc/TZ
al@813 455 export TZ=$timezone
al@943 456 tazbox notify "$(_ 'TimeZone was set to %s' "$timezone")" $icon 3
al@845 457 rm -f $tmpcc
pankso@604 458 }
pankso@604 459
al@939 460
al@880 461 #
al@880 462 # Manage i18n packages
al@880 463 #
al@880 464
al@939 465
al@880 466 # if installed
al@939 467
al@880 468 if_installed() {
al@949 469 [ -d "$INSTALLED/$1" ]
al@880 470 }
al@880 471
al@939 472
al@880 473 # get package's description, install flag and sizes
al@939 474
al@943 475 desc_etc() {
al@949 476 if grep -q "^$1"$'\t' "$PKGS_DB/installed.info"; then
al@943 477 echo 'TRUE' >> $PKGS_LIST; echo $1 >> $ORIG_LIST
al@880 478 else
al@943 479 echo 'FALSE' >> $PKGS_LIST
al@880 480 fi
al@943 481 awk -F$'\t' -vp="$1" '
al@943 482 ($1==p){
al@943 483 split($7, s, " ");
al@943 484 printf "%s\n%s\n%s\n%s\n", $1, $4, s[1], s[2];
al@949 485 }' "$PKGS_DB/packages.info" >> $PKGS_LIST
al@880 486 }
al@880 487
al@939 488
al@880 489 # remove temp
al@939 490
al@880 491 rm_temp() {
al@880 492 rm -f $PKGS_LIST $ORIG_LIST $ANSWER $NEW_LIST $LIST1 $LIST2
al@880 493 }
al@880 494
al@939 495
al@880 496 # install/remove locale packages
al@939 497
al@880 498 manage_i18n() {
al@880 499 PKGS_LIST=$(mktemp)
al@880 500 ORIG_LIST=$(mktemp)
al@880 501 ANSWER=$(mktemp)
al@880 502 NEW_LIST=$(mktemp)
al@880 503 LIST1=$(mktemp)
al@880 504 LIST2=$(mktemp)
al@949 505 PINFO="$PKGS_DB/packages.info"
al@949 506
al@949 507 if [ ! -e "$PINFO" ]; then
al@949 508 icon='dialog-warning'
al@949 509 yad --title="$(_n 'Manage locale packages')" --window-icon="$icon" \
al@949 510 --width='400' --on-top --center \
al@949 511 --image="$icon" --image-on-top \
al@949 512 --text="$(_n 'Please, recharge packages database.')" \
al@957 513 --button="$(_n 'Recharge list')!view-refresh:2" \
al@949 514 --button="gtk-cancel:1"
al@949 515
al@949 516 case "$?" in
al@957 517 1) rm_temp; return;;
al@949 518 2) tazbox recharge;;
al@949 519 esac
al@949 520 fi
al@949 521
al@949 522 tazbox notify "$(_ 'Please wait')" appointment-soon &
al@880 523
al@943 524 for i in $(awk -F$'\t' '$1~/^locale-[a-z_A-Z]+$/{print $1}' $PINFO); do
al@880 525 desc_etc $i
al@880 526 done
al@880 527
al@943 528 if [ "$1" != 'main' ]; then
al@943 529 for i in $(awk -F$'\t' '$1~/^locale-[a-z_A-Z]+-extra$/{print $1}' $PINFO); do
al@880 530 desc_etc $i
al@880 531 done
al@943 532
al@880 533 if if_installed libQtCore; then
al@943 534 for i in $(awk -F$'\t' '$1~/^qt-locale/{print $1}' $PINFO); do
al@880 535 desc_etc $i
al@880 536 done
al@880 537 fi
al@943 538
al@880 539 if if_installed razorqt; then
al@943 540 for i in $(awk -F$'\t' '$1~/^razorqt-locale/{print $1}' $PINFO); do
al@880 541 desc_etc $i
al@880 542 done
al@880 543 fi
al@943 544
al@880 545 if if_installed firefox; then
al@943 546 for i in $(awk -F$'\t' '$1~/^firefox-langpack/{print $1}' $PINFO); do
al@880 547 desc_etc $i
al@880 548 done
al@880 549 fi
al@943 550
al@880 551 if if_installed thunderbird; then
al@943 552 for i in $(awk -F$'\t' '$1~/^thunderbird-langpack/{print $1}' $PINFO); do
al@880 553 desc_etc $i
al@880 554 done
al@880 555 fi
al@943 556
al@880 557 if if_installed squirrelmail; then
al@943 558 for i in $(awk -F$'\t' '$1~/^squirrelmail-[a-z][a-z][_-]/{print $1}' $PINFO); do
al@880 559 desc_etc $i
al@880 560 done
al@880 561 fi
al@943 562
al@880 563 if if_installed aspell; then
al@943 564 for i in $(awk -F$'\t' '$1~/^aspell-[a-z][a-z]_?[A-Z]?[A-Z]?$/{print $1}' $PINFO); do
al@880 565 desc_etc $i
al@880 566 done
al@880 567 fi
al@943 568
al@880 569 OTHER_LOCALE="gnome-commander|-i18n gnome-vfs|-i18n gpa|-langpack \
al@880 570 gucharmap|-i18n lxterminal|-locales lyx|-locales rox-filer|-locales \
al@880 571 ufraw|-locales qupzilla|-locales"
al@880 572 for i in $OTHER_LOCALE; do
al@880 573 if if_installed ${i%%|*}; then desc_etc ${i/|/}; fi
al@880 574 done
al@880 575 fi
al@880 576
al@957 577 icon='preferences-desktop-locale'
al@880 578 cat $PKGS_LIST | \
al@880 579 {
al@943 580 yad --title="$(_n 'Manage locale packages')" --window-icon="$icon" \
al@943 581 --width='600' --height='400' --on-top --center \
al@943 582 --image="$icon" --image-on-top \
al@880 583 --text="$(_n 'Check only locale packages you need and press "Install/Remove".')" \
al@943 584 --list --multiple --ellipsize='END' --expand-column='3' \
al@880 585 --column="$(_n 'Inst.'):CHK" --column="$(_n 'Package Name'):TEXT" \
al@880 586 --column="$(_n 'Description'):TEXT" --column="$(_n 'Size'):TEXT" \
al@880 587 --column="$(_n 'Installed'):TEXT" \
al@957 588 --button="$(_n 'Recharge list')!view-refresh:4" \
al@957 589 --button="$(_n 'Install/Remove')!gtk-execute:2" \
al@880 590 --button="gtk-cancel:1" \
al@880 591 --print-all
al@880 592 } > $ANSWER
al@880 593
al@949 594 case "$?" in
al@949 595 1) rm_temp; exit 0;;
al@957 596 4) tazbox recharge; rm_temp; tazbox manage_i18n; exit 0;;
al@949 597 esac
al@880 598
al@880 599 grep -e 'TRUE' $ANSWER | cut -d'|' -f2 > $NEW_LIST
al@880 600
al@880 601 # check difference between ORIG_LIST and NEW_LIST
al@880 602 sort -o $LIST1 $ORIG_LIST
al@880 603 sort -o $LIST2 $NEW_LIST
al@880 604 DIFF=$(diff $LIST1 $LIST2 | sed '/---/d;/+++/d;/@@/d')
al@943 605 if [ -z "$DIFF" ]; then rm_temp; exit 0; fi
al@880 606
al@880 607 # output log to gtk window
al@957 608 title="$(_n 'TazPkg log')"; icon='system-software-update'; opts='--tail'
al@880 609 {
al@880 610 for pkg in $(echo "$DIFF" | grep -e '^-' | sed 's|^-||g'); do
al@943 611 _ 'REMOVE: %s' "$pkg"
al@943 612 yes | tazpkg -r $pkg --output='raw'
al@880 613 done
al@880 614 for pkg in $(echo "$DIFF" | grep -e '^+' | sed 's|^+||g'); do
al@943 615 _ 'INSTALL: %s' "$pkg"
al@943 616 tazpkg -gi $pkg --output='raw'
al@880 617 done
al@880 618 echo -e "\n\n$(_n 'Done!')\n"
al@880 619 } | output_command
al@880 620 rm_temp
al@880 621 }
al@880 622
al@880 623
al@880 624
pankso@632 625 # New file functions
al@939 626
pankso@632 627 newfile_main() {
al@957 628 icon='document-new'
al@943 629 yad --title="$(_n 'New file')" --window-icon="$icon" \
al@943 630 --width='460' --height='160' --on-top --center \
al@943 631 --image="$icon" --image-on-top \
al@943 632 --icon="$icon" \
al@813 633 --text="<b>$(_n 'Create a new file or folder on your desktop')</b>" \
al@813 634 --entry --entry-label="$(_n 'File name')" \
al@957 635 --ricon='edit-clear' \
al@813 636 --always-print-result \
al@878 637 --button="$(_n 'SHell script')!application-x-shellscript:4" \
al@939 638 --button="$(_n 'Folder')!folder:3" \
al@939 639 --button="$(_n 'File')!empty:2" \
al@943 640 --button='gtk-cancel:1'
pankso@632 641 }
pankso@632 642
al@939 643
pankso@632 644 newfile() {
pankso@632 645 file=$(newfile_main)
pankso@700 646 ret=$?
al@943 647 [ -z "$file" ] && exit 0
pankso@700 648 case $ret in
pankso@700 649 4)
al@943 650 cat > "$HOME/Desktop/$file" << EOT
pankso@632 651 #!/bin/sh
pankso@632 652 #
pankso@632 653
pankso@632 654 EOT
al@943 655 chmod +x "$HOME/Desktop/$file" ;;
al@943 656 3) mkdir -p "$HOME/Desktop/$file" ;;
al@943 657 2) touch "$HOME/Desktop/$file" ;;
pankso@700 658 1) exit 0 ;;
pankso@632 659 esac
pankso@632 660 }
pankso@632 661
al@939 662
pankso@637 663 # All applications
al@939 664
pankso@637 665 all_apps() {
al@957 666 icon='user-bookmarks'
al@943 667 yad --title="$(_n 'All Applications')" --window-icon="$icon" \
al@943 668 --width='400' --height='400' \
al@813 669 --icons --compact \
al@943 670 --read-dir='/usr/share/applications' \
al@943 671 --button='gtk-close:0'
pankso@637 672 }
pankso@637 673
al@939 674
al@813 675 # Ask root permissions for system settings
al@939 676
al@813 677 ask_root() {
al@943 678 if [ "$(id -u)" -ne 0 ]; then
al@813 679 exec tazbox su $0 $@
al@813 680 exit 0
al@813 681 fi
al@813 682 }
al@810 683
al@939 684
pascal@967 685 vnc_main() {
pascal@967 686 icon='video-display'
pascal@967 687 yad --title="$(_n 'Framebuffer VNC viewer')" --window-icon="$icon" \
pascal@969 688 --width='250' --height='160' --on-top --center \
pascal@969 689 --image="$icon" --image-on-top --icon="$icon" \
pascal@969 690 --form \
pascal@969 691 --text="<b>$(_n 'Remote display connection')</b>" "localhost 5900" \
pascal@969 692 --field="$(_n 'VNC Server')" \
pascal@969 693 --field="$(_n 'Via a SSH tunnel'):CHK" \
pascal@967 694 --always-print-result \
pascal@969 695 --button="$(_n 'On this console'):1" \
pascal@969 696 --button="$(_n 'In a new console'):0"
pascal@967 697 }
pascal@967 698
pascal@967 699
pascal@1015 700 ssh_main() {
pascal@1015 701 icon='xterm'
pascal@1027 702 yad --title="$(_n 'Remote connection')" --window-icon="$icon" \
pascal@1015 703 --width='250' --height='180' --on-top --center \
pascal@1015 704 --image="$icon" --image-on-top --icon="$icon" \
pascal@1015 705 --form \
pascal@1027 706 --text="<b>$(_n 'Remote terminal connection')</b>" "user@host:port" \
pascal@1027 707 --field="$(_n 'Server')" \
pascal@1015 708 --field="$(_n 'Password'):H" \
pascal@1020 709 --field="$(_n 'SSH Keys'):MFL" \
pascal@1020 710 --field="$(_n 'SSH Proxy')" \
pascal@1027 711 --field="$(_n 'Telnet protocol (instead of SSH)'):CHK" \
pascal@1015 712 --always-print-result
pascal@1015 713 }
pascal@1015 714
pascal@1015 715
pascal@979 716 video() {
pascal@979 717 icon='video-x-generic'
pascal@979 718
pascal@985 719 # Get switchs
pascal@985 720 tazwebargs="--notoolbar"
pascal@985 721 while true ; do
pascal@985 722 case "$1" in
pascal@989 723 --fullscreen) tazwebargs="$tazwebargs --kiosk"
pascal@990 724 dpmstimeout=$(xset q | grep timeout | cut -d' ' -f5) ;;
pascal@989 725 --loop) loop="loop" ;;
pascal@985 726 *) break
pascal@985 727 esac
pascal@985 728 shift
pascal@985 729 done
pascal@985 730
pascal@979 731 # Get filename
pascal@979 732 [ "$1" ] && file="$PWD/$(basename "$1")"
pascal@1029 733 [ "${1:0:1}" = "/" ] && file="$1"
al@992 734 [ -s "$file" ] || file="$(yad --file --width='600' --height='500' --add-preview \
al@992 735 --window-icon $icon --title "$(_ 'Select the video file')" --center \
pascal@994 736 --file-filter="$(_ 'All video files')|*.mp4 *.m4v *.webm *.ogg *.ogv *.flv *.avi *.3gp" \
al@992 737 --file-filter="$(_ 'All files')|*")"
pascal@982 738 [ -s "$file" ] || return
pascal@979 739
pascal@979 740 # Extra parameters
pascal@979 741 text=
pascal@979 742 attr='autoplay="true"'
pascal@988 743 for i in jpg jpeg ; do
al@992 744 [ -s "${file%.*}.$i" ] &&
pascal@979 745 attr="poster=\"file://${file%.*}.$i\"" && break
pascal@979 746 done
al@992 747 IFS=$'\n'
pascal@988 748 for i in ${file%.*}_${LANG%%[._]*}.vtt ${file%.*}.vtt ; do
pascal@979 749 [ -s $i ] && text="
pascal@988 750 <track kind=\"captions\" src=\"file://$i\" srclang=\"${LANG%%[._]*}\" default>"
pascal@979 751 done
pascal@979 752
pascal@979 753 # Build the html5 page
pascal@979 754 tmp=/tmp/video-player-$$.html
pascal@979 755 cat > $tmp <<EOT
pascal@979 756 <html>
pascal@979 757 <head>
al@992 758 <meta charset="UTF-8">
pascal@979 759 <title>$(basename "$file")</title>
al@992 760 <style>
al@995 761 body{background:#000;margin:0}
al@992 762 a{color:#29F}
al@995 763 div{color:#FFF;position:absolute;bottom:2em;left:0;right:0;text-align:center}
pascal@985 764 </style>
pascal@979 765 </head>
pascal@979 766 <body>
pascal@988 767 <video width="100%" height="100%" src="file://$file" controls $attr$loop>$text
al@992 768 <div>$(_ 'Unsupported video file format.')<br>
al@992 769 $(IFS=$'\n'; _ 'Retry with %s, %s, %s, %s, %s or %s.' \
al@992 770 $(printf '<a href="http://127.0.0.1:82/user/pkgs.cgi?info=%s">%s</a>\n' \
al@992 771 vlc VLC gnome-mplayer 'GNOME MPlayer' mplayer MPlayer gxine gxine xine-ui xine ffplay ffplay))
al@992 772 </div>
pascal@979 773 </video>
pascal@979 774 </body>
pascal@979 775 </html>
pascal@979 776 EOT
pascal@993 777 unset IFS
pascal@990 778 [ -n "$dpmstimeout" ] && xset dpms 0 0 0 s 0 0
pascal@985 779 tazweb $tazwebargs file://$tmp || browser file://$tmp
pascal@990 780 [ -n "$dpmstimeout" ] && xset dpms $dpmstimeout $dpmstimeout $dpmstimeout s $dpmstimeout $dpmstimeout
pascal@979 781 rm -f $tmp
pascal@979 782 }
pascal@979 783
pascal@979 784
pascal@967 785 newvt()
pascal@967 786 {
pascal@967 787 ask_root newvt $@ || return
pascal@967 788 openvt -sw $@
pascal@967 789 deallocvt
pascal@967 790 }
pascal@967 791
pascal@967 792
pascal@967 793 vnc() {
pascal@967 794 server=$(vnc_main)
pascal@967 795 status=$?
pascal@967 796 # Deal with --button values
pascal@969 797 [ "$server" ] || return
pascal@969 798 case "$server" in
pascal@969 799 *TRUE\|) fbvnc=sshfbvnc ;;
pascal@969 800 *) fbvnc=fbvnc ;;
pascal@969 801 esac
pascal@969 802 case "$status" in
pascal@969 803 1) $fbvnc ${server%%|*} ;;
pascal@969 804 0) newvt $fbvnc ${server%%|*} ;;
pascal@967 805 esac
pascal@967 806 }
pascal@967 807
pascal@967 808
pascal@1015 809 ssh() {
pascal@1015 810 IFS='|'; set -- $(ssh_main) ; unset IFS
pascal@1028 811 export TERM=sakura; [ "$(which $TERM)" ] && XTERM=$TERM || XTERM=xterm
pascal@1015 812 [ -n "$2" ] && export DROPBEAR_PASSWORD="$2"
pascal@1027 813 s=${1#*@}; k="${3:+-i ${3//!/ -i }}"
pascal@1028 814 case "$4$5" in
pascal@1028 815 TRUE) $XTERM -e "telnet ${s/:/ }" ;;
pascal@1027 816 *RUE) dbclient $k -B $s $4 ;;
pascal@1027 817 *) export DBPROXY="$4"; sshx $k $1 ;;
pascal@1027 818 esac
pascal@1015 819 }
pascal@1015 820
pascal@1015 821
pankso@553 822 #
pankso@553 823 # Commands
pankso@553 824 #
al@939 825
pankso@553 826 case "$1" in
pankso@553 827 su)
al@943 828 shift
al@813 829 # Don't show dialog if we are root
al@943 830 [ "$(id -u)" -eq 0 ] && exec "$@"
al@943 831 SU_CMD="$@"
al@943 832 SUBOX_CONF="$HOME/.config/slitaz/subox.conf"
al@939 833
paul@593 834 # Check if a password has been saved before launching main dialog
al@943 835 if [ -s "$SUBOX_CONF" ]; then
al@943 836 PASSWD="$(cat $SUBOX_CONF)"
al@943 837 CHECKED='TRUE'
pankso@587 838 fi
al@939 839
pankso@744 840 # Display the main dialog (ask for password)
al@943 841 main="$(su_main "$SU_CMD")"
al@939 842
paul@593 843 # Deal with --button values and exit if cancelled to avoid erasing
pankso@587 844 # saved password.
al@943 845 [ "$?" -eq 1 ] && exit 0
al@939 846
pankso@587 847 # Save or erase Autosaved password
pascal@1029 848 if [ $(echo "$main" | cut -d"|" -f2) = 'TRUE' ]; then
al@943 849 echo "$main" | cut -d"|" -f1 > $SUBOX_CONF
al@943 850 chmod 0600 $SUBOX_CONF
pankso@587 851 else
al@943 852 cat /dev/null > $SUBOX_CONF
pankso@587 853 fi
al@939 854
pankso@744 855 # Try to login & execute. If password is wrong execute error dialog
psychomaniak@978 856 SU_CMD_QUOTED="$(echo "$SU_CMD" | sed 's|&|\\&|g')"
al@943 857 echo $main | cut -d"|" -f1 | su -c "$SU_CMD_QUOTED &" || su_error
al@943 858 ;;
al@943 859
pankso@553 860 logout)
paul@593 861 # Logout window with actions
al@1004 862 if [ -n "$2" ]; then
al@1004 863 answer="$2"
al@1004 864 logout_confirm $answer
al@813 865 else
al@813 866 logout_main; answer=$?
al@813 867 fi
al@939 868
pankso@553 869 # Deal with --button values
paul@763 870 # DE and WM started with a custom -session script should export
pankso@736 871 # XDG_CURRENT_DESKTOP
al@813 872 case $answer in
al@1004 873 4|exit)
pankso@736 874 case $XDG_CURRENT_DESKTOP in
pankso@736 875 LXDE)
al@943 876 [ -n "$_LXSESSION_PID" ] && kill $_LXSESSION_PID
pascal@1029 877 [ "$DESKTOP_SESSION" = 'compiz' ] && killall compiz
pankso@736 878 openbox --exit ;;
pankso@736 879 openbox) openbox --exit ;;
pankso@736 880 compiz) killall compiz ;;
pankso@736 881 *)
pankso@736 882 # Try to kill other WM that dont set XDG var.
pankso@736 883 jwm -exit 2>/dev/null ;;
pankso@736 884 esac ;;
al@1004 885 3|reboot)
al@813 886 reboot || reboot -f ;;
al@1004 887 2|halt)
al@813 888 poweroff ;;
al@943 889 esac
al@943 890 ;;
al@943 891
pankso@562 892 out)
pankso@562 893 # Pipe a command into a GTK window
al@943 894 sed 's|\[.m||g; s|\[[0-9][0-9]*G| |g' | output_command
al@943 895 ;;
al@943 896
paul@593 897 out-dl)
pankso@562 898 # A tiny GTK window for Busybox wget output
al@943 899 url="$2"; opts='--tail --button=gtk-cancel:1'
al@957 900 icon='folder-download'; title="$(_ 'Downloading...')"
slaxemulator@594 901 [ -d $DOWNLOADS ] || mkdir -p $DOWNLOADS
pascal@648 902 busybox wget -c -P $DOWNLOADS $url 2>&1 | output_command
al@943 903 cancel_dl
al@943 904 ;;
al@943 905
pankso@569 906 locale)
al@943 907 ask_root $@ && locale
al@943 908 ;;
al@943 909
pankso@569 910 keymap)
al@943 911 ask_root $@ && keymap
al@943 912 ;;
al@943 913
al@813 914 tz)
al@943 915 ask_root $@ && tz
al@943 916 ;;
al@943 917
al@880 918 manage_i18n)
al@943 919 ask_root $@ && manage_i18n $2
al@943 920 ;;
al@943 921
al@880 922 recharge)
al@949 923 ask_root $@; opts='--on-top'; output=raw tazpkg recharge | output_command
al@943 924 ;;
al@943 925
al@813 926 setup)
al@943 927 ask_root $@ && setup
al@943 928 ;;
al@943 929
pankso@632 930 new-file)
al@943 931 newfile
al@943 932 ;;
al@943 933
pankso@637 934 all-apps)
al@943 935 all_apps
al@943 936 ;;
al@943 937
pankso@689 938 notify|-n)
pankso@689 939 # On screen notification box.
pankso@721 940 icon="$3"
pankso@721 941 time="$4"
al@957 942 [ -z "$icon" ] && icon='dialog-information'
al@943 943 [ -z "$time" ] && time='4'
al@943 944 yad --width='520' --height='80' --timeout="$time" --timeout-indicator='right' \
al@943 945 --on-top --center --no-buttons --borders='12' --undecorated \
al@943 946 --skip-taskbar --image="$icon" --image-on-top --text="<b>$2</b>"
al@943 947 ;;
al@943 948
al@807 949 tazapps)
al@807 950 # Default applications configuration script. System wide config file
al@807 951 # is /etc/slitaz/applications.conf and each user can have personal
al@807 952 # settings. System wide for root and personal config for user.
al@807 953 export CONFIG="$HOME/.config/slitaz/applications.conf"
al@943 954 if [ "$(id -u)" -eq 0 ]; then
psychomaniak@912 955 [ ! -f $CONFIG ] || mv -f $CONFIG /etc/slitaz/applications.conf
al@943 956 export CONFIG='/etc/slitaz/applications.conf'
al@807 957 fi
psychomaniak@912 958
al@943 959 for a in FILE_MANAGERS BROWSERS EDITORS TERMINALS WINDOW_MANAGERS; do
psychomaniak@918 960 eval $(expr $a=$(echo $(LC_ALL=C tazx get-applist ${a%%S} \
psychomaniak@912 961 only-installed yad) | sed 's/ /!/g ; s/!!//g; s/ //g'))
psychomaniak@912 962 done
psychomaniak@912 963
psychomaniak@912 964 # Missing file was created by slitaz_apps_conf function from tazx
al@807 965 . $CONFIG
al@810 966
al@939 967 icon='preferences-desktop-default-applications'
al@813 968 eval $(yad --title="$(_n 'SliTaz default applications')" \
al@943 969 --window-icon="$icon" --image="$icon" --image-on-top \
al@813 970 --text="<b>$(_n 'SliTaz default applications configuration')</b>" \
al@807 971 --form \
al@813 972 --field="$(_n 'File manager:'):CBE" "$FILE_MANAGERS" \
al@813 973 --field="$(_n 'Web browser:'):CBE" "$BROWSERS" \
al@813 974 --field="$(_n 'Text editor:'):CBE" "$EDITORS" \
al@813 975 --field="$(_n 'Terminal:'):CBE" "$TERMINALS" \
al@813 976 --field="$(_n 'Window manager:'):CBE" "$WINDOW_MANAGERS" | \
al@807 977 awk -F'|' '{printf "FILE_MANAGER=\"%s\"\nBROWSER=\"%s\"\nEDITOR=\"%s\"\
al@807 978 TERMINAL=\"%s\"\nWINDOW_MANAGER=\"%s\"\n", $1, $2, $3, $4, $5}')
al@810 979
al@807 980 sed '/FILE_MANAGER=/s|"\([^"]*\)"|"'$FILE_MANAGER'"|; \
al@807 981 /BROWSER=/s|"\([^"]*\)"|"'$BROWSER'"|; \
al@807 982 /EDITOR=/s|"\([^"]*\)"|"'$EDITOR'"|; \
al@807 983 /TERMINAL=/s|"\([^"]*\)"|"'$TERMINAL'"|; \
al@807 984 /WINDOW_MANAGER=/s|"\([^"]*\)"|"'$WINDOW_MANAGER'"|' \
al@943 985 -i $CONFIG
al@943 986 ;;
al@943 987
al@807 988 gpl)
al@957 989 yad --title='GNU General Public License' --window-icon='text-x-copying' \
al@943 990 --geometry='650x500' \
al@943 991 --image='/usr/share/pixmaps/gpl3.png' --image-on-top \
al@813 992 --center \
al@813 993 --text-info \
al@943 994 --fontname='monospace' \
al@943 995 --button 'OK' < /usr/share/licenses/gpl.txt
al@943 996 ;;
al@943 997
pascal@1015 998 ssh)
pascal@1015 999 ssh
pascal@1015 1000 ;;
pascal@1015 1001
pascal@967 1002 vnc)
pascal@967 1003 vnc
pascal@967 1004 ;;
pascal@967 1005
pascal@979 1006 video)
pascal@985 1007 shift
pascal@985 1008 video "$@"
pascal@979 1009 ;;
pascal@979 1010
pascal@967 1011 newvt)
pascal@967 1012 $@
pascal@967 1013 ;;
pascal@967 1014
al@1004 1015 mkmenu) $@ ;;
al@1004 1016
pankso@553 1017 *)
al@943 1018 usage
al@943 1019 ;;
pankso@553 1020 esac
pankso@553 1021
pankso@553 1022 exit 0