tazpkg annotate tazpkgbox @ rev 231

tazpkgbox: update lib for new functions
author Christophe Lincoln <pankso@slitaz.org>
date Sat Feb 21 22:12:27 2009 +0100 (2009-02-21)
parents 9f4db6b4a0ef
children dd48da6e9023
rev   line source
pankso@82 1 #!/bin/sh
pankso@82 2 #
pankso@231 3 # GTKdialog interface to SliTaz Packages Manager aka Tazpkg. Notes:
pankso@231 4 # Notebook tab are vbox, tab are used to indent and functions are
pankso@231 5 # splited ang found in $LIB.
pankso@82 6 #
pankso@229 7 # (C) GNU gpl v3 - SliTaz GNU/Linux 2009.
pankso@82 8 #
pascal@211 9 VERSION=2.6
pankso@82 10
pankso@231 11 # Functions path.
pankso@231 12 export LIB=/usr/lib/lib/tazpkgbox
pankso@231 13
pankso@82 14 # Tazpkgbox is only for root.
pankso@82 15 if test $(id -u) != 0 ; then
pankso@82 16 exec subox tazpkgbox
pankso@82 17 exit 0
pankso@82 18 fi
pankso@82 19
pankso@82 20 # We need at least a mirror URL.
pankso@82 21 if [ ! -f /var/lib/tazpkg/mirror ]; then
pankso@82 22 tazpkg >/dev/null
pankso@82 23 fi
pankso@82 24
pankso@82 25 # Tmp dir and files used to get pkgs infos on the fly. Clean also
pankso@82 26 # list and search files to load less data and have a faster start.
pankso@82 27 mkdir -p /tmp/tazpkgbox
pankso@230 28 echo "all" > /tmp/tazpkgbox/status
pankso@230 29 echo "all" > /tmp/tazpkgbox/category
pascal@187 30 echo "all" > /tmp/tazpkgbox/undigest-category
pankso@82 31 echo "" > /tmp/tazpkgbox/search-installed
pankso@82 32 echo "" > /tmp/tazpkgbox/search-mirrored
pankso@82 33
pankso@82 34 # English/French help dialod.
pankso@82 35 export HELP='
pankso@82 36 <window title="Tazpkgbox Help" icon-name="help">
pankso@82 37 <vbox>
pankso@82 38 <text use-markup="true" width-chars="54">
pankso@82 39 <label>"
pankso@82 40 <b>Tazpkgbox - Packages Manager Help</b>"
pankso@82 41 </label>
pankso@82 42 </text>
pankso@86 43
pankso@82 44 <frame English>
pankso@82 45 <text wrap="false">
pankso@82 46 <label>"
pankso@86 47 Tazpkgbox is a simple and easy to use interface to the SliTaz
pankso@86 48 package manager - aka Tazpkg. You can install, remove, repack or
pankso@86 49 get packages by double-clicking on the package item. A Search engine
pankso@86 50 lets you find and install new applications in a few mouse clicks.
pankso@86 51
pankso@86 52 Downloaded and repacked packages are stored in: /var/cache/tazpkg"
pankso@82 53 </label>
pankso@82 54 </text>
pankso@82 55 </frame>
pankso@86 56
pankso@82 57 <frame Français>
pankso@82 58 <text wrap="false">
pankso@82 59 <label>"
pankso@82 60 Tazpkgbox est une interface graphique au gestionnaire de paquet
pankso@86 61 de Slitaz aka Tazpkg. Simple et facile à utiliser, vous pouvez
pankso@82 62 installer, télécharger ou supprimer des paquet en double-cliquant
pankso@86 63 sur sa ligne. Les paquets téléchargés ou recréés sont stocké
pankso@82 64 dans: /var/cache/tazpkg"
pankso@82 65 </label>
pankso@82 66 </text>
pankso@82 67 </frame>
pankso@86 68
pankso@82 69 <hbox>
pankso@82 70 <button ok>
pankso@82 71 <action type="closewindow">HELP</action>
pankso@82 72 </button>
pankso@82 73 </hbox>
pankso@82 74 </vbox>
pankso@82 75 </window>
pankso@82 76 '
pankso@82 77
pascal@210 78 FILES="$2"
pascal@210 79 [ "$1" = "list_config" ] || FILES=""
pascal@210 80 export LIST_CONFIG_FILES="
pascal@210 81 <window title=\"configuration files\" icon-name=\"system-file-manager\">
pascal@139 82 <vbox>
pascal@210 83 <tree exported_column=\"5\">
pascal@143 84 <width>560</width><height>160</height>
pascal@142 85 <variable>CONF_FILE</variable>
pascal@143 86 <label>Access | User | Group | Size | Update Date | Name</label>
pascal@210 87 <input>tazpkg list-config --box $FILES</input>
pascal@210 88 <action>leafpad \$CONF_FILE</action>
pascal@139 89 </tree>
pascal@139 90 <hbox>
pascal@210 91 <text wrap=\"false\">
pascal@142 92 <label>
pascal@210 93 \"Only files with Update Date have been modified after package installation\"
pascal@142 94 </label>
pascal@141 95 </text>
pascal@139 96 <button>
pascal@210 97 <input file icon=\"gtk-close\"></input>
pascal@210 98 <action type=\"closewindow\">INSTALLED_PACKAGE_ACTIONS</action>
pascal@139 99 </button>
pascal@139 100 </hbox>
pascal@139 101 </vbox>
pascal@139 102 </window>
pascal@210 103 "
pascal@210 104 if [ "$1" = "list_config" ]; then
pascal@210 105 gtkdialog --center --program=LIST_CONFIG_FILES >/dev/null
pascal@210 106 exit 0
pascal@210 107 fi
pascal@139 108
pascal@187 109 export SETUP_UNDIGEST='
pascal@187 110 <window title="undigest mirrors" icon-name="tazpkg">
pascal@187 111 <vbox>
pascal@187 112 <tree>
pascal@187 113 <width>560</width><height>160</height>
pascal@187 114 <variable>UNDIGEST_LIST</variable>
pascal@187 115 <label>Name | URL</label>
pascal@187 116 <input>tazpkg list-undigest --box</input>
pascal@187 117 <action>xterm -T "Remove undigest" -geometry 80x16+120+120 -e "tazpkg remove-undigest $UNDIGEST_LIST; sleep 2"</action>
pascal@187 118 </tree>
pascal@187 119 <hbox>
pascal@187 120 <text>
pascal@187 121 <label>URL:</label>
pascal@187 122 </text>
pascal@187 123 <entry>
pascal@187 124 <variable>UNDIGEST_URL</variable>
pascal@187 125 </entry>
pascal@187 126 </hbox>
pascal@187 127 <hbox>
pascal@187 128 <text>
pascal@187 129 <label>Name:</label>
pascal@187 130 </text>
pascal@187 131 <entry>
pascal@187 132 <variable>UNDIGEST_NAME</variable>
pascal@187 133 </entry>
pascal@187 134 <button>
pascal@187 135 <label>Add</label>
pascal@187 136 <input file icon="gtk-add"></input>
pascal@187 137 <action>tazpkg add-undigest "$UNDIGEST_NAME" $UNDIGEST_URL</action>
pascal@187 138 <action>refresh:UNDIGEST_LIST</action>
pascal@187 139 </button>
pascal@187 140 <button>
pascal@187 141 <label>Remove</label>
pascal@187 142 <input file icon="gtk-remove"></input>
pascal@187 143 <action>xterm -T "Remove undigest" -geometry 80x16+120+120 -e "tazpkg remove-undigest $UNDIGEST_NAME; sleep 2"</action>
pascal@187 144 <action>refresh:UNDIGEST_LIST</action>
pascal@187 145 </button>
pascal@187 146 <button>
pascal@187 147 <label>Update</label>
pascal@187 148 <input file icon="reload"></input>
pascal@187 149 <action>tazpkg setup-undigest "$UNDIGEST_NAME" $UNDIGEST_URL</action>
pascal@187 150 <action>refresh:UNDIGEST_LIST</action>
pascal@187 151 </button>
pascal@187 152 <button>
pascal@187 153 <input file icon="gtk-close"></input>
pascal@187 154 <action type="closewindow">SETUP_UNDIGEST</action>
pascal@187 155 </button>
pascal@187 156 </hbox>
pascal@187 157 </vbox>
pascal@187 158 </window>
pascal@187 159 '
pascal@187 160
pankso@229 161 # Scan notifycation
pankso@229 162 desktopbox notify "Scanning packages database" 6 &
pankso@229 163
pankso@82 164 # Main dialog
pankso@82 165 export TAZPKG_DIALOG='
pankso@82 166 <window title="SliTaz Packages Manager" icon-name="package-x-generic">
pankso@82 167 <vbox>
pankso@82 168
pankso@82 169 <hbox>
pankso@82 170 <text use-markup="true">
pankso@82 171 <label>"<b>Packages Manager</b>"</label>
pankso@82 172 </text>
pankso@82 173 <pixmap>
pankso@82 174 <input file>/usr/share/pixmaps/tazpkg.png</input>
pankso@82 175 </pixmap>
pankso@82 176 </hbox>
pankso@82 177
pankso@230 178 <notebook labels="Packages list|Search|Undigest|Configuration">
pankso@82 179
pankso@82 180 <vbox>
pankso@82 181 <tree>
pankso@102 182 <width>620</width><height>240</height>
pankso@82 183 <variable>PKG</variable>
pankso@230 184 <label>Name|Version|Description</label>
pankso@230 185 <input icon_column="0">$LIB/list all</input>
pankso@82 186 <action>echo "$PKG" > /tmp/tazpkgbox/pkg</action>
pankso@230 187 <action>$LIB/package_infos</action>
pankso@82 188 <action>refresh:PKG</action>
pascal@187 189 <action>refresh:GETIT</action>
pankso@82 190 <action>refresh:PKG_STATS</action>
pankso@82 191 <action>refresh:CACHE_STATS</action>
pankso@82 192 </tree>
pankso@82 193 <hbox>
pankso@82 194 <text>
pankso@230 195 <label>"Status:"</label>
pankso@230 196 </text>
pankso@230 197 <combobox>
pankso@230 198 <variable>STATUS</variable>
pankso@230 199 <item>all</item>
pankso@230 200 <item>installed</item>
pankso@230 201 <item>installable</item>
pankso@230 202 <item>blocked</item>
pankso@230 203 </combobox>
pankso@230 204 <text>
pankso@82 205 <label>"Category:"</label>
pankso@82 206 </text>
pankso@82 207 <combobox>
pankso@230 208 <variable>CAT</variable>
pankso@82 209 <item>all</item>
pankso@82 210 <item>base-system</item>
pascal@160 211 <item>x-window</item>
pankso@82 212 <item>utilities</item>
pankso@82 213 <item>network</item>
pankso@82 214 <item>graphics</item>
pankso@82 215 <item>multimedia</item>
pankso@82 216 <item>office</item>
pankso@82 217 <item>development</item>
pankso@82 218 <item>system-tools</item>
pankso@82 219 <item>security</item>
pankso@82 220 <item>games</item>
pankso@82 221 <item>misc</item>
pankso@82 222 <item>meta</item>
pankso@82 223 <item>non-free</item>
pankso@82 224 </combobox>
pankso@82 225 <button>
pankso@82 226 <label>List</label>
pankso@82 227 <input file icon="reload"></input>
pankso@230 228 <action>echo "$CAT" > /tmp/tazpkgbox/category</action>
pankso@230 229 <action>echo "$STATUS" > /tmp/tazpkgbox/status</action>
pankso@82 230 <action>refresh:PKG</action>
pankso@82 231 </button>
pankso@82 232 </hbox>
pankso@82 233 </vbox>
pankso@230 234
pankso@230 235 <vbox>
pankso@230 236 <tree icon="tazpkg">
pankso@230 237 <width>620</width><height>120</height>
pankso@230 238 <variable>RESULT_INSTALLED</variable>
pankso@230 239 <label>Installed packages|Version|Description / File</label>
pankso@230 240 <input>cat /tmp/tazpkgbox/search-installed</input>
pankso@230 241 <action>echo "$RESULT_INSTALLED" > /tmp/tazpkgbox/pkg</action>
pankso@230 242 <action>$LIB/package_infos</action>
pankso@230 243 <action>$LIB/search</action>
pankso@230 244 <action>refresh:RESULT_INSTALLED</action>
pascal@130 245 <action>refresh:PKG</action>
pankso@230 246 <action>refresh:PKG_STATS</action>
pankso@230 247 <action>refresh:CACHE_STATS</action>
pankso@230 248 </tree>
pankso@230 249 <tree icon="tazpkg">
pankso@230 250 <width>620</width><height>120</height>
pankso@230 251 <variable>RESULT_MIRROR</variable>
pankso@230 252 <label>Mirrored packages|Version|Description / File</label>
pankso@230 253 <input>cat /tmp/tazpkgbox/search-mirrored</input>
pankso@230 254 <action>echo "$RESULT_MIRROR" > /tmp/tazpkgbox/pkg</action>
pankso@230 255 <action>$LIB/package_infos</action>
pankso@230 256 <action>$LIB/search</action>
pankso@230 257 <action>refresh:RESULT_INSTALLED</action>
pankso@230 258 <action>refresh:PKG</action>
pascal@130 259 <action>refresh:PKG_STATS</action>
pascal@130 260 <action>refresh:CACHE_STATS</action>
pascal@130 261 </tree>
pascal@130 262 <hbox>
pankso@230 263 <entry>
pankso@230 264 <variable>SEARCH</variable>
pankso@230 265 </entry>
pascal@130 266 <button>
pankso@230 267 <label>Search Packages</label>
pankso@230 268 <input file icon="system-search"></input>
pankso@230 269 <action>$LIB/search</action>
pankso@230 270 <action>refresh:RESULT_INSTALLED</action>
pankso@230 271 <action>refresh:RESULT_MIRROR</action>
pascal@130 272 </button>
pankso@82 273 <button>
pankso@230 274 <label>Search Files</label>
pankso@230 275 <input file icon="system-search"></input>
pankso@230 276 <action>$LIB/search --files</action>
pankso@230 277 <action>refresh:RESULT_INSTALLED</action>
pankso@230 278 <action>refresh:RESULT_MIRROR</action>
pankso@82 279 </button>
pankso@82 280 </hbox>
pankso@82 281 </vbox>
pankso@82 282
pankso@82 283 <vbox>
pascal@178 284 <tree>
pascal@178 285 <width>620</width><height>240</height>
pascal@187 286 <variable>DEV</variable>
pascal@187 287 <label>Package name|Version|Description</label>
pankso@230 288 <input>$LIB/list undigest</input>
pascal@187 289 <action>echo "$DEV" > /tmp/tazpkgbox/pkg</action>
pankso@230 290 <action>$LIB/package_infos</action>
pascal@187 291 <action>refresh:PKG</action>
pascal@187 292 <action>refresh:GETIT</action>
pascal@187 293 <action>refresh:PKG_STATS</action>
pascal@187 294 <action>refresh:CACHE_STATS</action>
pascal@187 295 </tree>
pascal@187 296 <hbox>
pascal@187 297 <button>
pascal@187 298 <label>Setup undigest mirrors</label>
pascal@187 299 <input file icon="go-next"></input>
pascal@187 300 <action type="launch">SETUP_UNDIGEST</action>
pascal@187 301 </button>
pascal@187 302 </hbox>
pascal@187 303 <hbox>
pascal@187 304 <text>
pascal@187 305 <label>"Undigest:"</label>
pascal@187 306 </text>
pascal@187 307 <combobox>
pascal@187 308 <variable>UNDIGEST_ENTRY</variable>
pascal@213 309 '
pascal@213 310 for i in all $(ls /var/lib/tazpkg/undigest 2> /dev/null); do
pascal@213 311 TAZPKG_DIALOG="$TAZPKG_DIALOG <item>$i</item> "
pascal@213 312 done
pascal@213 313 tmp=' </combobox>
pascal@187 314 <text>
pascal@187 315 <label>"Category:"</label>
pascal@187 316 </text>
pascal@187 317 <combobox>
pascal@187 318 <variable>UNDIGEST_CAT</variable>
pascal@187 319 <item>all</item>
pascal@187 320 <item>base-system</item>
pascal@187 321 <item>x-window</item>
pascal@187 322 <item>utilities</item>
pascal@187 323 <item>network</item>
pascal@187 324 <item>graphics</item>
pascal@187 325 <item>multimedia</item>
pascal@187 326 <item>office</item>
pascal@187 327 <item>development</item>
pascal@187 328 <item>system-tools</item>
pascal@187 329 <item>security</item>
pascal@187 330 <item>games</item>
pascal@187 331 <item>misc</item>
pascal@187 332 <item>meta</item>
pascal@187 333 <item>non-free</item>
pascal@187 334 </combobox>
pascal@187 335 <button>
pascal@187 336 <label>List</label>
pascal@187 337 <input file icon="reload"></input>
pascal@187 338 <action>echo "$UNDIGEST_CAT $UNDIGEST_ENTRY" > /tmp/tazpkgbox/undigest-category</action>
pascal@187 339 <action>refresh:DEV</action>
pascal@187 340 </button>
pascal@187 341 </hbox>
pascal@187 342 </vbox>
pascal@187 343
pascal@187 344 <vbox>
pankso@227 345 <frame Files and Cache directory>
pascal@143 346 <text use-markup="true" width-chars="60" wrap="false">
pankso@227 347 <label>"
pankso@227 348 Lists, mirror URL and installed packages: <b>/var/lib/tazpkg</b>
pankso@227 349 The cache directory is used to store downloaded or repacked packages.
pankso@227 350 "</label>
pankso@86 351 </text>
pankso@82 352 <hbox>
pankso@82 353 <entry editable="false">
pankso@82 354 <input>cd /var/cache/tazpkg; echo "Packages: `ls | wc -l`, size: `du -sh $PWD`"</input>
pankso@82 355 <variable>CACHE_STATS</variable>
pankso@82 356 </entry>
pankso@82 357 <button>
pankso@82 358 <label>Clean cache</label>
pankso@86 359 <input file icon="go-next"></input>
pankso@82 360 <action>rm -rf /var/cache/tazpkg/*</action>
pankso@82 361 <action>refresh:CACHE_STATS</action>
pankso@82 362 </button>
pankso@82 363 </hbox>
pankso@82 364 </frame>
pankso@82 365 <frame Mirror URL>
pankso@82 366 <hbox>
pankso@82 367 <entry>
pankso@82 368 <input>head -n 1 /var/lib/tazpkg/mirror</input>
pankso@82 369 <variable>MIRROR</variable>
pankso@82 370 </entry>
pankso@82 371 <button>
pankso@82 372 <label>Setup</label>
pankso@82 373 <input file icon="go-next"></input>
pankso@82 374 <action>echo "$MIRROR" > /var/lib/tazpkg/mirror</action>
pankso@82 375 <action>clear:MIRROR</action>
pankso@82 376 <action>refresh:MIRROR</action>
pankso@82 377 </button>
pankso@82 378 <button>
pankso@82 379 <label>Add</label>
pankso@82 380 <input file icon="gtk-add"></input>
pankso@82 381 <action>echo "$MIRROR" >> /var/lib/tazpkg/mirror</action>
pankso@82 382 <action>clear:MIRROR</action>
pankso@82 383 <action>refresh:MIRROR</action>
pankso@82 384 </button>
pankso@82 385 </hbox>
pankso@82 386 </frame>
pascal@142 387 <hbox>
pascal@183 388 <frame Journal>
pascal@183 389 <hbox>
pascal@183 390 <button>
pascal@183 391 <label>Show journal</label>
pascal@183 392 <input file icon="find"></input>
pascal@207 393 <action>xterm -fa MiscFixed -fs 11 -bg gray93 -fg black -T "$(ls -l /var/log/tazpkg.log | while read mod links user grep remain ; do echo $remain ; done) (q to quit)" -geometry 80x25+120+120 -e "cat /var/log/tazpkg.log | less"</action>
pascal@183 394 </button>
pascal@183 395 </hbox>
pascal@183 396 </frame>
pascal@142 397 <frame Configuration files>
pascal@142 398 <hbox>
pascal@91 399 <button>
pascal@139 400 <label>Repack config</label>
pascal@139 401 <input file icon="edit-redo"></input>
pascal@142 402 <action>xterm -fa MiscFixed -fs 11 -bg gray93 -fg black -T "Repack configs" -geometry 80x25+120+120 -e "tazpkg repack-config ; sleep 5" 2> /dev/null</action>
pascal@139 403 </button>
pascal@139 404 <button>
pascal@139 405 <label>Config Files</label>
pascal@139 406 <input file icon="tazpkg"></input>
pascal@139 407 <action type="launch">LIST_CONFIG_FILES</action>
pascal@139 408 </button>
pascal@142 409 </hbox>
pascal@142 410 </frame>
pascal@142 411 <frame Packages check>
pascal@142 412 <hbox>
pascal@139 413 <button>
pascal@91 414 <label>Quick check</label>
pascal@91 415 <input file icon="go-next"></input>
pascal@130 416 <action>xterm -fa MiscFixed -fs 11 -bg gray93 -fg black -T "Check packages (q to quit)" -geometry 80x25+120+120 -e "tazpkg check | less " 2> /dev/null</action>
pascal@91 417 </button>
pascal@91 418 <button>
pascal@91 419 <label>Full check</label>
pascal@91 420 <input file icon="go-next"></input>
pascal@130 421 <action>xterm -fa MiscFixed -fs 11 -bg gray93 -fg black -T "Check packages (q to quit)" -geometry 80x25+120+120 -e "tazpkg check --full | less " 2> /dev/null</action>
pascal@91 422 </button>
pascal@142 423 </hbox>
pascal@142 424 </frame>
pascal@142 425 </hbox>
pankso@82 426 </vbox>
pankso@82 427
pankso@82 428 </notebook>
pankso@82 429
pankso@82 430 <hbox>
pascal@143 431 <text wrap="false">
pankso@230 432 <input>installed=`ls /var/lib/tazpkg/installed | wc -l`; mirrored=`cat /var/lib/tazpkg/packages.list | wc -l`; undigest=`cat /var/lib/tazpkg/undigest/*/packages.list 2> /dev/null | wc -l`; blocked=`cat /var/lib/tazpkg/blocked-packages.list 2> /dev/null | wc -l`; installable=$(($mirrored + $undigest - $installed)); [ $installable -lt 0 ] && installable=0; echo "Packages statistics: $installed installed, $blocked blocked, $installable installable, $undigest undigest, $mirrored mirrored, `cat /var/lib/tazpkg/upgradable-packages.list 2> /dev/null | wc -l` to upgrade "</input>
pankso@82 433 <variable>PKG_STATS</variable>
pankso@82 434 </text>
pankso@82 435 </hbox>
pankso@82 436
pankso@82 437 <hbox>
pascal@118 438 <button>
pankso@227 439 <label>Recharge lists</label>
pankso@227 440 <input file icon="system-software-update"></input>
pankso@227 441 <action>xterm -T "Recharge" -geometry 80x16+120+120 -e "tazpkg recharge; sleep 2" 2>/dev/null</action>
pankso@227 442 <action>refresh:DEV</action>
pankso@227 443 <action>refresh:GET</action>
pankso@227 444 <action>refresh:GETIT</action>
pankso@227 445 <action>refresh:PKG_STATS</action>
pankso@227 446 </button>
pankso@227 447 <button>
pankso@227 448 <label>Upgrade all</label>
pankso@227 449 <input file icon="system-software-update"></input>
pankso@227 450 <action>xterm -T "Package upgrade" -geometry 80x16+120+120 -e "tazpkg upgrade; sleep 2" 2>/dev/null</action>
pankso@227 451 <action>refresh:PKG</action>
pankso@227 452 <action>refresh:DEV</action>
pankso@227 453 <action>refresh:GET</action>
pankso@227 454 <action>refresh:GETIT</action>
pankso@227 455 <action>refresh:PKG_STATS</action>
pankso@227 456 <action>refresh:CACHE_STATS</action>
pankso@227 457 </button>
pankso@227 458 <button>
pascal@118 459 <label>Wok</label>
pascal@118 460 <input file icon="gtk-open"></input>
pascal@118 461 <action>firefox http://hg.slitaz.org/wok/file/</action>
pascal@118 462 </button>
pankso@82 463 <button help>
pankso@82 464 <label>Help</label>
pankso@82 465 <action type="launch">HELP</action>
pankso@82 466 </button>
pankso@82 467 <button>
pankso@82 468 <label>Exit</label>
pankso@82 469 <input file icon="exit"></input>
pankso@82 470 <action type="exit">Exit</action>
pankso@82 471 </button>
pankso@82 472 </hbox>
pankso@82 473
pankso@82 474 </vbox>
pankso@82 475
pankso@82 476 </window>
pankso@82 477 '
pascal@213 478 TAZPKG_DIALOG="$TAZPKG_DIALOG$tmp"
pankso@82 479
pankso@82 480 gtkdialog --center --program=TAZPKG_DIALOG >/dev/null
pankso@82 481
pankso@82 482 exit 0