diff options
author | Mario Izquierdo (mariodebian) <mariodebian@gmail.com> | 2012-06-22 12:33:28 +0100 |
---|---|---|
committer | Mario Izquierdo (mariodebian) <mariodebian@gmail.com> | 2012-06-22 12:33:28 +0100 |
commit | 41070ffaa9adacc4ed450aeec9c0b61d4a9aa8eb (patch) | |
tree | 57011a8f797ee1a04d0eaaeec06791b19159b926 |
tcosmonitor (0.2.48) unstable; urgency=low
* Add French translation (closes: #678235)
Thanks to Julien Patriarca <patriarcaj@gmail.com>
# imported from the archive
213 files changed, 50264 insertions, 0 deletions
@@ -0,0 +1,18 @@ + + Mario Izquierdo (mariodebian) <mariodebian@gmail.com> + + http://www.consoltux.com + + http://soleup.eup.uva.es/mariodebian + + + CONTRIBUTIONS: + + * Patches of video broadcast or send files + vidal_joshur at gva.es + + * Fix some english typos and translations + Andrés Jimenez + + * Remove wrong copyright lines + Quirón @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. @@ -0,0 +1,36 @@ + + + + If you can, better use debian package + + + if not using debian/ubuntu: + +Requirements: + * python2.4 + * python2.4 xml libs + * dbus and python-dbus + * libxmlrpc-c3-dev + * libxmlrpc-c3 + * busybox static bin placed on busybox dir + (you can donwload and uncompress debian package, + see busybox/Makefile for commands) + + # make + # make install + + Then install your thin client arquitecture bindings: + + PXES + # make install-pxes(VERSION) + VERSION could be 1.0, 1.1, or 1.2 + + LTSP + (installed on /opt/ltsp/ if not make a link, or move to it) + # make install-ltsp + + TCOS + # make install-tcos + + + Regenerate init images in case of pxes or tcos. @@ -0,0 +1,41 @@ + TcosMonitor + (mariodebian AT gmail DOT com) + + TcosMonitor is a pygtk app to control and supervise + a thin client classroom based on TCOS, PXES, LTSP or others. + + + The project have 2 different parts: + + * Teacher Tool (TcosMonitor) made with pygtk and other + standar libs + + * Thin Client daemon (tcosxmlrpc) developed in C based on + xmlrpc libs and abyss web server code and libs. + For debug output exec TCOS_DEBUG=1 /usr/bin/tcosxmlrpc /etc/abys.conf + + * Some extra tools (hex2ascii, update-tcospasswd, etc...) + + + The initial code is written from scratch helped with pygtk + tutorial [1] and some web pages (blogs, maillist, etc...) + + I have reutilized some python/C code from others: + + ping.py + High based on yetist [2], I have added a second + class named PingPort writen by me. + (don't know license of it, japanesse page) + + TcosDbus.py class + Based on dbus bindings of Student-Control-Center of Ubuntu [3] + GPL Copyright Holder: Oliver Grawert <ogra@ubuntu.com> + + + + +Links: +[1] http://www.pygtk.org/pygtk2tutorial-es/ +[2] http://www.osprg.org/modules/newbb/viewtopic.php?forum=3&post_id=487 +[3] http://people.ubuntu.com/~ogra/bzr-archive/student-control-panel-0.1/ + diff --git a/README.server-utils b/README.server-utils new file mode 100644 index 0000000..5b0eb44 --- /dev/null +++ b/README.server-utils @@ -0,0 +1,62 @@ +README file for server-utils tool + + +server-utils is a small python tool to allow do some jobs from UNIX cron. + + +================= +Requisites to run +================= + +First of all need to create a conf file in the user who run cron jobs +with data to connect to thin client. + +Example (user root): + +create /root/.tcosmonitor.conf with this data: +####################### +xmlrpc_username=__TCOS_USERNAME__ +xmlrpc_password=__TCOS_PASSWORD__ +####################### + +Replace __TCOS_USERNAME__ and __TCOS_PASSWORD__ with the correct info +that you are configured in /etc/tcos/tcos.conf + +Be sure to chmod 600 this file, password is in plain text. + + + +========================= +Poweroff All TCOS clients +========================= +Add this to your /etc/crontab: + +55 20 * * 5 root /usr/sbin/tcos-server-utils --action=message --text="In 5 minutes poweroff all pcs" +00 21 * * 5 root /usr/sbin/tcos-server-utils --action=poweroff + +This will poweroff all TCOS thin clients at 21:00 all Fridays + + + +========================= +Reboot All TCOS clients +========================= +Add this to your /etc/crontab: + +55 14 * * * root /usr/sbin/tcos-server-utils --action=message --text="In 5 minutes all pcs will be rebooted" +00 15 * * * root /usr/sbin/tcos-server-utils --action=reboot + +This will reboot all TCOS thin clients at 15:00 all days of week + +============================= +Restart Xorg All TCOS clients +============================= +Add this to your /etc/crontab: + +00 09 * * * root /usr/sbin/tcos-server-utils --action=restartx + +This will reboot all TCOS thin clients at 09:00 all days of week + + + +For more cron info see man crontab diff --git a/README.standalone b/README.standalone new file mode 100644 index 0000000..da7e4da --- /dev/null +++ b/README.standalone @@ -0,0 +1,62 @@ + ============================================ + + README for TCOS Standalone mode + + ============================================ + + +1.- Security + + If you activate standalone mode you will expose 8998 port + to anybody, if your network is untrusted please block all uncomming + connections to these ports, (with iptables for example) + + For example if your server (when tcosmonitor gui runs) is 192.168.0.254: + + iptables -A INPUT -p tcp -s 192.168.0.254 --destination-port 8998 --syn -j ACCEPT + iptables -A INPUT -p tcp -s 0/0 -d 0/0 --destination-port 8998 --syn -j DROP + + You can add this rules to your firewall or put into /etc/rc.local + +2.- Configure user and password + + It's posible to work with standard *nix auth but for better security it's + recomended to use a standalone autentication. + + In standalone host make this: + + # update-tcospasswd + + Arquitecture to update password: + + * TCOS + * STANDALONE + : STANDALONE + Username (usually root): root + TCOS Password: + I will write this file: + /etc/tcospasswd + Continue? [Y/n] Y + + + In TcosMonitor you will need to put same user and password than here. + +3.- Activate + + Change TCOS_STANDALONE_START=1 + +4.- Search for hosts. + + In TcosMonitor you need to configure discover method with ping + (netstat don't work) + + You can make a small trick to get a standalone host with netstat: + + + #!/bin/sh + + while [ 1 ]; do + telnet SERVER_IP 6000 + done + + Put this script at user session start. @@ -0,0 +1,9 @@ +Todo file for TcosMonitor + + * Write man pages + + +Obsolete PXES LTSP support + + * Make better PXES LTSP scripts + * avoid using busybox-static in PXES/LTSP (awk, httpd, seq...) diff --git a/conf/tcos.conf b/conf/tcos.conf new file mode 100644 index 0000000..cb36919 --- /dev/null +++ b/conf/tcos.conf @@ -0,0 +1,199 @@ +# some build vars +TCOS_DIR=/usr/share/initramfs-tools-tcos +TCOS_BINS=/usr/lib/tcos +TFTP_DIR=/var/lib/tcos/tftp +TCOS_CONF=/etc/tcos +TCOS_VAR=/var/lib/tcos +TCOS_PKG_CACHE=/var/cache/tcos/packages + +#TCOS___OPT=/opt/tcos # deprecated +#TFTP___DIR=/tftpboot/tcos # deprecated + +ISOS="/var/lib/tcos/isos" +VOLUMENAME="TCOS boot cd" +DISTRO="TCOS" + + +# kernel used to build initramfs +TCOS_KERNEL=__TCOS_DEFAULT_KERNEL__ + +# kernel cmdline ( needed for nbi images) +TCOS_APPEND="ramdisk_size=65536 initrd=initramfs-${TCOS_KERNEL} root=/dev/ram boot=tcos quiet splash" + +# verbose messages +TCOS_DEBUG=1 + +# If RAM is less than this number (in Mb) tcos will try to boot from NFS server +TCOS_MIN_RAM=38 + +# show a message of not found modules (better use showmodules cmdline) +TCOS_SHOW_NEEDED_MODULES= + +# disable usr.squashfs if =1, empty create usr.squashfs +TCOS_DISABLE_SQUASHFS= + +# include usr.squashfs in initramfs /mnt/, if =1 download with tftp (less tftpboot time) +TCOS_SQUASHFS=1 + +# usplash theme (default usplash-tcos.so) +TCOS_USPLASH="usplash-tcos.so" + +# wireless support +TCOS_WIRELESS= + +# wireless modules +# (avalaible ipw2200, ipw2100, madwifi (ath-pci, ath-hal, etc...), zd1211 (Zydas) and all kernel supported) +# ndiswrapper don't work (perl script) +# server must have firmware to generate correct images +# put names with spaces +# example: TCOS_WIRELESS_MODS="ipw2200 ipw2100 zd1211" +TCOS_WIRELESS_MODS="" + +# methods of encription +# empty=no encryption +# WEP +# WPA +# only one method (no autodetection yet): example: TCOS_WIRELESS_ENC="WEP" +TCOS_WIRELESS_ENC="WPA" + +# inetd support (actions with telnet) +TCOS_INETD=1 + +# acpid support (button poweroff thin client) +TCOS_ACPID=1 + +# server user to be admin in Thin Client network (need ssh key and italc key) +TCOS_ADMIN_USER="root" + +# number of TTY created on boot (default 1) +TCOS_TTY=1 + +# tty1 console with password (default 1 = yes) +TCOS_TTY1_PROTECTED=1 + +# ssh support => dropbear package needed +TCOS_SSH=1 + +# root password ( if empty root password is "root" ) +TCOS_ROOT_PASSWD="" + +# Autofs support (deprecated) +TCOS_AUTOFS= + +# REMOTEFS access mode ( values: shfs, ltspfs, none ) +TCOS_REMOTEFS="ltspfs" + +# USB support +TCOS_USB=1 + +# Put this vars to 1 to lower initramfs size (disables USB and IDE) +TCOS_DISABLE_USB= +TCOS_DISABLE_IDE= + +# discover support ( load kernel modules of found hardware) +TCOS_DISCOVER=1 + +# Xorg support (needed to connect XDCMP or local session) +TCOS_XORG=1 + +# Include in image all xorg installed drivers (~ +3Mb) +TCOS_XORG_ALLDRIVERS=1 + +# Include OpenGL files (needed to run apps in fullscreen ~ +3Mb) +TCOS_XORG_OPENGL=1 + +# Xorg cmdline options ( example -ac to disable control access, default empty) +TCOS_XORG_OPTS="" + +# allowed host than can use Xorg (localhost is always, host separated with spaces) +TCOS_XORG_XHOSTS="" + +# DEFAULT keyboard map +TCOS_XORG_XKB="es" + +# DEFAULT keyboard map +TCOS_XORG_XKBMODEL="pc105" + +# type of X session ( L=local R=remote S=SSH F=freenx N=no startx W=rdesktop) +TCOS_XORG_TYPE="R" + +# printer support +TCOS_PRINTER=1 + +# freenx support ( need freenx installed on server ) +TCOS_FREENX= + +# freenx squashfs ( need freenx installed on server ) +TCOS_FREENX_SQUASHFS= + +# italc Master-Eye client support +TCOS_ITALC= + +# support for x11vnc server ( conflicts with iTALC ) +TCOS_X11VNC=1 + +# rdesktop support (IP address or hostname of MS Windows Terminal Server) +TCOS_RDESKTOP_SERVER="" + +# embedded web browser values=none, dillo(25 Mb), links2 (6 Mb) +TCOS_WEB_BROWSER=none + + +# Sound support ( this includes kernel sound modules alsa files and esound binaries) +TCOS_SOUND=1 + +# ISA sound support (old sound cards) +TCOS_SOUND_ISA= + +# force OSS compability (sis7019 need it), normally it is autodetected +TCOS_SOUND_OSS= + +# disable acpi and raid stuff +TCOS_DISABLE_ACPI=1 + +# write some fuck service to inetd.conf (insecure, debug only) +opentelnet=0 + +# VOLUME levels of mixer master and pcm ( values 0%-100% or 1-31 ) +TCOS_VOLUME="80%" + +# boot quietly (no used yet) +TCOS_quiet=n + + +# PulseAudio support, use pulseaudio instead of Esound Daemon +TCOS_PULSEAUDIO=1 + +# PulseAudio work with some resample methods +# Avalaible options= +# * src-sinc-medium-quality +# * src-sinc-best-quality +# * src-sinc-fastest +# * src-zero-order-hold +# * src-linear +# * trivial +TCOS_PULSEAUDIO_RESAMPLE_METHOD="src-sinc-fastest" + + +# Use NFS and not download files with tftp. Values= (none|nfs) +TCOS_USENFS=none + + +# This is intended to install a debian/ubuntu system in thin client +# with debootstrap +TCOS_DEBOOTSTRAP= + +# Include installer (you can build isos with these) +TCOS_INSTALLER=1 + +# syslinux installer extra boot params +TCOS_INSTALLER_BOOT_OPT="quiet splash" + + +# some special settings for thin clients + +# epatec 3800 (via) +TCOS_ETC3800= + + +# All dynamic data come here.... diff --git a/dbus/81tcos-utils b/dbus/81tcos-utils new file mode 100644 index 0000000..3debb30 --- /dev/null +++ b/dbus/81tcos-utils @@ -0,0 +1,30 @@ +# $Id:$ +# Startup script for tcos utils +# + +if [ -f /usr/share/pyshared/tcosmonitor/shared.py ]; then + DISPLAY_HOST=$(python /usr/share/pyshared/tcosmonitor/shared.py "$DISPLAY" 2>/dev/null) +else + DISPLAY_HOST=$(python -c 'import os; import tcosmonitor.shared; print tcosmonitor.shared.parseIPAddress(os.environ["DISPLAY"])') +fi + +if [ ! -z "${DISPLAY_HOST}" ]; then + + # launch tcos-dbus-client + tcos-dbus-client & + + # new device manager + tcos-devices-ng & + + # volume levels + tcos-volume-manager & +fi + + + +if [ -e /etc/default/tcos-standalone ]; then + . /etc/default/tcos-standalone + if [ "${TCOS_STANDALONE_START}" = "1" ]; then + tcos-dbus-client --only-local & + fi +fi diff --git a/dbus/Makefile b/dbus/Makefile new file mode 100644 index 0000000..4e1fb0f --- /dev/null +++ b/dbus/Makefile @@ -0,0 +1,16 @@ +DESTDIR:=/ + +all: + + +include ../common.mk + +install: + install -d $(DESTDIR)$(X11_CONF)/ + install -d $(DESTDIR)/$(PREFIX)/bin/ + + install -m 644 81tcos-utils $(DESTDIR)$(X11_CONF)/ + install -m 755 tcos-dbus-client.py $(DESTDIR)/$(PREFIX)/bin/tcos-dbus-client + +clean: + rm -f *.pyc *~ diff --git a/dbus/client.py b/dbus/client.py new file mode 100755 index 0000000..1c26e3c --- /dev/null +++ b/dbus/client.py @@ -0,0 +1,49 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Based on StudentControlPanel of Ubuntu +# +# + +import signal +#import gobject +#import pwd +#import subprocess +import dbus +import dbus.service +import dbus.glib + +class SCPObject(dbus.service.Object): + + def __init__(self, bus_name, object_path="/TCOSObject"): + dbus.service.Object.__init__(self, bus_name, object_path) + + @dbus.service.signal("com.consoltux.TcosMonitor.Comm", signature="aas") + def GotSignal(self, message): + pass + + +system_bus = dbus.SystemBus() +name = dbus.service.BusName("com.consoltux.TcosMonitor", bus=system_bus) +dbus_iface = SCPObject(name) + +dbus_iface.GotSignal([ ["mario"] , ["exec"] , ["xterm"] ]) +dbus_iface.GotSignal([ ["mario"] , ["mess"] , ["Test message from dbus interface"] ]) diff --git a/dbus/server.py b/dbus/server.py new file mode 100755 index 0000000..ed9c240 --- /dev/null +++ b/dbus/server.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +import dbus +import dbus.service +import dbus.glib +import gobject +import os +import signal +import subprocess +import pwd + +username = pwd.getpwuid(os.getuid())[0] +print "username=%s" %(username) + +bus = dbus.SystemBus() +#remote_object = bus.get_object("com.consoltux.TcosMonitor", "/SCPObject") +#iface = dbus.Interface(remote_object, "com.consoltux.TcosMonitor.Comm") + +def new_message(message): + print "new_message=%s" %(message) + for user in message[0]: + if user == username: + if message[1][0] == "kill": + os.kill(int(message[2][0]), signal.SIGKILL) + if message[1][0] == "exec": + subprocess.Popen(message[2][0], shell=True) + if message[1][0] == "mess": + subprocess.Popen(['zenity', '--info', '--text=' + message[2][0] + ' ', '--title="Message from admin"']) + +#iface.connect_to_signal('hello_signal', new_message) + +bus.add_signal_receiver(new_message, + signal_name='GotSignal', + dbus_interface='com.consoltux.TcosMonitor.Comm', + path='/TCOSObject') + +#bus.add_signal_receiver(new_message, +# 'DeviceAdded', +# 'org.freedesktop.Hal.Manager', +# 'org.freedesktop.Hal', +# '/org/freedesktop/Hal/Manager') + +mainloop = gobject.MainLoop() +mainloop.run() diff --git a/dbus/tcos-dbus-client.py b/dbus/tcos-dbus-client.py new file mode 100755 index 0000000..4d8922d --- /dev/null +++ b/dbus/tcos-dbus-client.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +import os, sys +import getopt + +#if os.path.isdir('./debian') and os.path.isdir('./po'): +# sys.path.insert(0, './') + +from tcosmonitor import shared + + +print "tcos-dbus-client: starting daemon..." + + +#shared.debug=True +def print_debug(txt): + if shared.debug: + print "%s::%s" %("TcosDBusServer()", txt) + + +try: + opts, args = getopt.getopt(sys.argv[1:], ":hd", ["help", "debug", "only-local"]) +except getopt.error, msg: + print msg + print "for command line options use tcos-dbus-client --help" + sys.exit(2) + + + +for o, a in opts: + if o in ("-d", "--debug"): + print "DEBUG ACTIVE" + shared.debug = True + if o == "--only-local": + shared.allow_local_display=True + + +host = str(shared.parseIPAddress(os.environ["DISPLAY"])) +if host == "" and not shared.allow_local_display: + print "tcos-dbus-client: Not allowed to run in local DISPLAY" + sys.exit(0) + +if host != "" and shared.allow_local_display: + print "tcos-dbus-client: Not allowed to run in remote DISPLAY: \"%s\"" %(host) + sys.exit(0) + +from tcosmonitor.TcosDBus import TcosDBusServer +try: + server=TcosDBusServer().start() +except KeyboardInterrupt: + print_debug("Ctrl+C exiting...") + sys.exit(0) + + diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..acf86b4 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,2357 @@ +tcosmonitor (0.2.48) unstable; urgency=low + + * Add French translation (closes: #678235) + Thanks to Julien Patriarca <patriarcaj@gmail.com> + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 22 Jun 2012 13:33:28 +0200 + +tcosmonitor (0.2.47) unstable; urgency=low + + * tcosmonitor/TcosCommon.py: + - Fix print_debug() typo in lookup() + - Do a revlookup() in all nameservers + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 05 Feb 2012 21:57:29 +0100 + +tcosmonitor (0.2.46) unstable; urgency=low + + * tcosmonitor/TcosCommon.py: + - Ask all nameservers and init server list in lookup() + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 05 Feb 2012 21:56:40 +0100 + +tcosmonitor (0.2.45) unstable; urgency=low + + * tcos-devices-ng.py: fix remove_duplicates() inliner + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 25 Jan 2012 11:59:16 +0100 + +tcosmonitor (0.2.44) unstable; urgency=low + + * Change Priority to extra, we depend on some extra packages + * Fix spelling errors in manual pages + * README: Remove hex2ascii.c (is in tcos-core package) + * README.standalone: Update ports info + * Remove rsync doc + * Switch from CDBS to dh7 format + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Mon, 02 Jan 2012 17:08:18 +0100 + +tcosmonitor (0.2.43) unstable; urgency=low + + * Promoted by "Antonio Pérez-Aranda <ant30tx@gmail.com>" + from Yaco Sistemas SL <www.yaco.es> + * Remove 'op' Depends (breaks nmap mode) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Tue, 06 Sep 2011 17:02:52 +0200 + +tcosmonitor (0.2.42) unstable; urgency=low + + * tcosmonitor/extensions/info.py: show Pulseaudio mixer if standalone without pingport() + * debian/copyright: Machine readable debian/copyright format + * update debian/copyright + * global license headers fix + * Add Avahi mDNS for discover thin clients + * tcosmonitor/shared.py: add isIPAddr method + * tcosmonitor/TcosCommon.py: don't make a gethostbyaddr() + * initial multiseat support + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 12 Jun 2011 13:48:09 +0200 + +tcosmonitor (0.2.41) unstable; urgency=low + + * tcosmonitor/TcosActions.py: fix compare groupexclude, + debian/control: update versions + * tcosmonitor/TcosActions.py: fix exclude typo and print debug + messages when asking for exclude user + * tcosmonitor/__init__.py: redirect errors to stderr and check for + TCOSMONITOR_NO_EXTENSIONS for not loading extensions dir + * debian/control: change GIT URL and remove obsolete python-2.4-dbus + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Thu, 25 Nov 2010 13:29:44 +0100 + +tcosmonitor (0.2.40.1) unstable; urgency=low + + * tcosmonitor/TcosDBus.py: really fix fucking dbus issue + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Thu, 11 Nov 2010 22:06:24 +0100 + +tcosmonitor (0.2.40) unstable; urgency=low + + * debian/control: move python-ipaddr, python-ipy to tcosmonitor-common + * tcosmonitor/TcosDBus.py: fix sendfiles in thin client and standalone + at the same time ;) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Thu, 11 Nov 2010 20:44:23 +0100 + +tcosmonitor (0.2.39) unstable; urgency=low + + * tcosmonitor/extensions/sendfiles.py: fix wrong number of arguments + in xmlrpc.DBus() + * New pref variable 'consolekit' to disable Sessions() search + * Move TcosXmlRcp to tcosmonitor-common and move xlib to tcosmonitor- + common Depends + * debian/control update Conclicts versions + * tcosmonitor/LocalData.py: import Connections when search method is + consolekit + * tcosmonitor/TcosDBus.py: split dbus.Array instead of a string + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Thu, 11 Nov 2010 18:19:54 +0100 + +tcosmonitor (0.2.38) unstable; urgency=low + + * tcos-devices-ng.py: use exception in get_desktop_path() pt_BR + Desktop path have spaces + * tcos-devices-ng.py: use $HOME instead of Desktop + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 05 Nov 2010 16:23:18 +0100 + +tcosmonitor (0.2.37) unstable; urgency=low + + * debian/control: add consolekit as Depends + * tcosmonitor/LocalData.py: + - Add Sessions.Connections() [consolekit] to search thin clients + - Check for dbus gdm.conf instead of dbus exception + * tcosmonitor/TcosPreferences.py: + - Use a better method to save scan_network_method var + * tcosmonitor/extensions/vnc.py: + - Use threads lock when starting VNC window. + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 15 Oct 2010 16:47:31 +0200 + +tcosmonitor (0.2.36) unstable; urgency=low + + * tcosmonitor/shared.py: don't run if ipstr is empty and clean old + code + * tcosmonitor/LocalData.py tcosmonitor/Sessions.py: use GDM and + ConsoleKit dbus to read users and time (instead of wtmp) + * tcos-devices-ng.py: fix newcdrom call, and eject when umounting + * Allow to call shared.py to parse IP's, redirect debug to stderr + * dbus/81tcos-utils: call shared.py instead of importing modules + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 03 Oct 2010 17:11:34 +0200 + +tcosmonitor (0.2.35) unstable; urgency=low + + * tcosmonitor/shared.py: fix some :0.0 values in parseIPAddress() + * tcosmonitor/shared.py: support ssh -X connections 'localhost:10.0' + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 10 Sep 2010 19:53:04 +0200 + +tcosmonitor (0.2.34) unstable; urgency=low + + * tcospersonalize.py, fix print_debug and comment glade calls + * remove glade references + * tcosmonitor/LocalData.py: fix in_group function + * tcos-devices-ng.py: automount CDROM/DVD events generated by new tcos + cdrom-mount + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Tue, 13 Jul 2010 12:05:05 +0200 + +tcosmonitor (0.2.33) unstable; urgency=low + + [ Mario Izquierdo (mariodebian) ] + * tcosmonitor/LocalData.py: fix typo mitad1 => half1 + + [ Ignacio Vidal ] + * debian/control: add python-m2crypto python-medusa to Depends and + move op from one package to other + * debian/tcosmonitor-common.install debian/tcosmonitor.install: + install new files and move nmap-tcos.conf op + * rename lintian file + * tcos-devices-ng.py: add a error message if user is not in fuse group + and use get-xdg-desktop instead of rsync-controller + * tcosmonitor/ping.py: parse XML output of nmap + * tcosmonitor/LocalData.py: return if newhost fail + * tcosmonitor/extensions/tcosnetcontroller.py: Add space in message + * tcosmonitor/extensions/screenshot.py: Set hostname if NO_LOGIN_MSG + * tcosmonitor/extensions/livevnc.py: Set hostname if NO_LOGIN_MSG + * tcosmonitor/TcosActions.py: continue if newhost fail + * tcosmonitor/TcosDBus.py: Add new method to sendfiles + * tcosmonitor/TcosStaticHosts.py: continue if newhost fail + * tcosmonitor/extensions/sendfiles.py: Change rsync with FTP+SSL + * tcosmonitor.py: Start FTP+SSL server + * tcosmonitor/counter.py: Counter of hosts + * tcosmonitor/ftps_server.py: FTP+SSL server with medusa and python- + M2Crypto + + [ Mario Izquierdo (mariodebian) ] + * Release 0.2.33 + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 30 Apr 2010 15:54:01 +0200 + +tcosmonitor (0.2.32) unstable; urgency=low + + [ Mario Izquierdo (mariodebian) ] + * tcosmonitor/shared.py: refactorize parseIPAddress, detect hostnames + in binary format + * remove glade files + * include all packages in DEB_PACKAGES, fix dh_pysupport call in + tcosmonitor-common + * refactorize some code, and use pylint to fix some warnings + + [ Ignacio Vidal ] + * tcos-volume-manager.py tcospersonalize.py: delete gtk.glade import + * tcosmonitor/shared.py: add nmap to scan_methods and vboxnet as + hidden ifaces + * tcosmonitor.py if uid is 0 set user in group to True + * install nmap-tcos in op.d dir with 0600 perms + * debian/control: add nmap and op to tcosmonitor-common deps + * debian/rules: exclude op.d/nmap-tcos.conf in fixperms + * debian/tcosmonitor-common.install: install /etc/op/op.d/nmap- + tcos.conf + * debian/tcosmonitor.install: remove glade files + * tcosmonitor/shared.py: add forgoten coma + * tcosmonitor/ping.py: Add new nmap functions + * tcosmonitor/extensions/audiortp.py: fix this extension with + format=s16be and rename var ip=ip_simple + * tcosmonitor/TcosPreferences.py: add nmap method after ping + * tcosmonitor/TcosActions.py: Add nmap method and create 2 new vars, + lenclients and excludes + * tcosmonitor/LocalData.py: replace in_group_tcos function and split + uthost in half to compare it + + [ Mario Izquierdo (mariodebian) ] + * Release 0.2.32 + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 23 Apr 2010 17:59:22 +0200 + +tcosmonitor (0.2.31) unstable; urgency=low + + * tcosmonitor/shared.py: fix NoneType when looking at ipv4_mapped + object + * tcosmonitor/ping.py: don't fail if we can start ping thread + * tcosmonitor/LocalData.py tcosmonitor/TcosExtensions.py + tcosmonitor/ping.py: use parseIPAddress instead of spliting DISPLAY + * Release 0.2.31 + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 17 Apr 2010 16:01:55 +0200 + +tcosmonitor (0.2.30) unstable; urgency=low + + * tcosmonitor/shared.py: return hostname if ipstr is a string + * dbus/tcos-dbus-client.py convert IP to string + * tcos-devices-ng.py: convert IP to string + * tcosmonitor/LocalData.py: convert IP to string + * tcosmonitor/TcosCommon.py: convert IP to string + * tcosmonitor/TcosXauth.py: convert IP to string + * tcosmonitor/shared.py: parse IPV6 xauth in Debian lenny + [::ffff:x.x.x.x]:0 + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 31 Mar 2010 15:59:34 +0200 + +tcosmonitor (0.2.29) unstable; urgency=low + + * clean a lot of old code and fix aboutdialog i18n + * add more hidden process and new method parseIPAddress that supports + IPV6 strings + * dbus/tcos-dbus-client.py: use new shared.parseIPAddress + * tcos-devices-ng.py: use new shared.parseIPAddress + * tcos-volume-manager.py: use new shared.parseIPAddress + * tcosmonitor/LocalData.py: use shared.parseIPAddress + * tcosmonitor/TcosCommon.py: use shared.parseIPAddress + * tcosmonitor/extensions/viewproc.py: replace & => & + * tcosmonitor/TcosXauth.py: use python-xlib and shared.parseIPAddress + to get xauth cookies and IPs + * debian/control: add new depends python-xlib python-ipaddr python-ipy + * tcosmonitor/shared.py: give better exception info + * dbus/81tcos-utils: use python to get DISPLAY + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Tue, 30 Mar 2010 17:45:42 +0200 + +tcosmonitor (0.2.28) unstable; urgency=low + + * tcos-devices-ng.py: fix udev_daemon loop + * tcos-devices-ng.py: fix typo get_desktop_patch => get_desktop_path + * tcos-devices-ng.py: detect kde if kwin is running and launch dolphin + if avalaible + * tcos-devices-ng.py TcosCommon.py: fix IOError and OSError in + python2.6 + * tcos-devices-ng.py: stop app using Ctrl+C quiting mainloop + * change glade to gtkbuilder + * update translations + * install ui files instead of glade + * update standards to 3.8.4 + * remove obsolete install target in Makefile + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Thu, 18 Mar 2010 16:01:05 +0100 + +tcosmonitor (0.2.27) unstable; urgency=low + + * hide all menus with new pref checkboxes except info, and fix tcos- + server-utils.py tipo + * allow more than one VNC window + * debian/copyright: change (C) with © + * Fix description of packages + * debian/tcosmonitor.dirs: remove empty dir + * tcos-devices-ng.py tcos-volume-manager.py tcosmonitor/TcosXmlRpc.py: + use new XMLRPC method => config to start or not if TCOS var is + enabled + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 18 Dec 2009 19:15:21 +0100 + +tcosmonitor (0.2.26) unstable; urgency=low + + * fix typo in Spanish translation + * new checkbox in preferences ck_notshowwhentcosmonitor, don't show + thin client if tcosmonitor is running there + * add click support to livevnc, thanks to Fernando Lisón for asking + for it + * add actions menu when right clicking on screenshots + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 08 Nov 2009 14:52:11 +0100 + +tcosmonitor (0.2.25) unstable; urgency=low + + * add support for new gtk.Tooltip() and show hostname in ClassView in + standalone + * disable set_tooltip_text, freeze the GUI + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Tue, 13 Oct 2009 11:59:16 +0200 + +tcosmonitor (0.2.24) unstable; urgency=low + + * tcosmonitor/TcosTrayIcon2.py: Fix crash of tcos-devices-ng, generate + menu in save thread + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Thu, 01 Oct 2009 16:05:28 +0200 + +tcosmonitor (0.2.23) unstable; urgency=low + + * add support for scaling VNC on client in LiveView, add stop and + fullscreen buttons + * Update translation and Spanish template + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Thu, 01 Oct 2009 01:27:14 +0200 + +tcosmonitor (0.2.22) unstable; urgency=low + + * tcosmonitor/extensions/livevnc.py: + - New extension to view all thin clients with python-gtk-vnc + * tcosmonitor/extensions/vnc.py: + - Change vncviewer external command with gtkvnc widget in a Window. + * python-gnome2-extras is deprecated, use: python-eggtrayicon | python-gnome2-extras + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 25 Sep 2009 23:50:36 +0200 + +tcosmonitor (0.2.21+1) UNRELEASED; urgency=low + + * tcosmonitor/TcosDBus.py tcosmonitor/TcosCommon.py: + - in Ubuntu, with NetworkManager need to wait and rescan local IP address in a loop, + tcos-dbus-client starts before network is up. + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 09 Sep 2009 16:10:44 +0200 + +tcosmonitor (0.2.21) unstable; urgency=low + + * Remove obsolete patch targets + * Add xres 1440x900 + * Add karmic patch + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 05 Sep 2009 15:55:17 +0200 + +tcosmonitor (0.2.20) unstable; urgency=low + + * Create setup.py to build and install package + * Clean some deprecated code in debian/rules + * Bump Standard version to 3.8.0, compat to 7 and debhelper to 7.0.0 + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Tue, 01 Sep 2009 18:08:40 +0200 + +tcosmonitor (0.2.19+2) unstable; urgency=low + + * tcosmonitor/TcosXmlRpc.py: + - Change *args with args='' + - Debug arguments of vnc() + * tcosmonitor/LocalData.py: + - Disable too much verbose debug + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Mon, 31 Aug 2009 11:45:52 +0200 + +tcosmonitor (0.2.19+1) unstable; urgency=low + + * Update pt_BR translation (thanks Aecio) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Thu, 16 Jul 2009 21:47:36 +0200 + +tcosmonitor (0.2.19) unstable; urgency=low + + * Fix Ubuntu jaunty modules install (use dist instead of site) + * Replace comparations of type() with isinstance() + * TcosClassView: + - Fix icons size and names + * Add pan0 as hidden network interface + * tcos-devices-ng.py: + - Call filemanager with subprocess instead of os.system() + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Mon, 01 Jun 2009 16:31:10 +0200 + +tcosmonitor (0.2.18-1) unstable; urgency=low + + * New big version + * A lot of patches by Ignacio Vidal (merge Lliurex Lab, not all) + * Merge to master + * Add patch_lenny target + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 15 Feb 2009 19:33:24 +0100 + +tcosmonitor (0.2.17~rc12) unstable; urgency=low + + * man/tcos-volume-manager.1 tcos-volume-manager.glade tcos-volume- + manager.py tcosmonitor/TcosXmlRpc.py + - New button to restart remote PulseAudio + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 04 Feb 2009 13:11:41 +0100 + +tcosmonitor (0.2.17~rc11) unstable; urgency=low + + * Update Vcs- debian/control headers to new GIT repos + * tcospersonalize.desktop: + - Don't show in any desktop + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Tue, 03 Feb 2009 18:38:38 +0100 + +tcosmonitor (0.2.17~rc10) unstable; urgency=low + + * server-utils/tcos-server-utils.py: + - Fix confusion between allclients and alltcosclients + * Makefile: + - Clean all ~ temp files + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Mon, 26 Jan 2009 17:11:21 +0100 + +tcosmonitor (0.2.17~rc9) unstable; urgency=low + + * Update pt_BR translation. + * tcosmonitor/extensions/wakeonlan.py + - Fix call to WakeOnLan class (remove double call) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Tue, 20 Jan 2009 18:55:56 +0100 + +tcosmonitor (0.2.17~rc8) unstable; urgency=low + + * tcosmonitor/__init__.py: + - Don't load extensions when DISPLAY is not set + * tcosmonitor/TcosTrayIcon2.py tcos-devices-ng.py: + - Change device information + * server-utils/tcos-server-utils.py: + - Fix minor typos + * Update translations + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 11 Jan 2009 23:50:22 +0100 + +tcosmonitor (0.2.17~rc7) unstable; urgency=low + + * tcosmonitor/TcosCommon.py tcosmonitor/TcosXauth.py + - Fix normal lookup for IP from hostname + * tcos-devices-ng.py tray.glade images/eject.png + tcosmonitor/TcosTrayIcon2.py + - New TrayIcon Class, with a popup window and eject buttons + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Tue, 06 Jan 2009 00:38:06 +0100 + +tcosmonitor (0.2.17~rc6) unstable; urgency=low + + * tcosmonitor.glade tcosmonitor.py + - Reduce mainwindow size if running in low res screen (< 1024x768) + * setup.py: + - Don't build if target is clean + * tcosmonitor/TcosCommon.py tcosmonitor/LocalData.py debian/control + - Add python-dns support (reduce dns timeouts) + * Makefile: + - Fix shared.py path + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 31 Dec 2008 17:22:10 +0100 + +tcosmonitor (0.2.17~rc5) unstable; urgency=low + + * Big changes by Vidal: + - New chat center + - Improved chat support + - New quick buttons toolbar to exec 5 usual actions + - Add some images of new toolbar + * tcosmonitor/TcosClassView.py: + - Set iconview size in old versions of GTK+ (< 2.10.0) for Debian etch + - Fix icons names + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 12 Oct 2008 22:38:05 +0200 + +tcosmonitor (0.2.17~rc4) unstable; urgency=low + + * debian/tcosmonitor.install debian/tcosmonitor-common.install: + - Install ping.py in tcomsonitor-common package (TcosDBus need it) + * tcosmonitor/TcosDBus.py tcosmonitor/extensions/appsmsg.py + - Use xml.sax.saxutils.escape to escape pynotify text messages. + * tcosmonitor/extensions/appsmsg.py + - Convert elif => if + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Mon, 06 Oct 2008 14:43:53 +0200 + +tcosmonitor (0.2.17~rc3) unstable; urgency=low + + * Remove tree from Build-Depends and remove debug code in debian/rules + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 05 Oct 2008 17:57:58 +0200 + +tcosmonitor (0.2.17~rc2) unstable; urgency=low + + [ Mario Izquierdo (mariodebian) ] + * tcosmonitor/TcosConf.py + - Really close file descriptor (thanks Vidal) + + [ Ignacio Vidal ] + * tcosmonitor/TcosDBus.py + - Fix import + * tcosmonitor/extensions/restartxorg.py + - Update change lockscreen + + -- Ignacio Vidal <vidal_joshur@gva.es> Fri, 03 Oct 2008 14:36:01 +0200 + +tcosmonitor (0.2.17~rc1) unstable; urgency=low + + * Split package in tcosmonitor and tcosmonitor-common + - tcos-standalone will depend on tcosmonitor-common package (less files) + * debian/rules, debian/control: + - Switch package to CDBS + * Move Python code into tcosmonitor and tcosmonitor/extensions dirs + * Create setup.py (Python distutils): + - Install in Python path as module (import tcosmonitor) + - Edit all init scripts to import correct tcosmonitor modules + * Remove old LTSP and PXES code and Makefiles + * tcosmonitor/__init__.py tcosmonitor/extensions/__init__.py: + - Load all modules in __all__ list + * Forget to readd debian/rules to SVN + * tcosmonitor/TcosExtensions.py: + - call xmlrpc.newhost before real_action (fix icons change) + * tcosmonitor/*.py: + - import ping package from tcosmonitor + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Thu, 02 Oct 2008 10:35:36 +0200 + +tcosmonitor (0.2.16~rc9) unstable; urgency=low + + [ Mario Izquierdo (mariodebian) ] + * tcospersonalize.desktop + - Hide menu (not very ussesfull without host IP) + * htmltextview.py extensions/screenshot.py + - Add onclick tag on img code and show a 'Save Screenshot' menu when user clicks on image + * Update translations (spanish and template) + + [ Ignacio Vidal ] + * TcosXmlRpc.py extensions/* shared.py: + - Add conference chat mode between clients + - Add send Mic audio from client + - On exec apps in clients allow send web address + * tcos-volume-manager.py: + - Update get sound channels on refresh + * po/* + - Update translations (spanish and template) + * TcosPreferences.py: + - Show menus compatibility with old user conf + * TcosConf.py: + - Create conf file if is empy to avoid problems + + [ Mario Izquierdo (mariodebian) ] + * Fix __import__ in python < 2.5 + * Fix props.has_tooltip in gtk old versions + + -- Ignacio Vidal <vidal_joshur@gva.es> Thu, 25 Sep 2008 15:19:54 +0200 + +tcosmonitor (0.2.16~rc8) unstable; urgency=low + + [ Mario Izquierdo (mariodebian) ] + * Use PyLint to strace/fix all warnings and errors + + [ Ignacio Vidal ] + * TcosXmlRpc.py shared.py tcosmonitor.py LocalData.py tcosmonitor.conf: + - Allow net-lock block only ports + * TcosActions.py TcosClassView.py extensions/* TcosMenus.py + TcosExtensions.py TcosIconView.py TcosPreferences.py: + - Fix show enabled/disabled menu items + - Fix change state of screens + + -- Ignacio Vidal <vidal_joshur@gva.es> Thu, 18 Sep 2008 12:12:04 +0200 + +tcosmonitor (0.2.16~rc7) unstable; urgency=low + + [ Ignacio Vidal ] + * TcosPreferences.py: + - Fix show visible menus in first run + * TcosActions.py extensions/videolan.py LocalData.py: + - Add support for ip-multicast route + + [ Mario Izquierdo (mariodebian) ] + * TcosActions.py + - If scan method == ping call all view classes to clean (not use self.model) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Thu, 11 Sep 2008 15:21:33 +0200 + +tcosmonitor (0.2.16~rc6) unstable; urgency=low + + The extensions pre release + + * Move a lot of code from TcosActions.py to extensions/*.py + * New class TcosExtensions.py (every extension heredate from it) + * This release is not finished !!!! + * TODO: + - Make extensions preferences (register/load/save) + - Rewrite some code to make TcosExtensions.py smaller + - Fix Menus Show function + - Move doaction_onthisclient() TcosActions.py => TcosExtensions.py + - New view mode VNC icons (using python-vnc) ???? + * Create more extensions: + - viewproc.py videolan.py sendfiles.py wakeonlan.py + - Delete some old code from TcosActions.py + * Update translations template and spanish po file + * Add Ubuntu intrepid target in Makefile + * Makefile + - Replace seds with a shell for loop to replace version in py files + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 05 Sep 2008 16:02:16 +0200 + +tcosmonitor (0.2.16~rc5) unstable; urgency=low + + * ping.py TcosCommon.py debian/control: + - Replace old code to get interfaces and IP addr with python-netifaces (in TCOS mirror) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Thu, 07 Aug 2008 14:58:45 +0200 + +tcosmonitor (0.2.16~rc4) unstable; urgency=low + + * Makefile: + - Forgot to install TcosMenus.py new class + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 06 Aug 2008 21:01:36 +0200 + +tcosmonitor (0.2.16~rc3) unstable; urgency=low + + * New class: TcosListView.py: + - Move some code from TcosActions.py (code to work with list view mode) + * New class: TcosMenus.py: + - Move some code from TcosActions.py to generate menus and capture events + * Delete deprecated and comented gtk.gdk.threads_*() calls + * Update template and spanish translation + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 06 Aug 2008 19:51:37 +0200 + +tcosmonitor (0.2.16~rc2) unstable; urgency=low + + The Class Simulator mode pre release. + + * New class: TcosClassView.py + - Based on gtk.Fixed with drag&drop support and position save&restore (from MenuAll) + * TcosActions.py shared.py TcosPreferences.py: + - Add new setting: menugroup to show menus without groups (like old versions) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 01 Aug 2008 20:18:57 +0200 + +tcosmonitor (0.2.16~rc1) unstable; urgency=low + + Icons rules pre-release: + + * Add TcosIconView.py and modify GUI to show list and iconview + * shared.py TcosActions.py TcosPreferences.py + - Add new var listmode + * TcosActions.py TcosCommon.py: + - When drag launcher use glob.glob and use gconf to read GNOME Icon theme + * LocalData.py: + - New function (not used yet) get_arptable( IP, MAC and ifaces) + * Update templates and Spanish translation + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 01 Aug 2008 00:12:11 +0200 + +tcosmonitor (0.2.15.3) unstable; urgency=low + + * TcosActions.py TcosXmlRpc.py shared.py tcos-volume-manager.glade + tcos-volume-manager.py + - Use new tmixer API to get all sound channels at the same time and use mute switch when avalaible. + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 30 Jul 2008 19:17:29 +0200 + +tcosmonitor (0.2.15.2) unstable; urgency=low + + * TcosActions.py tcos-devices-ng.py TcosXmlRpc.py + - Remove .replace('\n','') tcosxmlrpc don't return '\n' anymore + * TcosActions.py shared.py + - Create Menu groups + * tcosmonitor.glade TcosActions.py shared.py: + - Add DPMS menu action (switch on/off monitor energy saving) + * Update translations template and spanish es.po + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Mon, 28 Jul 2008 11:46:32 +0200 + +tcosmonitor (0.2.15.1) unstable; urgency=low + + * LocalData.py TcosDBus.py + - Fix typos + * Fix translation problem + + -- Ignacio Vidal <vidal_joshur@gva.es> Tue, 22 Jul 2008 13:56:32 +0200 + +tcosmonitor (0.2.15) unstable; urgency=low + + * New release 0.2.15 + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 19 Jul 2008 20:37:45 +0200 + +tcosmonitor (0.2.14.9) unstable; urgency=low + + * Update pt_BR translation, thanks to Aécio dos Santos Pires <aecio at comunicacaodigital.org> + * tcosmonitor.glade: + - Disable homogeneous table size in advanced preferences + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 16 Jul 2008 20:31:32 +0200 + +tcosmonitor (0.2.14.8) unstable; urgency=low + + * Update translation + + -- Ignacio Vidal <vidal_joshur@gva.es> Tue, 01 Jul 2008 14:47:01 +0200 + +tcosmonitor (0.2.14.7) unstable; urgency=low + + [ Mario Izquierdo (mariodebian) ] + * tcosmonitor.conf shared.py tcosmonitor.py + - Read tcosmonitor.conf for group and exclude vars + * Update translation + + [ Ignacio Vidal ] + * Add valencian translation by Lliurex + + -- Ignacio Vidal <vidal_joshur@gva.es> Mon, 30 Jun 2008 09:58:31 +0200 + +tcosmonitor (0.2.14.6) unstable; urgency=low + + * TcosPersonalize: + - Add new tab to configure boot options + * Update translation template and spanish po file + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Mon, 09 Jun 2008 09:49:38 +0200 + +tcosmonitor (0.2.14.5) unstable; urgency=low + + * TcosActions.py + - Fix restart xorg with ssl enabled + + -- Ignacio Vidal <vidal_joshur@gva.es> Tue, 03 Jun 2008 15:08:29 +0200 + +tcosmonitor (0.2.14.4) unstable; urgency=low + + * TcosActions.py ping.py TcosXmlRpc.py LocalData.py + - Fix use xmlrpc and port listening with ssl port + + -- Ignacio Vidal <vidal_joshur@gva.es> Mon, 02 Jun 2008 15:26:26 +0200 + +tcosmonitor (0.2.14.3) unstable; urgency=low + + * LocalData.py + - Fix Getlast break + * TcosActions.py ping.py TcosXmlRpc.py LocalData.py + - Fix use xmlrpc with ssl port + * TcosActions.py + - Fix aspect ratio problem in certain videos and fullscreen in standalone + + -- Ignacio Vidal <vidal_joshur@gva.es> Thu, 29 May 2008 17:44:47 +0200 + +tcosmonitor (0.2.14.2) unstable; urgency=low + + [ Mario Izquierdo (mariodebian) ] + * TcosActions.py TcosXmlRpc.py LocalData.py htmltextview.py + - Fix Getlast() using while 1 loop + - Add warning about not in group tcos + * Update translations (1 new string) + + [ Ignacio Vidal ] + * TcosActions.py + - Fix reset localdata.newhost before probe IsStandalone,IsLogged..etc with old cache + - Fix vnc typo + * LocalData.py + - Fix Getlast() with method last and users much time logged + + -- Ignacio Vidal <vidal_joshur@gva.es> Tue, 27 May 2008 14:19:44 +0200 + +tcosmonitor (0.2.14.1) unstable; urgency=low + + * Change translation model (obtained from private/tcosmonitor) + * Add translation pt_BR: + (thanks Maria del Mar Alejo Campos (mymalejo) and Luis Méndez Alejo (gnumax)) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 24 May 2008 19:41:29 +0200 + +tcosmonitor (0.2.14) unstable; urgency=low + + [ Mario Izquierdo (mariodebian) ] + * TcosActions.py TcosXmlRpc.py tcosmonitor.glade shared.py + LocalData.py TcosPreferences.py images/active_ssl.png + - Enable SSL connections between TcosMonitor and XMLRPC daemon + - Show SSL icon in active column + - Only show running hosts in static method + * Update transaltions + * TcosXmlRpc.py + - Reset self.sslconnection to False when newhost is called + * TcosActions.py: + - Revert last change unaccent => clean_string.sh + * TcosXmlRpc.py: + - Add more debug info and change Server() => ServerProxy() + * tcos-devices-ng.py + - Fix reboot and poweroff notification + + [ Ignacio Vidal ] + * TcosActions.py TcosXmlRpc.py shared.py LocalData.py + - Add support for lock/unlock internet in clients + - If we are member of group tcos, not need to be root to execute tcospersonalize + * TcosPreferences.py TcosConf.py shared.py + - config_file_secrets, user and password generic for all tcosmonitor users (in group tcos) + * debian/* + - Fix postrm and prerm + + -- Ignacio Vidal <vidal_joshur@gva.es> Fri, 23 May 2008 10:50:52 +0200 + +tcosmonitor (0.2.13) unstable; urgency=low + + [ Mario Izquierdo (mariodebian) ] + * Add support to reboot&poweroff to tcos-devices-ng + * Fix IsNew and empty menus first time + * Update translations + * server-utils/tcos-server-utils.py: + - Fix init in TcosDBusActions (need self.main param) + * Put icons in preferences tabs (better look&feel) + + [ Ignacio Vidal ] + * tcos-devices-ng.py: + - Need fix gettext + - Use down-controller with timeout instead sleep + * shared.py: + - Some thin clients like etc2500 only have "Master Front" audio + * tcosmonitor.py shared.py + - Enable/disable check if user are in allowed group to use Tcosmonitor + - Fix mkdir /tmp/tcos_share + * TcosConf.py: + - Update chmod + * Localdata.py + - Getlast: use who instead last method + * TcosActions.py TcosXmlRpc.py shared.py LocalData.py + - Vlc not recognize module cdda:// + - vncviewer in server show mouse of client + - Exclude control in Tcosmonitor over users in blacklist group, specified in shared.py + - Update translation Pulseaudio not running + + -- Ignacio Vidal <vidal_joshur@gva.es> Wed, 07 May 2008 23:16:11 +0200 + +tcosmonitor (0.2.12) unstable; urgency=low + + * TcosActions.py htmltextview.py TcosXmlRpc.py + - Use tcos.getscreenshot() to retrieve Base64 screenshots + * debian/control + - Depends on tcos-core >= 0.89~rc0 and Conclicts with << 0.88.16 + * Update translations + * README.rsync + - Fix typo in rsync configuration file + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 13 Apr 2008 11:41:48 +0200 + +tcosmonitor (0.2.11) unstable; urgency=low + + [ Mario Izquierdo (mariodebian) ] + * TcosActions.py: + - Fix for loop (self.main.config.vars can have 2 or 3 items) + + [ Ignacio Vidal ] + * TcosActions.py: + - Fix pulseaudio info + * LocalData.py: + - Fix getlast() + + [ Mario Izquierdo (mariodebian) ] + * TcosActions.py htmltextview.py TcosXmlRpc.py + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 12 Apr 2008 12:03:51 +0200 + +tcosmonitor (0.2.10) unstable; urgency=low + + [ Mario Izquierdo (mariodebian) ] + * tcosmonitor.glade: + - Edit Preferences window, add new tab (Advanced settings) + - Window is now more simple and smaller + + [ Ignacio Vidal ] + * TcosActions.py ping.py TcosXmlRpc.py tcosmonitor.py TcosCommon.py TcosDBus.py + - Update popen actions to avoid defuncts /bin/sh (experimental) + * TcosActions.py: + - Add Conference Mode, now mic in server can share and users hear + - Translate pulseaudio info + * TcosXmlRpc.py: + - Add support for rtp sound + * tcosmonitor.glade: + - Add checkbox for enable/disable experimental Thread Controller + * shared.py: + - In some cases need headphone volume control if exists + + [ Mario Izquierdo (mariodebian) ] + * tcosmonitor.glade shared.py TcosConf.py TcosPreferences.py + - Create new tab on preferences window to show/hide menus + - Reload menus when preferences are saved. + * tcosmonitor.py + - Disable menu creation on start, build it in TcosPreferences + * ping.py + - Catch wait() exception + * TcosXmlRpc.py + - Comment IsLive function (seem to be not used, mark as removable) + * po/tcosmonitor.pot po/es.po + - Update translations + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 04 Apr 2008 20:14:00 +0200 + +tcosmonitor (0.2.9) unstable; urgency=low + + * TcosActions.py + - Improve control of actions for thin clients and standalones + * Update translations + + -- Ignacio Vidal <vidal_joshur@gva.es> Wed, 19 Mar 2008 17:42:46 +0100 + +tcosmonitor (0.2.8) unstable; urgency=low + + [ Ignacio Vidal ] + * TcosActions.py + - Update video broadcast for thin clients multitask, now scan a valid ip for broadcast + - Add http send video/audio to support distributions with ffmpeg codecs-less + - Fix audio problem for video broadcast + * shared.py TcosPreferences.py + - Change initializations + * Update translations + + [ Mario Izquierdo (mariodebian) ] + * shared.py + - Show progressbutton only if exists + * LocalData.py + - Exec write_into_statusbar only if exists + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 16 Mar 2008 12:32:00 +0100 + +tcosmonitor (0.2.7.1) unstable; urgency=low + + * LocalData.py + - Fix GetLast, in Debian etch or old versions need to compare with hostname too + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Thu, 6 Mar 2008 18:45:04 +0100 + +tcosmonitor (0.2.7) unstable; urgency=low + + [ Mario Izquierdo (mariodebian) ] + * LocalData.py debian/control tcos-last: + - Use python-utmp to search username and time logged instead of last + * LocalData.py tcos-last + - Add pid to dictionary and copy code to last-tcos to not use external modules (work without DISPLAY) + * Move tcos-last to tcos-core package + * LocalData.py WakeOnLan.py ping.py TcosActions.py + - Add error checking in WakeOnLan and show error in TcosActions + - Use absoulte module name in WakeOnLan + - Write message in statusbar to show while scanning of xmlrpc port + + [ Ignacio Vidal ] + * TcosActions.py TcosPreferences.py + - Activate always static host list + + [ Mario Izquierdo (mariodebian) ] + * LocalData.py + - Fix time diff in GetLast() + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 05 Mar 2008 11:54:13 +0100 + +tcosmonitor (0.2.6) unstable; urgency=low + + [ Mario Izquierdo (mariodebian) ] + * TcosActions.py + - Fix freeze bug + - Fix double call to common.thread_enter() + + [ Ignacio Vidal ] + * TcosActions.py + - Fix actions poweroff, reboot and poweroff with timeout + - In video difussion unmute,restore volume audio and fix keyboard and mouse lock + - In actions demo mode and video broadcast deactivate screensaver + - Add option to boot clients with wake on lan (pre added by mariodebian in initramfs-tools-tcos) + * TcosXmlRpc.py + - Define vlc method + * shared.py + - Add menu item wake on lan + * Update translations + * debian/control + - Add etherwake depend + + [ Mario Izquierdo (mariodebian) ] + * Remove etherwake depend and add WakeOnLan.py + (with python is very simple to create magic broadcast package) + * tcosmonitor.py Initialize.py tcosmonitor.glade + - Enable again searchtxt and searchbutton + * Initialize.py tcosmonitor.glade + - Delete about dialog and create new dialog (KDE like) + - Delete Donations window and button (now donate is on abouttcos dialog) + * Update tcos-logo.png (add tcosproject text) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 23 Feb 2008 12:56:12 +0100 + +tcosmonitor (0.2.5) unstable; urgency=low + + * TcosActions.py ping.py TcosXmlRpc.py tcosmonitor.py TcosCommon.py + LocalData.py + - Change gtk.gdk.threads_* calls to self.main.common.threads_* + With this we can search for parallel calls to threads locks + * Initialize.py tcosmonitor.glade + - Delete search box and button and add donate window + * Update translations + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 17 Feb 2008 19:00:32 +0100 + +tcosmonitor (0.2.4) unstable; urgency=low + + [ Ignacio Vidal ] + * tcos-devices-ng.py + - Update support cdrom usb + - Add support for Firewire external disks + - Fix dont try to mount swap or extended partitions in usb/firewire disks + + [ Mario Izquierdo (mariodebian) ] + * server-utils/tcos-server-utils.py: + - Import TcosCommon module (thanks pelox for bug report) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Thu, 14 Feb 2008 16:43:04 +0100 + +tcosmonitor (0.2.3) unstable; urgency=low + + * ping.py README.standalone TcosXmlRpc.py tcosmonitor.glade shared.py + LocalData.py po/tcosmonitor.pot po/es.po + - Change XMLRPC port from 8080 to 8998 + * debian/control + - Conflicts with initramfs-tools-tcos <= 0.88.14.10 + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Mon, 11 Feb 2008 12:09:49 +0100 + +tcosmonitor (0.2.2) unstable; urgency=low + + * TcosActions.py + - Change screenshot type to jpg (less filesize) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 09 Feb 2008 13:05:45 +0100 + +tcosmonitor (0.2.1) unstable; urgency=low + + [ Mario Izquierdo (mariodebian) ] + * New in 0.2 version: + - Don't call newhost and PingPort with same IP address many times + - Call reboot and poweroff with configurable timeout + - Move common functions to TcosCommon + - Remove old tcos-devices + - Move Preferences code to TcosPreferences class + * Check GetVersion() instead of connected while discovering tcos clients + * hidden_network_ifaces array with hidden ifaces + * fix typo self.main.xmlrpc.Getversion => self.main.xmlrpc.GetVersion + * TcosXauth.py: + - Use IP address instead of hostname + * tcos-devices-ng.py (Not mount twice BUG): + - When usb add event only mount_remote + - When usb mount event mount local + - In USB menus add key FORCE_MOUNT to call mounter_remote without add event + - Move mounting notification to mounter_remote + * Update translations (notifications) + * TcosXmlRpc.py + - Add a semaphore function (wait) to not allow concurrent GetDevicesInfo connections + * tcos-devices-ng.py + - Fix some functions to allow usb disk with part > 1 + * tcos-devices-ng.py + - Fix umount USB devices, one by one. + * TcosActions.py + - Add vlc audio codec + - Add ssh remote username + - Update translations + + [ Ignacio Vidal ] + * TcosActions.py + - Complete support vlc audio codec + * tcos-devices-ng.py + - Add support for external devices CDROM-USB + + [ Mario Izquierdo (mariodebian) ] + * tcosmonitor.glade: + - Convert invisible_chars to * (dapper don't support big dots) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 06 Feb 2008 13:35:29 +0100 + +tcosmonitor (0.2.0~rc1.2) unstable; urgency=low + + [ Ignacio Vidal ] + * TcosActions.py: + - Update methods poweroff and reboot with messages and timeout in clients + - Add in preferences timeout for actions + - Avoid use dangeorous commands like rm, cp or mv in exec app + - Send multicast in video difussion only to network interface configured in preferences + - Video difusion allow lock keyboard and mouse in clients + - Update some translations + * TcosXmlRpc.py: + - Add lock keyboard and mouse + * shared.py: + - Define time in seg for timeout in actions + * TcosPreferences.py: + - Define new vars + + [ Mario Izquierdo (mariodebian) ] + * Merge tags/tcosmonitor-0.2.0~rc1 translations and templates + * Fix Makefile target po_files (add glade files) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 26 Dec 2007 11:54:25 +0100 + +tcosmonitor (0.2.0~rc1.1) unstable; urgency=low + + * TcosXauth.py + - Load TcosCommon in __init__ (not break tcospersonalize.py) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 19 Dec 2007 20:24:36 +0100 + +tcosmonitor (0.2.0~rc1) unstable; urgency=low + + * tcos-devices-ng.py + - Use self.host (fix typo) + * TcosActions.py + - Fix stupid typos self.main.main => self.main + * Add TcosPAM.py TcosMonitorDaemon.py classes + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 19 Dec 2007 09:17:45 +0100 + +tcosmonitor (0.2.0~rc0) unstable; urgency=low + + * ########################################################### + * # This is a EXPERIMENTAL RELEASE !!! use at your own risk # + * ########################################################### + * New way of menus, methods and classes, mayor rewrite of some of old classes + * Remove old tcos-devices (tcos-devices-ng is very better) + * New classes TcosCommon.py TcosPreferences.py + * Move some TcosActions code to TcosCommon + * Lost of undocumented changes (I will document next days) + * Initial extensions support (not work yet) + * TcosPreferences.py: + - Call Setvar in TcosConf class + * tcosmonitor.py: + - delete subprocess import + * tcos-devices-ng.py + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 19 Dec 2007 09:16:23 +0100 + +tcosmonitor (0.1.25.7) unstable; urgency=low + + * tcos-devices-ng.py: + - Check for output of mounter_local and show error if can't mount + * tcos-volume-manager.glade: + - Set height to 300px + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 16 Dec 2007 16:09:49 +0100 + +tcosmonitor (0.1.25.6) unstable; urgency=low + + [ Ignacio Vidal ] + * tcos-devices-ng.py: + - Fix typos + + [ Mario Izquierdo (mariodebian) ] + * TcosDBus.py: + - Use IP address instead of hostname in tcos-dbus-client standalone mode + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 12 Dec 2007 16:34:18 +0100 + +tcosmonitor (0.1.25.5) unstable; urgency=low + + * tcos-devices-ng.py: + - Umount ltspfs by userid or username + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 09 Dec 2007 16:12:03 +0100 + +tcosmonitor (0.1.25.4) unstable; urgency=low + + * TcosActions.py: + - Fix minor typos + * po/es.po: + - Fix translations + + -- Ignacio Vidal <vidal_joshur@gva.es> Fri, 7 Dec 2007 14:56:46 +0100 + +tcosmonitor (0.1.25.3) unstable; urgency=low + + * LocalData.py: + - Use last|grep still to get connected users for thin clients + * TcosXmlRpc.py: + - Fix debug info + * po/tcosmonitor.po po/es.po: + - Update translations and template + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 05 Dec 2007 16:37:17 +0100 + +tcosmonitor (0.1.25.2) unstable; urgency=low + + * Patches by Ignacio Vidal <vidal_joshur@gva.es> + * shared.py + - Update icons + * TcosActions.py + - Replace popen2.Popen3 with modern subprocess.Popen in some actions and + redefined execution commands to obtain real pid of process + - In some cases need SIGKILL to kill vnc or vlc processes that not want to die + - Var newallclients pass as arg allclients in progressbox, in demo mode + or video, only contain users for this action + - On click progressbox button for demo mode and video broadcast only kill + processes in clients associated to this action and not in users logged + after or not in selected hosts + - Kill actions by pid in server, not need killall in each action and + permits silmutaneous modes + - Fix add_progressbox button, stock "gtk-cancel" override our + configuration, only show in label button Cancel, not our string "Stop" + and icon personalized + - Add support in demo mode from not teacher host for selectedhosts + - Update some progressbox messages + - Add checks like is user logged or app running in some actions + - Show user and host in some messages instad only ip + * TcosActions.py VNC: + - Wait thin client close x11vnc. + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 05 Dec 2007 00:15:55 +0100 + +tcosmonitor (0.1.25.1) unstable; urgency=low + + * tcos-devices.py tcos-devices-ng.py: + - Read ~/Desktop dir with rsync-controller (support translated xdg-user-dirs) + * TcosActions.py Initialize.py tcosmonitor.glade: + - Make one stop button and label for every action, now is + posible to run more than one action and can stop it. + - Kill PID, if posible, if not, use killall + - Remove rsync code, now code go to initramfs-tools-tcos/bin/rsync-controller + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 02 Dec 2007 11:12:49 +0100 + +tcosmonitor (0.1.24.14) unstable; urgency=low + + * In selected hosts if not select all try to continue and no return + * Not change image logged instead image blocked in lockscreen + + -- Ignacio Vidal <vidal_joshur@gva.es> Fri, 30 Nov 2007 10:28:05 +0100 + +tcosmonitor (0.1.24.13) unstable; urgency=low + + * TcosActions.py Initialize.py tcosmonitor.glade: + - Fix new label location in glade and not show in send messages + + -- Ignacio Vidal <vidal_joshur@gva.es> Mon, 26 Nov 2007 13:24:28 +0100 + +tcosmonitor (0.1.24.12) unstable; urgency=low + + * TcosActions.py + - Fix again unicast + * tcosmonitor.glade: + - Add label with info about new drag and drop + * Update spanish translation and template + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 25 Nov 2007 22:15:37 +0100 + +tcosmonitor (0.1.24.11) unstable; urgency=low + + [ vidal ] + * TcosActions.py: + - Fix unicast diffusion not work in thin client + - Add scape special characters in video and send files + - Add preserve existing files and more timeout in send files actions + + [ Mario Izquierdo (mariodebian) ] + * TcosActions.py Initialize.py tcosmonitor.glade: + - Add drag and drop support (patch by vidal, thanks) + - Fix again vlc commands + * Update spanish translations and template + * TcosActions.py: + - If no selected clients ask for select all + * Initialize.py: + - Remove activatable column (ugly warnings) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 24 Nov 2007 12:14:27 +0100 + +tcosmonitor (0.1.24.10) unstable; urgency=low + + * dbus/81tcos-utils: + - Remove session-script (launched from /etc/xdg/autostart) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Mon, 19 Nov 2007 23:09:58 +0100 + +tcosmonitor (0.1.24.9) unstable; urgency=low + + * TcosActions.py: + - Fix send files with special character in filenames + - Change multicast to unicast in video difussion menu one, dont need saturate network + with multicast to one client and enables multistreaming difussion. + - Not work correctly send video or files in standalone + + -- Ignacio Vidal <vidal_joshur@gva.es> Mon, 19 Nov 2007 14:59:54 +0100 + +tcosmonitor (0.1.24.8) unstable; urgency=low + + * TcosActions.py: + - Use new session-cmd tool to logout users thanks to vidal and Lliurex team). + * TcosActions.py Initialize.py shared.py TcosConf.py tcosmonitor.glade: + - Add new opcion (make actions only on selected hosts) + - New column with a checkbox called: Sel + * Update template and spanish translation with new strings + * dbus/81tcos-utils: + - Add session-cmd stsrt script + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 17 Nov 2007 19:19:17 +0100 + +tcosmonitor (0.1.24.7) unstable; urgency=low + + * TcosActions.py Initialize.py + - Fix some problems with vnc startserver (thanks to vidal for testing and patch) + - Remove stop_vnc and stop_broadcast functions, now use on_progressstop_click and 2 global vars + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 07 Nov 2007 15:55:14 +0100 + +tcosmonitor (0.1.24.6) unstable; urgency=low + + * shared.py, images/* + - Add icons to vidal menus + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Tue, 06 Nov 2007 23:21:44 +0100 + +tcosmonitor (0.1.24.5) unstable; urgency=low + + * Patch send by vidal_joshur at gva dot es + - Remove Stop broadcast menu, use new progress button and text + - Options to play DVD, SVCD, VCD or AudioCD in broadcast + * Update spanish translation (new strings) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 02 Nov 2007 18:31:13 +0100 + +tcosmonitor (0.1.24.4) unstable; urgency=low + + * ping.py LocalData.py + - Make sure don't show hosts with 8080 port open and not tcosxmlrpc + * TcosActions.py + - Get server IP in every vnc hosts call (different networks) + * TcosActions.py Initialize.py tcosmonitor.glade + - Move progressstop (and create progresstext) to new bottom bar + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 02 Nov 2007 16:55:13 +0100 + +tcosmonitor (0.1.24.3) unstable; urgency=low + + * TcosActions.py shared.py Initialize.py tcosmonitor.glade: + - Remove stop demo mode, add progress stop button + - New individual action Demo mode from thin client / standalone host + * TcosActions.py + - Modify to use new tcos vnc-controller + * LocalData.py: + - Change GetTimeLogged with new last command + * TcosXmlRpc.py: + - Fix new tcos.vnc calls to correct number of arguments + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Thu, 01 Nov 2007 19:07:53 +0100 + +tcosmonitor (0.1.24.2) unstable; urgency=low + + * Fix get_time in standalone and thin client mode (who => last) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Mon, 29 Oct 2007 09:36:17 +0100 + +tcosmonitor (0.1.24.1) unstable; urgency=low + + * tcosmonitor.py, tcospersonalize.py, tcos-devices.py, tcos-volume-manager.py + - Rename exit function salirse -> quitapp + * tcosmonitor.py: + - Create and delete /tmp/tcos_share + * TcosActions.py: + - Make vnc (server and client) to use random password + - Use new method tcos.xmlrpc.vnc and a wrapper vnc-controller.sh + * TcosStaticHosts.py: + - Support new scan method (static list) + * Option to not show host not running tcosxmlrpc (port 8080) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 27 Oct 2007 23:29:21 +0200 + +tcosmonitor (0.1.23.5) unstable; urgency=low + + * tcos-devices-ng.py: + - Use DEVPATH instead of DEVNAME in cdrom mount/umount events + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Thu, 11 Oct 2007 10:35:14 +0200 + +tcosmonitor (0.1.23.4) unstable; urgency=low + + * Fix typo dependency notification-daemon + * Enable tcos-devices-ng by default + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 07 Oct 2007 10:41:12 +0200 + +tcosmonitor (0.1.23.3) unstable; urgency=low + + * TcosActions.py: + - Init xmlrpc connection before getStandalone() + * tcos-devices-ng*: + - Allow to configure options for all users, new file: /etc/tcos/tcos-devices-ng.conf + - Update man page. + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 06 Oct 2007 20:29:02 +0200 + +tcosmonitor (0.1.23.2) unstable; urgency=low + + * Move dbus/tcosmonitor.conf to initramfs-tools-tcos package + * Make lintian clean: + - Fix typos in man pages + - Add tcos-server-utils man page + - *desktop remove Encoding line and fix Category in tcosmonitor + - Move python && python-support to Build-Depends-Indep + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Mon, 24 Sep 2007 13:39:31 +0200 + +tcosmonitor (0.1.23.1) unstable; urgency=low + + * Important move of code: + - Move xmlrpc code to initramfs-tools-tcos + - Move lockscreen to initramfs-tools-tcos + - Move udev to initramfs-tools-tcos + - Move hooks-addons to initramfs-tools-tcos + * Change tcosmonitor package arquitecture to all instead of any + * Remove obsolete code (httpd, and busybox) + * tcospersonalize.py: + - Allow to edit XhorizSync and XVertSync + (put disable and configurexorg will coment code) + * TcosActions.py: + - Import socket module + * Adjust depends and build-depends with only python package + * Change Architecture from any to all (not bins). + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 21 Sep 2007 23:11:27 +0200 + +tcosmonitor (0.1.22.3) unstable; urgency=low + + * xmlrpc/exe.c: + - Don't use get_full_path if command start with / + - Fix bug in get_full_path (remove snprintf BSIZE) + * TcosActions.py: + - Make escape spaces work with 2 or more files + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Thu, 20 Sep 2007 14:58:27 +0200 + +tcosmonitor (0.1.22.2) unstable; urgency=low + + * TcosActions.py: + - Escape spaces in rsync commands + * xmlrpc/*.[ch] + - Change strcpy => strncpy or sprintf => snprintf + * xmlrpc/validate-tcos.c: + - Initialize and get mem in struct info *login and free when unused. + * xmlrpc/Makefile: + - Compiles with -O2 flags + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 19 Sep 2007 22:55:32 +0200 + +tcosmonitor (0.1.22.1.0) unstable; urgency=low + + * xmlrpc/validate* + - Compile validate-tcos as standalone app + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 19 Sep 2007 12:13:58 +0200 + +tcosmonitor (0.1.22.1) unstable; urgency=low + + * TcosXmlrpc.py, TcosXauth.py: + - Encapsulate self.tc.tcos into try...except to avoid problems + with host with 8080 port listening + * ping.py: + - Encapsulate get_server_ips with try...except to avoid problems with ifaces + not configured. + * TcosActions.py: + - Fixed important bug, exec dbus apps number_of_clients^2 times :( + - Fix minor typos in vidal_joshur code + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 14 Sep 2007 19:57:45 +0200 + +tcosmonitor (0.1.21.5) unstable; urgency=low + + * Added option for no exec dangerous actions if TcosMonitor run in a thin client DISPLAY + (Closes: #4) + * Update spanish translation + * Fix no space in rsync command (patch by vidal_joshur at gva dot es) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Tue, 11 Sep 2007 21:14:23 +0200 + +tcosmonitor (0.1.21.4) unstable; urgency=low + + * tcosmonitor.glade AUTHORS: + - Add contributors info + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 07 Sep 2007 11:56:02 +0200 + +tcosmonitor (0.1.21.3) unstable; urgency=low + + * ping.py: + - Add get_server_ips method to not ping server ips + * TcosActions.py shared.py: + - Add video broadcast and send files to onehost_menu (patched by vidal_joshur at gva dot es) + * udev/tcos-udevd.sh: + - no generate events in /dev/loop or /dev/ram devices + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Thu, 06 Sep 2007 15:43:53 +0200 + +tcosmonitor (0.1.21.2) unstable; urgency=low + + * *.py: + - Remove wrong copyright line, thanks to Quiron. + * xmlrpc/login.c: + - Compare with strcmp instead of == + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Tue, 04 Sep 2007 11:05:01 +0200 + +tcosmonitor (0.1.21.1) unstable; urgency=low + + * Fix some call to get_filesystem + * udev/listener-daemon.sh udev/mount_listener.c: + - propagate kernel mount/umount events not more avalaible in kernel >= 2.6.22 + * tcos-devices-ng.py: + - Add CD-AUDIO support + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 02 Sep 2007 17:56:20 +0200 + +tcosmonitor (0.1.20.1) unstable; urgency=low + + * Delete all standalone screenshots on tcos-standalone stop + * udev/tcos-udevd.sh: + - Call get_filesystem with --only argument + * xmlrpc/tcosxmlrpc.c xmlrpc/Makefile: + - Update to build with new 1.06 libxmlrpc headers + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 24 Aug 2007 17:35:08 +0200 + +tcosmonitor (0.1.19.1) unstable; urgency=low + + * Join all packages in one: tcosmonitor + * xmlrpc/*: + - Add new method: dbus + * *.py: + - Add dbus support (not work at 100% yet) + - Fix some minor bugs + * debian/tcos-standalone.init: + - Don't fail at stop + * README.standalone + - Add some standalone info + * More changes to support standalone mode + * README.rsync: + - Add some info to standalone users to make work rsync file tranfers + * Many patches of vidal_joshur at gva dot es + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Tue, 31 Jul 2007 18:13:04 +0200 + +tcosmonitor (0.1.18.1) unstable; urgency=low + + * Move dbus conf file and tcos-dbus-client to tcos-tcosmonitor + * xmlrpc/lockscreen.c: + - Exe lockscreen in PATH + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Mon, 09 Jul 2007 22:16:25 +0200 + +tcosmonitor (0.1.18.0) unstable; urgency=low + + * Remove pyexamples dir + * xmlrpc/sh/restartx.sh: + - call restartxorg instead of killing X + * tcos-devices-ng: + - Allot to disable floppy cdroms or hdd from conf file + (disable_floppy=1, disable_cdroms=1, disable_hdd=1) + * xmlrpc/*: + - Add tcos.who method to retrieve username connected at :0 + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 07 Jul 2007 13:28:15 +0200 + +tcosmonitor (0.1.17.2) unstable; urgency=low + + * xmlrpc/Makefile xmlrpc/var/etc/abyss.conf: + - Set correct paths for tcos-standalone and tcos thin client + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 27 Jun 2007 23:54:22 +0200 + +tcosmonitor (0.1.17.1) unstable; urgency=low + + * New package tcos-standalone (Use tcosmonitor with not standalone hosts) + * xmlrpc/*.h: + - Add TCOS_PATH define to tcosxmlrpc, to allow running external tools from other paths + * xmlrpc/sh/*: + - Ad conditions to exec or not some tools. + * TcosTrayIcon.py: + - Remove StatusIcon declaration (break at gtk < 2.10) + * Add support of standalone mode in TcoaActions.py + * TcosActions.py: + - patch to start/stop video broadcast (vidal_joshur at gva dot es) + - patch to send files with rsync (vidal_joshur at gva dot es) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 27 Jun 2007 20:10:18 +0200 + +tcosmonitor (0.1.16.2) unstable; urgency=low + + * udev/tcos-udevd.sh: + - Force udev to save ID_FS_TYPE in disk, not only partitions + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 20 Jun 2007 21:18:12 +0200 + +tcosmonitor (0.1.16.1) unstable; urgency=low + + * xmlrpc/sh/devicesctl.sh: + - Add support to mount NTFS with ntfs-3g driver + * tcos-devices-ng.py: + - Mount ntfs-3g in a thread (fuse mounts exec a process) + * TcosXmlRpc.py: + - Don't fail in GetDevicesInfo (use try--except) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 20 Jun 2007 15:14:16 +0200 + +tcosmonitor (0.1.16) unstable; urgency=low + + * xmlrpc/sh/devicesctl.sh: + - Fix typo in include header + * images/*cdrom* + - new image based on gnome theme + * tcos-devices-ng.py: + - Fix translation strings (vars go outside _('%s')%var ) + - Add umount_all function called from exit + - Fix USB device remount + - Allow to specify mounts points with a new conf file ~/.tcos-devices-ng.conf + * Add new man page: man/tcos-devices-ng.1 + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Tue, 19 Jun 2007 18:34:18 +0200 + +tcosmonitor (0.1.15.5) unstable; urgency=low + + * xmlrpc/sh/devicesctl.sh: + - Option gethdd now returns all type disk except swap or iso9660 + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Tue, 19 Jun 2007 12:40:51 +0200 + +tcosmonitor (0.1.15.4) unstable; urgency=low + + * xmlrpc/sh/devicesctl.sh: + - Add --gethdd param and return ext3 or vfat devices in /etc/fstab + * tcos-devices-ng.py: + - Read hdd device partitions in thin client and put in menu + * images/hdd_*mount.png: + - Add hdd icons + * po/*: + - Update translations (new hdd strings) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Mon, 18 Jun 2007 18:52:00 +0200 + +tcosmonitor (0.1.15.3) unstable; urgency=low + + * lockscreen/* : + - Change copyright header + - Compile with imlib-config flags and libs + * dbus/81tcos-utils: + - Start tcos-devices --daemon and tcos-devices --hidden + * tcos-devices-ng.py: + - Don't use shared vars before importing module shared + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Mon, 18 Jun 2007 11:06:10 +0200 + +tcosmonitor (0.1.15.2) unstable; urgency=low + + * conf/tcos.conf man/* : + - fix some english typos (close ticket #3) thanks to Andres Jimenez again + * lockscreen/*: + - Add support to put a png/jpg, xpm, etc... image in lockscreen + - Default image locked.png + * tcos-devices-ng.py: + - Clean code and remote extra comments + * pyexamples: + - Add some python examples + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 17 Jun 2007 17:01:00 +0200 + +tcosmonitor (0.1.15.1) unstable; urgency=low + + * shared.py: + - Remove some ugly debug info + * xmlrpc/sh/devicesctl.sh: + - Add --exists parameter to know if a file (or device) exists + * xmlrpc/sh/soundctl.sh: + - Exis if not soundcard found + * xmlrpc/xauth.c: + - Compare local hostname with cookie hostname. + * tcos-devices.py: + - Exit if X cookie don't match + * images/*: + - Add some tcos-devices-ng.py images + * TcosTrayIcon.py: + - New Tcos class (used to build systray menu) + * tcos-devices-ng.py: + - New and more powerfull remote device manager + * Rename dbus/81tcos-dbus-client to dbus/81tcos-utils and start tcos-devices from there + * po/*: + - Update spanish translation + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Thu, 14 Jun 2007 21:15:15 +0200 + +tcosmonitor (0.1.14.4) unstable; urgency=low + + * TcosXauth.py: + - Read DISPLAY info and search for hostname and IP address + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 9 Jun 2007 19:33:04 +0200 + +tcosmonitor (0.1.14.3) unstable; urgency=low + + * tcos-devices.py, tcos-volume-manager.py: + - If gtk version is greater than 2.10 use gtk.statusicon instead of egg.trayicon + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 09 Jun 2007 17:11:33 +0200 + +tcosmonitor (0.1.14.2) unstable; urgency=low + + * TcosXauth.py: + - Read xauth cookie with -n param to not resolve hostname + - Try (with try: except: to get hostname with socket) not xauth locks + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 08 Jun 2007 22:15:23 +0200 + +tcosmonitor (0.1.14.1) unstable; urgency=low + + * Initialize.py: + - Fix AboutDialog, close and destry button for gtk > 2.10 + * Change default Homepage to http://www.tcosproject.org + * Remove some old packages info in debian/* + * Fix some package info + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Mon, 04 Jun 2007 11:56:56 +0200 + +tcosmonitor (0.1.14) unstable; urgency=low + + * Makefile: + - Patch ubuntu feisty tcos-devices.py to use python2.5 + * tcos-volume-manager.py tcos-devices.py: + - Add support for close clicking on systray. + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 02 Jun 2007 20:26:52 +0200 + +tcosmonitor (0.1.13) unstable; urgency=low + + * TcosXauth.py: + - If DISPLAY is local not get hostname + * Makefile shared.py: + - Generate version from Makefile precompile patch + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 01 Jun 2007 21:00:52 +0200 + +tcosmonitor (0.1.12) unstable; urgency=low + + * TcosXauth.py: + - Read cookie based on DISPLAY (hostname or IP address) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 01 Jun 2007 16:44:53 +0200 + +tcosmonitor (0.1.11) unstable; urgency=low + + * LocalData.py: + - Fix GetUsername search function (using IP add : not space) + * TcosActions.py: + - get vncviewer version to use diferent arguments + * TcosDBus.py: + - Parse dbus.String to str before calling tcosxmlrpc + * debian/control: + - Add python2.4-dbus alternative to python-dbus (for Ubuntu dapper) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 01 Jun 2007 12:34:55 +0200 + +tcosmonitor (0.1.10) unstable; urgency=low + + * Remove gentcos depends + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Thu, 31 May 2007 17:17:54 +0200 + +tcosmonitor (0.1.9) unstable; urgency=low + + * xmlrpc/sh/soundctl.sh: + - Remove FORCE of aumix and OSS, use amixer if available + - Make a more robust and better script + * hooks-addons/tcosmonitor: + - Move start scripts from 15,16 to 45,46 (startx before) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 26 May 2007 18:36:19 +0200 + +tcosmonitor (0.1.8) unstable; urgency=low + + * dbus/tcos-dbus-client.py: + - Add getopt support (enable exec with debug info) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 08 Apr 2007 23:07:02 +0200 + +tcosmonitor (0.1.7) unstable; urgency=low + + * Change username method (use pwd class) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Tue, 03 Apr 2007 14:54:06 +0200 + +tcosmonitor (0.1.6) unstable; urgency=low + + * Add some man pages trying to make a lintian clean package. + * Add tcos.conf to sources to not dependes on initramfs-tools-tcos + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 11 Mar 2007 19:04:29 +0100 + +tcosmonitor (0.1.5) unstable; urgency=low + + * LocalData.py: + - Fix some sort functions params + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 7 Mar 2007 23:41:54 +0100 + +tcosmonitor (0.1.4) unstable; urgency=low + + * LocalData.py: + - Sort alphanumeric hostnames + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Tue, 6 Mar 2007 11:12:20 +0100 + +tcosmonitor (0.1.3) unstable; urgency=low + + * xmlrpc/sh/soundctl.sh: + - make compatible with aumix and amixer (OSS compability) + * shared.py: + - add OSS sound channel names into sound_only_channels list + * LocalData.py: + - use socket.gethostbyaddr('xx.xx.xx.xx') to retrieve hostname + before searching in /etc/hosts or /etc/dhcp3/dhcpd.conf + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 3 Mar 2007 16:13:48 +0100 + +tcosmonitor (0.1.2) unstable; urgency=low + + * TcosXmlrpc.py: + - minimize socket timeout (2 secs) when connecting in newhost function + * shared.py: + - Add rDesktop protocol in TcosPersonalize + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 25 Feb 2007 22:19:05 +0100 + +tcosmonitor (0.1.1) unstable; urgency=low + + * xmlrpc/sh/update-tcospasswd.sh (bashism) + - Change /bin/sh to /bin/bash and remove == + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 24 Feb 2007 10:35:15 +0100 + +tcosmonitor (0.1.0) unstable; urgency=low + + * Not build LTSP or PXES packages anymore (not clean, not debian) + * Not get busybox-static + * Use python-support to bytecompile packages + * Update debhelper Build-dep + * Move TcosMonitor desktop icon to Admin menu + * Hide tcospersonalize menu + * Not ignore debhelper in tcos-tcosmonitor.postinst + * Change tcospersonalize config dir to new /var/lib/tcos/tftp/config + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 18 Feb 2007 13:36:53 +0100 + +tcosmonitor (0.0.19.1) unstable; urgency=low + + * xmlrpc/*: + - Change #ifdef DEBUG for a new function dbgtcos(); read TCOS_DEBUG env var + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Thu, 8 Feb 2007 18:33:04 +0100 + +tcosmonitor (0.0.18.2) unstable; urgency=low + + * Downgrade initramfs-tools-tcos dependencies to >= 0.59 + tcosmonitor must be installed before initramfs-tools-tcos 0.60 + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 4 Feb 2007 22:04:25 +0100 + +tcosmonitor (0.0.18.1) unstable; urgency=low + + * hooks-addons/tcosmonitor: + - remove copy od seq (fixed in initramfs-tools-tcos 0.60) + * debian/control: + - update version depends + * Remove hex2ascii bin => initramfs-tools-tcos + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 3 Feb 2007 20:39:01 +0100 + +tcosmonitor (0.0.17.1) unstable; urgency=low + + * xmlrpc/*.c: + - Remove tcosxmlrpc verbose messages + * debian/control, hooks-addons/tcosmonitor: + - Add /usr/bin/eject and eject cdrom from TcosDevices (daemon) + * tcos-devices.py: + - Remove sys.exit(1) from tcos-devices (retry cookie don't match) + * xmlrpc/sh/devicesctl.sh + - Add --eject method + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Mon, 29 Jan 2007 16:13:43 +0100 + +tcosmonitor (0.0.16.2) unstable; urgency=low + + * Change /bin/sh to /bin/bash (solve ubuntu dash problems) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Mon, 29 Jan 2007 16:02:30 +0100 + +tcosmonitor (0.0.16.1) unstable; urgency=low + + * New stable release. + * Add vertical label in all screenshots. + * Add uptime var (readed in TCOS general info) + * Change preferences minicrot_size default (20) and step (1) + * Change version string in shared.py (in future read from debian/changelog when building package) + * Fix typo in tcos-server-utils.py + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Tue, 26 Dec 2006 23:35:11 +0100 + +tcosmonitor (0.0.15.14) unstable; urgency=low + + * Add New toolbar button (All Hosts) that show all_actions_menu + * Add new global action: "Capture all hosts screenshots" + * New Preferences var: miniscrot_size (default 15%) + * tcos-volume-manager: + - add refresh button to reload all sliders values. + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 23 Dec 2006 21:10:31 +0100 + +tcosmonitor (0.0.15.13) unstable; urgency=low + + * Fix typo on on_another_screenshot() Worker => Workers + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Mon, 11 Dec 2006 16:12:48 +0100 + +tcosmonitor (0.0.15.12) unstable; urgency=low + + * Add set_sensitive() to TreeView before/after updating list or + connecting to thin client. + * Fix app/msg dialog, print hostname/username in new lines. + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Mon, 4 Dec 2006 09:46:20 +0100 + +tcosmonitor (0.0.15.11) unstable; urgency=low + + * Fix LocalData.py who |grep "%s " (add space after %s) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 29 Nov 2006 19:07:45 +0100 + +tcosmonitor (0.0.15.10) unstable; urgency=low + + * Put 1d if hours connected < 0 (connected yesterday) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 29 Nov 2006 18:46:20 +0100 + +tcosmonitor (0.0.15.9) unstable; urgency=low + + * Fix minor problem in import headers in shared.py file. + * Fix version retrieve error (disable split in mayor, med and minor) + * Update web and translation. + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Tue, 28 Nov 2006 21:36:10 +0100 + +tcosmonitor (0.0.15.8) unstable; urgency=low + + * xmlrpc/Makefile + -DVERSION=\"fooo\" not use "'foo'" + * LocalData.py + Add print_debug in version get + * shared.py Add some hidden process to list + ( xauth, tcos-devices, tcos-volume-manager, notification-daemon, bash ) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 19 Nov 2006 20:14:59 +0100 + +tcosmonitor (0.0.15.7) unstable; urgency=low + + * allow to enable/disable tcos-devices and tcos-volume-manager + from a new conf file: /etc/tcos/tcosmonitor.conf in runtime. + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 8 Nov 2006 13:11:41 +0100 + +tcosmonitor (0.0.15.6) unstable; urgency=low + + * tcos-volume-manager.py, tcos-volume-manager.glade, tcos-volume-manager.desktop + - iconize in systray tcos-volume-manager + - new systray icon for tcos-volume-manager + - add xdg/autostart tcos-volume-manager (desktop file) + - exit if xauth dont match + - mainwindow hide by default in glade file + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 28 Oct 2006 15:38:06 +0200 + +tcosmonitor (0.0.15.5) unstable; urgency=low + + * tcos-devices.py + - fix get_value(), DEVICE is not a udev var, varname is DEVNAME + - fix get_local_mountpoint() fslabel and fsvendor + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 28 Oct 2006 11:54:13 +0200 + +tcosmonitor (0.0.15.4) unstable; urgency=low + + * tcos-devices.py, udev/tcos-udevd.sh , udev/050_tcos_devices.rules + - Change udev to control all SUBSYSTEM=="block" events + - Delete duplicate events, kernel do 4 umount and 1 mount event for mounting a floppy + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 25 Oct 2006 17:24:14 +0200 + +tcosmonitor (0.0.15.3) unstable; urgency=low + + * TcosPersonalize: run as root only + * TcosActions: fix update info bug + * TcosXmlRpc, TcosXauth, TcosConf, ping: import gtk modules if env var DISPLAY is set + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 13 Oct 2006 00:09:47 +0200 + +tcosmonitor (0.0.15.2) unstable; urgency=low + + * Stable release. + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 8 Oct 2006 20:16:03 +0200 + +tcosmonitor (0.0.15.1) unstable; urgency=low + + * Fix empty password freeze bug. + * Add tcos-server-utils python script to make some admin tags + (reboot, poweroff, restartx) in all connected TCOS clients. + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 8 Oct 2006 10:59:52 +0200 + +tcosmonitor (0.0.15-1) unstable; urgency=low + + * New stable release. + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 6 Oct 2006 09:34:03 +0200 + +tcosmonitor (0.0.14pre1.7) unstable; urgency=low + + * Change gtk.threads_*() for gtk.gdk.threads_*() + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 1 Oct 2006 22:42:57 +0200 + +tcosmonitor (0.0.14pre1.6) unstable; urgency=low + + * Use /usr/lib/tcos to put scripts and bins ==> $TCOS_BINS + * tcos-devices.py Don't exist if cookie test error. + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Thu, 28 Sep 2006 11:12:29 +0200 + +tcosmonitor (0.0.14pre1.5) unstable; urgency=low + + * Add Xauth authentication method in tcosxmlrpc and tcos-devices.py + tcos-devices send a MIT-MAGIC-COOKIE-1 to tcosxmlrpc in terminal, + terminal try to use this temp cookie to self connect to his Xorg, if + can't connect don't allow to use remote devices (udev, USB, floppy, cdrom...) + * New class TcosXauth, that allows to send cookie to tcosxmlrpc. + * Add -lX11 flag to tcosxmlrpc Makefile (now depends on libX11.so) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 24 Sep 2006 21:16:53 +0200 + +tcosmonitor (0.0.14pre1.4) unstable; urgency=low + + * tcos-devices.py + - allow mount usbdisk with more than one partition (like gnome-volume-manager) + - run daemon actions in threads, if crash only crash thread not daemon. + - save mounted usb partitions in a dictionary (umount watching at this dictionary) + - change notifications term: Device => Partition. + * Remove old shell launchers from svn. + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 23 Sep 2006 15:00:48 +0200 + +tcosmonitor (0.0.14pre1.3) unstable; urgency=low + + * Work in tcospersonalize.py, now it's possible to configure xdriver as auto mode + or retrieve a list of avalaible drivers in tcos image with XMLRPC. + * Recomended to delete all personalized settings in /tftpboot/tcos/conf/, auto mode works fine. + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 22 Sep 2006 11:58:15 +0200 + +tcosmonitor (0.0.14pre1.2) unstable; urgency=low + + * Add remote devices support with LTSPFS and FUSE: + - tcos-devices --daemon ( scan USB udev events in terminal and mount/umount) + - tcos-devices --hidden ( make a systray icon, to show tcos-devices) + - tcos-devices ( show floppy and cdrom and allow to mount and umount) + * Add xmlrpc/devices.[ch] and tcosxmlrpc method tcos.devices() + * Add xmlrpc/sh/devicesctl.sh to allow tcosxmlrpc to work with devices + * Change dbus bus name to com.consoltux.TcosMonitor + * Add TcosGetDevices() in TcosXmlRpc class. + * Add python-notify debian depends + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 20 Sep 2006 22:01:41 +0200 + +tcosmonitor (0.0.14pre1.1) unstable; urgency=low + + * Split Initialize.py code and add TcosActions with button events and many functions. + * Use shared.Workers in many sites to thread friendly and add a watch-dog to it + * Minor fixes + * Add Demo mode (all users see the teacher screen) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Mon, 18 Sep 2006 15:54:49 +0200 + +tcosmonitor (0.0.12+p1.4) unstable; urgency=low + + * Add many sound info and actions (XMLRPC mixer included) + * Add support for local images, buttons, sliders and checkboxes in HtmlTextView class. + * tcosxmlrpc, add sound.[ch] and tcos.sound method with soundctl.sh script. + * Add tcos-volume-manager (small gui to change volume and mute levels with XMLRPC) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 16 Sep 2006 23:13:23 +0200 + +tcosmonitor (0.0.12.3) unstable; urgency=low + + * Add HtmlTextView class to draw datatxt more easy (html) + * Fix Localdata::GetUserName() no need to cache !! + * Export some vars in 81tcos-dbus-client based on DISPLAY empty status (for PulseAudio) + * Load spanish kbmap in 81tcos-dbus-client (FIXME add new var TCOS_KBMAP and load during start) + * Start to clean code (need very much) + * Change gtk.main() for gobject.mainloop() + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Thu, 14 Sep 2006 11:55:03 +0200 + +tcosmonitor (0.0.12.2) unstable; urgency=low + + * Reconfigure socket.defaulttimeout just before using it in PinPort class. + * Launch tcos-dbus-client from /etc/X11/Xsesssion.d/81tcos-dbus-client + * Add more hidden apps to shared.system_process + (need KDE related, don't know, because I don't use it) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Mon, 11 Sep 2006 13:22:32 +0200 + +tcosmonitor (0.0.12.1) unstable; urgency=low + + * Use LC_ALL=C for console commands. + * Minor fixes. + * Set more socket.defaulttimeout for downloading screenshots. + * Minor changes on tcos-dbus-client + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 10 Sep 2006 19:13:07 +0200 + +tcosmonitor (0.0.12) unstable; urgency=low + + * Make populate_datatxt() python-thread friend + * Add a new menu option to show running user processes + (in X session not thin client) + * Some minor bugs + * Change python encoding from UTF8 to UTF-8 + * Update translations and fix some _("%s" %var ) ERRORS + * Use New class PingPort based on sockets and remove echoping dependency + * Know bugs: if call 2 threads at same time (afeter first ends get async errors) + * Experimental support with DBUS, based on some ideas and code from + student-control-panel from Ubuntu. + * Thanks of DBUS, new menu option: Send a text message to user. + * More small fixes. + * Update pot file (template) and Spanish translation. + * Update dependencies (add dbus and python-dbus) + * New files (tcos-dbus-client , 81tcos-dbus-client + (for X11 startup) and dbus spec) + * Remove bash launchers (do a sys.path.append() if necesary) + * Add ESTABLISHED option to netstat scan + (only running connections, no timeout) + * Add GNU/GPL headers at many files (*.py *.h *.c) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sun, 10 Sep 2006 10:58:25 +0200 + +tcosmonitor (0.0.11.pre2) unstable; urgency=low + + * Fix a small bug in TcosXmlRpc.py in Exe user, pass params function + * Show passwords if tcosxmlrpc is compiled with -DVISIBLE_PASSWD=1 + * Add hex2ascci a simple C app to process xx:xx:xx:xx:xx and returns a string + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Tue, 5 Sep 2006 23:12:21 +0200 + +tcosmonitor (0.0.11.pre1) unstable; urgency=low + + * Pre release. + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Tue, 22 Aug 2006 15:19:17 +0200 + +tcosmonitor (0.0.10.b5) unstable; urgency=low + + * Rewrite auth method, new 3 methods avalaible in this order: + - /etc/tcospasswd + - /etc/shadow + - /etc/passwd + * New root script: update-tcospasswd to change LTSP, PXES or TCOS user and pass + * Fix new discover not found modules in script: xmlrpc/sh/getinfo.sh + * Revert kernel default version 2.6.16-1-486 (2.6.16-2-** don't work on my laptop) + * Add xmlrcp/sh/useallmodules.sh that download allmodules-$(uname -r).squashfs + and mount it to know what modules need the thin client througt tcosmonitor + * When read username get only first line (head -1) Localdata.py + * Split defines and functions in .h and .c files in xmlrpc/ dir + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Mon, 21 Aug 2006 17:51:53 +0200 + +tcosmonitor (0.0.10.b4) unstable; urgency=low + + * Change echo close | telnet IP PORT ==> echoping -h / IP:PORT 2>&1 (more speed) + * Add window icons from python code (glade window icon seem to not work) + * Change tcosxmlrpc auth method, use pass/shadow info. + * No create temp file for tcosxmlrpc login, send user/pass in every action + * Change method to get info (auth classes work with 4 params) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 16 Aug 2006 18:56:39 +0200 + +tcosmonitor (0.0.10.b3) unstable; urgency=low + + * Revised Makefiles, split ltsp, pxes and tcos in targets + * Make preferences chache_timeout work + * Delete Logout user action => Restart Xorg + * Search for errors while exec iTALC or X11vnc sessions + * Allow tcospersonalize only in TCOS, pxes and LTSP require more work. + * Add refresh_client_info after some actions + * Add 32x32 icon + * Write some info in INSTALL + * Clean Treeview if no host + * Fix Makefile targz target + * Change load /conf/tcos-functions by /conf/tcos-run-functions (initramfs-tools-tcos >= 0.49) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 15 Jul 2006 22:28:47 +0200 + +tcosmonitor (0.0.10.b2) unstable; urgency=low + + * Fix ping method, now is very usable + * Add a cancel button to progress (stop thread) + * Make thread work into shared.Workers class + * Add process info in xmlrpc/info.h and xmlrpc/getinfo.sh (need some gui work) + * Add all clients actions + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 15 Jul 2006 00:08:20 +0200 + +tcosmonitor (0.0.10.b1) unstable; urgency=low + + * Add a progressbar during host discovery + * Re enable cache + * Delete start/stop button + * Add code to work searchtxt and searchbutton + * Change /bin/start-stop-daemon for /sbin/start-stop-daemon + in LTSP and TCOS (PXES is the same bin or sbin) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 12 Jul 2006 23:05:52 +0200 + +tcosmonitor (0.0.10) unstable; urgency=low + + * Semi-stable release, work with tcos, pxes and ltsp + * Some jobs is do in threads. + * Beter gui (with some icons) + * Packages: + - tcosmonitor (the gui) + - tcos-tcosmonitor + - pxes-1.0-tcosmonitor + - pxes-1.1-tcosmonitor + - pxes-1.2-tcosmonitor + - ltsp-tcosmonitor + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 12 Jul 2006 15:53:12 +0200 + +tcosmonitor (0.0.9.b6) unstable; urgency=low + + * Add /etc/busybox.conf (for busybox-static) in LTSP/PXES environment + * Fix import os in tcosmonitor.py + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Mon, 10 Jul 2006 10:21:41 +0200 + +tcosmonitor (0.0.9.b5) unstable; urgency=low + + * First initial support of LTSP. + * Need busybox static to work on PXES / LTSP ??? + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Mon, 10 Jul 2006 09:51:52 +0200 + +tcosmonitor (0.0.9.b4) unstable; urgency=low + + * Add screenshot PXES support (add -ac to X options and add 8081 httpd server) + * Copy scrot and libs into pxes-1.2 and pxes-1.2 dirs + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Sat, 8 Jul 2006 17:00:34 +0200 + +tcosmonitor (0.0.9.b3) unstable; urgency=low + + * Fix dependencies, only python2.4, not python|python2.4 + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 7 Jul 2006 16:43:19 +0200 + +tcosmonitor (0.0.9.b2) unstable; urgency=low + + * First initial support of PXES. + - split package: + - pxes-1.1-tcosmonitor for pxes 1.1 version + - pxes-1.2-tcosmonitor for pxes 1.2 version + * Change all icons to Tango icon theme, right click menu have icons too + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Fri, 7 Jul 2006 13:59:00 +0200 + +tcosmonitor (0.0.9.b1) unstable; urgency=low + + * Hide tcos exe, not avalaible yet + * Fix shell scripts launchers + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Tue, 4 Jul 2006 14:03:50 +0200 + +tcosmonitor (0.0.8) unstable; urgency=low + + * Add tcospersonalize python and glade (personalize thin client xorg settings) + * Add right menu a new action: "Restart Xorg with new personalize settings" + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Tue, 4 Jul 2006 12:13:25 +0200 + +tcosmonitor (0.0.7) unstable; urgency=low + + * Add Config support with preferences dialog. + * Add kernel methods in xmlrpc/info.h + * Add a lot of actions in host right click. + * Add new method to discover host on lan (netstat and ping) + * Fix many small bugs + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Tue, 4 Jul 2006 12:13:07 +0200 + +tcosmonitor (0.0.6) unstable; urgency=low + + * Allow to run TcosMonitor any user, tcosmonitor.sh. + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Thu, 29 Jun 2006 10:15:39 +0200 + +tcosmonitor (0.0.5) unstable; urgency=low + + * Remove RemoteXml class + * Clean Localdata and Initialize classes + * add crono function to stat time. + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Thu, 29 Jun 2006 10:03:33 +0200 + +tcosmonitor (0.0.4) unstable; urgency=low + + * New beta release. + * All code is bassed now in tcosxmlrpc, webserver.sh deprecated !!! + * Support to retrieve pci and modules info throught xmlrpc/pci.h and xmlrpc/info.h + * Add lockscreen (rename of iTALC screenlock project, to avoid conflict binaries) + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Mon, 26 Jun 2006 18:18:47 +0200 + +tcosmonitor (0.0.3) unstable; urgency=low + + * xmlrpc/tcosxmlrpc semi functional: + - Auth support ( for each method login first ) + - Read username and password from /etc/tcospasswd (password in md5) + * xmlrpc/tcosmd5, small app to create md5 of a passed string. + * New python classes: + - LocalData: read connected hosts and his statistics + - TcosXmlRpc: connect to tcosxmlrpc and get info + - RemoteXml: download system-info.xml and parse it. + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 21 Jun 2006 19:58:39 +0200 + +tcosmonitor (0.0.2) unstable; urgency=low + + * Very much work on xmlrpc/tcosxmlrpc.c, not yet finish!!! + * Initial mockup of TcosMonitor python glade gui. + * Add hooks and scripts to /etc/tcos/ + * Add exejobs.sh script (abyss server run in nobody mode) + * Add webserver.sh script + * Update tcosxmlrpc methods + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Tue, 20 Jun 2006 17:00:53 +0200 + +tcosmonitor (0.0.1) unstable; urgency=low + + * Initial release. + + -- Mario Izquierdo (mariodebian) <mariodebian@gmail.com> Wed, 14 Jun 2006 18:10:47 +0200 diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..7f8f011 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +7 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..b1c3881 --- /dev/null +++ b/debian/control @@ -0,0 +1,56 @@ +Source: tcosmonitor +Section: gnome +Priority: extra +Maintainer: Mario Izquierdo (mariodebian) <mariodebian@gmail.com> +Build-Depends: debhelper (>= 7.0.50~), python-all (>=2.6.6-3~) +Standards-Version: 3.9.2 +Vcs-Git: http://tcosproject.org/git/tcosmonitor.git +Vcs-Browser: http://tcosproject.org/cgit/tcosmonitor.git/ +Homepage: http://www.tcosproject.org + +Package: tcosmonitor +Architecture: all +Depends: python, + tcosmonitor-common ( >= 0.2.39), + python-gtk-vnc, + gksu | kdebase-bin, + nmap, + ${misc:Depends}, ${shlibs:Depends}, ${python:Depends} +Breaks: initramfs-tools-tcos (<= 0.88.16) +Description: Thin client monitor for TCOS + TCOS, thin Client Operating System is a method to create small embedded os + based on Debian/Ubuntu with normal Debian kernel's. + . + tcosmonitor is a small pygtk app to monitor thin clients + +Package: tcosmonitor-common +Architecture: all +Depends: python, + python-utmp, + python-dbus, + python-gtk2, + python-dns, + python-netifaces, + python-notify, + python-xlib, + python-ipaddr, + python-ipy, + python-eggtrayicon | python-gnome2-extras, + python-dateutil, + zenity, + dbus, + x11vnc, + lsb-base (>= 3.0-6), + notification-daemon | xfce4-notifyd, + libnotify-bin, + python-m2crypto, + python-medusa, + tcos-core ( >= 0.89.44), + consolekit, + ${misc:Depends}, ${shlibs:Depends}, ${python:Depends} +Breaks: initramfs-tools-tcos (<= 0.88.16), tcosmonitor (<=0.2.39) +Description: Thin client monitor for TCOS (common files) + TCOS, thin Client Operating System is a method to create small embedded os + based on Debian/Ubuntu with normal Debian kernel's. + . + This package contains common files of tcosmonitor (for standalone) diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..44aed04 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,83 @@ +Format: http://dep.debian.net/deps/dep5 +Upstream-Name: tcosmonitor +Source: http://tcosproject.org/cgit/tcosmonitor.git + +Files: tcosmonitor/TcosDbus.py +Comment: based on dbus bindings of Student-Control-Center-0.1 +Copyright: 2005 Oliver Grawert <ogra@ubuntu.com> +License: GPL-2.0+ + +Files: tcosmonitor/WakeOnLan.py +Copyright: 2002 by Micro Systems, Marc Balmer, marc@msys.ch +License: GPL-1.0 + +Files: tcosmonitor/htmltextview.py +Copyright: 2005 Gustavo J. A. M. Carneiro +License: GPL-2.0+ + +Files: tcosmonitor/ftps_server.py tcosmonitor/counter.py +Comment: medusa demo from python-m2xrypto sources + http://svn.osafoundation.org/m2crypto/trunk/demo/medusa/ftps_server.py +Copyright: 1999-2003 Ng Pheng Siong. All rights reserved. + 2004-2006 Open Source Applications Foundation. + 2005-2006 Vrije Universiteit Amsterdam. +License: BSD-style (python-m2crypto) + Permission to use, copy, modify, and distribute this software and its + documentation for any purpose and without fee is hereby granted, + provided that the above copyright notice appear in all copies and that + both that copyright notice and this permission notice appear in + supporting documentation. + . + THE AUTHOR PROVIDES THIS SOFTWARE ``AS IS'' AND ANY EXPRESSED OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Files: * +Copyright: 2005-2011 Mario Izquierdo (mariodebian) <mariodebian@gmail.com> +License: GPL-2.0+ + +Files: debian/* +Copyright: 2005-2011 Mario Izquierdo (mariodebian) <mariodebian@gmail.com> +License: GPL-2.0+ + +License: GPL-2.0+ + This package is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + . + This package is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/> + . + On Debian systems, the complete text of the GNU General + Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". + +License: GPL-1.0 + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 1, or (at your option) + any later version. + . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program; if not, see <http://www.gnu.org/licenses/> + . + On Debian systems, the complete text of the GNU General + Public License version 1 can be found in "/usr/share/common-licenses/GPL-1". + diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..4fded67 --- /dev/null +++ b/debian/rules @@ -0,0 +1,27 @@ +#!/usr/bin/make -f + +%: + dh $@ --with python2 + + +override_dh_auto_clean: + dh_auto_clean + cd po && make clean + + + +.PHONY: override_dh_auto_clean + +#install/tcosmonitor:: +# @if [ `find $(CURDIR)/debian/tmp/ -name "*.py" | xargs grep __VERSION__ | wc -l` != 0 ]; then \ +# echo "__VERSION__ unparsed"; \ +# find *.py | xargs grep __VERSION__;\ +# exit 1; \ +# fi +# +# +#binary-predeb/tcosmonitor-common:: +# # link doc +# rm -rf debian/tcosmonitor/usr/share/doc/tcosmonitor +# ln -s tcosmonitor-common debian/tcosmonitor/usr/share/doc/tcosmonitor +# diff --git a/debian/source/format b/debian/source/format new file mode 100644 index 0000000..89ae9db --- /dev/null +++ b/debian/source/format @@ -0,0 +1 @@ +3.0 (native) diff --git a/debian/tcosmonitor-common.dirs b/debian/tcosmonitor-common.dirs new file mode 100644 index 0000000..02002d3 --- /dev/null +++ b/debian/tcosmonitor-common.dirs @@ -0,0 +1,3 @@ +usr/bin +etc/X11/Xsession.d +usr/share/pixmaps diff --git a/debian/tcosmonitor-common.docs b/debian/tcosmonitor-common.docs new file mode 100644 index 0000000..30b7a43 --- /dev/null +++ b/debian/tcosmonitor-common.docs @@ -0,0 +1,5 @@ +README +AUTHORS +TODO +README.server-utils +README.standalone diff --git a/debian/tcosmonitor-common.install b/debian/tcosmonitor-common.install new file mode 100644 index 0000000..7fd4e33 --- /dev/null +++ b/debian/tcosmonitor-common.install @@ -0,0 +1,17 @@ +debian/tmp/etc/X11/Xsession.d/81tcos-utils +debian/tmp/usr/bin/tcos-dbus-client + +debian/tmp/usr/share/locale/* + +debian/tmp/usr/lib/python*/*/tcosmonitor/TcosConf.py +debian/tmp/usr/lib/python*/*/tcosmonitor/TcosDBus.py +debian/tmp/usr/lib/python*/*/tcosmonitor/ping.py +debian/tmp/usr/lib/python*/*/tcosmonitor/shared.py +debian/tmp/usr/lib/python*/*/tcosmonitor/Sessions.py +debian/tmp/usr/lib/python*/*/tcosmonitor/TcosCommon.py +debian/tmp/usr/lib/python*/*/tcosmonitor/LocalData.py +debian/tmp/usr/lib/python*/*/tcosmonitor/TcosXauth.py +debian/tmp/usr/lib/python*/*/tcosmonitor/TcosXmlRpc.py +debian/tmp/usr/lib/python*/*/tcosmonitor/__init__.py + +debian/tmp/usr/share/pixmaps/tcos-icon-32x32.png diff --git a/debian/tcosmonitor-common.manpages b/debian/tcosmonitor-common.manpages new file mode 100644 index 0000000..b6b024d --- /dev/null +++ b/debian/tcosmonitor-common.manpages @@ -0,0 +1 @@ +man/tcos-dbus-client.1 diff --git a/debian/tcosmonitor.dirs b/debian/tcosmonitor.dirs new file mode 100644 index 0000000..370ea3a --- /dev/null +++ b/debian/tcosmonitor.dirs @@ -0,0 +1,4 @@ +usr/bin +usr/share/tcosmonitor +usr/share/tcosmonitor/images +usr/share/applications diff --git a/debian/tcosmonitor.install b/debian/tcosmonitor.install new file mode 100644 index 0000000..9c6133d --- /dev/null +++ b/debian/tcosmonitor.install @@ -0,0 +1,33 @@ +debian/tmp/etc/tcos/tcosmonitor.conf +debian/tmp/etc/tcos/tcos-devices-ng.conf + +debian/tmp/usr/share/tcosmonitor/images/* + +debian/tmp/usr/share/tcosmonitor/ui/* + +debian/tmp/usr/share/applications/tcosmonitor.desktop +debian/tmp/usr/share/applications/tcospersonalize.desktop + +debian/tmp/usr/bin/tcosmonitor +debian/tmp/usr/bin/tcospersonalize +debian/tmp/usr/bin/tcos-volume-manager +debian/tmp/usr/bin/tcos-devices-ng +debian/tmp/usr/bin/tcos-server-utils usr/sbin/ + +debian/tmp/usr/lib/python*/*/tcosmonitor/htmltextview.py +debian/tmp/usr/lib/python*/*/tcosmonitor/Initialize.py +debian/tmp/usr/lib/python*/*/tcosmonitor/TcosActions.py +debian/tmp/usr/lib/python*/*/tcosmonitor/TcosClassView.py +debian/tmp/usr/lib/python*/*/tcosmonitor/TcosExtensions.py +debian/tmp/usr/lib/python*/*/tcosmonitor/TcosIconView.py +debian/tmp/usr/lib/python*/*/tcosmonitor/TcosListView.py +debian/tmp/usr/lib/python*/*/tcosmonitor/TcosMenus.py +debian/tmp/usr/lib/python*/*/tcosmonitor/TcosPreferences.py +debian/tmp/usr/lib/python*/*/tcosmonitor/TcosStaticHosts.py +debian/tmp/usr/lib/python*/*/tcosmonitor/TcosTrayIcon.py +debian/tmp/usr/lib/python*/*/tcosmonitor/TcosTrayIcon2.py +debian/tmp/usr/lib/python*/*/tcosmonitor/WakeOnLan.py +debian/tmp/usr/lib/python*/*/tcosmonitor/counter.py +debian/tmp/usr/lib/python*/*/tcosmonitor/ftps_server.py + +debian/tmp/usr/lib/python*/*/tcosmonitor/extensions/*.py diff --git a/debian/tcosmonitor.manpages b/debian/tcosmonitor.manpages new file mode 100644 index 0000000..8e8900c --- /dev/null +++ b/debian/tcosmonitor.manpages @@ -0,0 +1,5 @@ +man/tcosmonitor.1 +man/tcos-devices-ng.1 +man/tcos-volume-manager.1 +man/tcospersonalize.1 +man/tcos-server-utils.1 diff --git a/images/active.png b/images/active.png Binary files differnew file mode 100644 index 0000000..271d37d --- /dev/null +++ b/images/active.png diff --git a/images/active_ssl.png b/images/active_ssl.png Binary files differnew file mode 100644 index 0000000..ba4b5bc --- /dev/null +++ b/images/active_ssl.png diff --git a/images/button_all.png b/images/button_all.png Binary files differnew file mode 100644 index 0000000..e40e803 --- /dev/null +++ b/images/button_all.png diff --git a/images/button_audio.png b/images/button_audio.png Binary files differnew file mode 100644 index 0000000..ef73875 --- /dev/null +++ b/images/button_audio.png diff --git a/images/button_broadcast.png b/images/button_broadcast.png Binary files differnew file mode 100644 index 0000000..a64c332 --- /dev/null +++ b/images/button_broadcast.png diff --git a/images/button_chat.png b/images/button_chat.png Binary files differnew file mode 100644 index 0000000..f50f472 --- /dev/null +++ b/images/button_chat.png diff --git a/images/button_exe.png b/images/button_exe.png Binary files differnew file mode 100644 index 0000000..6267435 --- /dev/null +++ b/images/button_exe.png diff --git a/images/button_exec.png b/images/button_exec.png Binary files differnew file mode 100644 index 0000000..6267435 --- /dev/null +++ b/images/button_exec.png diff --git a/images/button_exit.png b/images/button_exit.png Binary files differnew file mode 100644 index 0000000..780000a --- /dev/null +++ b/images/button_exit.png diff --git a/images/button_list.png b/images/button_list.png Binary files differnew file mode 100644 index 0000000..a6c2619 --- /dev/null +++ b/images/button_list.png diff --git a/images/button_msg.png b/images/button_msg.png Binary files differnew file mode 100644 index 0000000..f5b898d --- /dev/null +++ b/images/button_msg.png diff --git a/images/button_pref.png b/images/button_pref.png Binary files differnew file mode 100644 index 0000000..98e7054 --- /dev/null +++ b/images/button_pref.png diff --git a/images/button_refresh.png b/images/button_refresh.png Binary files differnew file mode 100644 index 0000000..d506587 --- /dev/null +++ b/images/button_refresh.png diff --git a/images/button_reload.png b/images/button_reload.png Binary files differnew file mode 100644 index 0000000..cb0d190 --- /dev/null +++ b/images/button_reload.png diff --git a/images/button_rtp.png b/images/button_rtp.png Binary files differnew file mode 100644 index 0000000..ef73875 --- /dev/null +++ b/images/button_rtp.png diff --git a/images/button_search.png b/images/button_search.png Binary files differnew file mode 100644 index 0000000..147bc82 --- /dev/null +++ b/images/button_search.png diff --git a/images/button_send.png b/images/button_send.png Binary files differnew file mode 100644 index 0000000..71fd26c --- /dev/null +++ b/images/button_send.png diff --git a/images/button_text.png b/images/button_text.png Binary files differnew file mode 100644 index 0000000..f5b898d --- /dev/null +++ b/images/button_text.png diff --git a/images/button_video.png b/images/button_video.png Binary files differnew file mode 100644 index 0000000..a64c332 --- /dev/null +++ b/images/button_video.png diff --git a/images/cdrom.png b/images/cdrom.png Binary files differnew file mode 100644 index 0000000..c4a3721 --- /dev/null +++ b/images/cdrom.png diff --git a/images/cdrom_mount.png b/images/cdrom_mount.png Binary files differnew file mode 100644 index 0000000..bee56a7 --- /dev/null +++ b/images/cdrom_mount.png diff --git a/images/cdrom_umount.png b/images/cdrom_umount.png Binary files differnew file mode 100644 index 0000000..6b35c15 --- /dev/null +++ b/images/cdrom_umount.png diff --git a/images/client.png b/images/client.png Binary files differnew file mode 100644 index 0000000..b46b09e --- /dev/null +++ b/images/client.png diff --git a/images/client_no_logged.png b/images/client_no_logged.png Binary files differnew file mode 100644 index 0000000..4003da5 --- /dev/null +++ b/images/client_no_logged.png diff --git a/images/eject.png b/images/eject.png Binary files differnew file mode 100644 index 0000000..1f5e89d --- /dev/null +++ b/images/eject.png diff --git a/images/floppy1.png b/images/floppy1.png Binary files differnew file mode 100644 index 0000000..ad03079 --- /dev/null +++ b/images/floppy1.png diff --git a/images/floppy2.png b/images/floppy2.png Binary files differnew file mode 100644 index 0000000..a892bba --- /dev/null +++ b/images/floppy2.png diff --git a/images/floppy_mount.png b/images/floppy_mount.png Binary files differnew file mode 100644 index 0000000..ba04188 --- /dev/null +++ b/images/floppy_mount.png diff --git a/images/floppy_umount.png b/images/floppy_umount.png Binary files differnew file mode 100644 index 0000000..31fe22d --- /dev/null +++ b/images/floppy_umount.png diff --git a/images/hdd_mount.png b/images/hdd_mount.png Binary files differnew file mode 100644 index 0000000..76bc01e --- /dev/null +++ b/images/hdd_mount.png diff --git a/images/hdd_umount.png b/images/hdd_umount.png Binary files differnew file mode 100644 index 0000000..9500ee1 --- /dev/null +++ b/images/hdd_umount.png diff --git a/images/host_standalone.png b/images/host_standalone.png Binary files differnew file mode 100644 index 0000000..fa9f6fe --- /dev/null +++ b/images/host_standalone.png diff --git a/images/host_tcos.png b/images/host_tcos.png Binary files differnew file mode 100644 index 0000000..bfdef6b --- /dev/null +++ b/images/host_tcos.png diff --git a/images/icon_alert.png b/images/icon_alert.png Binary files differnew file mode 100644 index 0000000..7233d45 --- /dev/null +++ b/images/icon_alert.png diff --git a/images/icon_mixer.png b/images/icon_mixer.png Binary files differnew file mode 100644 index 0000000..0e68ace --- /dev/null +++ b/images/icon_mixer.png diff --git a/images/idiomas.png b/images/idiomas.png Binary files differnew file mode 100644 index 0000000..59873ce --- /dev/null +++ b/images/idiomas.png diff --git a/images/idiomas2.png b/images/idiomas2.png Binary files differnew file mode 100644 index 0000000..4cac2e5 --- /dev/null +++ b/images/idiomas2.png diff --git a/images/inactive.png b/images/inactive.png Binary files differnew file mode 100644 index 0000000..3f18ed0 --- /dev/null +++ b/images/inactive.png diff --git a/images/info_cpu.png b/images/info_cpu.png Binary files differnew file mode 100644 index 0000000..da4f71d --- /dev/null +++ b/images/info_cpu.png diff --git a/images/info_kernel.png b/images/info_kernel.png Binary files differnew file mode 100644 index 0000000..bbd7cef --- /dev/null +++ b/images/info_kernel.png diff --git a/images/info_net.png b/images/info_net.png Binary files differnew file mode 100644 index 0000000..934973e --- /dev/null +++ b/images/info_net.png diff --git a/images/info_pci.png b/images/info_pci.png Binary files differnew file mode 100644 index 0000000..fbde5bd --- /dev/null +++ b/images/info_pci.png diff --git a/images/info_proc.png b/images/info_proc.png Binary files differnew file mode 100644 index 0000000..c6068e3 --- /dev/null +++ b/images/info_proc.png diff --git a/images/info_ram.png b/images/info_ram.png Binary files differnew file mode 100644 index 0000000..3db3506 --- /dev/null +++ b/images/info_ram.png diff --git a/images/info_sound_ko.png b/images/info_sound_ko.png Binary files differnew file mode 100644 index 0000000..a602c85 --- /dev/null +++ b/images/info_sound_ko.png diff --git a/images/info_sound_ok.png b/images/info_sound_ok.png Binary files differnew file mode 100644 index 0000000..70ae43a --- /dev/null +++ b/images/info_sound_ok.png diff --git a/images/info_swap.png b/images/info_swap.png Binary files differnew file mode 100644 index 0000000..6553907 --- /dev/null +++ b/images/info_swap.png diff --git a/images/info_xorg.png b/images/info_xorg.png Binary files differnew file mode 100644 index 0000000..e25a556 --- /dev/null +++ b/images/info_xorg.png diff --git a/images/locked.png b/images/locked.png Binary files differnew file mode 100644 index 0000000..9c6e264 --- /dev/null +++ b/images/locked.png diff --git a/images/locked_net.png b/images/locked_net.png Binary files differnew file mode 100644 index 0000000..ddfc96c --- /dev/null +++ b/images/locked_net.png diff --git a/images/locked_net_screen.png b/images/locked_net_screen.png Binary files differnew file mode 100644 index 0000000..cdd10bc --- /dev/null +++ b/images/locked_net_screen.png diff --git a/images/logged.png b/images/logged.png Binary files differnew file mode 100644 index 0000000..9d2d500 --- /dev/null +++ b/images/logged.png diff --git a/images/ltsp_logo.png b/images/ltsp_logo.png Binary files differnew file mode 100644 index 0000000..8b8e26c --- /dev/null +++ b/images/ltsp_logo.png diff --git a/images/menu_broadcast.png b/images/menu_broadcast.png Binary files differnew file mode 100644 index 0000000..62fadfb --- /dev/null +++ b/images/menu_broadcast.png diff --git a/images/menu_chat.png b/images/menu_chat.png Binary files differnew file mode 100644 index 0000000..8f8849c --- /dev/null +++ b/images/menu_chat.png diff --git a/images/menu_clear.png b/images/menu_clear.png Binary files differnew file mode 100644 index 0000000..e6c8e8b --- /dev/null +++ b/images/menu_clear.png diff --git a/images/menu_configure.png b/images/menu_configure.png Binary files differnew file mode 100644 index 0000000..9460dfc --- /dev/null +++ b/images/menu_configure.png diff --git a/images/menu_dpms_off.png b/images/menu_dpms_off.png Binary files differnew file mode 100644 index 0000000..a3a32cb --- /dev/null +++ b/images/menu_dpms_off.png diff --git a/images/menu_dpms_on.png b/images/menu_dpms_on.png Binary files differnew file mode 100644 index 0000000..b272892 --- /dev/null +++ b/images/menu_dpms_on.png diff --git a/images/menu_exec.png b/images/menu_exec.png Binary files differnew file mode 100644 index 0000000..07760c4 --- /dev/null +++ b/images/menu_exec.png diff --git a/images/menu_kill.png b/images/menu_kill.png Binary files differnew file mode 100644 index 0000000..b68290b --- /dev/null +++ b/images/menu_kill.png diff --git a/images/menu_list.png b/images/menu_list.png Binary files differnew file mode 100644 index 0000000..ba9a630 --- /dev/null +++ b/images/menu_list.png diff --git a/images/menu_lock.png b/images/menu_lock.png Binary files differnew file mode 100644 index 0000000..f7ea0cd --- /dev/null +++ b/images/menu_lock.png diff --git a/images/menu_locknet.png b/images/menu_locknet.png Binary files differnew file mode 100644 index 0000000..ddfc96c --- /dev/null +++ b/images/menu_locknet.png diff --git a/images/menu_msg.png b/images/menu_msg.png Binary files differnew file mode 100644 index 0000000..ec70e04 --- /dev/null +++ b/images/menu_msg.png diff --git a/images/menu_newconf.png b/images/menu_newconf.png Binary files differnew file mode 100644 index 0000000..01bc566 --- /dev/null +++ b/images/menu_newconf.png diff --git a/images/menu_poweroff.png b/images/menu_poweroff.png Binary files differnew file mode 100644 index 0000000..07c1794 --- /dev/null +++ b/images/menu_poweroff.png diff --git a/images/menu_proc.png b/images/menu_proc.png Binary files differnew file mode 100644 index 0000000..58d8329 --- /dev/null +++ b/images/menu_proc.png diff --git a/images/menu_reboot.png b/images/menu_reboot.png Binary files differnew file mode 100644 index 0000000..bc9ae66 --- /dev/null +++ b/images/menu_reboot.png diff --git a/images/menu_refresh.png b/images/menu_refresh.png Binary files differnew file mode 100644 index 0000000..3fd71d6 --- /dev/null +++ b/images/menu_refresh.png diff --git a/images/menu_remote.png b/images/menu_remote.png Binary files differnew file mode 100644 index 0000000..a6447fb --- /dev/null +++ b/images/menu_remote.png diff --git a/images/menu_restartx.png b/images/menu_restartx.png Binary files differnew file mode 100644 index 0000000..34fe6a9 --- /dev/null +++ b/images/menu_restartx.png diff --git a/images/menu_rtp.png b/images/menu_rtp.png Binary files differnew file mode 100644 index 0000000..95a9a4a --- /dev/null +++ b/images/menu_rtp.png diff --git a/images/menu_screenshot.png b/images/menu_screenshot.png Binary files differnew file mode 100644 index 0000000..ab87f63 --- /dev/null +++ b/images/menu_screenshot.png diff --git a/images/menu_send.png b/images/menu_send.png Binary files differnew file mode 100644 index 0000000..71b3d52 --- /dev/null +++ b/images/menu_send.png diff --git a/images/menu_tiza.png b/images/menu_tiza.png Binary files differnew file mode 100644 index 0000000..9ba3f9b --- /dev/null +++ b/images/menu_tiza.png diff --git a/images/menu_unlock.png b/images/menu_unlock.png Binary files differnew file mode 100644 index 0000000..d046300 --- /dev/null +++ b/images/menu_unlock.png diff --git a/images/menu_unlocknet.png b/images/menu_unlocknet.png Binary files differnew file mode 100644 index 0000000..0c0ebd3 --- /dev/null +++ b/images/menu_unlocknet.png diff --git a/images/menu_wol.png b/images/menu_wol.png Binary files differnew file mode 100644 index 0000000..27f2ab5 --- /dev/null +++ b/images/menu_wol.png diff --git a/images/menu_xterm.png b/images/menu_xterm.png Binary files differnew file mode 100644 index 0000000..c5b797a --- /dev/null +++ b/images/menu_xterm.png diff --git a/images/multimedia.png b/images/multimedia.png Binary files differnew file mode 100644 index 0000000..ef64896 --- /dev/null +++ b/images/multimedia.png diff --git a/images/no.png b/images/no.png Binary files differnew file mode 100644 index 0000000..9bb8a09 --- /dev/null +++ b/images/no.png diff --git a/images/ok.png b/images/ok.png Binary files differnew file mode 100644 index 0000000..4915ea5 --- /dev/null +++ b/images/ok.png diff --git a/images/pendrive_mount.png b/images/pendrive_mount.png Binary files differnew file mode 100644 index 0000000..1fa0367 --- /dev/null +++ b/images/pendrive_mount.png diff --git a/images/pendrive_umount.png b/images/pendrive_umount.png Binary files differnew file mode 100644 index 0000000..395f5e9 --- /dev/null +++ b/images/pendrive_umount.png diff --git a/images/share.png b/images/share.png Binary files differnew file mode 100644 index 0000000..043cc69 --- /dev/null +++ b/images/share.png diff --git a/images/standalone.png b/images/standalone.png Binary files differnew file mode 100644 index 0000000..975cf35 --- /dev/null +++ b/images/standalone.png diff --git a/images/tcos-devices-32x32.png b/images/tcos-devices-32x32.png Binary files differnew file mode 100644 index 0000000..cef0e86 --- /dev/null +++ b/images/tcos-devices-32x32.png diff --git a/images/tcos-icon-32x32.png b/images/tcos-icon-32x32.png Binary files differnew file mode 100644 index 0000000..907035b --- /dev/null +++ b/images/tcos-icon-32x32.png diff --git a/images/tcos-icon.png b/images/tcos-icon.png Binary files differnew file mode 100644 index 0000000..6ce6c60 --- /dev/null +++ b/images/tcos-icon.png diff --git a/images/tcos-logo.png b/images/tcos-logo.png Binary files differnew file mode 100644 index 0000000..f88e029 --- /dev/null +++ b/images/tcos-logo.png diff --git a/images/tcos-volume-32x32.png b/images/tcos-volume-32x32.png Binary files differnew file mode 100644 index 0000000..9bfcda8 --- /dev/null +++ b/images/tcos-volume-32x32.png diff --git a/images/unlocked.png b/images/unlocked.png Binary files differnew file mode 100644 index 0000000..a98652c --- /dev/null +++ b/images/unlocked.png diff --git a/images/unlogged.png b/images/unlogged.png Binary files differnew file mode 100644 index 0000000..9a824cf --- /dev/null +++ b/images/unlogged.png diff --git a/images/usb1.png b/images/usb1.png Binary files differnew file mode 100644 index 0000000..78b856c --- /dev/null +++ b/images/usb1.png diff --git a/images/usb2.png b/images/usb2.png Binary files differnew file mode 100644 index 0000000..61ea434 --- /dev/null +++ b/images/usb2.png diff --git a/images/usb_mount.png b/images/usb_mount.png Binary files differnew file mode 100644 index 0000000..faf69e3 --- /dev/null +++ b/images/usb_mount.png diff --git a/images/usb_umount.png b/images/usb_umount.png Binary files differnew file mode 100644 index 0000000..375811d --- /dev/null +++ b/images/usb_umount.png diff --git a/man/tcos-dbus-client.1 b/man/tcos-dbus-client.1 new file mode 100644 index 0000000..8d6950d --- /dev/null +++ b/man/tcos-dbus-client.1 @@ -0,0 +1,42 @@ +.\"Created with GNOME Manpages Editor Wizard +.\"http://gmanedit.sourceforge.net +.\"Sergio Rua <srua@gpul.org> +.\" +.TH tcos-dbus-client 1 "Mar 11, 2007" "tcos-dbus-client man page" + +.SH NAME +tcos-dbus-client \- DBUS service that allow TcosMonitor to exec or retrieve data from connected users. + +.SH DESCRIPTION + +.PP +\fBtcos-dbus-client\fP is a python script that generate DBUS service used by TcosMonitor to do some jobs: + * Send a message + * Exec app + * Read all user running process and kill by PID + +tcos-dbus-client use same auth that tcosxmlrpc (user and password) and is +loaded in /etc/X11/Xsession.d/81tcos-dbus-client. + +If DISPLAY is local tcos-dbus-client don't start. + +.SH OPTIONS +.B [no options] + With no options will run a dbus service for connected user. + +.B --help + Some usage help about tcos-dbus-client + +.B --debug + Show verbose output when running + +.SH BUGS +Contact Mario Izquierdo <mariodebian@gmail.com> + +Homepage: http://www.tcosproject.org + +.SH SEE ALSO +tcos-dbus-client(1) + +.SH AUTHOR +Mario Izquierdo (mariodebian) <mariodebian@gmail.com> diff --git a/man/tcos-devices-ng.1 b/man/tcos-devices-ng.1 new file mode 100644 index 0000000..88d9c04 --- /dev/null +++ b/man/tcos-devices-ng.1 @@ -0,0 +1,73 @@ +.TH tcos-devices-ng 1 "Jun 19, 2007" "tcos-devices-ng man page" + +.SH NAME +tcos-devices-ng \- Python GTK2 systray app that allow to access thin client filesystems and devices easyly. + +.SH DESCRIPTION + +.PP +\fBtcos-devices-ng\fP is a python systray app exec in client session startup and allow to: + * Mount / umount floppy cdrom + * Detect USB devices and mount automatically (udev events) + * Mount / umount hard disk partitions (of the thin client) + +tcos-devices-ng use xauth with tcosxmlrpc (MIT-MAGIC-COOKIE) + +.SH OPTIONS +.B [no options] + With no options will launch in normal mode. + +.B --host=xx.xx.xx.xx + Overwrite DISPLAY with this var (doesn't work unless thin client Xorg is started with \-ac) + +.B --debug + Show verbose output when running + +.B --help + Some usage help about tcos-devices-ng + +.SH OPTIONAL CONFIGURATION + +You can create a conf file in user home ~/.tcos\-devices\-ng.conf (for one user) or +edit /etc/tcos/tcos\-devices\-ng.conf (for all users) with this content: + + hdc=myCdrom + hdd=cdWriter + hda1=winData + hda2=debianData + +When mounting a device will search in this file an if device exists +use value as mount point + +.B Please only use numbers and letters in mount point (not spaces). + + ex: for hda1 /home/USERNAME/Desktop/winData + +.SH DISABLE SOME DEVICES + +Put into ~/.tcos\-devices\-ng.conf or edit /etc/tcos/tcos\-devices\-ng.conf like this: + + # disable floppy + disable_floppy=1 + + #disable all cdroms + disable_cdroms=1 + + #disable hard disk partitions + disable_hdd=1 + +Special disable line: + + # disable quit item + disable_quit=1 + +.SH BUGS +Contact Mario Izquierdo <mariodebian@gmail.com> + +Homepage: http://www.tcosproject.org + +.SH SEE ALSO +tcos-devices-ng(1) + +.SH AUTHOR +Mario Izquierdo (mariodebian) <mariodebian@gmail.com> diff --git a/man/tcos-server-utils.1 b/man/tcos-server-utils.1 new file mode 100644 index 0000000..e774469 --- /dev/null +++ b/man/tcos-server-utils.1 @@ -0,0 +1,44 @@ +.TH tcos-server-utils 1 "Sep 24, 2007" "tcos-server-utils man page" + +.SH NAME +tcos-server-utils \- Python script to exec some actions on connected thin clients. + +.SH DESCRIPTION + +.PP +\fBtcos-server-utils\fP is a python script that generate XMLRPC events to do some jobs: + * Send a message + * Reboot + * Poweroff + * Restart Xorg + +tcos-server-utils use ~/.tcosconfig.conf auth and need to be configured before using it. + + +.SH OPTIONS +.B [no options] + With no options show some actions. + +.B --help + Some usage help about tcos-server-utils + +.B --action=foo + Exec desired action ( reboot, poweroff, restartx, message, nothing ) + (action nothing is a self test) + +.B --text="foo" + If action=message this will the text displayed + +.B --users=user1,user2 + Coma separated list of usernames to send text message + +.B --debug + Show verbose output when running + +.SH BUGS +Contact Mario Izquierdo <mariodebian@gmail.com> + +Homepage: http://www.tcosproject.org + +.SH AUTHOR +Mario Izquierdo (mariodebian) <mariodebian@gmail.com> diff --git a/man/tcos-volume-manager.1 b/man/tcos-volume-manager.1 new file mode 100644 index 0000000..eb4a162 --- /dev/null +++ b/man/tcos-volume-manager.1 @@ -0,0 +1,47 @@ +.TH tcos-volume-manager 1 "Mar 11, 2007" "tcos-volume-manager man page" + +.SH NAME +tcos-volume-manager \- Python GTK2 gui that allow to change thin client sound levels. + +.SH DESCRIPTION + +.PP +\fBtcos-volume-manager\fP is a python GUI exec in client session startup and allow to: + * Read thin client sound card levels. + * Change (mute/unmute) levels. + +tcos-volume-manager use xauth with tcosxmlrpc (MIT-MAGIC-COOKIE) + +.SH OPTIONS +.B [no options] + With no options will launch hidden GUI (systray) app. + +.B --host=xx.xx.xx.xx + Overwrite DISPLAY with this var (not work unless thin client Xorg is started with \-ac) + +.B --debug + Show verbose output when running + +.B --help + Some usage help about tcos\-volume\-manager + +.SH TIPS + You can create 2 files to change default behaviour of tcos-volume-manager + +.B ~/.tcos-volume-manager.allow.restartpulse + This file show restart PulseAudio button + +.B ~/.tcos-volume-manager.start.restartpulse + This file restart PulseAudio when tcos-volume-manager starts + + +.SH BUGS +Contact Mario Izquierdo <mariodebian@gmail.com> + +Homepage: http://www.tcosproject.org + +.SH SEE ALSO +tcos-volume-manager(1) + +.SH AUTHOR +Mario Izquierdo (mariodebian) <mariodebian@gmail.com> diff --git a/man/tcosmonitor.1 b/man/tcosmonitor.1 new file mode 100644 index 0000000..600f72f --- /dev/null +++ b/man/tcosmonitor.1 @@ -0,0 +1,37 @@ +.TH tcosmonitor 1 "Mar 11, 2007" "tcosmonitor man page" + +.SH NAME +tcosmonitor \- Python GTK2 gui that allow an admin or teacher to take control of a thin client classrom. + +.SH DESCRIPTION + +.PP +\fBtcosmonitor\fP is a python complete GUI with which a teacher or admin can : + * Reboot / Poweroff all connected host or single one. + * Lock / Unlock screens. + * Take a screenshot + * Send text, exec app, kill app + * etc... + +TcosMonitor uses auth with tcosxmlrpc (user and password) + +.SH OPTIONS +.B [no options] + With no options will run in normal mode. + +.B --help + Some usage help about tcosmonitor + +.B --debug + Show verbose output when running + +.SH BUGS +Contact Mario Izquierdo <mariodebian@gmail.com> + +Homepage: http://www.tcosproject.org + +.SH SEE ALSO +tcosmonitor(1) + +.SH AUTHOR +Mario Izquierdo (mariodebian) <mariodebian@gmail.com> diff --git a/man/tcospersonalize.1 b/man/tcospersonalize.1 new file mode 100644 index 0000000..39b91b7 --- /dev/null +++ b/man/tcospersonalize.1 @@ -0,0 +1,35 @@ +.TH tcospersonalize 1 "Mar 11, 2007" "tcospersonalize man page" + +.SH NAME +tcospersonalize \- Python GTK2 gui that allow to create single host files to configure some TCOS vars. + +.SH DESCRIPTION + +.PP +\fBtcospersonalize\fP is a python GUI that allow to: + * Select remote X protocol (XMDCP, Local, rDesktop, ...) + * Select Xorg driver, resolution, and bitmap color. + +tcospersonalize is exec by root because write files into /var/lib/tcos/tftp/config + +.SH OPTIONS +.B --host=xx.xx.xx.xx + Host that will be configured (file /var/lib/tcos/tftp/config/xx.xx.xx.xx.conf ) + +.B --debug + Show verbose output when running + +.B --help + Some usage help about tcospersonalize + + +.SH BUGS +Contact Mario Izquierdo <mariodebian@gmail.com> + +Homepage: http://www.tcosproject.org + +.SH SEE ALSO +tcospersonalize(1) + +.SH AUTHOR +Mario Izquierdo (mariodebian) <mariodebian@gmail.com> diff --git a/pixmaps/tcos-icon.png b/pixmaps/tcos-icon.png Binary files differnew file mode 100644 index 0000000..6ce6c60 --- /dev/null +++ b/pixmaps/tcos-icon.png diff --git a/po/FILES b/po/FILES new file mode 100644 index 0000000..90d52f8 --- /dev/null +++ b/po/FILES @@ -0,0 +1,63 @@ +../tcosmonitor.py +../tcos-devices-ng.py +../server-utils/tcos-server-utils.py +../ui/tcosmonitor-prefwindow.ui +../ui/tcosmonitor-abouttcos.ui +../ui/tray.ui +../ui/tcos-volume-manager.ui +../ui/tcosmonitor-chatwindow.ui +../ui/tcosmonitor-staticwindow.ui +../ui/tcospersonalize.ui +../ui/tcosmonitor-mainwindow.ui +../ui/tcosmonitor-staticwindownew.ui +../ui/tcosmonitor-askwindow.ui +../setup.py +../tcospersonalize.py +../tcos-volume-manager.py +../tcosmonitor/TcosDBus.py +../tcosmonitor/TcosXauth.py +../tcosmonitor/TcosStaticHosts.py +../tcosmonitor/__init__.py +../tcosmonitor/shared.py +../tcosmonitor/TcosClassView.py +../tcosmonitor/TcosTrayIcon.py +../tcosmonitor/TcosPAM.py +../tcosmonitor/extensions/lockscreen.py +../tcosmonitor/extensions/appsmsg.py +../tcosmonitor/extensions/remotessh.py +../tcosmonitor/extensions/__init__.py +../tcosmonitor/extensions/dpms.py +../tcosmonitor/extensions/screenshot.py +../tcosmonitor/extensions/sendfiles.py +../tcosmonitor/extensions/info.py +../tcosmonitor/extensions/logout.py +../tcosmonitor/extensions/reboot.py +../tcosmonitor/extensions/tcosnetcontroller.py +../tcosmonitor/extensions/videolan.py +../tcosmonitor/extensions/restartxorg.py +../tcosmonitor/extensions/italc.py +../tcosmonitor/extensions/tcospersonalize.py +../tcosmonitor/extensions/vnc.py +../tcosmonitor/extensions/wakeonlan.py +../tcosmonitor/extensions/livevnc.py +../tcosmonitor/extensions/viewproc.py +../tcosmonitor/extensions/audiortp.py +../tcosmonitor/extensions/clean.py +../tcosmonitor/TcosXmlRpc.py +../tcosmonitor/TcosMonitorDaemon.py +../tcosmonitor/TcosIconView.py +../tcosmonitor/TcosListView.py +../tcosmonitor/TcosTrayIcon2.py +../tcosmonitor/TcosConf.py +../tcosmonitor/Initialize.py +../tcosmonitor/LocalData.py +../tcosmonitor/TcosPreferences.py +../tcosmonitor/htmltextview.py +../tcosmonitor/TcosMenus.py +../tcosmonitor/ping.py +../tcosmonitor/TcosActions.py +../tcosmonitor/TcosExtensions.py +../tcosmonitor/TcosCommon.py +../dbus/client.py +../dbus/server.py +../dbus/tcos-dbus-client.py diff --git a/po/Makefile b/po/Makefile new file mode 100644 index 0000000..bdbac79 --- /dev/null +++ b/po/Makefile @@ -0,0 +1,53 @@ +LANGUAGES=es pt_BR ca ca@valencia gl fr + +all: gmo + + +clean: + @echo " **CLEAN**" + @rm -rf *.mo *~ tmp/ + @for lang in $(LANGUAGES); do \ + echo " **CLEANDIR** $$lang"; \ + rm -rf $$lang;\ + done + +files: +# find ../ -name "*.ui" -o -name "*.py" | grep -v WakeOnLan > FILES + +pot: + find ../ -name "*.ui" | grep -v WakeOnLan > FILES.ui.txt + find ../ -name "*.py" | grep -v WakeOnLan > FILES.py.txt +# xgettext --add-comments -o tcosmonitor.pot --files-from=FILES + xgettext -o tcosmonitor.py.pot --files-from=FILES.py.txt --language=Python + xgettext -o tcosmonitor.ui.pot --files-from=FILES.ui.txt --language=Glade + msgcat -o tcosmonitor.pot tcosmonitor.py.pot tcosmonitor.ui.pot + rm -f tcosmonitor.py.pot tcosmonitor.ui.pot FILES.ui.txt FILES.py.txt + +po: + @for lang in $(LANGUAGES); do \ + echo " **PO** $$lang"; \ + if [ ! -f $$lang.po ]; then \ + msginit --input tcosmonitor.pot -o $$lang-old.po;\ + else \ + mv $$lang.po $$lang-old.po; \ + fi ; \ + msgmerge -o $$lang.po $$lang-old.po tcosmonitor.pot; \ + rm -f $$lang-old.po; \ + done + +gmo: + @echo " **COMPILING** languages: $(LANGUAGES)" + @for lang in $(LANGUAGES); do \ + echo " **COMPILEMO** $$lang" ; \ + mkdir -p $$lang/LC_MESSAGES/; \ + msgfmt --verbose -o $$lang/LC_MESSAGES/tcosmonitor.mo $$lang.po; \ + done + +install: + @echo " **INSTALL** languages: $(LANGUAGES)" + @for lang in $(LANGUAGES); do \ + echo " **INSTALLMO** $$lang" ; \ + mkdir -p $(DESTDIR)/usr/share/locale/$$lang/LC_MESSAGES/; \ + msgfmt -o $(DESTDIR)/usr/share/locale/$$lang/LC_MESSAGES/tcosmonitor.mo $$lang.po; \ + done + diff --git a/po/ca.po b/po/ca.po new file mode 100644 index 0000000..8fa4ee7 --- /dev/null +++ b/po/ca.po @@ -0,0 +1,2902 @@ +# Catalan translations for tcosmonitor package +# Traducció a català dels missatges del paquet tcosmonitor +# Copyright (C) 2007 Carles Sadurní Anguita +# This file is distributed under the same license as the PACKAGE package. +# Carles Sadurní Anguita <tcos@puntnet.org>, 2007. +# +# +msgid "" +msgstr "" +"Project-Id-Version: tcosmonitor 0.0.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-18 15:48+0100\n" +"PO-Revision-Date: 2008-06-03 08:58+0200\n" +"Last-Translator: Carles Sadurní Anguita <po@puntnet.org>\n" +"Language-Team: catalan\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../tcosmonitor.py:129 +#, fuzzy, python-format +msgid "" +"The user \"%s\" must be member of the group \"tcos\" to exec tcosmonitor.\n" +"\n" +"If you are system administrator, add your user to tcos group." +msgstr "" +"L'usuari \"%s\" ha de ser membre del grup \"tcos\".\n" +"\n" +"Si sou administrador/a, afegiu l'usuari al grup tcos." + +#: ../tcosmonitor.py:247 +msgid "Send files disabled. rsync not configured." +msgstr "" + +#: ../tcosmonitor.py:329 ../tcospersonalize.py:562 +#: ../tcos-volume-manager.py:378 +msgid "Exiting" +msgstr "Eixint" + +#: ../tcos-devices-ng.py:188 +#, python-format +msgid "Rebooting in %s seconds" +msgstr "Reinici en %s segons" + +#: ../tcos-devices-ng.py:190 +#, python-format +msgid "Shutting down in %s seconds" +msgstr "Apagada en %s segons" + +#: ../tcos-devices-ng.py:206 ../tcos-devices-ng.py:209 +#, python-format +msgid "" +"ERROR during action %(action)s:\n" +"%(errortxt)s" +msgstr "" + +#: ../tcos-devices-ng.py:239 +msgid "Tcos device daemon" +msgstr "" + +#: ../tcos-devices-ng.py:283 ../tcos-volume-manager.py:143 +#, python-format +msgid "Error connecting with TcosXmlRpc in %s." +msgstr "Error en intentar connectar amb TcosXmlRpc en %s." + +#: ../tcos-devices-ng.py:314 +#, python-format +msgid "Cdrom device %s" +msgstr "Dispositiu de CDROM %s" + +#: ../tcos-devices-ng.py:317 +msgid "Mount Cdrom" +msgstr "Munta CDROM" + +#: ../tcos-devices-ng.py:318 +msgid "Umount Cdrom" +msgstr "Desmunta CDROM" + +#: ../tcos-devices-ng.py:340 +#, python-format +msgid "Disk partition %s" +msgstr "Partició %s" + +#: ../tcos-devices-ng.py:343 +msgid "Mount disk partition" +msgstr "Munta la partició de disc" + +#: ../tcos-devices-ng.py:344 +msgid "Umount disk partition" +msgstr "Desmunta la partició de disc" + +#: ../tcos-devices-ng.py:356 +msgid "No floppy detected" +msgstr "No s'ha detectat el disquet" + +#: ../tcos-devices-ng.py:368 ../tcos-devices-ng.py:674 +#: ../tcos-devices-ng.py:680 ../tcos-devices-ng.py:686 +msgid "Floppy" +msgstr "Disquet" + +#: ../tcos-devices-ng.py:371 +msgid "Mount Floppy" +msgstr "Munta el disquet" + +#: ../tcos-devices-ng.py:372 +msgid "Umount Floppy" +msgstr "Desmunta el disquet" + +#: ../tcos-devices-ng.py:382 +msgid "Floppy mounted. Ready for use." +msgstr "Disquet muntat. Preparat." + +#: ../tcos-devices-ng.py:384 +msgid "Floppy umounted. You can extract it." +msgstr "Disquet desmuntat. Podeu extraure'l" + +#: ../tcos-devices-ng.py:400 +msgid "Hard disk partition mounted. Ready for use." +msgstr "Partició de disc muntada. Preparada." + +#: ../tcos-devices-ng.py:403 +msgid "Hard disk partition umounted." +msgstr "Partició de disc desmuntada" + +#: ../tcos-devices-ng.py:425 +msgid "Audio cdrom mounted., you can listen music opening wav files." +msgstr "El CD d'audio està muntat, podeu sentir música obrint els fitxers wav." + +#: ../tcos-devices-ng.py:427 +msgid "Cdrom mounted. Ready for use." +msgstr "CDROM muntat. Preparat." + +#: ../tcos-devices-ng.py:430 +msgid "Cdrom umounted. You can extract it." +msgstr "CDROM desmuntat. Podeu extraure'l." + +#: ../tcos-devices-ng.py:529 +#, python-format +msgid "" +"Mounting device %s\n" +"Please wait..." +msgstr "" +"Desmuntant el dispositiu %s.\n" +"Per favor, espereu..." + +#: ../tcos-devices-ng.py:578 +msgid "Error mounting LTSPFS, check versions of LTSPFS packages" +msgstr "" +"Error durant el muntatge de LTSPFS, comproveu les versions dels paquets " +"LTSPFS" + +#: ../tcos-devices-ng.py:604 +#, python-format +msgid "" +"Umounting device %s.\n" +"Please wait..." +msgstr "" +"Desmuntant el dispositiu %s.\n" +"Per favor, espereu..." + +#: ../tcos-devices-ng.py:651 +msgid "usbdisk" +msgstr "Disc USB" + +#: ../tcos-devices-ng.py:653 +msgid "firewiredisk" +msgstr "disc firewire" + +#: ../tcos-devices-ng.py:678 +msgid "Can't mount floppy" +msgstr "No ha estat possible muntar el disquet" + +#: ../tcos-devices-ng.py:689 +msgid "Can't umount floppy" +msgstr "No ha estat possible desmuntar el disquet" + +#: ../tcos-devices-ng.py:702 ../tcos-devices-ng.py:712 +#: ../tcos-devices-ng.py:723 ../tcos-devices-ng.py:836 +#: ../tcos-devices-ng.py:848 ../tcos-devices-ng.py:867 +#: ../tcos-devices-ng.py:879 ../tcos-devices-ng.py:911 +#, python-format +msgid "Cdrom_%s" +msgstr "Cdrom_%s" + +#: ../tcos-devices-ng.py:710 +msgid "Can't mount cdrom" +msgstr "No ha esta possible muntar el CDROM" + +#: ../tcos-devices-ng.py:726 +msgid "Can't umount cdrom" +msgstr "No ha estat possible desmuntar el CDROM" + +#: ../tcos-devices-ng.py:742 ../tcos-devices-ng.py:752 +#: ../tcos-devices-ng.py:763 +#, python-format +msgid "Disk_%s" +msgstr "Disc_%s" + +#: ../tcos-devices-ng.py:750 +msgid "Can't mount hard disk partition" +msgstr "No ha estat possible muntar la partició del disc" + +#: ../tcos-devices-ng.py:766 +msgid "Can't umount hard disk partition" +msgstr "No ha estat possible desmuntar la partició del disc" + +#: ../tcos-devices-ng.py:807 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Connected CDROM USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" + +#: ../tcos-devices-ng.py:811 +#, python-format +msgid "CDROM USB device %s" +msgstr "Dispositiu CDROM USB %s" + +#: ../tcos-devices-ng.py:814 +#, python-format +msgid "Mount CDROM USB device %s" +msgstr "Munta el dispositiu CDROM USB %s" + +#: ../tcos-devices-ng.py:815 +#, python-format +msgid "Umount CDROM USB device %s" +msgstr "Desmunta el dispositiu CDROM USB %s" + +#: ../tcos-devices-ng.py:840 ../tcos-devices-ng.py:871 +#: ../tcos-devices-ng.py:1001 ../tcos-devices-ng.py:1012 +#: ../tcos-devices-ng.py:1058 ../tcos-devices-ng.py:1138 +#: ../tcos-devices-ng.py:1149 ../tcos-devices-ng.py:1195 +#, python-format +msgid "Error, can't mount device %s" +msgstr "Error: ha estat impossible muntar %s" + +#: ../tcos-devices-ng.py:898 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Disconnected CDROM USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" + +#: ../tcos-devices-ng.py:926 +#, python-format +msgid "Can't umount cdrom usb %s" +msgstr "No ha estat possible desmuntar el cdrom usb %s" + +#: ../tcos-devices-ng.py:951 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Connected USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" + +#: ../tcos-devices-ng.py:954 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Disconnected USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" + +#: ../tcos-devices-ng.py:982 +#, python-format +msgid "USB device %s" +msgstr "Dispositiu USB %s" + +#: ../tcos-devices-ng.py:985 +#, python-format +msgid "Mount USB device %s" +msgstr "Munta el dispositiu USB %s" + +#: ../tcos-devices-ng.py:986 +#, python-format +msgid "Umount USB device %s" +msgstr "Desmunta el dispositiu USB %s" + +#: ../tcos-devices-ng.py:1088 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Connected Firewire device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" + +#: ../tcos-devices-ng.py:1091 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Disconnected Firewire device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" + +#: ../tcos-devices-ng.py:1119 +#, python-format +msgid "Firewire device %s" +msgstr "Dispositiu firewire %s" + +#: ../tcos-devices-ng.py:1122 +#, python-format +msgid "Mount Firewire device %s" +msgstr "Munta el dispositiu firewire %s" + +#: ../tcos-devices-ng.py:1123 +#, python-format +msgid "Umount Firewire device %s" +msgstr "Desmunta el dispositiu firewire %s" + +#: ../tcos-devices-ng.py:1206 +#, python-format +msgid "CDROM USB device %s umounted. You can extract it." +msgstr "El dispositiu CDROM USB %s està desmuntat. Podeu extraure'l." + +#: ../tcos-devices-ng.py:1209 +#, python-format +msgid "CDROM USB device %s mounted. Ready for use." +msgstr "El dispositiu CDROM USB %s està muntat. Preparat." + +#: ../tcos-devices-ng.py:1247 +#, python-format +msgid "USB device %s umounted. You can extract it." +msgstr "El dispositiu USB %s està desmuntat. Podeu extraure'l." + +#: ../tcos-devices-ng.py:1250 +#, python-format +msgid "USB device %s mounted. Ready for use." +msgstr "El dispositiu USB %s està muntat. Preparat." + +#: ../tcos-devices-ng.py:1286 +#, python-format +msgid "Firewire device %s umounted. You can extract it." +msgstr "El dispositiu firewire %s està desmuntat. Podeu extraure'l." + +#: ../tcos-devices-ng.py:1289 +#, python-format +msgid "Firewire device %s mounted. Ready for use." +msgstr "El dispositiu firewire %s està muntat. Preparat." + +#: ../tcospersonalize.py:115 +msgid "" +"Need a host to configure!!!\n" +"Try exec:\n" +" tcospersonalize --host=XXX.XXX.XXX.XXX" +msgstr "" +"Cal indicar l'adreça de l'equip!\n" +"Proveu:\n" +" tcospersonalize --host=XXX.XXX.XXX.XXX" + +#: ../tcospersonalize.py:190 +msgid "host: " +msgstr "equip: " + +#: ../tcospersonalize.py:454 +msgid "Host down, can't connect to tcosxmlrpc." +msgstr "Equip inaccessible: no s'ha pogut connectar a tcosxmlrpc" + +#: ../tcospersonalize.py:462 +#, python-format +msgid "New %d drivers loaded from terminal." +msgstr "%d drivers nou carregats des del terminal" + +#: ../tcospersonalize.py:521 +#, python-format +msgid "Really delete config of %s?" +msgstr "Eliminar la configuració de %s?" + +#: ../tcospersonalize.py:524 +msgid "Deleted!" +msgstr "Eliminat!" + +#: ../tcos-volume-manager.py:101 ../tcos-volume-manager.py:113 +#, python-format +msgid "" +"Tcos Sound levels on:\n" +"%s" +msgstr "" +"Nivells de volum en:\n" +"%s" + +#: ../tcos-volume-manager.py:121 +#, python-format +msgid "ERROR: It appears that TcosXmlRpc is not running on %s." +msgstr "ERROR: Sembla que TcosXmlRpc no s'està executant en %s." + +#: ../tcos-volume-manager.py:217 +msgid "Loading channels info..." +msgstr "Càrrega de la informació dels canals..." + +#: ../tcos-volume-manager.py:230 +msgid "Error loading channels info (xauth error)" +msgstr "Error en intentar carregar la informació dels canals (xauth error)" + +#: ../tcos-volume-manager.py:233 ../ui/tcos-volume-manager.ui:8 +msgid "Tcos Volume Manager" +msgstr "Gestor de volum Tcos" + +#: ../tcos-volume-manager.py:234 +#, python-format +msgid "<span size='large'><b>Sound mixer of %s host</b></span>" +msgstr "<span size='large'><b>Mesclador de so de l'equip %s</b></span>" + +#: ../tcos-volume-manager.py:300 ../tcosmonitor/extensions/info.py:442 +msgid "Mute" +msgstr "Enmudeix" + +#: ../tcos-volume-manager.py:319 +msgid "Main controls ready" +msgstr "Controls principals preparats" + +#: ../tcos-volume-manager.py:323 +msgid "All remote controls loaded." +msgstr "Carregats tots els controls remots." + +#: ../tcos-volume-manager.py:332 ../tcosmonitor/extensions/info.py:557 +#, python-format +msgid "Changing value of %(channel)s channel, to %(value)s%%..." +msgstr "Canviant el valor del canal %(channel)s a %(value)s%%..." + +#: ../tcos-volume-manager.py:339 ../tcosmonitor/extensions/info.py:564 +#, python-format +msgid "Changed value of %(channel)s channel, to %(value)s" +msgstr "" + +#: ../tcos-volume-manager.py:346 ../tcosmonitor/extensions/info.py:571 +#, python-format +msgid "Unmuting %s channel..." +msgstr "Estic restablint el volum del canal %s..." + +#: ../tcos-volume-manager.py:351 ../tcosmonitor/extensions/info.py:576 +#, python-format +msgid "Muting %s channel..." +msgstr "Estic enmudint el canal %s..." + +#: ../tcos-volume-manager.py:354 ../tcosmonitor/extensions/info.py:579 +#, python-format +msgid "Status of %(channel)s channel, is \"%(newvalue)s\"" +msgstr "" + +#: ../tcosmonitor/TcosDBus.py:94 +msgid "TcosDBus not allowed in local display" +msgstr "TcosDBus no permés en pantalla local" + +#: ../tcosmonitor/TcosDBus.py:122 +#, python-format +msgid "Seems that tcosxmlrpc isn't running on host=\"%s\"" +msgstr "Sembla que tcosxmlrpc no s'està executant en l'equip=\"%s\"" + +#: ../tcosmonitor/TcosDBus.py:143 +msgid "tcosxmlrpc ERROR conection unavalaible." +msgstr "tcosxmlrpc ERROR: connexió no disponible" + +#: ../tcosmonitor/TcosDBus.py:159 +msgid "ERROR conecting to tcosxmlrpc, check username and password." +msgstr "ERROR en la connexió a tcosxmlrpc: comproveu usuari i contrasenya" + +#: ../tcosmonitor/TcosDBus.py:251 +msgid "Message from admin" +msgstr "Missatge de l'administrador" + +#: ../tcosmonitor/TcosDBus.py:341 ../tcosmonitor/TcosDBus.py:357 +#: ../tcosmonitor/TcosDBus.py:375 ../tcosmonitor/TcosDBus.py:393 +msgid "User not allowed to run this dbus call." +msgstr "L'usuari no té permís per a executar aquesta crida a dbus" + +#: ../tcosmonitor/TcosStaticHosts.py:163 ../tcosmonitor/TcosListView.py:70 +msgid "IP address" +msgstr "Adreça IP" + +#: ../tcosmonitor/TcosStaticHosts.py:169 +#: ../ui/tcosmonitor-staticwindownew.ui:68 +msgid "MAC address" +msgstr "Adreça MAC" + +#: ../tcosmonitor/TcosStaticHosts.py:279 +msgid "No hosts found, please click on Refresh button using another method." +msgstr "" +"No s'ha trobat cap equip. Per favor, feu clic en el botó Refrescar usant un " +"altre mètode." + +#: ../tcosmonitor/shared.py:108 +msgid "Traditional list only" +msgstr "" + +#: ../tcosmonitor/shared.py:109 +msgid "Icons only" +msgstr "" + +#: ../tcosmonitor/shared.py:110 +msgid "Simulate classroom" +msgstr "" + +#: ../tcosmonitor/shared.py:111 +msgid "Lists, icons and classroom with tabs" +msgstr "" + +#: ../tcosmonitor/shared.py:270 ../tcosmonitor/shared.py:312 +#: ../tcosmonitor/TcosMenus.py:35 +msgid "Terminal actions" +msgstr "" + +#: ../tcosmonitor/shared.py:271 ../tcosmonitor/shared.py:313 +#: ../tcosmonitor/TcosMenus.py:36 +msgid "User actions" +msgstr "" + +#: ../tcosmonitor/shared.py:272 ../tcosmonitor/shared.py:314 +#: ../tcosmonitor/TcosMenus.py:37 +#, fuzzy +msgid "Audio, video and files" +msgstr "Difusió de àudio/vídeo" + +#: ../tcosmonitor/shared.py:279 ../tcosmonitor/extensions/info.py:47 +msgid "Refresh terminal info" +msgstr "Actualitza la informació dels terminals" + +#: ../tcosmonitor/shared.py:280 ../tcosmonitor/extensions/clean.py:40 +#: ../tcosmonitor/extensions/clean.py:41 +msgid "Clean info about terminal" +msgstr "Neteja informació del terminal" + +#: ../tcosmonitor/shared.py:281 ../tcosmonitor/TcosTrayIcon.py:54 +#: ../tcosmonitor/extensions/reboot.py:40 ../tcosmonitor/TcosTrayIcon2.py:58 +msgid "Reboot" +msgstr "Reinicia" + +#: ../tcosmonitor/shared.py:282 ../tcosmonitor/TcosTrayIcon.py:55 +#: ../tcosmonitor/extensions/reboot.py:42 ../tcosmonitor/TcosTrayIcon2.py:59 +msgid "Poweroff" +msgstr "Apaga" + +#: ../tcosmonitor/shared.py:283 ../tcosmonitor/extensions/lockscreen.py:40 +msgid "Lock screen" +msgstr "Bloca" + +#: ../tcosmonitor/shared.py:284 ../tcosmonitor/extensions/lockscreen.py:42 +msgid "Unlock screen" +msgstr "Desbloca" + +#: ../tcosmonitor/shared.py:285 ../tcosmonitor/extensions/italc.py:43 +msgid "Connect to remote screen (iTALC)" +msgstr "Connecta a la pantalla remota (iTALC)" + +#: ../tcosmonitor/shared.py:286 ../tcosmonitor/extensions/vnc.py:54 +msgid "Connect to remote screen (VNC)" +msgstr "Connecta a la pantalla remota (VNC)" + +#: ../tcosmonitor/shared.py:287 ../tcosmonitor/extensions/screenshot.py:45 +msgid "Screenshot" +msgstr "Captura de pantalla" + +#: ../tcosmonitor/shared.py:288 ../tcosmonitor/extensions/remotessh.py:40 +msgid "Give a remote xterm" +msgstr "Executa un terminal en el client" + +#: ../tcosmonitor/shared.py:289 +#: ../tcosmonitor/extensions/tcospersonalize.py:40 +#: ../ui/tcosmonitor-prefwindow.ui:1324 +msgid "Configure this host" +msgstr "Configura aquest equip" + +#: ../tcosmonitor/shared.py:290 ../tcosmonitor/extensions/logout.py:40 +msgid "Logout client" +msgstr "Desconnecta client" + +#: ../tcosmonitor/shared.py:291 ../tcosmonitor/extensions/restartxorg.py:41 +msgid "Restart X session with new settings" +msgstr "Reiniciar la sessió X amb la nova configuració" + +#: ../tcosmonitor/shared.py:292 ../tcosmonitor/extensions/appsmsg.py:52 +msgid "Exec app on user display" +msgstr "Executa programa en la pantalla de l'usuari" + +#: ../tcosmonitor/shared.py:293 ../tcosmonitor/extensions/appsmsg.py:53 +msgid "Send a text message to user" +msgstr "Envia missatges als usuaris" + +#: ../tcosmonitor/shared.py:294 ../tcosmonitor/extensions/viewproc.py:41 +msgid "Show running apps of this client" +msgstr "Mostrar els programes que s'executen en el client" + +#: ../tcosmonitor/shared.py:295 ../tcosmonitor/shared.py:332 +msgid "Audio/Video broadcast" +msgstr "Difusió de àudio/vídeo" + +#: ../tcosmonitor/shared.py:296 ../tcosmonitor/shared.py:333 +#: ../tcosmonitor/extensions/sendfiles.py:49 +#: ../tcosmonitor/extensions/sendfiles.py:50 +#: ../ui/tcosmonitor-prefwindow.ui:1134 ../ui/tcosmonitor-prefwindow.ui:1475 +#: ../ui/tcosmonitor-mainwindow.ui:387 +msgid "Send files" +msgstr "Enviar fitxers" + +#: ../tcosmonitor/shared.py:297 ../tcosmonitor/extensions/vnc.py:55 +msgid "Demo mode (from this host)" +msgstr "Mode demostració (des d'aquest equip)" + +#: ../tcosmonitor/shared.py:298 ../tcosmonitor/extensions/wakeonlan.py:41 +msgid "Boot client (WakeOnLan)" +msgstr "Arranca l'ordinador (WakeOnLan)" + +#: ../tcosmonitor/shared.py:299 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:38 +msgid "Lock internet" +msgstr "Bloqueig d'Internet" + +#: ../tcosmonitor/shared.py:300 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:39 +msgid "Unlock internet" +msgstr "Desbloca la connexió a Internet" + +#: ../tcosmonitor/shared.py:301 ../tcosmonitor/extensions/dpms.py:40 +#, fuzzy +msgid "DPMS Power off monitor" +msgstr "Control d'energia del monitor DPMS" + +#: ../tcosmonitor/shared.py:302 ../tcosmonitor/extensions/dpms.py:42 +#, fuzzy +msgid "DPMS Power on monitor" +msgstr "Control d'energia del monitor DPMS" + +#: ../tcosmonitor/shared.py:303 +#, fuzzy +msgid "Send MIC audio (from this host)" +msgstr "Mode demostració (des d'aquest equip)" + +#: ../tcosmonitor/shared.py:321 ../tcosmonitor/extensions/reboot.py:41 +msgid "Reboot all clients" +msgstr "Reinicia tots els equips" + +#: ../tcosmonitor/shared.py:322 ../tcosmonitor/extensions/reboot.py:43 +msgid "Poweroff all clients" +msgstr "Apaga tots els equips" + +#: ../tcosmonitor/shared.py:323 ../tcosmonitor/extensions/lockscreen.py:41 +msgid "Lock all screens" +msgstr "Bloca totes les pantalles" + +#: ../tcosmonitor/shared.py:324 ../tcosmonitor/extensions/lockscreen.py:43 +msgid "Unlock all screens" +msgstr "Desbloca totes les pantalles" + +#: ../tcosmonitor/shared.py:325 ../tcosmonitor/extensions/logout.py:41 +msgid "Logout clients" +msgstr "Desconnecta clients" + +#: ../tcosmonitor/shared.py:326 ../tcosmonitor/extensions/restartxorg.py:42 +msgid "Restart X session of all clients" +msgstr "Reinicia la sessió X en tots els clients" + +#: ../tcosmonitor/shared.py:327 ../tcosmonitor/extensions/appsmsg.py:55 +msgid "Exec same app in all connected users" +msgstr "Executat el mateix programa per a tots els usuaris connectats" + +#: ../tcosmonitor/shared.py:328 ../tcosmonitor/extensions/appsmsg.py:56 +msgid "Send a text message to all connected users" +msgstr "Envia un missatge a tots els usuaris connectats" + +#: ../tcosmonitor/shared.py:329 ../tcosmonitor/extensions/vnc.py:57 +msgid "Enter demo mode, all connected users see my screen" +msgstr "Entra en mode demo: tots els usuaris veuran la meua pantalla" + +#: ../tcosmonitor/shared.py:330 +msgid "Enter conference mode, all connected users can hear me" +msgstr "Entra en mode conferència: tots els usuaris em sentiran" + +#: ../tcosmonitor/shared.py:331 ../tcosmonitor/extensions/screenshot.py:46 +msgid "Capture All clients screens" +msgstr "Captura les pantalles de tots els clients" + +#: ../tcosmonitor/shared.py:334 ../tcosmonitor/extensions/wakeonlan.py:42 +msgid "Boot All clients (WakeOnLan)" +msgstr "Inicia tots els equips (WakeOnLan)" + +#: ../tcosmonitor/shared.py:335 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:41 +msgid "Lock internet in all connected users" +msgstr "Bloca la connexió a Internet per a tots els usuaris connectats" + +#: ../tcosmonitor/shared.py:336 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:42 +msgid "Unlock internet in all connected users" +msgstr "Desbloca la connexió a Internet per a tots els usuaris connectats" + +#: ../tcosmonitor/shared.py:337 ../tcosmonitor/extensions/dpms.py:41 +#, fuzzy +msgid "DPMS Power off monitors" +msgstr "Control d'energia del monitor DPMS" + +#: ../tcosmonitor/shared.py:338 ../tcosmonitor/extensions/dpms.py:43 +#, fuzzy +msgid "DPMS Power on monitors" +msgstr "Control d'energia del monitor DPMS" + +#: ../tcosmonitor/shared.py:339 +#, fuzzy +msgid "Chat audio conference" +msgstr "Mode audioconferència" + +#: ../tcosmonitor/shared.py:340 ../tcosmonitor/extensions/livevnc.py:51 +#: ../ui/tcosmonitor-prefwindow.ui:1342 +msgid "Live view screens with VNC" +msgstr "" + +#: ../tcosmonitor/shared.py:538 +#, python-format +msgid "QUESTION: %(txt)s, RESPONSE %(response)s" +msgstr "PREGUNTA: %(txt)s, RESPOSTA %(response)s" + +#: ../tcosmonitor/shared.py:555 ../tcosmonitor/shared.py:566 +#, python-format +msgid "INFO: %s" +msgstr "INFO: %s" + +#: ../tcosmonitor/shared.py:577 +#, python-format +msgid "ERROR: %s" +msgstr "ERROR: %s" + +#: ../tcosmonitor/TcosClassView.py:50 ../tcosmonitor/TcosIconView.py:47 +msgid "IP" +msgstr "" + +#: ../tcosmonitor/TcosClassView.py:51 ../tcosmonitor/TcosIconView.py:48 +#: ../tcosmonitor/TcosListView.py:64 +msgid "Hostname" +msgstr "Equip" + +#: ../tcosmonitor/TcosClassView.py:52 ../tcosmonitor/TcosIconView.py:49 +#: ../tcosmonitor/TcosListView.py:76 +msgid "Username" +msgstr "Usuari" + +#: ../tcosmonitor/TcosClassView.py:53 ../tcosmonitor/TcosIconView.py:50 +#: ../tcosmonitor/TcosListView.py:87 +msgid "Logged" +msgstr "Connectat" + +#: ../tcosmonitor/TcosClassView.py:54 ../tcosmonitor/TcosIconView.py:51 +#: ../tcosmonitor/TcosListView.py:103 +msgid "Time log in" +msgstr "Temps" + +#: ../tcosmonitor/TcosClassView.py:55 ../tcosmonitor/TcosIconView.py:52 +#, fuzzy +msgid "Screen locked" +msgstr "Blocada" + +#: ../tcosmonitor/TcosClassView.py:56 ../tcosmonitor/TcosIconView.py:53 +#, fuzzy +msgid "Network locked" +msgstr "Informació de la xarxa" + +#: ../tcosmonitor/TcosClassView.py:58 +msgid "" +"Place mouse on any computer to see brief info about it.\n" +"You can select and unselect multiple host clicking on every one.\n" +"Drag and drop hosts to positions and save clicking on right mouse button." +msgstr "" + +#: ../tcosmonitor/TcosClassView.py:179 +msgid "Positions reset to defaults." +msgstr "" + +#: ../tcosmonitor/TcosClassView.py:197 +#, fuzzy +msgid "Positions saved." +msgstr "S'ha desat la configuració." + +#: ../tcosmonitor/TcosClassView.py:323 +#, python-format +msgid "%s is not a valid file to exe or send" +msgstr "" + +#: ../tcosmonitor/TcosClassView.py:409 ../tcosmonitor/TcosIconView.py:156 +msgid "yes" +msgstr "" + +#: ../tcosmonitor/TcosClassView.py:411 ../tcosmonitor/TcosIconView.py:158 +msgid "no" +msgstr "" + +#: ../tcosmonitor/TcosTrayIcon.py:49 ../tcosmonitor/extensions/vnc.py:298 +#: ../tcosmonitor/TcosTrayIcon2.py:53 ../ui/tcosmonitor-mainwindow.ui:23 +msgid "Quit" +msgstr "Ix" + +#: ../tcosmonitor/TcosTrayIcon.py:65 +msgid "TcosDevices" +msgstr "" + +#: ../tcosmonitor/TcosTrayIcon.py:172 ../tcosmonitor/TcosTrayIcon.py:186 +#: ../tcosmonitor/TcosTrayIcon2.py:67 +msgid "Tcos Devices" +msgstr "Dispositius TCOS" + +#: ../tcosmonitor/TcosTrayIcon.py:232 ../tcosmonitor/TcosTrayIcon2.py:351 +msgid "Usb flash" +msgstr "USB flash" + +#: ../tcosmonitor/TcosTrayIcon.py:234 ../tcosmonitor/TcosTrayIcon2.py:353 +msgid "Mount USB1" +msgstr "Munta USB1" + +#: ../tcosmonitor/TcosTrayIcon.py:235 ../tcosmonitor/TcosTrayIcon2.py:354 +msgid "Umount USB1" +msgstr "Desmunta USB1" + +#: ../tcosmonitor/extensions/lockscreen.py:49 +#: ../tcosmonitor/extensions/lockscreen.py:57 +msgid "" +"Can't connect to tcosxmlrpc.\n" +"Please verify user and password in prefences!" +msgstr "" +"No ha estat possible connectar a tcosxmlprc.\n" +"Comproveu el nom d'usuari i la contrasenya en les preferències." + +#: ../tcosmonitor/extensions/lockscreen.py:81 +#, fuzzy, python-format +msgid "Do you want to lock the following screens: %s?" +msgstr "Voleu bloquejar les pantalles dels equips següents:%s?" + +#: ../tcosmonitor/extensions/lockscreen.py:90 +#, fuzzy, python-format +msgid "Do you want to unlock the following screens: %s?" +msgstr "Voleu desbloquejar les pantalles els equips següents:%s?" + +#: ../tcosmonitor/extensions/appsmsg.py:64 +msgid "Clients not connected" +msgstr "Clients no connectats" + +#: ../tcosmonitor/extensions/appsmsg.py:87 +#, fuzzy, python-format +msgid "" +"<b>Exec app in user(s) screen(s)\n" +"or open web address to:</b>\n" +"%s" +msgstr "" +"<b>Execució d'un programa en la pantalla de l'usuari:</b>\n" +"%s" + +#: ../tcosmonitor/extensions/appsmsg.py:89 +#, python-format +msgid "" +"<b>Send a message to:</b>\n" +"%s" +msgstr "" +"<b>Envia un missatge a:</b>\n" +"%s" + +#: ../tcosmonitor/extensions/appsmsg.py:122 +#: ../tcosmonitor/extensions/appsmsg.py:163 +msgid "Can't exec application, user is not logged" +msgstr "No es pot executar l'aplicació: no hi ha entrat cap usuari" + +#: ../tcosmonitor/extensions/appsmsg.py:141 +#: ../tcosmonitor/extensions/appsmsg.py:152 +#, fuzzy, python-format +msgid "%s is not a valid application" +msgstr "%s no és un programa" + +#: ../tcosmonitor/extensions/appsmsg.py:172 +msgid "Can't send message, user is not logged" +msgstr "" +"No s'ha pogut enviar cap missatge: no hi ha cap sessió d'usuari oberta." + +#: ../tcosmonitor/extensions/appsmsg.py:289 +#: ../tcosmonitor/extensions/appsmsg.py:298 +#, python-format +msgid "%s is not application" +msgstr "%s no és un programa" + +#: ../tcosmonitor/extensions/appsmsg.py:353 +#, python-format +msgid "" +"Error while exec remote app:\n" +"Reason: %s" +msgstr "" +"Error durant l'execució del programa remot:\n" +"Motiu: %s" + +#: ../tcosmonitor/extensions/appsmsg.py:360 +#, python-format +msgid "" +"Error while send message:\n" +"Reason: %s" +msgstr "" +"Error durant l'enviament del missatge:\n" +"Motiu: %s" + +#: ../tcosmonitor/extensions/remotessh.py:47 +msgid "Enter password of remote thin client (if asked for it)" +msgstr "Introduïu la contrasenya del client (si cal)" + +#: ../tcosmonitor/extensions/dpms.py:79 +#, fuzzy, python-format +msgid "Do you want to switch off the following monitors: %s?" +msgstr "Voleu apagar els equips següents:%s?" + +#: ../tcosmonitor/extensions/dpms.py:88 +#, fuzzy, python-format +msgid "Do you want to switch on the following monitors: %s?" +msgstr "Voleu apagar els equips següents:%s?" + +#: ../tcosmonitor/extensions/screenshot.py:66 +#: ../tcosmonitor/extensions/screenshot.py:83 +#, python-format +msgid "Can't make screenshot, error: %s" +msgstr "Ha estat impossible fer la captura, error: %s" + +#: ../tcosmonitor/extensions/screenshot.py:75 +msgid "Trying to order terminal to do a screenshot..." +msgstr "Intentant donar l'ordre al terminal de fer una captura de pantalla..." + +#: ../tcosmonitor/extensions/screenshot.py:87 +msgid "Get another screenshot" +msgstr "Feu una altra captura de pantalla" + +#: ../tcosmonitor/extensions/screenshot.py:102 +#, python-format +msgid "Screenshot of <span style='font-style: italic'>%s</span>" +msgstr "Captura de pantalla de <span style='font-style: italic'>%s</span>" + +#: ../tcosmonitor/extensions/screenshot.py:125 +#, python-format +msgid "Screenshot of %s, done." +msgstr "S'ha realitzat la captura de pantalla de %s." + +#: ../tcosmonitor/extensions/screenshot.py:139 +#, fuzzy +msgid "Save Screenshot" +msgstr "Captura de pantalla" + +#: ../tcosmonitor/extensions/screenshot.py:151 +#, fuzzy +msgid "Select file to save screenshot..." +msgstr "Tria fitxer(s)..." + +#: ../tcosmonitor/extensions/screenshot.py:155 +#, python-format +msgid "screenshot_of_%(hostname)s_date_%(date)s.png" +msgstr "" + +#: ../tcosmonitor/extensions/screenshot.py:159 +msgid "Image Files ( *.png, *.jpg)" +msgstr "" + +#: ../tcosmonitor/extensions/screenshot.py:169 +msgid "File must be png or jpg." +msgstr "" + +#: ../tcosmonitor/extensions/screenshot.py:192 +msgid "Screenshots of all hosts" +msgstr "Captures de pantalla de tots els equips" + +#: ../tcosmonitor/extensions/screenshot.py:208 +#, python-format +msgid "Screenshot of %s" +msgstr "Captura de pantalla de %s" + +#: ../tcosmonitor/extensions/sendfiles.py:62 +#: ../tcosmonitor/extensions/sendfiles.py:120 +msgid "Can't send files, user is not logged" +msgstr "No s'ha pogut enviar cap fitxer: no hi ha cap sessió d'usuari oberta." + +#: ../tcosmonitor/extensions/sendfiles.py:66 +#: ../tcosmonitor/extensions/sendfiles.py:142 +#: ../tcosmonitor/extensions/sendfiles.py:237 +msgid "" +"TcosMonitor need special configuration for rsync daemon to send files.\n" +"\n" +"Please read configuration requeriments in:\n" +"/usr/share/doc/tcosmonitor/README.rsync" +msgstr "" +"TcosMonitor necessita una configuració especial del dimoni rsync per a poder " +"enviar fitxers.\n" +"\n" +"Llegiu els requisits en:\n" +"/usr/share/doc/tcosmonitor/README.rsync" + +#: ../tcosmonitor/extensions/sendfiles.py:84 +#: ../tcosmonitor/extensions/sendfiles.py:176 +#: ../tcosmonitor/extensions/sendfiles.py:270 +msgid "Waiting for send files..." +msgstr "Esperant per a enviar fitxers..." + +#: ../tcosmonitor/extensions/sendfiles.py:93 +#: ../tcosmonitor/extensions/sendfiles.py:95 +#: ../tcosmonitor/extensions/sendfiles.py:99 +#: ../tcosmonitor/extensions/sendfiles.py:108 +#: ../tcosmonitor/extensions/sendfiles.py:189 +#: ../tcosmonitor/extensions/sendfiles.py:191 +#: ../tcosmonitor/extensions/sendfiles.py:195 +#: ../tcosmonitor/extensions/sendfiles.py:204 +#: ../tcosmonitor/extensions/sendfiles.py:283 +#: ../tcosmonitor/extensions/sendfiles.py:285 +#: ../tcosmonitor/extensions/sendfiles.py:289 +#: ../tcosmonitor/extensions/sendfiles.py:298 +msgid "Teacher" +msgstr "Profe" + +#: ../tcosmonitor/extensions/sendfiles.py:95 +#: ../tcosmonitor/extensions/sendfiles.py:108 +#: ../tcosmonitor/extensions/sendfiles.py:191 +#: ../tcosmonitor/extensions/sendfiles.py:204 +#: ../tcosmonitor/extensions/sendfiles.py:285 +#: ../tcosmonitor/extensions/sendfiles.py:298 +#, python-format +msgid "" +"Teacher has sent some files to %(teacher)s folder:\n" +"\n" +"%(basenames)s" +msgstr "" +"El/la profe ha enviat un fitxer (o més d'un) a la carpeta %(teacher)s:\n" +"\n" +"%(basenames)s" + +#: ../tcosmonitor/extensions/sendfiles.py:104 +#: ../tcosmonitor/extensions/sendfiles.py:200 +#: ../tcosmonitor/extensions/sendfiles.py:294 +#: ../tcosmonitor/extensions/reboot.py:108 +#: ../tcosmonitor/extensions/videolan.py:194 +#: ../tcosmonitor/extensions/videolan.py:389 +#: ../tcosmonitor/extensions/videolan.py:629 +#, python-format +msgid "" +"Error while exec remote app:\n" +"Reason:%s" +msgstr "" +"Error durant l'execució del programa remot:\n" +"Motiu:%s" + +#: ../tcosmonitor/extensions/sendfiles.py:105 +#: ../tcosmonitor/extensions/sendfiles.py:201 +#: ../tcosmonitor/extensions/sendfiles.py:295 +msgid "Error creating destination folder." +msgstr "Error mentre intentava crear la carpeta de destinació." + +#: ../tcosmonitor/extensions/sendfiles.py:110 +#: ../tcosmonitor/extensions/sendfiles.py:205 +#: ../tcosmonitor/extensions/sendfiles.py:300 +msgid "Files sent." +msgstr "Fitxers enviats." + +#: ../tcosmonitor/extensions/sendfiles.py:125 +#: ../tcosmonitor/extensions/sendfiles.py:220 +msgid "Select file or files..." +msgstr "Tria fitxer(s)..." + +#: ../tcosmonitor/extensions/sendfiles.py:178 +#: ../tcosmonitor/extensions/sendfiles.py:272 +#, fuzzy +msgid "Do you want open file(s) on client?" +msgstr "Voleu iniciar %s?" + +#: ../tcosmonitor/extensions/sendfiles.py:215 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:113 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:155 +#: ../tcosmonitor/extensions/videolan.py:457 +#: ../tcosmonitor/extensions/vnc.py:68 ../tcosmonitor/extensions/vnc.py:112 +#: ../tcosmonitor/extensions/vnc.py:422 +#: ../tcosmonitor/extensions/audiortp.py:229 +#: ../tcosmonitor/extensions/audiortp.py:275 +#: ../tcosmonitor/extensions/audiortp.py:373 +#: ../tcosmonitor/extensions/audiortp.py:407 +#: ../tcosmonitor/extensions/audiortp.py:460 +msgid "No users logged." +msgstr "No hi ha cap usuari connectat" + +#: ../tcosmonitor/extensions/info.py:91 +#, python-format +msgid "Connecting with %s to retrieve some info..." +msgstr "Connectant amb %s per obtenir informació..." + +#: ../tcosmonitor/extensions/info.py:117 +msgid "Tcos info" +msgstr "Informació sobre Tcos" + +#: ../tcosmonitor/extensions/info.py:120 +msgid "PXES info" +msgstr "Informació sobre PXE" + +#: ../tcosmonitor/extensions/info.py:123 +msgid "LTSP info" +msgstr "Informació sobre LTSP" + +#: ../tcosmonitor/extensions/info.py:126 +#, fuzzy +msgid "Standalone info" +msgstr "Informació disponible" + +#: ../tcosmonitor/extensions/info.py:129 +msgid "Unknow client info" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:135 ../tcosmonitor/LocalData.py:43 +#: ../tcosmonitor/LocalData.py:62 ../tcosmonitor/TcosCommon.py:182 +#: ../tcosmonitor/TcosCommon.py:190 ../tcosmonitor/TcosCommon.py:206 +#: ../tcosmonitor/TcosCommon.py:209 +msgid "unknow" +msgstr "desconegut" + +#: ../tcosmonitor/extensions/info.py:138 +msgid "Hostname: " +msgstr "Equip:" + +#: ../tcosmonitor/extensions/info.py:139 +msgid "Ip address: " +msgstr "Adreça IP:" + +#: ../tcosmonitor/extensions/info.py:140 +msgid "TcosXmlRpc version: " +msgstr "Versió de TcosXmlRpc:" + +#: ../tcosmonitor/extensions/info.py:149 +msgid "Tcos image version: " +msgstr "Versió de la imatge Tcos:" + +#: ../tcosmonitor/extensions/info.py:150 +msgid "Tcos image date: " +msgstr "Data de la imatge Tcos:" + +#: ../tcosmonitor/extensions/info.py:151 +msgid "Date of thin client: " +msgstr "Data del client lleuger:" + +#: ../tcosmonitor/extensions/info.py:152 +msgid "Uptime: " +msgstr "Temps:" + +#: ../tcosmonitor/extensions/info.py:163 +msgid "Kernel info" +msgstr "Informació del nucli" + +#: ../tcosmonitor/extensions/info.py:172 +msgid "Force download and mount all modules" +msgstr "Força la descàrrega i muntatge de tots els mòduls" + +#: ../tcosmonitor/extensions/info.py:183 +msgid "None" +msgstr "Cap" + +#: ../tcosmonitor/extensions/info.py:186 +msgid "Kernel version: " +msgstr "Versió del nucli:" + +#: ../tcosmonitor/extensions/info.py:187 +msgid "Kernel complete version: " +msgstr "Versió del nucli (completa):" + +#: ../tcosmonitor/extensions/info.py:188 +msgid "Loaded Modules: " +msgstr "Mòduls carregats:" + +#: ../tcosmonitor/extensions/info.py:189 +msgid "Modules not found: " +msgstr "Mòduls no trobats:" + +#: ../tcosmonitor/extensions/info.py:205 +msgid "Cpu info: " +msgstr "Informació de la CPU:" + +#: ../tcosmonitor/extensions/info.py:212 +msgid "Cpu model: " +msgstr "Model de la CPU:" + +#: ../tcosmonitor/extensions/info.py:213 +msgid "Cpu vendor: " +msgstr "Marca de la CPU:" + +#: ../tcosmonitor/extensions/info.py:214 +msgid "Cpu speed: " +msgstr "Velocitat del micro:" + +#: ../tcosmonitor/extensions/info.py:225 +msgid "PCI buses: " +msgstr "Buses PCI:" + +#: ../tcosmonitor/extensions/info.py:254 +msgid "Process running: " +msgstr "Processos en execució:" + +#: ../tcosmonitor/extensions/info.py:267 +msgid "Ram info: " +msgstr "Informació sobre la RAM:" + +#: ../tcosmonitor/extensions/info.py:274 +msgid "Total Ram: " +msgstr "RAM (total):" + +#: ../tcosmonitor/extensions/info.py:275 +msgid "Free RAM: " +msgstr "Memòria RAM lliure:" + +#: ../tcosmonitor/extensions/info.py:276 +msgid "Active RAM: " +msgstr "Memòria RAM activa:" + +#: ../tcosmonitor/extensions/info.py:279 +msgid "Swap info: " +msgstr "Informació sobre la memòria d'intercanvi:" + +#: ../tcosmonitor/extensions/info.py:285 +msgid "Swap enabled: " +msgstr "Memòria d'intercanvi activada:" + +#: ../tcosmonitor/extensions/info.py:286 +msgid "Total Swap: " +msgstr "Memòria d'intercanvi total:" + +#: ../tcosmonitor/extensions/info.py:287 +msgid "Used Swap: " +msgstr "Memòria d'intercanvi usada:" + +#: ../tcosmonitor/extensions/info.py:297 +msgid "Network info: " +msgstr "Informació de la xarxa:" + +#: ../tcosmonitor/extensions/info.py:307 +msgid "Network hostname: " +msgstr "Nom de l'equip" + +#: ../tcosmonitor/extensions/info.py:308 +msgid "Network IP: " +msgstr "Adreça IP:" + +#: ../tcosmonitor/extensions/info.py:309 +msgid "Network MASK: " +msgstr "Màscara de xarxa:" + +#: ../tcosmonitor/extensions/info.py:310 +msgid "Network MAC: " +msgstr "Adreça MAC:" + +#: ../tcosmonitor/extensions/info.py:311 +msgid "Data received(rx): " +msgstr "Dades rebudes(tx)" + +#: ../tcosmonitor/extensions/info.py:312 +msgid "Data send(tx): " +msgstr "Dades enviades(tx)" + +#: ../tcosmonitor/extensions/info.py:322 ../ui/tcosmonitor-prefwindow.ui:911 +msgid "Xorg info" +msgstr "Informació sobre Xorg" + +#: ../tcosmonitor/extensions/info.py:348 +msgid "enabled" +msgstr "activat" + +#: ../tcosmonitor/extensions/info.py:350 +msgid "disabled" +msgstr "desactivat" + +#: ../tcosmonitor/extensions/info.py:353 ../ui/tcospersonalize.ui:159 +msgid "X Session Type" +msgstr "Tipus de sessió X" + +#: ../tcosmonitor/extensions/info.py:355 ../ui/tcospersonalize.ui:201 +msgid "Xorg Driver" +msgstr "Driver de Xorg" + +#: ../tcosmonitor/extensions/info.py:357 ../ui/tcospersonalize.ui:94 +msgid "Xorg Resolution" +msgstr "Resolució de Xorg" + +#: ../tcosmonitor/extensions/info.py:359 ../ui/tcospersonalize.ui:133 +msgid "Xorg Color depth" +msgstr "Profunditat de color de Xorg" + +#: ../tcosmonitor/extensions/info.py:361 ../ui/tcospersonalize.ui:179 +msgid "DPMS energy monitor control" +msgstr "Control d'energia del monitor DPMS" + +#: ../tcosmonitor/extensions/info.py:363 +msgid "Disable kill X with Ctrl+Alt+Backspace" +msgstr "Desactivar interrupció de les X Ctrl+Alt+Backspace" + +#: ../tcosmonitor/extensions/info.py:365 ../ui/tcospersonalize.ui:57 +msgid "Enable mouse wheel" +msgstr "Activar la roda del ratolí" + +#: ../tcosmonitor/extensions/info.py:367 +msgid "Refresh rate" +msgstr "Freqüència de refresc" + +#: ../tcosmonitor/extensions/info.py:369 +msgid "Xorg font server" +msgstr "Servidor de tipus de lletra" + +#: ../tcosmonitor/extensions/info.py:371 +msgid "Mouse device" +msgstr "Ratolí" + +#: ../tcosmonitor/extensions/info.py:373 +msgid "Mouse protocol" +msgstr "Protocol del ratolí" + +#: ../tcosmonitor/extensions/info.py:375 ../ui/tcospersonalize.ui:273 +msgid "X Horiz sync" +msgstr "Sincronització horitzontal" + +#: ../tcosmonitor/extensions/info.py:377 ../ui/tcospersonalize.ui:284 +msgid "X Vert sync" +msgstr "Sincronització vertical" + +#: ../tcosmonitor/extensions/info.py:390 +msgid "PulseAudio Sound server is running" +msgstr "El servidor de so PulseAudio està en execució" + +#: ../tcosmonitor/extensions/info.py:408 +msgid "Remote Sound Mixer" +msgstr "Mesclador de so remot" + +#: ../tcosmonitor/extensions/info.py:480 +msgid "PulseAudio Control" +msgstr "Control de volum de PulseAudio" + +#: ../tcosmonitor/extensions/info.py:485 +msgid "PulseAudio Meter" +msgstr "Indicadors de PulseAudio" + +#: ../tcosmonitor/extensions/info.py:490 +msgid "PulseAudio Manager" +msgstr "Gestor de PulseAudio" + +#: ../tcosmonitor/extensions/info.py:494 +msgid "PulseAudio utils: " +msgstr "Ferramentes de PulseAudio" + +#: ../tcosmonitor/extensions/info.py:500 +msgid "PulseAudio stats" +msgstr "Estadístiques de PulseAudio" + +#: ../tcosmonitor/extensions/info.py:512 +msgid "Currently in use" +msgstr "Actualment en ús" + +#: ../tcosmonitor/extensions/info.py:513 +msgid "Allocated during whole lifetime" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:514 +msgid "Sample cache size" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:515 +msgid "User name" +msgstr "Usuari" + +#: ../tcosmonitor/extensions/info.py:516 +msgid "Host Name" +msgstr "Equip" + +#: ../tcosmonitor/extensions/info.py:517 +msgid "Server Name" +msgstr "Nom del servidor" + +#: ../tcosmonitor/extensions/info.py:518 +msgid "Server Version" +msgstr "Versió del servidor " + +#: ../tcosmonitor/extensions/info.py:519 +msgid "Default Sample Specification" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:520 +msgid "Default Sink" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:521 +msgid "Default Source" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:522 +msgid "Cookie" +msgstr "Galeta (cookie)" + +#: ../tcosmonitor/extensions/info.py:528 +msgid "Sound server is not running" +msgstr "El servidor de so no està en execució" + +#: ../tcosmonitor/extensions/info.py:589 ../tcosmonitor/extensions/info.py:597 +#: ../tcosmonitor/extensions/info.py:605 +msgid "PulseAudio apps need /dev/shm." +msgstr "El programes que usen PulseAudio necessiten /dev/shm." + +#: ../tcosmonitor/extensions/logout.py:48 +#: ../tcosmonitor/extensions/logout.py:71 +#, fuzzy +msgid "User not logged" +msgstr "No hi ha cap usuari connectat" + +#: ../tcosmonitor/extensions/logout.py:51 +#, fuzzy, python-format +msgid "Do you want to logout user: %s?" +msgstr "Voleu fer sortir l'usuari \"%s\"?" + +#: ../tcosmonitor/extensions/logout.py:55 +#: ../tcosmonitor/extensions/logout.py:77 +#, python-format +msgid "Session will close in %s seconds" +msgstr "La sessió es tancarà en %s segons" + +#: ../tcosmonitor/extensions/logout.py:73 +#, fuzzy, python-format +msgid "Do you want to logout the following users: %s?" +msgstr "Voleu fer sortir els usuaris següents:%s?" + +#: ../tcosmonitor/extensions/reboot.py:48 +#, fuzzy, python-format +msgid "Do you want to reboot: %s?" +msgstr "Voleu reiniciar %s?" + +#: ../tcosmonitor/extensions/reboot.py:51 +#: ../tcosmonitor/extensions/reboot.py:61 +#, python-format +msgid "Pc will reboot in %s seconds" +msgstr "L'ordinador es reiniciarà en %s segons" + +#: ../tcosmonitor/extensions/reboot.py:58 +#, fuzzy, python-format +msgid "Do you want to reboot the following clients: %s?" +msgstr "Voleu reiniciar els equips següents:%s?" + +#: ../tcosmonitor/extensions/reboot.py:67 +#, fuzzy, python-format +msgid "Do you want to poweroff: %s?" +msgstr "Voleu apagar %s?" + +#: ../tcosmonitor/extensions/reboot.py:70 +#: ../tcosmonitor/extensions/reboot.py:80 +#, python-format +msgid "Pc will shutdown in %s seconds" +msgstr "L'ordinador s'apagarà en %s segons" + +#: ../tcosmonitor/extensions/reboot.py:77 +#, fuzzy, python-format +msgid "Do you want to poweroff the following clients: %s?" +msgstr "Voleu apagar els equips següents:%s?" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:50 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:109 +msgid "Internet connection has been disabled" +msgstr "La connexió a Internet ha estat desactivada" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:54 +msgid "Can't disable internet, user is not logged" +msgstr "" +"No s'ha pogut desactivar la connexió a internet: no hi ha cap sessió " +"d'usuari oberta." + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:59 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:85 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:103 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:147 +#, python-format +msgid "" +"In order to lock and unlock internet you need to be in 'tcos' group.\n" +"\n" +"Exe by root: adduser %s tcos" +msgstr "" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:77 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:151 +msgid "Internet connection has been enabled" +msgstr "La connexió a Internet ha estat activada" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:81 +msgid "Can't enable internet, user is not logged" +msgstr "" +"No s'ha pogut activar la connexió a internet: no hi ha cap sessió d'usuari " +"oberta." + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:116 +#, fuzzy, python-format +msgid "Do you want disable internet to following users: %s?" +msgstr "Voleu desactivar internet per als usuaris següents:%s?" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:158 +#, fuzzy, python-format +msgid "Do you want enable internet to following users:%s?" +msgstr "Voleu activar internet per als usuaris següents:%s?" + +#: ../tcosmonitor/extensions/videolan.py:48 +#: ../tcosmonitor/extensions/videolan.py:49 +#, fuzzy +msgid "Send Audio/Video broadcast" +msgstr "Difusió de àudio/vídeo" + +#: ../tcosmonitor/extensions/videolan.py:65 +#: ../tcosmonitor/extensions/videolan.py:219 +msgid "Can't send video broadcast, user is not logged" +msgstr "No s'hi pot enviar vídeo: no hi ha cap usuari connectat" + +#: ../tcosmonitor/extensions/videolan.py:149 +#: ../tcosmonitor/extensions/videolan.py:347 +#: ../tcosmonitor/extensions/videolan.py:578 +#, python-format +msgid "" +"Not allowed white spaces in \"%s\".\n" +"Please rename it." +msgstr "" +"No hi pot haver espais en \"%s\".\n" +"Per favor, canvieu-li el nom." + +#: ../tcosmonitor/extensions/videolan.py:159 +#: ../tcosmonitor/extensions/videolan.py:359 +#: ../tcosmonitor/extensions/videolan.py:594 +msgid "Waiting for start video transmission..." +msgstr "Esperant l'inici de la transmissió de vídeo" + +#: ../tcosmonitor/extensions/videolan.py:167 +#: ../tcosmonitor/extensions/videolan.py:367 +#: ../tcosmonitor/extensions/videolan.py:602 +#: ../tcosmonitor/extensions/vnc.py:98 ../tcosmonitor/extensions/vnc.py:407 +msgid "Error while exec app" +msgstr "Error durant l'execució del programa" + +#: ../tcosmonitor/extensions/videolan.py:199 +#: ../tcosmonitor/extensions/videolan.py:393 +#: ../tcosmonitor/extensions/videolan.py:634 +msgid "Running in broadcast video transmission." +msgstr "Difusió de vídeo." + +#: ../tcosmonitor/extensions/videolan.py:208 +#: ../tcosmonitor/extensions/videolan.py:402 +#, fuzzy, python-format +msgid "" +"Running in broadcast video transmission to user %(host)s. Broadcast Nº %" +"(count)s" +msgstr "Difusió de vídeo per a %s" + +#: ../tcosmonitor/extensions/videolan.py:311 +#: ../tcosmonitor/extensions/videolan.py:541 +msgid "Select audio/video file.." +msgstr "Selecciona fitxer d'audio o de vídeo." + +#: ../tcosmonitor/extensions/videolan.py:314 +#: ../tcosmonitor/extensions/videolan.py:544 +msgid "Play DVD" +msgstr "Reprodueix un DVD" + +#: ../tcosmonitor/extensions/videolan.py:315 +#: ../tcosmonitor/extensions/videolan.py:545 +msgid "Play SVCD/VCD" +msgstr "Reprodueix un SVCD/VCD" + +#: ../tcosmonitor/extensions/videolan.py:316 +#: ../tcosmonitor/extensions/videolan.py:546 +msgid "Play AudioCD" +msgstr "Reprodueix un CD d'audio" + +#: ../tcosmonitor/extensions/videolan.py:361 +#: ../tcosmonitor/extensions/videolan.py:596 +msgid "" +"First select the DVD chapter or play movie\n" +"then press enter to send clients..." +msgstr "" +"Primer elegiu el capítol del DVD o reproduïu la pel·lícula\n" +"i, després, premeu ENTER per a fer l'enviament..." + +#: ../tcosmonitor/extensions/videolan.py:370 +msgid "Lock keyboard and mouse on client?" +msgstr "Voleu blocar el teclat i el ratolí del client?" + +#: ../tcosmonitor/extensions/videolan.py:444 +msgid "Video broadcast stopped." +msgstr "Retransmissió de vídeo aturada." + +#: ../tcosmonitor/extensions/videolan.py:605 +msgid "Lock keyboard and mouse on clients?" +msgstr "Blocar el teclat i el ratolí en els clients?" + +#: ../tcosmonitor/extensions/videolan.py:643 +#, fuzzy, python-format +msgid "Running in broadcast video transmission. Broadcast Nº %s" +msgstr "Difusió de vídeo." + +#: ../tcosmonitor/extensions/restartxorg.py:51 +#, python-format +msgid "Restart X session of %s with new config?" +msgstr "Voleu reiniciar la sessió X de l'equip %s amb la nova configuració?" + +#: ../tcosmonitor/extensions/restartxorg.py:64 +#, python-format +msgid "%s is not supported to restart Xorg!" +msgstr "" + +#: ../tcosmonitor/extensions/restartxorg.py:78 +msgid "No thin clients found." +msgstr "No s'ha trobat cap client" + +#: ../tcosmonitor/extensions/restartxorg.py:81 +#, python-format +msgid "Do you want to restart X screens (only thin clients):%s?" +msgstr "Voleu reiniciar les X (només dels clients lleugers):%s?" + +#: ../tcosmonitor/extensions/italc.py:51 ../tcosmonitor/extensions/vnc.py:135 +msgid "No user logged." +msgstr "No hi ha cap usuari connectat" + +#: ../tcosmonitor/extensions/italc.py:75 +msgid "Can't start IVS, please add iTALC support" +msgstr "" + +#: ../tcosmonitor/extensions/tcospersonalize.py:54 +#, python-format +msgid "%s is not supported to personalize!" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:71 +#, fuzzy, python-format +msgid "Do you want to start demo mode the following users: %s?" +msgstr "Vol iniciar la manera demostració als usuaris següents:%s?" + +#: ../tcosmonitor/extensions/vnc.py:83 +msgid "Waiting for start demo mode..." +msgstr "Esperant l'inici del mode demostració..." + +#: ../tcosmonitor/extensions/vnc.py:116 ../tcosmonitor/extensions/vnc.py:426 +#, python-format +msgid "Running in demo mode with %s clients." +msgstr "Mode demostració amb %s clients." + +#: ../tcosmonitor/extensions/vnc.py:127 +#, fuzzy, python-format +msgid "Running in demo mode from server. Demo Nº %s" +msgstr "Treballant en mode demostració des del servidor" + +#: ../tcosmonitor/extensions/vnc.py:149 ../tcosmonitor/extensions/vnc.py:369 +#, fuzzy, python-format +msgid "Connecting with %s to start VNC support" +msgstr "Connectant amb %s per obtenir informació..." + +#: ../tcosmonitor/extensions/vnc.py:178 +#, fuzzy, python-format +msgid "" +"Can't start VNC, error:\n" +"%s" +msgstr "Ha estat impossible fer la captura, error: %s" + +#: ../tcosmonitor/extensions/vnc.py:182 +#, fuzzy +msgid "Waiting for start of VNC server..." +msgstr "Esperant l'inici del mode demostració..." + +#: ../tcosmonitor/extensions/vnc.py:211 +msgid "Can't start VNC, please add X11VNC support" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:237 +msgid "Switch to view only" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:242 ../tcosmonitor/extensions/vnc.py:273 +#, fuzzy +msgid "Switch to full control" +msgstr "Accions controlades" + +#: ../tcosmonitor/extensions/vnc.py:269 +#, python-format +msgid "VNC host %s" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:281 +msgid "Switch to fullscreen" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:290 +#: ../tcosmonitor/extensions/livevnc.py:72 +#: ../tcosmonitor/TcosPreferences.py:539 ../tcosmonitor/TcosExtensions.py:338 +msgid "Stop" +msgstr "Stop" + +#: ../tcosmonitor/extensions/vnc.py:342 +msgid "Can't start demo mode, user is not logged" +msgstr "No es pot començar el mode demostració: l'usuari no està connectat." + +#: ../tcosmonitor/extensions/vnc.py:345 +#, fuzzy, python-format +msgid "Do you want demo mode from user %s?" +msgstr "Voleu entrar en mode demostració des de l'equip %s?" + +#: ../tcosmonitor/extensions/vnc.py:392 +#, fuzzy, python-format +msgid "Waiting for start demo mode from user %s..." +msgstr "Esperant l'inici del mode demo des de %s..." + +#: ../tcosmonitor/extensions/vnc.py:446 +#, fuzzy, python-format +msgid "Running in demo mode from user %(host)s. Demo Nº %(count)s" +msgstr "Mode demostració des de %s" + +#: ../tcosmonitor/extensions/vnc.py:501 +msgid "Demo mode off." +msgstr "Demo mode off." + +#: ../tcosmonitor/extensions/wakeonlan.py:50 +#: ../tcosmonitor/extensions/wakeonlan.py:75 +msgid "" +"Wake On Lan only works with static list.\n" +"\n" +"Enable scan method \"static\" in Preferences\n" +"and (wake on lan) support in bios of clients." +msgstr "" + +#: ../tcosmonitor/extensions/wakeonlan.py:54 +#, python-format +msgid "Do you want boot %s client?" +msgstr "Voleu iniciar %s?" + +#: ../tcosmonitor/extensions/wakeonlan.py:67 +#: ../tcosmonitor/extensions/wakeonlan.py:91 +#, fuzzy, python-format +msgid "No register MAC address for ip: \"%s\"" +msgstr "L'adreça MAC no és vàlida: \"%s\"" + +#: ../tcosmonitor/extensions/wakeonlan.py:71 +#: ../tcosmonitor/extensions/wakeonlan.py:98 +#, python-format +msgid "Not valid MAC address: \"%s\"" +msgstr "L'adreça MAC no és vàlida: \"%s\"" + +#: ../tcosmonitor/extensions/wakeonlan.py:79 +msgid "Do you want boot all clients?" +msgstr "Voleu iniciar tots els clients?" + +#: ../tcosmonitor/extensions/livevnc.py:76 +#, fuzzy +msgid "Live view of all hosts" +msgstr "Captures de pantalla de tots els equips" + +#: ../tcosmonitor/extensions/livevnc.py:194 +msgid "Running in LiveView mode" +msgstr "" + +#: ../tcosmonitor/extensions/viewproc.py:48 +msgid "Can't show runnings apps, user is not logged" +msgstr "" +"No s'han pogut mostrar els programes en execució: no hi ha cap sessió " +"d'usuari oberta." + +#: ../tcosmonitor/extensions/viewproc.py:58 +msgid "User not connected, no processes." +msgstr "No hi cap usuari, per tant, no hi ha processos." + +#: ../tcosmonitor/extensions/viewproc.py:76 +#, python-format +msgid "Running processes for user \"%s\": " +msgstr "Processos en execució de l'usuari \"%s\":" + +#: ../tcosmonitor/extensions/viewproc.py:80 +msgid "" +"ALERT: There are some system process hidden. Enable it in Preferences dialog." +msgstr "" + +#: ../tcosmonitor/extensions/viewproc.py:85 +msgid "Pid" +msgstr "PID" + +#: ../tcosmonitor/extensions/viewproc.py:86 +#, fuzzy +msgid "Process command" +msgstr "Informació dels processos" + +#: ../tcosmonitor/extensions/viewproc.py:91 +msgid "Kill this process" +msgstr "Finalitza aquest procés" + +#: ../tcosmonitor/extensions/viewproc.py:127 +msgid "Are you sure you want to stop this process?" +msgstr "Esteu segur/a de voler aturar el procés?" + +#: ../tcosmonitor/extensions/viewproc.py:136 +#, python-format +msgid "" +"Error while killing app:\n" +"Reason: %s" +msgstr "" +"Error en el tancament de l'aplicació:\n" +"Motiu: %s" + +#: ../tcosmonitor/extensions/audiortp.py:49 +#: ../ui/tcosmonitor-mainwindow.ui:163 +#, fuzzy +msgid "Send audio conference" +msgstr "Mode audioconferència" + +#: ../tcosmonitor/extensions/audiortp.py:50 +#: ../ui/tcosmonitor-prefwindow.ui:1507 +#, fuzzy +msgid "Audio chat conference" +msgstr "Mode audioconferència" + +#: ../tcosmonitor/extensions/audiortp.py:51 +#: ../ui/tcosmonitor-mainwindow.ui:275 +msgid "Audio chat list" +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:52 +#, fuzzy +msgid "Send audio conference (from this host)" +msgstr "Mode demostració (des d'aquest equip)" + +#: ../tcosmonitor/extensions/audiortp.py:73 +msgid "Emission" +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:79 +#, fuzzy +msgid "State" +msgstr "Desa" + +#: ../tcosmonitor/extensions/audiortp.py:83 +#, fuzzy +msgid "Channel" +msgstr "Anul·la" + +#: ../tcosmonitor/extensions/audiortp.py:235 +#: ../tcosmonitor/extensions/audiortp.py:322 +#: ../tcosmonitor/extensions/audiortp.py:413 +msgid "" +"Your pulseaudio server is too old.\n" +"Is required pulseaudio version >= 0.9.10" +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:238 +#, fuzzy, python-format +msgid "Do you want to start audio conference to the following users: %s?" +msgstr "Vol iniciar la manera conferència als usuaris següents:%s?" + +#: ../tcosmonitor/extensions/audiortp.py:243 +#, fuzzy +msgid "You have entered in audio conference" +msgstr "Mode audioconferència" + +#: ../tcosmonitor/extensions/audiortp.py:267 +#, fuzzy +msgid "Waiting for start audio conference..." +msgstr "Esperant l'inici del mode conferència..." + +#: ../tcosmonitor/extensions/audiortp.py:295 +#: ../tcosmonitor/extensions/audiortp.py:390 +#, fuzzy, python-format +msgid "Running in audio conference with %s clients." +msgstr "Mode demostració amb %s clients." + +#: ../tcosmonitor/extensions/audiortp.py:305 +#, fuzzy, python-format +msgid "Running in audio conference from server. Conference Nº %s" +msgstr "Treballant en mode demostració des del servidor" + +#: ../tcosmonitor/extensions/audiortp.py:316 +#, fuzzy +msgid "Can't start conference mode, user is not logged" +msgstr "No es pot començar el mode demostració: l'usuari no està connectat." + +#: ../tcosmonitor/extensions/audiortp.py:325 +#, fuzzy, python-format +msgid "Do you want audio conference from user %s?" +msgstr "Voleu entrar en mode demostració des de l'equip %s?" + +#: ../tcosmonitor/extensions/audiortp.py:331 +#, fuzzy, python-format +msgid "You have entered in audio conference from user %s" +msgstr "Voleu entrar en mode demostració des de l'equip %s?" + +#: ../tcosmonitor/extensions/audiortp.py:359 +#, fuzzy, python-format +msgid "Waiting for start audio conference from user %s..." +msgstr "Esperant l'inici del mode demo des de %s..." + +#: ../tcosmonitor/extensions/audiortp.py:400 +#, fuzzy, python-format +msgid "Running in audio conference from user %(host)s. Conference Nº %(count)s" +msgstr "Treballant en mode demostració des del servidor" + +#: ../tcosmonitor/extensions/audiortp.py:416 +#, fuzzy, python-format +msgid "Do you want to start audio chat conference to the following users: %s?" +msgstr "Vol iniciar la manera conferència als usuaris següents:%s?" + +#: ../tcosmonitor/extensions/audiortp.py:421 +#, fuzzy, python-format +msgid "You have entered in audio chat conference. Participants: %s" +msgstr "Voleu entrar en mode demostració des de l'equip %s?" + +#: ../tcosmonitor/extensions/audiortp.py:443 +#, fuzzy +msgid "Waiting for start audio chat conference..." +msgstr "Esperant l'inici del mode conferència..." + +#: ../tcosmonitor/extensions/audiortp.py:449 +#, fuzzy +msgid "Do you want to connect to this audio chat conference now?" +msgstr "Vol iniciar la manera conferència als usuaris següents:%s?" + +#: ../tcosmonitor/extensions/audiortp.py:483 +#, fuzzy, python-format +msgid "Running in audio chat conference with %s clients." +msgstr "Mode demostració amb %s clients." + +#: ../tcosmonitor/extensions/audiortp.py:495 +#, fuzzy, python-format +msgid "Running in audio chat conference. Conference Nº %s" +msgstr "Treballant en mode demostració des del servidor" + +#: ../tcosmonitor/extensions/audiortp.py:521 +msgid "Conference mode off." +msgstr "Mode conferència desactivat." + +#: ../tcosmonitor/extensions/audiortp.py:540 +#, fuzzy +msgid "Audio chat conference off." +msgstr "Mode audioconferència" + +#: ../tcosmonitor/TcosXmlRpc.py:85 +msgid "" +"Username or password are empty,\n" +"please edit in preferences dialog!" +msgstr "" +"Nom d'usuari o contrasenya buits,\n" +"modifiqueu-ho, per favor, en preferències!" + +#: ../tcosmonitor/TcosIconView.py:55 +msgid "Place mouse on any computer to see brief info about it." +msgstr "" + +#: ../tcosmonitor/TcosListView.py:82 +msgid "Active" +msgstr "Actiu" + +#: ../tcosmonitor/TcosListView.py:92 +msgid "Screen Blocked" +msgstr "Blocada" + +#: ../tcosmonitor/TcosListView.py:97 +msgid "Num of process" +msgstr "Nre de processos" + +#: ../tcosmonitor/TcosListView.py:112 +msgid "Sel" +msgstr "Sel" + +#: ../tcosmonitor/TcosListView.py:148 +#, python-format +msgid "Error connecting to tcosxmlrpc in %s" +msgstr "Error en la connexió a tcosxmlrpc en %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:154 +#, fuzzy, python-format +msgid "Floppy: %s" +msgstr "Disquet" + +#: ../tcosmonitor/TcosTrayIcon2.py:156 +#, fuzzy, python-format +msgid "CDROM: %s" +msgstr "ERROR: %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:158 +#, fuzzy, python-format +msgid "USB: %s" +msgstr "Dispositiu USB %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:160 +#, fuzzy, python-format +msgid "HDD partition: %s" +msgstr "Partició %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:162 +#, fuzzy, python-format +msgid "Unknow: %s" +msgstr "desconegut" + +#: ../tcosmonitor/Initialize.py:217 +msgid "GPL-2 license file not found" +msgstr "No s" + +#: ../tcosmonitor/LocalData.py:212 +#, python-format +msgid "Selected network inteface (%s) don't have IP address" +msgstr "La interfície de xarxa (%s) no té cap adreça IP" + +#: ../tcosmonitor/LocalData.py:260 ../tcosmonitor/ping.py:108 +#: ../tcosmonitor/ping.py:171 +msgid "Testing if found clients have 8998 or 8999 port open..." +msgstr "" +"Comprovant si els clients que s'han trobat tenen el port 8998 o 8999 obert..." + +#: ../tcosmonitor/LocalData.py:282 +msgid "" +"Static list method configured but no hosts in list.\n" +"\n" +"Please, open preferences, click on 'Open Static Host list' and add some " +"hosts." +msgstr "" +"Heu configurat el sistema per a usar el mètode de llista estàtica, però no " +"hi ha cap equip en la llista.\n" +"Per favor, aneu a preferències, feu clic sobre \"Obre llista estàtica " +"d'equips i afegiu-n'hi algun." + +#: ../tcosmonitor/TcosPreferences.py:264 +msgid "" +"You have select more than 5 button menus.\n" +"Only allowed to select a maximum of 5 buttons." +msgstr "" + +#: ../tcosmonitor/TcosPreferences.py:275 +msgid "New settings saved." +msgstr "S'ha desat la configuració." + +#: ../tcosmonitor/TcosMenus.py:102 ../tcosmonitor/TcosMenus.py:114 +#, python-format +msgid "Actions for %s" +msgstr "Accions per a %s" + +#: ../tcosmonitor/TcosMenus.py:107 +msgid "Actions for selected host" +msgstr "Accions per a l'ordinador seleccionat" + +#: ../tcosmonitor/TcosMenus.py:168 ../tcosmonitor/TcosMenus.py:299 +#, python-format +msgid "%d hidden actions" +msgstr "" + +#: ../tcosmonitor/TcosMenus.py:243 ../tcosmonitor/TcosMenus.py:245 +msgid "Actions for selected hosts" +msgstr "Accions per als ordinadors seleccionats" + +#: ../tcosmonitor/TcosMenus.py:247 +msgid "Actions for all hosts" +msgstr "Accions per a tots els ordinadors" + +#: ../tcosmonitor/TcosMenus.py:304 +msgid "Save hosts positions" +msgstr "" + +#: ../tcosmonitor/TcosMenus.py:312 +msgid "Reset hosts positions" +msgstr "" + +#: ../tcosmonitor/ping.py:80 +#, python-format +msgid "Ping to %s..." +msgstr "Ping a %s..." + +#: ../tcosmonitor/ping.py:89 +msgid "Waiting for pings..." +msgstr "Esperant pings..." + +#: ../tcosmonitor/ping.py:127 ../tcosmonitor/ping.py:192 +#: ../tcosmonitor/TcosActions.py:185 ../tcosmonitor/TcosActions.py:264 +msgid "Not connected hosts found." +msgstr "No s'ha trobat cap equip." + +#: ../tcosmonitor/ping.py:134 ../tcosmonitor/ping.py:197 +#: ../tcosmonitor/TcosActions.py:187 ../tcosmonitor/TcosActions.py:259 +#, python-format +msgid "Found %d hosts" +msgstr "S'han trobat %d equips" + +#: ../tcosmonitor/TcosActions.py:162 ../tcosmonitor/TcosActions.py:241 +msgid "Searching for connected hosts..." +msgstr "Buscant equips connectats..." + +#: ../tcosmonitor/TcosActions.py:1019 +msgid "Searching info of hosts..." +msgstr "Cercant informació sobre els equips..." + +#: ../tcosmonitor/TcosActions.py:1058 +#, python-format +msgid "Connecting to %s..." +msgstr "Connectant amb %s..." + +#: ../tcosmonitor/TcosExtensions.py:41 +msgid "Exception:" +msgstr "" + +#: ../tcosmonitor/TcosExtensions.py:77 +msgid "Error: no IP!" +msgstr "" + +#: ../tcosmonitor/TcosExtensions.py:154 +msgid "No clients connected, press refresh button." +msgstr "No consta cap equip connectat: feu clic en 'refrescar'." + +#: ../tcosmonitor/TcosExtensions.py:251 ../tcosmonitor/TcosExtensions.py:253 +#, fuzzy, python-format +msgid "Can't exec this action at '%s' because you are connected at this host!" +msgstr "" +"No s'ha pogut executar l'ordre perquè no hi ha connexió amb aquest equip!" + +#: ../tcosmonitor/TcosExtensions.py:267 +#, python-format +msgid "Doing action \"%(action)s\" in %(ip)s..." +msgstr "" + +#: ../tcosmonitor/TcosExtensions.py:285 +#, python-format +msgid "Done action \"%(action)s\" in %(ip)s" +msgstr "" + +#: ../tcosmonitor/TcosCommon.py:89 +#, python-format +msgid "" +"ThreadController: Found error executing %(cmd)s\n" +"\n" +"If problem persist, disable Thread Controller\n" +"in Preferences and report bug.\n" +"Error=%(error)s" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:35 ../ui/tcospersonalize.ui:7 +#: ../ui/tcosmonitor-mainwindow.ui:36 +msgid "Preferences" +msgstr "Preferències" + +#: ../ui/tcosmonitor-prefwindow.ui:62 +msgid "Show host list on startup" +msgstr "Mostra la llista d'equips a l'inici" + +#: ../ui/tcosmonitor-prefwindow.ui:80 +msgid "Scan network method" +msgstr "Mètode de escanejat de la xarxa" + +#: ../ui/tcosmonitor-prefwindow.ui:91 +msgid "" +"Network interface\n" +"(thin client)" +msgstr "" +"Interfície de xarxa\n" +"(client)" + +#: ../ui/tcosmonitor-prefwindow.ui:127 +msgid "Show system process" +msgstr "Mostra processos del sistema" + +#: ../ui/tcosmonitor-prefwindow.ui:144 +#, fuzzy +msgid "Don't do actions when running TcosMonitor in thin client" +msgstr "No duu a terme accions quan TcosMonitor s'executa en un client" + +#: ../ui/tcosmonitor-prefwindow.ui:163 +msgid "List of hosts" +msgstr "Llista d'equips" + +#: ../ui/tcosmonitor-prefwindow.ui:200 +msgid "Open static host list" +msgstr "Obre llista fixa d'equips" + +#: ../ui/tcosmonitor-prefwindow.ui:225 +msgid "Only show hosts running tcosxmlrpc (8998 port)" +msgstr "Mostra només els equips que executen tcosxmlrpc (port 8080)" + +#: ../ui/tcosmonitor-prefwindow.ui:242 +#, fuzzy +msgid "Only do all actions on selected hosts (requires restart TcosMonitor)" +msgstr "" +"Executa accions només en els equips selecionats (cal reiniciar TcosMonitor)" + +#: ../ui/tcosmonitor-prefwindow.ui:259 +msgid "Enable SSL connections to XMLRPC clients" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:278 +#, fuzzy +msgid "Host list mode" +msgstr "Equip" + +#: ../ui/tcosmonitor-prefwindow.ui:302 +msgid "Show right menu with groups (NEW)" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:319 +#, fuzzy +msgid "Don't show thin client if TcosMonitor is running there" +msgstr "No duu a terme accions quan TcosMonitor s'executa en un client" + +#: ../ui/tcosmonitor-prefwindow.ui:351 +msgid "Settings" +msgstr "Configuració" + +#: ../ui/tcosmonitor-prefwindow.ui:376 +msgid "Update host list every (seg)" +msgstr "Actualitza la llista d'equips cada (segons)" + +#: ../ui/tcosmonitor-prefwindow.ui:389 +msgid "" +"Update host list every selected seconds.\n" +"\n" +"Value=0 disable update." +msgstr "" +"Actualitza la llista d'equips amb el període indicat.\n" +"\n" +"Valor=0 desactiva l'actualització." + +#: ../ui/tcosmonitor-prefwindow.ui:405 +msgid "Cache timeout (seg)" +msgstr "Temps de vida en la memòria cau (segons)" + +#: ../ui/tcosmonitor-prefwindow.ui:419 +msgid "" +"Cache some data and connection status during selected seconds.\n" +"\n" +"Value=0 disable cache." +msgstr "" +"Conservar dades i status de connexió durant el temps indicat (segons)\n" +"Valor=0 desactiva la memòria cau" + +#: ../ui/tcosmonitor-prefwindow.ui:437 +msgid "Screenshot size:" +msgstr "Dimensions de la captura de pantalla:" + +#: ../ui/tcosmonitor-prefwindow.ui:450 ../ui/tcosmonitor-prefwindow.ui:479 +msgid "% Size of screnshot." +msgstr "% Dimensions de la captura de pantalla." + +#: ../ui/tcosmonitor-prefwindow.ui:466 +msgid "Mini screenshot size:" +msgstr "Mini captures de pantalla:" + +#: ../ui/tcosmonitor-prefwindow.ui:495 +msgid "Timeout actions (seg)" +msgstr "Temps de vida en les accions (segons)" + +#: ../ui/tcosmonitor-prefwindow.ui:508 +msgid "" +"Timeout in seg for actions\n" +"\n" +"Value=0 default" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:526 +msgid "SSH remote username" +msgstr "Nom d'usuari remot per a SSH" + +#: ../ui/tcosmonitor-prefwindow.ui:553 +msgid "VLC method to send" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:578 +msgid "" +"<b>Experimental: Thread Controller</b>\n" +"( if you have problems, disable it )" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:591 +msgid "Actions controlled" +msgstr "Accions controlades" + +#: ../ui/tcosmonitor-prefwindow.ui:611 +msgid "Block ports: (80,8080... etc)" +msgstr "Bloca ports: (80, 8080, etc.)" + +#: ../ui/tcosmonitor-prefwindow.ui:653 ../ui/tcospersonalize.ui:333 +msgid "Advanced" +msgstr "Avançat" + +#: ../ui/tcosmonitor-prefwindow.ui:680 +msgid "TcosXmlRpc username" +msgstr "Nom d'usuari per a TcosXmlRpc" + +#: ../ui/tcosmonitor-prefwindow.ui:706 +msgid "TcosXmlRpc password" +msgstr "Contrasenya per a TcosXmlRpc" + +#: ../ui/tcosmonitor-prefwindow.ui:735 +msgid "" +"<b>NOTE:</b>\n" +"Default user is <b>root</b> and default password is <b>root</b>.\n" +"\n" +"For <u>thin clients</u> change TCOS_ROOT_PASSWD or use TcosConfig and " +"regenerate boot images again.\n" +"\n" +"For <u>standalone</u> users you can use a system account (root) but this is " +"not recomended. Install tcos-standalone and start it by root. Set user and " +"password, this will create a <b>/etc/tcospasswd</b> file only used by TCOS " +"and your root acount will be secure." +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:772 +msgid "Authentication " +msgstr "Autenticació " + +#: ../ui/tcosmonitor-prefwindow.ui:795 +msgid "<b>Info avalaible from tcosxmlrpc</b>" +msgstr "<b>Informació disponible de tcosxmlrpc</b>" + +#: ../ui/tcosmonitor-prefwindow.ui:806 +msgid "Tcos general info" +msgstr "Informació general de Tcos" + +#: ../ui/tcosmonitor-prefwindow.ui:821 +msgid "Cpu info" +msgstr "Informació de la CPU" + +#: ../ui/tcosmonitor-prefwindow.ui:836 +msgid "Kernel and modules info" +msgstr "Informació del nucli i dels mòduls" + +#: ../ui/tcosmonitor-prefwindow.ui:851 +msgid "PCI bus info" +msgstr "Informació del bus PCI" + +#: ../ui/tcosmonitor-prefwindow.ui:866 +msgid "Ram and swap info" +msgstr "Informació de la RAM i la memòria d'intercanvi" + +#: ../ui/tcosmonitor-prefwindow.ui:881 +msgid "Process info" +msgstr "Informació dels processos" + +#: ../ui/tcosmonitor-prefwindow.ui:896 +msgid "Network info" +msgstr "Informació de la xarxa" + +#: ../ui/tcosmonitor-prefwindow.ui:926 +msgid "Sound server info" +msgstr "Informació del servidor de so" + +#: ../ui/tcosmonitor-prefwindow.ui:962 +msgid "Avalaible info" +msgstr "Informació disponible" + +#: ../ui/tcosmonitor-prefwindow.ui:985 +msgid "<b>Show / hide menu items</b>" +msgstr "<b>Mostra / oculta elements al menú</b>" + +#: ../ui/tcosmonitor-prefwindow.ui:1003 +msgid "Lock and unlock screen" +msgstr "Blocar i desblocar les pantalles" + +#: ../ui/tcosmonitor-prefwindow.ui:1019 +msgid "Remote SSH shell" +msgstr "Shell SSH remota" + +#: ../ui/tcosmonitor-prefwindow.ui:1037 +msgid "Configure Xorg settings" +msgstr "Configurar Xorg" + +#: ../ui/tcosmonitor-prefwindow.ui:1066 ../ui/tcosmonitor-prefwindow.ui:1427 +msgid "Exe app on user display" +msgstr "Executa programa en la pantalla de l'usuari" + +#: ../ui/tcosmonitor-prefwindow.ui:1082 ../ui/tcosmonitor-prefwindow.ui:1441 +msgid "Send a text message" +msgstr "Enviar missatges de text" + +#: ../ui/tcosmonitor-prefwindow.ui:1100 +msgid "Show running apps" +msgstr "Mostra els programes que s'executen en aquest client" + +#: ../ui/tcosmonitor-prefwindow.ui:1116 ../ui/tcosmonitor-prefwindow.ui:1457 +msgid "Send video broadcast" +msgstr "Enviar vídeo" + +#: ../ui/tcosmonitor-prefwindow.ui:1150 +msgid "Demo mode" +msgstr "Mode demostració" + +#: ../ui/tcosmonitor-prefwindow.ui:1179 +msgid "Wake on LAN" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:1195 +msgid "Audio conference mode" +msgstr "Mode audioconferència" + +#: ../ui/tcosmonitor-prefwindow.ui:1213 +msgid "Screenshots" +msgstr "Captura de pantalla" + +#: ../ui/tcosmonitor-prefwindow.ui:1229 +msgid "Reboot and poweroff" +msgstr "Reiniciar i apagar" + +#: ../ui/tcosmonitor-prefwindow.ui:1243 +msgid "Lock and unlock internet" +msgstr "Activar i desactivar la connexió a Internet" + +#: ../ui/tcosmonitor-prefwindow.ui:1259 +#, fuzzy +msgid "DPMS monitor on/off" +msgstr "Control d'energia del monitor DPMS" + +#: ../ui/tcosmonitor-prefwindow.ui:1277 +msgid "Connect using VNC" +msgstr "Connectar per VNC" + +#: ../ui/tcosmonitor-prefwindow.ui:1293 +msgid "Connect using iTALC" +msgstr "Connectar per iTALC" + +#: ../ui/tcosmonitor-prefwindow.ui:1308 +msgid "Restart session with new settings" +msgstr "Reiniciar la sessió amb la nova configuració" + +#: ../ui/tcosmonitor-prefwindow.ui:1385 +msgid "Menus" +msgstr "Menús" + +#: ../ui/tcosmonitor-prefwindow.ui:1408 +#, fuzzy +msgid "<b>Show / hide menu buttons</b>" +msgstr "<b>Mostra / oculta elements al menú</b>" + +#: ../ui/tcosmonitor-prefwindow.ui:1491 +#, fuzzy +msgid "Audio conference" +msgstr "Mode audioconferència" + +#: ../ui/tcosmonitor-prefwindow.ui:1525 +#, fuzzy +msgid "Audio Chat control" +msgstr "Control de volum de PulseAudio" + +#: ../ui/tcosmonitor-prefwindow.ui:1569 +msgid "Menu buttons" +msgstr "" + +#: ../ui/tcosmonitor-abouttcos.ui:6 +msgid "About TCOS" +msgstr "Quant a TCOS" + +#: ../ui/tcosmonitor-abouttcos.ui:19 +msgid "<span size=\"xx-large\">TcosMonitor</span>" +msgstr "<span size=\"x-large\">TcosMonitor</span>" + +#: ../ui/tcosmonitor-abouttcos.ui:62 +msgid "<b>Version:</b>" +msgstr "<b>Versió:</b>" + +#: ../ui/tcosmonitor-abouttcos.ui:90 +msgid "" +"Thin client and standalone\n" +"monitoring tool." +msgstr "" +"Programa de monitorització\n" +" de clients lleugers i d'ordinadors autònoms." + +#: ../ui/tcosmonitor-abouttcos.ui:131 +msgid "Project web site" +msgstr "Pàgina del projecte" + +#: ../ui/tcosmonitor-abouttcos.ui:178 +msgid "About" +msgstr "Quant a..." + +#: ../ui/tcosmonitor-abouttcos.ui:212 +msgid "License" +msgstr "Llicència" + +#: ../ui/tcosmonitor-abouttcos.ui:230 +msgid "" +"Main developers:\n" +" * Mario Izquierdo <mariodebian at gmail.com>\n" +" * Ignacio Vidal <vidal_joshur at gva.es>\n" +"\n" +"Contributors:\n" +" * Andrés Jimenez\n" +" * Quirón\n" +"\n" +"Special thanks to:\n" +" Comunidad de Madrid, MaX group (Spain)" +msgstr "" +"Desenvolupadors principals:\n" +" * Mario Izquierdo <mariodebian at gmail.com>\n" +" * Ignacio Vidal <vidal_joshur at gva.es>\n" +"\n" +"Contribuïdors:\n" +" * Andrés Jimenez\n" +" * Quirón\n" +"\n" +"Agraïments especials a:\n" +" Comunidad de Madrid, MaX group (Spain)" + +#: ../ui/tcosmonitor-abouttcos.ui:259 +msgid "Authors" +msgstr "Autors" + +#: ../ui/tcosmonitor-abouttcos.ui:275 +msgid "Translated to your language by:" +msgstr "Traduït al català per:" + +#: ../ui/tcosmonitor-abouttcos.ui:287 +msgid "Mario Izquierdo <mariodebian@gmail.com>" +msgstr "Carles Sadurní <blat@puntnet.org>" + +#: ../ui/tcosmonitor-abouttcos.ui:307 +msgid "Translators" +msgstr "Traductors" + +#: ../ui/tcosmonitor-abouttcos.ui:324 +msgid "" +"TCOS is a free software project that need a lot of work to be the best thin " +"client plataform.\n" +"\n" +"We work every day a lot of hours to make changes and support more devices " +"and features.\n" +"\n" +"We want to continue developing this software but need your help, if you use, " +"sell or hack TCOS pehaps you could donate some money to project.\n" +"\n" +"Click on next url to get some info." +msgstr "" +"TCOS és un projecte de software lliure que requereix molta dedicació per a " +"ser la millor plataforma de clients lleugers.\n" +"\n" +"Treballem cada dia moltes hores per a fer canvis, afegir noves " +"característiques i donar suport a nous dispositius.\n" +"\n" +"Volem continuar desenvolupant aquest programa, però ens cal la vostra ajuda. " +"Si useu, veneu o modifiqueu TCOS potser podríeu fer una donació al " +"projecte.\n" +"\n" +"Feu clic en l'adreça següent si en voleu més informació." + +#: ../ui/tcosmonitor-abouttcos.ui:370 +msgid "<u>http://wiki.tcosproject.org/TcosProject:Site_support</u>" +msgstr "" + +#: ../ui/tcosmonitor-abouttcos.ui:392 +msgid "Don't show donations message on start." +msgstr "No mostrar els missatges de sol·licitud de donacions." + +#: ../ui/tcosmonitor-abouttcos.ui:415 +msgid "Donate" +msgstr "Donacions" + +#: ../ui/tray.ui:20 +msgid "<big><b>TCOS devices</b></big>" +msgstr "" + +#: ../ui/tray.ui:57 +msgid "Hide" +msgstr "" + +#: ../ui/tcos-volume-manager.ui:39 +msgid "Restart sound" +msgstr "" + +#: ../ui/tcos-volume-manager.ui:54 +msgid "Sound levels" +msgstr "Nivells d'audio" + +#: ../ui/tcos-volume-manager.ui:90 +msgid "Main Channels" +msgstr "Canals principals" + +#: ../ui/tcos-volume-manager.ui:113 +msgid "Secondary Channels" +msgstr "Canals secundaris" + +#: ../ui/tcosmonitor-chatwindow.ui:8 +msgid "Chat emission list" +msgstr "" + +#: ../ui/tcosmonitor-chatwindow.ui:17 +#, fuzzy +msgid "<span size=\"x-large\">Chat emission list</span>" +msgstr "<span size=\"x-large\">Llista d'equips</span>" + +#: ../ui/tcosmonitor-chatwindow.ui:80 +msgid "Connect" +msgstr "" + +#: ../ui/tcosmonitor-chatwindow.ui:128 +msgid "Disconnect" +msgstr "" + +#: ../ui/tcosmonitor-chatwindow.ui:176 +#, fuzzy +msgid "Exit" +msgstr "Eixint" + +#: ../ui/tcosmonitor-staticwindow.ui:8 +msgid "Static hosts list" +msgstr "Llista d'equips" + +#: ../ui/tcosmonitor-staticwindow.ui:17 +msgid "<span size=\"x-large\">Static Hosts list</span>" +msgstr "<span size=\"x-large\">Llista d'equips</span>" + +#: ../ui/tcosmonitor-staticwindow.ui:80 +msgid "Add" +msgstr "Afegeix" + +#: ../ui/tcosmonitor-staticwindow.ui:128 +msgid "Modify" +msgstr "Modifica" + +#: ../ui/tcosmonitor-staticwindow.ui:176 +msgid "Delete" +msgstr "Elimina" + +#: ../ui/tcosmonitor-staticwindow.ui:225 +msgid "Get from connected" +msgstr "" + +#: ../ui/tcosmonitor-staticwindow.ui:292 ../ui/tcosmonitor-mainwindow.ui:771 +#: ../ui/tcosmonitor-staticwindownew.ui:150 +msgid "Cancel" +msgstr "Anul·la" + +#: ../ui/tcosmonitor-staticwindow.ui:340 +#: ../ui/tcosmonitor-staticwindownew.ui:198 +msgid "Save" +msgstr "Desa" + +#: ../ui/tcospersonalize.ui:34 +msgid "<b>unknow host</b>" +msgstr "<b>equip desconegut</b>" + +#: ../ui/tcospersonalize.ui:74 +msgid "Disable Ctrl + Alt + Backspace (for kill Xorg)" +msgstr "Desactivar Ctrl + Alt + Backspace (per a tancar Xorg)" + +#: ../ui/tcospersonalize.ui:211 +msgid "Get avalaible drivers" +msgstr "Obtín els drivers disponibles" + +#: ../ui/tcospersonalize.ui:248 +msgid "Display Settings" +msgstr "Configuració gràfica" + +#: ../ui/tcospersonalize.ui:351 +msgid "Default boot kernel" +msgstr "" + +#: ../ui/tcospersonalize.ui:376 +msgid "<b>PXE Boot options</b>" +msgstr "" + +#: ../ui/tcospersonalize.ui:391 +msgid "Default boot method" +msgstr "" + +#: ../ui/tcospersonalize.ui:419 +msgid "Command line" +msgstr "" + +#: ../ui/tcospersonalize.ui:507 +msgid "Boot options" +msgstr "" + +#: ../ui/tcospersonalize.ui:551 +msgid "Delete Config" +msgstr "Elimina configuració" + +#: ../ui/tcosmonitor-mainwindow.ui:8 +msgid "TcosMonitor" +msgstr "TcosMonitor" + +#: ../ui/tcosmonitor-mainwindow.ui:22 +msgid "Exit TcosMonitor" +msgstr "Ix de TcosMonitor" + +#: ../ui/tcosmonitor-mainwindow.ui:35 +msgid "Open preferences dialog" +msgstr "Obre preferències" + +#: ../ui/tcosmonitor-mainwindow.ui:48 +msgid "Update host list" +msgstr "Actualitzar la llista d'equips" + +#: ../ui/tcosmonitor-mainwindow.ui:49 +msgid "Refresh" +msgstr "Actualitza" + +#: ../ui/tcosmonitor-mainwindow.ui:71 +msgid "All Hosts" +msgstr "Tots els equips" + +#: ../ui/tcosmonitor-mainwindow.ui:99 +msgid "Find" +msgstr "" + +#: ../ui/tcosmonitor-mainwindow.ui:111 +msgid "About this app" +msgstr "Quant a..." + +#: ../ui/tcosmonitor-mainwindow.ui:219 +msgid "Start audio chat" +msgstr "" + +#: ../ui/tcosmonitor-mainwindow.ui:331 +#, fuzzy +msgid "Send audio/video" +msgstr "Selecciona fitxer d'audio o de vídeo." + +#: ../ui/tcosmonitor-mainwindow.ui:443 +msgid "Exe app" +msgstr "" + +#: ../ui/tcosmonitor-mainwindow.ui:499 +#, fuzzy +msgid "Send message" +msgstr "Enviar missatges de text" + +#: ../ui/tcosmonitor-mainwindow.ui:581 +msgid "List view" +msgstr "" + +#: ../ui/tcosmonitor-mainwindow.ui:629 +msgid "Icon view" +msgstr "" + +#: ../ui/tcosmonitor-mainwindow.ui:689 +msgid "Simulate my classroom" +msgstr "" + +#: ../ui/tcosmonitor-staticwindownew.ui:8 +msgid "New or edit hosts" +msgstr "Nou o edita equips" + +#: ../ui/tcosmonitor-staticwindownew.ui:32 +msgid "" +"You can add a simple host, \n" +" example: <b>192.168.0.100</b>\n" +"\n" +"or range of hosts, \n" +" example: <b>192.168.0.100-120</b>\n" +"\n" +"MAC address is optional" +msgstr "" +"Podeu afegir un únic equip, \n" +" per exemple: <b>192.168.0.100</b>\n" +"\n" +"o un interval d'equips, \n" +" per exemple: <b>192.168.0.100-120</b>\n" +"\n" +"l'adreça física (MAC) és opcional" + +#: ../ui/tcosmonitor-staticwindownew.ui:57 +msgid "IP address *" +msgstr "Adreça IP" + +#: ../ui/tcosmonitor-askwindow.ui:8 +msgid "Question" +msgstr "Pregunta" + +#: ../ui/tcosmonitor-askwindow.ui:50 +msgid "You can drag and drop launcher file to this box" +msgstr "Podeu arrossegar i soltar un llançador en aquesta caixa" + +#: ../ui/tcosmonitor-askwindow.ui:61 +msgid "<b>Run app in unknow host</b>" +msgstr "<b>Executa programa en equip desconegut</b>" + +#, fuzzy +#~ msgid "Quit from TcosMonitor" +#~ msgstr "Ix de TcosMonitor" + +#, fuzzy +#~ msgid "<span size=\"xx-large\">Lliurex Lab</span>" +#~ msgstr "<span size=\"x-large\">TcosMonitor</span>" + +#, fuzzy +#~ msgid "Clonning clients...." +#~ msgstr "Connectant amb %s..." + +#, fuzzy +#~ msgid "Clone clients" +#~ msgstr "Connectant amb %s..." + +#, fuzzy +#~ msgid "Clone clients (from this host)" +#~ msgstr "Mode demostració (des d'aquest equip)" + +#, fuzzy +#~ msgid "No clients to clone." +#~ msgstr "No s'ha trobat cap client" + +#, fuzzy +#~ msgid "Do you want to clone the following clients: %s?" +#~ msgstr "Voleu apagar els equips següents:%s?" + +#, fuzzy +#~ msgid "Waiting for start clone mode..." +#~ msgstr "Esperant l'inici del mode conferència..." + +#, fuzzy +#~ msgid "Select image file to clone.." +#~ msgstr "Tria fitxer(s)..." + +#, fuzzy +#~ msgid "Running in clone mode with %s clients." +#~ msgstr "Mode demostració amb %s clients." + +#, fuzzy +#~ msgid "Running in clone mode from server. Clone Nº %s" +#~ msgstr "Treballant en mode demostració des del servidor" + +#, fuzzy +#~ msgid "Do you want to clone from client %s?" +#~ msgstr "Voleu entrar en mode demostració des de l'equip %s?" + +#, fuzzy +#~ msgid "Do you want only create a image from host %s?" +#~ msgstr "Voleu entrar en mode demostració des de l'equip %s?" + +#, fuzzy +#~ msgid "Waiting for start clone mode from client %s..." +#~ msgstr "Esperant l'inici del mode demo des de %s..." + +#, fuzzy +#~ msgid "Select file to save clone image..." +#~ msgstr "Tria fitxer(s)..." + +#, fuzzy +#~ msgid "Running in clone mode from client %(host)s. Clone Nº %(count)s" +#~ msgstr "Mode demostració des de %s" + +#, fuzzy +#~ msgid "Clone mode off." +#~ msgstr "Mode conferència desactivat." + +#, fuzzy +#~ msgid "Cloning client, please wait..." +#~ msgstr "" +#~ "Desmuntant el dispositiu %s.\n" +#~ "Per favor, espereu..." + +#~ msgid "" +#~ "Error getting Xorg info:\n" +#~ "%s" +#~ msgstr "" +#~ "Error a l'intentar la informació de Xorg:\n" +#~ "%s" + +#, fuzzy +#~ msgid "Chat conference mode off." +#~ msgstr "Mode conferència desactivat." + +#~ msgid "No host found" +#~ msgstr "No s'han trobat equips" + +#, fuzzy +#~ msgid "Do you want to start conference mode the following users: %s?" +#~ msgstr "Vol iniciar la manera conferència als usuaris següents:%s?" + +#, fuzzy +#~ msgid "" +#~ "Running in broadcast video transmission to host %(host)s. Broadcast Nº %" +#~ "(count)d" +#~ msgstr "Difusió de vídeo per a %s" + +#~ msgid "" +#~ "Special characters used in \"%s\".\n" +#~ "Please rename it." +#~ msgstr "" +#~ "No hi pot haver caràcters \"especials\" (accents, etc.) en \"%s\".\n" +#~ "Per favor, canvieu-li el nom." + +#~ msgid "No clients selected, do you want to select all?" +#~ msgstr "No heu triat cap equip, voleu seleccionar-los tots?" + +#, fuzzy +#~ msgid "Running in broadcast video transmission" +#~ msgstr "Difusió de vídeo." + +#, fuzzy +#~ msgid "Conference chat mode off." +#~ msgstr "Mode conferència desactivat." + +#~ msgid "Can't exec this action because you are connected at this host!" +#~ msgstr "" +#~ "No s'ha pogut executar l'ordre perquè no hi ha connexió amb aquest equip!" + +#~ msgid "Can't logout, user is not logged" +#~ msgstr "No es pot sortir: no hi ha entrat cap usuari" + +#~ msgid "Waiting for screenshots..." +#~ msgstr "Esperant captures..." + +#~ msgid "Work as cyber mode (not work yet)" +#~ msgstr "Mode ciber (no disponible encara)" + +#~ msgid "Extra modules" +#~ msgstr "Mòduls extra" + +#~ msgid "Kernel modules" +#~ msgstr "Mòduls del kernel" + +#~ msgid "<b>Extra modules avalaible</b>" +#~ msgstr "<b>Moduls extra disponibles</b>" + +#~ msgid "Add X11vnc support" +#~ msgstr "Afegeix suport per a X11vnc" + +#~ msgid "Add iTALC support" +#~ msgstr "Afegeix suport per a iTALC" + +#~ msgid "Add FreeNX support" +#~ msgstr "Afegeix suport per a FreeNX" + +#~ msgid "Addons" +#~ msgstr "Afegits" diff --git a/po/ca@valencia.po b/po/ca@valencia.po new file mode 100644 index 0000000..fd642e4 --- /dev/null +++ b/po/ca@valencia.po @@ -0,0 +1,2904 @@ +# translation of devhelp.po to +# Devhelp translation to Catalan. +# Copyright © 2003, 2008 Free Software Foundation, Inc. +# Aleix Badia <abadia@ica.es>, 2003. +# Raül Cambeiro <rulet@menta.net>, 2003. +# Jordi Mallach <jordi@sindominio.ne>, 2003. +# +# +msgid "" +msgstr "" +"Project-Id-Version: qcv\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-18 15:48+0100\n" +"PO-Revision-Date: 2008-10-30 18:05+0100\n" +"Last-Translator: Pilar Embid Giner <embid_mar@gva.es>\n" +"Language-Team: Valencian <lliurex@gva.es>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../tcosmonitor.py:129 +#, python-format +msgid "" +"The user \"%s\" must be member of the group \"tcos\" to exec tcosmonitor.\n" +"\n" +"If you are system administrator, add your user to tcos group." +msgstr "" +"L'usuari \"%s\" ha de ser membre del grup \"tcos\".\n" +"\n" +"Si sou administrador del sistema, afegiu l'usuari al grup tcos." + +#: ../tcosmonitor.py:247 +msgid "Send files disabled. rsync not configured." +msgstr "L'enviament de fitxer està inhabilitat. No està configutat rsync." + +#: ../tcosmonitor.py:329 ../tcospersonalize.py:562 +#: ../tcos-volume-manager.py:378 +msgid "Exiting" +msgstr "S'està eixint" + +#: ../tcos-devices-ng.py:188 +#, python-format +msgid "Rebooting in %s seconds" +msgstr "L'equip es reiniciarà en %s segons" + +#: ../tcos-devices-ng.py:190 +#, python-format +msgid "Shutting down in %s seconds" +msgstr "L'equip s'apagarà en %s segons" + +#: ../tcos-devices-ng.py:206 ../tcos-devices-ng.py:209 +#, python-format +msgid "" +"ERROR during action %(action)s:\n" +"%(errortxt)s" +msgstr "" +"S'ha produït un ERROR mentres es realitzava l'acció %(action)s:\n" +"%(errortxt)s" + +#: ../tcos-devices-ng.py:239 +msgid "Tcos device daemon" +msgstr "Dimoni de dispositius TCOS" + +#: ../tcos-devices-ng.py:283 ../tcos-volume-manager.py:143 +#, python-format +msgid "Error connecting with TcosXmlRpc in %s." +msgstr "S'ha produït un error mentres es connectava amb tcosxmlrpc en %s" + +#: ../tcos-devices-ng.py:314 +#, python-format +msgid "Cdrom device %s" +msgstr "Dispositiu cdrom %s" + +#: ../tcos-devices-ng.py:317 +msgid "Mount Cdrom" +msgstr "Munta el cdrom" + +#: ../tcos-devices-ng.py:318 +msgid "Umount Cdrom" +msgstr "Desmunta el cdrom" + +#: ../tcos-devices-ng.py:340 +#, python-format +msgid "Disk partition %s" +msgstr "Partición del disc %s" + +#: ../tcos-devices-ng.py:343 +msgid "Mount disk partition" +msgstr "Munta la partició del disc" + +#: ../tcos-devices-ng.py:344 +msgid "Umount disk partition" +msgstr "Desmunta la partició del disc" + +#: ../tcos-devices-ng.py:356 +msgid "No floppy detected" +msgstr "No s'ha detectat cap disquet" + +#: ../tcos-devices-ng.py:368 ../tcos-devices-ng.py:674 +#: ../tcos-devices-ng.py:680 ../tcos-devices-ng.py:686 +msgid "Floppy" +msgstr "Disquet" + +#: ../tcos-devices-ng.py:371 +msgid "Mount Floppy" +msgstr "Munta el disquet" + +#: ../tcos-devices-ng.py:372 +msgid "Umount Floppy" +msgstr "Desmunta el disquet" + +#: ../tcos-devices-ng.py:382 +msgid "Floppy mounted. Ready for use." +msgstr "Disquet muntat. Preparat per a usar." + +#: ../tcos-devices-ng.py:384 +msgid "Floppy umounted. You can extract it." +msgstr "Disquet desmuntat. Ara pot extraure'l." + +#: ../tcos-devices-ng.py:400 +msgid "Hard disk partition mounted. Ready for use." +msgstr "Partició muntada del disc dur. Preparat per a usar." + +#: ../tcos-devices-ng.py:403 +msgid "Hard disk partition umounted." +msgstr "Partició desmuntada del disc dur." + +#: ../tcos-devices-ng.py:425 +msgid "Audio cdrom mounted., you can listen music opening wav files." +msgstr "Cdrom d'àudio muntat., ara podeu obrir els fitxers de música wav." + +#: ../tcos-devices-ng.py:427 +msgid "Cdrom mounted. Ready for use." +msgstr "Cdrom muntat. Preparat per a usar." + +#: ../tcos-devices-ng.py:430 +msgid "Cdrom umounted. You can extract it." +msgstr "Cdrom desmuntat. Ara podeu extraure'l." + +#: ../tcos-devices-ng.py:529 +#, python-format +msgid "" +"Mounting device %s\n" +"Please wait..." +msgstr "" +"S'està muntant el dispositiu %s\n" +"Per favor, espere..." + +#: ../tcos-devices-ng.py:578 +msgid "Error mounting LTSPFS, check versions of LTSPFS packages" +msgstr "" +"S'ha produït un error mentres es muntava LTSPFS, comproveu les versions dels " +"paquets LTSPFS" + +#: ../tcos-devices-ng.py:604 +#, python-format +msgid "" +"Umounting device %s.\n" +"Please wait..." +msgstr "" +"S'està desmuntant el dispositiu %s.\n" +"Per favor, espere..." + +#: ../tcos-devices-ng.py:651 +msgid "usbdisk" +msgstr "disc-usb" + +#: ../tcos-devices-ng.py:653 +msgid "firewiredisk" +msgstr "disc-firewire" + +#: ../tcos-devices-ng.py:678 +msgid "Can't mount floppy" +msgstr "No es pot muntar el disquet" + +#: ../tcos-devices-ng.py:689 +msgid "Can't umount floppy" +msgstr "No es pot desmuntar el disquet" + +#: ../tcos-devices-ng.py:702 ../tcos-devices-ng.py:712 +#: ../tcos-devices-ng.py:723 ../tcos-devices-ng.py:836 +#: ../tcos-devices-ng.py:848 ../tcos-devices-ng.py:867 +#: ../tcos-devices-ng.py:879 ../tcos-devices-ng.py:911 +#, python-format +msgid "Cdrom_%s" +msgstr "Cdrom_%s" + +#: ../tcos-devices-ng.py:710 +msgid "Can't mount cdrom" +msgstr "No es pot muntar el cdrom" + +#: ../tcos-devices-ng.py:726 +msgid "Can't umount cdrom" +msgstr "No es pot desmuntar el cdrom" + +#: ../tcos-devices-ng.py:742 ../tcos-devices-ng.py:752 +#: ../tcos-devices-ng.py:763 +#, python-format +msgid "Disk_%s" +msgstr "Disc_%s" + +#: ../tcos-devices-ng.py:750 +msgid "Can't mount hard disk partition" +msgstr "No es pot muntar la partició del disc dur" + +#: ../tcos-devices-ng.py:766 +msgid "Can't umount hard disk partition" +msgstr "No es pot desmuntar la partició del disc dur" + +#: ../tcos-devices-ng.py:807 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Connected CDROM USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Des del terminal %(host)s.\n" +"Dispositiu CDROM USB connectat %(device)s\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:811 +#, python-format +msgid "CDROM USB device %s" +msgstr "Dispositiu CDROM USB %s" + +#: ../tcos-devices-ng.py:814 +#, python-format +msgid "Mount CDROM USB device %s" +msgstr "Munta el dispositiu CDROM USB %s" + +#: ../tcos-devices-ng.py:815 +#, python-format +msgid "Umount CDROM USB device %s" +msgstr "Desmunta el dispositiu CDROM USB %s" + +#: ../tcos-devices-ng.py:840 ../tcos-devices-ng.py:871 +#: ../tcos-devices-ng.py:1001 ../tcos-devices-ng.py:1012 +#: ../tcos-devices-ng.py:1058 ../tcos-devices-ng.py:1138 +#: ../tcos-devices-ng.py:1149 ../tcos-devices-ng.py:1195 +#, python-format +msgid "Error, can't mount device %s" +msgstr "S'ha produït un error, no es pot muntar el dispositiu %s" + +#: ../tcos-devices-ng.py:898 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Disconnected CDROM USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Des del terminal %(host)s.\n" +"Dispositiu CDROM USB desconnectat %(device)s\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:926 +#, python-format +msgid "Can't umount cdrom usb %s" +msgstr "No es pot desmuntar el cdrom usb %s" + +#: ../tcos-devices-ng.py:951 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Connected USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Des del terminal %(host)s.\n" +"Dispositiu USB connectat %(device)s\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:954 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Disconnected USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Des del terminal %(host)s.\n" +"Dispositiu USB desconnectat %(device)s\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:982 +#, python-format +msgid "USB device %s" +msgstr "Dispositiu USB %s" + +#: ../tcos-devices-ng.py:985 +#, python-format +msgid "Mount USB device %s" +msgstr "Munta el dispositiu USB %s" + +#: ../tcos-devices-ng.py:986 +#, python-format +msgid "Umount USB device %s" +msgstr "Desmunta el dispositiu USB %s" + +#: ../tcos-devices-ng.py:1088 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Connected Firewire device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Des del terminal %(host)s.\n" +"Dispositiu Firewire connectat %(device)s\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:1091 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Disconnected Firewire device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Des del terminal %(host)s.\n" +"Dispositiu Firewire desconnectat %(device)s\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:1119 +#, python-format +msgid "Firewire device %s" +msgstr "Dispositiu Firewire %s" + +#: ../tcos-devices-ng.py:1122 +#, python-format +msgid "Mount Firewire device %s" +msgstr "Munta el dispositiu Firewire %s" + +#: ../tcos-devices-ng.py:1123 +#, python-format +msgid "Umount Firewire device %s" +msgstr "Desmunta el dispositiu Firewire %s" + +#: ../tcos-devices-ng.py:1206 +#, python-format +msgid "CDROM USB device %s umounted. You can extract it." +msgstr "Dispositiu CDROM USB %s desmuntat. Ara podeu extraure'l." + +#: ../tcos-devices-ng.py:1209 +#, python-format +msgid "CDROM USB device %s mounted. Ready for use." +msgstr "Dispositiu CDROM USB %s muntat. Preparat per a usar." + +#: ../tcos-devices-ng.py:1247 +#, python-format +msgid "USB device %s umounted. You can extract it." +msgstr "Dispositiu USB %s desmuntat. Ara podeu extraure'l." + +#: ../tcos-devices-ng.py:1250 +#, python-format +msgid "USB device %s mounted. Ready for use." +msgstr "Dispositiu USB %s muntat. Preparat per a usar." + +#: ../tcos-devices-ng.py:1286 +#, python-format +msgid "Firewire device %s umounted. You can extract it." +msgstr "Dispositiu Firewire %s desmuntat. Ara podeu extraure'l." + +#: ../tcos-devices-ng.py:1289 +#, python-format +msgid "Firewire device %s mounted. Ready for use." +msgstr "Dispositiu Firewire %s muntat. Preparat per a usar." + +#: ../tcospersonalize.py:115 +msgid "" +"Need a host to configure!!!\n" +"Try exec:\n" +" tcospersonalize --host=XXX.XXX.XXX.XXX" +msgstr "" +"Es necessita una adreça d'equip a configurar!!!\n" +"Proveu a executar:\n" +" tcospersonalize --host=XXX.XXX.XXX.XXX" + +#: ../tcospersonalize.py:190 +msgid "host: " +msgstr "equip: " + +#: ../tcospersonalize.py:454 +msgid "Host down, can't connect to tcosxmlrpc." +msgstr "L'equip és inaccessible, no es pot connectar a tcosxmlrpc." + +#: ../tcospersonalize.py:462 +#, python-format +msgid "New %d drivers loaded from terminal." +msgstr "S'han carregat %d controladors des del terminal." + +#: ../tcospersonalize.py:521 +#, python-format +msgid "Really delete config of %s?" +msgstr "Esteu segur que voleu eliminar la configuració de %s?" + +#: ../tcospersonalize.py:524 +msgid "Deleted!" +msgstr "Esborrat!" + +#: ../tcos-volume-manager.py:101 ../tcos-volume-manager.py:113 +#, python-format +msgid "" +"Tcos Sound levels on:\n" +"%s" +msgstr "" +"Nivells de volum del TCOS en:\n" +"%s" + +#: ../tcos-volume-manager.py:121 +#, python-format +msgid "ERROR: It appears that TcosXmlRpc is not running on %s." +msgstr "ERROR: Sembla que el tcosxmlrpc no està en execució en %s" + +#: ../tcos-volume-manager.py:217 +msgid "Loading channels info..." +msgstr "S'està carregant la informació dels canals..." + +#: ../tcos-volume-manager.py:230 +msgid "Error loading channels info (xauth error)" +msgstr "" +"S'ha produït un error en carregar la informació de canals (error de xauth)" + +#: ../tcos-volume-manager.py:233 ../ui/tcos-volume-manager.ui:8 +msgid "Tcos Volume Manager" +msgstr "Gestor de volum del TCOS" + +#: ../tcos-volume-manager.py:234 +#, python-format +msgid "<span size='large'><b>Sound mixer of %s host</b></span>" +msgstr "<span size='large'><b>Mesclador d'àudio de l'equip %s</b></span>" + +#: ../tcos-volume-manager.py:300 ../tcosmonitor/extensions/info.py:442 +msgid "Mute" +msgstr "Sense so" + +#: ../tcos-volume-manager.py:319 +msgid "Main controls ready" +msgstr "Els controls principals estan preparats" + +#: ../tcos-volume-manager.py:323 +msgid "All remote controls loaded." +msgstr "Tots els controls remots estan carregats." + +#: ../tcos-volume-manager.py:332 ../tcosmonitor/extensions/info.py:557 +#, python-format +msgid "Changing value of %(channel)s channel, to %(value)s%%..." +msgstr "S'està canviant el valor del canal %(channel)s, a %(value)s%%..." + +#: ../tcos-volume-manager.py:339 ../tcosmonitor/extensions/info.py:564 +#, python-format +msgid "Changed value of %(channel)s channel, to %(value)s" +msgstr "S'ha canviat el valor del canal %(channel)s, a %(value)s" + +#: ../tcos-volume-manager.py:346 ../tcosmonitor/extensions/info.py:571 +#, python-format +msgid "Unmuting %s channel..." +msgstr "S'està eliminant l'emmudiment al canal %s..." + +#: ../tcos-volume-manager.py:351 ../tcosmonitor/extensions/info.py:576 +#, python-format +msgid "Muting %s channel..." +msgstr "S'està emmudint el canal %s..." + +#: ../tcos-volume-manager.py:354 ../tcosmonitor/extensions/info.py:579 +#, python-format +msgid "Status of %(channel)s channel, is \"%(newvalue)s\"" +msgstr "L'estat del canal %(channel)s és \"%(newvalue)s\"" + +#: ../tcosmonitor/TcosDBus.py:94 +msgid "TcosDBus not allowed in local display" +msgstr "El TcosDBus no està permés en pantalla local." + +#: ../tcosmonitor/TcosDBus.py:122 +#, python-format +msgid "Seems that tcosxmlrpc isn't running on host=\"%s\"" +msgstr "Sembla que el tcosxmlrpc no s'està executant en l'equip=\"%s\"" + +#: ../tcosmonitor/TcosDBus.py:143 +msgid "tcosxmlrpc ERROR conection unavalaible." +msgstr "S'ha produït un ERROR del tcosxmlrpc la connexió no està disponible" + +#: ../tcosmonitor/TcosDBus.py:159 +msgid "ERROR conecting to tcosxmlrpc, check username and password." +msgstr "" +"No es pot connectar a tcosxmlrpc, comproveu el nom d'usuari i la contrasenya." + +#: ../tcosmonitor/TcosDBus.py:251 +msgid "Message from admin" +msgstr "Missatge de l'administrador" + +#: ../tcosmonitor/TcosDBus.py:341 ../tcosmonitor/TcosDBus.py:357 +#: ../tcosmonitor/TcosDBus.py:375 ../tcosmonitor/TcosDBus.py:393 +msgid "User not allowed to run this dbus call." +msgstr "L'usuari no té permeses estes telefonades dbus." + +#: ../tcosmonitor/TcosStaticHosts.py:163 ../tcosmonitor/TcosListView.py:70 +msgid "IP address" +msgstr "Adreça IP" + +#: ../tcosmonitor/TcosStaticHosts.py:169 +#: ../ui/tcosmonitor-staticwindownew.ui:68 +msgid "MAC address" +msgstr "Adreça MAC" + +#: ../tcosmonitor/TcosStaticHosts.py:279 +msgid "No hosts found, please click on Refresh button using another method." +msgstr "" +"No s'han trobat equips, per favor, premeu el botó Actualitza usant un altre " +"mètode." + +#: ../tcosmonitor/shared.py:108 +msgid "Traditional list only" +msgstr "Només la llista tradicional" + +#: ../tcosmonitor/shared.py:109 +msgid "Icons only" +msgstr "Només icones" + +#: ../tcosmonitor/shared.py:110 +msgid "Simulate classroom" +msgstr "Simula una aula" + +#: ../tcosmonitor/shared.py:111 +msgid "Lists, icons and classroom with tabs" +msgstr "Llistes, icones i aula amb pestanyes" + +#: ../tcosmonitor/shared.py:270 ../tcosmonitor/shared.py:312 +#: ../tcosmonitor/TcosMenus.py:35 +msgid "Terminal actions" +msgstr "Accions per al terminal" + +#: ../tcosmonitor/shared.py:271 ../tcosmonitor/shared.py:313 +#: ../tcosmonitor/TcosMenus.py:36 +msgid "User actions" +msgstr "Accions per a l'usuari" + +#: ../tcosmonitor/shared.py:272 ../tcosmonitor/shared.py:314 +#: ../tcosmonitor/TcosMenus.py:37 +msgid "Audio, video and files" +msgstr "Fitxers d'àudio i vídeo" + +#: ../tcosmonitor/shared.py:279 ../tcosmonitor/extensions/info.py:47 +msgid "Refresh terminal info" +msgstr "Actualitza la informació del terminal" + +#: ../tcosmonitor/shared.py:280 ../tcosmonitor/extensions/clean.py:40 +#: ../tcosmonitor/extensions/clean.py:41 +msgid "Clean info about terminal" +msgstr "Neteja la informació del terminal" + +#: ../tcosmonitor/shared.py:281 ../tcosmonitor/TcosTrayIcon.py:54 +#: ../tcosmonitor/extensions/reboot.py:40 ../tcosmonitor/TcosTrayIcon2.py:58 +msgid "Reboot" +msgstr "Reinicia" + +#: ../tcosmonitor/shared.py:282 ../tcosmonitor/TcosTrayIcon.py:55 +#: ../tcosmonitor/extensions/reboot.py:42 ../tcosmonitor/TcosTrayIcon2.py:59 +msgid "Poweroff" +msgstr "Apaga" + +#: ../tcosmonitor/shared.py:283 ../tcosmonitor/extensions/lockscreen.py:40 +msgid "Lock screen" +msgstr "Bloqueja la pantalla" + +#: ../tcosmonitor/shared.py:284 ../tcosmonitor/extensions/lockscreen.py:42 +msgid "Unlock screen" +msgstr "Desbloqueja la pantalla" + +#: ../tcosmonitor/shared.py:285 ../tcosmonitor/extensions/italc.py:43 +msgid "Connect to remote screen (iTALC)" +msgstr "Connecta a la pantalla remota (iTALC)" + +#: ../tcosmonitor/shared.py:286 ../tcosmonitor/extensions/vnc.py:54 +msgid "Connect to remote screen (VNC)" +msgstr "Connecta a la pantalla remota (VNC)" + +#: ../tcosmonitor/shared.py:287 ../tcosmonitor/extensions/screenshot.py:45 +msgid "Screenshot" +msgstr "Captura de pantalla" + +#: ../tcosmonitor/shared.py:288 ../tcosmonitor/extensions/remotessh.py:40 +msgid "Give a remote xterm" +msgstr "Executa un terminal xterm remot" + +#: ../tcosmonitor/shared.py:289 +#: ../tcosmonitor/extensions/tcospersonalize.py:40 +#: ../ui/tcosmonitor-prefwindow.ui:1324 +msgid "Configure this host" +msgstr "Configura este equip" + +#: ../tcosmonitor/shared.py:290 ../tcosmonitor/extensions/logout.py:40 +msgid "Logout client" +msgstr "Desconnecta el client" + +#: ../tcosmonitor/shared.py:291 ../tcosmonitor/extensions/restartxorg.py:41 +msgid "Restart X session with new settings" +msgstr "Reinicia la sessió X amb la nova configuració" + +#: ../tcosmonitor/shared.py:292 ../tcosmonitor/extensions/appsmsg.py:52 +msgid "Exec app on user display" +msgstr "Executa l'aplicació en la pantalla d'usuari" + +#: ../tcosmonitor/shared.py:293 ../tcosmonitor/extensions/appsmsg.py:53 +msgid "Send a text message to user" +msgstr "Envia un missatge de text a l'usuari" + +#: ../tcosmonitor/shared.py:294 ../tcosmonitor/extensions/viewproc.py:41 +msgid "Show running apps of this client" +msgstr "Mostra les aplicacions en execució d'este client" + +#: ../tcosmonitor/shared.py:295 ../tcosmonitor/shared.py:332 +msgid "Audio/Video broadcast" +msgstr "Difusió d'àudio/vídeo" + +#: ../tcosmonitor/shared.py:296 ../tcosmonitor/shared.py:333 +#: ../tcosmonitor/extensions/sendfiles.py:49 +#: ../tcosmonitor/extensions/sendfiles.py:50 +#: ../ui/tcosmonitor-prefwindow.ui:1134 ../ui/tcosmonitor-prefwindow.ui:1475 +#: ../ui/tcosmonitor-mainwindow.ui:387 +msgid "Send files" +msgstr "Envia els fitxers" + +#: ../tcosmonitor/shared.py:297 ../tcosmonitor/extensions/vnc.py:55 +msgid "Demo mode (from this host)" +msgstr "Mode de demostració (des d'este equip)" + +#: ../tcosmonitor/shared.py:298 ../tcosmonitor/extensions/wakeonlan.py:41 +msgid "Boot client (WakeOnLan)" +msgstr "Arranca el client (WakeOnLan)" + +#: ../tcosmonitor/shared.py:299 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:38 +msgid "Lock internet" +msgstr "Bloqueja Internet" + +#: ../tcosmonitor/shared.py:300 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:39 +msgid "Unlock internet" +msgstr "Desbloqueja Internet" + +#: ../tcosmonitor/shared.py:301 ../tcosmonitor/extensions/dpms.py:40 +msgid "DPMS Power off monitor" +msgstr "Desactiva el DPMS per al monitor (control d'energia del monitor)" + +#: ../tcosmonitor/shared.py:302 ../tcosmonitor/extensions/dpms.py:42 +msgid "DPMS Power on monitor" +msgstr "Activa el DPMS per al monitor (control d'energia del monitor)" + +#: ../tcosmonitor/shared.py:303 +msgid "Send MIC audio (from this host)" +msgstr "Envia àudio MIC (des d'este equip)" + +#: ../tcosmonitor/shared.py:321 ../tcosmonitor/extensions/reboot.py:41 +msgid "Reboot all clients" +msgstr "Reinicia tots els clients" + +#: ../tcosmonitor/shared.py:322 ../tcosmonitor/extensions/reboot.py:43 +msgid "Poweroff all clients" +msgstr "Apaga tots els clients" + +#: ../tcosmonitor/shared.py:323 ../tcosmonitor/extensions/lockscreen.py:41 +msgid "Lock all screens" +msgstr "Bloqueja totes les pantalles" + +#: ../tcosmonitor/shared.py:324 ../tcosmonitor/extensions/lockscreen.py:43 +msgid "Unlock all screens" +msgstr "Desbloqueja totes les pantalles" + +#: ../tcosmonitor/shared.py:325 ../tcosmonitor/extensions/logout.py:41 +msgid "Logout clients" +msgstr "Desconnecta tots els clients" + +#: ../tcosmonitor/shared.py:326 ../tcosmonitor/extensions/restartxorg.py:42 +msgid "Restart X session of all clients" +msgstr "Reinicia la sessió X de tots els clients" + +#: ../tcosmonitor/shared.py:327 ../tcosmonitor/extensions/appsmsg.py:55 +msgid "Exec same app in all connected users" +msgstr "Executa la mateixa aplicació en tots els usuaris connectats" + +#: ../tcosmonitor/shared.py:328 ../tcosmonitor/extensions/appsmsg.py:56 +msgid "Send a text message to all connected users" +msgstr "Envia un missatge de text a tots els usuaris connectats" + +#: ../tcosmonitor/shared.py:329 ../tcosmonitor/extensions/vnc.py:57 +msgid "Enter demo mode, all connected users see my screen" +msgstr "Entra en mode de demostració, tots els usuaris veuen la meua pantalla" + +#: ../tcosmonitor/shared.py:330 +msgid "Enter conference mode, all connected users can hear me" +msgstr "Entra en mode conferència, tots els usuaris poden escoltar-me" + +#: ../tcosmonitor/shared.py:331 ../tcosmonitor/extensions/screenshot.py:46 +msgid "Capture All clients screens" +msgstr "Captura totes les pantalles dels clients" + +#: ../tcosmonitor/shared.py:334 ../tcosmonitor/extensions/wakeonlan.py:42 +msgid "Boot All clients (WakeOnLan)" +msgstr "Arranca tots els clients (WakeOnLan)" + +#: ../tcosmonitor/shared.py:335 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:41 +msgid "Lock internet in all connected users" +msgstr "Bloqueja Internet a tots els usuaris connectats" + +#: ../tcosmonitor/shared.py:336 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:42 +msgid "Unlock internet in all connected users" +msgstr "Desbloqueja Internet a tots els usuaris connectats" + +#: ../tcosmonitor/shared.py:337 ../tcosmonitor/extensions/dpms.py:41 +msgid "DPMS Power off monitors" +msgstr "Desactiva el DPMS per als monitors (control d'energia del monitor)" + +#: ../tcosmonitor/shared.py:338 ../tcosmonitor/extensions/dpms.py:43 +msgid "DPMS Power on monitors" +msgstr "Activa el DPMS per als monitors (control d'energia del monitor)" + +#: ../tcosmonitor/shared.py:339 +msgid "Chat audio conference" +msgstr "Audioconferència" + +#: ../tcosmonitor/shared.py:340 ../tcosmonitor/extensions/livevnc.py:51 +#: ../ui/tcosmonitor-prefwindow.ui:1342 +msgid "Live view screens with VNC" +msgstr "" + +#: ../tcosmonitor/shared.py:538 +#, python-format +msgid "QUESTION: %(txt)s, RESPONSE %(response)s" +msgstr "PREGUNTA: %(txt)s, RESPOSTA %(response)s" + +#: ../tcosmonitor/shared.py:555 ../tcosmonitor/shared.py:566 +#, python-format +msgid "INFO: %s" +msgstr "INFO: %s" + +# FIXME: handleme +#: ../tcosmonitor/shared.py:577 +#, python-format +msgid "ERROR: %s" +msgstr "ERROR: %s" + +#: ../tcosmonitor/TcosClassView.py:50 ../tcosmonitor/TcosIconView.py:47 +msgid "IP" +msgstr "IP" + +#: ../tcosmonitor/TcosClassView.py:51 ../tcosmonitor/TcosIconView.py:48 +#: ../tcosmonitor/TcosListView.py:64 +msgid "Hostname" +msgstr "Nom de l'ordinador" + +#: ../tcosmonitor/TcosClassView.py:52 ../tcosmonitor/TcosIconView.py:49 +#: ../tcosmonitor/TcosListView.py:76 +msgid "Username" +msgstr "Nom d'usuari" + +#: ../tcosmonitor/TcosClassView.py:53 ../tcosmonitor/TcosIconView.py:50 +#: ../tcosmonitor/TcosListView.py:87 +msgid "Logged" +msgstr "Connectat" + +#: ../tcosmonitor/TcosClassView.py:54 ../tcosmonitor/TcosIconView.py:51 +#: ../tcosmonitor/TcosListView.py:103 +msgid "Time log in" +msgstr "Temps de connexió" + +#: ../tcosmonitor/TcosClassView.py:55 ../tcosmonitor/TcosIconView.py:52 +msgid "Screen locked" +msgstr "Pantalla bloquejada" + +#: ../tcosmonitor/TcosClassView.py:56 ../tcosmonitor/TcosIconView.py:53 +msgid "Network locked" +msgstr "Xarxa bloquejada" + +#: ../tcosmonitor/TcosClassView.py:58 +msgid "" +"Place mouse on any computer to see brief info about it.\n" +"You can select and unselect multiple host clicking on every one.\n" +"Drag and drop hosts to positions and save clicking on right mouse button." +msgstr "" +"Moveu el ratolí sobre cada equip per a obtindre una informació breu de cada " +"un.\n" +"Podeu seleccionar i desseleccionar múltiples equips fent clic en cadascun.\n" +"Arrossegueu i deixeu anar els equips a les posicions i guardeu-les fent clic " +"amb el botó dret." + +#: ../tcosmonitor/TcosClassView.py:179 +msgid "Positions reset to defaults." +msgstr "Posicions reinicialitzades per defecte." + +#: ../tcosmonitor/TcosClassView.py:197 +msgid "Positions saved." +msgstr "Posicions guardades." + +#: ../tcosmonitor/TcosClassView.py:323 +#, python-format +msgid "%s is not a valid file to exe or send" +msgstr "%s no és un fitxer vàlid per a executar-lo o enviar-lo" + +#: ../tcosmonitor/TcosClassView.py:409 ../tcosmonitor/TcosIconView.py:156 +msgid "yes" +msgstr "sí" + +#: ../tcosmonitor/TcosClassView.py:411 ../tcosmonitor/TcosIconView.py:158 +msgid "no" +msgstr "no" + +#: ../tcosmonitor/TcosTrayIcon.py:49 ../tcosmonitor/extensions/vnc.py:298 +#: ../tcosmonitor/TcosTrayIcon2.py:53 ../ui/tcosmonitor-mainwindow.ui:23 +msgid "Quit" +msgstr "Ix" + +#: ../tcosmonitor/TcosTrayIcon.py:65 +msgid "TcosDevices" +msgstr "Dispositius TCOS" + +#: ../tcosmonitor/TcosTrayIcon.py:172 ../tcosmonitor/TcosTrayIcon.py:186 +#: ../tcosmonitor/TcosTrayIcon2.py:67 +msgid "Tcos Devices" +msgstr "Dispositius TCOS" + +#: ../tcosmonitor/TcosTrayIcon.py:232 ../tcosmonitor/TcosTrayIcon2.py:351 +msgid "Usb flash" +msgstr "Memòria USB flash" + +#: ../tcosmonitor/TcosTrayIcon.py:234 ../tcosmonitor/TcosTrayIcon2.py:353 +msgid "Mount USB1" +msgstr "Munta USB1" + +#: ../tcosmonitor/TcosTrayIcon.py:235 ../tcosmonitor/TcosTrayIcon2.py:354 +msgid "Umount USB1" +msgstr "Desmunta USB1" + +#: ../tcosmonitor/extensions/lockscreen.py:49 +#: ../tcosmonitor/extensions/lockscreen.py:57 +msgid "" +"Can't connect to tcosxmlrpc.\n" +"Please verify user and password in prefences!" +msgstr "" +"No es pot connectar a tcosxmlrpc.\n" +"Per favor verifiqueu l'usuari i la contrasenya en les preferències." + +#: ../tcosmonitor/extensions/lockscreen.py:81 +#, python-format +msgid "Do you want to lock the following screens: %s?" +msgstr "Voleu bloquejar la pantalla dels següents equips: %s?" + +#: ../tcosmonitor/extensions/lockscreen.py:90 +#, python-format +msgid "Do you want to unlock the following screens: %s?" +msgstr "Voleu desbloquejar la pantalla dels següents equips: %s?" + +#: ../tcosmonitor/extensions/appsmsg.py:64 +msgid "Clients not connected" +msgstr "No hi ha clients connectats" + +#: ../tcosmonitor/extensions/appsmsg.py:87 +#, python-format +msgid "" +"<b>Exec app in user(s) screen(s)\n" +"or open web address to:</b>\n" +"%s" +msgstr "" +"<b>Executa l'aplicació en la pantalla(s) d'usuari(s)\n" +"o obri l'adreça web a:</b>\n" +"%s" + +#: ../tcosmonitor/extensions/appsmsg.py:89 +#, python-format +msgid "" +"<b>Send a message to:</b>\n" +"%s" +msgstr "" +"<b>Envia un missatge a:</b>\n" +"%s" + +#: ../tcosmonitor/extensions/appsmsg.py:122 +#: ../tcosmonitor/extensions/appsmsg.py:163 +msgid "Can't exec application, user is not logged" +msgstr "No es poden executar aplicacions, l'usuari no està connectat" + +#: ../tcosmonitor/extensions/appsmsg.py:141 +#: ../tcosmonitor/extensions/appsmsg.py:152 +#, python-format +msgid "%s is not a valid application" +msgstr "%s no és una aplicació vàlida" + +#: ../tcosmonitor/extensions/appsmsg.py:172 +msgid "Can't send message, user is not logged" +msgstr "No es poden enviar missatges, l'usuari no està connectat" + +#: ../tcosmonitor/extensions/appsmsg.py:289 +#: ../tcosmonitor/extensions/appsmsg.py:298 +#, python-format +msgid "%s is not application" +msgstr "%s no és una aplicació" + +#: ../tcosmonitor/extensions/appsmsg.py:353 +#, python-format +msgid "" +"Error while exec remote app:\n" +"Reason: %s" +msgstr "" +"S'ha produït un error quan s'executava aplicació remota:\n" +"Raó: %s" + +#: ../tcosmonitor/extensions/appsmsg.py:360 +#, python-format +msgid "" +"Error while send message:\n" +"Reason: %s" +msgstr "" +"S'ha produït un error quan s'enviava un missatge:\n" +"Raó: %s" + +#: ../tcosmonitor/extensions/remotessh.py:47 +msgid "Enter password of remote thin client (if asked for it)" +msgstr "Introduïu la contrasenya del client lleuger (si es demanara)" + +#: ../tcosmonitor/extensions/dpms.py:79 +#, python-format +msgid "Do you want to switch off the following monitors: %s?" +msgstr "Voleu desconnectar els monitors següents: %s?" + +#: ../tcosmonitor/extensions/dpms.py:88 +#, python-format +msgid "Do you want to switch on the following monitors: %s?" +msgstr "Voleu connectar els monitors següents: %s?" + +#: ../tcosmonitor/extensions/screenshot.py:66 +#: ../tcosmonitor/extensions/screenshot.py:83 +#, python-format +msgid "Can't make screenshot, error: %s" +msgstr "No es pot fer una captura de pantalla, error: %s" + +#: ../tcosmonitor/extensions/screenshot.py:75 +msgid "Trying to order terminal to do a screenshot..." +msgstr "S'està intentant manar al terminal que faça una captura de pantalla..." + +#: ../tcosmonitor/extensions/screenshot.py:87 +msgid "Get another screenshot" +msgstr "Fes una altra captura de pantalla" + +#: ../tcosmonitor/extensions/screenshot.py:102 +#, python-format +msgid "Screenshot of <span style='font-style: italic'>%s</span>" +msgstr "Captura de pantalla de <span style='font-style: italic'>%s</span>" + +#: ../tcosmonitor/extensions/screenshot.py:125 +#, python-format +msgid "Screenshot of %s, done." +msgstr "La captura de pantalla de %s està feta." + +#: ../tcosmonitor/extensions/screenshot.py:139 +msgid "Save Screenshot" +msgstr "Guarda la captura de pantalla" + +#: ../tcosmonitor/extensions/screenshot.py:151 +msgid "Select file to save screenshot..." +msgstr "Seleccioneu el fitxer per a guardar la captura de pantalla..." + +#: ../tcosmonitor/extensions/screenshot.py:155 +#, python-format +msgid "screenshot_of_%(hostname)s_date_%(date)s.png" +msgstr "screenshot_of_%(hostname)s_date_%(date)s.png" + +#: ../tcosmonitor/extensions/screenshot.py:159 +msgid "Image Files ( *.png, *.jpg)" +msgstr "Fitxers d'imatge (*.png, *.jpg)" + +#: ../tcosmonitor/extensions/screenshot.py:169 +msgid "File must be png or jpg." +msgstr "El fitxer ha de ser png o jpg." + +#: ../tcosmonitor/extensions/screenshot.py:192 +msgid "Screenshots of all hosts" +msgstr "Captura de pantalla de tots els equips" + +#: ../tcosmonitor/extensions/screenshot.py:208 +#, python-format +msgid "Screenshot of %s" +msgstr "Captura de pantalla de %s" + +#: ../tcosmonitor/extensions/sendfiles.py:62 +#: ../tcosmonitor/extensions/sendfiles.py:120 +msgid "Can't send files, user is not logged" +msgstr "No es poden enviar fitxers, l'usuari no està connectat" + +#: ../tcosmonitor/extensions/sendfiles.py:66 +#: ../tcosmonitor/extensions/sendfiles.py:142 +#: ../tcosmonitor/extensions/sendfiles.py:237 +msgid "" +"TcosMonitor need special configuration for rsync daemon to send files.\n" +"\n" +"Please read configuration requeriments in:\n" +"/usr/share/doc/tcosmonitor/README.rsync" +msgstr "" +"El TcosMonitor necessita una configuració especial del dimoni rsync per a " +"enviar fitxers.\n" +"\n" +"Llegiu la configuració requerida en:\n" +"/usr/share/doc/tcosmonitor/README.rsync" + +#: ../tcosmonitor/extensions/sendfiles.py:84 +#: ../tcosmonitor/extensions/sendfiles.py:176 +#: ../tcosmonitor/extensions/sendfiles.py:270 +msgid "Waiting for send files..." +msgstr "S'està esperant l'enviament de fitxers..." + +#: ../tcosmonitor/extensions/sendfiles.py:93 +#: ../tcosmonitor/extensions/sendfiles.py:95 +#: ../tcosmonitor/extensions/sendfiles.py:99 +#: ../tcosmonitor/extensions/sendfiles.py:108 +#: ../tcosmonitor/extensions/sendfiles.py:189 +#: ../tcosmonitor/extensions/sendfiles.py:191 +#: ../tcosmonitor/extensions/sendfiles.py:195 +#: ../tcosmonitor/extensions/sendfiles.py:204 +#: ../tcosmonitor/extensions/sendfiles.py:283 +#: ../tcosmonitor/extensions/sendfiles.py:285 +#: ../tcosmonitor/extensions/sendfiles.py:289 +#: ../tcosmonitor/extensions/sendfiles.py:298 +msgid "Teacher" +msgstr "Mestre" + +#: ../tcosmonitor/extensions/sendfiles.py:95 +#: ../tcosmonitor/extensions/sendfiles.py:108 +#: ../tcosmonitor/extensions/sendfiles.py:191 +#: ../tcosmonitor/extensions/sendfiles.py:204 +#: ../tcosmonitor/extensions/sendfiles.py:285 +#: ../tcosmonitor/extensions/sendfiles.py:298 +#, python-format +msgid "" +"Teacher has sent some files to %(teacher)s folder:\n" +"\n" +"%(basenames)s" +msgstr "" +"El professor ha enviat diversos fitxers a la carpeta %(teacher)s:\n" +"\n" +"%(basenames)s" + +#: ../tcosmonitor/extensions/sendfiles.py:104 +#: ../tcosmonitor/extensions/sendfiles.py:200 +#: ../tcosmonitor/extensions/sendfiles.py:294 +#: ../tcosmonitor/extensions/reboot.py:108 +#: ../tcosmonitor/extensions/videolan.py:194 +#: ../tcosmonitor/extensions/videolan.py:389 +#: ../tcosmonitor/extensions/videolan.py:629 +#, python-format +msgid "" +"Error while exec remote app:\n" +"Reason:%s" +msgstr "" +"S'ha produït un error quan s'executava l'aplicació remota:\n" +"Raó: %s" + +#: ../tcosmonitor/extensions/sendfiles.py:105 +#: ../tcosmonitor/extensions/sendfiles.py:201 +#: ../tcosmonitor/extensions/sendfiles.py:295 +msgid "Error creating destination folder." +msgstr "S'ha produït un error en crear el directori destinació." + +#: ../tcosmonitor/extensions/sendfiles.py:110 +#: ../tcosmonitor/extensions/sendfiles.py:205 +#: ../tcosmonitor/extensions/sendfiles.py:300 +msgid "Files sent." +msgstr "Fitxers enviats." + +#: ../tcosmonitor/extensions/sendfiles.py:125 +#: ../tcosmonitor/extensions/sendfiles.py:220 +msgid "Select file or files..." +msgstr "Seleccioneu el fitxer o fitxers..." + +#: ../tcosmonitor/extensions/sendfiles.py:178 +#: ../tcosmonitor/extensions/sendfiles.py:272 +msgid "Do you want open file(s) on client?" +msgstr "Voleu obrir el fitxer(s) en el client?" + +#: ../tcosmonitor/extensions/sendfiles.py:215 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:113 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:155 +#: ../tcosmonitor/extensions/videolan.py:457 +#: ../tcosmonitor/extensions/vnc.py:68 ../tcosmonitor/extensions/vnc.py:112 +#: ../tcosmonitor/extensions/vnc.py:422 +#: ../tcosmonitor/extensions/audiortp.py:229 +#: ../tcosmonitor/extensions/audiortp.py:275 +#: ../tcosmonitor/extensions/audiortp.py:373 +#: ../tcosmonitor/extensions/audiortp.py:407 +#: ../tcosmonitor/extensions/audiortp.py:460 +msgid "No users logged." +msgstr "No hi ha usuaris connectats." + +#: ../tcosmonitor/extensions/info.py:91 +#, python-format +msgid "Connecting with %s to retrieve some info..." +msgstr "S'està connectant a %s per a rebre informació..." + +#: ../tcosmonitor/extensions/info.py:117 +msgid "Tcos info" +msgstr "Informació de Tcos" + +#: ../tcosmonitor/extensions/info.py:120 +msgid "PXES info" +msgstr "Informació de PXES" + +#: ../tcosmonitor/extensions/info.py:123 +msgid "LTSP info" +msgstr "Informació d'LTSP" + +#: ../tcosmonitor/extensions/info.py:126 +msgid "Standalone info" +msgstr "Informació de l'equip autònom" + +#: ../tcosmonitor/extensions/info.py:129 +msgid "Unknow client info" +msgstr "Informació de client desconegut" + +#: ../tcosmonitor/extensions/info.py:135 ../tcosmonitor/LocalData.py:43 +#: ../tcosmonitor/LocalData.py:62 ../tcosmonitor/TcosCommon.py:182 +#: ../tcosmonitor/TcosCommon.py:190 ../tcosmonitor/TcosCommon.py:206 +#: ../tcosmonitor/TcosCommon.py:209 +msgid "unknow" +msgstr "desconegut" + +#: ../tcosmonitor/extensions/info.py:138 +msgid "Hostname: " +msgstr "Equip: " + +#: ../tcosmonitor/extensions/info.py:139 +msgid "Ip address: " +msgstr "Adreça IP: " + +#: ../tcosmonitor/extensions/info.py:140 +msgid "TcosXmlRpc version: " +msgstr "Versió de TcosXmlRpc: " + +#: ../tcosmonitor/extensions/info.py:149 +msgid "Tcos image version: " +msgstr "Versió de la imatge del TCOS: " + +#: ../tcosmonitor/extensions/info.py:150 +msgid "Tcos image date: " +msgstr "Data de la imatge del TCOS: " + +#: ../tcosmonitor/extensions/info.py:151 +msgid "Date of thin client: " +msgstr "Data del client lleuger: " + +#: ../tcosmonitor/extensions/info.py:152 +msgid "Uptime: " +msgstr "Temps encés: " + +#: ../tcosmonitor/extensions/info.py:163 +msgid "Kernel info" +msgstr "Informació del nucli" + +#: ../tcosmonitor/extensions/info.py:172 +msgid "Force download and mount all modules" +msgstr "Força la baixada i munta tots els mòduls" + +# Mozilla 1.3->groupByNone.label +#: ../tcosmonitor/extensions/info.py:183 +msgid "None" +msgstr "Cap" + +#: ../tcosmonitor/extensions/info.py:186 +msgid "Kernel version: " +msgstr "Versió del nucli: " + +#: ../tcosmonitor/extensions/info.py:187 +msgid "Kernel complete version: " +msgstr "Versió completa del nucli: " + +#: ../tcosmonitor/extensions/info.py:188 +msgid "Loaded Modules: " +msgstr "Mòduls carregats: " + +#: ../tcosmonitor/extensions/info.py:189 +msgid "Modules not found: " +msgstr "Mòduls no trobats: " + +#: ../tcosmonitor/extensions/info.py:205 +msgid "Cpu info: " +msgstr "Informació de la CPU: " + +#: ../tcosmonitor/extensions/info.py:212 +msgid "Cpu model: " +msgstr "Model de CPU: " + +#: ../tcosmonitor/extensions/info.py:213 +msgid "Cpu vendor: " +msgstr "Venedor de la CPU: " + +#: ../tcosmonitor/extensions/info.py:214 +msgid "Cpu speed: " +msgstr "Velocitat de la CPU: " + +#: ../tcosmonitor/extensions/info.py:225 +msgid "PCI buses: " +msgstr "Busos PCI: " + +#: ../tcosmonitor/extensions/info.py:254 +msgid "Process running: " +msgstr "Processos en execució:" + +#: ../tcosmonitor/extensions/info.py:267 +msgid "Ram info: " +msgstr "Informació de la ram:" + +#: ../tcosmonitor/extensions/info.py:274 +msgid "Total Ram: " +msgstr "RAM total: " + +#: ../tcosmonitor/extensions/info.py:275 +msgid "Free RAM: " +msgstr "RAM lliure: " + +#: ../tcosmonitor/extensions/info.py:276 +msgid "Active RAM: " +msgstr "RAM activa: " + +#: ../tcosmonitor/extensions/info.py:279 +msgid "Swap info: " +msgstr "Informació de la SWAP:" + +#: ../tcosmonitor/extensions/info.py:285 +msgid "Swap enabled: " +msgstr "Swap activada: " + +#: ../tcosmonitor/extensions/info.py:286 +msgid "Total Swap: " +msgstr "Swap total: " + +#: ../tcosmonitor/extensions/info.py:287 +msgid "Used Swap: " +msgstr "Swap usada: " + +#: ../tcosmonitor/extensions/info.py:297 +msgid "Network info: " +msgstr "Informació de la xarxa:" + +#: ../tcosmonitor/extensions/info.py:307 +msgid "Network hostname: " +msgstr "Nom de màquina de xarxa: " + +#: ../tcosmonitor/extensions/info.py:308 +msgid "Network IP: " +msgstr "Adreça IP: " + +#: ../tcosmonitor/extensions/info.py:309 +msgid "Network MASK: " +msgstr "Màscara de xarxa: " + +#: ../tcosmonitor/extensions/info.py:310 +msgid "Network MAC: " +msgstr "Xarxa de MAC: " + +#: ../tcosmonitor/extensions/info.py:311 +msgid "Data received(rx): " +msgstr "Dades rebudes(rx): " + +#: ../tcosmonitor/extensions/info.py:312 +msgid "Data send(tx): " +msgstr "Dades enviades(tx): " + +#: ../tcosmonitor/extensions/info.py:322 ../ui/tcosmonitor-prefwindow.ui:911 +msgid "Xorg info" +msgstr "Informació de l'Xorg" + +#: ../tcosmonitor/extensions/info.py:348 +msgid "enabled" +msgstr "activat" + +#: ../tcosmonitor/extensions/info.py:350 +msgid "disabled" +msgstr "desactivat" + +#: ../tcosmonitor/extensions/info.py:353 ../ui/tcospersonalize.ui:159 +msgid "X Session Type" +msgstr "Tipus de sessió X" + +#: ../tcosmonitor/extensions/info.py:355 ../ui/tcospersonalize.ui:201 +msgid "Xorg Driver" +msgstr "Controlador d'Xorg" + +#: ../tcosmonitor/extensions/info.py:357 ../ui/tcospersonalize.ui:94 +msgid "Xorg Resolution" +msgstr "Resolució de l'Xorg" + +#: ../tcosmonitor/extensions/info.py:359 ../ui/tcospersonalize.ui:133 +msgid "Xorg Color depth" +msgstr "Profunditat de color de l'Xorg" + +#: ../tcosmonitor/extensions/info.py:361 ../ui/tcospersonalize.ui:179 +msgid "DPMS energy monitor control" +msgstr "Control d'energia del monitor DPMS" + +#: ../tcosmonitor/extensions/info.py:363 +msgid "Disable kill X with Ctrl+Alt+Backspace" +msgstr "Inhabilita matar l'X amb Ctrl+Alt+Backspace" + +#: ../tcosmonitor/extensions/info.py:365 ../ui/tcospersonalize.ui:57 +msgid "Enable mouse wheel" +msgstr "Activa la roda del ratolí" + +#: ../tcosmonitor/extensions/info.py:367 +msgid "Refresh rate" +msgstr "Taxa de refresc" + +#: ../tcosmonitor/extensions/info.py:369 +msgid "Xorg font server" +msgstr "Servidor de tipus de lletra de l'Xorg" + +#: ../tcosmonitor/extensions/info.py:371 +msgid "Mouse device" +msgstr "Dispositiu del ratolí" + +#: ../tcosmonitor/extensions/info.py:373 +msgid "Mouse protocol" +msgstr "Protocol del ratolí" + +#: ../tcosmonitor/extensions/info.py:375 ../ui/tcospersonalize.ui:273 +msgid "X Horiz sync" +msgstr "Sincronització horitzontal X" + +#: ../tcosmonitor/extensions/info.py:377 ../ui/tcospersonalize.ui:284 +msgid "X Vert sync" +msgstr "Sincronització vertical X" + +#: ../tcosmonitor/extensions/info.py:390 +msgid "PulseAudio Sound server is running" +msgstr "El servidor PulseAudio està en funcionament" + +#: ../tcosmonitor/extensions/info.py:408 +msgid "Remote Sound Mixer" +msgstr "Mesclador de so remot" + +#: ../tcosmonitor/extensions/info.py:480 +msgid "PulseAudio Control" +msgstr "Control de PulseAudio" + +#: ../tcosmonitor/extensions/info.py:485 +msgid "PulseAudio Meter" +msgstr "Comptador de PulseAudio " + +#: ../tcosmonitor/extensions/info.py:490 +msgid "PulseAudio Manager" +msgstr "Gestor de PulseAudio" + +#: ../tcosmonitor/extensions/info.py:494 +msgid "PulseAudio utils: " +msgstr "Utilitats de PulseAudio: " + +#: ../tcosmonitor/extensions/info.py:500 +msgid "PulseAudio stats" +msgstr "Estadístiques de PulseAudio: " + +#: ../tcosmonitor/extensions/info.py:512 +msgid "Currently in use" +msgstr "Actualment en ús" + +#: ../tcosmonitor/extensions/info.py:513 +msgid "Allocated during whole lifetime" +msgstr "S'ha assignat per sempre" + +#: ../tcosmonitor/extensions/info.py:514 +msgid "Sample cache size" +msgstr "Mida de la memòria cau de mostra" + +#: ../tcosmonitor/extensions/info.py:515 +msgid "User name" +msgstr "Nom d'usuari" + +#: ../tcosmonitor/extensions/info.py:516 +msgid "Host Name" +msgstr "Nom de l'ordinador" + +#: ../tcosmonitor/extensions/info.py:517 +msgid "Server Name" +msgstr "Nom del servidor" + +#: ../tcosmonitor/extensions/info.py:518 +msgid "Server Version" +msgstr "Versió del servidor" + +#: ../tcosmonitor/extensions/info.py:519 +msgid "Default Sample Specification" +msgstr "Especificació de la mostra per defecte" + +#: ../tcosmonitor/extensions/info.py:520 +msgid "Default Sink" +msgstr "Eixida d'àudio per defecte" + +#: ../tcosmonitor/extensions/info.py:521 +msgid "Default Source" +msgstr "Entrada d'àudio per defecte" + +#: ../tcosmonitor/extensions/info.py:522 +msgid "Cookie" +msgstr "Galleta" + +#: ../tcosmonitor/extensions/info.py:528 +msgid "Sound server is not running" +msgstr "El servidor de so no està en funcionament" + +#: ../tcosmonitor/extensions/info.py:589 ../tcosmonitor/extensions/info.py:597 +#: ../tcosmonitor/extensions/info.py:605 +msgid "PulseAudio apps need /dev/shm." +msgstr "L'aplicació PulseAudio necessita /dev/shm" + +#: ../tcosmonitor/extensions/logout.py:48 +#: ../tcosmonitor/extensions/logout.py:71 +msgid "User not logged" +msgstr "L'usuari no està connectat." + +#: ../tcosmonitor/extensions/logout.py:51 +#, python-format +msgid "Do you want to logout user: %s?" +msgstr "Voleu desconnectar l'usuari: %s?" + +#: ../tcosmonitor/extensions/logout.py:55 +#: ../tcosmonitor/extensions/logout.py:77 +#, python-format +msgid "Session will close in %s seconds" +msgstr "La sessió es tancarà en %s segons" + +#: ../tcosmonitor/extensions/logout.py:73 +#, python-format +msgid "Do you want to logout the following users: %s?" +msgstr "Voleu desconnectar els següents usuaris: %s?" + +#: ../tcosmonitor/extensions/reboot.py:48 +#, python-format +msgid "Do you want to reboot: %s?" +msgstr "Voleu tornar a arracar: %s?" + +#: ../tcosmonitor/extensions/reboot.py:51 +#: ../tcosmonitor/extensions/reboot.py:61 +#, python-format +msgid "Pc will reboot in %s seconds" +msgstr "L'equip es reiniciarà en %s segons" + +#: ../tcosmonitor/extensions/reboot.py:58 +#, python-format +msgid "Do you want to reboot the following clients: %s?" +msgstr "Voleu tornar a arracar els clients següents: %s?" + +#: ../tcosmonitor/extensions/reboot.py:67 +#, python-format +msgid "Do you want to poweroff: %s?" +msgstr "Voleu apagar l'equip: %s?" + +#: ../tcosmonitor/extensions/reboot.py:70 +#: ../tcosmonitor/extensions/reboot.py:80 +#, python-format +msgid "Pc will shutdown in %s seconds" +msgstr "L'equip s'apagarà en %s segons" + +#: ../tcosmonitor/extensions/reboot.py:77 +#, python-format +msgid "Do you want to poweroff the following clients: %s?" +msgstr "Voleu apagar els clients següents: %s?" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:50 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:109 +msgid "Internet connection has been disabled" +msgstr "La connexió a Internet s'ha inhabilitat" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:54 +msgid "Can't disable internet, user is not logged" +msgstr "No es pot inhabilitar Internet, l'usuari no està connectat" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:59 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:85 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:103 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:147 +#, python-format +msgid "" +"In order to lock and unlock internet you need to be in 'tcos' group.\n" +"\n" +"Exe by root: adduser %s tcos" +msgstr "" +"Per a bloquejar i desbloquejar internet heu de estar en el grup 'tcos'.\n" +"\n" +"Executeu com a root: adduser %s tcos" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:77 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:151 +msgid "Internet connection has been enabled" +msgstr "La connexió a Internet s'ha habilitat" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:81 +msgid "Can't enable internet, user is not logged" +msgstr "No es pot habilitar Internet, l'usuari no està connectat" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:116 +#, python-format +msgid "Do you want disable internet to following users: %s?" +msgstr "Voleu inhabilitar Internet als següents usuaris: %s?" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:158 +#, fuzzy, python-format +msgid "Do you want enable internet to following users:%s?" +msgstr "Voleu habilitar Internet als següents usuaris: %s?" + +#: ../tcosmonitor/extensions/videolan.py:48 +#: ../tcosmonitor/extensions/videolan.py:49 +msgid "Send Audio/Video broadcast" +msgstr "Envia difusió d'àudio/vídeo" + +#: ../tcosmonitor/extensions/videolan.py:65 +#: ../tcosmonitor/extensions/videolan.py:219 +msgid "Can't send video broadcast, user is not logged" +msgstr "No es pot enviar la difusió de vídeo, l'usuari no està connectat" + +#: ../tcosmonitor/extensions/videolan.py:149 +#: ../tcosmonitor/extensions/videolan.py:347 +#: ../tcosmonitor/extensions/videolan.py:578 +#, python-format +msgid "" +"Not allowed white spaces in \"%s\".\n" +"Please rename it." +msgstr "" +"No es permeten espais en \"%s\".\n" +"Reanomeneu-lo." + +#: ../tcosmonitor/extensions/videolan.py:159 +#: ../tcosmonitor/extensions/videolan.py:359 +#: ../tcosmonitor/extensions/videolan.py:594 +msgid "Waiting for start video transmission..." +msgstr "S'està esperant per a arrancar la transmissió de vídeo..." + +#: ../tcosmonitor/extensions/videolan.py:167 +#: ../tcosmonitor/extensions/videolan.py:367 +#: ../tcosmonitor/extensions/videolan.py:602 +#: ../tcosmonitor/extensions/vnc.py:98 ../tcosmonitor/extensions/vnc.py:407 +msgid "Error while exec app" +msgstr "S'ha produït un error quan s'executava l'aplicació" + +#: ../tcosmonitor/extensions/videolan.py:199 +#: ../tcosmonitor/extensions/videolan.py:393 +#: ../tcosmonitor/extensions/videolan.py:634 +msgid "Running in broadcast video transmission." +msgstr "S'està executant en mode de difusió de vídeo." + +#: ../tcosmonitor/extensions/videolan.py:208 +#: ../tcosmonitor/extensions/videolan.py:402 +#, python-format +msgid "" +"Running in broadcast video transmission to user %(host)s. Broadcast Nº %" +"(count)s" +msgstr "" +"S'està executant en mode de difusió de vídeo a l'usuari %(host)s. Difusió " +"núm. %(count)s" + +#: ../tcosmonitor/extensions/videolan.py:311 +#: ../tcosmonitor/extensions/videolan.py:541 +msgid "Select audio/video file.." +msgstr "Selecciona el fitxer d'àudio/vídeo..." + +#: ../tcosmonitor/extensions/videolan.py:314 +#: ../tcosmonitor/extensions/videolan.py:544 +msgid "Play DVD" +msgstr "Reproduïx el DVD" + +#: ../tcosmonitor/extensions/videolan.py:315 +#: ../tcosmonitor/extensions/videolan.py:545 +msgid "Play SVCD/VCD" +msgstr "Reproduïx el SVCD/VCD" + +#: ../tcosmonitor/extensions/videolan.py:316 +#: ../tcosmonitor/extensions/videolan.py:546 +msgid "Play AudioCD" +msgstr "Reproduïx l'àudioCD" + +#: ../tcosmonitor/extensions/videolan.py:361 +#: ../tcosmonitor/extensions/videolan.py:596 +msgid "" +"First select the DVD chapter or play movie\n" +"then press enter to send clients..." +msgstr "" +"Primer seleccioneu el capítol del DVD o reproduïu la pel·lícula\n" +"després, premeu retorn per a enviar-ho als clients..." + +#: ../tcosmonitor/extensions/videolan.py:370 +msgid "Lock keyboard and mouse on client?" +msgstr "Voleu bloquejar el teclat i el ratolí del client?" + +#: ../tcosmonitor/extensions/videolan.py:444 +msgid "Video broadcast stopped." +msgstr "La difusió de vídeo està parada." + +#: ../tcosmonitor/extensions/videolan.py:605 +msgid "Lock keyboard and mouse on clients?" +msgstr "Voleu bloquejar el teclat i el ratolí en els clients?" + +#: ../tcosmonitor/extensions/videolan.py:643 +#, python-format +msgid "Running in broadcast video transmission. Broadcast Nº %s" +msgstr "S'està executant en mode de difusió de vídeo. Difusió núm. %s" + +#: ../tcosmonitor/extensions/restartxorg.py:51 +#, python-format +msgid "Restart X session of %s with new config?" +msgstr "Voleu reiniciar la sessió X de %s amb la nova configuració?" + +#: ../tcosmonitor/extensions/restartxorg.py:64 +#, python-format +msgid "%s is not supported to restart Xorg!" +msgstr "%s no permet reiniciar l'Xorg!" + +#: ../tcosmonitor/extensions/restartxorg.py:78 +msgid "No thin clients found." +msgstr "No s'han trobat clients lleugers." + +#: ../tcosmonitor/extensions/restartxorg.py:81 +#, python-format +msgid "Do you want to restart X screens (only thin clients):%s?" +msgstr "" +"Voleu reiniciar les sessions X dels següents equips (només clients lleugers):" +"%s?" + +#: ../tcosmonitor/extensions/italc.py:51 ../tcosmonitor/extensions/vnc.py:135 +msgid "No user logged." +msgstr "L'usuari no està connectat." + +#: ../tcosmonitor/extensions/italc.py:75 +msgid "Can't start IVS, please add iTALC support" +msgstr "No es pot arrancar el procés IVS. Afegiu el suport per a iTALC" + +#: ../tcosmonitor/extensions/tcospersonalize.py:54 +#, python-format +msgid "%s is not supported to personalize!" +msgstr "%s no permet personalitzar!" + +#: ../tcosmonitor/extensions/vnc.py:71 +#, python-format +msgid "Do you want to start demo mode the following users: %s?" +msgstr "Voleu iniciar en mode demostració els següents usuaris: %s?" + +#: ../tcosmonitor/extensions/vnc.py:83 +msgid "Waiting for start demo mode..." +msgstr "S'està esperant l'arrancada del mode demostració..." + +#: ../tcosmonitor/extensions/vnc.py:116 ../tcosmonitor/extensions/vnc.py:426 +#, python-format +msgid "Running in demo mode with %s clients." +msgstr "S'està executant en mode demostració amb %s equips." + +#: ../tcosmonitor/extensions/vnc.py:127 +#, python-format +msgid "Running in demo mode from server. Demo Nº %s" +msgstr "" +"S'està executant en mode demostració des del servidor. Demostració núm. %s" + +#: ../tcosmonitor/extensions/vnc.py:149 ../tcosmonitor/extensions/vnc.py:369 +#, python-format +msgid "Connecting with %s to start VNC support" +msgstr "S'està connectant a %s per a arrancar el suport per a VNC" + +#: ../tcosmonitor/extensions/vnc.py:178 +#, python-format +msgid "" +"Can't start VNC, error:\n" +"%s" +msgstr "" +"S'ha produït un error, no es pot arrancar el VNC:\n" +"%s" + +#: ../tcosmonitor/extensions/vnc.py:182 +msgid "Waiting for start of VNC server..." +msgstr "S'està esperant que comence el servidor VNC..." + +#: ../tcosmonitor/extensions/vnc.py:211 +msgid "Can't start VNC, please add X11VNC support" +msgstr "No es pot arrancar el VNC, per favor afegiu el suport per a X11VNC." + +#: ../tcosmonitor/extensions/vnc.py:237 +msgid "Switch to view only" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:242 ../tcosmonitor/extensions/vnc.py:273 +msgid "Switch to full control" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:269 +#, python-format +msgid "VNC host %s" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:281 +msgid "Switch to fullscreen" +msgstr "" + +# Netscape_4.7->Dialog Box Control:TEXTIMP.DLL +#: ../tcosmonitor/extensions/vnc.py:290 +#: ../tcosmonitor/extensions/livevnc.py:72 +#: ../tcosmonitor/TcosPreferences.py:539 ../tcosmonitor/TcosExtensions.py:338 +msgid "Stop" +msgstr "Para" + +#: ../tcosmonitor/extensions/vnc.py:342 +msgid "Can't start demo mode, user is not logged" +msgstr "No es pot arrancar el mode demostració, l'usuari no està connectat" + +#: ../tcosmonitor/extensions/vnc.py:345 +#, python-format +msgid "Do you want demo mode from user %s?" +msgstr "Voleu iniciar el mode demostració des de l'usuari %s?" + +#: ../tcosmonitor/extensions/vnc.py:392 +#, python-format +msgid "Waiting for start demo mode from user %s..." +msgstr "S'està esperant l'arrancada del mode demostració des de l'usuari %s..." + +#: ../tcosmonitor/extensions/vnc.py:446 +#, python-format +msgid "Running in demo mode from user %(host)s. Demo Nº %(count)s" +msgstr "" +"S'està executant en mode demostració des de l'usuari %(host)s. Demostració " +"núm. %(count)s" + +#: ../tcosmonitor/extensions/vnc.py:501 +msgid "Demo mode off." +msgstr "El mode demostració està desactivat." + +#: ../tcosmonitor/extensions/wakeonlan.py:50 +#: ../tcosmonitor/extensions/wakeonlan.py:75 +msgid "" +"Wake On Lan only works with static list.\n" +"\n" +"Enable scan method \"static\" in Preferences\n" +"and (wake on lan) support in bios of clients." +msgstr "" +"L'arrancada per xarxa només funciona amb llista estática.\n" +"\n" +"Activa el mètode d'escaneig \"static\" en Preferències\n" +"i el suport (wake on lan) en la bios dels clients." + +#: ../tcosmonitor/extensions/wakeonlan.py:54 +#, python-format +msgid "Do you want boot %s client?" +msgstr "Voleu arrancar el client %s ?" + +#: ../tcosmonitor/extensions/wakeonlan.py:67 +#: ../tcosmonitor/extensions/wakeonlan.py:91 +#, python-format +msgid "No register MAC address for ip: \"%s\"" +msgstr "No hi ha cao adreça MAC per a l'IP: \"%s\"" + +#: ../tcosmonitor/extensions/wakeonlan.py:71 +#: ../tcosmonitor/extensions/wakeonlan.py:98 +#, python-format +msgid "Not valid MAC address: \"%s\"" +msgstr "L'adreça MAC no és vàlida: \"%s\"" + +#: ../tcosmonitor/extensions/wakeonlan.py:79 +msgid "Do you want boot all clients?" +msgstr "Voleu arrancar tots els clients?" + +#: ../tcosmonitor/extensions/livevnc.py:76 +#, fuzzy +msgid "Live view of all hosts" +msgstr "Captura de pantalla de tots els equips" + +#: ../tcosmonitor/extensions/livevnc.py:194 +msgid "Running in LiveView mode" +msgstr "" + +#: ../tcosmonitor/extensions/viewproc.py:48 +msgid "Can't show runnings apps, user is not logged" +msgstr "" +"No es poden veure les aplicacions en execució, l'usuari no està connectat." + +#: ../tcosmonitor/extensions/viewproc.py:58 +msgid "User not connected, no processes." +msgstr "L'usuari no està connectat, no existixen processos." + +#: ../tcosmonitor/extensions/viewproc.py:76 +#, python-format +msgid "Running processes for user \"%s\": " +msgstr "S'estan executant els processos per a l'usuari \"%s\":" + +#: ../tcosmonitor/extensions/viewproc.py:80 +msgid "" +"ALERT: There are some system process hidden. Enable it in Preferences dialog." +msgstr "" +"AVÍS: Hi ha diversos processos del sistema ocults. Podeu activar-los en la " +"finestra de Preferències." + +# Projecte_Gnome_2.2 [libgtop.libgtop-GNOME-2-0-port.ca.po] +#: ../tcosmonitor/extensions/viewproc.py:85 +msgid "Pid" +msgstr "Identificador de procés" + +#: ../tcosmonitor/extensions/viewproc.py:86 +msgid "Process command" +msgstr "Orde del procés" + +#: ../tcosmonitor/extensions/viewproc.py:91 +msgid "Kill this process" +msgstr "Mata este procés" + +#: ../tcosmonitor/extensions/viewproc.py:127 +msgid "Are you sure you want to stop this process?" +msgstr "Esteu segur que voleu parar este procés?" + +#: ../tcosmonitor/extensions/viewproc.py:136 +#, python-format +msgid "" +"Error while killing app:\n" +"Reason: %s" +msgstr "" +"S'ha produït un error quan es tancava l'aplicació:\n" +"Raó: %s" + +#: ../tcosmonitor/extensions/audiortp.py:49 +#: ../ui/tcosmonitor-mainwindow.ui:163 +msgid "Send audio conference" +msgstr "Envia audioconferència" + +#: ../tcosmonitor/extensions/audiortp.py:50 +#: ../ui/tcosmonitor-prefwindow.ui:1507 +msgid "Audio chat conference" +msgstr "Xat d'audioconferència" + +#: ../tcosmonitor/extensions/audiortp.py:51 +#: ../ui/tcosmonitor-mainwindow.ui:275 +msgid "Audio chat list" +msgstr "Llista de xats d'àudio" + +#: ../tcosmonitor/extensions/audiortp.py:52 +msgid "Send audio conference (from this host)" +msgstr "Envia audioconferència (des d'este equip)" + +#: ../tcosmonitor/extensions/audiortp.py:73 +msgid "Emission" +msgstr "Emissió" + +#: ../tcosmonitor/extensions/audiortp.py:79 +msgid "State" +msgstr "Estat" + +# Winrar 2.9->Dialog Box Control:rarlng.dll +#: ../tcosmonitor/extensions/audiortp.py:83 +msgid "Channel" +msgstr "Canal" + +#: ../tcosmonitor/extensions/audiortp.py:235 +#: ../tcosmonitor/extensions/audiortp.py:322 +#: ../tcosmonitor/extensions/audiortp.py:413 +msgid "" +"Your pulseaudio server is too old.\n" +"Is required pulseaudio version >= 0.9.10" +msgstr "" +"El vostre servidor de pulseaudio és molt antic.\n" +"Es requerix una versió de pulseaudio >= 0.9.10" + +#: ../tcosmonitor/extensions/audiortp.py:238 +#, python-format +msgid "Do you want to start audio conference to the following users: %s?" +msgstr "Voleu iniciar el mode d'audioconferència als usuaris següents: %s?" + +#: ../tcosmonitor/extensions/audiortp.py:243 +msgid "You have entered in audio conference" +msgstr "Heu entrat en audioconferència" + +#: ../tcosmonitor/extensions/audiortp.py:267 +msgid "Waiting for start audio conference..." +msgstr "S'està esperant l'arrancada de l'audioconferència..." + +#: ../tcosmonitor/extensions/audiortp.py:295 +#: ../tcosmonitor/extensions/audiortp.py:390 +#, python-format +msgid "Running in audio conference with %s clients." +msgstr "S'està executant en mode audioconferència amb %s clients." + +#: ../tcosmonitor/extensions/audiortp.py:305 +#, python-format +msgid "Running in audio conference from server. Conference Nº %s" +msgstr "" +"S'està executant en mode audioconferència des del servidor. Conferència núm. " +"%s" + +#: ../tcosmonitor/extensions/audiortp.py:316 +msgid "Can't start conference mode, user is not logged" +msgstr "No es pot arrancar el mode conferència, l'usuari no està connectat" + +#: ../tcosmonitor/extensions/audiortp.py:325 +#, python-format +msgid "Do you want audio conference from user %s?" +msgstr "Voleu iniciar el mode audioconferència des de l'usuari %s?" + +#: ../tcosmonitor/extensions/audiortp.py:331 +#, python-format +msgid "You have entered in audio conference from user %s" +msgstr "Heu entrat en l'audioconferència des de l'usuari %s" + +#: ../tcosmonitor/extensions/audiortp.py:359 +#, python-format +msgid "Waiting for start audio conference from user %s..." +msgstr "" +"S'està esperant l'arrancada de l'audioconferència des de l'usuari %s..." + +#: ../tcosmonitor/extensions/audiortp.py:400 +#, python-format +msgid "Running in audio conference from user %(host)s. Conference Nº %(count)s" +msgstr "" +"S'està executant en mode audioconferència des de l'usuari %(host)s. " +"Conferència núm. %(count)s" + +#: ../tcosmonitor/extensions/audiortp.py:416 +#, python-format +msgid "Do you want to start audio chat conference to the following users: %s?" +msgstr "Voleu iniciar el mode xat d'audioconferència als usuaris següents: %s?" + +#: ../tcosmonitor/extensions/audiortp.py:421 +#, python-format +msgid "You have entered in audio chat conference. Participants: %s" +msgstr "Heu entrat en el xat d'audioconferència. Participants: %s" + +#: ../tcosmonitor/extensions/audiortp.py:443 +msgid "Waiting for start audio chat conference..." +msgstr "S'està esperant l'arrancada del xat d'audioconferència..." + +#: ../tcosmonitor/extensions/audiortp.py:449 +msgid "Do you want to connect to this audio chat conference now?" +msgstr "Voleu connectar-vos a este xat d'audioconferecia ara?" + +#: ../tcosmonitor/extensions/audiortp.py:483 +#, python-format +msgid "Running in audio chat conference with %s clients." +msgstr "S'està executant en mode xat d'audioconferència amb %s clients." + +#: ../tcosmonitor/extensions/audiortp.py:495 +#, python-format +msgid "Running in audio chat conference. Conference Nº %s" +msgstr "S'està executant en mode xat d'audioconferència. Conferència núm. %s" + +#: ../tcosmonitor/extensions/audiortp.py:521 +msgid "Conference mode off." +msgstr "El mode conferència està desactivat." + +#: ../tcosmonitor/extensions/audiortp.py:540 +msgid "Audio chat conference off." +msgstr "Xat d'audioconferència desactivat." + +#: ../tcosmonitor/TcosXmlRpc.py:85 +msgid "" +"Username or password are empty,\n" +"please edit in preferences dialog!" +msgstr "" +"L'usuari o la contrasenya estan buits,\n" +"per favor, editeu el diàleg de preferències" + +#: ../tcosmonitor/TcosIconView.py:55 +msgid "Place mouse on any computer to see brief info about it." +msgstr "" +"Moveu el ratolí per damunt de cada equip per a obtindre una descripció més " +"detallada." + +#: ../tcosmonitor/TcosListView.py:82 +msgid "Active" +msgstr "Actiu" + +#: ../tcosmonitor/TcosListView.py:92 +msgid "Screen Blocked" +msgstr "Pantalla bloquejada" + +#: ../tcosmonitor/TcosListView.py:97 +msgid "Num of process" +msgstr "Nombre de processos" + +#: ../tcosmonitor/TcosListView.py:112 +msgid "Sel" +msgstr "Selecciona" + +#: ../tcosmonitor/TcosListView.py:148 +#, python-format +msgid "Error connecting to tcosxmlrpc in %s" +msgstr "S'ha produït un error en connectar a tcosxmlrpc en %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:154 +#, fuzzy, python-format +msgid "Floppy: %s" +msgstr "Disquet" + +# FIXME: handleme +#: ../tcosmonitor/TcosTrayIcon2.py:156 +#, fuzzy, python-format +msgid "CDROM: %s" +msgstr "ERROR: %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:158 +#, fuzzy, python-format +msgid "USB: %s" +msgstr "Dispositiu USB %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:160 +#, fuzzy, python-format +msgid "HDD partition: %s" +msgstr "Partición del disc %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:162 +#, fuzzy, python-format +msgid "Unknow: %s" +msgstr "desconegut" + +#: ../tcosmonitor/Initialize.py:217 +msgid "GPL-2 license file not found" +msgstr "El fitxer de llicència GPL-2 no s'ha trobat" + +#: ../tcosmonitor/LocalData.py:212 +#, python-format +msgid "Selected network inteface (%s) don't have IP address" +msgstr "La interfície de xarxa seleccionada (%s) no té adreça IP" + +#: ../tcosmonitor/LocalData.py:260 ../tcosmonitor/ping.py:108 +#: ../tcosmonitor/ping.py:171 +msgid "Testing if found clients have 8998 or 8999 port open..." +msgstr "" +"S'està comprovant si els clients trobats tenen el port 8998 o 8999 obert..." + +#: ../tcosmonitor/LocalData.py:282 +msgid "" +"Static list method configured but no hosts in list.\n" +"\n" +"Please, open preferences, click on 'Open Static Host list' and add some " +"hosts." +msgstr "" +"Està configurat el mètode de llista estàtica d'equips però no hi ha equips " +"en la llista.\n" +"\n" +"Per favor, obriu les preferències, feu clic en 'Obri la llista estàtica " +"d'equips' i afegiu-ne alguns." + +#: ../tcosmonitor/TcosPreferences.py:264 +msgid "" +"You have select more than 5 button menus.\n" +"Only allowed to select a maximum of 5 buttons." +msgstr "" +"Heu seleccionat més de 5 botons de menús.\n" +"Només està permés seleccionar un màxim de 5 botons." + +#: ../tcosmonitor/TcosPreferences.py:275 +msgid "New settings saved." +msgstr "Configuració nova guardada." + +#: ../tcosmonitor/TcosMenus.py:102 ../tcosmonitor/TcosMenus.py:114 +#, python-format +msgid "Actions for %s" +msgstr "Accions per a %s" + +#: ../tcosmonitor/TcosMenus.py:107 +msgid "Actions for selected host" +msgstr "Accions per a l'equip seleccionat" + +#: ../tcosmonitor/TcosMenus.py:168 ../tcosmonitor/TcosMenus.py:299 +#, python-format +msgid "%d hidden actions" +msgstr "%d accions ocultes" + +#: ../tcosmonitor/TcosMenus.py:243 ../tcosmonitor/TcosMenus.py:245 +msgid "Actions for selected hosts" +msgstr "Accions per als equips seleccionats" + +#: ../tcosmonitor/TcosMenus.py:247 +msgid "Actions for all hosts" +msgstr "Accions per a tots els equips" + +#: ../tcosmonitor/TcosMenus.py:304 +msgid "Save hosts positions" +msgstr "Guarda les posicions dels equips" + +#: ../tcosmonitor/TcosMenus.py:312 +msgid "Reset hosts positions" +msgstr "Reinicialitza les posicions dels equips" + +#: ../tcosmonitor/ping.py:80 +#, python-format +msgid "Ping to %s..." +msgstr "Ping a %s..." + +#: ../tcosmonitor/ping.py:89 +msgid "Waiting for pings..." +msgstr "S'estan esperant els pings..." + +#: ../tcosmonitor/ping.py:127 ../tcosmonitor/ping.py:192 +#: ../tcosmonitor/TcosActions.py:185 ../tcosmonitor/TcosActions.py:264 +msgid "Not connected hosts found." +msgstr "No s'han trobat equips connectats." + +#: ../tcosmonitor/ping.py:134 ../tcosmonitor/ping.py:197 +#: ../tcosmonitor/TcosActions.py:187 ../tcosmonitor/TcosActions.py:259 +#, python-format +msgid "Found %d hosts" +msgstr "S'han trobat %d equips" + +#: ../tcosmonitor/TcosActions.py:162 ../tcosmonitor/TcosActions.py:241 +msgid "Searching for connected hosts..." +msgstr "S'estan buscant equips connectats..." + +#: ../tcosmonitor/TcosActions.py:1019 +msgid "Searching info of hosts..." +msgstr "S'està buscant informació d'equips..." + +#: ../tcosmonitor/TcosActions.py:1058 +#, python-format +msgid "Connecting to %s..." +msgstr "S'està connectant a %s..." + +#: ../tcosmonitor/TcosExtensions.py:41 +msgid "Exception:" +msgstr "Excepció:" + +#: ../tcosmonitor/TcosExtensions.py:77 +msgid "Error: no IP!" +msgstr "Error: No s'ha indicat cap adreça IP." + +#: ../tcosmonitor/TcosExtensions.py:154 +msgid "No clients connected, press refresh button." +msgstr "No hi ha clients connectats, premeu el botó d'actualitzar." + +#: ../tcosmonitor/TcosExtensions.py:251 ../tcosmonitor/TcosExtensions.py:253 +#, python-format +msgid "Can't exec this action at '%s' because you are connected at this host!" +msgstr "" +"No es pot executar esta acció a '%s' perquè esteu connectat a este equip." + +#: ../tcosmonitor/TcosExtensions.py:267 +#, python-format +msgid "Doing action \"%(action)s\" in %(ip)s..." +msgstr "S'està realitzant l'acció \"%(action)s\" en l'equip %(ip)s..." + +#: ../tcosmonitor/TcosExtensions.py:285 +#, python-format +msgid "Done action \"%(action)s\" in %(ip)s" +msgstr "L'acció \"%(action)s\" s'ha acabat en %(ip)s" + +#: ../tcosmonitor/TcosCommon.py:89 +#, python-format +msgid "" +"ThreadController: Found error executing %(cmd)s\n" +"\n" +"If problem persist, disable Thread Controller\n" +"in Preferences and report bug.\n" +"Error=%(error)s" +msgstr "" +"Controlador de fils: S'ha trobat un error en executar %(cmd)s\n" +"\n" +"Si el problema persistix, desactiveu el Controlador de fils\n" +"en Preferències i informeu de l'error.\n" +"Error=%(error)s" + +#: ../ui/tcosmonitor-prefwindow.ui:35 ../ui/tcospersonalize.ui:7 +#: ../ui/tcosmonitor-mainwindow.ui:36 +msgid "Preferences" +msgstr "Preferències" + +#: ../ui/tcosmonitor-prefwindow.ui:62 +msgid "Show host list on startup" +msgstr "Mostra la llista d'equips a l'arrancada" + +#: ../ui/tcosmonitor-prefwindow.ui:80 +msgid "Scan network method" +msgstr "Mètode d'escaneig de xarxa" + +#: ../ui/tcosmonitor-prefwindow.ui:91 +msgid "" +"Network interface\n" +"(thin client)" +msgstr "" +"Interfície de xarxa\n" +"(clients lleugers)" + +#: ../ui/tcosmonitor-prefwindow.ui:127 +msgid "Show system process" +msgstr "Mostra els processos del sistema" + +#: ../ui/tcosmonitor-prefwindow.ui:144 +#, fuzzy +msgid "Don't do actions when running TcosMonitor in thin client" +msgstr "" +"No executes accions quan el Lliurex Lab s'execute des d'un client lleuger" + +#: ../ui/tcosmonitor-prefwindow.ui:163 +msgid "List of hosts" +msgstr "Llista d'equips" + +#: ../ui/tcosmonitor-prefwindow.ui:200 +msgid "Open static host list" +msgstr "Obri la llista d'equips estàtics" + +#: ../ui/tcosmonitor-prefwindow.ui:225 +msgid "Only show hosts running tcosxmlrpc (8998 port)" +msgstr "Mostra només els equips que executen amb tcosmxlrpc (port 8998)" + +#: ../ui/tcosmonitor-prefwindow.ui:242 +#, fuzzy +msgid "Only do all actions on selected hosts (requires restart TcosMonitor)" +msgstr "" +"Fes només les accions per a equips seleccionats (cal reiniciar el Lliurex " +"Lab)" + +#: ../ui/tcosmonitor-prefwindow.ui:259 +msgid "Enable SSL connections to XMLRPC clients" +msgstr "Habilita les connexions SSL als clients XMLRPC" + +#: ../ui/tcosmonitor-prefwindow.ui:278 +msgid "Host list mode" +msgstr "Mode llista d'equips" + +#: ../ui/tcosmonitor-prefwindow.ui:302 +msgid "Show right menu with groups (NEW)" +msgstr "Mostra el menú de la dreta amb grups (NOU)" + +#: ../ui/tcosmonitor-prefwindow.ui:319 +#, fuzzy +msgid "Don't show thin client if TcosMonitor is running there" +msgstr "" +"No executes accions quan el Lliurex Lab s'execute des d'un client lleuger" + +# Winrar 2.9->String:rarlng.dll +#: ../ui/tcosmonitor-prefwindow.ui:351 +msgid "Settings" +msgstr "Paràmetres" + +#: ../ui/tcosmonitor-prefwindow.ui:376 +msgid "Update host list every (seg)" +msgstr "Actualitza la llista d'equips cada (seg)" + +#: ../ui/tcosmonitor-prefwindow.ui:389 +msgid "" +"Update host list every selected seconds.\n" +"\n" +"Value=0 disable update." +msgstr "" +"Actualitza la llista d'equips cada nombre\n" +"de segons seleccionat.\n" +"Valor=0 inhabilita l'actualització." + +#: ../ui/tcosmonitor-prefwindow.ui:405 +msgid "Cache timeout (seg)" +msgstr "Temps de vida de la memòria cau (seg)" + +#: ../ui/tcosmonitor-prefwindow.ui:419 +msgid "" +"Cache some data and connection status during selected seconds.\n" +"\n" +"Value=0 disable cache." +msgstr "" +"Guarda en la memòria cau dades i l'estat de connexió durant el nombre de " +"segons seleccionat.\n" +"\n" +"Valor=0 inhabilita la memòria cau." + +#: ../ui/tcosmonitor-prefwindow.ui:437 +msgid "Screenshot size:" +msgstr "Grandària de captura de pantalla:" + +#: ../ui/tcosmonitor-prefwindow.ui:450 ../ui/tcosmonitor-prefwindow.ui:479 +msgid "% Size of screnshot." +msgstr "%s de grandària de captura de pantalla." + +#: ../ui/tcosmonitor-prefwindow.ui:466 +msgid "Mini screenshot size:" +msgstr "Grandària de les minicaptures de pantalla:" + +#: ../ui/tcosmonitor-prefwindow.ui:495 +msgid "Timeout actions (seg)" +msgstr "Temps d'espera per a accions (seg)" + +#: ../ui/tcosmonitor-prefwindow.ui:508 +msgid "" +"Timeout in seg for actions\n" +"\n" +"Value=0 default" +msgstr "" +"Temps d'espera en segons per a accions\n" +"\n" +"Valor=per defecte 0" + +#: ../ui/tcosmonitor-prefwindow.ui:526 +msgid "SSH remote username" +msgstr "Usuari remot SSH" + +#: ../ui/tcosmonitor-prefwindow.ui:553 +msgid "VLC method to send" +msgstr "VLC mètode d'enviament" + +#: ../ui/tcosmonitor-prefwindow.ui:578 +msgid "" +"<b>Experimental: Thread Controller</b>\n" +"( if you have problems, disable it )" +msgstr "" +"<b>Experimental: Control de fils</b>\n" +"( Si teniu problemes, desactiveu-lo )" + +#: ../ui/tcosmonitor-prefwindow.ui:591 +msgid "Actions controlled" +msgstr "Accions controlades" + +#: ../ui/tcosmonitor-prefwindow.ui:611 +msgid "Block ports: (80,8080... etc)" +msgstr "Bloqueja els ports: (80,8080... etc)" + +#: ../ui/tcosmonitor-prefwindow.ui:653 ../ui/tcospersonalize.ui:333 +msgid "Advanced" +msgstr "Avançat" + +#: ../ui/tcosmonitor-prefwindow.ui:680 +msgid "TcosXmlRpc username" +msgstr "Usuari del TcosXmlRpc" + +#: ../ui/tcosmonitor-prefwindow.ui:706 +msgid "TcosXmlRpc password" +msgstr "Contrasenya del TcosXmlRpc" + +#: ../ui/tcosmonitor-prefwindow.ui:735 +msgid "" +"<b>NOTE:</b>\n" +"Default user is <b>root</b> and default password is <b>root</b>.\n" +"\n" +"For <u>thin clients</u> change TCOS_ROOT_PASSWD or use TcosConfig and " +"regenerate boot images again.\n" +"\n" +"For <u>standalone</u> users you can use a system account (root) but this is " +"not recomended. Install tcos-standalone and start it by root. Set user and " +"password, this will create a <b>/etc/tcospasswd</b> file only used by TCOS " +"and your root acount will be secure." +msgstr "" +"<b>NOTA:</b>\n" +"L'usuari per defecte és <b>root</b> i la contrasenya és <b>root</b>.\n" +"\n" +"Per a <u>clients lleugers</u> canvieu el TCOS_ROOT_PASSWD o utilitzeu el " +"TcosConfig i regenereu les imatges d'arrancada de nou.\n" +"\n" +"Per a equips <u>autònoms(standalone)</u> podeu utilitzar el compte del " +"sistema (root) però això no és recomandable. Instal·leu el paquet tcos-" +"standalone i executeu-ho com a administrador. Establiu un usuari i una " +"contrasenya.La contrasenya es guardarà en <b>/etc/tcospasswd</b>, fitxer que " +"només el necessita el TCOS perquè el vostre compte de superusuari (root) " +"estiga segur." + +#: ../ui/tcosmonitor-prefwindow.ui:772 +msgid "Authentication " +msgstr "Autenticació" + +#: ../ui/tcosmonitor-prefwindow.ui:795 +msgid "<b>Info avalaible from tcosxmlrpc</b>" +msgstr "<b>Informació disponible de tcosxmlrpc</b>" + +#: ../ui/tcosmonitor-prefwindow.ui:806 +msgid "Tcos general info" +msgstr "Informació general de Tcos" + +#: ../ui/tcosmonitor-prefwindow.ui:821 +msgid "Cpu info" +msgstr "Informació de la CPU" + +#: ../ui/tcosmonitor-prefwindow.ui:836 +msgid "Kernel and modules info" +msgstr "Informació del nucli i els mòduls" + +#: ../ui/tcosmonitor-prefwindow.ui:851 +msgid "PCI bus info" +msgstr "Informació del bus PCI" + +#: ../ui/tcosmonitor-prefwindow.ui:866 +msgid "Ram and swap info" +msgstr "Informació de la RAM i la SWAP" + +#: ../ui/tcosmonitor-prefwindow.ui:881 +msgid "Process info" +msgstr "Informació de processos" + +#: ../ui/tcosmonitor-prefwindow.ui:896 +msgid "Network info" +msgstr "Informació de la xarxa" + +#: ../ui/tcosmonitor-prefwindow.ui:926 +msgid "Sound server info" +msgstr "Informació del servidor de so" + +#: ../ui/tcosmonitor-prefwindow.ui:962 +msgid "Avalaible info" +msgstr "Informació disponible" + +#: ../ui/tcosmonitor-prefwindow.ui:985 +msgid "<b>Show / hide menu items</b>" +msgstr "<b>Mostra / oculta elements de menú</b>" + +#: ../ui/tcosmonitor-prefwindow.ui:1003 +msgid "Lock and unlock screen" +msgstr "Bloqueja i desbloqueja pantalles" + +#: ../ui/tcosmonitor-prefwindow.ui:1019 +msgid "Remote SSH shell" +msgstr "Intèrpret d'ordes SSH remot" + +#: ../ui/tcosmonitor-prefwindow.ui:1037 +msgid "Configure Xorg settings" +msgstr "Configura els paràmetres de l'Xorg" + +#: ../ui/tcosmonitor-prefwindow.ui:1066 ../ui/tcosmonitor-prefwindow.ui:1427 +msgid "Exe app on user display" +msgstr "Executa l'aplicació en la pantalla de l'usuari" + +#: ../ui/tcosmonitor-prefwindow.ui:1082 ../ui/tcosmonitor-prefwindow.ui:1441 +msgid "Send a text message" +msgstr "Envia un missatge de text" + +#: ../ui/tcosmonitor-prefwindow.ui:1100 +msgid "Show running apps" +msgstr "Mostra les aplicacions en execució" + +#: ../ui/tcosmonitor-prefwindow.ui:1116 ../ui/tcosmonitor-prefwindow.ui:1457 +msgid "Send video broadcast" +msgstr "Envia la difusió del vídeo" + +#: ../ui/tcosmonitor-prefwindow.ui:1150 +msgid "Demo mode" +msgstr "Mode demostració" + +#: ../ui/tcosmonitor-prefwindow.ui:1179 +msgid "Wake on LAN" +msgstr "Desperta per xarxa" + +#: ../ui/tcosmonitor-prefwindow.ui:1195 +msgid "Audio conference mode" +msgstr "Mode àudio conferència" + +#: ../ui/tcosmonitor-prefwindow.ui:1213 +msgid "Screenshots" +msgstr "Captures de pantalla" + +#: ../ui/tcosmonitor-prefwindow.ui:1229 +msgid "Reboot and poweroff" +msgstr "Apaga i reinicia" + +#: ../ui/tcosmonitor-prefwindow.ui:1243 +msgid "Lock and unlock internet" +msgstr "Bloqueja i desbloqueja Internet" + +#: ../ui/tcosmonitor-prefwindow.ui:1259 +msgid "DPMS monitor on/off" +msgstr "Control DPMS del monitor" + +#: ../ui/tcosmonitor-prefwindow.ui:1277 +msgid "Connect using VNC" +msgstr "Connecta usant el VNC" + +#: ../ui/tcosmonitor-prefwindow.ui:1293 +msgid "Connect using iTALC" +msgstr "Connecta usant l'iTALC" + +#: ../ui/tcosmonitor-prefwindow.ui:1308 +msgid "Restart session with new settings" +msgstr "Reinicia la sessió amb la nova configuració" + +#: ../ui/tcosmonitor-prefwindow.ui:1385 +msgid "Menus" +msgstr "Menús" + +#: ../ui/tcosmonitor-prefwindow.ui:1408 +msgid "<b>Show / hide menu buttons</b>" +msgstr "<b>Mostra / oculta els botons del menú</b>" + +#: ../ui/tcosmonitor-prefwindow.ui:1491 +msgid "Audio conference" +msgstr "Audioconferència" + +#: ../ui/tcosmonitor-prefwindow.ui:1525 +msgid "Audio Chat control" +msgstr "Control de xat d'àudio" + +#: ../ui/tcosmonitor-prefwindow.ui:1569 +msgid "Menu buttons" +msgstr "Botons de menú" + +#: ../ui/tcosmonitor-abouttcos.ui:6 +msgid "About TCOS" +msgstr "Quant al TCOS" + +#: ../ui/tcosmonitor-abouttcos.ui:19 +msgid "<span size=\"xx-large\">TcosMonitor</span>" +msgstr "<span size=\"x-large\">TcosMonitor</span>" + +#: ../ui/tcosmonitor-abouttcos.ui:62 +msgid "<b>Version:</b>" +msgstr "<b>Versió:</b>" + +#: ../ui/tcosmonitor-abouttcos.ui:90 +msgid "" +"Thin client and standalone\n" +"monitoring tool." +msgstr "" + +#: ../ui/tcosmonitor-abouttcos.ui:131 +msgid "Project web site" +msgstr "Pàgina web del projecte" + +#: ../ui/tcosmonitor-abouttcos.ui:178 +msgid "About" +msgstr "Quant a" + +#: ../ui/tcosmonitor-abouttcos.ui:212 +msgid "License" +msgstr "Llicència" + +#: ../ui/tcosmonitor-abouttcos.ui:230 +msgid "" +"Main developers:\n" +" * Mario Izquierdo <mariodebian at gmail.com>\n" +" * Ignacio Vidal <vidal_joshur at gva.es>\n" +"\n" +"Contributors:\n" +" * Andrés Jimenez\n" +" * Quirón\n" +"\n" +"Special thanks to:\n" +" Comunidad de Madrid, MaX group (Spain)" +msgstr "" +"Programadors principals:\n" +" * Mario Izquierdo <mariodebian at gmail.com>\n" +" * Ignacio Vidal <vidal_joshur at gva.es>\n" +"\n" +"Han contribuït:\n" +" * Andrés Jimenez\n" +" * Quirón\n" +"\n" +"Molt especialment gràcies a:\n" +" Comunitat de Madrid, grup MaX (Espanya)" + +#: ../ui/tcosmonitor-abouttcos.ui:259 +msgid "Authors" +msgstr "Autors" + +#: ../ui/tcosmonitor-abouttcos.ui:275 +msgid "Translated to your language by:" +msgstr "Traduït al vostre idioma per:" + +#: ../ui/tcosmonitor-abouttcos.ui:287 +msgid "Mario Izquierdo <mariodebian@gmail.com>" +msgstr "Pilar Embid (Lliurex) <embid_mar@gva.es>" + +#: ../ui/tcosmonitor-abouttcos.ui:307 +msgid "Translators" +msgstr "Traductors" + +#: ../ui/tcosmonitor-abouttcos.ui:324 +msgid "" +"TCOS is a free software project that need a lot of work to be the best thin " +"client plataform.\n" +"\n" +"We work every day a lot of hours to make changes and support more devices " +"and features.\n" +"\n" +"We want to continue developing this software but need your help, if you use, " +"sell or hack TCOS pehaps you could donate some money to project.\n" +"\n" +"Click on next url to get some info." +msgstr "" +"El TCOS és un projecte lliure que necessita molt de treball per a intentar " +"ser la millor plataforma de clients lleugers.\n" +"\n" +"Treballem cada dia moltes hores per fer canvis i admetre més dispositius i " +"característiques.\n" +"\n" +"Volem continuar fent-ho però necessitem la vostra ajuda, si utilitzeu, veneu " +"o modifiqueu el TCOS, potser podreu donar alguns diners al projecte.\n" +"\n" +"Feu clic en l'url següent per a obtindre més informació." + +#: ../ui/tcosmonitor-abouttcos.ui:370 +msgid "<u>http://wiki.tcosproject.org/TcosProject:Site_support</u>" +msgstr "<u>http://wiki.tcosproject.org/TcosProject:Site_support/es</u>" + +#: ../ui/tcosmonitor-abouttcos.ui:392 +msgid "Don't show donations message on start." +msgstr "No mostres este missatge de donacions a l'inici." + +#: ../ui/tcosmonitor-abouttcos.ui:415 +msgid "Donate" +msgstr "Donacions" + +#: ../ui/tray.ui:20 +msgid "<big><b>TCOS devices</b></big>" +msgstr "" + +#: ../ui/tray.ui:57 +msgid "Hide" +msgstr "" + +#: ../ui/tcos-volume-manager.ui:39 +msgid "Restart sound" +msgstr "" + +#: ../ui/tcos-volume-manager.ui:54 +msgid "Sound levels" +msgstr "Nivells de volum" + +#: ../ui/tcos-volume-manager.ui:90 +msgid "Main Channels" +msgstr "Canals principals" + +#: ../ui/tcos-volume-manager.ui:113 +msgid "Secondary Channels" +msgstr "Canals secundaris" + +#: ../ui/tcosmonitor-chatwindow.ui:8 +msgid "Chat emission list" +msgstr "Llista d'emissió de xat" + +#: ../ui/tcosmonitor-chatwindow.ui:17 +msgid "<span size=\"x-large\">Chat emission list</span>" +msgstr "<span size=\"x-large\">Emissió de xat</span>" + +# Translators: Menu item Verb/Connect +#: ../ui/tcosmonitor-chatwindow.ui:80 +msgid "Connect" +msgstr "Connecta" + +# Translators: Menu item Verb/Branch/Separate/Separate/Disconnect +#: ../ui/tcosmonitor-chatwindow.ui:128 +msgid "Disconnect" +msgstr "Desconnecta" + +#: ../ui/tcosmonitor-chatwindow.ui:176 +msgid "Exit" +msgstr "Ix" + +#: ../ui/tcosmonitor-staticwindow.ui:8 +msgid "Static hosts list" +msgstr "Llista d'equips estàtics" + +#: ../ui/tcosmonitor-staticwindow.ui:17 +msgid "<span size=\"x-large\">Static Hosts list</span>" +msgstr "<span size=\"x-large\">Llista d'equips estàtics</span>" + +# Winrar 2.9->Dialog Box Control:rarlng.dll +#: ../ui/tcosmonitor-staticwindow.ui:80 +msgid "Add" +msgstr "Afegix" + +# Projecte_Mandrake [tm-mandrake.po] +#: ../ui/tcosmonitor-staticwindow.ui:128 +msgid "Modify" +msgstr "Modifica" + +#: ../ui/tcosmonitor-staticwindow.ui:176 +msgid "Delete" +msgstr "Esborra" + +#: ../ui/tcosmonitor-staticwindow.ui:225 +msgid "Get from connected" +msgstr "Pren des dels connectats" + +# Winrar 2.9->Dialog Box Control:rarlng.dll +#: ../ui/tcosmonitor-staticwindow.ui:292 ../ui/tcosmonitor-mainwindow.ui:771 +#: ../ui/tcosmonitor-staticwindownew.ui:150 +msgid "Cancel" +msgstr "Cancel·la" + +#: ../ui/tcosmonitor-staticwindow.ui:340 +#: ../ui/tcosmonitor-staticwindownew.ui:198 +msgid "Save" +msgstr "Guarda" + +#: ../ui/tcospersonalize.ui:34 +msgid "<b>unknow host</b>" +msgstr "<b>equip desconegut</b>" + +#: ../ui/tcospersonalize.ui:74 +msgid "Disable Ctrl + Alt + Backspace (for kill Xorg)" +msgstr "Inhabilita Ctrl+Alt+Backspace (per a tancar l'Xorg)" + +#: ../ui/tcospersonalize.ui:211 +msgid "Get avalaible drivers" +msgstr "Carrega els controladors disponibles" + +#: ../ui/tcospersonalize.ui:248 +msgid "Display Settings" +msgstr "Configuració de la pantalla" + +#: ../ui/tcospersonalize.ui:351 +msgid "Default boot kernel" +msgstr "Nucli d'arrancada per defecte" + +#: ../ui/tcospersonalize.ui:376 +msgid "<b>PXE Boot options</b>" +msgstr "<b>Opcions d'arrancada de PXE</b>" + +#: ../ui/tcospersonalize.ui:391 +msgid "Default boot method" +msgstr "Mètode d'arrancada per defecte" + +#: ../ui/tcospersonalize.ui:419 +msgid "Command line" +msgstr "Línia d'ordes" + +#: ../ui/tcospersonalize.ui:507 +msgid "Boot options" +msgstr "Opcions d'arrancada" + +#: ../ui/tcospersonalize.ui:551 +msgid "Delete Config" +msgstr "Elimina la configuració" + +#: ../ui/tcosmonitor-mainwindow.ui:8 +msgid "TcosMonitor" +msgstr "TcosMonitor" + +#: ../ui/tcosmonitor-mainwindow.ui:22 +msgid "Exit TcosMonitor" +msgstr "Ix del TcosMonitor" + +#: ../ui/tcosmonitor-mainwindow.ui:35 +msgid "Open preferences dialog" +msgstr "Obri el diàleg de preferències" + +#: ../ui/tcosmonitor-mainwindow.ui:48 +msgid "Update host list" +msgstr "Actualitza la llista d'equips" + +# Netscape_4.7->Menu:RESDLL.DLL +# 3 +#: ../ui/tcosmonitor-mainwindow.ui:49 +msgid "Refresh" +msgstr "Refresca" + +#: ../ui/tcosmonitor-mainwindow.ui:71 +msgid "All Hosts" +msgstr "Tots els equips" + +# Winrar 2.9->Dialog Caption:rarlng.dll +#: ../ui/tcosmonitor-mainwindow.ui:99 +msgid "Find" +msgstr "Busca" + +#: ../ui/tcosmonitor-mainwindow.ui:111 +msgid "About this app" +msgstr "Quant a esta aplicació" + +#: ../ui/tcosmonitor-mainwindow.ui:219 +msgid "Start audio chat" +msgstr "Inicia el xat d'àudio" + +#: ../ui/tcosmonitor-mainwindow.ui:331 +msgid "Send audio/video" +msgstr "Envia el fitxer d'àudio/vídeo" + +#: ../ui/tcosmonitor-mainwindow.ui:443 +msgid "Exe app" +msgstr "Executa l'aplicació" + +#: ../ui/tcosmonitor-mainwindow.ui:499 +msgid "Send message" +msgstr "Envia el missatge" + +#: ../ui/tcosmonitor-mainwindow.ui:581 +msgid "List view" +msgstr "Vista de llista" + +#: ../ui/tcosmonitor-mainwindow.ui:629 +msgid "Icon view" +msgstr "Vista d'icones" + +#: ../ui/tcosmonitor-mainwindow.ui:689 +msgid "Simulate my classroom" +msgstr "Simula la meua aula" + +#: ../ui/tcosmonitor-staticwindownew.ui:8 +msgid "New or edit hosts" +msgstr "Nou o edita la llista d'equips" + +#: ../ui/tcosmonitor-staticwindownew.ui:32 +msgid "" +"You can add a simple host, \n" +" example: <b>192.168.0.100</b>\n" +"\n" +"or range of hosts, \n" +" example: <b>192.168.0.100-120</b>\n" +"\n" +"MAC address is optional" +msgstr "" +"Podeu afegir un únic equip,\n" +" exemple: <b>192.168.0.100</b>\n" +"\n" +"o un rang d'equips, \n" +" exemple: <b>192.168.0.100-120</b>\n" +"\n" +"l'adreça MAC és opcional" + +#: ../ui/tcosmonitor-staticwindownew.ui:57 +msgid "IP address *" +msgstr "Adreça IP *" + +#: ../ui/tcosmonitor-askwindow.ui:8 +msgid "Question" +msgstr "Pregunta" + +#: ../ui/tcosmonitor-askwindow.ui:50 +msgid "You can drag and drop launcher file to this box" +msgstr "Podeu arrossegar i deixar anar un llançador a esta caixa" + +#: ../ui/tcosmonitor-askwindow.ui:61 +msgid "<b>Run app in unknow host</b>" +msgstr "<b>Executa l'aplicació en un equip desconegut</b>" + +#~ msgid "Lliurex Lab" +#~ msgstr "Lliurex Lab" + +#~ msgid "Normal" +#~ msgstr "Normal" + +#, fuzzy +#~ msgid "Quit from TcosMonitor" +#~ msgstr "Ix del TcosMonitor" + +#~ msgid "Salir de Lliurex Lab" +#~ msgstr "Ix de Lliurex Lab" + +#~ msgid "<span size=\"xx-large\">Lliurex Lab</span>" +#~ msgstr "<span size=\"x-large\">Lliurex Lab</span>" + +#~ msgid "About Lliurex Lab" +#~ msgstr "Quant al Lliurex Lab" + +#, fuzzy +#~ msgid "Clonning clients...." +#~ msgstr "S'està connectant a %s..." + +#~ msgid "Open share" +#~ msgstr "Obri share" + +#~ msgid "Program mode" +#~ msgstr "Mode de programa" + +#, fuzzy +#~ msgid "Clone clients" +#~ msgstr "S'està connectant a %s..." + +#~ msgid "" +#~ "Lliurex Lab is a customized program\n" +#~ "based on Mario Izquierdo TcosMonitor\n" +#~ "and Tcos monitoring tool." +#~ msgstr "" +#~ "El programa Lliurex Lab és una adaptació\n" +#~ "basada en el programa de seguiment\n" +#~ "TcosMonitor i Tcos de Mario Izquierdo." + +#, fuzzy +#~ msgid "Clone clients (from this host)" +#~ msgstr "Mode de demostració (des d'este equip)" + +#, fuzzy +#~ msgid "No clients to clone." +#~ msgstr "No s'han trobat clients lleugers." + +#, fuzzy +#~ msgid "Do you want to clone the following clients: %s?" +#~ msgstr "Voleu apagar els clients següents: %s?" + +#, fuzzy +#~ msgid "Waiting for start clone mode..." +#~ msgstr "S'està esperant l'arrancada del mode demostració..." + +#, fuzzy +#~ msgid "Select image file to clone.." +#~ msgstr "Seleccioneu el fitxer o fitxers..." + +#, fuzzy +#~ msgid "Running in clone mode with %s clients." +#~ msgstr "S'està executant en mode demostració amb %s equips." + +#, fuzzy +#~ msgid "Running in clone mode from server. Clone Nº %s" +#~ msgstr "" +#~ "S'està executant en mode demostració des del servidor. Demostració núm. %s" + +#, fuzzy +#~ msgid "Do you want to clone from client %s?" +#~ msgstr "Voleu iniciar el mode demostració des de l'usuari %s?" + +#, fuzzy +#~ msgid "Do you want only create a image from host %s?" +#~ msgstr "Voleu iniciar el mode demostració des de l'usuari %s?" + +#, fuzzy +#~ msgid "Waiting for start clone mode from client %s..." +#~ msgstr "" +#~ "S'està esperant l'arrancada del mode demostració des de l'usuari %s..." + +#, fuzzy +#~ msgid "Select file to save clone image..." +#~ msgstr "Seleccioneu el fitxer per a guardar la captura de pantalla..." + +#, fuzzy +#~ msgid "Running in clone mode from client %(host)s. Clone Nº %(count)s" +#~ msgstr "" +#~ "S'està executant en mode demostració des de l'usuari %(host)s. " +#~ "Demostració núm. %(count)s" + +#, fuzzy +#~ msgid "Clone mode off." +#~ msgstr "El mode conferència està desactivat." diff --git a/po/es.po b/po/es.po new file mode 100644 index 0000000..396c91f --- /dev/null +++ b/po/es.po @@ -0,0 +1,3097 @@ +# Spanish translations for tcosmonitor package +# Traducciones al español para el paquete tcosmonitor. +# Copyright (C) 2006 THE tcosmonitor'S COPYRIGHT HOLDER +# This file is distributed under the same license as the tcosmonitor package. +# <mariodebian@gmail.com>, 2006. +# <mariodebian@gmail.com>, 2006. +# Mario Izquierdo (mariodebian) <mariodebian@gmail.com>, 2010. +msgid "" +msgstr "" +"Project-Id-Version: tcosmonitor 0.0.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-18 15:48+0100\n" +"PO-Revision-Date: 2010-03-18 15:48+0100\n" +"Last-Translator: Mario Izquierdo (mariodebian) <mariodebian@gmail.com>\n" +"Language-Team: Spanish <Spanish/Spain <es@li.org>>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../tcosmonitor.py:129 +#, python-format +msgid "" +"The user \"%s\" must be member of the group \"tcos\" to exec tcosmonitor.\n" +"\n" +"If you are system administrator, add your user to tcos group." +msgstr "" +"El usuario \"%s\" debe ser pertenecer del grupo \"tcos\" para ejecutar " +"tcosmonitor.\n" +"\n" +"Si usted es administrador del sistema, añada su usuario al grupo tcos." + +#: ../tcosmonitor.py:247 +msgid "Send files disabled. rsync not configured." +msgstr "El envío de archivos está deshabilitado, rsync no está configurado." + +#: ../tcosmonitor.py:329 ../tcospersonalize.py:562 +#: ../tcos-volume-manager.py:378 +msgid "Exiting" +msgstr "Saliendo" + +#: ../tcos-devices-ng.py:188 +#, python-format +msgid "Rebooting in %s seconds" +msgstr "El equipo se reiniciará en %s segundos" + +#: ../tcos-devices-ng.py:190 +#, python-format +msgid "Shutting down in %s seconds" +msgstr "El equipo se apagará en %s segundos" + +#: ../tcos-devices-ng.py:206 ../tcos-devices-ng.py:209 +#, python-format +msgid "" +"ERROR during action %(action)s:\n" +"%(errortxt)s" +msgstr "" +"ERROR realizando acción %(action)s:\n" +"%(errortxt)s" + +#: ../tcos-devices-ng.py:239 +msgid "Tcos device daemon" +msgstr "Gestor de dispositivos TCOS" + +#: ../tcos-devices-ng.py:283 ../tcos-volume-manager.py:143 +#, python-format +msgid "Error connecting with TcosXmlRpc in %s." +msgstr "Error conectando con tcosxmlrpc en %s" + +#: ../tcos-devices-ng.py:314 +#, python-format +msgid "Cdrom device %s" +msgstr "Dispositivo cdrom %s" + +#: ../tcos-devices-ng.py:317 +msgid "Mount Cdrom" +msgstr "Montar cdrom" + +#: ../tcos-devices-ng.py:318 +msgid "Umount Cdrom" +msgstr "Desmontar cdrom" + +#: ../tcos-devices-ng.py:340 +#, python-format +msgid "Disk partition %s" +msgstr "Partición del disco %s" + +#: ../tcos-devices-ng.py:343 +msgid "Mount disk partition" +msgstr "Montar partición" + +#: ../tcos-devices-ng.py:344 +msgid "Umount disk partition" +msgstr "Desmontar partición" + +#: ../tcos-devices-ng.py:356 +msgid "No floppy detected" +msgstr "No se ha detectado disquete" + +#: ../tcos-devices-ng.py:368 ../tcos-devices-ng.py:674 +#: ../tcos-devices-ng.py:680 ../tcos-devices-ng.py:686 +msgid "Floppy" +msgstr "Disquete" + +#: ../tcos-devices-ng.py:371 +msgid "Mount Floppy" +msgstr "Montar disquete" + +#: ../tcos-devices-ng.py:372 +msgid "Umount Floppy" +msgstr "Desmontar disquete" + +#: ../tcos-devices-ng.py:382 +msgid "Floppy mounted. Ready for use." +msgstr "Disquete montado. Listo para usar." + +#: ../tcos-devices-ng.py:384 +msgid "Floppy umounted. You can extract it." +msgstr "Disquete desmontado. Ahora puede extraerlo." + +#: ../tcos-devices-ng.py:400 +msgid "Hard disk partition mounted. Ready for use." +msgstr "Partición montada. Lista para usar." + +#: ../tcos-devices-ng.py:403 +msgid "Hard disk partition umounted." +msgstr "Partición desmontada." + +#: ../tcos-devices-ng.py:425 +msgid "Audio cdrom mounted., you can listen music opening wav files." +msgstr "" +"Cdrom de música montado, ahora puedes escucharlo abriendo los archivos wav." + +#: ../tcos-devices-ng.py:427 +msgid "Cdrom mounted. Ready for use." +msgstr "Cdrom montado. Listo para usar." + +#: ../tcos-devices-ng.py:430 +msgid "Cdrom umounted. You can extract it." +msgstr "Cdrom desmontado. Ahora puede extraerlo." + +#: ../tcos-devices-ng.py:529 +#, python-format +msgid "" +"Mounting device %s\n" +"Please wait..." +msgstr "" +"Montando dispositivo %s.\n" +"Por favor, espere..." + +#: ../tcos-devices-ng.py:578 +msgid "Error mounting LTSPFS, check versions of LTSPFS packages" +msgstr "Error montando LTSPFS, compruebe las versiones de los paquetes LTSPFS" + +#: ../tcos-devices-ng.py:604 +#, python-format +msgid "" +"Umounting device %s.\n" +"Please wait..." +msgstr "" +"Desmontando dispositivo %s.\n" +"Por favor, espere..." + +#: ../tcos-devices-ng.py:651 +msgid "usbdisk" +msgstr "disco-usb" + +#: ../tcos-devices-ng.py:653 +msgid "firewiredisk" +msgstr "disco-firewire" + +#: ../tcos-devices-ng.py:678 +msgid "Can't mount floppy" +msgstr "No se pudo montar el disquete" + +#: ../tcos-devices-ng.py:689 +msgid "Can't umount floppy" +msgstr "No se pudo desmontar el disquete" + +#: ../tcos-devices-ng.py:702 ../tcos-devices-ng.py:712 +#: ../tcos-devices-ng.py:723 ../tcos-devices-ng.py:836 +#: ../tcos-devices-ng.py:848 ../tcos-devices-ng.py:867 +#: ../tcos-devices-ng.py:879 ../tcos-devices-ng.py:911 +#, python-format +msgid "Cdrom_%s" +msgstr "Cdrom_%s" + +#: ../tcos-devices-ng.py:710 +msgid "Can't mount cdrom" +msgstr "No se pudo montar el cdrom" + +#: ../tcos-devices-ng.py:726 +msgid "Can't umount cdrom" +msgstr "No se pudo desmontar el cdrom" + +#: ../tcos-devices-ng.py:742 ../tcos-devices-ng.py:752 +#: ../tcos-devices-ng.py:763 +#, python-format +msgid "Disk_%s" +msgstr "Disco_%s" + +#: ../tcos-devices-ng.py:750 +msgid "Can't mount hard disk partition" +msgstr "No se pudo montar la partición" + +#: ../tcos-devices-ng.py:766 +msgid "Can't umount hard disk partition" +msgstr "No se pudo desmontar la partición" + +#: ../tcos-devices-ng.py:807 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Connected CDROM USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Desde el terminal %(host)s.\n" +"Dispositivo CDROM USB conectado %(device)s\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:811 +#, python-format +msgid "CDROM USB device %s" +msgstr "Dispositivo CDROM USB %s" + +#: ../tcos-devices-ng.py:814 +#, python-format +msgid "Mount CDROM USB device %s" +msgstr "Montar dispositivo CDROM USB %s" + +#: ../tcos-devices-ng.py:815 +#, python-format +msgid "Umount CDROM USB device %s" +msgstr "Desmontar dispositivo CDROM USB %s" + +#: ../tcos-devices-ng.py:840 ../tcos-devices-ng.py:871 +#: ../tcos-devices-ng.py:1001 ../tcos-devices-ng.py:1012 +#: ../tcos-devices-ng.py:1058 ../tcos-devices-ng.py:1138 +#: ../tcos-devices-ng.py:1149 ../tcos-devices-ng.py:1195 +#, python-format +msgid "Error, can't mount device %s" +msgstr "Error, no se pudo montar el dispositivo %s" + +#: ../tcos-devices-ng.py:898 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Disconnected CDROM USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Desde el terminal %(host)s.\n" +"Dispositivo CDROM USB desconectado %(device)s\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:926 +#, python-format +msgid "Can't umount cdrom usb %s" +msgstr "No se pudo desmontar el cdrom usb" + +#: ../tcos-devices-ng.py:951 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Connected USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Desde el terminal %(host)s.\n" +"Dispositivo USB conectado %(device)s\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:954 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Disconnected USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Desde el terminal %(host)s.\n" +"Dispositivo USB desconectado %(device)s\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:982 +#, python-format +msgid "USB device %s" +msgstr "Dispositivo USB %s" + +#: ../tcos-devices-ng.py:985 +#, python-format +msgid "Mount USB device %s" +msgstr "Montar dispositivo USB %s" + +#: ../tcos-devices-ng.py:986 +#, python-format +msgid "Umount USB device %s" +msgstr "Desmontar dispositivo USB %s" + +#: ../tcos-devices-ng.py:1088 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Connected Firewire device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Desde el terminal %(host)s.\n" +"Dispositivo Firewire conectado %(device)s\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:1091 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Disconnected Firewire device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Desde el terminal %(host)s.\n" +"Dispositivo Firewire desconectado %(device)s\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:1119 +#, python-format +msgid "Firewire device %s" +msgstr "Dispositivo Firewire %s" + +#: ../tcos-devices-ng.py:1122 +#, python-format +msgid "Mount Firewire device %s" +msgstr "Montar dispositivo Firewire %s" + +#: ../tcos-devices-ng.py:1123 +#, python-format +msgid "Umount Firewire device %s" +msgstr "Desmontar dispositivo Firewire %s" + +#: ../tcos-devices-ng.py:1206 +#, python-format +msgid "CDROM USB device %s umounted. You can extract it." +msgstr "Dispositivo CDROM USB %s desmontado. Ahora puede extraerlo." + +#: ../tcos-devices-ng.py:1209 +#, python-format +msgid "CDROM USB device %s mounted. Ready for use." +msgstr "Dispositivo CDROM USB %s montado.Listo para usar." + +#: ../tcos-devices-ng.py:1247 +#, python-format +msgid "USB device %s umounted. You can extract it." +msgstr "Dispositivo USB %s desmontado. Ahora puede extraerlo." + +#: ../tcos-devices-ng.py:1250 +#, python-format +msgid "USB device %s mounted. Ready for use." +msgstr "Dispositivo USB %s montado.Listo para usar." + +#: ../tcos-devices-ng.py:1286 +#, python-format +msgid "Firewire device %s umounted. You can extract it." +msgstr "Dispositivo Firewire %s desmontado. Ahora puede extraerlo." + +#: ../tcos-devices-ng.py:1289 +#, python-format +msgid "Firewire device %s mounted. Ready for use." +msgstr "Dispositivo Firewire %s montado.Listo para usar." + +#: ../tcospersonalize.py:115 +msgid "" +"Need a host to configure!!!\n" +"Try exec:\n" +" tcospersonalize --host=XXX.XXX.XXX.XXX" +msgstr "" +"¡Se necesita una dirección de equipo a configurar!\n" +"Pruebe a ejecutar:\n" +" tcospersonalize --host=XXX.XXX.XXX.XXX" + +#: ../tcospersonalize.py:190 +msgid "host: " +msgstr "equipo: " + +#: ../tcospersonalize.py:454 +msgid "Host down, can't connect to tcosxmlrpc." +msgstr "Equipo inaccesible, no se pudo conectar a tcosxmlrpc." + +#: ../tcospersonalize.py:462 +#, python-format +msgid "New %d drivers loaded from terminal." +msgstr "Cargados %d drivers desde el terminal." + +#: ../tcospersonalize.py:521 +#, python-format +msgid "Really delete config of %s?" +msgstr "¿Borrar archivo de configuración de %s?" + +#: ../tcospersonalize.py:524 +msgid "Deleted!" +msgstr "¡Borrado!" + +#: ../tcos-volume-manager.py:101 ../tcos-volume-manager.py:113 +#, python-format +msgid "" +"Tcos Sound levels on:\n" +"%s" +msgstr "" +"Niveles de volumen TCOS en equipo:\n" +"%s" + +#: ../tcos-volume-manager.py:121 +#, python-format +msgid "ERROR: It appears that TcosXmlRpc is not running on %s." +msgstr "ERROR: Parece que tcosxmlrpc no se está ejecutando en %s" + +#: ../tcos-volume-manager.py:217 +msgid "Loading channels info..." +msgstr "Cargando información de canales..." + +#: ../tcos-volume-manager.py:230 +msgid "Error loading channels info (xauth error)" +msgstr "Error cargando información de canales (error de xauth)" + +#: ../tcos-volume-manager.py:233 ../ui/tcos-volume-manager.ui:8 +msgid "Tcos Volume Manager" +msgstr "Monitor de volumen TCOS" + +#: ../tcos-volume-manager.py:234 +#, python-format +msgid "<span size='large'><b>Sound mixer of %s host</b></span>" +msgstr "<span size='large'><b>Mezclador de audio del equipo %s</b></span>" + +#: ../tcos-volume-manager.py:300 ../tcosmonitor/extensions/info.py:442 +msgid "Mute" +msgstr "Mudo" + +#: ../tcos-volume-manager.py:319 +msgid "Main controls ready" +msgstr "Controles principales cargados" + +#: ../tcos-volume-manager.py:323 +msgid "All remote controls loaded." +msgstr "Todos los controles remotos cargados." + +#: ../tcos-volume-manager.py:332 ../tcosmonitor/extensions/info.py:557 +#, python-format +msgid "Changing value of %(channel)s channel, to %(value)s%%..." +msgstr "Cambiando valor del canal %(channel)s, a %(value)s%%..." + +#: ../tcos-volume-manager.py:339 ../tcosmonitor/extensions/info.py:564 +#, python-format +msgid "Changed value of %(channel)s channel, to %(value)s" +msgstr "Valor cambiado del canal %(channel)s, a %(value)s" + +#: ../tcos-volume-manager.py:346 ../tcosmonitor/extensions/info.py:571 +#, python-format +msgid "Unmuting %s channel..." +msgstr "Quitando enmudecido al canal %s..." + +#: ../tcos-volume-manager.py:351 ../tcosmonitor/extensions/info.py:576 +#, python-format +msgid "Muting %s channel..." +msgstr "Enmudeciendo canal %s..." + +#: ../tcos-volume-manager.py:354 ../tcosmonitor/extensions/info.py:579 +#, python-format +msgid "Status of %(channel)s channel, is \"%(newvalue)s\"" +msgstr "Estado del canal %(channel)s es \"%(newvalue)s\"" + +#: ../tcosmonitor/TcosDBus.py:94 +msgid "TcosDBus not allowed in local display" +msgstr "TcosDBus no permitido en pantalla local." + +#: ../tcosmonitor/TcosDBus.py:122 +#, python-format +msgid "Seems that tcosxmlrpc isn't running on host=\"%s\"" +msgstr "Parece que tcosxmlrpc no se está ejecutando en equipo=\"%s\"" + +#: ../tcosmonitor/TcosDBus.py:143 +msgid "tcosxmlrpc ERROR conection unavalaible." +msgstr "tcosxmlrpc ERROR conexión no disponible" + +#: ../tcosmonitor/TcosDBus.py:159 +msgid "ERROR conecting to tcosxmlrpc, check username and password." +msgstr "" +"No se puede conectar a tcosxmlrpc, verifique el usuario y la contraseña." + +#: ../tcosmonitor/TcosDBus.py:251 +msgid "Message from admin" +msgstr "Mensaje del administrador" + +#: ../tcosmonitor/TcosDBus.py:341 ../tcosmonitor/TcosDBus.py:357 +#: ../tcosmonitor/TcosDBus.py:375 ../tcosmonitor/TcosDBus.py:393 +msgid "User not allowed to run this dbus call." +msgstr "Su usuario no tiene permitidas estas llamadas dbus." + +#: ../tcosmonitor/TcosStaticHosts.py:163 ../tcosmonitor/TcosListView.py:70 +msgid "IP address" +msgstr "Dirección IP" + +#: ../tcosmonitor/TcosStaticHosts.py:169 +#: ../ui/tcosmonitor-staticwindownew.ui:68 +msgid "MAC address" +msgstr "Dirección MAC" + +#: ../tcosmonitor/TcosStaticHosts.py:279 +msgid "No hosts found, please click on Refresh button using another method." +msgstr "" +"No se han encontrado equipos, por favor, pulse el botón Actualizar usando " +"otro método." + +#: ../tcosmonitor/shared.py:108 +msgid "Traditional list only" +msgstr "Lista tradicional sólo" + +#: ../tcosmonitor/shared.py:109 +msgid "Icons only" +msgstr "Sólo iconos" + +#: ../tcosmonitor/shared.py:110 +msgid "Simulate classroom" +msgstr "Simular aula" + +#: ../tcosmonitor/shared.py:111 +msgid "Lists, icons and classroom with tabs" +msgstr "Lista, iconos y modo aula con pestañas" + +#: ../tcosmonitor/shared.py:270 ../tcosmonitor/shared.py:312 +#: ../tcosmonitor/TcosMenus.py:35 +msgid "Terminal actions" +msgstr "Acciones para el terminal/equipo" + +#: ../tcosmonitor/shared.py:271 ../tcosmonitor/shared.py:313 +#: ../tcosmonitor/TcosMenus.py:36 +msgid "User actions" +msgstr "Acciones para el usuario" + +#: ../tcosmonitor/shared.py:272 ../tcosmonitor/shared.py:314 +#: ../tcosmonitor/TcosMenus.py:37 +msgid "Audio, video and files" +msgstr "Sonido, vídeo y archivos" + +#: ../tcosmonitor/shared.py:279 ../tcosmonitor/extensions/info.py:47 +msgid "Refresh terminal info" +msgstr "Actualizar información del terminal" + +#: ../tcosmonitor/shared.py:280 ../tcosmonitor/extensions/clean.py:40 +#: ../tcosmonitor/extensions/clean.py:41 +msgid "Clean info about terminal" +msgstr "Limpiar información del terminal" + +#: ../tcosmonitor/shared.py:281 ../tcosmonitor/TcosTrayIcon.py:54 +#: ../tcosmonitor/extensions/reboot.py:40 ../tcosmonitor/TcosTrayIcon2.py:58 +msgid "Reboot" +msgstr "Reiniciar" + +#: ../tcosmonitor/shared.py:282 ../tcosmonitor/TcosTrayIcon.py:55 +#: ../tcosmonitor/extensions/reboot.py:42 ../tcosmonitor/TcosTrayIcon2.py:59 +msgid "Poweroff" +msgstr "Apagar" + +#: ../tcosmonitor/shared.py:283 ../tcosmonitor/extensions/lockscreen.py:40 +msgid "Lock screen" +msgstr "Bloquear pantalla" + +#: ../tcosmonitor/shared.py:284 ../tcosmonitor/extensions/lockscreen.py:42 +msgid "Unlock screen" +msgstr "Desbloquear pantalla" + +#: ../tcosmonitor/shared.py:285 ../tcosmonitor/extensions/italc.py:43 +msgid "Connect to remote screen (iTALC)" +msgstr "Conectar a la pantalla remota (iTALC)" + +#: ../tcosmonitor/shared.py:286 ../tcosmonitor/extensions/vnc.py:54 +msgid "Connect to remote screen (VNC)" +msgstr "Conectar a la pantalla remota (VNC)" + +#: ../tcosmonitor/shared.py:287 ../tcosmonitor/extensions/screenshot.py:45 +msgid "Screenshot" +msgstr "Captura de pantalla" + +#: ../tcosmonitor/shared.py:288 ../tcosmonitor/extensions/remotessh.py:40 +msgid "Give a remote xterm" +msgstr "Ejecutar un terminal xterm en el cliente" + +#: ../tcosmonitor/shared.py:289 +#: ../tcosmonitor/extensions/tcospersonalize.py:40 +#: ../ui/tcosmonitor-prefwindow.ui:1324 +msgid "Configure this host" +msgstr "Configurar este equipo" + +#: ../tcosmonitor/shared.py:290 ../tcosmonitor/extensions/logout.py:40 +msgid "Logout client" +msgstr "Desconectar cliente" + +#: ../tcosmonitor/shared.py:291 ../tcosmonitor/extensions/restartxorg.py:41 +msgid "Restart X session with new settings" +msgstr "Reiniciar sesión X con la nueva configuración" + +#: ../tcosmonitor/shared.py:292 ../tcosmonitor/extensions/appsmsg.py:52 +msgid "Exec app on user display" +msgstr "Ejecutar aplicación en pantalla de usuario" + +#: ../tcosmonitor/shared.py:293 ../tcosmonitor/extensions/appsmsg.py:53 +msgid "Send a text message to user" +msgstr "Enviar un mensaje de texto al usuario" + +#: ../tcosmonitor/shared.py:294 ../tcosmonitor/extensions/viewproc.py:41 +msgid "Show running apps of this client" +msgstr "Mostrar aplicaciones ejecutadas por este cliente" + +#: ../tcosmonitor/shared.py:295 ../tcosmonitor/shared.py:332 +msgid "Audio/Video broadcast" +msgstr "Difusión de audio/vídeo" + +#: ../tcosmonitor/shared.py:296 ../tcosmonitor/shared.py:333 +#: ../tcosmonitor/extensions/sendfiles.py:49 +#: ../tcosmonitor/extensions/sendfiles.py:50 +#: ../ui/tcosmonitor-prefwindow.ui:1134 ../ui/tcosmonitor-prefwindow.ui:1475 +#: ../ui/tcosmonitor-mainwindow.ui:387 +msgid "Send files" +msgstr "Enviar archivos" + +#: ../tcosmonitor/shared.py:297 ../tcosmonitor/extensions/vnc.py:55 +msgid "Demo mode (from this host)" +msgstr "Modo demo (desde este equipo)" + +#: ../tcosmonitor/shared.py:298 ../tcosmonitor/extensions/wakeonlan.py:41 +msgid "Boot client (WakeOnLan)" +msgstr "Arrancar cliente (WakeOnLan)" + +#: ../tcosmonitor/shared.py:299 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:38 +msgid "Lock internet" +msgstr "Bloquear internet" + +#: ../tcosmonitor/shared.py:300 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:39 +msgid "Unlock internet" +msgstr "Desbloquear internet" + +#: ../tcosmonitor/shared.py:301 ../tcosmonitor/extensions/dpms.py:40 +msgid "DPMS Power off monitor" +msgstr "DPMS apagar monitor" + +#: ../tcosmonitor/shared.py:302 ../tcosmonitor/extensions/dpms.py:42 +msgid "DPMS Power on monitor" +msgstr "DPMS encender monitor" + +#: ../tcosmonitor/shared.py:303 +msgid "Send MIC audio (from this host)" +msgstr "Enviar sonido del micrófono (desde este equipo)" + +#: ../tcosmonitor/shared.py:321 ../tcosmonitor/extensions/reboot.py:41 +msgid "Reboot all clients" +msgstr "Reiniciar todos los clientes" + +#: ../tcosmonitor/shared.py:322 ../tcosmonitor/extensions/reboot.py:43 +msgid "Poweroff all clients" +msgstr "Apagar todos los clientes" + +#: ../tcosmonitor/shared.py:323 ../tcosmonitor/extensions/lockscreen.py:41 +msgid "Lock all screens" +msgstr "Bloquear todas las pantallas" + +#: ../tcosmonitor/shared.py:324 ../tcosmonitor/extensions/lockscreen.py:43 +msgid "Unlock all screens" +msgstr "Desbloquear todas las pantallas" + +#: ../tcosmonitor/shared.py:325 ../tcosmonitor/extensions/logout.py:41 +msgid "Logout clients" +msgstr "Desconectar todos los clientes" + +#: ../tcosmonitor/shared.py:326 ../tcosmonitor/extensions/restartxorg.py:42 +msgid "Restart X session of all clients" +msgstr "Reiniciar sesión X de todos los clientes" + +#: ../tcosmonitor/shared.py:327 ../tcosmonitor/extensions/appsmsg.py:55 +msgid "Exec same app in all connected users" +msgstr "Ejecutar misma aplicación en todos los usuarios conectados" + +#: ../tcosmonitor/shared.py:328 ../tcosmonitor/extensions/appsmsg.py:56 +msgid "Send a text message to all connected users" +msgstr "Enviar un mensaje de texto a todos los usuarios conectados" + +#: ../tcosmonitor/shared.py:329 ../tcosmonitor/extensions/vnc.py:57 +msgid "Enter demo mode, all connected users see my screen" +msgstr "Entrar en modo demostración, todos los usuarios ven mi pantalla" + +#: ../tcosmonitor/shared.py:330 +msgid "Enter conference mode, all connected users can hear me" +msgstr "Entrar en modo conferencia, todos los usuarios pueden escucharme" + +#: ../tcosmonitor/shared.py:331 ../tcosmonitor/extensions/screenshot.py:46 +msgid "Capture All clients screens" +msgstr "Capturar todas las pantallas" + +#: ../tcosmonitor/shared.py:334 ../tcosmonitor/extensions/wakeonlan.py:42 +msgid "Boot All clients (WakeOnLan)" +msgstr "Arrancar todos los clientes (WakeOnLan)" + +#: ../tcosmonitor/shared.py:335 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:41 +msgid "Lock internet in all connected users" +msgstr "Bloquear internet a todos los usuarios conectados" + +#: ../tcosmonitor/shared.py:336 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:42 +msgid "Unlock internet in all connected users" +msgstr "Desbloquear internet a todos los usuarios conectados" + +#: ../tcosmonitor/shared.py:337 ../tcosmonitor/extensions/dpms.py:41 +msgid "DPMS Power off monitors" +msgstr "DPMS apagar todos los monitores" + +#: ../tcosmonitor/shared.py:338 ../tcosmonitor/extensions/dpms.py:43 +msgid "DPMS Power on monitors" +msgstr "DPMS encender todos los monitores" + +#: ../tcosmonitor/shared.py:339 +msgid "Chat audio conference" +msgstr "Chat audio conferencia" + +#: ../tcosmonitor/shared.py:340 ../tcosmonitor/extensions/livevnc.py:51 +#: ../ui/tcosmonitor-prefwindow.ui:1342 +msgid "Live view screens with VNC" +msgstr "Ver pantallas en directo con VNC" + +#: ../tcosmonitor/shared.py:538 +#, python-format +msgid "QUESTION: %(txt)s, RESPONSE %(response)s" +msgstr "PREGUNTA: %(txt)s, RESPUESTA %(response)s" + +#: ../tcosmonitor/shared.py:555 ../tcosmonitor/shared.py:566 +#, python-format +msgid "INFO: %s" +msgstr "INFO: %s" + +#: ../tcosmonitor/shared.py:577 +#, python-format +msgid "ERROR: %s" +msgstr "ERROR: %s" + +#: ../tcosmonitor/TcosClassView.py:50 ../tcosmonitor/TcosIconView.py:47 +msgid "IP" +msgstr "IP" + +#: ../tcosmonitor/TcosClassView.py:51 ../tcosmonitor/TcosIconView.py:48 +#: ../tcosmonitor/TcosListView.py:64 +msgid "Hostname" +msgstr "Equipo" + +#: ../tcosmonitor/TcosClassView.py:52 ../tcosmonitor/TcosIconView.py:49 +#: ../tcosmonitor/TcosListView.py:76 +msgid "Username" +msgstr "Usuario" + +#: ../tcosmonitor/TcosClassView.py:53 ../tcosmonitor/TcosIconView.py:50 +#: ../tcosmonitor/TcosListView.py:87 +msgid "Logged" +msgstr "Logueado" + +#: ../tcosmonitor/TcosClassView.py:54 ../tcosmonitor/TcosIconView.py:51 +#: ../tcosmonitor/TcosListView.py:103 +msgid "Time log in" +msgstr "Tiempo dentro" + +#: ../tcosmonitor/TcosClassView.py:55 ../tcosmonitor/TcosIconView.py:52 +msgid "Screen locked" +msgstr "Pantalla bloqueada" + +#: ../tcosmonitor/TcosClassView.py:56 ../tcosmonitor/TcosIconView.py:53 +msgid "Network locked" +msgstr "Red bloqueada" + +#: ../tcosmonitor/TcosClassView.py:58 +msgid "" +"Place mouse on any computer to see brief info about it.\n" +"You can select and unselect multiple host clicking on every one.\n" +"Drag and drop hosts to positions and save clicking on right mouse button." +msgstr "" +"Mueva el ratón sobre cada equipo para obtener una breve información de cada " +"uno.\n" +"Puede seleccionar y deseleccionar varios pulsando en cada uno.\n" +"Arrastre y suelte los equipos a las posiciones y guárdelas pulsando con el " +"botón derecho." + +#: ../tcosmonitor/TcosClassView.py:179 +msgid "Positions reset to defaults." +msgstr "Posiciones reseteadas por defecto." + +#: ../tcosmonitor/TcosClassView.py:197 +msgid "Positions saved." +msgstr "Posiciones guardadas." + +#: ../tcosmonitor/TcosClassView.py:323 +#, python-format +msgid "%s is not a valid file to exe or send" +msgstr "%s no es un archivo válido para ejecutar o enviar" + +#: ../tcosmonitor/TcosClassView.py:409 ../tcosmonitor/TcosIconView.py:156 +msgid "yes" +msgstr "sí" + +#: ../tcosmonitor/TcosClassView.py:411 ../tcosmonitor/TcosIconView.py:158 +msgid "no" +msgstr "no" + +#: ../tcosmonitor/TcosTrayIcon.py:49 ../tcosmonitor/extensions/vnc.py:298 +#: ../tcosmonitor/TcosTrayIcon2.py:53 ../ui/tcosmonitor-mainwindow.ui:23 +msgid "Quit" +msgstr "Salir" + +#: ../tcosmonitor/TcosTrayIcon.py:65 +msgid "TcosDevices" +msgstr "Dispositivos TCOS" + +#: ../tcosmonitor/TcosTrayIcon.py:172 ../tcosmonitor/TcosTrayIcon.py:186 +#: ../tcosmonitor/TcosTrayIcon2.py:67 +msgid "Tcos Devices" +msgstr "Dispositivos TCOS" + +#: ../tcosmonitor/TcosTrayIcon.py:232 ../tcosmonitor/TcosTrayIcon2.py:351 +msgid "Usb flash" +msgstr "Memoria USB flash" + +#: ../tcosmonitor/TcosTrayIcon.py:234 ../tcosmonitor/TcosTrayIcon2.py:353 +msgid "Mount USB1" +msgstr "Montar USB1" + +#: ../tcosmonitor/TcosTrayIcon.py:235 ../tcosmonitor/TcosTrayIcon2.py:354 +msgid "Umount USB1" +msgstr "Desmontar USB1" + +#: ../tcosmonitor/extensions/lockscreen.py:49 +#: ../tcosmonitor/extensions/lockscreen.py:57 +msgid "" +"Can't connect to tcosxmlrpc.\n" +"Please verify user and password in prefences!" +msgstr "" +"No se puede conectar a tcosxmlrpc.\n" +"Por favor verifique el usuario y la contraseña en las preferencias." + +#: ../tcosmonitor/extensions/lockscreen.py:81 +#, python-format +msgid "Do you want to lock the following screens: %s?" +msgstr "¿Quiere bloquear las siguientes pantallas: %s ?" + +#: ../tcosmonitor/extensions/lockscreen.py:90 +#, python-format +msgid "Do you want to unlock the following screens: %s?" +msgstr "¿Quiere desbloquear las siguinetes pantallas: %s ?" + +#: ../tcosmonitor/extensions/appsmsg.py:64 +msgid "Clients not connected" +msgstr "No hay usuarios conectados" + +#: ../tcosmonitor/extensions/appsmsg.py:87 +#, python-format +msgid "" +"<b>Exec app in user(s) screen(s)\n" +"or open web address to:</b>\n" +"%s" +msgstr "" +"<b>Ejecutar aplicación en pantalla\n" +"de usuario(s) o abrir dirección web:</b>\n" +"%s" + +#: ../tcosmonitor/extensions/appsmsg.py:89 +#, python-format +msgid "" +"<b>Send a message to:</b>\n" +"%s" +msgstr "" +"<b>Enviar mensaje a:</b>\n" +"%s" + +#: ../tcosmonitor/extensions/appsmsg.py:122 +#: ../tcosmonitor/extensions/appsmsg.py:163 +msgid "Can't exec application, user is not logged" +msgstr "No se pueden ejecutar aplicaciones, el usuario no está conectado" + +#: ../tcosmonitor/extensions/appsmsg.py:141 +#: ../tcosmonitor/extensions/appsmsg.py:152 +#, python-format +msgid "%s is not a valid application" +msgstr "%s no es una aplicación válida" + +#: ../tcosmonitor/extensions/appsmsg.py:172 +msgid "Can't send message, user is not logged" +msgstr "No se pueden enviar mensajes, el usuario no está conectado" + +#: ../tcosmonitor/extensions/appsmsg.py:289 +#: ../tcosmonitor/extensions/appsmsg.py:298 +#, python-format +msgid "%s is not application" +msgstr "%s no es una aplicación" + +#: ../tcosmonitor/extensions/appsmsg.py:353 +#, python-format +msgid "" +"Error while exec remote app:\n" +"Reason: %s" +msgstr "" +"Error cuando se ejecutaba aplicación remota:\n" +"Razón: %s" + +#: ../tcosmonitor/extensions/appsmsg.py:360 +#, python-format +msgid "" +"Error while send message:\n" +"Reason: %s" +msgstr "" +"Error cuando se enviaba mensaje:\n" +"Razón: %s" + +#: ../tcosmonitor/extensions/remotessh.py:47 +msgid "Enter password of remote thin client (if asked for it)" +msgstr "Introduzca contraseña del cliente remoto (si preguntase)" + +#: ../tcosmonitor/extensions/dpms.py:79 +#, python-format +msgid "Do you want to switch off the following monitors: %s?" +msgstr "¿Quiere apagar los monitores de los siguientes equipos: %s?" + +#: ../tcosmonitor/extensions/dpms.py:88 +#, python-format +msgid "Do you want to switch on the following monitors: %s?" +msgstr "¿Quiere encender los monitores de los siguientes equipos: %s?" + +#: ../tcosmonitor/extensions/screenshot.py:66 +#: ../tcosmonitor/extensions/screenshot.py:83 +#, python-format +msgid "Can't make screenshot, error: %s" +msgstr "No se pudo hacer una captura de pantalla, error: %s" + +#: ../tcosmonitor/extensions/screenshot.py:75 +msgid "Trying to order terminal to do a screenshot..." +msgstr "Intentando mandar al terminal que se haga una captura de pantalla" + +#: ../tcosmonitor/extensions/screenshot.py:87 +msgid "Get another screenshot" +msgstr "Hacer otra captura de pantalla" + +#: ../tcosmonitor/extensions/screenshot.py:102 +#, python-format +msgid "Screenshot of <span style='font-style: italic'>%s</span>" +msgstr "Captura de pantalla de <span style='font-style: italic'>%s</span>" + +#: ../tcosmonitor/extensions/screenshot.py:125 +#, python-format +msgid "Screenshot of %s, done." +msgstr "Captura de pantalla de %s hecha." + +#: ../tcosmonitor/extensions/screenshot.py:139 +msgid "Save Screenshot" +msgstr "Guardar captura de pantalla" + +#: ../tcosmonitor/extensions/screenshot.py:151 +msgid "Select file to save screenshot..." +msgstr "Seleccionar archivo para guardar captura de pantalla..." + +#: ../tcosmonitor/extensions/screenshot.py:155 +#, python-format +msgid "screenshot_of_%(hostname)s_date_%(date)s.png" +msgstr "captura_de_%(hostname)s_fecha_%(date)s.png" + +#: ../tcosmonitor/extensions/screenshot.py:159 +msgid "Image Files ( *.png, *.jpg)" +msgstr "Archivos de imagen (*.png, *.jpg)" + +#: ../tcosmonitor/extensions/screenshot.py:169 +msgid "File must be png or jpg." +msgstr "El archivo debe ser png o jpg." + +#: ../tcosmonitor/extensions/screenshot.py:192 +msgid "Screenshots of all hosts" +msgstr "Captura de pantalla de todos los equipos" + +#: ../tcosmonitor/extensions/screenshot.py:208 +#, python-format +msgid "Screenshot of %s" +msgstr "Captura de pantalla de %s" + +#: ../tcosmonitor/extensions/sendfiles.py:62 +#: ../tcosmonitor/extensions/sendfiles.py:120 +msgid "Can't send files, user is not logged" +msgstr "No se pueden enviar archivos, el usuario no está conectado" + +#: ../tcosmonitor/extensions/sendfiles.py:66 +#: ../tcosmonitor/extensions/sendfiles.py:142 +#: ../tcosmonitor/extensions/sendfiles.py:237 +msgid "" +"TcosMonitor need special configuration for rsync daemon to send files.\n" +"\n" +"Please read configuration requeriments in:\n" +"/usr/share/doc/tcosmonitor/README.rsync" +msgstr "" +"TcosMonitor necesita una configuración especial del demonio rsync para envio " +"de ficheros.\n" +"\n" +"Lea la configuración requerida en:\n" +"/usr/share/doc/tcosmonitor/README.rsync" + +#: ../tcosmonitor/extensions/sendfiles.py:84 +#: ../tcosmonitor/extensions/sendfiles.py:176 +#: ../tcosmonitor/extensions/sendfiles.py:270 +msgid "Waiting for send files..." +msgstr "Esperando al envío de archivos..." + +#: ../tcosmonitor/extensions/sendfiles.py:93 +#: ../tcosmonitor/extensions/sendfiles.py:95 +#: ../tcosmonitor/extensions/sendfiles.py:99 +#: ../tcosmonitor/extensions/sendfiles.py:108 +#: ../tcosmonitor/extensions/sendfiles.py:189 +#: ../tcosmonitor/extensions/sendfiles.py:191 +#: ../tcosmonitor/extensions/sendfiles.py:195 +#: ../tcosmonitor/extensions/sendfiles.py:204 +#: ../tcosmonitor/extensions/sendfiles.py:283 +#: ../tcosmonitor/extensions/sendfiles.py:285 +#: ../tcosmonitor/extensions/sendfiles.py:289 +#: ../tcosmonitor/extensions/sendfiles.py:298 +msgid "Teacher" +msgstr "Profesor" + +#: ../tcosmonitor/extensions/sendfiles.py:95 +#: ../tcosmonitor/extensions/sendfiles.py:108 +#: ../tcosmonitor/extensions/sendfiles.py:191 +#: ../tcosmonitor/extensions/sendfiles.py:204 +#: ../tcosmonitor/extensions/sendfiles.py:285 +#: ../tcosmonitor/extensions/sendfiles.py:298 +#, python-format +msgid "" +"Teacher has sent some files to %(teacher)s folder:\n" +"\n" +"%(basenames)s" +msgstr "" +"El profesor le ha enviado varios archivos a la carpeta %(teacher)s:\n" +"\n" +"%(basenames)s" + +#: ../tcosmonitor/extensions/sendfiles.py:104 +#: ../tcosmonitor/extensions/sendfiles.py:200 +#: ../tcosmonitor/extensions/sendfiles.py:294 +#: ../tcosmonitor/extensions/reboot.py:108 +#: ../tcosmonitor/extensions/videolan.py:194 +#: ../tcosmonitor/extensions/videolan.py:389 +#: ../tcosmonitor/extensions/videolan.py:629 +#, python-format +msgid "" +"Error while exec remote app:\n" +"Reason:%s" +msgstr "" +"Error cuando se ejecutaba aplicación remota:\n" +"Razón: %s" + +#: ../tcosmonitor/extensions/sendfiles.py:105 +#: ../tcosmonitor/extensions/sendfiles.py:201 +#: ../tcosmonitor/extensions/sendfiles.py:295 +msgid "Error creating destination folder." +msgstr "Error creando directorio destino." + +#: ../tcosmonitor/extensions/sendfiles.py:110 +#: ../tcosmonitor/extensions/sendfiles.py:205 +#: ../tcosmonitor/extensions/sendfiles.py:300 +msgid "Files sent." +msgstr "Archivos enviados." + +#: ../tcosmonitor/extensions/sendfiles.py:125 +#: ../tcosmonitor/extensions/sendfiles.py:220 +msgid "Select file or files..." +msgstr "Seleccionar archivo o archivos..." + +#: ../tcosmonitor/extensions/sendfiles.py:178 +#: ../tcosmonitor/extensions/sendfiles.py:272 +msgid "Do you want open file(s) on client?" +msgstr "¿Quiere abrir el fichero(s) en el cliente?" + +#: ../tcosmonitor/extensions/sendfiles.py:215 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:113 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:155 +#: ../tcosmonitor/extensions/videolan.py:457 +#: ../tcosmonitor/extensions/vnc.py:68 ../tcosmonitor/extensions/vnc.py:112 +#: ../tcosmonitor/extensions/vnc.py:422 +#: ../tcosmonitor/extensions/audiortp.py:229 +#: ../tcosmonitor/extensions/audiortp.py:275 +#: ../tcosmonitor/extensions/audiortp.py:373 +#: ../tcosmonitor/extensions/audiortp.py:407 +#: ../tcosmonitor/extensions/audiortp.py:460 +msgid "No users logged." +msgstr "No hay usuarios conectados." + +#: ../tcosmonitor/extensions/info.py:91 +#, python-format +msgid "Connecting with %s to retrieve some info..." +msgstr "Conectando a %s para recibir información..." + +#: ../tcosmonitor/extensions/info.py:117 +msgid "Tcos info" +msgstr "Información de Tcos" + +#: ../tcosmonitor/extensions/info.py:120 +msgid "PXES info" +msgstr "Información de PXES" + +#: ../tcosmonitor/extensions/info.py:123 +msgid "LTSP info" +msgstr "Información de LTSP" + +#: ../tcosmonitor/extensions/info.py:126 +msgid "Standalone info" +msgstr "Información del equipo autónomo" + +#: ../tcosmonitor/extensions/info.py:129 +msgid "Unknow client info" +msgstr "Información de cliente desconocido" + +#: ../tcosmonitor/extensions/info.py:135 ../tcosmonitor/LocalData.py:43 +#: ../tcosmonitor/LocalData.py:62 ../tcosmonitor/TcosCommon.py:182 +#: ../tcosmonitor/TcosCommon.py:190 ../tcosmonitor/TcosCommon.py:206 +#: ../tcosmonitor/TcosCommon.py:209 +msgid "unknow" +msgstr "desconocido" + +#: ../tcosmonitor/extensions/info.py:138 +msgid "Hostname: " +msgstr "Equipo: " + +#: ../tcosmonitor/extensions/info.py:139 +msgid "Ip address: " +msgstr "Dirección IP: " + +#: ../tcosmonitor/extensions/info.py:140 +msgid "TcosXmlRpc version: " +msgstr "Versión de TcosXmlRpc: " + +#: ../tcosmonitor/extensions/info.py:149 +msgid "Tcos image version: " +msgstr "Versión de la imagen TCOS: " + +#: ../tcosmonitor/extensions/info.py:150 +msgid "Tcos image date: " +msgstr "Fecha de la imagen TCOS: " + +#: ../tcosmonitor/extensions/info.py:151 +msgid "Date of thin client: " +msgstr "Fecha y hora del cliente ligero: " + +#: ../tcosmonitor/extensions/info.py:152 +msgid "Uptime: " +msgstr "Tiempo encendido: " + +#: ../tcosmonitor/extensions/info.py:163 +msgid "Kernel info" +msgstr "Información del kernel" + +#: ../tcosmonitor/extensions/info.py:172 +msgid "Force download and mount all modules" +msgstr "Forzar descarga y montaje de todos los módulos" + +#: ../tcosmonitor/extensions/info.py:183 +msgid "None" +msgstr "Ninguno" + +#: ../tcosmonitor/extensions/info.py:186 +msgid "Kernel version: " +msgstr "Versión del kernel: " + +#: ../tcosmonitor/extensions/info.py:187 +msgid "Kernel complete version: " +msgstr "Versión completa del kernel: " + +#: ../tcosmonitor/extensions/info.py:188 +msgid "Loaded Modules: " +msgstr "Módulos cargados: " + +#: ../tcosmonitor/extensions/info.py:189 +msgid "Modules not found: " +msgstr "Módulos no encontrados: " + +#: ../tcosmonitor/extensions/info.py:205 +msgid "Cpu info: " +msgstr "Información de la CPU: " + +#: ../tcosmonitor/extensions/info.py:212 +msgid "Cpu model: " +msgstr "Modelo de CPU: " + +#: ../tcosmonitor/extensions/info.py:213 +msgid "Cpu vendor: " +msgstr "Fabricante de CPU: " + +#: ../tcosmonitor/extensions/info.py:214 +msgid "Cpu speed: " +msgstr "Velocidad de CPU: " + +#: ../tcosmonitor/extensions/info.py:225 +msgid "PCI buses: " +msgstr "Buses PCI: " + +#: ../tcosmonitor/extensions/info.py:254 +msgid "Process running: " +msgstr "Procesos ejecutándose" + +#: ../tcosmonitor/extensions/info.py:267 +msgid "Ram info: " +msgstr "Información de la ram:" + +#: ../tcosmonitor/extensions/info.py:274 +msgid "Total Ram: " +msgstr "RAM total: " + +#: ../tcosmonitor/extensions/info.py:275 +msgid "Free RAM: " +msgstr "RAM libre: " + +#: ../tcosmonitor/extensions/info.py:276 +msgid "Active RAM: " +msgstr "RAM activa: " + +#: ../tcosmonitor/extensions/info.py:279 +msgid "Swap info: " +msgstr "Información de la swap: " + +#: ../tcosmonitor/extensions/info.py:285 +msgid "Swap enabled: " +msgstr "Swap activada: " + +#: ../tcosmonitor/extensions/info.py:286 +msgid "Total Swap: " +msgstr "Swap total: " + +#: ../tcosmonitor/extensions/info.py:287 +msgid "Used Swap: " +msgstr "Swap usada: " + +#: ../tcosmonitor/extensions/info.py:297 +msgid "Network info: " +msgstr "Información de la red:" + +#: ../tcosmonitor/extensions/info.py:307 +msgid "Network hostname: " +msgstr "Nombre de máquina: " + +#: ../tcosmonitor/extensions/info.py:308 +msgid "Network IP: " +msgstr "Dirección ip: " + +#: ../tcosmonitor/extensions/info.py:309 +msgid "Network MASK: " +msgstr "Máscara de red: " + +#: ../tcosmonitor/extensions/info.py:310 +msgid "Network MAC: " +msgstr "Número de MAC: " + +#: ../tcosmonitor/extensions/info.py:311 +msgid "Data received(rx): " +msgstr "Datos recibidos(rx): " + +#: ../tcosmonitor/extensions/info.py:312 +msgid "Data send(tx): " +msgstr "Datos enviados(tx): " + +#: ../tcosmonitor/extensions/info.py:322 ../ui/tcosmonitor-prefwindow.ui:911 +msgid "Xorg info" +msgstr "Información de Xorg" + +#: ../tcosmonitor/extensions/info.py:348 +msgid "enabled" +msgstr "activado" + +#: ../tcosmonitor/extensions/info.py:350 +msgid "disabled" +msgstr "desactivado" + +#: ../tcosmonitor/extensions/info.py:353 ../ui/tcospersonalize.ui:159 +msgid "X Session Type" +msgstr "Tipo de sessión gráfica" + +#: ../tcosmonitor/extensions/info.py:355 ../ui/tcospersonalize.ui:201 +msgid "Xorg Driver" +msgstr "Driver de Xorg" + +#: ../tcosmonitor/extensions/info.py:357 ../ui/tcospersonalize.ui:94 +msgid "Xorg Resolution" +msgstr "Resolución de Xorg" + +#: ../tcosmonitor/extensions/info.py:359 ../ui/tcospersonalize.ui:133 +msgid "Xorg Color depth" +msgstr "Profundidad de color de Xorg" + +#: ../tcosmonitor/extensions/info.py:361 ../ui/tcospersonalize.ui:179 +msgid "DPMS energy monitor control" +msgstr "Control de energía del monitor DPMS" + +#: ../tcosmonitor/extensions/info.py:363 +msgid "Disable kill X with Ctrl+Alt+Backspace" +msgstr "Deshabilitar matar Xorg con Ctrl+Alt+Backspace" + +#: ../tcosmonitor/extensions/info.py:365 ../ui/tcospersonalize.ui:57 +msgid "Enable mouse wheel" +msgstr "Activar rueda del ratón" + +#: ../tcosmonitor/extensions/info.py:367 +msgid "Refresh rate" +msgstr "Tasa de Refresco" + +#: ../tcosmonitor/extensions/info.py:369 +msgid "Xorg font server" +msgstr "Servidor de fuentes de Xorg" + +#: ../tcosmonitor/extensions/info.py:371 +msgid "Mouse device" +msgstr "Dispositivo del ratón" + +#: ../tcosmonitor/extensions/info.py:373 +msgid "Mouse protocol" +msgstr "Protocolo del ratón" + +#: ../tcosmonitor/extensions/info.py:375 ../ui/tcospersonalize.ui:273 +msgid "X Horiz sync" +msgstr "Sincronización horizontal" + +#: ../tcosmonitor/extensions/info.py:377 ../ui/tcospersonalize.ui:284 +msgid "X Vert sync" +msgstr "Sincronización vertical" + +#: ../tcosmonitor/extensions/info.py:390 +msgid "PulseAudio Sound server is running" +msgstr "El servidor PulseAudio está funcionando" + +#: ../tcosmonitor/extensions/info.py:408 +msgid "Remote Sound Mixer" +msgstr "Mezclador de sonido remoto" + +#: ../tcosmonitor/extensions/info.py:480 +msgid "PulseAudio Control" +msgstr "Control de PulseAudio" + +#: ../tcosmonitor/extensions/info.py:485 +msgid "PulseAudio Meter" +msgstr "Niveles de PulseAudio " + +#: ../tcosmonitor/extensions/info.py:490 +msgid "PulseAudio Manager" +msgstr "Gestor de PulseAudio" + +#: ../tcosmonitor/extensions/info.py:494 +msgid "PulseAudio utils: " +msgstr "Utilidades de PulseAudio: " + +#: ../tcosmonitor/extensions/info.py:500 +msgid "PulseAudio stats" +msgstr "Estadísticas de PulseAudio: " + +#: ../tcosmonitor/extensions/info.py:512 +msgid "Currently in use" +msgstr "Actualmente en uso" + +#: ../tcosmonitor/extensions/info.py:513 +msgid "Allocated during whole lifetime" +msgstr "Asignado durante ejecución" + +#: ../tcosmonitor/extensions/info.py:514 +msgid "Sample cache size" +msgstr "Tamaño de la caché" + +#: ../tcosmonitor/extensions/info.py:515 +msgid "User name" +msgstr "Nombre de usuario" + +#: ../tcosmonitor/extensions/info.py:516 +msgid "Host Name" +msgstr "Nombre del equipo" + +#: ../tcosmonitor/extensions/info.py:517 +msgid "Server Name" +msgstr "Nombre del servidor" + +#: ../tcosmonitor/extensions/info.py:518 +msgid "Server Version" +msgstr "Versión del servidor pulseaudio" + +#: ../tcosmonitor/extensions/info.py:519 +msgid "Default Sample Specification" +msgstr "Especificación de la muestra" + +#: ../tcosmonitor/extensions/info.py:520 +msgid "Default Sink" +msgstr "Salida de audio por defecto" + +#: ../tcosmonitor/extensions/info.py:521 +msgid "Default Source" +msgstr "Entrada de audio por defecto" + +#: ../tcosmonitor/extensions/info.py:522 +msgid "Cookie" +msgstr "Cookie" + +#: ../tcosmonitor/extensions/info.py:528 +msgid "Sound server is not running" +msgstr "El servidor PulseAudio no está funcionando" + +#: ../tcosmonitor/extensions/info.py:589 ../tcosmonitor/extensions/info.py:597 +#: ../tcosmonitor/extensions/info.py:605 +msgid "PulseAudio apps need /dev/shm." +msgstr "PulseAudio necesita /dev/shm" + +#: ../tcosmonitor/extensions/logout.py:48 +#: ../tcosmonitor/extensions/logout.py:71 +msgid "User not logged" +msgstr "Usuario no conectado" + +#: ../tcosmonitor/extensions/logout.py:51 +#, python-format +msgid "Do you want to logout user: %s?" +msgstr "¿Quiere desconectar al usuario \"%s\"?" + +#: ../tcosmonitor/extensions/logout.py:55 +#: ../tcosmonitor/extensions/logout.py:77 +#, python-format +msgid "Session will close in %s seconds" +msgstr "La sesión se cerrará en %s segundos" + +#: ../tcosmonitor/extensions/logout.py:73 +#, python-format +msgid "Do you want to logout the following users: %s?" +msgstr "¿Quiere desconectar a los siguientes usuarios: %s ?" + +#: ../tcosmonitor/extensions/reboot.py:48 +#, python-format +msgid "Do you want to reboot: %s?" +msgstr "¿Quiere reiniciar el equipo %s ?" + +#: ../tcosmonitor/extensions/reboot.py:51 +#: ../tcosmonitor/extensions/reboot.py:61 +#, python-format +msgid "Pc will reboot in %s seconds" +msgstr "El equipo se reiniciará en %s segundos" + +#: ../tcosmonitor/extensions/reboot.py:58 +#, python-format +msgid "Do you want to reboot the following clients: %s?" +msgstr "¿Quiere reiniciar los siguientes equipos: %s ?" + +#: ../tcosmonitor/extensions/reboot.py:67 +#, python-format +msgid "Do you want to poweroff: %s?" +msgstr "¿Quiere apagar el equipo %s?" + +#: ../tcosmonitor/extensions/reboot.py:70 +#: ../tcosmonitor/extensions/reboot.py:80 +#, python-format +msgid "Pc will shutdown in %s seconds" +msgstr "El equipo se apagará en %s segundos" + +#: ../tcosmonitor/extensions/reboot.py:77 +#, python-format +msgid "Do you want to poweroff the following clients: %s?" +msgstr "¿Quiere apagar los siguientes equipos: %s?" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:50 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:109 +msgid "Internet connection has been disabled" +msgstr "El acceso a internet ha sido deshabilitado" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:54 +msgid "Can't disable internet, user is not logged" +msgstr "No se puede deshabilitar internet, el usuario no está conectado" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:59 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:85 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:103 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:147 +#, python-format +msgid "" +"In order to lock and unlock internet you need to be in 'tcos' group.\n" +"\n" +"Exe by root: adduser %s tcos" +msgstr "" +"Para poder bloquear y desbloquear internet necesita pertenecer al grupo " +"'tcos'.\n" +"\n" +"Ejecute como root: adduser %s tcos" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:77 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:151 +msgid "Internet connection has been enabled" +msgstr "El acceso a internet ha sido habilitado" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:81 +msgid "Can't enable internet, user is not logged" +msgstr "No se puede habilitar internet, el usuario no está conectado" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:116 +#, python-format +msgid "Do you want disable internet to following users: %s?" +msgstr "¿Quiere deshabilitar internet a los siguientes usuarios: %s ?" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:158 +#, python-format +msgid "Do you want enable internet to following users:%s?" +msgstr "¿Quiere habilitar internet a los siguientes usuarios: %s ?" + +#: ../tcosmonitor/extensions/videolan.py:48 +#: ../tcosmonitor/extensions/videolan.py:49 +msgid "Send Audio/Video broadcast" +msgstr "Difusión de audio/vídeo" + +#: ../tcosmonitor/extensions/videolan.py:65 +#: ../tcosmonitor/extensions/videolan.py:219 +msgid "Can't send video broadcast, user is not logged" +msgstr "No se puede enviar la difusión de vídeo, el usuario no está conectado" + +#: ../tcosmonitor/extensions/videolan.py:149 +#: ../tcosmonitor/extensions/videolan.py:347 +#: ../tcosmonitor/extensions/videolan.py:578 +#, python-format +msgid "" +"Not allowed white spaces in \"%s\".\n" +"Please rename it." +msgstr "" +"No se permiten espacios en \"%s\".\n" +"Por favor, renómbrelo." + +#: ../tcosmonitor/extensions/videolan.py:159 +#: ../tcosmonitor/extensions/videolan.py:359 +#: ../tcosmonitor/extensions/videolan.py:594 +msgid "Waiting for start video transmission..." +msgstr "Esperando arranque del modo difusión de vídeo..." + +#: ../tcosmonitor/extensions/videolan.py:167 +#: ../tcosmonitor/extensions/videolan.py:367 +#: ../tcosmonitor/extensions/videolan.py:602 +#: ../tcosmonitor/extensions/vnc.py:98 ../tcosmonitor/extensions/vnc.py:407 +msgid "Error while exec app" +msgstr "Error cuando se ejecutaba la aplicación" + +#: ../tcosmonitor/extensions/videolan.py:199 +#: ../tcosmonitor/extensions/videolan.py:393 +#: ../tcosmonitor/extensions/videolan.py:634 +msgid "Running in broadcast video transmission." +msgstr "Modo difusión de vídeo activo." + +#: ../tcosmonitor/extensions/videolan.py:208 +#: ../tcosmonitor/extensions/videolan.py:402 +#, python-format +msgid "" +"Running in broadcast video transmission to user %(host)s. Broadcast Nº %" +"(count)s" +msgstr "" +"Ejecutándose en modo de difusión de vídeo al cliente %(host)s. Broadcast Nº %" +"(count)s" + +#: ../tcosmonitor/extensions/videolan.py:311 +#: ../tcosmonitor/extensions/videolan.py:541 +msgid "Select audio/video file.." +msgstr "Seleccionar archivo de audio/vídeo..." + +#: ../tcosmonitor/extensions/videolan.py:314 +#: ../tcosmonitor/extensions/videolan.py:544 +msgid "Play DVD" +msgstr "Reproducir DVD" + +#: ../tcosmonitor/extensions/videolan.py:315 +#: ../tcosmonitor/extensions/videolan.py:545 +msgid "Play SVCD/VCD" +msgstr "Reproducir SVCD/VCD" + +#: ../tcosmonitor/extensions/videolan.py:316 +#: ../tcosmonitor/extensions/videolan.py:546 +msgid "Play AudioCD" +msgstr "Reproducir AudioCD" + +#: ../tcosmonitor/extensions/videolan.py:361 +#: ../tcosmonitor/extensions/videolan.py:596 +msgid "" +"First select the DVD chapter or play movie\n" +"then press enter to send clients..." +msgstr "" +"Primero seleccione el capítulo del DVD o reproduzca el vídeo\n" +"después, presione «enter» para enviarlo a los clientes..." + +#: ../tcosmonitor/extensions/videolan.py:370 +msgid "Lock keyboard and mouse on client?" +msgstr "¿Bloquear teclado y ratón del cliente?" + +#: ../tcosmonitor/extensions/videolan.py:444 +msgid "Video broadcast stopped." +msgstr "Difusión de vídeo parada." + +#: ../tcosmonitor/extensions/videolan.py:605 +msgid "Lock keyboard and mouse on clients?" +msgstr "¿Bloquear teclado y ratón en los clientes?" + +#: ../tcosmonitor/extensions/videolan.py:643 +#, python-format +msgid "Running in broadcast video transmission. Broadcast Nº %s" +msgstr "Ejecutándose en modo difusión de vídeo. Broadcast Nº %s" + +#: ../tcosmonitor/extensions/restartxorg.py:51 +#, python-format +msgid "Restart X session of %s with new config?" +msgstr "¿Reiniciar sesión X de %s con la nueva configuración?" + +#: ../tcosmonitor/extensions/restartxorg.py:64 +#, python-format +msgid "%s is not supported to restart Xorg!" +msgstr "¡%s no permite reiniciar Xorg!" + +#: ../tcosmonitor/extensions/restartxorg.py:78 +msgid "No thin clients found." +msgstr "No se encontraron clientes ligeros." + +#: ../tcosmonitor/extensions/restartxorg.py:81 +#, python-format +msgid "Do you want to restart X screens (only thin clients):%s?" +msgstr "" +"¿Quiere reiniciar las sesiones X de los siguientes equipos (sólo clientes " +"ligeros): %s?" + +#: ../tcosmonitor/extensions/italc.py:51 ../tcosmonitor/extensions/vnc.py:135 +msgid "No user logged." +msgstr "Usuario no conectado." + +#: ../tcosmonitor/extensions/italc.py:75 +msgid "Can't start IVS, please add iTALC support" +msgstr "No se puede arrancar el proceso IVS. Añada soporte para iTALC" + +#: ../tcosmonitor/extensions/tcospersonalize.py:54 +#, python-format +msgid "%s is not supported to personalize!" +msgstr "¡%s no está soportado para personalizar!" + +#: ../tcosmonitor/extensions/vnc.py:71 +#, python-format +msgid "Do you want to start demo mode the following users: %s?" +msgstr "¿Quiere iniciar modo demostración a los siguientes usuarios: %s ?" + +#: ../tcosmonitor/extensions/vnc.py:83 +msgid "Waiting for start demo mode..." +msgstr "Esperando al arranque del modo demostración..." + +#: ../tcosmonitor/extensions/vnc.py:116 ../tcosmonitor/extensions/vnc.py:426 +#, python-format +msgid "Running in demo mode with %s clients." +msgstr "Ejecutándose en modo demostración con %s equipos." + +#: ../tcosmonitor/extensions/vnc.py:127 +#, python-format +msgid "Running in demo mode from server. Demo Nº %s" +msgstr "" +"Ejecutándose en modo demostración desde el servidor. Demostración Nº %s" + +#: ../tcosmonitor/extensions/vnc.py:149 ../tcosmonitor/extensions/vnc.py:369 +#, python-format +msgid "Connecting with %s to start VNC support" +msgstr "Conectando a %s para arrancar soporte VNC" + +#: ../tcosmonitor/extensions/vnc.py:178 +#, python-format +msgid "" +"Can't start VNC, error:\n" +"%s" +msgstr "" +"No se pudo arrancar VNC, error:\n" +"%s" + +#: ../tcosmonitor/extensions/vnc.py:182 +msgid "Waiting for start of VNC server..." +msgstr "Esperando a que comience el servidor VNC..." + +#: ../tcosmonitor/extensions/vnc.py:211 +msgid "Can't start VNC, please add X11VNC support" +msgstr "No se pudo arrancar VNC, por favor añada soporte para X11VNC." + +#: ../tcosmonitor/extensions/vnc.py:237 +msgid "Switch to view only" +msgstr "Cambiar a sólo ver" + +#: ../tcosmonitor/extensions/vnc.py:242 ../tcosmonitor/extensions/vnc.py:273 +msgid "Switch to full control" +msgstr "Activar control remoto" + +#: ../tcosmonitor/extensions/vnc.py:269 +#, python-format +msgid "VNC host %s" +msgstr "Equipo VNC %s" + +#: ../tcosmonitor/extensions/vnc.py:281 +msgid "Switch to fullscreen" +msgstr "Pantalla completa" + +#: ../tcosmonitor/extensions/vnc.py:290 +#: ../tcosmonitor/extensions/livevnc.py:72 +#: ../tcosmonitor/TcosPreferences.py:539 ../tcosmonitor/TcosExtensions.py:338 +msgid "Stop" +msgstr "Parar" + +#: ../tcosmonitor/extensions/vnc.py:342 +msgid "Can't start demo mode, user is not logged" +msgstr "" +"No se pudo arrancar modo demostración,\n" +"el usuario no está conectado" + +#: ../tcosmonitor/extensions/vnc.py:345 +#, python-format +msgid "Do you want demo mode from user %s?" +msgstr "¿Quiere iniciar el modo demostración desde el cliente %s?" + +#: ../tcosmonitor/extensions/vnc.py:392 +#, python-format +msgid "Waiting for start demo mode from user %s..." +msgstr "Esperando al arranque del modo demostración desde el cliente %s..." + +#: ../tcosmonitor/extensions/vnc.py:446 +#, python-format +msgid "Running in demo mode from user %(host)s. Demo Nº %(count)s" +msgstr "" +"Ejecutándose en modo demostración desde el cliente %(host)s. Demostración Nº " +"%(count)s" + +#: ../tcosmonitor/extensions/vnc.py:501 +msgid "Demo mode off." +msgstr "Modo demostración desactivado." + +#: ../tcosmonitor/extensions/wakeonlan.py:50 +#: ../tcosmonitor/extensions/wakeonlan.py:75 +msgid "" +"Wake On Lan only works with static list.\n" +"\n" +"Enable scan method \"static\" in Preferences\n" +"and (wake on lan) support in bios of clients." +msgstr "" +"Arrancar por red sólo funciona con lista estática.\n" +"\n" +"Activar método escaneo \"static\" en Preferencias\n" +"y soporte (wake on lan) en la configuración bios de los clientes." + +#: ../tcosmonitor/extensions/wakeonlan.py:54 +#, python-format +msgid "Do you want boot %s client?" +msgstr "¿Quiere arrancar el cliente %s ?" + +#: ../tcosmonitor/extensions/wakeonlan.py:67 +#: ../tcosmonitor/extensions/wakeonlan.py:91 +#, python-format +msgid "No register MAC address for ip: \"%s\"" +msgstr "Dirección MAC no registrada para la IP: \"%s\"" + +#: ../tcosmonitor/extensions/wakeonlan.py:71 +#: ../tcosmonitor/extensions/wakeonlan.py:98 +#, python-format +msgid "Not valid MAC address: \"%s\"" +msgstr "Dirección MAC no válida: \"%s\"" + +#: ../tcosmonitor/extensions/wakeonlan.py:79 +msgid "Do you want boot all clients?" +msgstr "¿Quiere arrancar todos los clientes?" + +#: ../tcosmonitor/extensions/livevnc.py:76 +msgid "Live view of all hosts" +msgstr "Ver en directo todos los equipos" + +#: ../tcosmonitor/extensions/livevnc.py:194 +msgid "Running in LiveView mode" +msgstr "Ejecutándose en modo LiveView" + +#: ../tcosmonitor/extensions/viewproc.py:48 +msgid "Can't show runnings apps, user is not logged" +msgstr "" +"No se pueden ver las aplicaciones ejecutadas,\n" +"el usuario no está conectado." + +#: ../tcosmonitor/extensions/viewproc.py:58 +msgid "User not connected, no processes." +msgstr "Usuario no conectado, no existen procesos." + +#: ../tcosmonitor/extensions/viewproc.py:76 +#, python-format +msgid "Running processes for user \"%s\": " +msgstr "Procesos ejecutados por el usuario \"%s\":" + +#: ../tcosmonitor/extensions/viewproc.py:80 +msgid "" +"ALERT: There are some system process hidden. Enable it in Preferences dialog." +msgstr "" +"AVISO: Hay varios procesos del sistema ocultos. Puede activarlos en la " +"ventana de Preferencias." + +#: ../tcosmonitor/extensions/viewproc.py:85 +msgid "Pid" +msgstr "Pid" + +#: ../tcosmonitor/extensions/viewproc.py:86 +msgid "Process command" +msgstr "Comando del proceso" + +#: ../tcosmonitor/extensions/viewproc.py:91 +msgid "Kill this process" +msgstr "Matar este proceso" + +#: ../tcosmonitor/extensions/viewproc.py:127 +msgid "Are you sure you want to stop this process?" +msgstr "¿Está seguro que quiere parar este proceso?" + +#: ../tcosmonitor/extensions/viewproc.py:136 +#, python-format +msgid "" +"Error while killing app:\n" +"Reason: %s" +msgstr "" +"Error cuando se cerraba aplicación:\n" +"Razón: %s" + +#: ../tcosmonitor/extensions/audiortp.py:49 +#: ../ui/tcosmonitor-mainwindow.ui:163 +msgid "Send audio conference" +msgstr "Enviar conferencia de audio" + +#: ../tcosmonitor/extensions/audiortp.py:50 +#: ../ui/tcosmonitor-prefwindow.ui:1507 +msgid "Audio chat conference" +msgstr "Audio chat conferencia" + +#: ../tcosmonitor/extensions/audiortp.py:51 +#: ../ui/tcosmonitor-mainwindow.ui:275 +msgid "Audio chat list" +msgstr "Lista de audio chat" + +#: ../tcosmonitor/extensions/audiortp.py:52 +msgid "Send audio conference (from this host)" +msgstr "Enviar audio conferencia (desde este equipo)" + +#: ../tcosmonitor/extensions/audiortp.py:73 +msgid "Emission" +msgstr "Emisión" + +#: ../tcosmonitor/extensions/audiortp.py:79 +msgid "State" +msgstr "Estado" + +#: ../tcosmonitor/extensions/audiortp.py:83 +msgid "Channel" +msgstr "Canal" + +#: ../tcosmonitor/extensions/audiortp.py:235 +#: ../tcosmonitor/extensions/audiortp.py:322 +#: ../tcosmonitor/extensions/audiortp.py:413 +msgid "" +"Your pulseaudio server is too old.\n" +"Is required pulseaudio version >= 0.9.10" +msgstr "" +"Su servidor de pulseaudio es antiguo.\n" +"Se requiere una versión de pulseaudio >= 0.9.10" + +#: ../tcosmonitor/extensions/audiortp.py:238 +#, python-format +msgid "Do you want to start audio conference to the following users: %s?" +msgstr "¿Quiere iniciar conferencia de audio a los siguientes usuarios: %s ?" + +#: ../tcosmonitor/extensions/audiortp.py:243 +msgid "You have entered in audio conference" +msgstr "Ha entrado en conferencia de audio" + +#: ../tcosmonitor/extensions/audiortp.py:267 +msgid "Waiting for start audio conference..." +msgstr "Esperando al arranque de la conferencia de audio..." + +#: ../tcosmonitor/extensions/audiortp.py:295 +#: ../tcosmonitor/extensions/audiortp.py:390 +#, python-format +msgid "Running in audio conference with %s clients." +msgstr "Ejecutándose en conferencia de audio con %s clientes." + +#: ../tcosmonitor/extensions/audiortp.py:305 +#, python-format +msgid "Running in audio conference from server. Conference Nº %s" +msgstr "" +"Ejecutándose en conferencia de audio desde el servidor. Conferencia Nº %s" + +#: ../tcosmonitor/extensions/audiortp.py:316 +msgid "Can't start conference mode, user is not logged" +msgstr "" +"No se pudo arrancar el modo conferencia,\n" +"el usuario no está conectado" + +#: ../tcosmonitor/extensions/audiortp.py:325 +#, python-format +msgid "Do you want audio conference from user %s?" +msgstr "¿Quiere iniciar conferencia de audio desde el cliente %s?" + +#: ../tcosmonitor/extensions/audiortp.py:331 +#, python-format +msgid "You have entered in audio conference from user %s" +msgstr "Ha entrado en conferencia de audio desde el cliente %s" + +#: ../tcosmonitor/extensions/audiortp.py:359 +#, python-format +msgid "Waiting for start audio conference from user %s..." +msgstr "" +"Esperando al arranque de la conferencia de audio desde el cliente %s..." + +#: ../tcosmonitor/extensions/audiortp.py:400 +#, python-format +msgid "Running in audio conference from user %(host)s. Conference Nº %(count)s" +msgstr "" +"Ejecutándose en conferencia de audio desde el cliente %(host)s. Conferencia " +"Nº %(count)s" + +#: ../tcosmonitor/extensions/audiortp.py:416 +#, python-format +msgid "Do you want to start audio chat conference to the following users: %s?" +msgstr "" +"¿Quiere iniciar conferencia de audio chat a los siguientes usuarios: %s ?" + +#: ../tcosmonitor/extensions/audiortp.py:421 +#, python-format +msgid "You have entered in audio chat conference. Participants: %s" +msgstr "Ha entrado en conferencia de audio chat. Participantes: %s" + +#: ../tcosmonitor/extensions/audiortp.py:443 +msgid "Waiting for start audio chat conference..." +msgstr "Esperando al arranque de la conferencia de audio chat..." + +#: ../tcosmonitor/extensions/audiortp.py:449 +msgid "Do you want to connect to this audio chat conference now?" +msgstr "¿Quiere conectarse ahora a ésta conferencia de audio chat?" + +#: ../tcosmonitor/extensions/audiortp.py:483 +#, python-format +msgid "Running in audio chat conference with %s clients." +msgstr "Ejecutándose en conferencia de audio chat con %s clientes." + +#: ../tcosmonitor/extensions/audiortp.py:495 +#, python-format +msgid "Running in audio chat conference. Conference Nº %s" +msgstr "Ejecutándose en conferencia de audio chat. Conferencia Nº %s" + +#: ../tcosmonitor/extensions/audiortp.py:521 +msgid "Conference mode off." +msgstr "Modo conferencia desactivado." + +#: ../tcosmonitor/extensions/audiortp.py:540 +msgid "Audio chat conference off." +msgstr "Audio chat conferencia apagada." + +#: ../tcosmonitor/TcosXmlRpc.py:85 +msgid "" +"Username or password are empty,\n" +"please edit in preferences dialog!" +msgstr "" +"El usuario o la contraseña están vacíos,\n" +"por favor, verifique el dialogo de preferencias" + +#: ../tcosmonitor/TcosIconView.py:55 +msgid "Place mouse on any computer to see brief info about it." +msgstr "" +"Pase el ratón por encima de cada equipo para obtener una descripción mas " +"detallada." + +#: ../tcosmonitor/TcosListView.py:82 +msgid "Active" +msgstr "Activo" + +#: ../tcosmonitor/TcosListView.py:92 +msgid "Screen Blocked" +msgstr "Bloqueado" + +#: ../tcosmonitor/TcosListView.py:97 +msgid "Num of process" +msgstr "Núm. de procesos" + +#: ../tcosmonitor/TcosListView.py:112 +msgid "Sel" +msgstr "Sel" + +#: ../tcosmonitor/TcosListView.py:148 +#, python-format +msgid "Error connecting to tcosxmlrpc in %s" +msgstr "Error conectando a tcosxmlrpc en %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:154 +#, python-format +msgid "Floppy: %s" +msgstr "Disquete: %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:156 +#, python-format +msgid "CDROM: %s" +msgstr "CDROM: %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:158 +#, python-format +msgid "USB: %s" +msgstr "USB: %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:160 +#, python-format +msgid "HDD partition: %s" +msgstr "Partición: %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:162 +#, python-format +msgid "Unknow: %s" +msgstr "Desconocido: %s" + +#: ../tcosmonitor/Initialize.py:217 +msgid "GPL-2 license file not found" +msgstr "El archivo de licencia GPL-2 no se ha encontrado" + +#: ../tcosmonitor/LocalData.py:212 +#, python-format +msgid "Selected network inteface (%s) don't have IP address" +msgstr "El interfaz de red seleccionado (%s) no tiene dirección IP" + +#: ../tcosmonitor/LocalData.py:260 ../tcosmonitor/ping.py:108 +#: ../tcosmonitor/ping.py:171 +msgid "Testing if found clients have 8998 or 8999 port open..." +msgstr "" +"Comprobando si los clientes encontrados tienen el puerto 8998 o 8999 " +"abierto..." + +#: ../tcosmonitor/LocalData.py:282 +msgid "" +"Static list method configured but no hosts in list.\n" +"\n" +"Please, open preferences, click on 'Open Static Host list' and add some " +"hosts." +msgstr "" +"Está seleccionado el método lista estática de equipos pero\n" +"no hay equipos configurados.\n" +"\n" +"Por favor, abra las preferencias, pulse en 'Lista de equipos' y añada alguno." + +#: ../tcosmonitor/TcosPreferences.py:264 +msgid "" +"You have select more than 5 button menus.\n" +"Only allowed to select a maximum of 5 buttons." +msgstr "" +"Ha seleccionado más de 5 botones de menus.\n" +"Sólo está permitido seleccionar máximo 5 botones." + +#: ../tcosmonitor/TcosPreferences.py:275 +msgid "New settings saved." +msgstr "Configuración guardada." + +#: ../tcosmonitor/TcosMenus.py:102 ../tcosmonitor/TcosMenus.py:114 +#, python-format +msgid "Actions for %s" +msgstr "Acciones para %s" + +#: ../tcosmonitor/TcosMenus.py:107 +msgid "Actions for selected host" +msgstr "Acciones para el equipo seleccionado" + +#: ../tcosmonitor/TcosMenus.py:168 ../tcosmonitor/TcosMenus.py:299 +#, python-format +msgid "%d hidden actions" +msgstr "%d acciones ocultas" + +#: ../tcosmonitor/TcosMenus.py:243 ../tcosmonitor/TcosMenus.py:245 +msgid "Actions for selected hosts" +msgstr "Acciones para los equipos seleccionados" + +#: ../tcosmonitor/TcosMenus.py:247 +msgid "Actions for all hosts" +msgstr "Acciones para todos los equipos" + +#: ../tcosmonitor/TcosMenus.py:304 +msgid "Save hosts positions" +msgstr "Guardar posiciones de los equipos" + +#: ../tcosmonitor/TcosMenus.py:312 +msgid "Reset hosts positions" +msgstr "Resetear posiciones de los equipos" + +#: ../tcosmonitor/ping.py:80 +#, python-format +msgid "Ping to %s..." +msgstr "Haciendo ping a %s..." + +#: ../tcosmonitor/ping.py:89 +msgid "Waiting for pings..." +msgstr "Esperando a los pings..." + +#: ../tcosmonitor/ping.py:127 ../tcosmonitor/ping.py:192 +#: ../tcosmonitor/TcosActions.py:185 ../tcosmonitor/TcosActions.py:264 +msgid "Not connected hosts found." +msgstr "No se encontraron equipos conectados." + +#: ../tcosmonitor/ping.py:134 ../tcosmonitor/ping.py:197 +#: ../tcosmonitor/TcosActions.py:187 ../tcosmonitor/TcosActions.py:259 +#, python-format +msgid "Found %d hosts" +msgstr "Encontrados %d equipos" + +#: ../tcosmonitor/TcosActions.py:162 ../tcosmonitor/TcosActions.py:241 +msgid "Searching for connected hosts..." +msgstr "Buscando equipos conectados..." + +#: ../tcosmonitor/TcosActions.py:1019 +msgid "Searching info of hosts..." +msgstr "Buscando información de equipos..." + +#: ../tcosmonitor/TcosActions.py:1058 +#, python-format +msgid "Connecting to %s..." +msgstr "Conectando a %s..." + +#: ../tcosmonitor/TcosExtensions.py:41 +msgid "Exception:" +msgstr "Excepción:" + +#: ../tcosmonitor/TcosExtensions.py:77 +msgid "Error: no IP!" +msgstr "Error: No se ha indicado dirección IP." + +#: ../tcosmonitor/TcosExtensions.py:154 +msgid "No clients connected, press refresh button." +msgstr "No se encontraron clientes, pulse el botón actualizar." + +#: ../tcosmonitor/TcosExtensions.py:251 ../tcosmonitor/TcosExtensions.py:253 +#, python-format +msgid "Can't exec this action at '%s' because you are connected at this host!" +msgstr "" +"No se puede ejecutar esta acción para '%s' porque está conectado desde él." + +#: ../tcosmonitor/TcosExtensions.py:267 +#, python-format +msgid "Doing action \"%(action)s\" in %(ip)s..." +msgstr "Realizando acción \"%(action)s\" en equipo %(ip)s..." + +#: ../tcosmonitor/TcosExtensions.py:285 +#, python-format +msgid "Done action \"%(action)s\" in %(ip)s" +msgstr "Acción \"%(action)s\" terminada en %(ip)s" + +#: ../tcosmonitor/TcosCommon.py:89 +#, python-format +msgid "" +"ThreadController: Found error executing %(cmd)s\n" +"\n" +"If problem persist, disable Thread Controller\n" +"in Preferences and report bug.\n" +"Error=%(error)s" +msgstr "" +"ThreadController: Se encontró un error al ejecutar %(cmd)s\n" +"\n" +"Si el problema persiste, desactive Thread Controller\n" +"en Preferencias y reporte el bug.\n" +"Error=%(error)s" + +#: ../ui/tcosmonitor-prefwindow.ui:35 ../ui/tcospersonalize.ui:7 +#: ../ui/tcosmonitor-mainwindow.ui:36 +msgid "Preferences" +msgstr "Preferencias" + +#: ../ui/tcosmonitor-prefwindow.ui:62 +msgid "Show host list on startup" +msgstr "Mostrar lista de equipos al arranque" + +#: ../ui/tcosmonitor-prefwindow.ui:80 +msgid "Scan network method" +msgstr "Método de escaneo de equipos" + +#: ../ui/tcosmonitor-prefwindow.ui:91 +msgid "" +"Network interface\n" +"(thin client)" +msgstr "" +"Interface de red\n" +"(clientes ligeros)" + +#: ../ui/tcosmonitor-prefwindow.ui:127 +msgid "Show system process" +msgstr "Mostrar procesos del sistema" + +#: ../ui/tcosmonitor-prefwindow.ui:144 +msgid "Don't do actions when running TcosMonitor in thin client" +msgstr "No ejecutar acciones cuando TcosMonitor se ejecute desde un terminal." + +#: ../ui/tcosmonitor-prefwindow.ui:163 +msgid "List of hosts" +msgstr "Lista de equipos" + +#: ../ui/tcosmonitor-prefwindow.ui:200 +msgid "Open static host list" +msgstr "Abrir lista fija de equipos" + +#: ../ui/tcosmonitor-prefwindow.ui:225 +msgid "Only show hosts running tcosxmlrpc (8998 port)" +msgstr "Sólo mostrar equipos con tcosmxlrpc (puerto 8998)" + +#: ../ui/tcosmonitor-prefwindow.ui:242 +msgid "Only do all actions on selected hosts (requires restart TcosMonitor)" +msgstr "" +"Sólo hacer acciones para equipos seleccionados \n" +"(necesita reiniciar TcosMonitor)" + +#: ../ui/tcosmonitor-prefwindow.ui:259 +msgid "Enable SSL connections to XMLRPC clients" +msgstr "Usar conexiones SSL a los clientes XMLRPC" + +#: ../ui/tcosmonitor-prefwindow.ui:278 +msgid "Host list mode" +msgstr "Modo de lista de equipos" + +#: ../ui/tcosmonitor-prefwindow.ui:302 +msgid "Show right menu with groups (NEW)" +msgstr "Mostrar menú por categorías (NUEVO)" + +#: ../ui/tcosmonitor-prefwindow.ui:319 +msgid "Don't show thin client if TcosMonitor is running there" +msgstr "No mostrar equipo si TcosMonitor se ejecuta desde el." + +#: ../ui/tcosmonitor-prefwindow.ui:351 +msgid "Settings" +msgstr "Configuración" + +#: ../ui/tcosmonitor-prefwindow.ui:376 +msgid "Update host list every (seg)" +msgstr "Actualizar interfaz cada (seg)" + +#: ../ui/tcosmonitor-prefwindow.ui:389 +msgid "" +"Update host list every selected seconds.\n" +"\n" +"Value=0 disable update." +msgstr "" +"Actualizar lista de equipos cada número\n" +"de segundos seleccionado.\n" +"\n" +"Valor=0 deshabilitar actualización." + +#: ../ui/tcosmonitor-prefwindow.ui:405 +msgid "Cache timeout (seg)" +msgstr "Tiempo de vida de la cache (seg)" + +#: ../ui/tcosmonitor-prefwindow.ui:419 +msgid "" +"Cache some data and connection status during selected seconds.\n" +"\n" +"Value=0 disable cache." +msgstr "" +"Cachear datos y estado de conexiones durante el número\n" +"de segundos seleccionado.\n" +"\n" +"Valor=0 deshabilitar cache." + +#: ../ui/tcosmonitor-prefwindow.ui:437 +msgid "Screenshot size:" +msgstr "Tamaño de captura de pantalla" + +#: ../ui/tcosmonitor-prefwindow.ui:450 ../ui/tcosmonitor-prefwindow.ui:479 +msgid "% Size of screnshot." +msgstr "%s de tamaño de captura de pantalla" + +#: ../ui/tcosmonitor-prefwindow.ui:466 +msgid "Mini screenshot size:" +msgstr "Tamaño de mini capturas de pantalla" + +#: ../ui/tcosmonitor-prefwindow.ui:495 +msgid "Timeout actions (seg)" +msgstr "Tiempo de espera para acciones (seg)" + +#: ../ui/tcosmonitor-prefwindow.ui:508 +msgid "" +"Timeout in seg for actions\n" +"\n" +"Value=0 default" +msgstr "" +"Tiempo de espera para acciones\n" +"\n" +"por defecto 0" + +#: ../ui/tcosmonitor-prefwindow.ui:526 +msgid "SSH remote username" +msgstr "Usuario remoto SSH" + +#: ../ui/tcosmonitor-prefwindow.ui:553 +msgid "VLC method to send" +msgstr "VLC método de envio" + +#: ../ui/tcosmonitor-prefwindow.ui:578 +msgid "" +"<b>Experimental: Thread Controller</b>\n" +"( if you have problems, disable it )" +msgstr "" +"<b>Experimental: Control de Threads</b>\n" +"( Si tiene problemas, desactivelo )" + +#: ../ui/tcosmonitor-prefwindow.ui:591 +msgid "Actions controlled" +msgstr "Acciones controladas" + +#: ../ui/tcosmonitor-prefwindow.ui:611 +msgid "Block ports: (80,8080... etc)" +msgstr "Bloquear puertos: (80,8080... etc)" + +#: ../ui/tcosmonitor-prefwindow.ui:653 ../ui/tcospersonalize.ui:333 +msgid "Advanced" +msgstr "Avanzado" + +#: ../ui/tcosmonitor-prefwindow.ui:680 +msgid "TcosXmlRpc username" +msgstr "Usuario TcosXmlRpc" + +#: ../ui/tcosmonitor-prefwindow.ui:706 +msgid "TcosXmlRpc password" +msgstr "Contraseña TcosXmlRpc" + +#: ../ui/tcosmonitor-prefwindow.ui:735 +msgid "" +"<b>NOTE:</b>\n" +"Default user is <b>root</b> and default password is <b>root</b>.\n" +"\n" +"For <u>thin clients</u> change TCOS_ROOT_PASSWD or use TcosConfig and " +"regenerate boot images again.\n" +"\n" +"For <u>standalone</u> users you can use a system account (root) but this is " +"not recomended. Install tcos-standalone and start it by root. Set user and " +"password, this will create a <b>/etc/tcospasswd</b> file only used by TCOS " +"and your root acount will be secure." +msgstr "" +"<b>NOTA:</b>\n" +"El usuario por defecto es <b>root</b> y la contraseña es <b>root</b>.\n" +"\n" +"Para <u>terminales ligeros</u> puedes modificar TCOS_ROOT_PASSWD o usar " +"TcosConfig yregenerar las imágenes de arranque de nuevo.\n" +"\n" +"Para equipos <u>autónomos(standalone)</u> puedes usar la cuenta del sistema " +"(root) pero esto no es recomandable. Instala el paquete tcos-standalone " +"ejecútalo como administrador y configura un usuario y una cuenta.La " +"contraseña se guardará en <b>/etc/tcospasswd</b>, archivo que sólo lo " +"necesita TCOS por lo que tu cuenta de root estará a salvo." + +#: ../ui/tcosmonitor-prefwindow.ui:772 +msgid "Authentication " +msgstr "Autenticación" + +#: ../ui/tcosmonitor-prefwindow.ui:795 +msgid "<b>Info avalaible from tcosxmlrpc</b>" +msgstr "<b>Información disponible de tcosxmlrpc</b>" + +#: ../ui/tcosmonitor-prefwindow.ui:806 +msgid "Tcos general info" +msgstr "Información general de Tcos" + +#: ../ui/tcosmonitor-prefwindow.ui:821 +msgid "Cpu info" +msgstr "Información de la CPU" + +#: ../ui/tcosmonitor-prefwindow.ui:836 +msgid "Kernel and modules info" +msgstr "Información del kernel y módulos" + +#: ../ui/tcosmonitor-prefwindow.ui:851 +msgid "PCI bus info" +msgstr "Información bus PCI" + +#: ../ui/tcosmonitor-prefwindow.ui:866 +msgid "Ram and swap info" +msgstr "Información de la RAM y SWAP" + +#: ../ui/tcosmonitor-prefwindow.ui:881 +msgid "Process info" +msgstr "Información de procesos" + +#: ../ui/tcosmonitor-prefwindow.ui:896 +msgid "Network info" +msgstr "Información de la red" + +#: ../ui/tcosmonitor-prefwindow.ui:926 +msgid "Sound server info" +msgstr "Información del servidor de sonido" + +#: ../ui/tcosmonitor-prefwindow.ui:962 +msgid "Avalaible info" +msgstr "Información disponible" + +#: ../ui/tcosmonitor-prefwindow.ui:985 +msgid "<b>Show / hide menu items</b>" +msgstr "<b>Mostrar / ocultar menús de la aplicación</b>" + +#: ../ui/tcosmonitor-prefwindow.ui:1003 +msgid "Lock and unlock screen" +msgstr "Bloquear y desbloquear pantallas" + +#: ../ui/tcosmonitor-prefwindow.ui:1019 +msgid "Remote SSH shell" +msgstr "Consola SSH remota" + +#: ../ui/tcosmonitor-prefwindow.ui:1037 +msgid "Configure Xorg settings" +msgstr "Configurar Xorg" + +#: ../ui/tcosmonitor-prefwindow.ui:1066 ../ui/tcosmonitor-prefwindow.ui:1427 +msgid "Exe app on user display" +msgstr "Ejecutar aplicaciones" + +#: ../ui/tcosmonitor-prefwindow.ui:1082 ../ui/tcosmonitor-prefwindow.ui:1441 +msgid "Send a text message" +msgstr "Enviar un mensaje de texto" + +#: ../ui/tcosmonitor-prefwindow.ui:1100 +msgid "Show running apps" +msgstr "Ver aplicaciones ejecutadas" + +#: ../ui/tcosmonitor-prefwindow.ui:1116 ../ui/tcosmonitor-prefwindow.ui:1457 +msgid "Send video broadcast" +msgstr "Enviar audio/vídeo" + +#: ../ui/tcosmonitor-prefwindow.ui:1150 +msgid "Demo mode" +msgstr "Modo demostración" + +#: ../ui/tcosmonitor-prefwindow.ui:1179 +msgid "Wake on LAN" +msgstr "Wake on LAN" + +#: ../ui/tcosmonitor-prefwindow.ui:1195 +msgid "Audio conference mode" +msgstr "Modo audio conferencia" + +#: ../ui/tcosmonitor-prefwindow.ui:1213 +msgid "Screenshots" +msgstr "Capturas de pantalla" + +#: ../ui/tcosmonitor-prefwindow.ui:1229 +msgid "Reboot and poweroff" +msgstr "Apagar y reiniciar" + +#: ../ui/tcosmonitor-prefwindow.ui:1243 +msgid "Lock and unlock internet" +msgstr "Bloquear y desbloquear internet" + +#: ../ui/tcosmonitor-prefwindow.ui:1259 +msgid "DPMS monitor on/off" +msgstr "DPMS control energía monitores" + +#: ../ui/tcosmonitor-prefwindow.ui:1277 +msgid "Connect using VNC" +msgstr "Conectar usando VNC" + +#: ../ui/tcosmonitor-prefwindow.ui:1293 +msgid "Connect using iTALC" +msgstr "Conectar usando iTALC" + +#: ../ui/tcosmonitor-prefwindow.ui:1308 +msgid "Restart session with new settings" +msgstr "Reiniciar con la nueva configuración" + +#: ../ui/tcosmonitor-prefwindow.ui:1385 +msgid "Menus" +msgstr "Menús" + +#: ../ui/tcosmonitor-prefwindow.ui:1408 +msgid "<b>Show / hide menu buttons</b>" +msgstr "<b>Mostrar / ocultar botones de menús</b>" + +#: ../ui/tcosmonitor-prefwindow.ui:1491 +msgid "Audio conference" +msgstr "Audio conferencia" + +#: ../ui/tcosmonitor-prefwindow.ui:1525 +msgid "Audio Chat control" +msgstr "Control de audio chat" + +#: ../ui/tcosmonitor-prefwindow.ui:1569 +msgid "Menu buttons" +msgstr "Botones de menús" + +#: ../ui/tcosmonitor-abouttcos.ui:6 +msgid "About TCOS" +msgstr "Acerca de TCOS" + +#: ../ui/tcosmonitor-abouttcos.ui:19 +msgid "<span size=\"xx-large\">TcosMonitor</span>" +msgstr "<span size=\"x-large\">TcosMonitor</span>" + +#: ../ui/tcosmonitor-abouttcos.ui:62 +msgid "<b>Version:</b>" +msgstr "<b>Versión:</b>" + +#: ../ui/tcosmonitor-abouttcos.ui:90 +msgid "" +"Thin client and standalone\n" +"monitoring tool." +msgstr "" +"Herramienta de monitorización\n" +"de clientes ligeros e instalados." + +#: ../ui/tcosmonitor-abouttcos.ui:131 +msgid "Project web site" +msgstr "Página web del proyecto" + +#: ../ui/tcosmonitor-abouttcos.ui:178 +msgid "About" +msgstr "Acerca de" + +#: ../ui/tcosmonitor-abouttcos.ui:212 +msgid "License" +msgstr "Licencia" + +#: ../ui/tcosmonitor-abouttcos.ui:230 +msgid "" +"Main developers:\n" +" * Mario Izquierdo <mariodebian at gmail.com>\n" +" * Ignacio Vidal <vidal_joshur at gva.es>\n" +"\n" +"Contributors:\n" +" * Andrés Jimenez\n" +" * Quirón\n" +"\n" +"Special thanks to:\n" +" Comunidad de Madrid, MaX group (Spain)" +msgstr "" +"Desarrolladores principales:\n" +" * Mario Izquierdo <mariodebian at gmail.com>\n" +" * Ignacio Vidal <vidal_joshur at gva.es>\n" +"\n" +"Han contribuido:\n" +" * Andrés Jimenez\n" +" * Quirón\n" +"\n" +"Muy en especial gracias a:\n" +" Comunidad de Madrid, grupo MaX (España)" + +#: ../ui/tcosmonitor-abouttcos.ui:259 +msgid "Authors" +msgstr "Autores" + +#: ../ui/tcosmonitor-abouttcos.ui:275 +msgid "Translated to your language by:" +msgstr "Traducido a su idioma por:" + +#: ../ui/tcosmonitor-abouttcos.ui:287 +msgid "Mario Izquierdo <mariodebian@gmail.com>" +msgstr "Mario Izquierdo <mariodebian@gmail.com>" + +#: ../ui/tcosmonitor-abouttcos.ui:307 +msgid "Translators" +msgstr "Traductores" + +#: ../ui/tcosmonitor-abouttcos.ui:324 +msgid "" +"TCOS is a free software project that need a lot of work to be the best thin " +"client plataform.\n" +"\n" +"We work every day a lot of hours to make changes and support more devices " +"and features.\n" +"\n" +"We want to continue developing this software but need your help, if you use, " +"sell or hack TCOS pehaps you could donate some money to project.\n" +"\n" +"Click on next url to get some info." +msgstr "" +"TCOS es un proyecto libre que necesita mucho trabajo para intentar ser la " +"mejor plataforma de clientes ligeros.\n" +"\n" +"Trabajamos cada día muchas horas para hacer cambios y soportar más " +"dispositivos y características.\n" +"\n" +"Queremos continuar haciéndolo pero necesitamos tu ayuda, si usas, vendes o " +"modificas TCOS, quizás puedas donar algo de dinero al proyecto.\n" +"\n" +"Pulsa en el enlace inferior para obtener más información." + +#: ../ui/tcosmonitor-abouttcos.ui:370 +msgid "<u>http://wiki.tcosproject.org/TcosProject:Site_support</u>" +msgstr "<u>http://wiki.tcosproject.org/TcosProject:Site_support/es</u>" + +#: ../ui/tcosmonitor-abouttcos.ui:392 +msgid "Don't show donations message on start." +msgstr "No mostrar este mensaje al inicio." + +#: ../ui/tcosmonitor-abouttcos.ui:415 +msgid "Donate" +msgstr "Donaciones" + +#: ../ui/tray.ui:20 +msgid "<big><b>TCOS devices</b></big>" +msgstr "<big><b>Dispositivos TCOS</b></big>" + +#: ../ui/tray.ui:57 +msgid "Hide" +msgstr "Ocultar" + +#: ../ui/tcos-volume-manager.ui:39 +msgid "Restart sound" +msgstr "Reiniciar sonido" + +#: ../ui/tcos-volume-manager.ui:54 +msgid "Sound levels" +msgstr "Niveles de volumen" + +#: ../ui/tcos-volume-manager.ui:90 +msgid "Main Channels" +msgstr "Canales principales" + +#: ../ui/tcos-volume-manager.ui:113 +msgid "Secondary Channels" +msgstr "Canales secundarios" + +#: ../ui/tcosmonitor-chatwindow.ui:8 +msgid "Chat emission list" +msgstr "Lista de emisión chat" + +#: ../ui/tcosmonitor-chatwindow.ui:17 +msgid "<span size=\"x-large\">Chat emission list</span>" +msgstr "<span size=\"x-large\">Lista de emisión chat</span>" + +#: ../ui/tcosmonitor-chatwindow.ui:80 +msgid "Connect" +msgstr "Conectar" + +#: ../ui/tcosmonitor-chatwindow.ui:128 +msgid "Disconnect" +msgstr "Desconectar" + +#: ../ui/tcosmonitor-chatwindow.ui:176 +msgid "Exit" +msgstr "Cerrar" + +#: ../ui/tcosmonitor-staticwindow.ui:8 +msgid "Static hosts list" +msgstr "Lista de equipos" + +#: ../ui/tcosmonitor-staticwindow.ui:17 +msgid "<span size=\"x-large\">Static Hosts list</span>" +msgstr "<span size=\"x-large\">Lista de equipos</span>" + +#: ../ui/tcosmonitor-staticwindow.ui:80 +msgid "Add" +msgstr "Añadir" + +#: ../ui/tcosmonitor-staticwindow.ui:128 +msgid "Modify" +msgstr "Modificar" + +#: ../ui/tcosmonitor-staticwindow.ui:176 +msgid "Delete" +msgstr "Borrar" + +#: ../ui/tcosmonitor-staticwindow.ui:225 +msgid "Get from connected" +msgstr "Tomar desde conectados" + +#: ../ui/tcosmonitor-staticwindow.ui:292 ../ui/tcosmonitor-mainwindow.ui:771 +#: ../ui/tcosmonitor-staticwindownew.ui:150 +msgid "Cancel" +msgstr "Cancelar" + +#: ../ui/tcosmonitor-staticwindow.ui:340 +#: ../ui/tcosmonitor-staticwindownew.ui:198 +msgid "Save" +msgstr "Guardar" + +#: ../ui/tcospersonalize.ui:34 +msgid "<b>unknow host</b>" +msgstr "<b>equipo desconocido</b>" + +#: ../ui/tcospersonalize.ui:74 +msgid "Disable Ctrl + Alt + Backspace (for kill Xorg)" +msgstr "Deshabilitar Ctrl+Alt+Backspace (cerrar Xorg)" + +#: ../ui/tcospersonalize.ui:211 +msgid "Get avalaible drivers" +msgstr "Cargar drivers disponibles" + +#: ../ui/tcospersonalize.ui:248 +msgid "Display Settings" +msgstr "Configuración gráfica" + +#: ../ui/tcospersonalize.ui:351 +msgid "Default boot kernel" +msgstr "Kernel por defecto" + +#: ../ui/tcospersonalize.ui:376 +msgid "<b>PXE Boot options</b>" +msgstr "<b>Opciones de arranque PXE</b>" + +#: ../ui/tcospersonalize.ui:391 +msgid "Default boot method" +msgstr "Método de arranque por defecto" + +#: ../ui/tcospersonalize.ui:419 +msgid "Command line" +msgstr "Línea de arranque" + +#: ../ui/tcospersonalize.ui:507 +msgid "Boot options" +msgstr "Opciones de arranque" + +#: ../ui/tcospersonalize.ui:551 +msgid "Delete Config" +msgstr "Borrar configuración" + +#: ../ui/tcosmonitor-mainwindow.ui:8 +msgid "TcosMonitor" +msgstr "TcosMonitor" + +#: ../ui/tcosmonitor-mainwindow.ui:22 +msgid "Exit TcosMonitor" +msgstr "Salir de TcosMonitor" + +#: ../ui/tcosmonitor-mainwindow.ui:35 +msgid "Open preferences dialog" +msgstr "Abrir diálogo de preferencias" + +#: ../ui/tcosmonitor-mainwindow.ui:48 +msgid "Update host list" +msgstr "Actualizar lista de equipos" + +#: ../ui/tcosmonitor-mainwindow.ui:49 +msgid "Refresh" +msgstr "Actualizar" + +#: ../ui/tcosmonitor-mainwindow.ui:71 +msgid "All Hosts" +msgstr "Todos" + +#: ../ui/tcosmonitor-mainwindow.ui:99 +msgid "Find" +msgstr "Buscar" + +#: ../ui/tcosmonitor-mainwindow.ui:111 +msgid "About this app" +msgstr "Acerca de esta aplicación" + +#: ../ui/tcosmonitor-mainwindow.ui:219 +msgid "Start audio chat" +msgstr "Iniciar audio chat" + +#: ../ui/tcosmonitor-mainwindow.ui:331 +msgid "Send audio/video" +msgstr "Enviar audio/vídeo" + +#: ../ui/tcosmonitor-mainwindow.ui:443 +msgid "Exe app" +msgstr "Ejecutar aplicación" + +#: ../ui/tcosmonitor-mainwindow.ui:499 +msgid "Send message" +msgstr "Enviar mensaje de texto" + +#: ../ui/tcosmonitor-mainwindow.ui:581 +msgid "List view" +msgstr "Vista lista de equipos" + +#: ../ui/tcosmonitor-mainwindow.ui:629 +msgid "Icon view" +msgstr "Vista iconos" + +#: ../ui/tcosmonitor-mainwindow.ui:689 +msgid "Simulate my classroom" +msgstr "Simular aula" + +#: ../ui/tcosmonitor-staticwindownew.ui:8 +msgid "New or edit hosts" +msgstr "Nuevo o editar lista de equipos" + +#: ../ui/tcosmonitor-staticwindownew.ui:32 +msgid "" +"You can add a simple host, \n" +" example: <b>192.168.0.100</b>\n" +"\n" +"or range of hosts, \n" +" example: <b>192.168.0.100-120</b>\n" +"\n" +"MAC address is optional" +msgstr "" +"Puede añadir un equipo,\n" +" ejemplo: <b>192.168.0.100</b>\n" +"\n" +"o un rango, \n" +" ejemplo: <b>192.168.0.100-120</b>\n" +"\n" +"la dirección MAC es opcional" + +#: ../ui/tcosmonitor-staticwindownew.ui:57 +msgid "IP address *" +msgstr "Dirección IP *" + +#: ../ui/tcosmonitor-askwindow.ui:8 +msgid "Question" +msgstr "Pregunta" + +#: ../ui/tcosmonitor-askwindow.ui:50 +msgid "You can drag and drop launcher file to this box" +msgstr "Puedes arrastrar y soltar un lanzador a esta caja" + +#: ../ui/tcosmonitor-askwindow.ui:61 +msgid "<b>Run app in unknow host</b>" +msgstr "<b>Ejecutar aplicación en equipo desconicido</b>" + +#~ msgid "Lliurex Lab" +#~ msgstr "Lliurex Lab" + +#~ msgid "" +#~ "Cloning client, please wait.\n" +#~ "Poweroff button has been temporaly disabled..." +#~ msgstr "" +#~ "Clonado cliente, por favor espere.\n" +#~ "El botón de apagado se ha deshabilitado temporalmente." + +#~ msgid "Client successfully cloned!!. Please restart client." +#~ msgstr "Cliente clonado correctamente. Por favor reinicie." + +#~ msgid "Cloning has failed!!" +#~ msgstr "¡El clonado falló!" + +#~ msgid "Normal" +#~ msgstr "Normal" + +#~ msgid "Quit from TcosMonitor" +#~ msgstr "Salir de TcosMonitor" + +#~ msgid "Salir de Lliurex Lab" +#~ msgstr "Salir de Llirex Lab" + +#~ msgid "<span size=\"xx-large\">Lliurex Lab</span>" +#~ msgstr "<span size=\"x-large\">Lliurex Lab</span>" + +#~ msgid "About Lliurex Lab" +#~ msgstr "Acerca de Llirex Lab" + +#~ msgid "Clonning clients...." +#~ msgstr "Clonando clientes..." + +#~ msgid "Open share" +#~ msgstr "Abrir compartido" + +#~ msgid "Program mode" +#~ msgstr "Modo de programa" + +#~ msgid "Clone clients" +#~ msgstr "Clonar clientes" + +#~ msgid "Can't move icon, another host is near." +#~ msgstr "No se puede mover el icono, hay un equipo cerca." + +#~ msgid "" +#~ "Error getting Xorg info:\n" +#~ "%s" +#~ msgstr "" +#~ "Error obteniendo información de Xorg:\n" +#~ "%s" + +#~ msgid "Send my MIC audio" +#~ msgstr "Enviar el sonido del micrófono" + +#~ msgid "Chat conference mode off." +#~ msgstr "Modo conferencia chat desactivado." + +#~ msgid "No host found" +#~ msgstr "No se han encontrado equipos" + +#, fuzzy +#~ msgid "<big>label4</big>" +#~ msgstr "<big>Dispositivos TCOS</big>" + +#, fuzzy +#~ msgid "button1" +#~ msgstr "Botones de menús" + +#~ msgid "Do you want to start conference mode the following users: %s?" +#~ msgstr "¿Quiere iniciar modo conferencia a los siguientes usuarios: %s ?" + +#~ msgid "Waiting for start conference mode..." +#~ msgstr "Esperando al arranque del modo conferencia..." + +#~ msgid "Running in conference mode with %s clients." +#~ msgstr "Ejecutandose en modo conferencia con %s equipos." + +#~ msgid "" +#~ "Running in broadcast video transmission to host %(host)s. Broadcast Nº %" +#~ "(count)d" +#~ msgstr "" +#~ "Ejecutándose en modo de difusión de vídeo al equipo %(host)s. Broadcast " +#~ "Nº %(count)d" + +#~ msgid "" +#~ "Special characters used in \"%s\".\n" +#~ "Please rename it." +#~ msgstr "" +#~ "Se han usado caracteres especiales en \"%s\"\n" +#~ "Por favor, renómbrelo." + +#~ msgid "No clients selected, do you want to select all?" +#~ msgstr "No se han seleccionado equipos, ¿quiere seleccionar todos?" + +#~ msgid "Running in broadcast video transmission" +#~ msgstr "Ejecutándose el modo difusión de vídeo." + +#~ msgid "Conference chat mode off." +#~ msgstr "Conferencia chat desactivado." + +#~ msgid "Can't exec this action because you are connected at this host!" +#~ msgstr "" +#~ "¡No se puede ejecutar esta acción porque está conectado desde ese equipo!" + +#~ msgid "Audio RTP" +#~ msgstr "RTP de audio" + +#~ msgid "Can't logout, user is not logged" +#~ msgstr "No se pudo desconectar al usuario, no está conectado" + +#~ msgid "Waiting for screenshots..." +#~ msgstr "Esperando a las capturas..." + +#~ msgid "Work as cyber mode (not work yet)" +#~ msgstr "Trabajar en modo cyber (no disponible)" + +#~ msgid "Extra modules" +#~ msgstr "Módulos extra" + +#~ msgid "Kernel modules" +#~ msgstr "Módulos del kernel" + +#~ msgid "<b>Extra modules avalaible</b>" +#~ msgstr "<b>Módulos extra disponibles</b>" + +#~ msgid "Add X11vnc support" +#~ msgstr "Añadir soporte X11vnc" + +#~ msgid "Add iTALC support" +#~ msgstr "Añadir soporte iTALC" + +#~ msgid "Add FreeNX support" +#~ msgstr "Añadir soporte FreeNX" + +#~ msgid "Addons" +#~ msgstr "Añadidos" + +#~ msgid "Doing action %(action)s in %(timeout)s seconds" +#~ msgstr "Realizando acción %(action)s en %(ip)s segundos" + +#~ msgid "General settings" +#~ msgstr "Configuración general" + +#~ msgid "Advanced Settings" +#~ msgstr "Configuración Avanzada" + +#~ msgid "" +#~ "<b>NOTE:</b>\n" +#~ "This values are needed to do some actions\n" +#~ "on thin client, if you don't use \n" +#~ "<b>update-tcospasswd</b> app, default\n" +#~ "user is <b>root</b> and default password is <b>root</b>.\n" +#~ "\n" +#~ "To change it you have to edit /etc/tcos/tcos.conf and change\n" +#~ "TCOS_ROOT_PASSWD var value. Then regenerate images with\n" +#~ "<b>gentcos</b> or <b>tcosconfig</b>.\n" +#~ "\n" +#~ "Using TcosMonitor in PXES or LTSP networks require to use\n" +#~ "<b>update-tcospasswd</b> script, run it as root, and follow\n" +#~ "instructions. This will generate a tcospasswd file with asked data.\n" +#~ msgstr "" +#~ "<b>NOTA:</b>\n" +#~ "Estos valores se necesitan para realizar ciertas acciones\n" +#~ "en el cliente ligero, si no ha usado aún la aplicación\n" +#~ "<b>update-tcospasswd</b> los valores por defecto son, \n" +#~ "usuario: <b>root</b> contraseña:<b>root</b>.\n" +#~ "\n" +#~ "Para cambiarlos, edite el archivo /etc/tcos/tcos.conf editando\n" +#~ "la variable TCOS_ROOT_PASSWD y regenere la\n" +#~ "imagen de arranque con <b>gentcos</b> o use <b>tcosconfig</b>.\n" +#~ "\n" +#~ "Si está usando TcosMonitor en una red PXES o LTSP, necesita usar\n" +#~ "el script <b>update-tcospasswd</b>, ejecútelo como root, y siga\n" +#~ "las instrucciones. Esto generará un archivo tcospasswd con los datos " +#~ "preguntados.\n" + +#~ msgid "" +#~ "TcosMonitor need special configuration for rsync daemon.\n" +#~ "\n" +#~ "Please read configuration requeriments in:\n" +#~ "/usr/share/doc/tcosmonitor/README.rsync" +#~ msgstr "" +#~ "TcosMonitor necesita una configuración especial del demonio rsync.\n" +#~ "\n" +#~ "Lea la configuración requerida en:\n" +#~ "/usr/share/doc/tcosmonitor/README.rsync" + +#~ msgid "no standalone user connected" +#~ msgstr "Usuario standalone no conectado." + +#~ msgid "VLC audio codec" +#~ msgstr "Codec de audio para VLC" + +#~ msgid "VLC video codec" +#~ msgstr "Codec de video para VLC" + +#~ msgid "" +#~ "First create /tmp/tcos_share folder,\n" +#~ "and restart rsync daemon\n" +#~ "/etc/init.d/rsync restart" +#~ msgstr "" +#~ "Primero debe crear el directorio /tmp/tcos_share,\n" +#~ "y después reiniciar el servicio rsync\n" +#~ "/etc/init.d/rsync restart" + +#~ msgid "GNU/GPL" +#~ msgstr "GNU/GPL" + +#~ msgid "A thin client network monitor" +#~ msgstr "Un monitor de clientes ligeros" + +#~ msgid "translator-credits" +#~ msgstr "" +#~ "Mario Izquierdo (mariodebian)\n" +#~ "<mariodebian@gmail.com>" + +#~ msgid "<span size=\"x-large\">About TCOS</span>" +#~ msgstr "<span size=\"x-large\">Acerca de TCOS</span>" + +#~ msgid "TcosMonitor web page" +#~ msgstr "Página web de TcosMonitor" + +#~ msgid "Search for hostname, ip address or username" +#~ msgstr "Buscar por nombre de equipo, dirección ip, o nombre de usuario" + +#~ msgid "Search" +#~ msgstr "Buscar" + +#~ msgid "<span size=\"x-large\">TCOS project needs your help</span>" +#~ msgstr "<span size=\"x-large\">El proyecto TCOS necesita tu ayuda</span>" + +#~ msgid "" +#~ "Mounting device %(device)s in \n" +#~ "%(mnt_point)s\n" +#~ "Please wait..." +#~ msgstr "" +#~ "Montando dispositivo %(device)s en\n" +#~ "%(mnt_point)s\n" +#~ "Por favor, espere..." + +#~ msgid "Timeout" +#~ msgstr "" +#~ "Tiempo de \n" +#~ "espera" + +#~ msgid "Your user isn't in fuse group, ask your system administrator." +#~ msgstr "Su usuario no pertenece al grupo fuse, pregunte a su administrador." + +#~ msgid "Flash device mounted. Ready for use." +#~ msgstr "Dispositivo flash montado.Listo para usar." + +#~ msgid "Flash device umounted. You can extract it." +#~ msgstr "Dispositivo flash desmontado. Ahora puede extraerlo." + +#~ msgid "Can't mount device %s" +#~ msgstr "No se pudo montar el dispositivo %s" + +#~ msgid "Can't umount device %s" +#~ msgstr "No se pudo desmontar el dispositivo %s" + +#~ msgid "Umount %s remote device" +#~ msgstr "Desmontar dispositivo %s remoto" + +#~ msgid "" +#~ "Mounting device %(device)s in \n" +#~ "%(mnt_point)s\n" +#~ "Please wait...\n" +#~ "Click on Desktop icon to secure umount." +#~ msgstr "" +#~ "Montando dispositivo %(device)s en\n" +#~ "%(mnt_point)s\n" +#~ "Por favor, espere\n" +#~ "Pulse en el icono del escritorio para extracción segura." + +#~ msgid "Tcos Devices daemon on host %s" +#~ msgstr "Gestor de dispositivos TCOS en equipo %s" + +#~ msgid "Tcos Devices on %s host" +#~ msgstr "Gestor de dispositivos TCOS en equipo %s" + +#~ msgid "No support for more than one cdrom, first detected will be used" +#~ msgstr "No hay soporte para más de un cdrom, se usará el primero." + +#~ msgid "Cdrom" +#~ msgstr "Cdrom" + +#~ msgid "Umounting %s, please wait..." +#~ msgstr "Desmontando %s, por favor, espere..." + +#~ msgid "<b>Floppy status:</b>" +#~ msgstr "<b>Estado del disquete:</b>" + +#~ msgid "<b>CDROM status:</b>" +#~ msgstr "<b>Estado del CDROM:</b>" + +#~ msgid "Mount CDROM" +#~ msgstr "Montar CDROM" + +#~ msgid "Umount CDROM" +#~ msgstr "Desmontar CDROM" + +#~ msgid "Do you want to restart Xorg of %s?" +#~ msgstr "¿Quiere reiniciar Xorg del equipo %s?" diff --git a/po/fr.po b/po/fr.po new file mode 100644 index 0000000..2dec235 --- /dev/null +++ b/po/fr.po @@ -0,0 +1,2858 @@ +# Translation of tcosmonitor to french. +# Copyright (C) 2012 Debian French l10n Team <debian-l10n-fr@lists.debian.org> +# This file is distributed under the same license as the tcosmonitor package. +# Julien Patriarca <patriarcaj@gmail.com>, 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: tcosmonitor\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-22 13:31+0200\n" +"PO-Revision-Date: 2012-06-10 00:08+0100\n" +"Last-Translator: Julien Patriarca <patriarcaj@gmail.com>\n" +"Language-Team: FRENCH <debian-l10n-fr@lists.debian.org>\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../tcos-volume-manager.py:97 ../tcos-volume-manager.py:109 +#, python-format +msgid "" +"Tcos Sound levels on:\n" +"%s" +msgstr "" +"les niveaux de Tcos Sound sont à :\n" +"%s" + +#: ../tcos-volume-manager.py:117 +#, python-format +msgid "ERROR: It appears that TcosXmlRpc is not running on %s." +msgstr "ERREUR : il apparaît que TcosXmlRpc n'est pas lancé sur %s" + +#: ../tcos-volume-manager.py:139 ../tcos-devices-ng.py:281 +#, python-format +msgid "Error connecting with TcosXmlRpc in %s." +msgstr "" +"Une erreur s'est produite lors de la connexion avec TcosXmlRpc dans %s." + +#: ../tcos-volume-manager.py:213 +msgid "Loading channels info..." +msgstr "Chargement en cours des informations des canaux…" + +#: ../tcos-volume-manager.py:226 +msgid "Error loading channels info (xauth error)" +msgstr "" +"Une erreur s'est produite durant le chargement des informations des canaux " +"(erreur xauth)" + +#: ../tcos-volume-manager.py:229 ../ui/tcos-volume-manager.ui:8 +msgid "Tcos Volume Manager" +msgstr "Tcos Volume Manager" + +#: ../tcos-volume-manager.py:230 +#, python-format +msgid "<span size='large'><b>Sound mixer of %s host</b></span>" +msgstr "<span size='large'><b>Mélangeur sonore de l' %s hôte</b></span>" + +#: ../tcos-volume-manager.py:296 ../tcosmonitor/extensions/info.py:440 +msgid "Mute" +msgstr "Muet" + +#: ../tcos-volume-manager.py:315 +msgid "Main controls ready" +msgstr "Les commandes principales sont prêtes" + +#: ../tcos-volume-manager.py:319 +msgid "All remote controls loaded." +msgstr "Toutes les commandes distantes sont chargées." + +#: ../tcos-volume-manager.py:328 ../tcosmonitor/extensions/info.py:556 +#, python-format +msgid "Changing value of %(channel)s channel, to %(value)s%%..." +msgstr "Changement en cours de la valeur du canal %(channel)s, à %(value)s %%…" + +#: ../tcos-volume-manager.py:335 ../tcosmonitor/extensions/info.py:563 +#, python-format +msgid "Changed value of %(channel)s channel, to %(value)s" +msgstr "La valeur du canal %(channel)s a été changée à %(value)s" + +#: ../tcos-volume-manager.py:342 ../tcosmonitor/extensions/info.py:570 +#, python-format +msgid "Unmuting %s channel..." +msgstr "Désactivation de la sourdine du canal %s…" + +#: ../tcos-volume-manager.py:347 ../tcosmonitor/extensions/info.py:575 +#, python-format +msgid "Muting %s channel..." +msgstr "Activation de la sourdine pour le canal %s…" + +#: ../tcos-volume-manager.py:350 ../tcosmonitor/extensions/info.py:578 +#, python-format +msgid "Status of %(channel)s channel, is \"%(newvalue)s\"" +msgstr "Le statut du %(channel)s canal, est « %(newvalue)s »" + +#: ../tcos-volume-manager.py:374 ../tcosmonitor.py:340 +#: ../tcospersonalize.py:556 +msgid "Exiting" +msgstr "Clôture en cours" + +#: ../tcosmonitor/ping.py:86 ../tcosmonitor/ping.py:168 +#: ../tcosmonitor/ping.py:265 ../tcosmonitor/ping.py:326 +#: ../tcosmonitor/LocalData.py:278 +msgid "Testing if found clients have 8998 or 8999 port open..." +msgstr "" +"Test en cours pour savoir si les clients trouvés ont les ports 8998 et 8999 " +"ouverts…" + +#: ../tcosmonitor/ping.py:153 +#, python-format +msgid "Checking %s..." +msgstr "Vérification de %s…" + +#: ../tcosmonitor/ping.py:187 ../tcosmonitor/ping.py:284 +#: ../tcosmonitor/ping.py:347 ../tcosmonitor/TcosActions.py:119 +#: ../tcosmonitor/TcosActions.py:202 ../tcosmonitor/TcosActions.py:220 +msgid "Not connected hosts found." +msgstr "Des hôtes non connectés ont été trouvés." + +#: ../tcosmonitor/ping.py:195 ../tcosmonitor/ping.py:292 +#: ../tcosmonitor/ping.py:352 ../tcosmonitor/TcosActions.py:121 +#: ../tcosmonitor/TcosActions.py:206 ../tcosmonitor/TcosActions.py:214 +#, python-format +msgid "Found %d hosts" +msgstr "%d hôtes trouvés" + +#: ../tcosmonitor/ping.py:229 +#, python-format +msgid "Ping to %s..." +msgstr "Ping vers %s…" + +#: ../tcosmonitor/ping.py:243 +msgid "Waiting for pings..." +msgstr "En attente des pings…" + +#: ../tcosmonitor/TcosCommon.py:85 +#, python-format +msgid "" +"ThreadController: Found error executing %(cmd)s\n" +"\n" +"If problem persist, disable Thread Controller\n" +"in Preferences and report bug.\n" +"Error=%(error)s" +msgstr "" +"Contrôleur de processus : une erreur a été trouvée lors de l'exécution de " +"%(cmd)s\n" +"\n" +"Si le problème persiste, désactivez le contrôleur de processus\n" +"dans Préférences et signaler un bogue.\n" +"Erreur = %(error)s" + +#: ../tcosmonitor/TcosCommon.py:180 ../tcosmonitor/TcosCommon.py:209 +#: ../tcosmonitor/TcosCommon.py:212 ../tcosmonitor/LocalData.py:40 +#: ../tcosmonitor/LocalData.py:60 ../tcosmonitor/extensions/info.py:135 +msgid "unknow" +msgstr "inconnu" + +#: ../tcosmonitor/TcosTrayIcon.py:47 ../tcosmonitor/extensions/vnc.py:296 +#: ../tcosmonitor/TcosTrayIcon2.py:49 ../ui/tcosmonitor-mainwindow.ui:23 +msgid "Quit" +msgstr "Quitter" + +#: ../tcosmonitor/TcosTrayIcon.py:52 ../tcosmonitor/shared.py:281 +#: ../tcosmonitor/extensions/reboot.py:37 ../tcosmonitor/TcosTrayIcon2.py:54 +msgid "Reboot" +msgstr "Redémarrage" + +#: ../tcosmonitor/TcosTrayIcon.py:53 ../tcosmonitor/shared.py:282 +#: ../tcosmonitor/extensions/reboot.py:39 ../tcosmonitor/TcosTrayIcon2.py:55 +msgid "Poweroff" +msgstr "Extinction" + +#: ../tcosmonitor/TcosTrayIcon.py:63 +msgid "TcosDevices" +msgstr "MachinesTcos" + +#: ../tcosmonitor/TcosTrayIcon.py:170 ../tcosmonitor/TcosTrayIcon.py:184 +#: ../tcosmonitor/TcosTrayIcon2.py:63 +msgid "Tcos Devices" +msgstr "Machines Tcos" + +#: ../tcosmonitor/TcosTrayIcon.py:230 ../tcosmonitor/TcosTrayIcon2.py:347 +msgid "Usb flash" +msgstr "Clé USB" + +#: ../tcosmonitor/TcosTrayIcon.py:232 ../tcosmonitor/TcosTrayIcon2.py:349 +msgid "Mount USB1" +msgstr "Monter USB1" + +#: ../tcosmonitor/TcosTrayIcon.py:233 ../tcosmonitor/TcosTrayIcon2.py:350 +msgid "Umount USB1" +msgstr "Démonter USB1" + +#: ../tcosmonitor/shared.py:107 +msgid "Traditional list only" +msgstr "Liste traditionnelle uniquement" + +#: ../tcosmonitor/shared.py:108 +msgid "Icons only" +msgstr "Icônes seulement" + +#: ../tcosmonitor/shared.py:109 +msgid "Simulate classroom" +msgstr "Simuler une salle de classe" + +#: ../tcosmonitor/shared.py:110 +msgid "Lists, icons and classroom with tabs" +msgstr "Listes, icônes et salle de classe avec des tabulations" + +#: ../tcosmonitor/shared.py:270 ../tcosmonitor/shared.py:312 +#: ../tcosmonitor/TcosMenus.py:29 +msgid "Terminal actions" +msgstr "Actions de la console" + +#: ../tcosmonitor/shared.py:271 ../tcosmonitor/shared.py:313 +#: ../tcosmonitor/TcosMenus.py:30 +msgid "User actions" +msgstr "Actions de l'utilisateur" + +#: ../tcosmonitor/shared.py:272 ../tcosmonitor/shared.py:314 +#: ../tcosmonitor/TcosMenus.py:31 +msgid "Audio, video and files" +msgstr "Audio, vidéo et fichiers" + +#: ../tcosmonitor/shared.py:279 ../tcosmonitor/extensions/info.py:44 +msgid "Refresh terminal info" +msgstr "Rafraîchir les informations de la console" + +#: ../tcosmonitor/shared.py:280 ../tcosmonitor/extensions/clean.py:37 +#: ../tcosmonitor/extensions/clean.py:38 +msgid "Clean info about terminal" +msgstr "Effacer les informations à propos de la console" + +#: ../tcosmonitor/shared.py:283 ../tcosmonitor/extensions/lockscreen.py:37 +msgid "Lock screen" +msgstr "Écran de verrouillage" + +#: ../tcosmonitor/shared.py:284 ../tcosmonitor/extensions/lockscreen.py:39 +msgid "Unlock screen" +msgstr "Écran de déverrouillage" + +#: ../tcosmonitor/shared.py:285 ../tcosmonitor/extensions/italc.py:38 +msgid "Connect to remote screen (iTALC)" +msgstr "Connecter à un écran distant (iTALC)" + +#: ../tcosmonitor/shared.py:286 ../tcosmonitor/extensions/vnc.py:50 +msgid "Connect to remote screen (VNC)" +msgstr "Connecter à un écran distant (VNC)" + +#: ../tcosmonitor/shared.py:287 ../tcosmonitor/extensions/screenshot.py:42 +msgid "Screenshot" +msgstr "Capture d'écran" + +#: ../tcosmonitor/shared.py:288 ../tcosmonitor/extensions/remotessh.py:37 +msgid "Give a remote xterm" +msgstr "Donner un xterm distant" + +#: ../tcosmonitor/shared.py:289 +#: ../tcosmonitor/extensions/tcospersonalize.py:37 +#: ../ui/tcosmonitor-prefwindow.ui:1341 +msgid "Configure this host" +msgstr "Configurer cet utilisateur" + +#: ../tcosmonitor/shared.py:290 ../tcosmonitor/extensions/logout.py:37 +msgid "Logout client" +msgstr "Déconnecter le client" + +#: ../tcosmonitor/shared.py:291 ../tcosmonitor/extensions/restartxorg.py:38 +msgid "Restart X session with new settings" +msgstr "Redémarrer la session X avec les nouveaux réglages" + +#: ../tcosmonitor/shared.py:292 ../tcosmonitor/extensions/appsmsg.py:49 +msgid "Exec app on user display" +msgstr "Exécuter une application sur l'affichage de l'utilisateur" + +#: ../tcosmonitor/shared.py:293 ../tcosmonitor/extensions/appsmsg.py:50 +msgid "Send a text message to user" +msgstr "Envoyer un message texte à l'utilisateur" + +#: ../tcosmonitor/shared.py:294 ../tcosmonitor/extensions/viewproc.py:38 +msgid "Show running apps of this client" +msgstr "Afficher les applications lancées de ce client" + +#: ../tcosmonitor/shared.py:295 ../tcosmonitor/shared.py:332 +msgid "Audio/Video broadcast" +msgstr "Diffusion Audio/Vidéo" + +#: ../tcosmonitor/shared.py:296 ../tcosmonitor/shared.py:333 +#: ../tcosmonitor/extensions/sendfiles.py:45 +#: ../tcosmonitor/extensions/sendfiles.py:46 +#: ../ui/tcosmonitor-mainwindow.ui:387 ../ui/tcosmonitor-prefwindow.ui:1151 +#: ../ui/tcosmonitor-prefwindow.ui:1492 +msgid "Send files" +msgstr "Envoyer des fichiers" + +#: ../tcosmonitor/shared.py:297 ../tcosmonitor/extensions/vnc.py:51 +msgid "Demo mode (from this host)" +msgstr "Mode de démonstration (depuis cet hôte)" + +#: ../tcosmonitor/shared.py:298 ../tcosmonitor/extensions/wakeonlan.py:38 +msgid "Boot client (WakeOnLan)" +msgstr "Client de démarrage (WakeOnLan)" + +#: ../tcosmonitor/shared.py:299 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:35 +msgid "Lock internet" +msgstr "Bloquer l'accès Internet" + +#: ../tcosmonitor/shared.py:300 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:36 +msgid "Unlock internet" +msgstr "Débloquer l'accès Internet" + +#: ../tcosmonitor/shared.py:301 ../tcosmonitor/extensions/dpms.py:37 +msgid "DPMS Power off monitor" +msgstr "Éteindre le moniteur avec DPMS" + +#: ../tcosmonitor/shared.py:302 ../tcosmonitor/extensions/dpms.py:39 +msgid "DPMS Power on monitor" +msgstr "Allumer le moniteur avec DPMS" + +#: ../tcosmonitor/shared.py:303 +msgid "Send MIC audio (from this host)" +msgstr "Envoyer du son Micro (depuis cet hôte)" + +#: ../tcosmonitor/shared.py:321 ../tcosmonitor/extensions/reboot.py:38 +msgid "Reboot all clients" +msgstr "Redémarrer tous les clients" + +#: ../tcosmonitor/shared.py:322 ../tcosmonitor/extensions/reboot.py:40 +msgid "Poweroff all clients" +msgstr "Éteindre tous les clients" + +#: ../tcosmonitor/shared.py:323 ../tcosmonitor/extensions/lockscreen.py:38 +msgid "Lock all screens" +msgstr "Verrouiller tous les écrans" + +#: ../tcosmonitor/shared.py:324 ../tcosmonitor/extensions/lockscreen.py:40 +msgid "Unlock all screens" +msgstr "Déverrouiller tous les écrans" + +#: ../tcosmonitor/shared.py:325 ../tcosmonitor/extensions/logout.py:38 +msgid "Logout clients" +msgstr "Déconnecter les clients" + +#: ../tcosmonitor/shared.py:326 ../tcosmonitor/extensions/restartxorg.py:39 +msgid "Restart X session of all clients" +msgstr "Redémarrer les sessions X de tous les clients" + +#: ../tcosmonitor/shared.py:327 ../tcosmonitor/extensions/appsmsg.py:52 +msgid "Exec same app in all connected users" +msgstr "Exécuter la même application sur tous les utilisateurs connectés" + +#: ../tcosmonitor/shared.py:328 ../tcosmonitor/extensions/appsmsg.py:53 +msgid "Send a text message to all connected users" +msgstr "Envoyer un message texte à tous les utilisateurs connectés" + +#: ../tcosmonitor/shared.py:329 ../tcosmonitor/extensions/vnc.py:53 +msgid "Enter demo mode, all connected users see my screen" +msgstr "" +"Entrer en mode démonstration, tous les utilisateurs connectés voient mon " +"écran" + +#: ../tcosmonitor/shared.py:330 +msgid "Enter conference mode, all connected users can hear me" +msgstr "" +"Entrer en mode conférence, tous les utilisateurs connectés peuvent m'entendre" + +#: ../tcosmonitor/shared.py:331 ../tcosmonitor/extensions/screenshot.py:43 +msgid "Capture All clients screens" +msgstr "Capturer l'écran de tous les utilisateurs" + +#: ../tcosmonitor/shared.py:334 ../tcosmonitor/extensions/wakeonlan.py:39 +msgid "Boot All clients (WakeOnLan)" +msgstr "Démarrer tous les clients (WakeOnLan)" + +#: ../tcosmonitor/shared.py:335 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:38 +msgid "Lock internet in all connected users" +msgstr "Bloquer l'accès Internet de tous les utilisateurs connectés." + +#: ../tcosmonitor/shared.py:336 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:39 +msgid "Unlock internet in all connected users" +msgstr "Débloquer l'accès Internet de tous les utilisateurs connectés" + +#: ../tcosmonitor/shared.py:337 ../tcosmonitor/extensions/dpms.py:38 +msgid "DPMS Power off monitors" +msgstr "Éteindre les moniteurs avec DPMS" + +#: ../tcosmonitor/shared.py:338 ../tcosmonitor/extensions/dpms.py:40 +msgid "DPMS Power on monitors" +msgstr "Allumer les moniteurs avec DPMS" + +#: ../tcosmonitor/shared.py:339 +msgid "Chat audio conference" +msgstr "Conférence audio en ligne" + +#: ../tcosmonitor/shared.py:340 ../tcosmonitor/extensions/livevnc.py:47 +#: ../ui/tcosmonitor-prefwindow.ui:1359 +msgid "Live view screens with VNC" +msgstr "Voir les écrans en direct avec VNC" + +#: ../tcosmonitor/shared.py:548 +#, python-format +msgid "QUESTION: %(txt)s, RESPONSE %(response)s" +msgstr "QUESTION : %(txt)s, RÉPONSE %(response)s" + +#: ../tcosmonitor/shared.py:565 ../tcosmonitor/shared.py:576 +#, python-format +msgid "INFO: %s" +msgstr "INFO : %s" + +#: ../tcosmonitor/shared.py:587 +#, python-format +msgid "ERROR: %s" +msgstr "ERREUR : %s" + +#: ../tcosmonitor/Initialize.py:201 +msgid "GPL-2 license file not found" +msgstr "Impossible de trouver un fichier de licence GPL-2 " + +#: ../tcosmonitor/TcosClassView.py:47 ../tcosmonitor/TcosIconView.py:43 +msgid "IP" +msgstr "IP" + +#: ../tcosmonitor/TcosClassView.py:48 ../tcosmonitor/TcosIconView.py:44 +#: ../tcosmonitor/TcosListView.py:60 +msgid "Hostname" +msgstr "Nom d'hôte" + +#: ../tcosmonitor/TcosClassView.py:49 ../tcosmonitor/TcosIconView.py:45 +#: ../tcosmonitor/TcosListView.py:72 +msgid "Username" +msgstr "Nom d'utilisateur" + +#: ../tcosmonitor/TcosClassView.py:50 ../tcosmonitor/TcosIconView.py:46 +#: ../tcosmonitor/TcosListView.py:83 +msgid "Logged" +msgstr "Connecté" + +#: ../tcosmonitor/TcosClassView.py:51 ../tcosmonitor/TcosIconView.py:47 +#: ../tcosmonitor/TcosListView.py:99 +msgid "Time log in" +msgstr "Temps de connexion" + +#: ../tcosmonitor/TcosClassView.py:52 ../tcosmonitor/TcosIconView.py:48 +msgid "Screen locked" +msgstr "Écran verrouillé" + +#: ../tcosmonitor/TcosClassView.py:53 ../tcosmonitor/TcosIconView.py:49 +msgid "Network locked" +msgstr "Réseau bloqué" + +#: ../tcosmonitor/TcosClassView.py:55 +msgid "" +"Place mouse on any computer to see brief info about it.\n" +"You can select and unselect multiple host clicking on every one.\n" +"Drag and drop hosts to positions and save clicking on right mouse button." +msgstr "" +"Veuillez déplacer la souris sur n'importe quel ordinateur pour obtenir un " +"bref résumé à son propos.\n" +"Vous pouvez sélectionner et désélectionner plusieurs hôtes en cliquant sur " +"chacun.\n" +"Glisser/Déposer les hôtes sur des positions et sauvegarder en cliquant sur " +"le bouton droit de la souris." + +#: ../tcosmonitor/TcosClassView.py:176 +msgid "Positions reset to defaults." +msgstr "Les positions ont été remises aux valeurs par défaut." + +#: ../tcosmonitor/TcosClassView.py:194 +msgid "Positions saved." +msgstr "Positions enregistrées." + +#: ../tcosmonitor/TcosClassView.py:323 +#, python-format +msgid "%s is not a valid file to exe or send" +msgstr "%s n'est pas un fichier valide à exécuter ou à envoyer" + +#: ../tcosmonitor/TcosClassView.py:411 ../tcosmonitor/TcosIconView.py:152 +msgid "yes" +msgstr "oui" + +#: ../tcosmonitor/TcosClassView.py:413 ../tcosmonitor/TcosIconView.py:154 +msgid "no" +msgstr "non" + +#: ../tcosmonitor/TcosIconView.py:51 +msgid "Place mouse on any computer to see brief info about it." +msgstr "" +"Déplacez la souris sur n'importe quel ordinateur pour en voir un bref résumé." + +#: ../tcosmonitor/TcosExtensions.py:39 +msgid "Exception:" +msgstr "Exception :" + +#: ../tcosmonitor/TcosExtensions.py:75 +msgid "Error: no IP!" +msgstr "Erreur : pas d'IP !" + +#: ../tcosmonitor/TcosExtensions.py:156 +msgid "No clients connected, press refresh button." +msgstr "Pas de clients connectés, veuillez appuyer sur le bouton rafraîchir." + +#: ../tcosmonitor/TcosExtensions.py:261 ../tcosmonitor/TcosExtensions.py:263 +#, python-format +msgid "Can't exec this action at '%s' because you are connected at this host!" +msgstr "" +"Impossible d'exécuter cette action à « %s » car vous êtes connecté à cet " +"hôte !" + +#: ../tcosmonitor/TcosExtensions.py:277 +#, python-format +msgid "Doing action \"%(action)s\" in %(ip)s..." +msgstr "En train d'effectuer les actions « %(action)s » sur %(ip)s…" + +#: ../tcosmonitor/TcosExtensions.py:294 +#, python-format +msgid "Done action \"%(action)s\" in %(ip)s" +msgstr "Action « %(action)s » effectuée sur %(ip)s…" + +#: ../tcosmonitor/TcosExtensions.py:347 ../tcosmonitor/extensions/vnc.py:288 +#: ../tcosmonitor/extensions/livevnc.py:68 +#: ../tcosmonitor/TcosPreferences.py:543 +msgid "Stop" +msgstr "Arrêter" + +#: ../tcosmonitor/LocalData.py:213 ../tcosmonitor/LocalData.py:230 +#, python-format +msgid "Selected network inteface (%s) don't have IP address" +msgstr "L'interface réseau choisie (%s) ne possède pas d'adresse IP" + +#: ../tcosmonitor/LocalData.py:321 +msgid "" +"Static list method configured but no hosts in list.\n" +"\n" +"Please, open preferences, click on 'Open Static Host list' and add some " +"hosts." +msgstr "" +"Méthode par liste statique sélectionnée mais pas d'hôte dans la liste.\n" +"\n" +"Veuillez ouvrir les préférences, cliquer sur « Ouvrir la liste des hôtes " +"statiques » et ajouter des hôtes." + +#: ../tcosmonitor/extensions/vnc.py:64 ../tcosmonitor/extensions/vnc.py:108 +#: ../tcosmonitor/extensions/vnc.py:421 +#: ../tcosmonitor/extensions/audiortp.py:226 +#: ../tcosmonitor/extensions/audiortp.py:272 +#: ../tcosmonitor/extensions/audiortp.py:371 +#: ../tcosmonitor/extensions/audiortp.py:405 +#: ../tcosmonitor/extensions/audiortp.py:458 +#: ../tcosmonitor/extensions/sendfiles.py:200 +#: ../tcosmonitor/extensions/videolan.py:456 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:110 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:152 +msgid "No users logged." +msgstr "Pas d'utilisateur connecté." + +#: ../tcosmonitor/extensions/vnc.py:67 +#, python-format +msgid "Do you want to start demo mode the following users: %s?" +msgstr "" +"Voulez-vous démarrer le mode démonstration pour les utilisateurs suivants : " +"%s ?" + +#: ../tcosmonitor/extensions/vnc.py:79 +msgid "Waiting for start demo mode..." +msgstr "En attente du démarrage du mode démonstration…" + +#: ../tcosmonitor/extensions/vnc.py:94 ../tcosmonitor/extensions/vnc.py:406 +#: ../tcosmonitor/extensions/videolan.py:164 +#: ../tcosmonitor/extensions/videolan.py:364 +#: ../tcosmonitor/extensions/videolan.py:601 +msgid "Error while exec app" +msgstr "Erreur lors de l'exécution de l'application" + +#: ../tcosmonitor/extensions/vnc.py:112 ../tcosmonitor/extensions/vnc.py:425 +#, python-format +msgid "Running in demo mode with %s clients." +msgstr "Mode démonstration en cours pour les clients %s." + +#: ../tcosmonitor/extensions/vnc.py:123 +#, python-format +msgid "Running in demo mode from server. Demo Nº %s" +msgstr "Mode démonstration en cours depuis le serveur. Démonstration nº %s" + +#: ../tcosmonitor/extensions/vnc.py:131 ../tcosmonitor/extensions/italc.py:46 +msgid "No user logged." +msgstr "Pas d'utilisateur connecté." + +#: ../tcosmonitor/extensions/vnc.py:145 ../tcosmonitor/extensions/vnc.py:368 +#, python-format +msgid "Connecting with %s to start VNC support" +msgstr "Connexion en cours avec %s pour démarrer l'assistance VNC" + +#: ../tcosmonitor/extensions/vnc.py:174 +#, python-format +msgid "" +"Can't start VNC, error:\n" +"%s" +msgstr "" +"Impossible de démarrer VNC, erreur : \n" +"%s" + +#: ../tcosmonitor/extensions/vnc.py:178 +msgid "Waiting for start of VNC server..." +msgstr "En attente du démarrage du serveur VNC…" + +#: ../tcosmonitor/extensions/vnc.py:209 +msgid "Can't start VNC, please add X11VNC support" +msgstr "Impossible de démarrer VNC, veuillez ajouter le support X11VNC" + +#: ../tcosmonitor/extensions/vnc.py:235 +msgid "Switch to view only" +msgstr "Basculer sur vue uniquement" + +#: ../tcosmonitor/extensions/vnc.py:240 ../tcosmonitor/extensions/vnc.py:271 +msgid "Switch to full control" +msgstr "Basculer sur contrôle total" + +#: ../tcosmonitor/extensions/vnc.py:267 +#, python-format +msgid "VNC host %s" +msgstr "Hôte VNC %s" + +#: ../tcosmonitor/extensions/vnc.py:279 +msgid "Switch to fullscreen" +msgstr "Basculer en plein-écran" + +#: ../tcosmonitor/extensions/vnc.py:340 +msgid "Can't start demo mode, user is not logged" +msgstr "" +"Impossible de démarrer le mode démonstration, l'utilisateur n'est pas " +"connecté" + +#: ../tcosmonitor/extensions/vnc.py:343 +#, python-format +msgid "Do you want demo mode from user %s?" +msgstr "Voulez-vous démarrer le mode démonstration depuis l'utilisateur %s ?" + +#: ../tcosmonitor/extensions/vnc.py:391 +#, python-format +msgid "Waiting for start demo mode from user %s..." +msgstr "En attente du démarrage du mode démonstration depuis l'utilisateur %s…" + +#: ../tcosmonitor/extensions/vnc.py:445 +#, python-format +msgid "Running in demo mode from user %(host)s. Demo Nº %(count)s" +msgstr "" +"Mode démonstration en cours depuis l'utilisateur %(host)s. Démonstration " +"nº %(count)s" + +#: ../tcosmonitor/extensions/vnc.py:501 +msgid "Demo mode off." +msgstr "Mode démonstration arrêté." + +#: ../tcosmonitor/extensions/info.py:88 +#, python-format +msgid "Connecting with %s to retrieve some info..." +msgstr "Connexion en cours avec %s pour rapatrier des informations…" + +#: ../tcosmonitor/extensions/info.py:114 +msgid "Tcos info" +msgstr "Informations à propos de Tcos" + +#: ../tcosmonitor/extensions/info.py:117 +msgid "PXES info" +msgstr "Informations à propos de PXE" + +#: ../tcosmonitor/extensions/info.py:120 +msgid "LTSP info" +msgstr "Informations à propos de LTSP" + +#: ../tcosmonitor/extensions/info.py:123 +msgid "Standalone info" +msgstr "Informations à propos du mode autonome" + +#: ../tcosmonitor/extensions/info.py:126 +msgid "Multiseat info" +msgstr "Information à propos du multisiège" + +#: ../tcosmonitor/extensions/info.py:129 +msgid "Unknow client info" +msgstr "Informations à propos du client inconnu" + +#: ../tcosmonitor/extensions/info.py:138 +msgid "Hostname: " +msgstr "Nom d'hôte : " + +#: ../tcosmonitor/extensions/info.py:139 +msgid "Ip address: " +msgstr "Adresse IP : " + +#: ../tcosmonitor/extensions/info.py:140 +msgid "TcosXmlRpc version: " +msgstr "Version de TcosXmlRpc : " + +#: ../tcosmonitor/extensions/info.py:149 +msgid "Tcos image version: " +msgstr "Version de l'image Tcos : " + +#: ../tcosmonitor/extensions/info.py:150 +msgid "Tcos image date: " +msgstr "Date de l'image Tcos : " + +#: ../tcosmonitor/extensions/info.py:151 +msgid "Date of thin client: " +msgstr "Date du client léger : " + +#: ../tcosmonitor/extensions/info.py:152 +msgid "Uptime: " +msgstr "Temps de disponibilité : " + +#: ../tcosmonitor/extensions/info.py:163 +msgid "Kernel info" +msgstr "Informations à propos du noyau" + +#: ../tcosmonitor/extensions/info.py:172 +msgid "Force download and mount all modules" +msgstr "Forcer le téléchargement et monter tous les modules" + +#: ../tcosmonitor/extensions/info.py:183 +msgid "None" +msgstr "Aucun" + +#: ../tcosmonitor/extensions/info.py:186 +msgid "Kernel version: " +msgstr "Version du noyau : " + +#: ../tcosmonitor/extensions/info.py:187 +msgid "Kernel complete version: " +msgstr "Version complète du noyau : " + +#: ../tcosmonitor/extensions/info.py:188 +msgid "Loaded Modules: " +msgstr "Modules chargés : " + +#: ../tcosmonitor/extensions/info.py:189 +msgid "Modules not found: " +msgstr "Modules non trouvés : " + +#: ../tcosmonitor/extensions/info.py:205 +msgid "Cpu info: " +msgstr "Informations à propos du processeur : " + +#: ../tcosmonitor/extensions/info.py:212 +msgid "Cpu model: " +msgstr "Modèle de processeur : " + +#: ../tcosmonitor/extensions/info.py:213 +msgid "Cpu vendor: " +msgstr "Fabricant du processeur : " + +#: ../tcosmonitor/extensions/info.py:214 +msgid "Cpu speed: " +msgstr "Vitesse du processeur : " + +#: ../tcosmonitor/extensions/info.py:225 +msgid "PCI buses: " +msgstr "Bus PCI : " + +#: ../tcosmonitor/extensions/info.py:253 +msgid "Process running: " +msgstr "Processus en cours : " + +#: ../tcosmonitor/extensions/info.py:266 +msgid "Ram info: " +msgstr "Informations à propos de la RAM : " + +#: ../tcosmonitor/extensions/info.py:273 +msgid "Total Ram: " +msgstr "Taille totale de la RAM : " + +#: ../tcosmonitor/extensions/info.py:274 +msgid "Free RAM: " +msgstr "RAM disponible : " + +#: ../tcosmonitor/extensions/info.py:275 +msgid "Active RAM: " +msgstr "RAM utilisée : " + +#: ../tcosmonitor/extensions/info.py:278 +msgid "Swap info: " +msgstr "Informations à propos de la partition d'échange : " + +#: ../tcosmonitor/extensions/info.py:284 +msgid "Swap enabled: " +msgstr "Partition d'échange activée : " + +#: ../tcosmonitor/extensions/info.py:285 +msgid "Total Swap: " +msgstr "Taille totale de la partition d'échange : " + +#: ../tcosmonitor/extensions/info.py:286 +msgid "Used Swap: " +msgstr "Taille de la partition d'échange utilisée : " + +#: ../tcosmonitor/extensions/info.py:296 +msgid "Network info: " +msgstr "Informations à propos du réseau : " + +#: ../tcosmonitor/extensions/info.py:306 +msgid "Network hostname: " +msgstr "Nom d'hôte réseau : " + +#: ../tcosmonitor/extensions/info.py:307 +msgid "Network IP: " +msgstr "Adresse IP réseau : " + +#: ../tcosmonitor/extensions/info.py:308 +msgid "Network MASK: " +msgstr "MASQUE réseau : " + +#: ../tcosmonitor/extensions/info.py:309 +msgid "Network MAC: " +msgstr "Adresse MAC réseau : " + +#: ../tcosmonitor/extensions/info.py:310 +msgid "Data received(rx): " +msgstr "Données reçues (rx) : " + +#: ../tcosmonitor/extensions/info.py:311 +msgid "Data send(tx): " +msgstr "Données envoyées(tx) : " + +#: ../tcosmonitor/extensions/info.py:321 ../ui/tcosmonitor-prefwindow.ui:928 +msgid "Xorg info" +msgstr "Informations à propos de Xorg" + +#: ../tcosmonitor/extensions/info.py:346 +msgid "enabled" +msgstr "activé" + +#: ../tcosmonitor/extensions/info.py:348 +msgid "disabled" +msgstr "désactivé" + +#: ../tcosmonitor/extensions/info.py:351 ../ui/tcospersonalize.ui:159 +msgid "X Session Type" +msgstr "Type de Session X" + +#: ../tcosmonitor/extensions/info.py:353 ../ui/tcospersonalize.ui:201 +msgid "Xorg Driver" +msgstr "Pilote pour Xorg" + +#: ../tcosmonitor/extensions/info.py:355 ../ui/tcospersonalize.ui:94 +msgid "Xorg Resolution" +msgstr "Résolution de Xorg" + +#: ../tcosmonitor/extensions/info.py:357 ../ui/tcospersonalize.ui:133 +msgid "Xorg Color depth" +msgstr "Profondeur de couleurs pour Xorg" + +#: ../tcosmonitor/extensions/info.py:359 ../ui/tcospersonalize.ui:179 +msgid "DPMS energy monitor control" +msgstr "Contrôle de l'énergie du moniteur par DPMS" + +#: ../tcosmonitor/extensions/info.py:361 +msgid "Disable kill X with Ctrl+Alt+Backspace" +msgstr "Désactiver l'arrêt de X par Ctrl + Alt + Retour arrière" + +#: ../tcosmonitor/extensions/info.py:363 ../ui/tcospersonalize.ui:57 +msgid "Enable mouse wheel" +msgstr "Activer la roulette de la souris" + +#: ../tcosmonitor/extensions/info.py:365 +msgid "Refresh rate" +msgstr "Taux de rafraîchissement" + +#: ../tcosmonitor/extensions/info.py:367 +msgid "Xorg font server" +msgstr "Serveur de polices pour Xorg" + +#: ../tcosmonitor/extensions/info.py:369 +msgid "Mouse device" +msgstr "Souris" + +#: ../tcosmonitor/extensions/info.py:371 +msgid "Mouse protocol" +msgstr "Protocole pour la souris" + +#: ../tcosmonitor/extensions/info.py:373 ../ui/tcospersonalize.ui:273 +msgid "X Horiz sync" +msgstr "Synchronisation horizontale pour X" + +#: ../tcosmonitor/extensions/info.py:375 ../ui/tcospersonalize.ui:284 +msgid "X Vert sync" +msgstr "Synchronisation verticale pour X" + +#: ../tcosmonitor/extensions/info.py:388 +msgid "PulseAudio Sound server is running" +msgstr "Le serveur de son PulseAudio est lancé" + +#: ../tcosmonitor/extensions/info.py:406 +msgid "Remote Sound Mixer" +msgstr "Mélangeur de son distant" + +#: ../tcosmonitor/extensions/info.py:479 +msgid "PulseAudio Control" +msgstr "Commande PulseAudio" + +#: ../tcosmonitor/extensions/info.py:484 +msgid "PulseAudio Meter" +msgstr "Vu-mètre PulseAudio" + +#: ../tcosmonitor/extensions/info.py:489 +msgid "PulseAudio Manager" +msgstr "Gestionnaire PulseAudio" + +#: ../tcosmonitor/extensions/info.py:493 +msgid "PulseAudio utils: " +msgstr "Utilitaires pour PulseAudio : " + +#: ../tcosmonitor/extensions/info.py:499 +msgid "PulseAudio stats" +msgstr "Statistiques pour PulseAudio" + +#: ../tcosmonitor/extensions/info.py:511 +msgid "Currently in use" +msgstr "Actuellement utilisé" + +#: ../tcosmonitor/extensions/info.py:512 +msgid "Allocated during whole lifetime" +msgstr "Alloué durant toute la durée de vie" + +#: ../tcosmonitor/extensions/info.py:513 +msgid "Sample cache size" +msgstr "Taille simple de cache" + +#: ../tcosmonitor/extensions/info.py:514 +msgid "User name" +msgstr "Nom d'utilisateur" + +#: ../tcosmonitor/extensions/info.py:515 +msgid "Host Name" +msgstr "Nom d'hôte" + +#: ../tcosmonitor/extensions/info.py:516 +msgid "Server Name" +msgstr "Nom du serveur" + +#: ../tcosmonitor/extensions/info.py:517 +msgid "Server Version" +msgstr "Version du serveur" + +#: ../tcosmonitor/extensions/info.py:518 +msgid "Default Sample Specification" +msgstr "Spécification de l'échantillon par défaut" + +#: ../tcosmonitor/extensions/info.py:519 +msgid "Default Sink" +msgstr "Sortie par défaut" + +#: ../tcosmonitor/extensions/info.py:520 +msgid "Default Source" +msgstr "Source par défaut" + +#: ../tcosmonitor/extensions/info.py:521 +msgid "Cookie" +msgstr "Cookie" + +#: ../tcosmonitor/extensions/info.py:527 +msgid "Sound server is not running" +msgstr "Le serveur de son n'est pas lancé" + +#: ../tcosmonitor/extensions/info.py:588 ../tcosmonitor/extensions/info.py:596 +#: ../tcosmonitor/extensions/info.py:604 +msgid "PulseAudio apps need /dev/shm." +msgstr "L'application PulseAudio nécessite /dev/shm." + +#: ../tcosmonitor/extensions/restartxorg.py:48 +#, python-format +msgid "Restart X session of %s with new config?" +msgstr "Redémarrer la session X de %s avec la nouvelle configuration ?" + +#: ../tcosmonitor/extensions/restartxorg.py:61 +#, python-format +msgid "%s is not supported to restart Xorg!" +msgstr "%s ne gère pas le redémarrage Xorg !" + +#: ../tcosmonitor/extensions/restartxorg.py:75 +msgid "No thin clients found." +msgstr "Aucun client léger trouvé." + +#: ../tcosmonitor/extensions/restartxorg.py:78 +#, python-format +msgid "Do you want to restart X screens (only thin clients):%s?" +msgstr "" +"Voulez-vous redémarrer les écrans X (sur les clients légers seulement) : %s" + +#: ../tcosmonitor/extensions/wakeonlan.py:47 +#: ../tcosmonitor/extensions/wakeonlan.py:73 +msgid "" +"Wake On Lan only works with static list.\n" +"\n" +"Enable scan method \"static\" in Preferences\n" +"and (wake on lan) support in bios of clients." +msgstr "" +"le Réveil Par le Réseau ne fonctionne qu'avec une liste statique.\n" +"\n" +"Veuillez activer la méthode de scan « statique » dans Préférences\n" +"et la gestion (réveil par le réseau) dans le BIOS des clients." + +#: ../tcosmonitor/extensions/wakeonlan.py:51 +#, python-format +msgid "Do you want boot %s client?" +msgstr "Voulez-vous démarrer le client %s ?" + +#: ../tcosmonitor/extensions/wakeonlan.py:65 +#: ../tcosmonitor/extensions/wakeonlan.py:90 +#, python-format +msgid "No register MAC address for ip: \"%s\"" +msgstr "Aucune adresse MAC enregistrée pour l'adresse IP : « %s »" + +#: ../tcosmonitor/extensions/wakeonlan.py:69 +#: ../tcosmonitor/extensions/wakeonlan.py:97 +#, python-format +msgid "Not valid MAC address: \"%s\"" +msgstr "Adresse MAC non valide : « %s »" + +#: ../tcosmonitor/extensions/wakeonlan.py:77 +msgid "Do you want boot all clients?" +msgstr "Voulez-vous démarrer tous les clients ?" + +#: ../tcosmonitor/extensions/reboot.py:45 +#, python-format +msgid "Do you want to reboot: %s?" +msgstr "Voulez-vous redémarrer : %s ?" + +#: ../tcosmonitor/extensions/reboot.py:48 +#: ../tcosmonitor/extensions/reboot.py:58 +#, python-format +msgid "Pc will reboot in %s seconds" +msgstr "Le PC redémarrera dans %s secondes" + +#: ../tcosmonitor/extensions/reboot.py:55 +#, python-format +msgid "Do you want to reboot the following clients: %s?" +msgstr "Voulez-vous redémarrer les clients suivants : %s ?" + +#: ../tcosmonitor/extensions/reboot.py:64 +#, python-format +msgid "Do you want to poweroff: %s?" +msgstr "Voulez-vous éteindre : %s ?" + +#: ../tcosmonitor/extensions/reboot.py:67 +#: ../tcosmonitor/extensions/reboot.py:77 +#, python-format +msgid "Pc will shutdown in %s seconds" +msgstr "Le PC va s'éteindre dans %s secondes" + +#: ../tcosmonitor/extensions/reboot.py:74 +#, python-format +msgid "Do you want to poweroff the following clients: %s?" +msgstr "Voulez-vous éteindre les clients suivants : %s ?" + +#: ../tcosmonitor/extensions/reboot.py:105 +#: ../tcosmonitor/extensions/sendfiles.py:104 +#: ../tcosmonitor/extensions/sendfiles.py:185 +#: ../tcosmonitor/extensions/sendfiles.py:265 +#: ../tcosmonitor/extensions/videolan.py:191 +#: ../tcosmonitor/extensions/videolan.py:386 +#: ../tcosmonitor/extensions/videolan.py:628 +#, python-format +msgid "" +"Error while exec remote app:\n" +"Reason:%s" +msgstr "" +"Un erreur s'est produite lors de l'exécution de l'application distante :\n" +"Raison : %s" + +#: ../tcosmonitor/extensions/audiortp.py:46 +#: ../ui/tcosmonitor-mainwindow.ui:163 +msgid "Send audio conference" +msgstr "Envoyer la conférence audio" + +#: ../tcosmonitor/extensions/audiortp.py:47 +#: ../ui/tcosmonitor-prefwindow.ui:1524 +msgid "Audio chat conference" +msgstr "Conférence audio en ligne" + +#: ../tcosmonitor/extensions/audiortp.py:48 +#: ../ui/tcosmonitor-mainwindow.ui:275 +msgid "Audio chat list" +msgstr "Liste des discussions en ligne" + +#: ../tcosmonitor/extensions/audiortp.py:49 +msgid "Send audio conference (from this host)" +msgstr "Envoyer la conférence audio (depuis cet hôte)" + +#: ../tcosmonitor/extensions/audiortp.py:70 +msgid "Emission" +msgstr "Émission" + +#: ../tcosmonitor/extensions/audiortp.py:76 +msgid "State" +msgstr "État" + +#: ../tcosmonitor/extensions/audiortp.py:80 +msgid "Channel" +msgstr "Canal" + +#: ../tcosmonitor/extensions/audiortp.py:232 +#: ../tcosmonitor/extensions/audiortp.py:319 +#: ../tcosmonitor/extensions/audiortp.py:411 +msgid "" +"Your pulseaudio server is too old.\n" +"Is required pulseaudio version >= 0.9.10" +msgstr "" +"Votre serveur pulseaudio est trop ancien.\n" +"La version de pulseaudio nécessaire doit être >= 0.9.10" + +#: ../tcosmonitor/extensions/audiortp.py:235 +#, python-format +msgid "Do you want to start audio conference to the following users: %s?" +msgstr "" +"Voulez-vous démarrer la conférence audio pour les utilisateurs suivants : " +"%s ?" + +#: ../tcosmonitor/extensions/audiortp.py:240 +msgid "You have entered in audio conference" +msgstr "Vous êtes entré en conférence audio" + +#: ../tcosmonitor/extensions/audiortp.py:264 +msgid "Waiting for start audio conference..." +msgstr "En attente du démarrage de la conférence audio…" + +#: ../tcosmonitor/extensions/audiortp.py:292 +#: ../tcosmonitor/extensions/audiortp.py:388 +#, python-format +msgid "Running in audio conference with %s clients." +msgstr "Conférence audio en cours avec %s clients." + +#: ../tcosmonitor/extensions/audiortp.py:302 +#, python-format +msgid "Running in audio conference from server. Conference Nº %s" +msgstr "Conférence audio en cours depuis le serveur. Conférence nº %s" + +#: ../tcosmonitor/extensions/audiortp.py:313 +msgid "Can't start conference mode, user is not logged" +msgstr "" +"Impossible de démarrer le mode conférence, l'utilisateur n'est pas connecté" + +#: ../tcosmonitor/extensions/audiortp.py:322 +#, python-format +msgid "Do you want audio conference from user %s?" +msgstr "Voulez-vous démarrer une conférence audio avec l'utilisateur %s ?" + +#: ../tcosmonitor/extensions/audiortp.py:329 +#, python-format +msgid "You have entered in audio conference from user %s" +msgstr "Vous avez rejoint la conférence audio avec l'utilisateur %s" + +#: ../tcosmonitor/extensions/audiortp.py:357 +#, python-format +msgid "Waiting for start audio conference from user %s..." +msgstr "En attente du démarrage de la conférence audio avec l'utilisateur %s…" + +#: ../tcosmonitor/extensions/audiortp.py:398 +#, python-format +msgid "Running in audio conference from user %(host)s. Conference Nº %(count)s" +msgstr "" +"Conférence audio en cours avec l'utilisateur %(host)s. Conférence " +"nº %(count)s" + +#: ../tcosmonitor/extensions/audiortp.py:414 +#, python-format +msgid "Do you want to start audio chat conference to the following users: %s?" +msgstr "" +"Voulez-vous démarrer la conférence audio en ligne avec les utilisateurs " +"suivants : %s ?" + +#: ../tcosmonitor/extensions/audiortp.py:419 +#, python-format +msgid "You have entered in audio chat conference. Participants: %s" +msgstr "Vous avez rejoint la conférence audio en ligne. Participants : %s" + +#: ../tcosmonitor/extensions/audiortp.py:441 +msgid "Waiting for start audio chat conference..." +msgstr "En attente du démarrage de la conférence audio en ligne…" + +#: ../tcosmonitor/extensions/audiortp.py:447 +msgid "Do you want to connect to this audio chat conference now?" +msgstr "" +"Voulez-vous vous connecter à cette conférence audio en ligne maintenant ?" + +#: ../tcosmonitor/extensions/audiortp.py:481 +#, python-format +msgid "Running in audio chat conference with %s clients." +msgstr "Conférence audio en ligne en cours avec %s clients." + +#: ../tcosmonitor/extensions/audiortp.py:493 +#, python-format +msgid "Running in audio chat conference. Conference Nº %s" +msgstr "Conférence audio en ligne en cours. Conférence nº %s" + +#: ../tcosmonitor/extensions/audiortp.py:519 +msgid "Conference mode off." +msgstr "Mode conférence arrêté." + +#: ../tcosmonitor/extensions/audiortp.py:538 +msgid "Audio chat conference off." +msgstr "Conférence audio en ligne arrêté." + +#: ../tcosmonitor/extensions/appsmsg.py:61 +msgid "Clients not connected" +msgstr "Clients non connectés" + +#: ../tcosmonitor/extensions/appsmsg.py:84 +#, python-format +msgid "" +"<b>Exec app in user(s) screen(s)\n" +"or open web address to:</b>\n" +"%s" +msgstr "" +"<b>Exécuter une application sur le ou les écrans du ou des utilisateurs\n" +"ou ouvrir une page Internet vers : </b>\n" +"%s" + +#: ../tcosmonitor/extensions/appsmsg.py:86 +#, python-format +msgid "" +"<b>Send a message to:</b>\n" +"%s" +msgstr "" +"<b>Envoyer un message à :</b>\n" +"%s" + +#: ../tcosmonitor/extensions/appsmsg.py:119 +#: ../tcosmonitor/extensions/appsmsg.py:160 +msgid "Can't exec application, user is not logged" +msgstr "Impossible d'exécuter l'application, l'utilisateur n'est pas connecté" + +#: ../tcosmonitor/extensions/appsmsg.py:138 +#: ../tcosmonitor/extensions/appsmsg.py:149 +#, python-format +msgid "%s is not a valid application" +msgstr "%s n'est pas une application valide" + +#: ../tcosmonitor/extensions/appsmsg.py:169 +msgid "Can't send message, user is not logged" +msgstr "Impossible d'envoyer un message, l'utilisateur n'est pas connecté" + +#: ../tcosmonitor/extensions/appsmsg.py:286 +#: ../tcosmonitor/extensions/appsmsg.py:295 +#, python-format +msgid "%s is not application" +msgstr "%s n'est pas une application" + +#: ../tcosmonitor/extensions/appsmsg.py:350 +#, python-format +msgid "" +"Error while exec remote app:\n" +"Reason: %s" +msgstr "" +"Une erreur s'est produite lors de l'exécution de l'application distante :\n" +"Raison : %s" + +#: ../tcosmonitor/extensions/appsmsg.py:357 +#, python-format +msgid "" +"Error while send message:\n" +"Reason: %s" +msgstr "" +"Une erreur s'est produite lors de l'envoi du message : \n" +"Raison : %s" + +#: ../tcosmonitor/extensions/livevnc.py:72 +msgid "Live view of all hosts" +msgstr "Vue en direct pour tous les hôtes" + +#: ../tcosmonitor/extensions/livevnc.py:193 +msgid "Running in LiveView mode" +msgstr "Mode Vue en Direct en cours" + +#: ../tcosmonitor/extensions/screenshot.py:63 +#: ../tcosmonitor/extensions/screenshot.py:80 +#, python-format +msgid "Can't make screenshot, error: %s" +msgstr "Impossible de réaliser la capture d'écran, erreur : %s" + +#: ../tcosmonitor/extensions/screenshot.py:72 +msgid "Trying to order terminal to do a screenshot..." +msgstr "Essai d'enjoindre la console de réaliser une capture d'écran…" + +#: ../tcosmonitor/extensions/screenshot.py:84 +msgid "Get another screenshot" +msgstr "Faire une autre capture d'écran" + +#: ../tcosmonitor/extensions/screenshot.py:101 +#, python-format +msgid "Screenshot of <span style='font-style: italic'>%s</span>" +msgstr "Capture d'écran de <span style='font-style: italic'>%s</span>" + +#: ../tcosmonitor/extensions/screenshot.py:124 +#, python-format +msgid "Screenshot of %s, done." +msgstr "Capture d'écran de %s, faite." + +#: ../tcosmonitor/extensions/screenshot.py:138 +msgid "Save Screenshot" +msgstr "Enregistrer la capture d'écran" + +#: ../tcosmonitor/extensions/screenshot.py:150 +msgid "Select file to save screenshot..." +msgstr "Veuillez sélectionner un fichier pour enregistrer la capture d'écran…" + +#: ../tcosmonitor/extensions/screenshot.py:154 +#, python-format +msgid "screenshot_of_%(hostname)s_date_%(date)s.png" +msgstr "Capture d'écran_de_%(hostname)s_date_%(date)s.png" + +#: ../tcosmonitor/extensions/screenshot.py:158 +msgid "Image Files ( *.png, *.jpg)" +msgstr "Fichiers image (*.png, *.jpg)" + +#: ../tcosmonitor/extensions/screenshot.py:168 +msgid "File must be png or jpg." +msgstr "Les fichiers doivent avoir l'extension png ou jpg." + +#: ../tcosmonitor/extensions/screenshot.py:191 +msgid "Screenshots of all hosts" +msgstr "Captures d'écran de tous les hôtes" + +#: ../tcosmonitor/extensions/screenshot.py:209 +#, python-format +msgid "Screenshot of %s" +msgstr "Capture d'écran de %s" + +#: ../tcosmonitor/extensions/italc.py:70 +msgid "Can't start IVS, please add iTALC support" +msgstr "Impossible de démarrer IVS, veuillez ajouter le support iTALC" + +#: ../tcosmonitor/extensions/lockscreen.py:46 +#: ../tcosmonitor/extensions/lockscreen.py:54 +msgid "" +"Can't connect to tcosxmlrpc.\n" +"Please verify user and password in prefences!" +msgstr "" +"Impossible de se connecter à tcosxmlrpc.\n" +"Veuillez vérifier l'utilisateur et son mot de passe dans les préférences !" + +#: ../tcosmonitor/extensions/lockscreen.py:78 +#, python-format +msgid "Do you want to lock the following screens: %s?" +msgstr "Voulez-vous verrouiller les écrans suivants : %s ?" + +#: ../tcosmonitor/extensions/lockscreen.py:87 +#, python-format +msgid "Do you want to unlock the following screens: %s?" +msgstr "Voulez-vous déverrouiller les écrans suivants : %s ?" + +#: ../tcosmonitor/extensions/sendfiles.py:67 +#: ../tcosmonitor/extensions/sendfiles.py:120 +msgid "Can't send files, user is not logged" +msgstr "Impossible d'envoyer les fichiers, l'utilisateur n'est pas connecté" + +#: ../tcosmonitor/extensions/sendfiles.py:71 +#: ../tcosmonitor/extensions/sendfiles.py:142 +#: ../tcosmonitor/extensions/sendfiles.py:222 +msgid "TcosMonitor: FTP+TLS server is not running." +msgstr "TcosMonitor : le serveur FTP+TLS n'est pas lancé." + +#: ../tcosmonitor/extensions/sendfiles.py:84 +#: ../tcosmonitor/extensions/sendfiles.py:161 +#: ../tcosmonitor/extensions/sendfiles.py:241 +msgid "Waiting for send files..." +msgstr "Attente de l'envoi des fichiers…" + +#: ../tcosmonitor/extensions/sendfiles.py:93 +#: ../tcosmonitor/extensions/sendfiles.py:94 +#: ../tcosmonitor/extensions/sendfiles.py:101 +#: ../tcosmonitor/extensions/sendfiles.py:108 +#: ../tcosmonitor/extensions/sendfiles.py:174 +#: ../tcosmonitor/extensions/sendfiles.py:175 +#: ../tcosmonitor/extensions/sendfiles.py:182 +#: ../tcosmonitor/extensions/sendfiles.py:189 +#: ../tcosmonitor/extensions/sendfiles.py:254 +#: ../tcosmonitor/extensions/sendfiles.py:255 +#: ../tcosmonitor/extensions/sendfiles.py:262 +#: ../tcosmonitor/extensions/sendfiles.py:269 +msgid "Teacher" +msgstr "Professeur" + +#: ../tcosmonitor/extensions/sendfiles.py:94 +#: ../tcosmonitor/extensions/sendfiles.py:108 +#: ../tcosmonitor/extensions/sendfiles.py:175 +#: ../tcosmonitor/extensions/sendfiles.py:189 +#: ../tcosmonitor/extensions/sendfiles.py:255 +#: ../tcosmonitor/extensions/sendfiles.py:269 +#, python-format +msgid "" +"Teacher has sent some files to %(teacher)s folder:\n" +"\n" +"%(basenames)s" +msgstr "" +"Le professeur a envoyé des fichiers au répertoire %(teacher)s : \n" +"\n" +"%(basenames)s" + +#: ../tcosmonitor/extensions/sendfiles.py:105 +#: ../tcosmonitor/extensions/sendfiles.py:186 +#: ../tcosmonitor/extensions/sendfiles.py:266 +msgid "Error creating destination folder." +msgstr "" +"Une erreur s'est produite lors de la création du répertoire de destination." + +#: ../tcosmonitor/extensions/sendfiles.py:110 +#: ../tcosmonitor/extensions/sendfiles.py:190 +#: ../tcosmonitor/extensions/sendfiles.py:271 +msgid "Files sent." +msgstr "Les fichiers ont été envoyés." + +#: ../tcosmonitor/extensions/sendfiles.py:125 +#: ../tcosmonitor/extensions/sendfiles.py:205 +msgid "Select file or files..." +msgstr "Veuillez sélectionner le ou les fichiers…" + +#: ../tcosmonitor/extensions/sendfiles.py:163 +#: ../tcosmonitor/extensions/sendfiles.py:243 +msgid "Do you want open file(s) on client?" +msgstr "Voulez-vous ouvrir le/les fichier(s) sur le client ?" + +#: ../tcosmonitor/extensions/dpms.py:76 +#, python-format +msgid "Do you want to switch off the following monitors: %s?" +msgstr "Voulez-vous éteindre les moniteurs suivants : %s ?" + +#: ../tcosmonitor/extensions/dpms.py:85 +#, python-format +msgid "Do you want to switch on the following monitors: %s?" +msgstr "Voulez-vous allumer les moniteurs suivants : %s ?" + +#: ../tcosmonitor/extensions/viewproc.py:45 +msgid "Can't show runnings apps, user is not logged" +msgstr "" +"Impossible d'afficher les applications en cours, l'utilisateur n'est pas " +"connecté" + +#: ../tcosmonitor/extensions/viewproc.py:55 +msgid "User not connected, no processes." +msgstr "Utilisateur non connecté, pas de processus." + +#: ../tcosmonitor/extensions/viewproc.py:73 +#, python-format +msgid "Running processes for user \"%s\": " +msgstr "Processus en cours pour l'utilisateur « %s » :" + +#: ../tcosmonitor/extensions/viewproc.py:77 +msgid "" +"ALERT: There are some system process hidden. Enable it in Preferences dialog." +msgstr "" +"ALERTE : il y a des processus systèmes cachés. Veuillez l'activer dans le " +"menu Préférences." + +#: ../tcosmonitor/extensions/viewproc.py:82 +msgid "Pid" +msgstr "PID" + +#: ../tcosmonitor/extensions/viewproc.py:83 +msgid "Process command" +msgstr "Commande de processus" + +#: ../tcosmonitor/extensions/viewproc.py:88 +msgid "Kill this process" +msgstr "Tuer ce processus" + +#: ../tcosmonitor/extensions/viewproc.py:125 +msgid "Are you sure you want to stop this process?" +msgstr "Êtes-vous sur de vouloir arrêter ce processus ?" + +#: ../tcosmonitor/extensions/viewproc.py:134 +#, python-format +msgid "" +"Error while killing app:\n" +"Reason: %s" +msgstr "" +"Erreur lors de l'arrêt de l'application : \n" +"Raison : %s" + +#: ../tcosmonitor/extensions/videolan.py:45 +#: ../tcosmonitor/extensions/videolan.py:46 +msgid "Send Audio/Video broadcast" +msgstr "Envoyer la diffusion Audio/Vidéo" + +#: ../tcosmonitor/extensions/videolan.py:62 +#: ../tcosmonitor/extensions/videolan.py:216 +msgid "Can't send video broadcast, user is not logged" +msgstr "" +"Impossible d'envoyer la diffusion vidéo, l'utilisateur n'est pas connecté" + +#: ../tcosmonitor/extensions/videolan.py:146 +#: ../tcosmonitor/extensions/videolan.py:344 +#: ../tcosmonitor/extensions/videolan.py:577 +#, python-format +msgid "" +"Not allowed white spaces in \"%s\".\n" +"Please rename it." +msgstr "" +"Les espaces blancs ne sont pas autorisés dans « %s ».\n" +"Veuillez le renommer." + +#: ../tcosmonitor/extensions/videolan.py:156 +#: ../tcosmonitor/extensions/videolan.py:356 +#: ../tcosmonitor/extensions/videolan.py:593 +msgid "Waiting for start video transmission..." +msgstr "En attente du démarrage de la transmission vidéo…" + +#: ../tcosmonitor/extensions/videolan.py:196 +#: ../tcosmonitor/extensions/videolan.py:390 +#: ../tcosmonitor/extensions/videolan.py:633 +msgid "Running in broadcast video transmission." +msgstr "Transmission vidéo en cours" + +#: ../tcosmonitor/extensions/videolan.py:205 +#: ../tcosmonitor/extensions/videolan.py:399 +#, python-format +msgid "" +"Running in broadcast video transmission to user %(host)s. Broadcast Nº " +"%(count)s" +msgstr "" +"Transmission vidéo en cours pour l'utilisateur %(host)s. Diffusion " +"nº %(count)s" + +#: ../tcosmonitor/extensions/videolan.py:308 +#: ../tcosmonitor/extensions/videolan.py:540 +msgid "Select audio/video file.." +msgstr "Sélectionner un fichier audio/vidéo" + +#: ../tcosmonitor/extensions/videolan.py:311 +#: ../tcosmonitor/extensions/videolan.py:543 +msgid "Play DVD" +msgstr "Jouer le DVD" + +#: ../tcosmonitor/extensions/videolan.py:312 +#: ../tcosmonitor/extensions/videolan.py:544 +msgid "Play SVCD/VCD" +msgstr "Jouer le SVCD/VCD" + +#: ../tcosmonitor/extensions/videolan.py:313 +#: ../tcosmonitor/extensions/videolan.py:545 +msgid "Play AudioCD" +msgstr "Jouer le disque audio" + +#: ../tcosmonitor/extensions/videolan.py:358 +#: ../tcosmonitor/extensions/videolan.py:595 +msgid "" +"First select the DVD chapter or play movie\n" +"then press enter to send clients..." +msgstr "" +"Veuillez d'abord sélectionner le chapitre du DVD ou jouer le film\n" +"puis appuyer sur entrée pour l'envoyer aux clients…" + +#: ../tcosmonitor/extensions/videolan.py:367 +msgid "Lock keyboard and mouse on client?" +msgstr "Verrouiller le clavier et la souris sur le client ?" + +#: ../tcosmonitor/extensions/videolan.py:443 +msgid "Video broadcast stopped." +msgstr "Diffusion vidéo arrêtée." + +#: ../tcosmonitor/extensions/videolan.py:604 +msgid "Lock keyboard and mouse on clients?" +msgstr "Verrouiller le clavier et la souris sur les clients ?" + +#: ../tcosmonitor/extensions/videolan.py:642 +#, python-format +msgid "Running in broadcast video transmission. Broadcast Nº %s" +msgstr "Transmission vidéo en cours. Diffusion nº %s" + +#: ../tcosmonitor/extensions/remotessh.py:44 +msgid "Enter password of remote thin client (if asked for it)" +msgstr "" +"Veuillez entrer le mot de passe du client léger distant (si on vous le " +"demande)" + +#: ../tcosmonitor/extensions/logout.py:45 +#: ../tcosmonitor/extensions/logout.py:68 +msgid "User not logged" +msgstr "Utilisateur non connecté" + +#: ../tcosmonitor/extensions/logout.py:48 +#, python-format +msgid "Do you want to logout user: %s?" +msgstr "Voulez-vous déconnecter l'utilisateur : %s ?" + +#: ../tcosmonitor/extensions/logout.py:52 +#: ../tcosmonitor/extensions/logout.py:74 +#, python-format +msgid "Session will close in %s seconds" +msgstr "La session sera fermée dans %s secondes" + +#: ../tcosmonitor/extensions/logout.py:70 +#, python-format +msgid "Do you want to logout the following users: %s?" +msgstr "Voulez-vous déconnecter les utilisateurs suivants : %s ?" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:47 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:106 +msgid "Internet connection has been disabled" +msgstr "La connexion Internet a été désactivée" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:51 +msgid "Can't disable internet, user is not logged" +msgstr "" +"Impossible de désactiver la connexion Internet, l'utilisateur n'est pas " +"connecté" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:56 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:82 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:100 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:144 +#, python-format +msgid "" +"In order to lock and unlock internet you need to be in 'tcos' group.\n" +"\n" +"Exe by root: adduser %s tcos" +msgstr "" +"Afin de déverrouiller la connexion Internet vous devez faire partie du " +"groupe « tcos ».\n" +"\n" +"Exécutez par le superutilisateur : adduser %s tcos" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:74 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:148 +msgid "Internet connection has been enabled" +msgstr "La connexion Internet a été activée" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:78 +msgid "Can't enable internet, user is not logged" +msgstr "" +"Impossible d'activer la connexion Internet, l'utilisateur n'est pas connecté" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:113 +#, python-format +msgid "Do you want disable internet to following users: %s?" +msgstr "" +"Voulez-vous désactiver la connexion Internet pour les utilisateurs " +"suivants : %s ?" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:155 +#, python-format +msgid "Do you want enable internet to following users: %s?" +msgstr "" +"Voulez-vous activer la connexion Internet pour les utilisateurs suivants : " +"%s ?" + +#: ../tcosmonitor/extensions/tcospersonalize.py:51 +#, python-format +msgid "%s is not supported to personalize!" +msgstr "%s ne gère pas la personnalisation !" + +#: ../tcosmonitor/TcosMenus.py:97 ../tcosmonitor/TcosMenus.py:109 +#, python-format +msgid "Actions for %s" +msgstr "Actions pour %s" + +#: ../tcosmonitor/TcosMenus.py:102 +msgid "Actions for selected host" +msgstr "Actions pour l'hôte sélectionné" + +#: ../tcosmonitor/TcosMenus.py:163 ../tcosmonitor/TcosMenus.py:232 +#, python-format +msgid "%d hidden actions" +msgstr "%d actions cachées" + +#: ../tcosmonitor/TcosMenus.py:176 ../tcosmonitor/TcosMenus.py:178 +msgid "Actions for selected hosts" +msgstr "Actions pour les hôtes sélectionnés" + +#: ../tcosmonitor/TcosMenus.py:180 +msgid "Actions for all hosts" +msgstr "Actions pour tous les hôtes" + +#: ../tcosmonitor/TcosMenus.py:237 +msgid "Save hosts positions" +msgstr "Enregistrer la position des hôtes" + +#: ../tcosmonitor/TcosMenus.py:245 +msgid "Reset hosts positions" +msgstr "Réinitialiser la position des hôtes" + +#: ../tcosmonitor/TcosDBus.py:82 +msgid "TcosDBus not allowed in local display" +msgstr "TcosDBus n'est pas autorisé sur l'affichage local" + +#: ../tcosmonitor/TcosDBus.py:110 +#, python-format +msgid "Seems that tcosxmlrpc isn't running on host=\"%s\"" +msgstr "Il semble que tcosxmlrpc n'est pas lancé sur l'hôte =« %s »" + +#: ../tcosmonitor/TcosDBus.py:131 +msgid "tcosxmlrpc ERROR conection unavalaible." +msgstr "ERREUR tcosxmlrpc, la connexion n'est pas disponible." + +#: ../tcosmonitor/TcosDBus.py:147 +msgid "ERROR conecting to tcosxmlrpc, check username and password." +msgstr "" +"ERREUR durant la connexion à tcosxmlrpc, veuillez vérifier le nom " +"d'utilisateur et le mot de passe." + +#: ../tcosmonitor/TcosDBus.py:293 +msgid "Message from admin" +msgstr "Message de la part de l'administrateur" + +#: ../tcosmonitor/TcosDBus.py:382 ../tcosmonitor/TcosDBus.py:398 +#: ../tcosmonitor/TcosDBus.py:414 ../tcosmonitor/TcosDBus.py:432 +#: ../tcosmonitor/TcosDBus.py:450 +msgid "User not allowed to run this dbus call." +msgstr "L'utilisateur n'est pas autorisé à exécuter cet appel à dbus." + +#: ../tcosmonitor/TcosPreferences.py:264 +msgid "" +"You have select more than 5 button menus.\n" +"Only allowed to select a maximum of 5 buttons." +msgstr "" +"Vous avez sélectionné plus de 5 boutons de menu.\n" +"Il n'est permis d'en sélectionner qu'au plus 5." + +#: ../tcosmonitor/TcosPreferences.py:275 +msgid "New settings saved." +msgstr "Nouveaux réglages enregistrés." + +#: ../tcosmonitor/TcosStaticHosts.py:148 ../tcosmonitor/TcosListView.py:66 +msgid "IP address" +msgstr "Adresse IP" + +#: ../tcosmonitor/TcosStaticHosts.py:154 +#: ../ui/tcosmonitor-staticwindownew.ui:68 +msgid "MAC address" +msgstr "Adresse MAC" + +#: ../tcosmonitor/TcosStaticHosts.py:264 +msgid "No hosts found, please click on Refresh button using another method." +msgstr "" +"Aucun hôte n'a pu être trouvé, veuillez appuyer sur le bouton Rafraîchir en " +"utilisant une autre méthode." + +#: ../tcosmonitor/TcosXmlRpc.py:75 +msgid "" +"Username or password are empty,\n" +"please edit in preferences dialog!" +msgstr "" +"Le nom d'utilisateur et le mot de passe sont vides, \n" +"veuillez les modifier dans le menu préférences !" + +#: ../tcosmonitor/TcosListView.py:78 +msgid "Active" +msgstr "Actif" + +#: ../tcosmonitor/TcosListView.py:88 +msgid "Screen Blocked" +msgstr "Écran bloqué" + +#: ../tcosmonitor/TcosListView.py:93 +msgid "Num of process" +msgstr "Numéro de processus" + +#: ../tcosmonitor/TcosListView.py:108 +msgid "Sel" +msgstr "Sélection" + +#: ../tcosmonitor/TcosListView.py:144 +#, python-format +msgid "Error connecting to tcosxmlrpc in %s" +msgstr "Une erreur s'est produite lors la connexion à tcosxmlrpc dans %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:150 +#, python-format +msgid "Floppy: %s" +msgstr "Lecteur de disquette : %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:152 +#, python-format +msgid "CDROM: %s" +msgstr "CD : %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:154 +#, python-format +msgid "USB: %s" +msgstr "USB : %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:156 +#, python-format +msgid "HDD partition: %s" +msgstr "Partition HDD : %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:158 +#, python-format +msgid "Unknow: %s" +msgstr "Inconnu : %s" + +#: ../tcosmonitor/TcosActions.py:92 ../tcosmonitor/TcosActions.py:184 +msgid "Searching for connected hosts..." +msgstr "Recherche des hôtes connectés…" + +#: ../tcosmonitor/TcosActions.py:258 +msgid "Searching info of hosts..." +msgstr "Recherche des informations sur les hôtes…" + +#: ../tcosmonitor/TcosActions.py:297 +#, python-format +msgid "Connecting to %s..." +msgstr "Connexion en cours à %s…" + +#: ../tcosmonitor/TcosActions.py:331 +#, python-format +msgid "Found %(len)d hosts, %(ex)d hosts excluded" +msgstr "%(len)d hôtes ont été trouvés, %(ex)d hôtes ont été exclus" + +#: ../tcos-devices-ng.py:185 +#, python-format +msgid "Rebooting in %s seconds" +msgstr "Redémarrage dans %s secondes" + +#: ../tcos-devices-ng.py:187 +#, python-format +msgid "Shutting down in %s seconds" +msgstr "Extinction dans %s secondes" + +#: ../tcos-devices-ng.py:203 ../tcos-devices-ng.py:206 +#, python-format +msgid "" +"ERROR during action %(action)s:\n" +"%(errortxt)s" +msgstr "" +"ERREUR durant l'action %(action)s :\n" +"%(errortxt)s" + +#: ../tcos-devices-ng.py:236 +msgid "Tcos device daemon" +msgstr "Démon pour la machine Tcos" + +#: ../tcos-devices-ng.py:271 +msgid "" +"TCOS_DEVICES: Your user is not in group fuse and you can not use USB " +"devices. Please contact with your administrator." +msgstr "" +"TCOS_DEVICES : votre identifiant n'est pas dans le groupe fuse et vous ne " +"pouvez pas utiliser d'appareil USB. Veuillez contacter votre administrateur." + +#: ../tcos-devices-ng.py:315 +#, python-format +msgid "Cdrom device %s" +msgstr "Lecteur de CD %s" + +#: ../tcos-devices-ng.py:318 +msgid "Mount Cdrom" +msgstr "Monter le lecteur de CD" + +#: ../tcos-devices-ng.py:319 +msgid "Umount Cdrom" +msgstr "Démonter le lecteur de CD" + +#: ../tcos-devices-ng.py:341 +#, python-format +msgid "Disk partition %s" +msgstr "Partition du disque %s" + +#: ../tcos-devices-ng.py:344 +msgid "Mount disk partition" +msgstr "Monter la partition du disque" + +#: ../tcos-devices-ng.py:345 +msgid "Umount disk partition" +msgstr "Démonter la partition du disque" + +#: ../tcos-devices-ng.py:357 +msgid "No floppy detected" +msgstr "Aucun lecteur de disquette détecté" + +#: ../tcos-devices-ng.py:369 ../tcos-devices-ng.py:686 +#: ../tcos-devices-ng.py:692 ../tcos-devices-ng.py:698 +msgid "Floppy" +msgstr "Lecteur de disquette" + +#: ../tcos-devices-ng.py:372 +msgid "Mount Floppy" +msgstr "Monter le lecteur de disquette" + +#: ../tcos-devices-ng.py:373 +msgid "Umount Floppy" +msgstr "Démonter le lecteur de disquette" + +#: ../tcos-devices-ng.py:383 +msgid "Floppy mounted. Ready for use." +msgstr "Le lecteur de disquette est monté et prêt à être utilisé." + +#: ../tcos-devices-ng.py:385 +msgid "Floppy umounted. You can extract it." +msgstr "Le lecteur de disquette est démonté. Vous pouvez la retirer." + +#: ../tcos-devices-ng.py:401 +msgid "Hard disk partition mounted. Ready for use." +msgstr "La partition du disque dur est montée et prête à être utilisée." + +#: ../tcos-devices-ng.py:404 +msgid "Hard disk partition umounted." +msgstr "La partition du disque dur est démontée." + +#: ../tcos-devices-ng.py:426 +msgid "Audio cdrom mounted., you can listen music opening wav files." +msgstr "" +"Le CD audio est monté, vous pouvez écouter de la musique en ouvrant des " +"fichiers WAV." + +#: ../tcos-devices-ng.py:428 +msgid "Cdrom mounted. Ready for use." +msgstr "Le lecteur de CD est monté et prêt à être utilisé." + +#: ../tcos-devices-ng.py:431 +msgid "Cdrom umounted. You can extract it." +msgstr "Le lecteur de CD est démonté. Vous pouvez le retirer." + +#: ../tcos-devices-ng.py:541 +#, python-format +msgid "" +"Mounting device %s\n" +"Please wait..." +msgstr "" +"Montage en cours du périphérique %s\n" +"Veuillez patienter…" + +#: ../tcos-devices-ng.py:590 +msgid "Error mounting LTSPFS, check versions of LTSPFS packages" +msgstr "" +"Une erreur s'est produite lors du montage de LTSPFS, veuillez vérifier la " +"version des paquets LTSPFS" + +#: ../tcos-devices-ng.py:616 +#, python-format +msgid "" +"Umounting device %s.\n" +"Please wait..." +msgstr "" +"Montage en cours du périphérique %s.\n" +"Veuillez patienter…" + +#: ../tcos-devices-ng.py:663 +msgid "usbdisk" +msgstr "disque USB" + +#: ../tcos-devices-ng.py:665 +msgid "firewiredisk" +msgstr "disque firewire" + +#: ../tcos-devices-ng.py:690 +msgid "Can't mount floppy" +msgstr "Impossible de monter le lecteur de disquette" + +#: ../tcos-devices-ng.py:701 +msgid "Can't umount floppy" +msgstr "Impossible de démonter le lecteur de disquette" + +#: ../tcos-devices-ng.py:714 ../tcos-devices-ng.py:724 +#: ../tcos-devices-ng.py:735 ../tcos-devices-ng.py:850 +#: ../tcos-devices-ng.py:862 ../tcos-devices-ng.py:881 +#: ../tcos-devices-ng.py:893 ../tcos-devices-ng.py:925 +#, python-format +msgid "Cdrom_%s" +msgstr "Cdrom_%s" + +#: ../tcos-devices-ng.py:722 +msgid "Can't mount cdrom" +msgstr "Impossible de monter le lecteur de CD" + +#: ../tcos-devices-ng.py:738 +msgid "Can't umount cdrom" +msgstr "Impossible de démonter le lecteur de CD" + +#: ../tcos-devices-ng.py:756 ../tcos-devices-ng.py:766 +#: ../tcos-devices-ng.py:777 +#, python-format +msgid "Disk_%s" +msgstr "Disque_%s" + +#: ../tcos-devices-ng.py:764 +msgid "Can't mount hard disk partition" +msgstr "Impossible de monter la partition du disque dur" + +#: ../tcos-devices-ng.py:780 +msgid "Can't umount hard disk partition" +msgstr "Impossible de démonter la partition du disque dur" + +#: ../tcos-devices-ng.py:821 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Connected CDROM USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Depuis la console %(host)s.\n" +"Lecteur de CD USB %(device)s connecté\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:825 +#, python-format +msgid "CDROM USB device %s" +msgstr "Lecteur de CD USB %s" + +#: ../tcos-devices-ng.py:828 +#, python-format +msgid "Mount CDROM USB device %s" +msgstr "Monter le lecteur de CD USB %s" + +#: ../tcos-devices-ng.py:829 +#, python-format +msgid "Umount CDROM USB device %s" +msgstr "Démonter le lecteur de CD USB %s" + +#: ../tcos-devices-ng.py:854 ../tcos-devices-ng.py:885 +#: ../tcos-devices-ng.py:1015 ../tcos-devices-ng.py:1026 +#: ../tcos-devices-ng.py:1072 ../tcos-devices-ng.py:1152 +#: ../tcos-devices-ng.py:1163 ../tcos-devices-ng.py:1209 +#, python-format +msgid "Error, can't mount device %s" +msgstr "Erreur, impossible de monter le lecteur %s" + +#: ../tcos-devices-ng.py:912 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Disconnected CDROM USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Depuis la console %(host)s.\n" +"Lecteur de CD USB %(device)s déconnecté\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:940 +#, python-format +msgid "Can't umount cdrom usb %s" +msgstr "Impossible de démonter le lecteur de CD USB %s" + +#: ../tcos-devices-ng.py:965 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Connected USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Depuis la console %(host)s.\n" +"Périphérique USB %(device)s connecté\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:968 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Disconnected USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Depuis la console %(host)s.\n" +"Périphérique USB %(device)s déconnecté\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:996 +#, python-format +msgid "USB device %s" +msgstr "Périphérique USB %s" + +#: ../tcos-devices-ng.py:999 +#, python-format +msgid "Mount USB device %s" +msgstr "Monter le périphérique USB %s" + +#: ../tcos-devices-ng.py:1000 +#, python-format +msgid "Umount USB device %s" +msgstr "Démonter le périphérique USB %s" + +#: ../tcos-devices-ng.py:1102 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Connected Firewire device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Depuis la console %(host)s.\n" +"Périphérique Firewire %(device)s connecté\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:1105 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Disconnected Firewire device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Depuis la console %(host)s.\n" +"Périphérique Firewire %(device)s déconnecté\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:1133 +#, python-format +msgid "Firewire device %s" +msgstr "Périphérique Firewire %s" + +#: ../tcos-devices-ng.py:1136 +#, python-format +msgid "Mount Firewire device %s" +msgstr "Monter le périphérique Firewire %s" + +#: ../tcos-devices-ng.py:1137 +#, python-format +msgid "Umount Firewire device %s" +msgstr "Démonter le périphérique Firewire %s" + +#: ../tcos-devices-ng.py:1220 +#, python-format +msgid "CDROM USB device %s umounted. You can extract it." +msgstr "Le lecteur de CD USB %s est démonté. Vous pouvez le retirer." + +#: ../tcos-devices-ng.py:1223 +#, python-format +msgid "CDROM USB device %s mounted. Ready for use." +msgstr "Le lecteur de CD USB %s est monté et prêt à être utilisé." + +#: ../tcos-devices-ng.py:1261 +#, python-format +msgid "USB device %s umounted. You can extract it." +msgstr "Le lecteur USB %s est démonté. Vous pouvez le retirer." + +#: ../tcos-devices-ng.py:1264 +#, python-format +msgid "USB device %s mounted. Ready for use." +msgstr "Le lecteur USB %s est monté et prêt à être utilisé." + +#: ../tcos-devices-ng.py:1300 +#, python-format +msgid "Firewire device %s umounted. You can extract it." +msgstr "Le lecteur Firewire %s est démonté. Vous pouvez le retirer." + +#: ../tcos-devices-ng.py:1303 +#, python-format +msgid "Firewire device %s mounted. Ready for use." +msgstr "Le lecteur Firewire %s est monté et prêt à être utilisé." + +#: ../tcosmonitor.py:164 +#, python-format +msgid "" +"The user \"%s\" must be member of the group \"tcos\" to exec tcosmonitor.\n" +"\n" +"If you are system administrator, add your user to tcos group." +msgstr "" +"L'utilisateur « %s » doit faire partie du groupe « tcos » pour exécuter " +"tcosmonitor.\n" +"\n" +"Si vous êtes administrateur du système, veuillez ajouter votre utilisateur " +"au groupe tcos." + +#: ../tcospersonalize.py:113 +msgid "" +"Need a host to configure!!!\n" +"Try exec:\n" +" tcospersonalize --host=XXX.XXX.XXX.XXX" +msgstr "" +"Un hôte doit exister pour être configuré !!!\n" +"Veuillez essayer d'exécuter :\n" +" tcospersonalize --host=XXX.XXX.XXX.XXX" + +#: ../tcospersonalize.py:185 +msgid "host: " +msgstr "hôte :" + +#: ../tcospersonalize.py:448 +msgid "Host down, can't connect to tcosxmlrpc." +msgstr "L'hôte est hors-ligne, impossible de se connecter à tcosxmlrpc." + +#: ../tcospersonalize.py:456 +#, python-format +msgid "New %d drivers loaded from terminal." +msgstr "Les nouveaux pilotes %d ont été chargés depuis la console." + +#: ../tcospersonalize.py:515 +#, python-format +msgid "Really delete config of %s?" +msgstr "Êtes-vous sûr de vouloir effacer la configuration de %s ?" + +#: ../tcospersonalize.py:518 +msgid "Deleted!" +msgstr "Effacé !" + +#: ../ui/tcosmonitor-staticwindownew.ui:8 +msgid "New or edit hosts" +msgstr "Nouveau ou hôte à modifier" + +#: ../ui/tcosmonitor-staticwindownew.ui:32 +msgid "" +"You can add a simple host, \n" +" example: <b>192.168.0.100</b>\n" +"\n" +"or range of hosts, \n" +" example: <b>192.168.0.100-120</b>\n" +"\n" +"MAC address is optional" +msgstr "" +"Vous pouvez ajouter un hôte simple, \n" +" exemple : <b>192.168.0.100</b>\n" +"\n" +"ou un intervalle d'hôtes, \n" +" exemple : <b><b>192.168.0.100-120</b>\n" +"\n" +"L'adresse MAC est optionnelle" + +#: ../ui/tcosmonitor-staticwindownew.ui:57 +msgid "IP address *" +msgstr "Adresse IP *" + +#: ../ui/tcosmonitor-staticwindownew.ui:150 +#: ../ui/tcosmonitor-mainwindow.ui:771 ../ui/tcosmonitor-staticwindow.ui:292 +msgid "Cancel" +msgstr "Annuler" + +#: ../ui/tcosmonitor-staticwindownew.ui:198 +#: ../ui/tcosmonitor-staticwindow.ui:340 +msgid "Save" +msgstr "Enregistrer" + +#: ../ui/tcos-volume-manager.ui:39 +msgid "Restart sound" +msgstr "Redémarrer le son" + +#: ../ui/tcos-volume-manager.ui:54 +msgid "Sound levels" +msgstr "Niveaux sonores" + +#: ../ui/tcos-volume-manager.ui:90 +msgid "Main Channels" +msgstr "Principaux canaux" + +#: ../ui/tcos-volume-manager.ui:113 +msgid "Secondary Channels" +msgstr "Canaux secondaires" + +#: ../ui/tray.ui:20 +msgid "<big><b>TCOS devices</b></big>" +msgstr "<big><b>Machines TCOS</b></big>" + +#: ../ui/tray.ui:57 +msgid "Hide" +msgstr "Cacher" + +#: ../ui/tcosmonitor-abouttcos.ui:6 +msgid "About TCOS" +msgstr "À propos de TCOS" + +#: ../ui/tcosmonitor-abouttcos.ui:19 +msgid "<span size=\"xx-large\">TcosMonitor</span>" +msgstr "<span size=\"xx-large\">TcosMonitor</span>" + +#: ../ui/tcosmonitor-abouttcos.ui:62 +msgid "<b>Version:</b>" +msgstr "<b>Version :</b>" + +#: ../ui/tcosmonitor-abouttcos.ui:90 +msgid "" +"Thin client and standalone\n" +"monitoring tool." +msgstr "" +"Client léger et autonome\n" +"outil de supervision." + +#: ../ui/tcosmonitor-abouttcos.ui:131 +msgid "Project web site" +msgstr "Site Internet du projet" + +#: ../ui/tcosmonitor-abouttcos.ui:178 +msgid "About" +msgstr "À propos" + +#: ../ui/tcosmonitor-abouttcos.ui:212 +msgid "License" +msgstr "Licence" + +#: ../ui/tcosmonitor-abouttcos.ui:230 +msgid "" +"Main developers:\n" +" * Mario Izquierdo <mariodebian at gmail.com>\n" +" * Ignacio Vidal <vidal_joshur at gva.es>\n" +"\n" +"Contributors:\n" +" * Andrés Jimenez\n" +" * Quirón\n" +"\n" +"Special thanks to:\n" +" Comunidad de Madrid, MaX group (Spain)" +msgstr "" +"Principaux développeurs : \n" +" * Mario Izquierdo <mariodebian at gmail.com>\n" +" * Ignacio Vidal <vidal_joshur at gva.es>\n" +"\n" +"Contributeurs :\n" +" * Andrés Jimenez\n" +" * Quirón\n" +"\n" +"Remerciements à : \n" +" Comunidad de Madrid, MaX group (Espagne)" + +#: ../ui/tcosmonitor-abouttcos.ui:259 +msgid "Authors" +msgstr "Auteurs" + +#: ../ui/tcosmonitor-abouttcos.ui:275 +msgid "Translated to your language by:" +msgstr "Traduit dans votre langue par : " + +#. put your name and mail +#: ../ui/tcosmonitor-abouttcos.ui:287 +msgid "Mario Izquierdo <mariodebian@gmail.com>" +msgstr "" +"Julien Patriarca <patriarcaj@gmail.com>\n" +"\n" +"Remerciements à :\n" +"L'équipe francophone de traduction Debian <debian-l10n-fr@lists.debian.org>" + +#: ../ui/tcosmonitor-abouttcos.ui:307 +msgid "Translators" +msgstr "Traducteurs" + +#: ../ui/tcosmonitor-abouttcos.ui:324 +msgid "" +"TCOS is a free software project that need a lot of work to be the best thin " +"client plataform.\n" +"\n" +"We work every day a lot of hours to make changes and support more devices " +"and features.\n" +"\n" +"We want to continue developing this software but need your help, if you use, " +"sell or hack TCOS pehaps you could donate some money to project.\n" +"\n" +"Click on next url to get some info." +msgstr "" +"TCOS est un logiciel libre qui nécessite un gros travail pour être la " +"meilleure plate-forme pour client léger.\n" +"\n" +"Nous travaillons chaque jour durant de longues heures pour faire des " +"changements et gérer plus de machines et de fonctionnalités.\n" +"\n" +"Nous voulons continuer à développer ce logiciel mais avons besoin de votre " +"aide, si vous utilisez, vendez ou modifiez TCOS, peut-être pourriez faire un " +"don au projet.\n" +"\n" +"Veuillez cliquer sur l'adresse suivante pour obtenir des informations." + +#. see wiki if translation is avalaible, ex in spanish: TcosProject:Site_support/es +#: ../ui/tcosmonitor-abouttcos.ui:370 +msgid "<u>http://wiki.tcosproject.org/TcosProject:Site_support</u>" +msgstr "<u>http://wiki.tcosproject.org/TcosProject:Site_support</u>" + +#: ../ui/tcosmonitor-abouttcos.ui:392 +msgid "Don't show donations message on start." +msgstr "Ne pas afficher les message concernant les dons au démarrage." + +#: ../ui/tcosmonitor-abouttcos.ui:415 +msgid "Donate" +msgstr "Donner" + +#: ../ui/tcosmonitor-mainwindow.ui:8 +msgid "TcosMonitor" +msgstr "TcosMonitor" + +#: ../ui/tcosmonitor-mainwindow.ui:22 +msgid "Exit TcosMonitor" +msgstr "Sortir de TcosMonitor" + +#: ../ui/tcosmonitor-mainwindow.ui:35 +msgid "Open preferences dialog" +msgstr "Ouvrir la boîte de dialogue des préférences" + +#: ../ui/tcosmonitor-mainwindow.ui:36 ../ui/tcospersonalize.ui:7 +#: ../ui/tcosmonitor-prefwindow.ui:35 +msgid "Preferences" +msgstr "Préférences" + +#: ../ui/tcosmonitor-mainwindow.ui:48 +msgid "Update host list" +msgstr "Mettre à jour la liste des hôtes" + +#: ../ui/tcosmonitor-mainwindow.ui:49 +msgid "Refresh" +msgstr "Rafraîchir" + +#: ../ui/tcosmonitor-mainwindow.ui:71 +msgid "All Hosts" +msgstr "Tous les hôtes" + +#: ../ui/tcosmonitor-mainwindow.ui:99 +msgid "Find" +msgstr "Trouver" + +#: ../ui/tcosmonitor-mainwindow.ui:111 +msgid "About this app" +msgstr "À propos de cette application" + +#: ../ui/tcosmonitor-mainwindow.ui:219 +msgid "Start audio chat" +msgstr "Démarrer le dialogue en ligne audio" + +#: ../ui/tcosmonitor-mainwindow.ui:331 +msgid "Send audio/video" +msgstr "Envoyer l'audio ou la vidéo" + +#: ../ui/tcosmonitor-mainwindow.ui:443 +msgid "Exe app" +msgstr "Exécuter l'application" + +#: ../ui/tcosmonitor-mainwindow.ui:499 +msgid "Send message" +msgstr "Envoyer un message" + +#: ../ui/tcosmonitor-mainwindow.ui:581 +msgid "List view" +msgstr "Vue en liste" + +#: ../ui/tcosmonitor-mainwindow.ui:629 +msgid "Icon view" +msgstr "Vue par icônes" + +#: ../ui/tcosmonitor-mainwindow.ui:689 +msgid "Simulate my classroom" +msgstr "Simuler ma salle de classe" + +#: ../ui/tcosmonitor-staticwindow.ui:8 +msgid "Static hosts list" +msgstr "Liste des hôtes statiques" + +#: ../ui/tcosmonitor-staticwindow.ui:17 +msgid "<span size=\"x-large\">Static Hosts list</span>" +msgstr "<span size=\"x-large\">Liste des hôtes statiques</span>" + +#: ../ui/tcosmonitor-staticwindow.ui:80 +msgid "Add" +msgstr "Ajouter" + +#: ../ui/tcosmonitor-staticwindow.ui:128 +msgid "Modify" +msgstr "Modifier" + +#: ../ui/tcosmonitor-staticwindow.ui:176 +msgid "Delete" +msgstr "Effacer" + +#: ../ui/tcosmonitor-staticwindow.ui:225 +msgid "Get from connected" +msgstr "Obtenir depuis les connectés" + +#: ../ui/tcospersonalize.ui:34 +msgid "<b>unknow host</b>" +msgstr "<b>hôte inconnu</b>" + +#: ../ui/tcospersonalize.ui:74 +msgid "Disable Ctrl + Alt + Backspace (for kill Xorg)" +msgstr "Désactiver Ctrl+Alt+Retour-arrière (pour arrêter Xorg)" + +#: ../ui/tcospersonalize.ui:211 +msgid "Get avalaible drivers" +msgstr "Obtenir les pilotes disponibles" + +#: ../ui/tcospersonalize.ui:248 +msgid "Display Settings" +msgstr "Réglages d'affichage" + +#: ../ui/tcospersonalize.ui:333 ../ui/tcosmonitor-prefwindow.ui:670 +msgid "Advanced" +msgstr "Avancé" + +#: ../ui/tcospersonalize.ui:351 +msgid "Default boot kernel" +msgstr "Noyau de démarrage par défaut" + +#: ../ui/tcospersonalize.ui:376 +msgid "<b>PXE Boot options</b>" +msgstr "<b>Options de Boot PXE</b>" + +#: ../ui/tcospersonalize.ui:391 +msgid "Default boot method" +msgstr "Méthode de démarrage par défaut" + +#: ../ui/tcospersonalize.ui:419 +msgid "Command line" +msgstr "Ligne de commande" + +#: ../ui/tcospersonalize.ui:507 +msgid "Boot options" +msgstr "Options de démarrage" + +#: ../ui/tcospersonalize.ui:551 +msgid "Delete Config" +msgstr "Effacer la configuration" + +#: ../ui/tcosmonitor-askwindow.ui:8 +msgid "Question" +msgstr "Question" + +#: ../ui/tcosmonitor-askwindow.ui:50 +msgid "You can drag and drop launcher file to this box" +msgstr "Vous pouvez glisser déposer le fichier de lancement dans cette boîte" + +#: ../ui/tcosmonitor-askwindow.ui:61 +msgid "<b>Run app in unknow host</b>" +msgstr "<b>Exécuter l'application sur l'hôte inconnu</b>" + +#: ../ui/tcosmonitor-prefwindow.ui:62 +msgid "Show host list on startup" +msgstr "Afficher la liste des hôtes au démarrage" + +#: ../ui/tcosmonitor-prefwindow.ui:80 +msgid "Scan network method" +msgstr "Méthode de balayage du réseau" + +#: ../ui/tcosmonitor-prefwindow.ui:91 +msgid "" +"Network interface\n" +"(thin client)" +msgstr "" +"Interface réseau\n" +"(client léger)" + +#: ../ui/tcosmonitor-prefwindow.ui:127 +msgid "Show system process" +msgstr "Afficher les processus du système" + +#: ../ui/tcosmonitor-prefwindow.ui:144 +msgid "Don't do actions when running TcosMonitor in thin client" +msgstr "" +"Ne pas effectuer les actions lors du l'exécution de TcosMonitor sur un " +"client léger" + +#: ../ui/tcosmonitor-prefwindow.ui:163 +msgid "List of hosts" +msgstr "Liste des hôtes" + +#: ../ui/tcosmonitor-prefwindow.ui:200 +msgid "Open static host list" +msgstr "Ouvrir la liste des hôtes statiques" + +#: ../ui/tcosmonitor-prefwindow.ui:225 +msgid "Only show hosts running tcosxmlrpc (8998 port)" +msgstr "N'afficher que les hôtes exécutant tcosxmlrpc (port 8998)" + +#: ../ui/tcosmonitor-prefwindow.ui:242 +msgid "Only do all actions on selected hosts (requires restart TcosMonitor)" +msgstr "" +"Ne lancer que l'ensemble des actions sur les hôtes sélectionnés (nécessite " +"le redémarrage de TcosMonitor)" + +#: ../ui/tcosmonitor-prefwindow.ui:259 +msgid "Enable SSL connections to XMLRPC clients" +msgstr "Activer les connexions SSL vers les clients XMLRPC" + +#: ../ui/tcosmonitor-prefwindow.ui:278 +msgid "Host list mode" +msgstr "Mode liste d'hôte" + +#: ../ui/tcosmonitor-prefwindow.ui:302 +msgid "Show right menu with groups (NEW)" +msgstr "Afficher les groupes dans le menu de droite (nouveau)" + +#: ../ui/tcosmonitor-prefwindow.ui:319 +msgid "Don't show thin client if TcosMonitor is running there" +msgstr "" +"Ne pas afficher le client léger si TcosMonitor y est en cours d'exécution" + +#: ../ui/tcosmonitor-prefwindow.ui:336 +msgid "Enable ConsoleKit to search users and times (experimental)" +msgstr "" +"Activez ConsoleKit pour chercher des utilisateurs et des périodes " +"(expérimental)" + +#: ../ui/tcosmonitor-prefwindow.ui:368 +msgid "Settings" +msgstr "Réglages" + +#: ../ui/tcosmonitor-prefwindow.ui:393 +msgid "Update host list every (seg)" +msgstr "Mettre à jour la liste des hôtes chaque (seg)" + +#: ../ui/tcosmonitor-prefwindow.ui:406 +msgid "" +"Update host list every selected seconds.\n" +"\n" +"Value=0 disable update." +msgstr "" +"Mettre à jour la liste des hôtes chaque x secondes sélectionnée.\n" +"\n" +"Valeur = 0 désactive la mise à jour" + +#: ../ui/tcosmonitor-prefwindow.ui:422 +msgid "Cache timeout (seg)" +msgstr "Expiration du cache (seg)" + +#: ../ui/tcosmonitor-prefwindow.ui:436 +msgid "" +"Cache some data and connection status during selected seconds.\n" +"\n" +"Value=0 disable cache." +msgstr "" +"Mettre en cache des données et le statut de la connexion pendant la durée " +"(en secondes) sélectionnée.\n" +"\n" +"Valeur = 0 désactive la mise en cache." + +#: ../ui/tcosmonitor-prefwindow.ui:454 +msgid "Screenshot size:" +msgstr "Taille de la capture d'écran : " + +#: ../ui/tcosmonitor-prefwindow.ui:467 ../ui/tcosmonitor-prefwindow.ui:496 +msgid "% Size of screnshot." +msgstr "% Taille de la capture d'écran." + +#: ../ui/tcosmonitor-prefwindow.ui:483 +msgid "Mini screenshot size:" +msgstr "Taille minimum de la capture d'écran : " + +#: ../ui/tcosmonitor-prefwindow.ui:512 +msgid "Timeout actions (seg)" +msgstr "Expiration des actions (seg)" + +#: ../ui/tcosmonitor-prefwindow.ui:525 +msgid "" +"Timeout in seg for actions\n" +"\n" +"Value=0 default" +msgstr "" +"Délai en secondes pour les actions\n" +"\n" +"Valeur = 0 par défaut" + +#: ../ui/tcosmonitor-prefwindow.ui:543 +msgid "SSH remote username" +msgstr "Nom d'utilisateur distant pour SSH" + +#: ../ui/tcosmonitor-prefwindow.ui:570 +msgid "VLC method to send" +msgstr "Méthode VLC à envoyer" + +#: ../ui/tcosmonitor-prefwindow.ui:595 +msgid "" +"<b>Experimental: Thread Controller</b>\n" +"( if you have problems, disable it )" +msgstr "" +"<b>Expérimental : contrôleur de processus </b>\n" +"(si vous rencontrez des problèmes, désactivez-le)" + +#: ../ui/tcosmonitor-prefwindow.ui:608 +msgid "Actions controlled" +msgstr "Actions contrôlées" + +#: ../ui/tcosmonitor-prefwindow.ui:628 +msgid "Block ports: (80,8080... etc)" +msgstr "Ports bloqués : (80, 8080, etc.)" + +#: ../ui/tcosmonitor-prefwindow.ui:697 +msgid "TcosXmlRpc username" +msgstr "Nom d'utilisateur pour TcosXmlRpc" + +#: ../ui/tcosmonitor-prefwindow.ui:723 +msgid "TcosXmlRpc password" +msgstr "Mot de passe pour TcosXmlRpc" + +#: ../ui/tcosmonitor-prefwindow.ui:752 +msgid "" +"<b>NOTE:</b>\n" +"Default user is <b>root</b> and default password is <b>root</b>.\n" +"\n" +"For <u>thin clients</u> change TCOS_ROOT_PASSWD or use TcosConfig and " +"regenerate boot images again.\n" +"\n" +"For <u>standalone</u> users you can use a system account (root) but this is " +"not recomended. Install tcos-standalone and start it by root. Set user and " +"password, this will create a <b>/etc/tcospasswd</b> file only used by TCOS " +"and your root acount will be secure." +msgstr "" +"<b>NOTE :</b>\n" +"Le nom d'utilisateur par défaut est <b>root</b> et le mot de passe par " +"défaut est <b>root</b>.\n" +"\n" +"Pour <u>les clients légers</u> changez TCOS_ROOT_PASSWD ou utilisez " +"TcosConfig et régénérez les images de démarrage à nouveau.\n" +"\n" +"Pour les utilisateurs <u>autonomes</u> vous pouvez utiliser un compte " +"système (superutilisateur) mais ce n'est pas recommandé. Veuillez installer " +"tcos-standalone et démarrez le comme superutilisateur. Créez l'utilisateur " +"et le mot de passe, cela créera un fichier <b>/etc/tcospasswd</b> qui sera " +"utilisé seulement par TCOS et votre compte superutilisateur sera sécurisé." + +#: ../ui/tcosmonitor-prefwindow.ui:789 +msgid "Authentication " +msgstr "Authentification" + +#: ../ui/tcosmonitor-prefwindow.ui:812 +msgid "<b>Info avalaible from tcosxmlrpc</b>" +msgstr "<b>informations disponibles à propos de tcosxmlrpc</b>" + +#: ../ui/tcosmonitor-prefwindow.ui:823 +msgid "Tcos general info" +msgstr "Informations générales à propos de Tcos" + +#: ../ui/tcosmonitor-prefwindow.ui:838 +msgid "Cpu info" +msgstr "Informations à propos du processeur" + +#: ../ui/tcosmonitor-prefwindow.ui:853 +msgid "Kernel and modules info" +msgstr "Informations à propos du noyau et des modules" + +#: ../ui/tcosmonitor-prefwindow.ui:868 +msgid "PCI bus info" +msgstr "Informations à propos du bus PCI" + +#: ../ui/tcosmonitor-prefwindow.ui:883 +msgid "Ram and swap info" +msgstr "Informations à propos de la RAM et de la partition d'échange" + +#: ../ui/tcosmonitor-prefwindow.ui:898 +msgid "Process info" +msgstr "Informations à propos des processus" + +#: ../ui/tcosmonitor-prefwindow.ui:913 +msgid "Network info" +msgstr "Informations à propos du réseau" + +#: ../ui/tcosmonitor-prefwindow.ui:943 +msgid "Sound server info" +msgstr "Informations à propos du serveur de son" + +#: ../ui/tcosmonitor-prefwindow.ui:979 +msgid "Avalaible info" +msgstr "Informations disponibles" + +#: ../ui/tcosmonitor-prefwindow.ui:1002 +msgid "<b>Show / hide menu items</b>" +msgstr "<b>Afficher/cacher les entrées du menu</b>" + +#: ../ui/tcosmonitor-prefwindow.ui:1020 +msgid "Lock and unlock screen" +msgstr "Verrouiller et déverrouiller l'écran" + +#: ../ui/tcosmonitor-prefwindow.ui:1036 +msgid "Remote SSH shell" +msgstr "Terminal SSH distant" + +#: ../ui/tcosmonitor-prefwindow.ui:1054 +msgid "Configure Xorg settings" +msgstr "Configurer les paramètres de Xorg" + +#: ../ui/tcosmonitor-prefwindow.ui:1083 ../ui/tcosmonitor-prefwindow.ui:1444 +msgid "Exe app on user display" +msgstr "Exécuter une application sur l'affichage de l'utilisateur" + +#: ../ui/tcosmonitor-prefwindow.ui:1099 ../ui/tcosmonitor-prefwindow.ui:1458 +msgid "Send a text message" +msgstr "Envoyer un message texte" + +#: ../ui/tcosmonitor-prefwindow.ui:1117 +msgid "Show running apps" +msgstr "Afficher les applications en cours" + +#: ../ui/tcosmonitor-prefwindow.ui:1133 ../ui/tcosmonitor-prefwindow.ui:1474 +msgid "Send video broadcast" +msgstr "Envoyer la diffusion vidéo" + +#: ../ui/tcosmonitor-prefwindow.ui:1167 +msgid "Demo mode" +msgstr "Mode démonstration" + +#: ../ui/tcosmonitor-prefwindow.ui:1196 +msgid "Wake on LAN" +msgstr "Réveil par le réseau" + +#: ../ui/tcosmonitor-prefwindow.ui:1212 +msgid "Audio conference mode" +msgstr "Mode conférence audio" + +#: ../ui/tcosmonitor-prefwindow.ui:1230 +msgid "Screenshots" +msgstr "Captures d'écran" + +#: ../ui/tcosmonitor-prefwindow.ui:1246 +msgid "Reboot and poweroff" +msgstr "Redémarrer et éteindre" + +#: ../ui/tcosmonitor-prefwindow.ui:1260 +msgid "Lock and unlock internet" +msgstr "Bloquer et débloquer la connexion Internet" + +#: ../ui/tcosmonitor-prefwindow.ui:1276 +msgid "DPMS monitor on/off" +msgstr "Allumage et extinction du moniteur par DPMS" + +#: ../ui/tcosmonitor-prefwindow.ui:1294 +msgid "Connect using VNC" +msgstr "Se connecter en utilisant VNC" + +#: ../ui/tcosmonitor-prefwindow.ui:1310 +msgid "Connect using iTALC" +msgstr "Se connecter en utilisant iTALC" + +#: ../ui/tcosmonitor-prefwindow.ui:1325 +msgid "Restart session with new settings" +msgstr "Redémarrer la session avec les nouveaux réglages" + +#: ../ui/tcosmonitor-prefwindow.ui:1402 +msgid "Menus" +msgstr "Menus" + +#: ../ui/tcosmonitor-prefwindow.ui:1425 +msgid "<b>Show / hide menu buttons</b>" +msgstr "<b>Afficher/cacher les boutons du menu</b>" + +#: ../ui/tcosmonitor-prefwindow.ui:1508 +msgid "Audio conference" +msgstr "Conférence audio" + +#: ../ui/tcosmonitor-prefwindow.ui:1542 +msgid "Audio Chat control" +msgstr "Commandes pour le dialogue en ligne audio" + +#: ../ui/tcosmonitor-prefwindow.ui:1586 +msgid "Menu buttons" +msgstr "Boutons du menu" + +#: ../ui/tcosmonitor-chatwindow.ui:8 +msgid "Chat emission list" +msgstr "Liste des émissions pour les dialogues en ligne" + +#: ../ui/tcosmonitor-chatwindow.ui:17 +msgid "<span size=\"x-large\">Chat emission list</span>" +msgstr "" +"<span size=\"x-large\">Liste des émissions pour les dialogues en ligne</span>" + +#: ../ui/tcosmonitor-chatwindow.ui:80 +msgid "Connect" +msgstr "Connecter" + +#: ../ui/tcosmonitor-chatwindow.ui:128 +msgid "Disconnect" +msgstr "Déconnecter" + +#: ../ui/tcosmonitor-chatwindow.ui:176 +msgid "Exit" +msgstr "Sortie" + +#~ msgid "Send files disabled. rsync not configured." +#~ msgstr "L'envoi de fichiers est désactivé. Rsync n'est pas configuré." + +#~ msgid "" +#~ "TcosMonitor need special configuration for rsync daemon to send files.\n" +#~ "\n" +#~ "Please read configuration requeriments in:\n" +#~ "/usr/share/doc/tcosmonitor/README.rsync" +#~ msgstr "" +#~ "TcosMonitor a besoin d'une configuration spécifique du démon rsync pour " +#~ "envoyer des fichiers.\n" +#~ "\n" +#~ "Veuillez lire le nécessaire à configurer dans :\n" +#~ "/usr/share/doc/tcosmonitor/README.rsync" diff --git a/po/gl.po b/po/gl.po new file mode 100644 index 0000000..97dbb89 --- /dev/null +++ b/po/gl.po @@ -0,0 +1,3068 @@ +# Spanish translations for tcosmonitor package +# Traducciones al español para el paquete tcosmonitor. +# Copyright (C) 2006 THE tcosmonitor'S COPYRIGHT HOLDER +# This file is distributed under the same license as the tcosmonitor package. +# <mariodebian@gmail.com>, 2006. +# <mariodebian@gmail.com>, 2006. +# +# +msgid "" +msgstr "" +"Project-Id-Version: tcosmonitor 0.0.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-18 15:48+0100\n" +"PO-Revision-Date: 2008-11-26 19:29+0100\n" +"Last-Translator: Enrique Estévez Fernández <keko@ousli.org>\n" +"Language-Team: Galcian/Galiza <gl@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-Language: Galician\n" + +#: ../tcosmonitor.py:129 +#, python-format +msgid "" +"The user \"%s\" must be member of the group \"tcos\" to exec tcosmonitor.\n" +"\n" +"If you are system administrator, add your user to tcos group." +msgstr "" +"O usuario \"%s\" debe ser membro do grupo \"tcos\" para executar " +"tcosmonitor.\n" +"\n" +"Se vostede é administrador do sistema, engada o seu usuario ao grupo tcos." + +#: ../tcosmonitor.py:247 +msgid "Send files disabled. rsync not configured." +msgstr "O envío de arquivos está desactivado, rsync non está configurado." + +#: ../tcosmonitor.py:329 ../tcospersonalize.py:562 +#: ../tcos-volume-manager.py:378 +msgid "Exiting" +msgstr "Saíndo" + +#: ../tcos-devices-ng.py:188 +#, python-format +msgid "Rebooting in %s seconds" +msgstr "O equipo reiniciarase en %s segundos" + +#: ../tcos-devices-ng.py:190 +#, python-format +msgid "Shutting down in %s seconds" +msgstr "O equipo apagarase en %s segundos" + +#: ../tcos-devices-ng.py:206 ../tcos-devices-ng.py:209 +#, python-format +msgid "" +"ERROR during action %(action)s:\n" +"%(errortxt)s" +msgstr "" +"ERRO realizando acción %(action)s:\n" +"%(errortxt)s" + +#: ../tcos-devices-ng.py:239 +msgid "Tcos device daemon" +msgstr "Xestor de dispositivos TCOS" + +#: ../tcos-devices-ng.py:283 ../tcos-volume-manager.py:143 +#, python-format +msgid "Error connecting with TcosXmlRpc in %s." +msgstr "Erro conectando con tcosxmlrpc en %s" + +#: ../tcos-devices-ng.py:314 +#, python-format +msgid "Cdrom device %s" +msgstr "Dispositivo cdrom %s" + +#: ../tcos-devices-ng.py:317 +msgid "Mount Cdrom" +msgstr "Montar cdrom" + +#: ../tcos-devices-ng.py:318 +msgid "Umount Cdrom" +msgstr "Desmontar cdrom" + +#: ../tcos-devices-ng.py:340 +#, python-format +msgid "Disk partition %s" +msgstr "Partición do disco %s" + +#: ../tcos-devices-ng.py:343 +msgid "Mount disk partition" +msgstr "Montar partición" + +#: ../tcos-devices-ng.py:344 +msgid "Umount disk partition" +msgstr "Desmontar partición" + +#: ../tcos-devices-ng.py:356 +msgid "No floppy detected" +msgstr "Non se detectou disquete" + +#: ../tcos-devices-ng.py:368 ../tcos-devices-ng.py:674 +#: ../tcos-devices-ng.py:680 ../tcos-devices-ng.py:686 +msgid "Floppy" +msgstr "Disquete" + +#: ../tcos-devices-ng.py:371 +msgid "Mount Floppy" +msgstr "Montar disquete" + +#: ../tcos-devices-ng.py:372 +msgid "Umount Floppy" +msgstr "Desmontar disquete" + +#: ../tcos-devices-ng.py:382 +msgid "Floppy mounted. Ready for use." +msgstr "Disquete montado. Listo para empregar." + +#: ../tcos-devices-ng.py:384 +msgid "Floppy umounted. You can extract it." +msgstr "Disquete desmontado. Agora pode extraelo." + +#: ../tcos-devices-ng.py:400 +msgid "Hard disk partition mounted. Ready for use." +msgstr "Partición montada. Lista para empregar." + +#: ../tcos-devices-ng.py:403 +msgid "Hard disk partition umounted." +msgstr "Partición desmontada." + +#: ../tcos-devices-ng.py:425 +msgid "Audio cdrom mounted., you can listen music opening wav files." +msgstr "" +"Cdrom de música montado, agora podes escoita-lo abrindo os arquivos wav." + +#: ../tcos-devices-ng.py:427 +msgid "Cdrom mounted. Ready for use." +msgstr "Cdrom montado. Listo para empregar." + +#: ../tcos-devices-ng.py:430 +msgid "Cdrom umounted. You can extract it." +msgstr "Cdrom desmontado. Agora pode extraelo." + +#: ../tcos-devices-ng.py:529 +#, python-format +msgid "" +"Mounting device %s\n" +"Please wait..." +msgstr "" +"Montando dispositivo %s.\n" +"Por favor, espere..." + +#: ../tcos-devices-ng.py:578 +msgid "Error mounting LTSPFS, check versions of LTSPFS packages" +msgstr "Erro montando LTSPFS, comprobe as versións dos paquetes LTSPFS" + +#: ../tcos-devices-ng.py:604 +#, python-format +msgid "" +"Umounting device %s.\n" +"Please wait..." +msgstr "" +"Desmontando dispositivo %s.\n" +"Por favor, espere..." + +#: ../tcos-devices-ng.py:651 +msgid "usbdisk" +msgstr "disco-usb" + +#: ../tcos-devices-ng.py:653 +msgid "firewiredisk" +msgstr "disco-firewire" + +#: ../tcos-devices-ng.py:678 +msgid "Can't mount floppy" +msgstr "Non se puido montar o disquete" + +#: ../tcos-devices-ng.py:689 +msgid "Can't umount floppy" +msgstr "Non se puido desmontar o disquete" + +#: ../tcos-devices-ng.py:702 ../tcos-devices-ng.py:712 +#: ../tcos-devices-ng.py:723 ../tcos-devices-ng.py:836 +#: ../tcos-devices-ng.py:848 ../tcos-devices-ng.py:867 +#: ../tcos-devices-ng.py:879 ../tcos-devices-ng.py:911 +#, python-format +msgid "Cdrom_%s" +msgstr "Cdrom_%s" + +#: ../tcos-devices-ng.py:710 +msgid "Can't mount cdrom" +msgstr "Non se puido montar o cdrom" + +#: ../tcos-devices-ng.py:726 +msgid "Can't umount cdrom" +msgstr "Non se puido desmontar o cdrom" + +#: ../tcos-devices-ng.py:742 ../tcos-devices-ng.py:752 +#: ../tcos-devices-ng.py:763 +#, python-format +msgid "Disk_%s" +msgstr "Disco_%s" + +#: ../tcos-devices-ng.py:750 +msgid "Can't mount hard disk partition" +msgstr "Non se puido montar a partición" + +#: ../tcos-devices-ng.py:766 +msgid "Can't umount hard disk partition" +msgstr "Non se puido desmontar a partición" + +#: ../tcos-devices-ng.py:807 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Connected CDROM USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Dende o terminal %(host)s.\n" +"Dispositivo CDROM USB conectado %(device)s\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:811 +#, python-format +msgid "CDROM USB device %s" +msgstr "Dispositivo CDROM USB %s" + +#: ../tcos-devices-ng.py:814 +#, python-format +msgid "Mount CDROM USB device %s" +msgstr "Montar dispositivo CDROM USB %s" + +#: ../tcos-devices-ng.py:815 +#, python-format +msgid "Umount CDROM USB device %s" +msgstr "Desmontar dispositivo CDROM USB %s" + +#: ../tcos-devices-ng.py:840 ../tcos-devices-ng.py:871 +#: ../tcos-devices-ng.py:1001 ../tcos-devices-ng.py:1012 +#: ../tcos-devices-ng.py:1058 ../tcos-devices-ng.py:1138 +#: ../tcos-devices-ng.py:1149 ../tcos-devices-ng.py:1195 +#, python-format +msgid "Error, can't mount device %s" +msgstr "Erro, non se puido montar o dispositivo %s" + +#: ../tcos-devices-ng.py:898 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Disconnected CDROM USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Dende o terminal %(host)s.\n" +"Dispositivo CDROM USB desconectado %(device)s\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:926 +#, python-format +msgid "Can't umount cdrom usb %s" +msgstr "Non se puido desmontar o cdrom usb %s" + +#: ../tcos-devices-ng.py:951 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Connected USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Dende o terminal %(host)s.\n" +"Dispositivo USB conectado %(device)s\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:954 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Disconnected USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Dende o terminal %(host)s.\n" +"Dispositivo USB desconectado %(device)s\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:982 +#, python-format +msgid "USB device %s" +msgstr "Dispositivo USB %s" + +#: ../tcos-devices-ng.py:985 +#, python-format +msgid "Mount USB device %s" +msgstr "Montar dispositivo USB %s" + +#: ../tcos-devices-ng.py:986 +#, python-format +msgid "Umount USB device %s" +msgstr "Desmontar dispositivo USB %s" + +#: ../tcos-devices-ng.py:1088 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Connected Firewire device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Dende o terminal %(host)s.\n" +"Dispositivo Firewire conectado %(device)s\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:1091 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Disconnected Firewire device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Dende o terminal %(host)s.\n" +"Dispositivo Firewire desconectado %(device)s\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:1119 +#, python-format +msgid "Firewire device %s" +msgstr "Dispositivo Firewire %s" + +#: ../tcos-devices-ng.py:1122 +#, python-format +msgid "Mount Firewire device %s" +msgstr "Montar dispositivo Firewire %s" + +#: ../tcos-devices-ng.py:1123 +#, python-format +msgid "Umount Firewire device %s" +msgstr "Desmontar dispositivo Firewire %s" + +#: ../tcos-devices-ng.py:1206 +#, python-format +msgid "CDROM USB device %s umounted. You can extract it." +msgstr "Dispositivo CDROM USB %s desmontado. Agora pode extraelo." + +#: ../tcos-devices-ng.py:1209 +#, python-format +msgid "CDROM USB device %s mounted. Ready for use." +msgstr "Dispositivo CDROM USB %s montado.Listo para empregar." + +#: ../tcos-devices-ng.py:1247 +#, python-format +msgid "USB device %s umounted. You can extract it." +msgstr "Dispositivo USB %s desmontado. Agora pode extraelo." + +#: ../tcos-devices-ng.py:1250 +#, python-format +msgid "USB device %s mounted. Ready for use." +msgstr "Dispositivo USB %s montado.Listo para empregar." + +#: ../tcos-devices-ng.py:1286 +#, python-format +msgid "Firewire device %s umounted. You can extract it." +msgstr "Dispositivo Firewire %s desmontado. Agora pode extraelo." + +#: ../tcos-devices-ng.py:1289 +#, python-format +msgid "Firewire device %s mounted. Ready for use." +msgstr "Dispositivo Firewire %s montado.Listo para empregar." + +#: ../tcospersonalize.py:115 +msgid "" +"Need a host to configure!!!\n" +"Try exec:\n" +" tcospersonalize --host=XXX.XXX.XXX.XXX" +msgstr "" +"¡Necesitase un enderezo de equipo a configurar!\n" +"Probe a executar:\n" +" tcospersonalize --host=XXX.XXX.XXX.XXX" + +#: ../tcospersonalize.py:190 +msgid "host: " +msgstr "equipo: " + +#: ../tcospersonalize.py:454 +msgid "Host down, can't connect to tcosxmlrpc." +msgstr "Equipo inacesíbel, non se puido conectar a tcosxmlrpc." + +#: ../tcospersonalize.py:462 +#, python-format +msgid "New %d drivers loaded from terminal." +msgstr "Cargados %d drivers dende o terminal." + +#: ../tcospersonalize.py:521 +#, python-format +msgid "Really delete config of %s?" +msgstr "¿Borrar arquivo de configuración de %s?" + +#: ../tcospersonalize.py:524 +msgid "Deleted!" +msgstr "¡Borrado!" + +#: ../tcos-volume-manager.py:101 ../tcos-volume-manager.py:113 +#, python-format +msgid "" +"Tcos Sound levels on:\n" +"%s" +msgstr "" +"Niveis de volume TCOS en equipo:\n" +"%s" + +#: ../tcos-volume-manager.py:121 +#, python-format +msgid "ERROR: It appears that TcosXmlRpc is not running on %s." +msgstr "ERRO: Parece que tcosxmlrpc non se está executando en %s" + +#: ../tcos-volume-manager.py:217 +msgid "Loading channels info..." +msgstr "Cargando información de canles..." + +#: ../tcos-volume-manager.py:230 +msgid "Error loading channels info (xauth error)" +msgstr "Erro cargando información de canles (erro de xauth)" + +#: ../tcos-volume-manager.py:233 ../ui/tcos-volume-manager.ui:8 +msgid "Tcos Volume Manager" +msgstr "Monitor de volume TCOS" + +#: ../tcos-volume-manager.py:234 +#, python-format +msgid "<span size='large'><b>Sound mixer of %s host</b></span>" +msgstr "<span size='large'><b>Mesturador de audio do equipo %s</b></span>" + +#: ../tcos-volume-manager.py:300 ../tcosmonitor/extensions/info.py:442 +msgid "Mute" +msgstr "Sen son" + +#: ../tcos-volume-manager.py:319 +msgid "Main controls ready" +msgstr "Controis principais cargados" + +#: ../tcos-volume-manager.py:323 +msgid "All remote controls loaded." +msgstr "Todos os controis remotos cargados." + +#: ../tcos-volume-manager.py:332 ../tcosmonitor/extensions/info.py:557 +#, python-format +msgid "Changing value of %(channel)s channel, to %(value)s%%..." +msgstr "Cambiando valor da canle %(channel)s, a %(value)s%%..." + +#: ../tcos-volume-manager.py:339 ../tcosmonitor/extensions/info.py:564 +#, python-format +msgid "Changed value of %(channel)s channel, to %(value)s" +msgstr "Valor cambiado da canle %(channel)s, a %(value)s" + +#: ../tcos-volume-manager.py:346 ../tcosmonitor/extensions/info.py:571 +#, python-format +msgid "Unmuting %s channel..." +msgstr "Baixando o son a canale %s..." + +#: ../tcos-volume-manager.py:351 ../tcosmonitor/extensions/info.py:576 +#, python-format +msgid "Muting %s channel..." +msgstr "Silenciado canle %s..." + +#: ../tcos-volume-manager.py:354 ../tcosmonitor/extensions/info.py:579 +#, python-format +msgid "Status of %(channel)s channel, is \"%(newvalue)s\"" +msgstr "O estado da canle %(channel)s é \"%(newvalue)s\"" + +#: ../tcosmonitor/TcosDBus.py:94 +msgid "TcosDBus not allowed in local display" +msgstr "TcosDBus non permitido en pantalla local." + +#: ../tcosmonitor/TcosDBus.py:122 +#, python-format +msgid "Seems that tcosxmlrpc isn't running on host=\"%s\"" +msgstr "Parece que tcosxmlrpc non se está executando no equipo=\"%s\"" + +#: ../tcosmonitor/TcosDBus.py:143 +msgid "tcosxmlrpc ERROR conection unavalaible." +msgstr "tcosxmlrpc ERRO conexión non disponíbel" + +#: ../tcosmonitor/TcosDBus.py:159 +msgid "ERROR conecting to tcosxmlrpc, check username and password." +msgstr "" +"ERRO non se pode conectar a tcosxmlrpc, verifique o usuario e o contrasinal." + +#: ../tcosmonitor/TcosDBus.py:251 +msgid "Message from admin" +msgstr "Mensaxe do administrador" + +#: ../tcosmonitor/TcosDBus.py:341 ../tcosmonitor/TcosDBus.py:357 +#: ../tcosmonitor/TcosDBus.py:375 ../tcosmonitor/TcosDBus.py:393 +msgid "User not allowed to run this dbus call." +msgstr "O seu usuario non ten permitidas estas chamadas dbus." + +#: ../tcosmonitor/TcosStaticHosts.py:163 ../tcosmonitor/TcosListView.py:70 +msgid "IP address" +msgstr "Enderezo IP" + +#: ../tcosmonitor/TcosStaticHosts.py:169 +#: ../ui/tcosmonitor-staticwindownew.ui:68 +msgid "MAC address" +msgstr "Enderezo MAC" + +#: ../tcosmonitor/TcosStaticHosts.py:279 +msgid "No hosts found, please click on Refresh button using another method." +msgstr "" +"Non se atoparon equipos, por favor, pulse o botón Actualizar empregando " +"outro método." + +#: ../tcosmonitor/shared.py:108 +msgid "Traditional list only" +msgstr "Só lista tradicional" + +#: ../tcosmonitor/shared.py:109 +msgid "Icons only" +msgstr "Só iconas" + +#: ../tcosmonitor/shared.py:110 +msgid "Simulate classroom" +msgstr "Simular aula" + +#: ../tcosmonitor/shared.py:111 +msgid "Lists, icons and classroom with tabs" +msgstr "Lista, iconas e modo aula con separadores" + +#: ../tcosmonitor/shared.py:270 ../tcosmonitor/shared.py:312 +#: ../tcosmonitor/TcosMenus.py:35 +msgid "Terminal actions" +msgstr "Accións para o terminal/equipo" + +#: ../tcosmonitor/shared.py:271 ../tcosmonitor/shared.py:313 +#: ../tcosmonitor/TcosMenus.py:36 +msgid "User actions" +msgstr "Accións para o usuario" + +#: ../tcosmonitor/shared.py:272 ../tcosmonitor/shared.py:314 +#: ../tcosmonitor/TcosMenus.py:37 +msgid "Audio, video and files" +msgstr "Son, vídeo e ficheiros" + +#: ../tcosmonitor/shared.py:279 ../tcosmonitor/extensions/info.py:47 +msgid "Refresh terminal info" +msgstr "Actualizar información do terminal" + +#: ../tcosmonitor/shared.py:280 ../tcosmonitor/extensions/clean.py:40 +#: ../tcosmonitor/extensions/clean.py:41 +msgid "Clean info about terminal" +msgstr "Limpar información do terminal" + +#: ../tcosmonitor/shared.py:281 ../tcosmonitor/TcosTrayIcon.py:54 +#: ../tcosmonitor/extensions/reboot.py:40 ../tcosmonitor/TcosTrayIcon2.py:58 +msgid "Reboot" +msgstr "Reiniciar" + +#: ../tcosmonitor/shared.py:282 ../tcosmonitor/TcosTrayIcon.py:55 +#: ../tcosmonitor/extensions/reboot.py:42 ../tcosmonitor/TcosTrayIcon2.py:59 +msgid "Poweroff" +msgstr "Apagar" + +#: ../tcosmonitor/shared.py:283 ../tcosmonitor/extensions/lockscreen.py:40 +msgid "Lock screen" +msgstr "Bloquear pantalla" + +#: ../tcosmonitor/shared.py:284 ../tcosmonitor/extensions/lockscreen.py:42 +msgid "Unlock screen" +msgstr "Desbloquear pantalla" + +#: ../tcosmonitor/shared.py:285 ../tcosmonitor/extensions/italc.py:43 +msgid "Connect to remote screen (iTALC)" +msgstr "Conectar a pantalla remota (iTALC)" + +#: ../tcosmonitor/shared.py:286 ../tcosmonitor/extensions/vnc.py:54 +msgid "Connect to remote screen (VNC)" +msgstr "Conectar a pantalla remota (VNC)" + +#: ../tcosmonitor/shared.py:287 ../tcosmonitor/extensions/screenshot.py:45 +msgid "Screenshot" +msgstr "Captura de pantalla" + +#: ../tcosmonitor/shared.py:288 ../tcosmonitor/extensions/remotessh.py:40 +msgid "Give a remote xterm" +msgstr "Executar un terminal xterm no cliente" + +#: ../tcosmonitor/shared.py:289 +#: ../tcosmonitor/extensions/tcospersonalize.py:40 +#: ../ui/tcosmonitor-prefwindow.ui:1324 +msgid "Configure this host" +msgstr "Configurar este equipo" + +#: ../tcosmonitor/shared.py:290 ../tcosmonitor/extensions/logout.py:40 +msgid "Logout client" +msgstr "Desconectar cliente" + +#: ../tcosmonitor/shared.py:291 ../tcosmonitor/extensions/restartxorg.py:41 +msgid "Restart X session with new settings" +msgstr "Reiniciar sesión X coa nova configuración" + +#: ../tcosmonitor/shared.py:292 ../tcosmonitor/extensions/appsmsg.py:52 +msgid "Exec app on user display" +msgstr "Executar aplicación en pantalla de usuario" + +#: ../tcosmonitor/shared.py:293 ../tcosmonitor/extensions/appsmsg.py:53 +msgid "Send a text message to user" +msgstr "Enviar unha mensaxe de texto ao usuario" + +#: ../tcosmonitor/shared.py:294 ../tcosmonitor/extensions/viewproc.py:41 +msgid "Show running apps of this client" +msgstr "Amosar aplicacións executadas por este cliente" + +#: ../tcosmonitor/shared.py:295 ../tcosmonitor/shared.py:332 +msgid "Audio/Video broadcast" +msgstr "Difusión de audio/vídeo" + +#: ../tcosmonitor/shared.py:296 ../tcosmonitor/shared.py:333 +#: ../tcosmonitor/extensions/sendfiles.py:49 +#: ../tcosmonitor/extensions/sendfiles.py:50 +#: ../ui/tcosmonitor-prefwindow.ui:1134 ../ui/tcosmonitor-prefwindow.ui:1475 +#: ../ui/tcosmonitor-mainwindow.ui:387 +msgid "Send files" +msgstr "Enviar ficheiros" + +#: ../tcosmonitor/shared.py:297 ../tcosmonitor/extensions/vnc.py:55 +msgid "Demo mode (from this host)" +msgstr "Modo demo (dende este equipo)" + +#: ../tcosmonitor/shared.py:298 ../tcosmonitor/extensions/wakeonlan.py:41 +msgid "Boot client (WakeOnLan)" +msgstr "Arrancar cliente (WakeOnLan)" + +#: ../tcosmonitor/shared.py:299 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:38 +msgid "Lock internet" +msgstr "Bloquear internet" + +#: ../tcosmonitor/shared.py:300 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:39 +msgid "Unlock internet" +msgstr "Desbloquear internet" + +#: ../tcosmonitor/shared.py:301 ../tcosmonitor/extensions/dpms.py:40 +msgid "DPMS Power off monitor" +msgstr "DPMS apagar monitor" + +#: ../tcosmonitor/shared.py:302 ../tcosmonitor/extensions/dpms.py:42 +msgid "DPMS Power on monitor" +msgstr "DPMS acender monitor" + +#: ../tcosmonitor/shared.py:303 +msgid "Send MIC audio (from this host)" +msgstr "Enviar son do micrófono (dende este equipo)" + +#: ../tcosmonitor/shared.py:321 ../tcosmonitor/extensions/reboot.py:41 +msgid "Reboot all clients" +msgstr "Reiniciar todos os clientes" + +#: ../tcosmonitor/shared.py:322 ../tcosmonitor/extensions/reboot.py:43 +msgid "Poweroff all clients" +msgstr "Apagar todos os clientes" + +#: ../tcosmonitor/shared.py:323 ../tcosmonitor/extensions/lockscreen.py:41 +msgid "Lock all screens" +msgstr "Bloquear todas as pantallas" + +#: ../tcosmonitor/shared.py:324 ../tcosmonitor/extensions/lockscreen.py:43 +msgid "Unlock all screens" +msgstr "Desbloquear todas as pantallas" + +#: ../tcosmonitor/shared.py:325 ../tcosmonitor/extensions/logout.py:41 +msgid "Logout clients" +msgstr "Desconectar todos os clientes" + +#: ../tcosmonitor/shared.py:326 ../tcosmonitor/extensions/restartxorg.py:42 +msgid "Restart X session of all clients" +msgstr "Reiniciar sesión X de todos os clientes" + +#: ../tcosmonitor/shared.py:327 ../tcosmonitor/extensions/appsmsg.py:55 +msgid "Exec same app in all connected users" +msgstr "Executar mesma aplicación en todos os usuarios conectados" + +#: ../tcosmonitor/shared.py:328 ../tcosmonitor/extensions/appsmsg.py:56 +msgid "Send a text message to all connected users" +msgstr "Enviar unha mensaxe de texto a todos os usuarios conectados" + +#: ../tcosmonitor/shared.py:329 ../tcosmonitor/extensions/vnc.py:57 +msgid "Enter demo mode, all connected users see my screen" +msgstr "Entrar en modo demostración, todos os usuarios ven a miña pantalla" + +#: ../tcosmonitor/shared.py:330 +msgid "Enter conference mode, all connected users can hear me" +msgstr "Entrar en modo conferencia, todos os usuarios poden escoitarme" + +#: ../tcosmonitor/shared.py:331 ../tcosmonitor/extensions/screenshot.py:46 +msgid "Capture All clients screens" +msgstr "Capturar todas as pantallas" + +#: ../tcosmonitor/shared.py:334 ../tcosmonitor/extensions/wakeonlan.py:42 +msgid "Boot All clients (WakeOnLan)" +msgstr "Arrancar todos os clientes (WakeOnLan)" + +#: ../tcosmonitor/shared.py:335 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:41 +msgid "Lock internet in all connected users" +msgstr "Bloquear internet a todos os usuarios conectados" + +#: ../tcosmonitor/shared.py:336 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:42 +msgid "Unlock internet in all connected users" +msgstr "Desbloquear internet a todos os usuarios conectados" + +#: ../tcosmonitor/shared.py:337 ../tcosmonitor/extensions/dpms.py:41 +msgid "DPMS Power off monitors" +msgstr "DPMS apagar todos os monitores" + +#: ../tcosmonitor/shared.py:338 ../tcosmonitor/extensions/dpms.py:43 +msgid "DPMS Power on monitors" +msgstr "DPMS acender todos os monitores" + +#: ../tcosmonitor/shared.py:339 +msgid "Chat audio conference" +msgstr "Chat audio conferencia" + +#: ../tcosmonitor/shared.py:340 ../tcosmonitor/extensions/livevnc.py:51 +#: ../ui/tcosmonitor-prefwindow.ui:1342 +msgid "Live view screens with VNC" +msgstr "" + +#: ../tcosmonitor/shared.py:538 +#, python-format +msgid "QUESTION: %(txt)s, RESPONSE %(response)s" +msgstr "PREGUNTA: %(txt)s, RESPOSTA %(response)s" + +#: ../tcosmonitor/shared.py:555 ../tcosmonitor/shared.py:566 +#, python-format +msgid "INFO: %s" +msgstr "INFO: %s" + +#: ../tcosmonitor/shared.py:577 +#, python-format +msgid "ERROR: %s" +msgstr "ERRO: %s" + +#: ../tcosmonitor/TcosClassView.py:50 ../tcosmonitor/TcosIconView.py:47 +msgid "IP" +msgstr "IP" + +#: ../tcosmonitor/TcosClassView.py:51 ../tcosmonitor/TcosIconView.py:48 +#: ../tcosmonitor/TcosListView.py:64 +msgid "Hostname" +msgstr "Equipo" + +#: ../tcosmonitor/TcosClassView.py:52 ../tcosmonitor/TcosIconView.py:49 +#: ../tcosmonitor/TcosListView.py:76 +msgid "Username" +msgstr "Usuario" + +#: ../tcosmonitor/TcosClassView.py:53 ../tcosmonitor/TcosIconView.py:50 +#: ../tcosmonitor/TcosListView.py:87 +msgid "Logged" +msgstr "Logueado" + +#: ../tcosmonitor/TcosClassView.py:54 ../tcosmonitor/TcosIconView.py:51 +#: ../tcosmonitor/TcosListView.py:103 +msgid "Time log in" +msgstr "Tempo dentro" + +#: ../tcosmonitor/TcosClassView.py:55 ../tcosmonitor/TcosIconView.py:52 +msgid "Screen locked" +msgstr "Pantalla bloqueada" + +#: ../tcosmonitor/TcosClassView.py:56 ../tcosmonitor/TcosIconView.py:53 +msgid "Network locked" +msgstr "Rede bloqueada" + +#: ../tcosmonitor/TcosClassView.py:58 +msgid "" +"Place mouse on any computer to see brief info about it.\n" +"You can select and unselect multiple host clicking on every one.\n" +"Drag and drop hosts to positions and save clicking on right mouse button." +msgstr "" +"Mova o rato sobre cada equipo para obter unha breve información de cada un.\n" +"Pode seleccionar e desseleccionar varios pulsando en cada un.\n" +"Arrastre e solte os equipos as posicións e gardeas pulsando co botón dereito." + +#: ../tcosmonitor/TcosClassView.py:179 +msgid "Positions reset to defaults." +msgstr "Posicións reseteadas por defecto." + +#: ../tcosmonitor/TcosClassView.py:197 +msgid "Positions saved." +msgstr "Posicións gardadas." + +#: ../tcosmonitor/TcosClassView.py:323 +#, python-format +msgid "%s is not a valid file to exe or send" +msgstr "%s non é un ficheiro válido para executar ou enviar" + +#: ../tcosmonitor/TcosClassView.py:409 ../tcosmonitor/TcosIconView.py:156 +msgid "yes" +msgstr "si" + +#: ../tcosmonitor/TcosClassView.py:411 ../tcosmonitor/TcosIconView.py:158 +msgid "no" +msgstr "non" + +#: ../tcosmonitor/TcosTrayIcon.py:49 ../tcosmonitor/extensions/vnc.py:298 +#: ../tcosmonitor/TcosTrayIcon2.py:53 ../ui/tcosmonitor-mainwindow.ui:23 +msgid "Quit" +msgstr "Saír" + +#: ../tcosmonitor/TcosTrayIcon.py:65 +msgid "TcosDevices" +msgstr "Dispositivos TCOS" + +#: ../tcosmonitor/TcosTrayIcon.py:172 ../tcosmonitor/TcosTrayIcon.py:186 +#: ../tcosmonitor/TcosTrayIcon2.py:67 +msgid "Tcos Devices" +msgstr "Dispositivos TCOS" + +#: ../tcosmonitor/TcosTrayIcon.py:232 ../tcosmonitor/TcosTrayIcon2.py:351 +msgid "Usb flash" +msgstr "Memoria USB flash" + +#: ../tcosmonitor/TcosTrayIcon.py:234 ../tcosmonitor/TcosTrayIcon2.py:353 +msgid "Mount USB1" +msgstr "Montar USB1" + +#: ../tcosmonitor/TcosTrayIcon.py:235 ../tcosmonitor/TcosTrayIcon2.py:354 +msgid "Umount USB1" +msgstr "Desmontar USB1" + +#: ../tcosmonitor/extensions/lockscreen.py:49 +#: ../tcosmonitor/extensions/lockscreen.py:57 +msgid "" +"Can't connect to tcosxmlrpc.\n" +"Please verify user and password in prefences!" +msgstr "" +"Non se pode conectar a tcosxmlrpc.\n" +"Por favor verifique o usuario e o contrasinal nas preferencias." + +#: ../tcosmonitor/extensions/lockscreen.py:81 +#, fuzzy, python-format +msgid "Do you want to lock the following screens: %s?" +msgstr "¿Quere bloquear a pantalla dos seguintes equipos: %s ?" + +#: ../tcosmonitor/extensions/lockscreen.py:90 +#, fuzzy, python-format +msgid "Do you want to unlock the following screens: %s?" +msgstr "¿Quere desbloquear a pantalla dos seguintes equipos: %s ?" + +#: ../tcosmonitor/extensions/appsmsg.py:64 +msgid "Clients not connected" +msgstr "Non hai usuarios conectados" + +#: ../tcosmonitor/extensions/appsmsg.py:87 +#, fuzzy, python-format +msgid "" +"<b>Exec app in user(s) screen(s)\n" +"or open web address to:</b>\n" +"%s" +msgstr "" +"<b>Executar aplicación en pantalla de usuario(s) ou abrir enderezo web:</b>\n" +"%s" + +#: ../tcosmonitor/extensions/appsmsg.py:89 +#, python-format +msgid "" +"<b>Send a message to:</b>\n" +"%s" +msgstr "" +"<b>Enviar mensaxe a:</b>\n" +"%s" + +#: ../tcosmonitor/extensions/appsmsg.py:122 +#: ../tcosmonitor/extensions/appsmsg.py:163 +msgid "Can't exec application, user is not logged" +msgstr "Non se poden executar aplicacións, o usuario non está conectado" + +#: ../tcosmonitor/extensions/appsmsg.py:141 +#: ../tcosmonitor/extensions/appsmsg.py:152 +#, python-format +msgid "%s is not a valid application" +msgstr "%s non é unha aplicación válida" + +#: ../tcosmonitor/extensions/appsmsg.py:172 +msgid "Can't send message, user is not logged" +msgstr "Non se poden enviar mensaxes, o usuario non está conectado" + +#: ../tcosmonitor/extensions/appsmsg.py:289 +#: ../tcosmonitor/extensions/appsmsg.py:298 +#, python-format +msgid "%s is not application" +msgstr "%s non é unha aplicación" + +#: ../tcosmonitor/extensions/appsmsg.py:353 +#, python-format +msgid "" +"Error while exec remote app:\n" +"Reason: %s" +msgstr "" +"Erro cando se executaba a aplicación remota:\n" +"Razón: %s" + +#: ../tcosmonitor/extensions/appsmsg.py:360 +#, python-format +msgid "" +"Error while send message:\n" +"Reason: %s" +msgstr "" +"Erro cando se enviaba mensaxe:\n" +"Razón: %s" + +#: ../tcosmonitor/extensions/remotessh.py:47 +msgid "Enter password of remote thin client (if asked for it)" +msgstr "Introduza o contrasinal do cliente remoto (se preguntase)" + +#: ../tcosmonitor/extensions/dpms.py:79 +#, fuzzy, python-format +msgid "Do you want to switch off the following monitors: %s?" +msgstr "¿Quere apagar os seguintes monitores: %s?" + +#: ../tcosmonitor/extensions/dpms.py:88 +#, fuzzy, python-format +msgid "Do you want to switch on the following monitors: %s?" +msgstr "¿Quere acender os seguintes equipos: %s?" + +#: ../tcosmonitor/extensions/screenshot.py:66 +#: ../tcosmonitor/extensions/screenshot.py:83 +#, python-format +msgid "Can't make screenshot, error: %s" +msgstr "Non se puido facer unha captura de pantalla, erro: %s" + +#: ../tcosmonitor/extensions/screenshot.py:75 +msgid "Trying to order terminal to do a screenshot..." +msgstr "Intentando mandar ao terminal que se faga unha captura de pantalla" + +#: ../tcosmonitor/extensions/screenshot.py:87 +msgid "Get another screenshot" +msgstr "Facer outra captura de pantalla" + +#: ../tcosmonitor/extensions/screenshot.py:102 +#, python-format +msgid "Screenshot of <span style='font-style: italic'>%s</span>" +msgstr "Captura de pantalla de <span style='font-style: italic'>%s</span>" + +#: ../tcosmonitor/extensions/screenshot.py:125 +#, python-format +msgid "Screenshot of %s, done." +msgstr "Captura de pantalla de %s hecha." + +#: ../tcosmonitor/extensions/screenshot.py:139 +msgid "Save Screenshot" +msgstr "Gardar captura de pantalla" + +#: ../tcosmonitor/extensions/screenshot.py:151 +msgid "Select file to save screenshot..." +msgstr "Seleccionar arquivo para gardar captura de pantalla..." + +#: ../tcosmonitor/extensions/screenshot.py:155 +#, python-format +msgid "screenshot_of_%(hostname)s_date_%(date)s.png" +msgstr "captura_de_%(hostname)s_data_%(date)s.png" + +#: ../tcosmonitor/extensions/screenshot.py:159 +msgid "Image Files ( *.png, *.jpg)" +msgstr "Ficheiros de imaxe (*.png, *.jpg)" + +#: ../tcosmonitor/extensions/screenshot.py:169 +msgid "File must be png or jpg." +msgstr "O ficheiro debe ser png o jpg." + +#: ../tcosmonitor/extensions/screenshot.py:192 +msgid "Screenshots of all hosts" +msgstr "Captura de pantalla de todos os equipos" + +#: ../tcosmonitor/extensions/screenshot.py:208 +#, python-format +msgid "Screenshot of %s" +msgstr "Captura de pantalla de %s" + +#: ../tcosmonitor/extensions/sendfiles.py:62 +#: ../tcosmonitor/extensions/sendfiles.py:120 +msgid "Can't send files, user is not logged" +msgstr "Non se poden enviar ficheiros, o usuario non está conectado" + +#: ../tcosmonitor/extensions/sendfiles.py:66 +#: ../tcosmonitor/extensions/sendfiles.py:142 +#: ../tcosmonitor/extensions/sendfiles.py:237 +msgid "" +"TcosMonitor need special configuration for rsync daemon to send files.\n" +"\n" +"Please read configuration requeriments in:\n" +"/usr/share/doc/tcosmonitor/README.rsync" +msgstr "" +"TcosMonitor necesita unha configuración especial do demonio rsync para envio " +"de ficheiros.\n" +"\n" +"Le a configuración requerida en:\n" +"/usr/share/doc/tcosmonitor/README.rsync" + +#: ../tcosmonitor/extensions/sendfiles.py:84 +#: ../tcosmonitor/extensions/sendfiles.py:176 +#: ../tcosmonitor/extensions/sendfiles.py:270 +msgid "Waiting for send files..." +msgstr "Esperando ao envío de ficheiros..." + +#: ../tcosmonitor/extensions/sendfiles.py:93 +#: ../tcosmonitor/extensions/sendfiles.py:95 +#: ../tcosmonitor/extensions/sendfiles.py:99 +#: ../tcosmonitor/extensions/sendfiles.py:108 +#: ../tcosmonitor/extensions/sendfiles.py:189 +#: ../tcosmonitor/extensions/sendfiles.py:191 +#: ../tcosmonitor/extensions/sendfiles.py:195 +#: ../tcosmonitor/extensions/sendfiles.py:204 +#: ../tcosmonitor/extensions/sendfiles.py:283 +#: ../tcosmonitor/extensions/sendfiles.py:285 +#: ../tcosmonitor/extensions/sendfiles.py:289 +#: ../tcosmonitor/extensions/sendfiles.py:298 +msgid "Teacher" +msgstr "Profesor" + +#: ../tcosmonitor/extensions/sendfiles.py:95 +#: ../tcosmonitor/extensions/sendfiles.py:108 +#: ../tcosmonitor/extensions/sendfiles.py:191 +#: ../tcosmonitor/extensions/sendfiles.py:204 +#: ../tcosmonitor/extensions/sendfiles.py:285 +#: ../tcosmonitor/extensions/sendfiles.py:298 +#, python-format +msgid "" +"Teacher has sent some files to %(teacher)s folder:\n" +"\n" +"%(basenames)s" +msgstr "" +"O profesor envioulle varios ficheiros ao cartafol %(teacher)s:\n" +"\n" +"%(basenames)s" + +#: ../tcosmonitor/extensions/sendfiles.py:104 +#: ../tcosmonitor/extensions/sendfiles.py:200 +#: ../tcosmonitor/extensions/sendfiles.py:294 +#: ../tcosmonitor/extensions/reboot.py:108 +#: ../tcosmonitor/extensions/videolan.py:194 +#: ../tcosmonitor/extensions/videolan.py:389 +#: ../tcosmonitor/extensions/videolan.py:629 +#, python-format +msgid "" +"Error while exec remote app:\n" +"Reason:%s" +msgstr "" +"Erro cando se executaba a aplicación remota:\n" +"Razón: %s" + +#: ../tcosmonitor/extensions/sendfiles.py:105 +#: ../tcosmonitor/extensions/sendfiles.py:201 +#: ../tcosmonitor/extensions/sendfiles.py:295 +msgid "Error creating destination folder." +msgstr "Erro creando o cartafol de destino." + +#: ../tcosmonitor/extensions/sendfiles.py:110 +#: ../tcosmonitor/extensions/sendfiles.py:205 +#: ../tcosmonitor/extensions/sendfiles.py:300 +msgid "Files sent." +msgstr "Ficheiros enviados." + +#: ../tcosmonitor/extensions/sendfiles.py:125 +#: ../tcosmonitor/extensions/sendfiles.py:220 +msgid "Select file or files..." +msgstr "Seleccionar ficheiro ou ficheiros..." + +#: ../tcosmonitor/extensions/sendfiles.py:178 +#: ../tcosmonitor/extensions/sendfiles.py:272 +msgid "Do you want open file(s) on client?" +msgstr "¿Quere abrir o ficheiro(s) no cliente?" + +#: ../tcosmonitor/extensions/sendfiles.py:215 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:113 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:155 +#: ../tcosmonitor/extensions/videolan.py:457 +#: ../tcosmonitor/extensions/vnc.py:68 ../tcosmonitor/extensions/vnc.py:112 +#: ../tcosmonitor/extensions/vnc.py:422 +#: ../tcosmonitor/extensions/audiortp.py:229 +#: ../tcosmonitor/extensions/audiortp.py:275 +#: ../tcosmonitor/extensions/audiortp.py:373 +#: ../tcosmonitor/extensions/audiortp.py:407 +#: ../tcosmonitor/extensions/audiortp.py:460 +msgid "No users logged." +msgstr "Non hai usuarios conectados." + +#: ../tcosmonitor/extensions/info.py:91 +#, python-format +msgid "Connecting with %s to retrieve some info..." +msgstr "Conectando a %s para recibir información..." + +#: ../tcosmonitor/extensions/info.py:117 +msgid "Tcos info" +msgstr "Información de Tcos" + +#: ../tcosmonitor/extensions/info.py:120 +msgid "PXES info" +msgstr "Información de PXES" + +#: ../tcosmonitor/extensions/info.py:123 +msgid "LTSP info" +msgstr "Información de LTSP" + +#: ../tcosmonitor/extensions/info.py:126 +msgid "Standalone info" +msgstr "Información do equipo autónomo" + +#: ../tcosmonitor/extensions/info.py:129 +msgid "Unknow client info" +msgstr "Información de cliente descoñecido" + +#: ../tcosmonitor/extensions/info.py:135 ../tcosmonitor/LocalData.py:43 +#: ../tcosmonitor/LocalData.py:62 ../tcosmonitor/TcosCommon.py:182 +#: ../tcosmonitor/TcosCommon.py:190 ../tcosmonitor/TcosCommon.py:206 +#: ../tcosmonitor/TcosCommon.py:209 +msgid "unknow" +msgstr "descoñecido" + +#: ../tcosmonitor/extensions/info.py:138 +msgid "Hostname: " +msgstr "Equipo: " + +#: ../tcosmonitor/extensions/info.py:139 +msgid "Ip address: " +msgstr "Enderezo IP: " + +#: ../tcosmonitor/extensions/info.py:140 +msgid "TcosXmlRpc version: " +msgstr "Versión de TcosXmlRpc: " + +#: ../tcosmonitor/extensions/info.py:149 +msgid "Tcos image version: " +msgstr "Versión da imaxe TCOS: " + +#: ../tcosmonitor/extensions/info.py:150 +msgid "Tcos image date: " +msgstr "Data da imaxe TCOS: " + +#: ../tcosmonitor/extensions/info.py:151 +msgid "Date of thin client: " +msgstr "Data e hora do cliente lixeiro: " + +#: ../tcosmonitor/extensions/info.py:152 +msgid "Uptime: " +msgstr "Tempo acendido: " + +#: ../tcosmonitor/extensions/info.py:163 +msgid "Kernel info" +msgstr "Información do núcleo" + +#: ../tcosmonitor/extensions/info.py:172 +msgid "Force download and mount all modules" +msgstr "Forzar descarga e montaxe de todos os módulos" + +#: ../tcosmonitor/extensions/info.py:183 +msgid "None" +msgstr "Ningún" + +#: ../tcosmonitor/extensions/info.py:186 +msgid "Kernel version: " +msgstr "Versión do núcleo: " + +#: ../tcosmonitor/extensions/info.py:187 +msgid "Kernel complete version: " +msgstr "Versión completa do núcleo: " + +#: ../tcosmonitor/extensions/info.py:188 +msgid "Loaded Modules: " +msgstr "Módulos cargados: " + +#: ../tcosmonitor/extensions/info.py:189 +msgid "Modules not found: " +msgstr "Módulos non atopados: " + +#: ../tcosmonitor/extensions/info.py:205 +msgid "Cpu info: " +msgstr "Información da CPU: " + +#: ../tcosmonitor/extensions/info.py:212 +msgid "Cpu model: " +msgstr "Modelo de CPU: " + +#: ../tcosmonitor/extensions/info.py:213 +msgid "Cpu vendor: " +msgstr "Fabricante de CPU: " + +#: ../tcosmonitor/extensions/info.py:214 +msgid "Cpu speed: " +msgstr "Velocidade de CPU: " + +#: ../tcosmonitor/extensions/info.py:225 +msgid "PCI buses: " +msgstr "Buses PCI: " + +#: ../tcosmonitor/extensions/info.py:254 +msgid "Process running: " +msgstr "Procesos executándose" + +#: ../tcosmonitor/extensions/info.py:267 +msgid "Ram info: " +msgstr "Información da ram:" + +#: ../tcosmonitor/extensions/info.py:274 +msgid "Total Ram: " +msgstr "RAM total: " + +#: ../tcosmonitor/extensions/info.py:275 +msgid "Free RAM: " +msgstr "RAM libre: " + +#: ../tcosmonitor/extensions/info.py:276 +msgid "Active RAM: " +msgstr "RAM activa: " + +#: ../tcosmonitor/extensions/info.py:279 +msgid "Swap info: " +msgstr "Información da swap: " + +#: ../tcosmonitor/extensions/info.py:285 +msgid "Swap enabled: " +msgstr "Swap activada: " + +#: ../tcosmonitor/extensions/info.py:286 +msgid "Total Swap: " +msgstr "Swap total: " + +#: ../tcosmonitor/extensions/info.py:287 +msgid "Used Swap: " +msgstr "Swap empregada: " + +#: ../tcosmonitor/extensions/info.py:297 +msgid "Network info: " +msgstr "Información da rede:" + +#: ../tcosmonitor/extensions/info.py:307 +msgid "Network hostname: " +msgstr "Nome de máquina: " + +#: ../tcosmonitor/extensions/info.py:308 +msgid "Network IP: " +msgstr "Enderezo ip: " + +#: ../tcosmonitor/extensions/info.py:309 +msgid "Network MASK: " +msgstr "Máscara de rede: " + +#: ../tcosmonitor/extensions/info.py:310 +msgid "Network MAC: " +msgstr "Número de MAC: " + +#: ../tcosmonitor/extensions/info.py:311 +msgid "Data received(rx): " +msgstr "Datos recibidos(rx): " + +#: ../tcosmonitor/extensions/info.py:312 +msgid "Data send(tx): " +msgstr "Datos enviados(tx): " + +#: ../tcosmonitor/extensions/info.py:322 ../ui/tcosmonitor-prefwindow.ui:911 +msgid "Xorg info" +msgstr "Información de Xorg" + +#: ../tcosmonitor/extensions/info.py:348 +msgid "enabled" +msgstr "activado" + +#: ../tcosmonitor/extensions/info.py:350 +msgid "disabled" +msgstr "desactivado" + +#: ../tcosmonitor/extensions/info.py:353 ../ui/tcospersonalize.ui:159 +msgid "X Session Type" +msgstr "Tipo de sesión gráfica" + +#: ../tcosmonitor/extensions/info.py:355 ../ui/tcospersonalize.ui:201 +msgid "Xorg Driver" +msgstr "Driver de Xorg" + +#: ../tcosmonitor/extensions/info.py:357 ../ui/tcospersonalize.ui:94 +msgid "Xorg Resolution" +msgstr "Resolución de Xorg" + +#: ../tcosmonitor/extensions/info.py:359 ../ui/tcospersonalize.ui:133 +msgid "Xorg Color depth" +msgstr "Profundidade de cor de Xorg" + +#: ../tcosmonitor/extensions/info.py:361 ../ui/tcospersonalize.ui:179 +msgid "DPMS energy monitor control" +msgstr "Control de enerxía do monitor DPMS" + +#: ../tcosmonitor/extensions/info.py:363 +msgid "Disable kill X with Ctrl+Alt+Backspace" +msgstr "Desactivar matar Xorg con Ctrl+Alt+Backspace" + +#: ../tcosmonitor/extensions/info.py:365 ../ui/tcospersonalize.ui:57 +msgid "Enable mouse wheel" +msgstr "Activar roda do rato" + +#: ../tcosmonitor/extensions/info.py:367 +msgid "Refresh rate" +msgstr "Tasa de Refresco" + +#: ../tcosmonitor/extensions/info.py:369 +msgid "Xorg font server" +msgstr "Servidor de fontes de Xorg" + +#: ../tcosmonitor/extensions/info.py:371 +msgid "Mouse device" +msgstr "Dispositivo do rato" + +#: ../tcosmonitor/extensions/info.py:373 +msgid "Mouse protocol" +msgstr "Protocolo do rato" + +#: ../tcosmonitor/extensions/info.py:375 ../ui/tcospersonalize.ui:273 +msgid "X Horiz sync" +msgstr "Sincronización horizontal" + +#: ../tcosmonitor/extensions/info.py:377 ../ui/tcospersonalize.ui:284 +msgid "X Vert sync" +msgstr "Sincronización vertical" + +#: ../tcosmonitor/extensions/info.py:390 +msgid "PulseAudio Sound server is running" +msgstr "O servidor PulseAudio está funcionando" + +#: ../tcosmonitor/extensions/info.py:408 +msgid "Remote Sound Mixer" +msgstr "Mesturador de son remoto" + +#: ../tcosmonitor/extensions/info.py:480 +msgid "PulseAudio Control" +msgstr "Control de PulseAudio" + +#: ../tcosmonitor/extensions/info.py:485 +msgid "PulseAudio Meter" +msgstr "Niveis de PulseAudio " + +#: ../tcosmonitor/extensions/info.py:490 +msgid "PulseAudio Manager" +msgstr "Xestor de PulseAudio" + +#: ../tcosmonitor/extensions/info.py:494 +msgid "PulseAudio utils: " +msgstr "Utilidades de PulseAudio: " + +#: ../tcosmonitor/extensions/info.py:500 +msgid "PulseAudio stats" +msgstr "Estatísticas de PulseAudio: " + +#: ../tcosmonitor/extensions/info.py:512 +msgid "Currently in use" +msgstr "Actualmente en uso" + +#: ../tcosmonitor/extensions/info.py:513 +msgid "Allocated during whole lifetime" +msgstr "Asignado durante execución" + +#: ../tcosmonitor/extensions/info.py:514 +msgid "Sample cache size" +msgstr "Tamaño da caché" + +#: ../tcosmonitor/extensions/info.py:515 +msgid "User name" +msgstr "Nome de usuario" + +#: ../tcosmonitor/extensions/info.py:516 +msgid "Host Name" +msgstr "Nome do equipo" + +#: ../tcosmonitor/extensions/info.py:517 +msgid "Server Name" +msgstr "Nome do servidor" + +#: ../tcosmonitor/extensions/info.py:518 +msgid "Server Version" +msgstr "Versión do servidor pulseaudio" + +#: ../tcosmonitor/extensions/info.py:519 +msgid "Default Sample Specification" +msgstr "Especificación da mostra" + +#: ../tcosmonitor/extensions/info.py:520 +msgid "Default Sink" +msgstr "Saída de audio por defecto" + +#: ../tcosmonitor/extensions/info.py:521 +msgid "Default Source" +msgstr "Entrada de audio por defecto" + +#: ../tcosmonitor/extensions/info.py:522 +msgid "Cookie" +msgstr "Cookie" + +#: ../tcosmonitor/extensions/info.py:528 +msgid "Sound server is not running" +msgstr "O servidor PulseAudio non se está executando" + +#: ../tcosmonitor/extensions/info.py:589 ../tcosmonitor/extensions/info.py:597 +#: ../tcosmonitor/extensions/info.py:605 +msgid "PulseAudio apps need /dev/shm." +msgstr "PulseAudio necesita /dev/shm" + +#: ../tcosmonitor/extensions/logout.py:48 +#: ../tcosmonitor/extensions/logout.py:71 +#, fuzzy +msgid "User not logged" +msgstr "Usuario non conectado." + +#: ../tcosmonitor/extensions/logout.py:51 +#, fuzzy, python-format +msgid "Do you want to logout user: %s?" +msgstr "¿Quere desconectar ao usuario \"%s\"?" + +#: ../tcosmonitor/extensions/logout.py:55 +#: ../tcosmonitor/extensions/logout.py:77 +#, python-format +msgid "Session will close in %s seconds" +msgstr "A sesión pecharase en %s segundos" + +#: ../tcosmonitor/extensions/logout.py:73 +#, fuzzy, python-format +msgid "Do you want to logout the following users: %s?" +msgstr "¿Quere desconectar aos seguintes usuarios: %s ?" + +#: ../tcosmonitor/extensions/reboot.py:48 +#, fuzzy, python-format +msgid "Do you want to reboot: %s?" +msgstr "¿Quere reiniciar o equipo %s ?" + +#: ../tcosmonitor/extensions/reboot.py:51 +#: ../tcosmonitor/extensions/reboot.py:61 +#, python-format +msgid "Pc will reboot in %s seconds" +msgstr "O equipo reiniciarase en %s segundos" + +#: ../tcosmonitor/extensions/reboot.py:58 +#, fuzzy, python-format +msgid "Do you want to reboot the following clients: %s?" +msgstr "¿Quere reiniciar os seguintes equipos: %s ?" + +#: ../tcosmonitor/extensions/reboot.py:67 +#, fuzzy, python-format +msgid "Do you want to poweroff: %s?" +msgstr "¿Quere apagar o equipo %s?" + +#: ../tcosmonitor/extensions/reboot.py:70 +#: ../tcosmonitor/extensions/reboot.py:80 +#, python-format +msgid "Pc will shutdown in %s seconds" +msgstr "O equipo apagarase en %s segundos" + +#: ../tcosmonitor/extensions/reboot.py:77 +#, fuzzy, python-format +msgid "Do you want to poweroff the following clients: %s?" +msgstr "¿Quere apagar os seguintes equipos: %s?" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:50 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:109 +msgid "Internet connection has been disabled" +msgstr "A conexión de internet foi desactivada" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:54 +msgid "Can't disable internet, user is not logged" +msgstr "Non se pode desactivar internet, o usuario non está conectado" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:59 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:85 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:103 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:147 +#, python-format +msgid "" +"In order to lock and unlock internet you need to be in 'tcos' group.\n" +"\n" +"Exe by root: adduser %s tcos" +msgstr "" +"Para poder bloquear e desbloquear internet necesita pertencer ao grupo " +"'tcos'.\n" +"\n" +"Execute como root: adduser %s tcos" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:77 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:151 +msgid "Internet connection has been enabled" +msgstr "A conexión a internet foi activada" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:81 +msgid "Can't enable internet, user is not logged" +msgstr "Non se pode activar internet, o usuario non está conectado" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:116 +#, fuzzy, python-format +msgid "Do you want disable internet to following users: %s?" +msgstr "¿Quere desactivar internet aos seguintes usuarios: %s ?" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:158 +#, python-format +msgid "Do you want enable internet to following users:%s?" +msgstr "¿Quere activar internet aos seguintes usuarios: %s ?" + +#: ../tcosmonitor/extensions/videolan.py:48 +#: ../tcosmonitor/extensions/videolan.py:49 +#, fuzzy +msgid "Send Audio/Video broadcast" +msgstr "Difusión de audio/vídeo" + +#: ../tcosmonitor/extensions/videolan.py:65 +#: ../tcosmonitor/extensions/videolan.py:219 +msgid "Can't send video broadcast, user is not logged" +msgstr "Non se pode enviar a difusión de vídeo, o usuario non está conectado" + +#: ../tcosmonitor/extensions/videolan.py:149 +#: ../tcosmonitor/extensions/videolan.py:347 +#: ../tcosmonitor/extensions/videolan.py:578 +#, python-format +msgid "" +"Not allowed white spaces in \"%s\".\n" +"Please rename it." +msgstr "" +"Non se permiten espazos en \"%s\".\n" +"Por favor, renomeo." + +#: ../tcosmonitor/extensions/videolan.py:159 +#: ../tcosmonitor/extensions/videolan.py:359 +#: ../tcosmonitor/extensions/videolan.py:594 +msgid "Waiting for start video transmission..." +msgstr "Esperando arranque do modo difusión de vídeo..." + +#: ../tcosmonitor/extensions/videolan.py:167 +#: ../tcosmonitor/extensions/videolan.py:367 +#: ../tcosmonitor/extensions/videolan.py:602 +#: ../tcosmonitor/extensions/vnc.py:98 ../tcosmonitor/extensions/vnc.py:407 +msgid "Error while exec app" +msgstr "Erro cando se executaba a aplicación" + +#: ../tcosmonitor/extensions/videolan.py:199 +#: ../tcosmonitor/extensions/videolan.py:393 +#: ../tcosmonitor/extensions/videolan.py:634 +msgid "Running in broadcast video transmission." +msgstr "Modo difusión de vídeo activo." + +#: ../tcosmonitor/extensions/videolan.py:208 +#: ../tcosmonitor/extensions/videolan.py:402 +#, python-format +msgid "" +"Running in broadcast video transmission to user %(host)s. Broadcast Nº %" +"(count)s" +msgstr "" +"Executándose en modo de difusión de vídeo ao cliente %(host)s. Broadcast Nº %" +"(count)s" + +#: ../tcosmonitor/extensions/videolan.py:311 +#: ../tcosmonitor/extensions/videolan.py:541 +msgid "Select audio/video file.." +msgstr "Seleccionar ficheiro de audio/vídeo..." + +#: ../tcosmonitor/extensions/videolan.py:314 +#: ../tcosmonitor/extensions/videolan.py:544 +msgid "Play DVD" +msgstr "Reproducir DVD" + +#: ../tcosmonitor/extensions/videolan.py:315 +#: ../tcosmonitor/extensions/videolan.py:545 +msgid "Play SVCD/VCD" +msgstr "Reproducir SVCD/VCD" + +#: ../tcosmonitor/extensions/videolan.py:316 +#: ../tcosmonitor/extensions/videolan.py:546 +msgid "Play AudioCD" +msgstr "Reproducir AudioCD" + +#: ../tcosmonitor/extensions/videolan.py:361 +#: ../tcosmonitor/extensions/videolan.py:596 +msgid "" +"First select the DVD chapter or play movie\n" +"then press enter to send clients..." +msgstr "" +"Primeiro seleccione o capítulo do DVD ou reproduza o vídeo\n" +"despois, presione «enter» para envia-lo aos clientes..." + +#: ../tcosmonitor/extensions/videolan.py:370 +msgid "Lock keyboard and mouse on client?" +msgstr "¿Bloquear teclado e rato do cliente?" + +#: ../tcosmonitor/extensions/videolan.py:444 +msgid "Video broadcast stopped." +msgstr "Difusión de vídeo parada." + +#: ../tcosmonitor/extensions/videolan.py:605 +msgid "Lock keyboard and mouse on clients?" +msgstr "¿Bloquear teclado e rato nos clientes?" + +#: ../tcosmonitor/extensions/videolan.py:643 +#, python-format +msgid "Running in broadcast video transmission. Broadcast Nº %s" +msgstr "Executándose en modo difusión de vídeo. Broadcast Nº %s" + +#: ../tcosmonitor/extensions/restartxorg.py:51 +#, python-format +msgid "Restart X session of %s with new config?" +msgstr "¿Reiniciar sesión X de %s coa nova configuración?" + +#: ../tcosmonitor/extensions/restartxorg.py:64 +#, python-format +msgid "%s is not supported to restart Xorg!" +msgstr "¡%s non permite reiniciar Xorg!" + +#: ../tcosmonitor/extensions/restartxorg.py:78 +msgid "No thin clients found." +msgstr "Non se atoparon clientes lixeiros." + +#: ../tcosmonitor/extensions/restartxorg.py:81 +#, python-format +msgid "Do you want to restart X screens (only thin clients):%s?" +msgstr "" +"¿Quere reiniciar as sesións X dos seguintes equipos (só clientes lixeiros): %" +"s?" + +#: ../tcosmonitor/extensions/italc.py:51 ../tcosmonitor/extensions/vnc.py:135 +msgid "No user logged." +msgstr "Usuario non conectado." + +#: ../tcosmonitor/extensions/italc.py:75 +msgid "Can't start IVS, please add iTALC support" +msgstr "Non se pode arrancar o proceso IVS. Engada soporte para iTALC" + +#: ../tcosmonitor/extensions/tcospersonalize.py:54 +#, python-format +msgid "%s is not supported to personalize!" +msgstr "¡%s non está soportado para personalizar!" + +#: ../tcosmonitor/extensions/vnc.py:71 +#, python-format +msgid "Do you want to start demo mode the following users: %s?" +msgstr "¿Quere iniciar modo demostración aos seguintes usuarios: %s ?" + +#: ../tcosmonitor/extensions/vnc.py:83 +msgid "Waiting for start demo mode..." +msgstr "Esperando ao arranque do modo demostración..." + +#: ../tcosmonitor/extensions/vnc.py:116 ../tcosmonitor/extensions/vnc.py:426 +#, python-format +msgid "Running in demo mode with %s clients." +msgstr "Executándose en modo demostración con %s equipos." + +#: ../tcosmonitor/extensions/vnc.py:127 +#, python-format +msgid "Running in demo mode from server. Demo Nº %s" +msgstr "Executándose en modo demostración dende o servidor. Demostración Nº %s" + +#: ../tcosmonitor/extensions/vnc.py:149 ../tcosmonitor/extensions/vnc.py:369 +#, python-format +msgid "Connecting with %s to start VNC support" +msgstr "Conectando a %s para arrancar soporte VNC" + +#: ../tcosmonitor/extensions/vnc.py:178 +#, python-format +msgid "" +"Can't start VNC, error:\n" +"%s" +msgstr "" +"Non se puido arrancar VNC, erro:\n" +"%s" + +#: ../tcosmonitor/extensions/vnc.py:182 +msgid "Waiting for start of VNC server..." +msgstr "Esperando a que comece o servidor VNC..." + +#: ../tcosmonitor/extensions/vnc.py:211 +msgid "Can't start VNC, please add X11VNC support" +msgstr "Non se puido arrancar VNC, por favor engada soporte para X11VNC." + +#: ../tcosmonitor/extensions/vnc.py:237 +msgid "Switch to view only" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:242 ../tcosmonitor/extensions/vnc.py:273 +#, fuzzy +msgid "Switch to full control" +msgstr "Lista de control chat" + +#: ../tcosmonitor/extensions/vnc.py:269 +#, python-format +msgid "VNC host %s" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:281 +msgid "Switch to fullscreen" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:290 +#: ../tcosmonitor/extensions/livevnc.py:72 +#: ../tcosmonitor/TcosPreferences.py:539 ../tcosmonitor/TcosExtensions.py:338 +msgid "Stop" +msgstr "Parar" + +#: ../tcosmonitor/extensions/vnc.py:342 +msgid "Can't start demo mode, user is not logged" +msgstr "" +"Non se puido arrancar modo demostración,\n" +"o usuario non está conectado" + +#: ../tcosmonitor/extensions/vnc.py:345 +#, python-format +msgid "Do you want demo mode from user %s?" +msgstr "¿Quere iniciar o modo demostración dende o cliente %s?" + +#: ../tcosmonitor/extensions/vnc.py:392 +#, python-format +msgid "Waiting for start demo mode from user %s..." +msgstr "Esperando ao arranque do modo demostración dende o cliente %s..." + +#: ../tcosmonitor/extensions/vnc.py:446 +#, python-format +msgid "Running in demo mode from user %(host)s. Demo Nº %(count)s" +msgstr "" +"Executándose en modo demostración dende o cliente %(host)s. Demostración Nº %" +"(count)s" + +#: ../tcosmonitor/extensions/vnc.py:501 +msgid "Demo mode off." +msgstr "Modo demostración desactivado." + +#: ../tcosmonitor/extensions/wakeonlan.py:50 +#: ../tcosmonitor/extensions/wakeonlan.py:75 +msgid "" +"Wake On Lan only works with static list.\n" +"\n" +"Enable scan method \"static\" in Preferences\n" +"and (wake on lan) support in bios of clients." +msgstr "" +"Arrancar por rede só funciona con lista estática.\n" +"\n" +"Activar método escaneo \"static\" en Preferencias\n" +"e soporte (wake on lan) na configuración bios dos clientes." + +#: ../tcosmonitor/extensions/wakeonlan.py:54 +#, python-format +msgid "Do you want boot %s client?" +msgstr "¿Quere arrancar o cliente %s ?" + +#: ../tcosmonitor/extensions/wakeonlan.py:67 +#: ../tcosmonitor/extensions/wakeonlan.py:91 +#, python-format +msgid "No register MAC address for ip: \"%s\"" +msgstr "Enderezo MAC non rexistrado para a IP: \"%s\"" + +#: ../tcosmonitor/extensions/wakeonlan.py:71 +#: ../tcosmonitor/extensions/wakeonlan.py:98 +#, python-format +msgid "Not valid MAC address: \"%s\"" +msgstr "Enderezo MAC non válido: \"%s\"" + +#: ../tcosmonitor/extensions/wakeonlan.py:79 +msgid "Do you want boot all clients?" +msgstr "¿Quere arrancar todos os clientes?" + +#: ../tcosmonitor/extensions/livevnc.py:76 +#, fuzzy +msgid "Live view of all hosts" +msgstr "Captura de pantalla de todos os equipos" + +#: ../tcosmonitor/extensions/livevnc.py:194 +msgid "Running in LiveView mode" +msgstr "" + +#: ../tcosmonitor/extensions/viewproc.py:48 +msgid "Can't show runnings apps, user is not logged" +msgstr "" +"Non se poden ver as aplicacións executadas,\n" +"o usuario non está conectado." + +#: ../tcosmonitor/extensions/viewproc.py:58 +msgid "User not connected, no processes." +msgstr "Usuario non conectado, non existen procesos." + +#: ../tcosmonitor/extensions/viewproc.py:76 +#, python-format +msgid "Running processes for user \"%s\": " +msgstr "Procesos executados polo usuario \"%s\":" + +#: ../tcosmonitor/extensions/viewproc.py:80 +msgid "" +"ALERT: There are some system process hidden. Enable it in Preferences dialog." +msgstr "" +"ALERTA: Hai varios procesos do sistema ocultos. Pode activa-los na ventá de " +"Preferencias." + +#: ../tcosmonitor/extensions/viewproc.py:85 +msgid "Pid" +msgstr "Pid" + +#: ../tcosmonitor/extensions/viewproc.py:86 +msgid "Process command" +msgstr "Comando do proceso" + +#: ../tcosmonitor/extensions/viewproc.py:91 +msgid "Kill this process" +msgstr "Matar este proceso" + +#: ../tcosmonitor/extensions/viewproc.py:127 +msgid "Are you sure you want to stop this process?" +msgstr "¿Está seguro que quere parar este proceso?" + +#: ../tcosmonitor/extensions/viewproc.py:136 +#, python-format +msgid "" +"Error while killing app:\n" +"Reason: %s" +msgstr "" +"Erro cando se pechaba a aplicación:\n" +"Razón: %s" + +#: ../tcosmonitor/extensions/audiortp.py:49 +#: ../ui/tcosmonitor-mainwindow.ui:163 +msgid "Send audio conference" +msgstr "Enviar conferencia de audio" + +#: ../tcosmonitor/extensions/audiortp.py:50 +#: ../ui/tcosmonitor-prefwindow.ui:1507 +msgid "Audio chat conference" +msgstr "Audio chat conferencia" + +#: ../tcosmonitor/extensions/audiortp.py:51 +#: ../ui/tcosmonitor-mainwindow.ui:275 +msgid "Audio chat list" +msgstr "Lista de audio chat" + +#: ../tcosmonitor/extensions/audiortp.py:52 +#, fuzzy +msgid "Send audio conference (from this host)" +msgstr "Enviar son do micrófono (dende este equipo)" + +#: ../tcosmonitor/extensions/audiortp.py:73 +msgid "Emission" +msgstr "Emisión" + +#: ../tcosmonitor/extensions/audiortp.py:79 +msgid "State" +msgstr "Estado" + +#: ../tcosmonitor/extensions/audiortp.py:83 +msgid "Channel" +msgstr "Canle" + +#: ../tcosmonitor/extensions/audiortp.py:235 +#: ../tcosmonitor/extensions/audiortp.py:322 +#: ../tcosmonitor/extensions/audiortp.py:413 +msgid "" +"Your pulseaudio server is too old.\n" +"Is required pulseaudio version >= 0.9.10" +msgstr "" +"O seu servidor de pulseaudio é antigo.\n" +"Requirese unha versión de pulseaudio >= 0.9.10" + +#: ../tcosmonitor/extensions/audiortp.py:238 +#, python-format +msgid "Do you want to start audio conference to the following users: %s?" +msgstr "¿Quere iniciar conferencia de audio aos seguintes usuarios: %s ?" + +#: ../tcosmonitor/extensions/audiortp.py:243 +msgid "You have entered in audio conference" +msgstr "Entrou en conferencia de audio" + +#: ../tcosmonitor/extensions/audiortp.py:267 +msgid "Waiting for start audio conference..." +msgstr "Esperando ao arranque da conferencia de audio..." + +#: ../tcosmonitor/extensions/audiortp.py:295 +#: ../tcosmonitor/extensions/audiortp.py:390 +#, python-format +msgid "Running in audio conference with %s clients." +msgstr "Executándose en conferencia de audio con %s clientes." + +#: ../tcosmonitor/extensions/audiortp.py:305 +#, python-format +msgid "Running in audio conference from server. Conference Nº %s" +msgstr "" +"Executándose en conferencia de audio dende o servidor. Conferencia Nº %s" + +#: ../tcosmonitor/extensions/audiortp.py:316 +msgid "Can't start conference mode, user is not logged" +msgstr "" +"Non se puido arrancar o modo conferencia,\n" +"o usuario non está conectado" + +#: ../tcosmonitor/extensions/audiortp.py:325 +#, python-format +msgid "Do you want audio conference from user %s?" +msgstr "¿Quere iniciar conferencia de audio dende o cliente %s?" + +#: ../tcosmonitor/extensions/audiortp.py:331 +#, python-format +msgid "You have entered in audio conference from user %s" +msgstr "Entrou en conferencia de audio dende o cliente %s" + +#: ../tcosmonitor/extensions/audiortp.py:359 +#, python-format +msgid "Waiting for start audio conference from user %s..." +msgstr "Esperando ao arranque da conferencia de audio dende o cliente %s..." + +#: ../tcosmonitor/extensions/audiortp.py:400 +#, python-format +msgid "Running in audio conference from user %(host)s. Conference Nº %(count)s" +msgstr "" +"Executándose en conferencia de audio dende o cliente %(host)s. Conferencia " +"Nº %(count)s" + +#: ../tcosmonitor/extensions/audiortp.py:416 +#, python-format +msgid "Do you want to start audio chat conference to the following users: %s?" +msgstr "¿Quere iniciar conferencia de audio chat aos seguintes usuarios: %s ?" + +#: ../tcosmonitor/extensions/audiortp.py:421 +#, python-format +msgid "You have entered in audio chat conference. Participants: %s" +msgstr "Entrou en conferencia de audio chat. Participantes: %s" + +#: ../tcosmonitor/extensions/audiortp.py:443 +msgid "Waiting for start audio chat conference..." +msgstr "Esperando ao arranque da conferencia de audio chat..." + +#: ../tcosmonitor/extensions/audiortp.py:449 +msgid "Do you want to connect to this audio chat conference now?" +msgstr "¿Quere conectarse agora a esta conferencia de audio chat?" + +#: ../tcosmonitor/extensions/audiortp.py:483 +#, python-format +msgid "Running in audio chat conference with %s clients." +msgstr "Executándose en conferencia de audio chat con %s clientes." + +#: ../tcosmonitor/extensions/audiortp.py:495 +#, python-format +msgid "Running in audio chat conference. Conference Nº %s" +msgstr "Executándose en conferencia de audio chat. Conferencia Nº %s" + +#: ../tcosmonitor/extensions/audiortp.py:521 +msgid "Conference mode off." +msgstr "Modo conferencia desactivado." + +#: ../tcosmonitor/extensions/audiortp.py:540 +#, fuzzy +msgid "Audio chat conference off." +msgstr "Audio chat conferencia" + +#: ../tcosmonitor/TcosXmlRpc.py:85 +msgid "" +"Username or password are empty,\n" +"please edit in preferences dialog!" +msgstr "" +"O usuario ou o contrasinal están baleiros,\n" +"por favor, verifique o dialogo de preferencias" + +#: ../tcosmonitor/TcosIconView.py:55 +msgid "Place mouse on any computer to see brief info about it." +msgstr "" +"Pase o rato por encima de cada equipo para obter unha descrición máis " +"detallada." + +#: ../tcosmonitor/TcosListView.py:82 +msgid "Active" +msgstr "Activo" + +#: ../tcosmonitor/TcosListView.py:92 +msgid "Screen Blocked" +msgstr "Bloqueado" + +#: ../tcosmonitor/TcosListView.py:97 +msgid "Num of process" +msgstr "Núm. de procesos" + +#: ../tcosmonitor/TcosListView.py:112 +msgid "Sel" +msgstr "Sel" + +#: ../tcosmonitor/TcosListView.py:148 +#, python-format +msgid "Error connecting to tcosxmlrpc in %s" +msgstr "Erro conectando a tcosxmlrpc en %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:154 +#, fuzzy, python-format +msgid "Floppy: %s" +msgstr "Disquete" + +#: ../tcosmonitor/TcosTrayIcon2.py:156 +#, fuzzy, python-format +msgid "CDROM: %s" +msgstr "ERRO: %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:158 +#, fuzzy, python-format +msgid "USB: %s" +msgstr "Dispositivo USB %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:160 +#, fuzzy, python-format +msgid "HDD partition: %s" +msgstr "Partición do disco %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:162 +#, fuzzy, python-format +msgid "Unknow: %s" +msgstr "descoñecido" + +#: ../tcosmonitor/Initialize.py:217 +msgid "GPL-2 license file not found" +msgstr "O arquivo de licenza GPL-2 non se atopou" + +#: ../tcosmonitor/LocalData.py:212 +#, python-format +msgid "Selected network inteface (%s) don't have IP address" +msgstr "A interface de rede seleccionada (%s) non ten enderezo IP" + +#: ../tcosmonitor/LocalData.py:260 ../tcosmonitor/ping.py:108 +#: ../tcosmonitor/ping.py:171 +msgid "Testing if found clients have 8998 or 8999 port open..." +msgstr "" +"Comprobando se os clientes atopados teñen o porto 8998 o 8999 aberto..." + +#: ../tcosmonitor/LocalData.py:282 +msgid "" +"Static list method configured but no hosts in list.\n" +"\n" +"Please, open preferences, click on 'Open Static Host list' and add some " +"hosts." +msgstr "" +"Está seleccionado o método lista estática de equipos pero\n" +"non hai equipos configurados.\n" +"\n" +"Por favor, abra as preferencias, pulse en 'Lista de equipos' e angada algun." + +#: ../tcosmonitor/TcosPreferences.py:264 +msgid "" +"You have select more than 5 button menus.\n" +"Only allowed to select a maximum of 5 buttons." +msgstr "" +"Seleccionou máis de 5 botóns de menus.\n" +"So está permitido seleccionar máximo 5 botóns." + +#: ../tcosmonitor/TcosPreferences.py:275 +msgid "New settings saved." +msgstr "Configuración gardada." + +#: ../tcosmonitor/TcosMenus.py:102 ../tcosmonitor/TcosMenus.py:114 +#, python-format +msgid "Actions for %s" +msgstr "Accións para %s" + +#: ../tcosmonitor/TcosMenus.py:107 +msgid "Actions for selected host" +msgstr "Accións para o equipo seleccionado" + +#: ../tcosmonitor/TcosMenus.py:168 ../tcosmonitor/TcosMenus.py:299 +#, python-format +msgid "%d hidden actions" +msgstr "%d accións ocultas" + +#: ../tcosmonitor/TcosMenus.py:243 ../tcosmonitor/TcosMenus.py:245 +msgid "Actions for selected hosts" +msgstr "Accións para os equipos seleccionados" + +#: ../tcosmonitor/TcosMenus.py:247 +msgid "Actions for all hosts" +msgstr "Accións para todos os equipos" + +#: ../tcosmonitor/TcosMenus.py:304 +msgid "Save hosts positions" +msgstr "Gardar posicións dos equipos" + +#: ../tcosmonitor/TcosMenus.py:312 +msgid "Reset hosts positions" +msgstr "Resetear posicións dos equipos" + +#: ../tcosmonitor/ping.py:80 +#, python-format +msgid "Ping to %s..." +msgstr "Facendo ping a %s..." + +#: ../tcosmonitor/ping.py:89 +msgid "Waiting for pings..." +msgstr "Esperando aos pings..." + +#: ../tcosmonitor/ping.py:127 ../tcosmonitor/ping.py:192 +#: ../tcosmonitor/TcosActions.py:185 ../tcosmonitor/TcosActions.py:264 +msgid "Not connected hosts found." +msgstr "Non se atoparon equipos conectados." + +#: ../tcosmonitor/ping.py:134 ../tcosmonitor/ping.py:197 +#: ../tcosmonitor/TcosActions.py:187 ../tcosmonitor/TcosActions.py:259 +#, python-format +msgid "Found %d hosts" +msgstr "Atopados %d equipos" + +#: ../tcosmonitor/TcosActions.py:162 ../tcosmonitor/TcosActions.py:241 +msgid "Searching for connected hosts..." +msgstr "Buscando equipos conectados..." + +#: ../tcosmonitor/TcosActions.py:1019 +msgid "Searching info of hosts..." +msgstr "Buscando información de equipos..." + +#: ../tcosmonitor/TcosActions.py:1058 +#, python-format +msgid "Connecting to %s..." +msgstr "Conectando a %s..." + +#: ../tcosmonitor/TcosExtensions.py:41 +msgid "Exception:" +msgstr "Excepción:" + +#: ../tcosmonitor/TcosExtensions.py:77 +msgid "Error: no IP!" +msgstr "Erro: Non se indicou enderezo IP." + +#: ../tcosmonitor/TcosExtensions.py:154 +msgid "No clients connected, press refresh button." +msgstr "Non se atoparon clientes, pulse o botón actualizar." + +#: ../tcosmonitor/TcosExtensions.py:251 ../tcosmonitor/TcosExtensions.py:253 +#, python-format +msgid "Can't exec this action at '%s' because you are connected at this host!" +msgstr "" +"Non se pode executar esta acción para '%s' porque está conectado dende él." + +#: ../tcosmonitor/TcosExtensions.py:267 +#, python-format +msgid "Doing action \"%(action)s\" in %(ip)s..." +msgstr "Realizando acción \"%(action)s\" en equipo %(ip)s..." + +#: ../tcosmonitor/TcosExtensions.py:285 +#, python-format +msgid "Done action \"%(action)s\" in %(ip)s" +msgstr "Acción \"%(action)s\" rematada en %(ip)s" + +#: ../tcosmonitor/TcosCommon.py:89 +#, python-format +msgid "" +"ThreadController: Found error executing %(cmd)s\n" +"\n" +"If problem persist, disable Thread Controller\n" +"in Preferences and report bug.\n" +"Error=%(error)s" +msgstr "" +"ThreadController: Atopouse un erro ao executar %(cmd)s\n" +"\n" +"Se o problema persiste, desactive Thread Controller\n" +"en Preferencias e reporte o bug.\n" +"Erro=%(error)s" + +#: ../ui/tcosmonitor-prefwindow.ui:35 ../ui/tcospersonalize.ui:7 +#: ../ui/tcosmonitor-mainwindow.ui:36 +msgid "Preferences" +msgstr "Preferencias" + +#: ../ui/tcosmonitor-prefwindow.ui:62 +msgid "Show host list on startup" +msgstr "Amosar lista de equipos ao arranque" + +#: ../ui/tcosmonitor-prefwindow.ui:80 +msgid "Scan network method" +msgstr "Método de escaneo de equipos" + +#: ../ui/tcosmonitor-prefwindow.ui:91 +msgid "" +"Network interface\n" +"(thin client)" +msgstr "" +"Interface de rede\n" +"(clientes lixeiros)" + +#: ../ui/tcosmonitor-prefwindow.ui:127 +msgid "Show system process" +msgstr "Amosar procesos do sistema" + +#: ../ui/tcosmonitor-prefwindow.ui:144 +msgid "Don't do actions when running TcosMonitor in thin client" +msgstr "Non executar accións cando TcosMonitor se execute dende un terminal." + +#: ../ui/tcosmonitor-prefwindow.ui:163 +msgid "List of hosts" +msgstr "Lista de equipos" + +#: ../ui/tcosmonitor-prefwindow.ui:200 +msgid "Open static host list" +msgstr "Abrir lista fixa de equipos" + +#: ../ui/tcosmonitor-prefwindow.ui:225 +msgid "Only show hosts running tcosxmlrpc (8998 port)" +msgstr "So amosar equipos con tcosmxlrpc (porto 8998)" + +#: ../ui/tcosmonitor-prefwindow.ui:242 +msgid "Only do all actions on selected hosts (requires restart TcosMonitor)" +msgstr "" +"So facer accións para equipos seleccionados \n" +"(necesita reiniciar TcosMonitor)" + +#: ../ui/tcosmonitor-prefwindow.ui:259 +msgid "Enable SSL connections to XMLRPC clients" +msgstr "Empregar conexións SSL aos clientes XMLRPC" + +#: ../ui/tcosmonitor-prefwindow.ui:278 +msgid "Host list mode" +msgstr "Modo de lista de equipos" + +#: ../ui/tcosmonitor-prefwindow.ui:302 +msgid "Show right menu with groups (NEW)" +msgstr "Amosar menú por categorías (NOVO)" + +#: ../ui/tcosmonitor-prefwindow.ui:319 +#, fuzzy +msgid "Don't show thin client if TcosMonitor is running there" +msgstr "Non executar accións cando TcosMonitor se execute dende un terminal." + +#: ../ui/tcosmonitor-prefwindow.ui:351 +msgid "Settings" +msgstr "Configuración" + +#: ../ui/tcosmonitor-prefwindow.ui:376 +msgid "Update host list every (seg)" +msgstr "Actualizar interface cada (seg)" + +#: ../ui/tcosmonitor-prefwindow.ui:389 +msgid "" +"Update host list every selected seconds.\n" +"\n" +"Value=0 disable update." +msgstr "" +"Actualizar lista de equipos cada número\n" +"de segundos seleccionado.\n" +"\n" +"Valor=0 deshabilitar actualización." + +#: ../ui/tcosmonitor-prefwindow.ui:405 +msgid "Cache timeout (seg)" +msgstr "Tempo de vida da cache (seg)" + +#: ../ui/tcosmonitor-prefwindow.ui:419 +msgid "" +"Cache some data and connection status during selected seconds.\n" +"\n" +"Value=0 disable cache." +msgstr "" +"Cachear datos e estado de conexións durante o número\n" +"de segundos seleccionado.\n" +"\n" +"Valor=0 desactivar cache." + +#: ../ui/tcosmonitor-prefwindow.ui:437 +msgid "Screenshot size:" +msgstr "Tamaño de captura de pantalla" + +#: ../ui/tcosmonitor-prefwindow.ui:450 ../ui/tcosmonitor-prefwindow.ui:479 +msgid "% Size of screnshot." +msgstr "%s de tamaño de captura de pantalla" + +#: ../ui/tcosmonitor-prefwindow.ui:466 +msgid "Mini screenshot size:" +msgstr "Tamaño de mini capturas de pantalla" + +#: ../ui/tcosmonitor-prefwindow.ui:495 +msgid "Timeout actions (seg)" +msgstr "Tempo de espera para accións (seg)" + +#: ../ui/tcosmonitor-prefwindow.ui:508 +msgid "" +"Timeout in seg for actions\n" +"\n" +"Value=0 default" +msgstr "" +"Tempo de espera para accións\n" +"\n" +"por defecto 0" + +#: ../ui/tcosmonitor-prefwindow.ui:526 +msgid "SSH remote username" +msgstr "Usuario remoto SSH" + +#: ../ui/tcosmonitor-prefwindow.ui:553 +msgid "VLC method to send" +msgstr "VLC método de envio" + +#: ../ui/tcosmonitor-prefwindow.ui:578 +msgid "" +"<b>Experimental: Thread Controller</b>\n" +"( if you have problems, disable it )" +msgstr "" +"<b>Experimental: Control de Threads</b>\n" +"( Se ten problemas, desactive o control )" + +#: ../ui/tcosmonitor-prefwindow.ui:591 +msgid "Actions controlled" +msgstr "Accións controladas" + +#: ../ui/tcosmonitor-prefwindow.ui:611 +msgid "Block ports: (80,8080... etc)" +msgstr "Bloquear portos: (80,8080... etc)" + +#: ../ui/tcosmonitor-prefwindow.ui:653 ../ui/tcospersonalize.ui:333 +msgid "Advanced" +msgstr "Avanzado" + +#: ../ui/tcosmonitor-prefwindow.ui:680 +msgid "TcosXmlRpc username" +msgstr "Usuario TcosXmlRpc" + +#: ../ui/tcosmonitor-prefwindow.ui:706 +msgid "TcosXmlRpc password" +msgstr "Contrasinal TcosXmlRpc" + +#: ../ui/tcosmonitor-prefwindow.ui:735 +msgid "" +"<b>NOTE:</b>\n" +"Default user is <b>root</b> and default password is <b>root</b>.\n" +"\n" +"For <u>thin clients</u> change TCOS_ROOT_PASSWD or use TcosConfig and " +"regenerate boot images again.\n" +"\n" +"For <u>standalone</u> users you can use a system account (root) but this is " +"not recomended. Install tcos-standalone and start it by root. Set user and " +"password, this will create a <b>/etc/tcospasswd</b> file only used by TCOS " +"and your root acount will be secure." +msgstr "" +"<b>NOTA:</b>\n" +"O usuario por defecto é <b>root</b> e o contrasinal é <b>root</b>.\n" +"\n" +"Para <u>terminais lixeiros</u> podes modificar TCOS_ROOT_PASSWD ou empregar " +"TcosConfig e rexenerar as imaxes de arranque de novo.\n" +"\n" +"Para equipos <u>autónomos(standalone)</u> podes empregar a conta do sistema " +"(root) pero esto non é recomandable. Instala o paquete tcos-standalone " +"execútao como administrador e configura un usuario e unha conta. O " +"contrasinal gardarase en <b>/etc/tcospasswd</b>, arquivo que so o necesita " +"TCOS polo que a túa conta de root estará a salvo." + +#: ../ui/tcosmonitor-prefwindow.ui:772 +msgid "Authentication " +msgstr "Autenticación" + +#: ../ui/tcosmonitor-prefwindow.ui:795 +msgid "<b>Info avalaible from tcosxmlrpc</b>" +msgstr "<b>Información disponíbel de tcosxmlrpc</b>" + +#: ../ui/tcosmonitor-prefwindow.ui:806 +msgid "Tcos general info" +msgstr "Información xeral de Tcos" + +#: ../ui/tcosmonitor-prefwindow.ui:821 +msgid "Cpu info" +msgstr "Información da CPU" + +#: ../ui/tcosmonitor-prefwindow.ui:836 +msgid "Kernel and modules info" +msgstr "Información do núcleo e módulos" + +#: ../ui/tcosmonitor-prefwindow.ui:851 +msgid "PCI bus info" +msgstr "Información bus PCI" + +#: ../ui/tcosmonitor-prefwindow.ui:866 +msgid "Ram and swap info" +msgstr "Información da RAM e SWAP" + +#: ../ui/tcosmonitor-prefwindow.ui:881 +msgid "Process info" +msgstr "Información de procesos" + +#: ../ui/tcosmonitor-prefwindow.ui:896 +msgid "Network info" +msgstr "Información da rede" + +#: ../ui/tcosmonitor-prefwindow.ui:926 +msgid "Sound server info" +msgstr "Información do servidor de son" + +#: ../ui/tcosmonitor-prefwindow.ui:962 +msgid "Avalaible info" +msgstr "Información disponíbel" + +#: ../ui/tcosmonitor-prefwindow.ui:985 +msgid "<b>Show / hide menu items</b>" +msgstr "<b>Amosar / ocultar menús da aplicación</b>" + +#: ../ui/tcosmonitor-prefwindow.ui:1003 +msgid "Lock and unlock screen" +msgstr "Bloquear e desbloquear pantallas" + +#: ../ui/tcosmonitor-prefwindow.ui:1019 +msgid "Remote SSH shell" +msgstr "Consola SSH remota" + +#: ../ui/tcosmonitor-prefwindow.ui:1037 +msgid "Configure Xorg settings" +msgstr "Configurar Xorg" + +#: ../ui/tcosmonitor-prefwindow.ui:1066 ../ui/tcosmonitor-prefwindow.ui:1427 +msgid "Exe app on user display" +msgstr "Executar aplicacións" + +#: ../ui/tcosmonitor-prefwindow.ui:1082 ../ui/tcosmonitor-prefwindow.ui:1441 +msgid "Send a text message" +msgstr "Enviar unha mensaxe de texto" + +#: ../ui/tcosmonitor-prefwindow.ui:1100 +msgid "Show running apps" +msgstr "Ver aplicacións executadas" + +#: ../ui/tcosmonitor-prefwindow.ui:1116 ../ui/tcosmonitor-prefwindow.ui:1457 +msgid "Send video broadcast" +msgstr "Enviar audio/vídeo" + +#: ../ui/tcosmonitor-prefwindow.ui:1150 +msgid "Demo mode" +msgstr "Modo demostración" + +#: ../ui/tcosmonitor-prefwindow.ui:1179 +msgid "Wake on LAN" +msgstr "Wake on LAN" + +#: ../ui/tcosmonitor-prefwindow.ui:1195 +msgid "Audio conference mode" +msgstr "Modo audio conferencia" + +#: ../ui/tcosmonitor-prefwindow.ui:1213 +msgid "Screenshots" +msgstr "Capturas de pantalla" + +#: ../ui/tcosmonitor-prefwindow.ui:1229 +msgid "Reboot and poweroff" +msgstr "Apagar e reiniciar" + +#: ../ui/tcosmonitor-prefwindow.ui:1243 +msgid "Lock and unlock internet" +msgstr "Bloquear e desbloquear internet" + +#: ../ui/tcosmonitor-prefwindow.ui:1259 +msgid "DPMS monitor on/off" +msgstr "DPMS control enerxía monitores" + +#: ../ui/tcosmonitor-prefwindow.ui:1277 +msgid "Connect using VNC" +msgstr "Conectar empregando VNC" + +#: ../ui/tcosmonitor-prefwindow.ui:1293 +msgid "Connect using iTALC" +msgstr "Conectar empregando iTALC" + +#: ../ui/tcosmonitor-prefwindow.ui:1308 +msgid "Restart session with new settings" +msgstr "Reiniciar coa nova configuración" + +#: ../ui/tcosmonitor-prefwindow.ui:1385 +msgid "Menus" +msgstr "Menús" + +#: ../ui/tcosmonitor-prefwindow.ui:1408 +msgid "<b>Show / hide menu buttons</b>" +msgstr "<b>Amosar / ocultar botóns de menús</b>" + +#: ../ui/tcosmonitor-prefwindow.ui:1491 +msgid "Audio conference" +msgstr "Audio conferencia" + +#: ../ui/tcosmonitor-prefwindow.ui:1525 +msgid "Audio Chat control" +msgstr "Control de audio chat" + +#: ../ui/tcosmonitor-prefwindow.ui:1569 +msgid "Menu buttons" +msgstr "Botóns de menús" + +#: ../ui/tcosmonitor-abouttcos.ui:6 +msgid "About TCOS" +msgstr "Acerca de TCOS" + +#: ../ui/tcosmonitor-abouttcos.ui:19 +msgid "<span size=\"xx-large\">TcosMonitor</span>" +msgstr "<span size=\"x-large\">TcosMonitor</span>" + +#: ../ui/tcosmonitor-abouttcos.ui:62 +msgid "<b>Version:</b>" +msgstr "<b>Versión:</b>" + +#: ../ui/tcosmonitor-abouttcos.ui:90 +msgid "" +"Thin client and standalone\n" +"monitoring tool." +msgstr "" +"Ferramenta de monitorización\n" +"de clientes lixeiros e instalados." + +#: ../ui/tcosmonitor-abouttcos.ui:131 +msgid "Project web site" +msgstr "Páxina web do proxecto" + +#: ../ui/tcosmonitor-abouttcos.ui:178 +msgid "About" +msgstr "Acerca de" + +#: ../ui/tcosmonitor-abouttcos.ui:212 +msgid "License" +msgstr "Licenza" + +#: ../ui/tcosmonitor-abouttcos.ui:230 +msgid "" +"Main developers:\n" +" * Mario Izquierdo <mariodebian at gmail.com>\n" +" * Ignacio Vidal <vidal_joshur at gva.es>\n" +"\n" +"Contributors:\n" +" * Andrés Jimenez\n" +" * Quirón\n" +"\n" +"Special thanks to:\n" +" Comunidad de Madrid, MaX group (Spain)" +msgstr "" +"Desenvolvedores principais:\n" +" * Mario Izquierdo <mariodebian at gmail.com>\n" +" * Ignacio Vidal <vidal_joshur at gva.es>\n" +"\n" +"Colaboradores:\n" +" * Andrés Jimenez\n" +" * Quirón\n" +"\n" +"Destacamos nos agradecementos a:\n" +" Comunidade de Madrid, grupo MaX (España)" + +#: ../ui/tcosmonitor-abouttcos.ui:259 +msgid "Authors" +msgstr "Autores" + +#: ../ui/tcosmonitor-abouttcos.ui:275 +msgid "Translated to your language by:" +msgstr "Traducido ao seu idioma por:" + +#: ../ui/tcosmonitor-abouttcos.ui:287 +msgid "Mario Izquierdo <mariodebian@gmail.com>" +msgstr "Mario Izquierdo <mariodebian@gmail.com>" + +#: ../ui/tcosmonitor-abouttcos.ui:307 +msgid "Translators" +msgstr "Tradutores" + +#: ../ui/tcosmonitor-abouttcos.ui:324 +msgid "" +"TCOS is a free software project that need a lot of work to be the best thin " +"client plataform.\n" +"\n" +"We work every day a lot of hours to make changes and support more devices " +"and features.\n" +"\n" +"We want to continue developing this software but need your help, if you use, " +"sell or hack TCOS pehaps you could donate some money to project.\n" +"\n" +"Click on next url to get some info." +msgstr "" +"TCOS é un proxecto libre que necesita moito traballo para intentar ser a " +"mellor plataforma de clientes lixeiros.\n" +"\n" +"Traballamos cada día moitas horas para facer cambios e soportar máis " +"dispositivos e características.\n" +"\n" +"Queremos continuar facéndoo pero necesitamos a túa axuda, si empregas, " +"vendes ou modificas TCOS, quizáis poidas donar algo de diñeiro ao proxecto.\n" +"\n" +"Pulsa no enlace inferior para obter máis información." + +#: ../ui/tcosmonitor-abouttcos.ui:370 +msgid "<u>http://wiki.tcosproject.org/TcosProject:Site_support</u>" +msgstr "<u>http://wiki.tcosproject.org/TcosProject:Site_support/es</u>" + +#: ../ui/tcosmonitor-abouttcos.ui:392 +msgid "Don't show donations message on start." +msgstr "Non amosar esta mensaxe ao inicio." + +#: ../ui/tcosmonitor-abouttcos.ui:415 +msgid "Donate" +msgstr "Donacións" + +#: ../ui/tray.ui:20 +msgid "<big><b>TCOS devices</b></big>" +msgstr "" + +#: ../ui/tray.ui:57 +msgid "Hide" +msgstr "Ocultar" + +#: ../ui/tcos-volume-manager.ui:39 +msgid "Restart sound" +msgstr "" + +#: ../ui/tcos-volume-manager.ui:54 +msgid "Sound levels" +msgstr "Niveis de volume" + +#: ../ui/tcos-volume-manager.ui:90 +msgid "Main Channels" +msgstr "Canles principais" + +#: ../ui/tcos-volume-manager.ui:113 +msgid "Secondary Channels" +msgstr "Canles secundarias" + +#: ../ui/tcosmonitor-chatwindow.ui:8 +msgid "Chat emission list" +msgstr "Lista de emisión chat" + +#: ../ui/tcosmonitor-chatwindow.ui:17 +msgid "<span size=\"x-large\">Chat emission list</span>" +msgstr "<span size=\"x-large\">Lista de emisión chat</span>" + +#: ../ui/tcosmonitor-chatwindow.ui:80 +msgid "Connect" +msgstr "Conectar" + +#: ../ui/tcosmonitor-chatwindow.ui:128 +msgid "Disconnect" +msgstr "Desconectar" + +#: ../ui/tcosmonitor-chatwindow.ui:176 +msgid "Exit" +msgstr "Saír" + +#: ../ui/tcosmonitor-staticwindow.ui:8 +msgid "Static hosts list" +msgstr "Lista de equipos" + +#: ../ui/tcosmonitor-staticwindow.ui:17 +msgid "<span size=\"x-large\">Static Hosts list</span>" +msgstr "<span size=\"x-large\">Lista de equipos</span>" + +#: ../ui/tcosmonitor-staticwindow.ui:80 +msgid "Add" +msgstr "Engadir" + +#: ../ui/tcosmonitor-staticwindow.ui:128 +msgid "Modify" +msgstr "Modificar" + +#: ../ui/tcosmonitor-staticwindow.ui:176 +msgid "Delete" +msgstr "Borrar" + +#: ../ui/tcosmonitor-staticwindow.ui:225 +msgid "Get from connected" +msgstr "Tomar dende conectados" + +#: ../ui/tcosmonitor-staticwindow.ui:292 ../ui/tcosmonitor-mainwindow.ui:771 +#: ../ui/tcosmonitor-staticwindownew.ui:150 +msgid "Cancel" +msgstr "Cancelar" + +#: ../ui/tcosmonitor-staticwindow.ui:340 +#: ../ui/tcosmonitor-staticwindownew.ui:198 +msgid "Save" +msgstr "Gardar" + +#: ../ui/tcospersonalize.ui:34 +msgid "<b>unknow host</b>" +msgstr "<b>equipo descoñecido</b>" + +#: ../ui/tcospersonalize.ui:74 +msgid "Disable Ctrl + Alt + Backspace (for kill Xorg)" +msgstr "Desactivar Ctrl+Alt+Backspace (pechar Xorg)" + +#: ../ui/tcospersonalize.ui:211 +msgid "Get avalaible drivers" +msgstr "Cargar drivers disponíbeis" + +#: ../ui/tcospersonalize.ui:248 +msgid "Display Settings" +msgstr "Configuración gráfica" + +#: ../ui/tcospersonalize.ui:351 +msgid "Default boot kernel" +msgstr "Núcleo por defecto" + +#: ../ui/tcospersonalize.ui:376 +msgid "<b>PXE Boot options</b>" +msgstr "<b>Opcións de arranque PXE</b>" + +#: ../ui/tcospersonalize.ui:391 +msgid "Default boot method" +msgstr "Método de arranque por defecto" + +#: ../ui/tcospersonalize.ui:419 +msgid "Command line" +msgstr "Línea de arranque" + +#: ../ui/tcospersonalize.ui:507 +msgid "Boot options" +msgstr "Opcións de arranque" + +#: ../ui/tcospersonalize.ui:551 +msgid "Delete Config" +msgstr "Borrar configuración" + +#: ../ui/tcosmonitor-mainwindow.ui:8 +msgid "TcosMonitor" +msgstr "TcosMonitor" + +#: ../ui/tcosmonitor-mainwindow.ui:22 +msgid "Exit TcosMonitor" +msgstr "Saír de TcosMonitor" + +#: ../ui/tcosmonitor-mainwindow.ui:35 +msgid "Open preferences dialog" +msgstr "Abrir diálogo de preferencias" + +#: ../ui/tcosmonitor-mainwindow.ui:48 +msgid "Update host list" +msgstr "Actualizar lista de equipos" + +#: ../ui/tcosmonitor-mainwindow.ui:49 +msgid "Refresh" +msgstr "Actualizar" + +#: ../ui/tcosmonitor-mainwindow.ui:71 +msgid "All Hosts" +msgstr "Todos os equipos" + +#: ../ui/tcosmonitor-mainwindow.ui:99 +msgid "Find" +msgstr "Buscar" + +#: ../ui/tcosmonitor-mainwindow.ui:111 +msgid "About this app" +msgstr "Acerca desta aplicación" + +#: ../ui/tcosmonitor-mainwindow.ui:219 +msgid "Start audio chat" +msgstr "Iniciar audio chat" + +#: ../ui/tcosmonitor-mainwindow.ui:331 +msgid "Send audio/video" +msgstr "Enviar audio/vídeo" + +#: ../ui/tcosmonitor-mainwindow.ui:443 +msgid "Exe app" +msgstr "Executar aplicación" + +#: ../ui/tcosmonitor-mainwindow.ui:499 +msgid "Send message" +msgstr "Enviar mensaxe de texto" + +#: ../ui/tcosmonitor-mainwindow.ui:581 +msgid "List view" +msgstr "Vista lista de equipos" + +#: ../ui/tcosmonitor-mainwindow.ui:629 +msgid "Icon view" +msgstr "Vista iconas" + +#: ../ui/tcosmonitor-mainwindow.ui:689 +msgid "Simulate my classroom" +msgstr "Simular aula" + +#: ../ui/tcosmonitor-staticwindownew.ui:8 +msgid "New or edit hosts" +msgstr "Novo ou editar lista de equipos" + +#: ../ui/tcosmonitor-staticwindownew.ui:32 +msgid "" +"You can add a simple host, \n" +" example: <b>192.168.0.100</b>\n" +"\n" +"or range of hosts, \n" +" example: <b>192.168.0.100-120</b>\n" +"\n" +"MAC address is optional" +msgstr "" +"Pode engadir un equipo,\n" +" exemplo: <b>192.168.0.100</b>\n" +"\n" +"ou un rango, \n" +" exemplo: <b>192.168.0.100-120</b>\n" +"\n" +"ou enderezo MAC é opcional" + +#: ../ui/tcosmonitor-staticwindownew.ui:57 +msgid "IP address *" +msgstr "Enderezo IP *" + +#: ../ui/tcosmonitor-askwindow.ui:8 +msgid "Question" +msgstr "Pregunta" + +#: ../ui/tcosmonitor-askwindow.ui:50 +msgid "You can drag and drop launcher file to this box" +msgstr "Podes arrastrar e soltar un lanzador a esta caixa" + +#: ../ui/tcosmonitor-askwindow.ui:61 +msgid "<b>Run app in unknow host</b>" +msgstr "<b>Executar aplicación en equipo descoñecido</b>" + +#, fuzzy +#~ msgid "Quit from TcosMonitor" +#~ msgstr "Saír de TcosMonitor" + +#, fuzzy +#~ msgid "<span size=\"xx-large\">Lliurex Lab</span>" +#~ msgstr "<span size=\"x-large\">TcosMonitor</span>" + +#, fuzzy +#~ msgid "Clonning clients...." +#~ msgstr "Conectando a %s..." + +#, fuzzy +#~ msgid "Clone clients" +#~ msgstr "Desconectar todos os clientes" + +#~ msgid "Can't move icon, another host is near." +#~ msgstr "Non se pode mover a icona, hai un equipo preto." + +#~ msgid "" +#~ "Error getting Xorg info:\n" +#~ "%s" +#~ msgstr "" +#~ "Erro obtendo información de Xorg:\n" +#~ "%s" + +#~ msgid "Send my MIC audio" +#~ msgstr "Enviar o son do micrófono" + +#~ msgid "Chat conference mode off." +#~ msgstr "Modo conferencia chat desactivado." + +#~ msgid "No host found" +#~ msgstr "Non se atoparon equipos" + +#, fuzzy +#~ msgid "button1" +#~ msgstr "Botóns de menús" + +#~ msgid "Do you want to start conference mode the following users: %s?" +#~ msgstr "¿Quiere iniciar modo conferencia a los siguientes usuarios: %s ?" + +#~ msgid "Waiting for start conference mode..." +#~ msgstr "Esperando al arranque del modo conferencia..." + +#~ msgid "Running in conference mode with %s clients." +#~ msgstr "Ejecutandose en modo conferencia con %s equipos." + +#~ msgid "" +#~ "Running in broadcast video transmission to host %(host)s. Broadcast Nº %" +#~ "(count)d" +#~ msgstr "" +#~ "Ejecutándose en modo de difusión de vídeo al equipo %(host)s. Broadcast " +#~ "Nº %(count)d" + +#~ msgid "" +#~ "Special characters used in \"%s\".\n" +#~ "Please rename it." +#~ msgstr "" +#~ "Se han usado caracteres especiales en \"%s\"\n" +#~ "Por favor, renómbrelo." + +#~ msgid "No clients selected, do you want to select all?" +#~ msgstr "No se han seleccionado equipos, ¿quiere seleccionar todos?" + +#~ msgid "Running in broadcast video transmission" +#~ msgstr "Ejecutándose el modo difusión de vídeo." + +#~ msgid "Conference chat mode off." +#~ msgstr "Conferencia chat desactivado." + +#~ msgid "Can't exec this action because you are connected at this host!" +#~ msgstr "" +#~ "¡No se puede ejecutar esta acción porque está conectado desde ese equipo!" + +#~ msgid "Audio RTP" +#~ msgstr "RTP de audio" + +#~ msgid "Can't logout, user is not logged" +#~ msgstr "No se pudo desconectar al usuario, no está conectado" + +#~ msgid "Waiting for screenshots..." +#~ msgstr "Esperando a las capturas..." + +#~ msgid "Work as cyber mode (not work yet)" +#~ msgstr "Trabajar en modo cyber (no disponible)" + +#~ msgid "Extra modules" +#~ msgstr "Módulos extra" + +#~ msgid "Kernel modules" +#~ msgstr "Módulos del kernel" + +#~ msgid "<b>Extra modules avalaible</b>" +#~ msgstr "<b>Módulos extra disponibles</b>" + +#~ msgid "Add X11vnc support" +#~ msgstr "Añadir soporte X11vnc" + +#~ msgid "Add iTALC support" +#~ msgstr "Añadir soporte iTALC" + +#~ msgid "Add FreeNX support" +#~ msgstr "Añadir soporte FreeNX" + +#~ msgid "Addons" +#~ msgstr "Añadidos" + +#~ msgid "Doing action %(action)s in %(timeout)s seconds" +#~ msgstr "Realizando acción %(action)s en %(ip)s segundos" + +#~ msgid "General settings" +#~ msgstr "Configuración general" + +#~ msgid "Advanced Settings" +#~ msgstr "Configuración Avanzada" + +#~ msgid "" +#~ "<b>NOTE:</b>\n" +#~ "This values are needed to do some actions\n" +#~ "on thin client, if you don't use \n" +#~ "<b>update-tcospasswd</b> app, default\n" +#~ "user is <b>root</b> and default password is <b>root</b>.\n" +#~ "\n" +#~ "To change it you have to edit /etc/tcos/tcos.conf and change\n" +#~ "TCOS_ROOT_PASSWD var value. Then regenerate images with\n" +#~ "<b>gentcos</b> or <b>tcosconfig</b>.\n" +#~ "\n" +#~ "Using TcosMonitor in PXES or LTSP networks require to use\n" +#~ "<b>update-tcospasswd</b> script, run it as root, and follow\n" +#~ "instructions. This will generate a tcospasswd file with asked data.\n" +#~ msgstr "" +#~ "<b>NOTA:</b>\n" +#~ "Estos valores se necesitan para realizar ciertas acciones\n" +#~ "en el cliente ligero, si no ha usado aún la aplicación\n" +#~ "<b>update-tcospasswd</b> los valores por defecto son, \n" +#~ "usuario: <b>root</b> contraseña:<b>root</b>.\n" +#~ "\n" +#~ "Para cambiarlos, edite el archivo /etc/tcos/tcos.conf editando\n" +#~ "la variable TCOS_ROOT_PASSWD y regenere la\n" +#~ "imagen de arranque con <b>gentcos</b> o use <b>tcosconfig</b>.\n" +#~ "\n" +#~ "Si está usando TcosMonitor en una red PXES o LTSP, necesita usar\n" +#~ "el script <b>update-tcospasswd</b>, ejecútelo como root, y siga\n" +#~ "las instrucciones. Esto generará un archivo tcospasswd con los datos " +#~ "preguntados.\n" + +#~ msgid "" +#~ "TcosMonitor need special configuration for rsync daemon.\n" +#~ "\n" +#~ "Please read configuration requeriments in:\n" +#~ "/usr/share/doc/tcosmonitor/README.rsync" +#~ msgstr "" +#~ "TcosMonitor necesita una configuración especial del demonio rsync.\n" +#~ "\n" +#~ "Lea la configuración requerida en:\n" +#~ "/usr/share/doc/tcosmonitor/README.rsync" + +#~ msgid "no standalone user connected" +#~ msgstr "Usuario standalone no conectado." + +#~ msgid "VLC audio codec" +#~ msgstr "Codec de audio para VLC" + +#~ msgid "VLC video codec" +#~ msgstr "Codec de video para VLC" + +#~ msgid "" +#~ "First create /tmp/tcos_share folder,\n" +#~ "and restart rsync daemon\n" +#~ "/etc/init.d/rsync restart" +#~ msgstr "" +#~ "Primero debe crear el directorio /tmp/tcos_share,\n" +#~ "y después reiniciar el servicio rsync\n" +#~ "/etc/init.d/rsync restart" + +#~ msgid "GNU/GPL" +#~ msgstr "GNU/GPL" + +#~ msgid "A thin client network monitor" +#~ msgstr "Un monitor de clientes ligeros" + +#~ msgid "translator-credits" +#~ msgstr "" +#~ "Mario Izquierdo (mariodebian)\n" +#~ "<mariodebian@gmail.com>" + +#~ msgid "<span size=\"x-large\">About TCOS</span>" +#~ msgstr "<span size=\"x-large\">Acerca de TCOS</span>" + +#~ msgid "TcosMonitor web page" +#~ msgstr "Página web de TcosMonitor" + +#~ msgid "Search for hostname, ip address or username" +#~ msgstr "Buscar por nombre de equipo, dirección ip, o nombre de usuario" + +#~ msgid "Search" +#~ msgstr "Buscar" + +#~ msgid "<span size=\"x-large\">TCOS project needs your help</span>" +#~ msgstr "<span size=\"x-large\">El proyecto TCOS necesita tu ayuda</span>" + +#~ msgid "" +#~ "Mounting device %(device)s in \n" +#~ "%(mnt_point)s\n" +#~ "Please wait..." +#~ msgstr "" +#~ "Montando dispositivo %(device)s en\n" +#~ "%(mnt_point)s\n" +#~ "Por favor, espere..." + +#~ msgid "Timeout" +#~ msgstr "" +#~ "Tiempo de \n" +#~ "espera" + +#~ msgid "Your user isn't in fuse group, ask your system administrator." +#~ msgstr "Su usuario no pertenece al grupo fuse, pregunte a su administrador." + +#~ msgid "Flash device mounted. Ready for use." +#~ msgstr "Dispositivo flash montado.Listo para usar." + +#~ msgid "Flash device umounted. You can extract it." +#~ msgstr "Dispositivo flash desmontado. Ahora puede extraerlo." + +#~ msgid "Can't mount device %s" +#~ msgstr "No se pudo montar el dispositivo %s" + +#~ msgid "Can't umount device %s" +#~ msgstr "No se pudo desmontar el dispositivo %s" + +#~ msgid "Umount %s remote device" +#~ msgstr "Desmontar dispositivo %s remoto" + +#~ msgid "" +#~ "Mounting device %(device)s in \n" +#~ "%(mnt_point)s\n" +#~ "Please wait...\n" +#~ "Click on Desktop icon to secure umount." +#~ msgstr "" +#~ "Montando dispositivo %(device)s en\n" +#~ "%(mnt_point)s\n" +#~ "Por favor, espere\n" +#~ "Pulse en el icono del escritorio para extracción segura." + +#~ msgid "Tcos Devices daemon on host %s" +#~ msgstr "Gestor de dispositivos TCOS en equipo %s" + +#~ msgid "Tcos Devices on %s host" +#~ msgstr "Gestor de dispositivos TCOS en equipo %s" + +#~ msgid "No support for more than one cdrom, first detected will be used" +#~ msgstr "No hay soporte para más de un cdrom, se usará el primero." + +#~ msgid "Cdrom" +#~ msgstr "Cdrom" + +#~ msgid "Umounting %s, please wait..." +#~ msgstr "Desmontando %s, por favor, espere..." + +#~ msgid "<b>Floppy status:</b>" +#~ msgstr "<b>Estado del disquete:</b>" + +#~ msgid "<b>CDROM status:</b>" +#~ msgstr "<b>Estado del CDROM:</b>" + +#~ msgid "Mount CDROM" +#~ msgstr "Montar CDROM" + +#~ msgid "Umount CDROM" +#~ msgstr "Desmontar CDROM" + +#~ msgid "Do you want to restart Xorg of %s?" +#~ msgstr "¿Quiere reiniciar Xorg del equipo %s?" diff --git a/po/pt_BR.po b/po/pt_BR.po new file mode 100644 index 0000000..9a88585 --- /dev/null +++ b/po/pt_BR.po @@ -0,0 +1,2901 @@ +# translation of tcosmonitor. +# Copyright (C) 2009 THE tcosmonitor'S COPYRIGHT HOLDER +# This file is distributed under the same license as the tcosmonitor package. +# <>, 2009. +# , fuzzy +# <>, 2009. +# +# +msgid "" +msgstr "" +"Project-Id-Version: tcosmonitor 0.2.19\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-18 15:48+0100\n" +"PO-Revision-Date: 2009-07-16 16:26-0300\n" +"Last-Translator: Aécio dos Santos Pires <aecio@tcosproject.org>\n" +"Language-Team: Portuguese/Brazil <pt-BR>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../tcosmonitor.py:129 +#, python-format +msgid "" +"The user \"%s\" must be member of the group \"tcos\" to exec tcosmonitor.\n" +"\n" +"If you are system administrator, add your user to tcos group." +msgstr "" +"O usuário \"%s\" deve ser membro do grupo \"tcos\" para executar o " +"TcosMonitor.\n" +"\n" +"Se você é o administrador do sistema, adicione esse usuário ao grupo tcos." + +#: ../tcosmonitor.py:247 +msgid "Send files disabled. rsync not configured." +msgstr "Envio de arquivos desabilitado. O rsync.não foi configurado." + +#: ../tcosmonitor.py:329 ../tcospersonalize.py:562 +#: ../tcos-volume-manager.py:378 +msgid "Exiting" +msgstr "Saindo" + +#: ../tcos-devices-ng.py:188 +#, python-format +msgid "Rebooting in %s seconds" +msgstr "O terminal será reiniciado em %s segundos." + +#: ../tcos-devices-ng.py:190 +#, python-format +msgid "Shutting down in %s seconds" +msgstr "O terminal será desligado em %s segundos." + +#: ../tcos-devices-ng.py:206 ../tcos-devices-ng.py:209 +#, python-format +msgid "" +"ERROR during action %(action)s:\n" +"%(errortxt)s" +msgstr "" +"Erro ao executar a ação %(action)s:\n" +"%(errortxt)s" + +#: ../tcos-devices-ng.py:239 +msgid "Tcos device daemon" +msgstr "Tcos device daemon" + +#: ../tcos-devices-ng.py:283 ../tcos-volume-manager.py:143 +#, python-format +msgid "Error connecting with TcosXmlRpc in %s." +msgstr "ERRO! Conectando ao TcosXmlRpc em %s segundos." + +#: ../tcos-devices-ng.py:314 +#, python-format +msgid "Cdrom device %s" +msgstr "Dispositivo CD-ROM %s" + +#: ../tcos-devices-ng.py:317 +msgid "Mount Cdrom" +msgstr "Montar CD-ROM" + +#: ../tcos-devices-ng.py:318 +msgid "Umount Cdrom" +msgstr "Desmontar CD-ROM" + +#: ../tcos-devices-ng.py:340 +#, python-format +msgid "Disk partition %s" +msgstr "Partição do disco %s" + +#: ../tcos-devices-ng.py:343 +msgid "Mount disk partition" +msgstr "Montar partição" + +#: ../tcos-devices-ng.py:344 +msgid "Umount disk partition" +msgstr "Desmontar partição" + +#: ../tcos-devices-ng.py:356 +msgid "No floppy detected" +msgstr "O disquete não foi detectado." + +#: ../tcos-devices-ng.py:368 ../tcos-devices-ng.py:674 +#: ../tcos-devices-ng.py:680 ../tcos-devices-ng.py:686 +msgid "Floppy" +msgstr "Disquete" + +#: ../tcos-devices-ng.py:371 +msgid "Mount Floppy" +msgstr "Montar disquete" + +#: ../tcos-devices-ng.py:372 +msgid "Umount Floppy" +msgstr "Desmontar disquete" + +#: ../tcos-devices-ng.py:382 +msgid "Floppy mounted. Ready for use." +msgstr "O disquete foi montado. Agora pode usá-lo." + +#: ../tcos-devices-ng.py:384 +msgid "Floppy umounted. You can extract it." +msgstr "O disquete foi desmontado. Agora pode removê-lo." + +#: ../tcos-devices-ng.py:400 +msgid "Hard disk partition mounted. Ready for use." +msgstr "A partição foi montada. Agora pode usá-la." + +#: ../tcos-devices-ng.py:403 +msgid "Hard disk partition umounted." +msgstr "A partição foi desmontada." + +#: ../tcos-devices-ng.py:425 +msgid "Audio cdrom mounted., you can listen music opening wav files." +msgstr "" +"CD-ROM com músicas montado. Agora você pode ouví-las abrindo os arquivos *." +"wav." + +#: ../tcos-devices-ng.py:427 +msgid "Cdrom mounted. Ready for use." +msgstr "O CD-ROM foi montado. Agora pode usá-lo." + +#: ../tcos-devices-ng.py:430 +msgid "Cdrom umounted. You can extract it." +msgstr "O CD-ROM foi desmontado. Agora pode removê-lo." + +#: ../tcos-devices-ng.py:529 +#, python-format +msgid "" +"Mounting device %s\n" +"Please wait..." +msgstr "" +"Montando o dispositivo %s.\n" +"Por favor, espere..." + +#: ../tcos-devices-ng.py:578 +msgid "Error mounting LTSPFS, check versions of LTSPFS packages" +msgstr "" +"Erro ao montar o LTSPFS.\n" +"Verifique as versões dos pacotes do LTSPFS." + +#: ../tcos-devices-ng.py:604 +#, python-format +msgid "" +"Umounting device %s.\n" +"Please wait..." +msgstr "" +"Desmontando o dispositivo %s.\n" +"Por favor, espere..." + +#: ../tcos-devices-ng.py:651 +msgid "usbdisk" +msgstr "Disco USB" + +#: ../tcos-devices-ng.py:653 +msgid "firewiredisk" +msgstr "Disco Firewire" + +#: ../tcos-devices-ng.py:678 +msgid "Can't mount floppy" +msgstr "Não foi possível montar o disquete." + +#: ../tcos-devices-ng.py:689 +msgid "Can't umount floppy" +msgstr "Não foi possível desmontar o disquete." + +#: ../tcos-devices-ng.py:702 ../tcos-devices-ng.py:712 +#: ../tcos-devices-ng.py:723 ../tcos-devices-ng.py:836 +#: ../tcos-devices-ng.py:848 ../tcos-devices-ng.py:867 +#: ../tcos-devices-ng.py:879 ../tcos-devices-ng.py:911 +#, python-format +msgid "Cdrom_%s" +msgstr "CD-ROM_%s" + +#: ../tcos-devices-ng.py:710 +msgid "Can't mount cdrom" +msgstr "Não foi possível montar o CD-ROM." + +#: ../tcos-devices-ng.py:726 +msgid "Can't umount cdrom" +msgstr "Não foi possível desmontar o CD-ROM." + +#: ../tcos-devices-ng.py:742 ../tcos-devices-ng.py:752 +#: ../tcos-devices-ng.py:763 +#, python-format +msgid "Disk_%s" +msgstr "Disco_%s" + +#: ../tcos-devices-ng.py:750 +msgid "Can't mount hard disk partition" +msgstr "Não foi possível montar a partição." + +#: ../tcos-devices-ng.py:766 +msgid "Can't umount hard disk partition" +msgstr "Não foi possível desmontar a partição." + +#: ../tcos-devices-ng.py:807 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Connected CDROM USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"A partir do terminal %(host)s,\n" +"o dispositivo CD-ROM USB %(device)s\n" +"%(vendor)s %(model)s foi conectado." + +#: ../tcos-devices-ng.py:811 +#, python-format +msgid "CDROM USB device %s" +msgstr "Dispositivo CD-ROM/USB %s" + +#: ../tcos-devices-ng.py:814 +#, python-format +msgid "Mount CDROM USB device %s" +msgstr "Montar o dispositivo CD-ROM/ USB %s" + +#: ../tcos-devices-ng.py:815 +#, python-format +msgid "Umount CDROM USB device %s" +msgstr "Desmontar o dispositivo CD-ROM/USB %s" + +#: ../tcos-devices-ng.py:840 ../tcos-devices-ng.py:871 +#: ../tcos-devices-ng.py:1001 ../tcos-devices-ng.py:1012 +#: ../tcos-devices-ng.py:1058 ../tcos-devices-ng.py:1138 +#: ../tcos-devices-ng.py:1149 ../tcos-devices-ng.py:1195 +#, python-format +msgid "Error, can't mount device %s" +msgstr "Erro! Não foi possível montar o dispositivo %s" + +#: ../tcos-devices-ng.py:898 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Disconnected CDROM USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"A partir do terminal %(host)s,\n" +"o dispositivo CD-ROM USB %(device)s\n" +"%(vendor)s %(model)s foi desconectado." + +#: ../tcos-devices-ng.py:926 +#, python-format +msgid "Can't umount cdrom usb %s" +msgstr "Não foi possível desmontar o CD-ROM/USB %s." + +#: ../tcos-devices-ng.py:951 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Connected USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"A partir do terminal %(host)s,\n" +"o dispositivo USB %(device)s\n" +"%(vendor)s %(model)s foi conectado." + +#: ../tcos-devices-ng.py:954 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Disconnected USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"A partir do terminal %(host)s,\n" +"o dispositivo USB %(device)s\n" +"%(vendor)s %(model)s foi desconectado." + +#: ../tcos-devices-ng.py:982 +#, python-format +msgid "USB device %s" +msgstr "Dispositivo USB %s" + +#: ../tcos-devices-ng.py:985 +#, python-format +msgid "Mount USB device %s" +msgstr "Montar o dispositivo USB %s" + +#: ../tcos-devices-ng.py:986 +#, python-format +msgid "Umount USB device %s" +msgstr "Desmontar o dispositivo USB %s" + +#: ../tcos-devices-ng.py:1088 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Connected Firewire device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"A partir do terminal %(host)s,\n" +"o dispositivo firewire %(device)s\n" +"\"%(vendor)s %(model)s foi conectado." + +#: ../tcos-devices-ng.py:1091 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Disconnected Firewire device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"A partir do terminal %(host)s,\n" +"o dispositivo firewire %(device)s\n" +"%(vendor)s %(model)s foi desconectado." + +#: ../tcos-devices-ng.py:1119 +#, python-format +msgid "Firewire device %s" +msgstr "Dispositivo Firewire %s" + +#: ../tcos-devices-ng.py:1122 +#, python-format +msgid "Mount Firewire device %s" +msgstr "Montar o dispositivo Firewire %s" + +#: ../tcos-devices-ng.py:1123 +#, python-format +msgid "Umount Firewire device %s" +msgstr "Desmontar o dispositivo Firewire %s" + +#: ../tcos-devices-ng.py:1206 +#, python-format +msgid "CDROM USB device %s umounted. You can extract it." +msgstr "" +"O dispositivo CD-ROM USB %s foi desmontado.\n" +"Agora você pode removê-lo." + +#: ../tcos-devices-ng.py:1209 +#, python-format +msgid "CDROM USB device %s mounted. Ready for use." +msgstr "" +"O dispositivo CD-ROM USB %s foi montado.\n" +"Agora você pode usá-lo." + +#: ../tcos-devices-ng.py:1247 +#, python-format +msgid "USB device %s umounted. You can extract it." +msgstr "" +"O dispositivo USB %s foi desmontado.\n" +"Agora você pode removê-lo." + +#: ../tcos-devices-ng.py:1250 +#, python-format +msgid "USB device %s mounted. Ready for use." +msgstr "" +"O dispositivo USB %s foi montado.\n" +"Agora você pode usá-lo." + +#: ../tcos-devices-ng.py:1286 +#, python-format +msgid "Firewire device %s umounted. You can extract it." +msgstr "" +"O dispositivo Firewire %s foi desmontado.\n" +"Agora você pode removê-lo." + +#: ../tcos-devices-ng.py:1289 +#, python-format +msgid "Firewire device %s mounted. Ready for use." +msgstr "" +"O dispositivo Firewire %s foi montado\n" +"Agora você pode usá-lo." + +#: ../tcospersonalize.py:115 +msgid "" +"Need a host to configure!!!\n" +"Try exec:\n" +" tcospersonalize --host=XXX.XXX.XXX.XXX" +msgstr "" +"Necessita configurar um terminal?\n" +"Então, execute:\n" +"tcospersonalize --host=XXX.XXX.XXX.XXX" + +#: ../tcospersonalize.py:190 +msgid "host: " +msgstr "terminal: " + +#: ../tcospersonalize.py:454 +msgid "Host down, can't connect to tcosxmlrpc." +msgstr "Terminal inacessível, não foi possível conectar ao TcosXmlRpc." + +#: ../tcospersonalize.py:462 +#, python-format +msgid "New %d drivers loaded from terminal." +msgstr "" +"%d novos drivers foram carregados\n" +"à partir do terminal." + +#: ../tcospersonalize.py:521 +#, python-format +msgid "Really delete config of %s?" +msgstr "Quer apagar o arquivo de configuração de %s?" + +#: ../tcospersonalize.py:524 +msgid "Deleted!" +msgstr "Deletado!" + +#: ../tcos-volume-manager.py:101 ../tcos-volume-manager.py:113 +#, python-format +msgid "" +"Tcos Sound levels on:\n" +"%s" +msgstr "" +"Níveis de som TCOS em:\n" +"\"%s" + +#: ../tcos-volume-manager.py:121 +#, python-format +msgid "ERROR: It appears that TcosXmlRpc is not running on %s." +msgstr "Erro! O TcosXmlRpc não está sendo executado em %s" + +#: ../tcos-volume-manager.py:217 +msgid "Loading channels info..." +msgstr "Carregando as informações dos canais ..." + +#: ../tcos-volume-manager.py:230 +msgid "Error loading channels info (xauth error)" +msgstr "Erro ao Carregar as informações de canais (erro de xauth)." + +#: ../tcos-volume-manager.py:233 ../ui/tcos-volume-manager.ui:8 +msgid "Tcos Volume Manager" +msgstr "Gerenciador de volume TCOS" + +#: ../tcos-volume-manager.py:234 +#, python-format +msgid "<span size='large'><b>Sound mixer of %s host</b></span>" +msgstr "<span size='large'><b>Mixador de áudio do terminal %s</b></span>" + +#: ../tcos-volume-manager.py:300 ../tcosmonitor/extensions/info.py:442 +msgid "Mute" +msgstr "Mudo" + +#: ../tcos-volume-manager.py:319 +msgid "Main controls ready" +msgstr "Controles principais carregados" + +#: ../tcos-volume-manager.py:323 +msgid "All remote controls loaded." +msgstr "Todos os controles remotos foram carregados." + +#: ../tcos-volume-manager.py:332 ../tcosmonitor/extensions/info.py:557 +#, python-format +msgid "Changing value of %(channel)s channel, to %(value)s%%..." +msgstr "Alterando o valor do canal de %(channel)s, para %(value)s%% ..." + +#: ../tcos-volume-manager.py:339 ../tcosmonitor/extensions/info.py:564 +#, python-format +msgid "Changed value of %(channel)s channel, to %(value)s" +msgstr "Valor alterado do canal de %(channel)s, para %(value)s" + +#: ../tcos-volume-manager.py:346 ../tcosmonitor/extensions/info.py:571 +#, python-format +msgid "Unmuting %s channel..." +msgstr "Desativando o mudo do canal %s ..." + +#: ../tcos-volume-manager.py:351 ../tcosmonitor/extensions/info.py:576 +#, python-format +msgid "Muting %s channel..." +msgstr "Ativando o mudo no canal %s ..." + +#: ../tcos-volume-manager.py:354 ../tcosmonitor/extensions/info.py:579 +#, python-format +msgid "Status of %(channel)s channel, is \"%(newvalue)s\"" +msgstr "O estado atual do canal %(channel)s é: \"%(newvalue)s\"" + +#: ../tcosmonitor/TcosDBus.py:94 +msgid "TcosDBus not allowed in local display" +msgstr "Não é permitido usar o TcosDBus localmente." + +#: ../tcosmonitor/TcosDBus.py:122 +#, python-format +msgid "Seems that tcosxmlrpc isn't running on host=\"%s\"" +msgstr "O tcosxmlrpc não está sendo executado no terminal = \"%s\"" + +#: ../tcosmonitor/TcosDBus.py:143 +msgid "tcosxmlrpc ERROR conection unavalaible." +msgstr "ERRO! Não há conexão com o tcosxmlrpc." + +#: ../tcosmonitor/TcosDBus.py:159 +msgid "ERROR conecting to tcosxmlrpc, check username and password." +msgstr "" +"ERRO! Não foi possível conectar ao tcosxmlrpc. Verifique o usuário e a senha." + +#: ../tcosmonitor/TcosDBus.py:251 +msgid "Message from admin" +msgstr "Mensagem do administrador" + +#: ../tcosmonitor/TcosDBus.py:341 ../tcosmonitor/TcosDBus.py:357 +#: ../tcosmonitor/TcosDBus.py:375 ../tcosmonitor/TcosDBus.py:393 +msgid "User not allowed to run this dbus call." +msgstr "Este usuário não tem permissões para executar chamadas dbus." + +#: ../tcosmonitor/TcosStaticHosts.py:163 ../tcosmonitor/TcosListView.py:70 +msgid "IP address" +msgstr "Endereço IP" + +#: ../tcosmonitor/TcosStaticHosts.py:169 +#: ../ui/tcosmonitor-staticwindownew.ui:68 +msgid "MAC address" +msgstr "Endereço MAC" + +#: ../tcosmonitor/TcosStaticHosts.py:279 +msgid "No hosts found, please click on Refresh button using another method." +msgstr "" +"Nenhum terminal foi encontrado. Por favor\n" +"clique no botão atualizar para usar outro método." + +#: ../tcosmonitor/shared.py:108 +msgid "Traditional list only" +msgstr "Somente a Listagem Tradicional" + +#: ../tcosmonitor/shared.py:109 +msgid "Icons only" +msgstr "Somente ícones" + +#: ../tcosmonitor/shared.py:110 +msgid "Simulate classroom" +msgstr "Simule uma sala de aula" + +#: ../tcosmonitor/shared.py:111 +msgid "Lists, icons and classroom with tabs" +msgstr "Listas, ícones e sala de aula" + +#: ../tcosmonitor/shared.py:270 ../tcosmonitor/shared.py:312 +#: ../tcosmonitor/TcosMenus.py:35 +msgid "Terminal actions" +msgstr "Ações do Terminal" + +#: ../tcosmonitor/shared.py:271 ../tcosmonitor/shared.py:313 +#: ../tcosmonitor/TcosMenus.py:36 +msgid "User actions" +msgstr "Ações do usuário" + +#: ../tcosmonitor/shared.py:272 ../tcosmonitor/shared.py:314 +#: ../tcosmonitor/TcosMenus.py:37 +msgid "Audio, video and files" +msgstr "Áudio, vídeo e arquivos" + +#: ../tcosmonitor/shared.py:279 ../tcosmonitor/extensions/info.py:47 +msgid "Refresh terminal info" +msgstr "Atualizar as informações do terminal" + +#: ../tcosmonitor/shared.py:280 ../tcosmonitor/extensions/clean.py:40 +#: ../tcosmonitor/extensions/clean.py:41 +msgid "Clean info about terminal" +msgstr "Limpar as informações do terminal" + +#: ../tcosmonitor/shared.py:281 ../tcosmonitor/TcosTrayIcon.py:54 +#: ../tcosmonitor/extensions/reboot.py:40 ../tcosmonitor/TcosTrayIcon2.py:58 +msgid "Reboot" +msgstr "Reiniciar" + +#: ../tcosmonitor/shared.py:282 ../tcosmonitor/TcosTrayIcon.py:55 +#: ../tcosmonitor/extensions/reboot.py:42 ../tcosmonitor/TcosTrayIcon2.py:59 +msgid "Poweroff" +msgstr "Desligar" + +#: ../tcosmonitor/shared.py:283 ../tcosmonitor/extensions/lockscreen.py:40 +msgid "Lock screen" +msgstr "Bloquear a tela" + +#: ../tcosmonitor/shared.py:284 ../tcosmonitor/extensions/lockscreen.py:42 +msgid "Unlock screen" +msgstr "Desbloquear a tela" + +#: ../tcosmonitor/shared.py:285 ../tcosmonitor/extensions/italc.py:43 +msgid "Connect to remote screen (iTALC)" +msgstr "Conectar a uma tela remota (iTALC)" + +#: ../tcosmonitor/shared.py:286 ../tcosmonitor/extensions/vnc.py:54 +msgid "Connect to remote screen (VNC)" +msgstr "Conectar a uma tela remota (VNC)" + +#: ../tcosmonitor/shared.py:287 ../tcosmonitor/extensions/screenshot.py:45 +msgid "Screenshot" +msgstr "Captura de tela" + +#: ../tcosmonitor/shared.py:288 ../tcosmonitor/extensions/remotessh.py:40 +msgid "Give a remote xterm" +msgstr "Executar um xterm remoto" + +#: ../tcosmonitor/shared.py:289 +#: ../tcosmonitor/extensions/tcospersonalize.py:40 +#: ../ui/tcosmonitor-prefwindow.ui:1324 +msgid "Configure this host" +msgstr "Configurar este terminal" + +#: ../tcosmonitor/shared.py:290 ../tcosmonitor/extensions/logout.py:40 +msgid "Logout client" +msgstr "Encerrar a sessão do usuário" + +#: ../tcosmonitor/shared.py:291 ../tcosmonitor/extensions/restartxorg.py:41 +msgid "Restart X session with new settings" +msgstr "Reiniciar a sessão gráfica com as novas configuraçãos" + +#: ../tcosmonitor/shared.py:292 ../tcosmonitor/extensions/appsmsg.py:52 +msgid "Exec app on user display" +msgstr "Executar uma aplicação na sessão do usuário" + +#: ../tcosmonitor/shared.py:293 ../tcosmonitor/extensions/appsmsg.py:53 +msgid "Send a text message to user" +msgstr "Enviar uma mensagem de texto ao usuário" + +#: ../tcosmonitor/shared.py:294 ../tcosmonitor/extensions/viewproc.py:41 +msgid "Show running apps of this client" +msgstr "Mostrar as aplicações executadas neste terminal" + +#: ../tcosmonitor/shared.py:295 ../tcosmonitor/shared.py:332 +msgid "Audio/Video broadcast" +msgstr "Difusão de áudio/vídeo" + +#: ../tcosmonitor/shared.py:296 ../tcosmonitor/shared.py:333 +#: ../tcosmonitor/extensions/sendfiles.py:49 +#: ../tcosmonitor/extensions/sendfiles.py:50 +#: ../ui/tcosmonitor-prefwindow.ui:1134 ../ui/tcosmonitor-prefwindow.ui:1475 +#: ../ui/tcosmonitor-mainwindow.ui:387 +msgid "Send files" +msgstr "Enviar arquivos" + +#: ../tcosmonitor/shared.py:297 ../tcosmonitor/extensions/vnc.py:55 +msgid "Demo mode (from this host)" +msgstr "Modo demostração (a partir deste terminal)" + +#: ../tcosmonitor/shared.py:298 ../tcosmonitor/extensions/wakeonlan.py:41 +msgid "Boot client (WakeOnLan)" +msgstr "Inicializar o terminal (WakeOnLan)" + +#: ../tcosmonitor/shared.py:299 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:38 +msgid "Lock internet" +msgstr "Bloquear o acesso a Internet" + +#: ../tcosmonitor/shared.py:300 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:39 +msgid "Unlock internet" +msgstr "Desbloquear o acesso a Internet" + +#: ../tcosmonitor/shared.py:301 ../tcosmonitor/extensions/dpms.py:40 +msgid "DPMS Power off monitor" +msgstr "Desligar o DPMS no monitor" + +#: ../tcosmonitor/shared.py:302 ../tcosmonitor/extensions/dpms.py:42 +msgid "DPMS Power on monitor" +msgstr "Ligar o DPMS no monitor" + +#: ../tcosmonitor/shared.py:303 +msgid "Send MIC audio (from this host)" +msgstr "Enviar o áudio do microfone (à partir deste terminal)" + +#: ../tcosmonitor/shared.py:321 ../tcosmonitor/extensions/reboot.py:41 +msgid "Reboot all clients" +msgstr "Reiniciar todos os terminais" + +#: ../tcosmonitor/shared.py:322 ../tcosmonitor/extensions/reboot.py:43 +msgid "Poweroff all clients" +msgstr "Desligar todos os terminais" + +#: ../tcosmonitor/shared.py:323 ../tcosmonitor/extensions/lockscreen.py:41 +msgid "Lock all screens" +msgstr "Bloquear todas as telas" + +#: ../tcosmonitor/shared.py:324 ../tcosmonitor/extensions/lockscreen.py:43 +msgid "Unlock all screens" +msgstr "Desbloquear todas as telas" + +#: ../tcosmonitor/shared.py:325 ../tcosmonitor/extensions/logout.py:41 +msgid "Logout clients" +msgstr "Encerrar as sessões dos usuários" + +#: ../tcosmonitor/shared.py:326 ../tcosmonitor/extensions/restartxorg.py:42 +msgid "Restart X session of all clients" +msgstr "Reiniciar a sessão gráfica de todos os usuários" + +#: ../tcosmonitor/shared.py:327 ../tcosmonitor/extensions/appsmsg.py:55 +msgid "Exec same app in all connected users" +msgstr "" +"Executar a mesma aplicação em todas\n" +"as sessões dos usuários conectados" + +#: ../tcosmonitor/shared.py:328 ../tcosmonitor/extensions/appsmsg.py:56 +msgid "Send a text message to all connected users" +msgstr "Enviar uma mensagem de texto a todos os usuários conectados" + +#: ../tcosmonitor/shared.py:329 ../tcosmonitor/extensions/vnc.py:57 +msgid "Enter demo mode, all connected users see my screen" +msgstr "Iniciar modo de demostração. Todos os usuários verão a minha tela" + +#: ../tcosmonitor/shared.py:330 +msgid "Enter conference mode, all connected users can hear me" +msgstr "Iniciar o modo conferência. Todos os usuários poderão me ouvir" + +#: ../tcosmonitor/shared.py:331 ../tcosmonitor/extensions/screenshot.py:46 +msgid "Capture All clients screens" +msgstr "Capturar todas as telas" + +#: ../tcosmonitor/shared.py:334 ../tcosmonitor/extensions/wakeonlan.py:42 +msgid "Boot All clients (WakeOnLan)" +msgstr "Inicializar todos os terminais (WakeOnLan)" + +#: ../tcosmonitor/shared.py:335 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:41 +msgid "Lock internet in all connected users" +msgstr "Bloquear o acesso a Internet de todos os usuários conectados" + +#: ../tcosmonitor/shared.py:336 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:42 +msgid "Unlock internet in all connected users" +msgstr "Desbloquear o acesso a Internet de todos os usuários conectados" + +#: ../tcosmonitor/shared.py:337 ../tcosmonitor/extensions/dpms.py:41 +msgid "DPMS Power off monitors" +msgstr "Desligar o DPMS nos monitores" + +#: ../tcosmonitor/shared.py:338 ../tcosmonitor/extensions/dpms.py:43 +msgid "DPMS Power on monitors" +msgstr "Ligar o DPMS nos monitores" + +#: ../tcosmonitor/shared.py:339 +msgid "Chat audio conference" +msgstr "Chat de audioconferência" + +#: ../tcosmonitor/shared.py:340 ../tcosmonitor/extensions/livevnc.py:51 +#: ../ui/tcosmonitor-prefwindow.ui:1342 +msgid "Live view screens with VNC" +msgstr "" + +#: ../tcosmonitor/shared.py:538 +#, python-format +msgid "QUESTION: %(txt)s, RESPONSE %(response)s" +msgstr "PERGUNTA: %(txt)s, RESPOSTA %(response)s" + +#: ../tcosmonitor/shared.py:555 ../tcosmonitor/shared.py:566 +#, python-format +msgid "INFO: %s" +msgstr "INFORMAÇÂO: %s" + +#: ../tcosmonitor/shared.py:577 +#, python-format +msgid "ERROR: %s" +msgstr "ERRO: %s" + +#: ../tcosmonitor/TcosClassView.py:50 ../tcosmonitor/TcosIconView.py:47 +msgid "IP" +msgstr "IP" + +#: ../tcosmonitor/TcosClassView.py:51 ../tcosmonitor/TcosIconView.py:48 +#: ../tcosmonitor/TcosListView.py:64 +msgid "Hostname" +msgstr "Nome do Terminal" + +#: ../tcosmonitor/TcosClassView.py:52 ../tcosmonitor/TcosIconView.py:49 +#: ../tcosmonitor/TcosListView.py:76 +msgid "Username" +msgstr "Usuário" + +#: ../tcosmonitor/TcosClassView.py:53 ../tcosmonitor/TcosIconView.py:50 +#: ../tcosmonitor/TcosListView.py:87 +msgid "Logged" +msgstr "Logado" + +#: ../tcosmonitor/TcosClassView.py:54 ../tcosmonitor/TcosIconView.py:51 +#: ../tcosmonitor/TcosListView.py:103 +msgid "Time log in" +msgstr "Tempo Ligado" + +#: ../tcosmonitor/TcosClassView.py:55 ../tcosmonitor/TcosIconView.py:52 +msgid "Screen locked" +msgstr "Tela bloqueada" + +#: ../tcosmonitor/TcosClassView.py:56 ../tcosmonitor/TcosIconView.py:53 +msgid "Network locked" +msgstr "Rede bloqueada" + +#: ../tcosmonitor/TcosClassView.py:58 +msgid "" +"Place mouse on any computer to see brief info about it.\n" +"You can select and unselect multiple host clicking on every one.\n" +"Drag and drop hosts to positions and save clicking on right mouse button." +msgstr "" +"Ao passar o mouse sobre qualquer terminal, você verá uma\n" +"breve descrição. Para mudá-lo de lugar, selecione um terminal\n" +"clicando com botão esquerdo do mouse, arraste e solte para \n" +"salvar a nova localização." + +#: ../tcosmonitor/TcosClassView.py:179 +msgid "Positions reset to defaults." +msgstr "Restaurar a posição padrão" + +#: ../tcosmonitor/TcosClassView.py:197 +msgid "Positions saved." +msgstr "Posição salva" + +#: ../tcosmonitor/TcosClassView.py:323 +#, python-format +msgid "%s is not a valid file to exe or send" +msgstr "%s este não é um arquivo válido para ser executado/enviado" + +#: ../tcosmonitor/TcosClassView.py:409 ../tcosmonitor/TcosIconView.py:156 +msgid "yes" +msgstr "sim" + +#: ../tcosmonitor/TcosClassView.py:411 ../tcosmonitor/TcosIconView.py:158 +msgid "no" +msgstr "não" + +#: ../tcosmonitor/TcosTrayIcon.py:49 ../tcosmonitor/extensions/vnc.py:298 +#: ../tcosmonitor/TcosTrayIcon2.py:53 ../ui/tcosmonitor-mainwindow.ui:23 +msgid "Quit" +msgstr "Sair" + +#: ../tcosmonitor/TcosTrayIcon.py:65 +msgid "TcosDevices" +msgstr "TcosDevices" + +#: ../tcosmonitor/TcosTrayIcon.py:172 ../tcosmonitor/TcosTrayIcon.py:186 +#: ../tcosmonitor/TcosTrayIcon2.py:67 +msgid "Tcos Devices" +msgstr "Dispositivos TCOS" + +#: ../tcosmonitor/TcosTrayIcon.py:232 ../tcosmonitor/TcosTrayIcon2.py:351 +msgid "Usb flash" +msgstr "Memória flash USB" + +#: ../tcosmonitor/TcosTrayIcon.py:234 ../tcosmonitor/TcosTrayIcon2.py:353 +msgid "Mount USB1" +msgstr "Montar USB1" + +#: ../tcosmonitor/TcosTrayIcon.py:235 ../tcosmonitor/TcosTrayIcon2.py:354 +msgid "Umount USB1" +msgstr "Desmontar USB1" + +#: ../tcosmonitor/extensions/lockscreen.py:49 +#: ../tcosmonitor/extensions/lockscreen.py:57 +msgid "" +"Can't connect to tcosxmlrpc.\n" +"Please verify user and password in prefences!" +msgstr "" +"Não foi possível se conectar ao TcosXmlRpc.\n" +"Por favor verifique o usuário e a senha no menu preferências." + +#: ../tcosmonitor/extensions/lockscreen.py:81 +#, python-format +msgid "Do you want to lock the following screens: %s?" +msgstr "Quer bloquear a tela dos seguintes terminais: %s?" + +#: ../tcosmonitor/extensions/lockscreen.py:90 +#, python-format +msgid "Do you want to unlock the following screens: %s?" +msgstr "Quer desbloquear a tela dos seguintes terminais: %s?" + +#: ../tcosmonitor/extensions/appsmsg.py:64 +msgid "Clients not connected" +msgstr "Não há usuários conectados." + +#: ../tcosmonitor/extensions/appsmsg.py:87 +#, python-format +msgid "" +"<b>Exec app in user(s) screen(s)\n" +"or open web address to:</b>\n" +"%s" +msgstr "" +"<b>Executar a aplicação na sessão do(s) \n" +"usuário(s) ou abrir endereço Web:</b>%s" + +#: ../tcosmonitor/extensions/appsmsg.py:89 +#, python-format +msgid "" +"<b>Send a message to:</b>\n" +"%s" +msgstr "" +"<b>Enviar uma mensagem a:</b>\n" +"%s" + +#: ../tcosmonitor/extensions/appsmsg.py:122 +#: ../tcosmonitor/extensions/appsmsg.py:163 +msgid "Can't exec application, user is not logged" +msgstr "" +"Não foi possível executar a aplicação,\n" +"o usuário não está logado" + +#: ../tcosmonitor/extensions/appsmsg.py:141 +#: ../tcosmonitor/extensions/appsmsg.py:152 +#, python-format +msgid "%s is not a valid application" +msgstr "%s não é uma aplicação válida." + +#: ../tcosmonitor/extensions/appsmsg.py:172 +msgid "Can't send message, user is not logged" +msgstr "" +"Não foi possível enviar as mensagens,\n" +"o usuário não está conectado." + +#: ../tcosmonitor/extensions/appsmsg.py:289 +#: ../tcosmonitor/extensions/appsmsg.py:298 +#, python-format +msgid "%s is not application" +msgstr "%s não é uma aplicação." + +#: ../tcosmonitor/extensions/appsmsg.py:353 +#, python-format +msgid "" +"Error while exec remote app:\n" +"Reason: %s" +msgstr "" +"Erro ao executar a aplicação remota:\n" +"Motivo: %s" + +#: ../tcosmonitor/extensions/appsmsg.py:360 +#, python-format +msgid "" +"Error while send message:\n" +"Reason: %s" +msgstr "" +"Erro ao enviar a mensagem:\n" +"Motivo: %s" + +#: ../tcosmonitor/extensions/remotessh.py:47 +msgid "Enter password of remote thin client (if asked for it)" +msgstr "Informe a senha do terminal remoto (se for solicitado)" + +#: ../tcosmonitor/extensions/dpms.py:79 +#, python-format +msgid "Do you want to switch off the following monitors: %s?" +msgstr "Quer desligar os monitores dos seguintes terminais: %s?" + +#: ../tcosmonitor/extensions/dpms.py:88 +#, python-format +msgid "Do you want to switch on the following monitors: %s?" +msgstr "Quer ligar os monitores dos seguintes terminais: %s?" + +#: ../tcosmonitor/extensions/screenshot.py:66 +#: ../tcosmonitor/extensions/screenshot.py:83 +#, python-format +msgid "Can't make screenshot, error: %s" +msgstr "Não pôde fazer uma captura de tela, erro: %s" + +#: ../tcosmonitor/extensions/screenshot.py:75 +msgid "Trying to order terminal to do a screenshot..." +msgstr "Tentando capturar a tela do terminal..." + +#: ../tcosmonitor/extensions/screenshot.py:87 +msgid "Get another screenshot" +msgstr "Capturar outra tela" + +#: ../tcosmonitor/extensions/screenshot.py:102 +#, python-format +msgid "Screenshot of <span style='font-style: italic'>%s</span>" +msgstr "Captura de tela de <span style='font-style: italic'>%s</span>" + +#: ../tcosmonitor/extensions/screenshot.py:125 +#, python-format +msgid "Screenshot of %s, done." +msgstr "Tela do %s capturada." + +#: ../tcosmonitor/extensions/screenshot.py:139 +msgid "Save Screenshot" +msgstr "Captura de tela salva" + +#: ../tcosmonitor/extensions/screenshot.py:151 +msgid "Select file to save screenshot..." +msgstr "Selecionar a captura de tela salva" + +#: ../tcosmonitor/extensions/screenshot.py:155 +#, python-format +msgid "screenshot_of_%(hostname)s_date_%(date)s.png" +msgstr "tela de %(hostname)s data %(date)s.png" + +#: ../tcosmonitor/extensions/screenshot.py:159 +msgid "Image Files ( *.png, *.jpg)" +msgstr "Arquivos de imagem (*.png, *.jpg)" + +#: ../tcosmonitor/extensions/screenshot.py:169 +msgid "File must be png or jpg." +msgstr "O arquivo deve ser no formato png or jpg." + +#: ../tcosmonitor/extensions/screenshot.py:192 +msgid "Screenshots of all hosts" +msgstr "Captura de tela de todos os terminais" + +#: ../tcosmonitor/extensions/screenshot.py:208 +#, python-format +msgid "Screenshot of %s" +msgstr "Captura de tela de %s" + +#: ../tcosmonitor/extensions/sendfiles.py:62 +#: ../tcosmonitor/extensions/sendfiles.py:120 +msgid "Can't send files, user is not logged" +msgstr "Não foi possível enviar os arquivos, o usuário não está logado." + +#: ../tcosmonitor/extensions/sendfiles.py:66 +#: ../tcosmonitor/extensions/sendfiles.py:142 +#: ../tcosmonitor/extensions/sendfiles.py:237 +msgid "" +"TcosMonitor need special configuration for rsync daemon to send files.\n" +"\n" +"Please read configuration requeriments in:\n" +"/usr/share/doc/tcosmonitor/README.rsync" +msgstr "" +"O TcosMonitor necessita de uma configuraçao especial\n" +"no daemon rsync para o envio de arquivos.\n" +"\n" +"Leia a configuração requerida em:\n" +"/usr/share/doc/tcosmonitor/README.rsync" + +#: ../tcosmonitor/extensions/sendfiles.py:84 +#: ../tcosmonitor/extensions/sendfiles.py:176 +#: ../tcosmonitor/extensions/sendfiles.py:270 +msgid "Waiting for send files..." +msgstr "Aguardando o envio dos arquivos..." + +#: ../tcosmonitor/extensions/sendfiles.py:93 +#: ../tcosmonitor/extensions/sendfiles.py:95 +#: ../tcosmonitor/extensions/sendfiles.py:99 +#: ../tcosmonitor/extensions/sendfiles.py:108 +#: ../tcosmonitor/extensions/sendfiles.py:189 +#: ../tcosmonitor/extensions/sendfiles.py:191 +#: ../tcosmonitor/extensions/sendfiles.py:195 +#: ../tcosmonitor/extensions/sendfiles.py:204 +#: ../tcosmonitor/extensions/sendfiles.py:283 +#: ../tcosmonitor/extensions/sendfiles.py:285 +#: ../tcosmonitor/extensions/sendfiles.py:289 +#: ../tcosmonitor/extensions/sendfiles.py:298 +msgid "Teacher" +msgstr "Professor" + +#: ../tcosmonitor/extensions/sendfiles.py:95 +#: ../tcosmonitor/extensions/sendfiles.py:108 +#: ../tcosmonitor/extensions/sendfiles.py:191 +#: ../tcosmonitor/extensions/sendfiles.py:204 +#: ../tcosmonitor/extensions/sendfiles.py:285 +#: ../tcosmonitor/extensions/sendfiles.py:298 +#, python-format +msgid "" +"Teacher has sent some files to %(teacher)s folder:\n" +"\n" +"%(basenames)s" +msgstr "" +"O professor enviou vários arquivos a pasta %(teacher)s:\n" +"\n" +"%(basenames)s" + +#: ../tcosmonitor/extensions/sendfiles.py:104 +#: ../tcosmonitor/extensions/sendfiles.py:200 +#: ../tcosmonitor/extensions/sendfiles.py:294 +#: ../tcosmonitor/extensions/reboot.py:108 +#: ../tcosmonitor/extensions/videolan.py:194 +#: ../tcosmonitor/extensions/videolan.py:389 +#: ../tcosmonitor/extensions/videolan.py:629 +#, python-format +msgid "" +"Error while exec remote app:\n" +"Reason:%s" +msgstr "" +"Erro ao executar a aplicação remota:\n" +"Motivo: %s" + +#: ../tcosmonitor/extensions/sendfiles.py:105 +#: ../tcosmonitor/extensions/sendfiles.py:201 +#: ../tcosmonitor/extensions/sendfiles.py:295 +msgid "Error creating destination folder." +msgstr "Erro ao criar o diretório destino." + +#: ../tcosmonitor/extensions/sendfiles.py:110 +#: ../tcosmonitor/extensions/sendfiles.py:205 +#: ../tcosmonitor/extensions/sendfiles.py:300 +msgid "Files sent." +msgstr "Arquivos enviados." + +#: ../tcosmonitor/extensions/sendfiles.py:125 +#: ../tcosmonitor/extensions/sendfiles.py:220 +msgid "Select file or files..." +msgstr "Selecionar os arquivos..." + +#: ../tcosmonitor/extensions/sendfiles.py:178 +#: ../tcosmonitor/extensions/sendfiles.py:272 +msgid "Do you want open file(s) on client?" +msgstr "Você quer abrir o(s) arquivo(s) no terminal?" + +#: ../tcosmonitor/extensions/sendfiles.py:215 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:113 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:155 +#: ../tcosmonitor/extensions/videolan.py:457 +#: ../tcosmonitor/extensions/vnc.py:68 ../tcosmonitor/extensions/vnc.py:112 +#: ../tcosmonitor/extensions/vnc.py:422 +#: ../tcosmonitor/extensions/audiortp.py:229 +#: ../tcosmonitor/extensions/audiortp.py:275 +#: ../tcosmonitor/extensions/audiortp.py:373 +#: ../tcosmonitor/extensions/audiortp.py:407 +#: ../tcosmonitor/extensions/audiortp.py:460 +msgid "No users logged." +msgstr "Não há usuários logados." + +#: ../tcosmonitor/extensions/info.py:91 +#, python-format +msgid "Connecting with %s to retrieve some info..." +msgstr "Conectando a %s para obter alguma informação..." + +#: ../tcosmonitor/extensions/info.py:117 +msgid "Tcos info" +msgstr "Informação do TCOS" + +#: ../tcosmonitor/extensions/info.py:120 +msgid "PXES info" +msgstr "Informação do PXE" + +#: ../tcosmonitor/extensions/info.py:123 +msgid "LTSP info" +msgstr "Informação do LTSP" + +#: ../tcosmonitor/extensions/info.py:126 +msgid "Standalone info" +msgstr "Informação do Standalone " + +#: ../tcosmonitor/extensions/info.py:129 +msgid "Unknow client info" +msgstr "Informação desconhecida do terminal" + +#: ../tcosmonitor/extensions/info.py:135 ../tcosmonitor/LocalData.py:43 +#: ../tcosmonitor/LocalData.py:62 ../tcosmonitor/TcosCommon.py:182 +#: ../tcosmonitor/TcosCommon.py:190 ../tcosmonitor/TcosCommon.py:206 +#: ../tcosmonitor/TcosCommon.py:209 +msgid "unknow" +msgstr "desconhecido" + +#: ../tcosmonitor/extensions/info.py:138 +msgid "Hostname: " +msgstr "Nome do Terminal: " + +#: ../tcosmonitor/extensions/info.py:139 +msgid "Ip address: " +msgstr "Endereço IP: " + +#: ../tcosmonitor/extensions/info.py:140 +msgid "TcosXmlRpc version: " +msgstr "Versão do TcosXmlRpc: " + +#: ../tcosmonitor/extensions/info.py:149 +msgid "Tcos image version: " +msgstr "Versão da imagem TCOS: " + +#: ../tcosmonitor/extensions/info.py:150 +msgid "Tcos image date: " +msgstr "Data da imagem Tcos: " + +#: ../tcosmonitor/extensions/info.py:151 +msgid "Date of thin client: " +msgstr "Data e hora do terminal: " + +#: ../tcosmonitor/extensions/info.py:152 +msgid "Uptime: " +msgstr "Tempo ligado: " + +#: ../tcosmonitor/extensions/info.py:163 +msgid "Kernel info" +msgstr "Informação do kernel" + +#: ../tcosmonitor/extensions/info.py:172 +msgid "Force download and mount all modules" +msgstr "Forçar o download e a montagem de todos os módulos" + +#: ../tcosmonitor/extensions/info.py:183 +msgid "None" +msgstr "Nenhum" + +#: ../tcosmonitor/extensions/info.py:186 +msgid "Kernel version: " +msgstr "Versão do kernel: " + +#: ../tcosmonitor/extensions/info.py:187 +msgid "Kernel complete version: " +msgstr "Versão completa do kernel: " + +#: ../tcosmonitor/extensions/info.py:188 +msgid "Loaded Modules: " +msgstr "Módulos carregados: " + +#: ../tcosmonitor/extensions/info.py:189 +msgid "Modules not found: " +msgstr "Módulos não encontrados: " + +#: ../tcosmonitor/extensions/info.py:205 +msgid "Cpu info: " +msgstr "Informação do procesador: " + +#: ../tcosmonitor/extensions/info.py:212 +msgid "Cpu model: " +msgstr "Modelo do processador: " + +#: ../tcosmonitor/extensions/info.py:213 +msgid "Cpu vendor: " +msgstr "Fabricante do processador: " + +#: ../tcosmonitor/extensions/info.py:214 +msgid "Cpu speed: " +msgstr "Velocidade do processador: " + +#: ../tcosmonitor/extensions/info.py:225 +msgid "PCI buses: " +msgstr "Dispositivos PCI: " + +#: ../tcosmonitor/extensions/info.py:254 +msgid "Process running: " +msgstr "Processos em execução: " + +#: ../tcosmonitor/extensions/info.py:267 +msgid "Ram info: " +msgstr "Informação da memória RAM: " + +#: ../tcosmonitor/extensions/info.py:274 +msgid "Total Ram: " +msgstr "Memória RAM total: " + +#: ../tcosmonitor/extensions/info.py:275 +msgid "Free RAM: " +msgstr "Memória RAM disponível: " + +#: ../tcosmonitor/extensions/info.py:276 +msgid "Active RAM: " +msgstr "Memória RAM ativa: " + +#: ../tcosmonitor/extensions/info.py:279 +msgid "Swap info: " +msgstr "Informação da memória Swap: " + +#: ../tcosmonitor/extensions/info.py:285 +msgid "Swap enabled: " +msgstr "Memória Swap habilitada: " + +#: ../tcosmonitor/extensions/info.py:286 +msgid "Total Swap: " +msgstr "Total da memória Swap: " + +#: ../tcosmonitor/extensions/info.py:287 +msgid "Used Swap: " +msgstr "Memória Swap usada: " + +#: ../tcosmonitor/extensions/info.py:297 +msgid "Network info: " +msgstr "Informação de rede: " + +#: ../tcosmonitor/extensions/info.py:307 +msgid "Network hostname: " +msgstr "Rede do terminal: " + +#: ../tcosmonitor/extensions/info.py:308 +msgid "Network IP: " +msgstr "Endereço IP" + +#: ../tcosmonitor/extensions/info.py:309 +msgid "Network MASK: " +msgstr "Máscara de sub-rede: " + +#: ../tcosmonitor/extensions/info.py:310 +msgid "Network MAC: " +msgstr "Endereço MAC: " + +#: ../tcosmonitor/extensions/info.py:311 +msgid "Data received(rx): " +msgstr "Dados recebidos(rx): " + +#: ../tcosmonitor/extensions/info.py:312 +msgid "Data send(tx): " +msgstr "Dados enviados(tx): " + +#: ../tcosmonitor/extensions/info.py:322 ../ui/tcosmonitor-prefwindow.ui:911 +msgid "Xorg info" +msgstr "Informação do Xorg" + +#: ../tcosmonitor/extensions/info.py:348 +msgid "enabled" +msgstr "habilitado" + +#: ../tcosmonitor/extensions/info.py:350 +msgid "disabled" +msgstr "desabilitado" + +#: ../tcosmonitor/extensions/info.py:353 ../ui/tcospersonalize.ui:159 +msgid "X Session Type" +msgstr "Tipo de sessão gráfica" + +#: ../tcosmonitor/extensions/info.py:355 ../ui/tcospersonalize.ui:201 +msgid "Xorg Driver" +msgstr "Driver do Xorg" + +#: ../tcosmonitor/extensions/info.py:357 ../ui/tcospersonalize.ui:94 +msgid "Xorg Resolution" +msgstr "Resolução do Xorg" + +#: ../tcosmonitor/extensions/info.py:359 ../ui/tcospersonalize.ui:133 +msgid "Xorg Color depth" +msgstr "Qualidade das cores do Xorg" + +#: ../tcosmonitor/extensions/info.py:361 ../ui/tcospersonalize.ui:179 +msgid "DPMS energy monitor control" +msgstr "Controle de energia do monitor DPMS" + +#: ../tcosmonitor/extensions/info.py:363 +msgid "Disable kill X with Ctrl+Alt+Backspace" +msgstr "Desabilitar a \"morte\" do Xorg com Ctrl+Alt+Backspace" + +#: ../tcosmonitor/extensions/info.py:365 ../ui/tcospersonalize.ui:57 +msgid "Enable mouse wheel" +msgstr "Ativar o botão scroll do mouse" + +#: ../tcosmonitor/extensions/info.py:367 +msgid "Refresh rate" +msgstr "Taxa de atualização" + +#: ../tcosmonitor/extensions/info.py:369 +msgid "Xorg font server" +msgstr "Servidor de fontes do Xorg" + +#: ../tcosmonitor/extensions/info.py:371 +msgid "Mouse device" +msgstr "Dispositivo do mouse" + +#: ../tcosmonitor/extensions/info.py:373 +msgid "Mouse protocol" +msgstr "Protocolo do mouse: " + +#: ../tcosmonitor/extensions/info.py:375 ../ui/tcospersonalize.ui:273 +msgid "X Horiz sync" +msgstr "Sincronização Horizontal" + +#: ../tcosmonitor/extensions/info.py:377 ../ui/tcospersonalize.ui:284 +msgid "X Vert sync" +msgstr "Sincronização Vertical" + +#: ../tcosmonitor/extensions/info.py:390 +msgid "PulseAudio Sound server is running" +msgstr "O servidor de som PulseAudio está funcionando." + +#: ../tcosmonitor/extensions/info.py:408 +msgid "Remote Sound Mixer" +msgstr "Mixador de som remoto" + +#: ../tcosmonitor/extensions/info.py:480 +msgid "PulseAudio Control" +msgstr "Controle do PulseAudio" + +#: ../tcosmonitor/extensions/info.py:485 +msgid "PulseAudio Meter" +msgstr "Níveis do PulseAudio " + +#: ../tcosmonitor/extensions/info.py:490 +msgid "PulseAudio Manager" +msgstr "Gerenciador do PulseAudio" + +#: ../tcosmonitor/extensions/info.py:494 +msgid "PulseAudio utils: " +msgstr "Utilitários do PulseAudio: " + +#: ../tcosmonitor/extensions/info.py:500 +msgid "PulseAudio stats" +msgstr "Estatísticas do PulseAudio" + +#: ../tcosmonitor/extensions/info.py:512 +msgid "Currently in use" +msgstr "Atualmente em uso" + +#: ../tcosmonitor/extensions/info.py:513 +msgid "Allocated during whole lifetime" +msgstr "Atribuída durante toda vida" + +#: ../tcosmonitor/extensions/info.py:514 +msgid "Sample cache size" +msgstr "Tamanho do cache" + +#: ../tcosmonitor/extensions/info.py:515 +msgid "User name" +msgstr "Nome do usuário" + +#: ../tcosmonitor/extensions/info.py:516 +msgid "Host Name" +msgstr "Nome do Terminal" + +#: ../tcosmonitor/extensions/info.py:517 +msgid "Server Name" +msgstr "Nome do servidor" + +#: ../tcosmonitor/extensions/info.py:518 +msgid "Server Version" +msgstr "Versão do servidor" + +#: ../tcosmonitor/extensions/info.py:519 +msgid "Default Sample Specification" +msgstr "Especificação padrão" + +#: ../tcosmonitor/extensions/info.py:520 +msgid "Default Sink" +msgstr "Saída padrão" + +#: ../tcosmonitor/extensions/info.py:521 +msgid "Default Source" +msgstr "Entrada padrão" + +#: ../tcosmonitor/extensions/info.py:522 +msgid "Cookie" +msgstr "Cookie" + +#: ../tcosmonitor/extensions/info.py:528 +msgid "Sound server is not running" +msgstr "O servidor de som não está funcionando." + +#: ../tcosmonitor/extensions/info.py:589 ../tcosmonitor/extensions/info.py:597 +#: ../tcosmonitor/extensions/info.py:605 +msgid "PulseAudio apps need /dev/shm." +msgstr "O PulseAudio precisa do /dev/shm." + +#: ../tcosmonitor/extensions/logout.py:48 +#: ../tcosmonitor/extensions/logout.py:71 +msgid "User not logged" +msgstr "Nenhum usuário logado" + +#: ../tcosmonitor/extensions/logout.py:51 +#, python-format +msgid "Do you want to logout user: %s?" +msgstr "Quer desconectar o usuário \"%s\"?" + +#: ../tcosmonitor/extensions/logout.py:55 +#: ../tcosmonitor/extensions/logout.py:77 +#, python-format +msgid "Session will close in %s seconds" +msgstr "A sessão fechará em %s segundos" + +#: ../tcosmonitor/extensions/logout.py:73 +#, python-format +msgid "Do you want to logout the following users: %s?" +msgstr "Quer desconectar os seguintes usuários: %s?" + +#: ../tcosmonitor/extensions/reboot.py:48 +#, python-format +msgid "Do you want to reboot: %s?" +msgstr "Quer reinicializar o terminal %s?" + +#: ../tcosmonitor/extensions/reboot.py:51 +#: ../tcosmonitor/extensions/reboot.py:61 +#, python-format +msgid "Pc will reboot in %s seconds" +msgstr "O terminal será reinicializado em %s segundos." + +#: ../tcosmonitor/extensions/reboot.py:58 +#, python-format +msgid "Do you want to reboot the following clients: %s?" +msgstr "Quer reinicializar os seguintes terminais %s?" + +#: ../tcosmonitor/extensions/reboot.py:67 +#, python-format +msgid "Do you want to poweroff: %s?" +msgstr "Quer desligar o terminal %s?" + +#: ../tcosmonitor/extensions/reboot.py:70 +#: ../tcosmonitor/extensions/reboot.py:80 +#, python-format +msgid "Pc will shutdown in %s seconds" +msgstr "O terminal será desligado em %s segundos." + +#: ../tcosmonitor/extensions/reboot.py:77 +#, python-format +msgid "Do you want to poweroff the following clients: %s?" +msgstr "Quer desligar os seguintes terminais: %s?" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:50 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:109 +msgid "Internet connection has been disabled" +msgstr "A conexão com a Internet foi desabilitada." + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:54 +msgid "Can't disable internet, user is not logged" +msgstr "" +"Não foi possível desabilitar a conexão com a Internet.\n" +"O usuário não está logado." + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:59 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:85 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:103 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:147 +#, python-format +msgid "" +"In order to lock and unlock internet you need to be in 'tcos' group.\n" +"\n" +"Exe by root: adduser %s tcos" +msgstr "" +"Para bloquear ou desbloquear o acesso a Internet, você necessita\n" +"pertencer ao grupo 'tcos'. Para isso, execute o comando, como root:\n" +"adduser %s tcos." + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:77 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:151 +msgid "Internet connection has been enabled" +msgstr "A conexão com a Internet foi habilitada." + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:81 +msgid "Can't enable internet, user is not logged" +msgstr "" +"Não foi possível habilitar a conexão com a Internet.\n" +"O usuário não está logado." + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:116 +#, python-format +msgid "Do you want disable internet to following users: %s?" +msgstr "Quer desabilitar o acesso a Internet dos seguintes usuários: %s?" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:158 +#, python-format +msgid "Do you want enable internet to following users:%s?" +msgstr "Quer habilitar o acesso a Internet dos seguintes usuários: %s?" + +#: ../tcosmonitor/extensions/videolan.py:48 +#: ../tcosmonitor/extensions/videolan.py:49 +msgid "Send Audio/Video broadcast" +msgstr "Envio de áudio/vídeo em broadcast" + +#: ../tcosmonitor/extensions/videolan.py:65 +#: ../tcosmonitor/extensions/videolan.py:219 +msgid "Can't send video broadcast, user is not logged" +msgstr "" +"Não foi possível enviar o vídeo,\n" +"o usuário não está logado." + +#: ../tcosmonitor/extensions/videolan.py:149 +#: ../tcosmonitor/extensions/videolan.py:347 +#: ../tcosmonitor/extensions/videolan.py:578 +#, python-format +msgid "" +"Not allowed white spaces in \"%s\".\n" +"Please rename it." +msgstr "" +"Não é permitido usar espaços no nome do arquivo %s.\n" +"Por favor, renomei-o." + +#: ../tcosmonitor/extensions/videolan.py:159 +#: ../tcosmonitor/extensions/videolan.py:359 +#: ../tcosmonitor/extensions/videolan.py:594 +msgid "Waiting for start video transmission..." +msgstr "Aguardando o início da transmissão do vídeo..." + +#: ../tcosmonitor/extensions/videolan.py:167 +#: ../tcosmonitor/extensions/videolan.py:367 +#: ../tcosmonitor/extensions/videolan.py:602 +#: ../tcosmonitor/extensions/vnc.py:98 ../tcosmonitor/extensions/vnc.py:407 +msgid "Error while exec app" +msgstr "Erro durante a execução da aplicação." + +#: ../tcosmonitor/extensions/videolan.py:199 +#: ../tcosmonitor/extensions/videolan.py:393 +#: ../tcosmonitor/extensions/videolan.py:634 +msgid "Running in broadcast video transmission." +msgstr "Executando a transmissão do vídeo em broadcast." + +#: ../tcosmonitor/extensions/videolan.py:208 +#: ../tcosmonitor/extensions/videolan.py:402 +#, python-format +msgid "" +"Running in broadcast video transmission to user %(host)s. Broadcast Nº %" +"(count)s" +msgstr "" +"Executando, em broadcast, a transmissão do vídeo ao usuário\n" +"%(host)s. Broadcast Nº %(count)s" + +#: ../tcosmonitor/extensions/videolan.py:311 +#: ../tcosmonitor/extensions/videolan.py:541 +msgid "Select audio/video file.." +msgstr "Selecione o arquivo de áudio/vídeo..." + +#: ../tcosmonitor/extensions/videolan.py:314 +#: ../tcosmonitor/extensions/videolan.py:544 +msgid "Play DVD" +msgstr "Reproduzir o DVD" + +#: ../tcosmonitor/extensions/videolan.py:315 +#: ../tcosmonitor/extensions/videolan.py:545 +msgid "Play SVCD/VCD" +msgstr "Reproduzir o SVCD/VCD" + +#: ../tcosmonitor/extensions/videolan.py:316 +#: ../tcosmonitor/extensions/videolan.py:546 +msgid "Play AudioCD" +msgstr "Reproduzir o CD de áudio" + +#: ../tcosmonitor/extensions/videolan.py:361 +#: ../tcosmonitor/extensions/videolan.py:596 +msgid "" +"First select the DVD chapter or play movie\n" +"then press enter to send clients..." +msgstr "" +"Primeiro selecione o capítulo do DVD ou reproduza o vídeo.\n" +"Depois, pressione «enter» para enviá-lo aos terminais..." + +#: ../tcosmonitor/extensions/videolan.py:370 +msgid "Lock keyboard and mouse on client?" +msgstr "Bloquear o teclado e mouse do terminal?" + +#: ../tcosmonitor/extensions/videolan.py:444 +msgid "Video broadcast stopped." +msgstr "Difusão de vídeo parada." + +#: ../tcosmonitor/extensions/videolan.py:605 +msgid "Lock keyboard and mouse on clients?" +msgstr "Bloquear o teclado e mouse nos terminais?" + +#: ../tcosmonitor/extensions/videolan.py:643 +#, python-format +msgid "Running in broadcast video transmission. Broadcast Nº %s" +msgstr "Executando, em broadcast, a transmissão do vídeo. Broadcast N° %s" + +#: ../tcosmonitor/extensions/restartxorg.py:51 +#, python-format +msgid "Restart X session of %s with new config?" +msgstr "Reiniciar a sessão gráfica de %s com a nova configuração?" + +#: ../tcosmonitor/extensions/restartxorg.py:64 +#, python-format +msgid "%s is not supported to restart Xorg!" +msgstr "%s não suporta o reinício do Xorg!" + +#: ../tcosmonitor/extensions/restartxorg.py:78 +msgid "No thin clients found." +msgstr "Nenhum thin client foi encontrado." + +#: ../tcosmonitor/extensions/restartxorg.py:81 +#, python-format +msgid "Do you want to restart X screens (only thin clients):%s?" +msgstr "" +"Quer reiniciar as sessões gráficas de\n" +"(somente thin clients): %s?" + +#: ../tcosmonitor/extensions/italc.py:51 ../tcosmonitor/extensions/vnc.py:135 +msgid "No user logged." +msgstr "Nenhum usuário logado" + +#: ../tcosmonitor/extensions/italc.py:75 +msgid "Can't start IVS, please add iTALC support" +msgstr "Não foi possível iniciar o processo IVS. Adicione o suporte ao iTALC." + +#: ../tcosmonitor/extensions/tcospersonalize.py:54 +#, python-format +msgid "%s is not supported to personalize!" +msgstr "%s não tem suporte a personalização!" + +#: ../tcosmonitor/extensions/vnc.py:71 +#, python-format +msgid "Do you want to start demo mode the following users: %s?" +msgstr "Quer iniciar o modo demostração aos seguintes usuários: %s ?" + +#: ../tcosmonitor/extensions/vnc.py:83 +msgid "Waiting for start demo mode..." +msgstr "Aguardando o início do modo demostração..." + +#: ../tcosmonitor/extensions/vnc.py:116 ../tcosmonitor/extensions/vnc.py:426 +#, python-format +msgid "Running in demo mode with %s clients." +msgstr "Executando no modo demostração com %s terminal(ais)." + +#: ../tcosmonitor/extensions/vnc.py:127 +#, python-format +msgid "Running in demo mode from server. Demo Nº %s" +msgstr "" +"Executando no modo demostração a partir do servidor.\n" +"Demo Nº %s" + +#: ../tcosmonitor/extensions/vnc.py:149 ../tcosmonitor/extensions/vnc.py:369 +#, python-format +msgid "Connecting with %s to start VNC support" +msgstr "Conectando a %s para iniciar o suporte ao VNC." + +#: ../tcosmonitor/extensions/vnc.py:178 +#, python-format +msgid "" +"Can't start VNC, error:\n" +"%s" +msgstr "" +"Não foi possível iniciar o VNC, erro:\n" +"%s" + +#: ../tcosmonitor/extensions/vnc.py:182 +msgid "Waiting for start of VNC server..." +msgstr "Aguardando o início do servidor VNC..." + +#: ../tcosmonitor/extensions/vnc.py:211 +msgid "Can't start VNC, please add X11VNC support" +msgstr "" +"Não foi possível iniciar o VNC, por favor adicione o suporte ao X11VNC." + +#: ../tcosmonitor/extensions/vnc.py:237 +msgid "Switch to view only" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:242 ../tcosmonitor/extensions/vnc.py:273 +msgid "Switch to full control" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:269 +#, python-format +msgid "VNC host %s" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:281 +msgid "Switch to fullscreen" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:290 +#: ../tcosmonitor/extensions/livevnc.py:72 +#: ../tcosmonitor/TcosPreferences.py:539 ../tcosmonitor/TcosExtensions.py:338 +msgid "Stop" +msgstr "Parar" + +#: ../tcosmonitor/extensions/vnc.py:342 +msgid "Can't start demo mode, user is not logged" +msgstr "" +"Não foi possível iniciar o modo demostração,\n" +"o usuário não está logado." + +#: ../tcosmonitor/extensions/vnc.py:345 +#, python-format +msgid "Do you want demo mode from user %s?" +msgstr "Quer iniciar o modo demostração do usuário %s?" + +#: ../tcosmonitor/extensions/vnc.py:392 +#, python-format +msgid "Waiting for start demo mode from user %s..." +msgstr "Aguardando o início da demostração do usuário %s..." + +#: ../tcosmonitor/extensions/vnc.py:446 +#, python-format +msgid "Running in demo mode from user %(host)s. Demo Nº %(count)s" +msgstr "" +"Executando no modo demostração\n" +"a partir do usuário %(host)s. Demo Nº %(count)s" + +#: ../tcosmonitor/extensions/vnc.py:501 +msgid "Demo mode off." +msgstr "Modo demostração desativado." + +#: ../tcosmonitor/extensions/wakeonlan.py:50 +#: ../tcosmonitor/extensions/wakeonlan.py:75 +msgid "" +"Wake On Lan only works with static list.\n" +"\n" +"Enable scan method \"static\" in Preferences\n" +"and (wake on lan) support in bios of clients." +msgstr "" +"Wake on Lan só funciona com IP estático.\n" +"\n" +"Ative o método busca \"static\" em Preferências\n" +"e o suporte (wake on lan) na configuração da BIOS dos terminais." + +#: ../tcosmonitor/extensions/wakeonlan.py:54 +#, python-format +msgid "Do you want boot %s client?" +msgstr "Quer inicializar o terminal %s ?" + +#: ../tcosmonitor/extensions/wakeonlan.py:67 +#: ../tcosmonitor/extensions/wakeonlan.py:91 +#, python-format +msgid "No register MAC address for ip: \"%s\"" +msgstr "Endereço MAC não registrado para o IP: \"%s\"" + +#: ../tcosmonitor/extensions/wakeonlan.py:71 +#: ../tcosmonitor/extensions/wakeonlan.py:98 +#, python-format +msgid "Not valid MAC address: \"%s\"" +msgstr "Endereço MAC inválido: \"%s\"" + +#: ../tcosmonitor/extensions/wakeonlan.py:79 +msgid "Do you want boot all clients?" +msgstr "Quer inicializar todos os terminais?" + +#: ../tcosmonitor/extensions/livevnc.py:76 +#, fuzzy +msgid "Live view of all hosts" +msgstr "Captura de tela de todos os terminais" + +#: ../tcosmonitor/extensions/livevnc.py:194 +msgid "Running in LiveView mode" +msgstr "" + +#: ../tcosmonitor/extensions/viewproc.py:48 +msgid "Can't show runnings apps, user is not logged" +msgstr "" +"Não foi possível mostrar as aplicações\n" +"em execução. O usuário não está logado." + +#: ../tcosmonitor/extensions/viewproc.py:58 +msgid "User not connected, no processes." +msgstr "Usuário não conectado, sem processos." + +#: ../tcosmonitor/extensions/viewproc.py:76 +#, python-format +msgid "Running processes for user \"%s\": " +msgstr "Processos executados pelo usuário \"%s\":" + +#: ../tcosmonitor/extensions/viewproc.py:80 +msgid "" +"ALERT: There are some system process hidden. Enable it in Preferences dialog." +msgstr "" +"AVISO: Há vários processos do sistema que estão ocultos.\n" +"Você pode habilitá-los no menu Preferências." + +#: ../tcosmonitor/extensions/viewproc.py:85 +msgid "Pid" +msgstr "PID" + +#: ../tcosmonitor/extensions/viewproc.py:86 +msgid "Process command" +msgstr "Comando do processo" + +#: ../tcosmonitor/extensions/viewproc.py:91 +msgid "Kill this process" +msgstr "Encerrar este processo" + +#: ../tcosmonitor/extensions/viewproc.py:127 +msgid "Are you sure you want to stop this process?" +msgstr "Tem certeza de que quer encerrar este processo?" + +#: ../tcosmonitor/extensions/viewproc.py:136 +#, python-format +msgid "" +"Error while killing app:\n" +"Reason: %s" +msgstr "" +"Erro ao fechar a aplicação:\n" +"Motivo: %s" + +#: ../tcosmonitor/extensions/audiortp.py:49 +#: ../ui/tcosmonitor-mainwindow.ui:163 +msgid "Send audio conference" +msgstr "Enviar audioconferência" + +#: ../tcosmonitor/extensions/audiortp.py:50 +#: ../ui/tcosmonitor-prefwindow.ui:1507 +msgid "Audio chat conference" +msgstr "Chat de audioconferência" + +#: ../tcosmonitor/extensions/audiortp.py:51 +#: ../ui/tcosmonitor-mainwindow.ui:275 +msgid "Audio chat list" +msgstr "Lista do chat de áudio" + +#: ../tcosmonitor/extensions/audiortp.py:52 +msgid "Send audio conference (from this host)" +msgstr "Enviar o áudio do microfone (à partir deste terminal)" + +#: ../tcosmonitor/extensions/audiortp.py:73 +msgid "Emission" +msgstr "Emissão" + +#: ../tcosmonitor/extensions/audiortp.py:79 +msgid "State" +msgstr "Estado" + +#: ../tcosmonitor/extensions/audiortp.py:83 +msgid "Channel" +msgstr "Canal" + +#: ../tcosmonitor/extensions/audiortp.py:235 +#: ../tcosmonitor/extensions/audiortp.py:322 +#: ../tcosmonitor/extensions/audiortp.py:413 +msgid "" +"Your pulseaudio server is too old.\n" +"Is required pulseaudio version >= 0.9.10" +msgstr "" +"Seu servidor PulseAudio é muito antigo.\n" +"É requerida a versão superior a 0.9.10." + +#: ../tcosmonitor/extensions/audiortp.py:238 +#, python-format +msgid "Do you want to start audio conference to the following users: %s?" +msgstr "Quer iniciar a audioconferência para os seguintes usuários: %s?" + +#: ../tcosmonitor/extensions/audiortp.py:243 +msgid "You have entered in audio conference" +msgstr "Você entrou na audioconferência" + +#: ../tcosmonitor/extensions/audiortp.py:267 +msgid "Waiting for start audio conference..." +msgstr "Aguardando o início da audioconferência..." + +#: ../tcosmonitor/extensions/audiortp.py:295 +#: ../tcosmonitor/extensions/audiortp.py:390 +#, python-format +msgid "Running in audio conference with %s clients." +msgstr "Executando a audioconferência com %s terminais." + +#: ../tcosmonitor/extensions/audiortp.py:305 +#, python-format +msgid "Running in audio conference from server. Conference Nº %s" +msgstr "Executando a audioconferência a partir do servidor. Conferência Nº %s" + +#: ../tcosmonitor/extensions/audiortp.py:316 +msgid "Can't start conference mode, user is not logged" +msgstr "" +"Não foi possível iniciar o modo demostração,\n" +"o usuário não está logado." + +#: ../tcosmonitor/extensions/audiortp.py:325 +#, python-format +msgid "Do you want audio conference from user %s?" +msgstr "Quer iniciar a audioconferência do usuário %s?" + +#: ../tcosmonitor/extensions/audiortp.py:331 +#, python-format +msgid "You have entered in audio conference from user %s" +msgstr "Você entrou na audioconferência do usuário %s?" + +#: ../tcosmonitor/extensions/audiortp.py:359 +#, python-format +msgid "Waiting for start audio conference from user %s..." +msgstr "Aguardando o início da audioconferência do usuário %s ..." + +#: ../tcosmonitor/extensions/audiortp.py:400 +#, python-format +msgid "Running in audio conference from user %(host)s. Conference Nº %(count)s" +msgstr "" +"Executando a audioconferência do usuário %(host)s. Conferência Nº %(count)s" + +#: ../tcosmonitor/extensions/audiortp.py:416 +#, python-format +msgid "Do you want to start audio chat conference to the following users: %s?" +msgstr "" +"Você quer iniciar um chat de audioconferência para os seguintes\n" +"usuários: %s?" + +#: ../tcosmonitor/extensions/audiortp.py:421 +#, python-format +msgid "You have entered in audio chat conference. Participants: %s" +msgstr "Você entrou no chat da audioconferência. %s participantes." + +#: ../tcosmonitor/extensions/audiortp.py:443 +msgid "Waiting for start audio chat conference..." +msgstr "Aguardando o início do chat de audioconferência..." + +#: ../tcosmonitor/extensions/audiortp.py:449 +msgid "Do you want to connect to this audio chat conference now?" +msgstr "Você quer se conectar nesta audioconferência agora?" + +#: ../tcosmonitor/extensions/audiortp.py:483 +#, python-format +msgid "Running in audio chat conference with %s clients." +msgstr "Executando a audioconferência com %s terminais." + +#: ../tcosmonitor/extensions/audiortp.py:495 +#, python-format +msgid "Running in audio chat conference. Conference Nº %s" +msgstr "Executando a audioconferência. Conferência N° %s" + +#: ../tcosmonitor/extensions/audiortp.py:521 +msgid "Conference mode off." +msgstr "Modo conferência desativado." + +#: ../tcosmonitor/extensions/audiortp.py:540 +msgid "Audio chat conference off." +msgstr "Chat de audioconferência desativado" + +#: ../tcosmonitor/TcosXmlRpc.py:85 +msgid "" +"Username or password are empty,\n" +"please edit in preferences dialog!" +msgstr "" +"O usuário ou a senha estão vazios,\n" +"por favor, edite o menu preferências." + +#: ../tcosmonitor/TcosIconView.py:55 +msgid "Place mouse on any computer to see brief info about it." +msgstr "Passe o mouse sobre qualquer terminal para ver uma breve descrição." + +#: ../tcosmonitor/TcosListView.py:82 +msgid "Active" +msgstr "Ativo" + +#: ../tcosmonitor/TcosListView.py:92 +msgid "Screen Blocked" +msgstr "Tela bloqueada" + +#: ../tcosmonitor/TcosListView.py:97 +msgid "Num of process" +msgstr "Num de processos" + +#: ../tcosmonitor/TcosListView.py:112 +msgid "Sel" +msgstr "Sel" + +#: ../tcosmonitor/TcosListView.py:148 +#, python-format +msgid "Error connecting to tcosxmlrpc in %s" +msgstr "Erro! Conectando ao TcosXmlRpc em %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:154 +#, python-format +msgid "Floppy: %s" +msgstr "Disquete: %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:156 +#, python-format +msgid "CDROM: %s" +msgstr "CD-ROM: %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:158 +#, python-format +msgid "USB: %s" +msgstr "USB: %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:160 +#, python-format +msgid "HDD partition: %s" +msgstr "Partição do HD: %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:162 +#, python-format +msgid "Unknow: %s" +msgstr "Desconhecido: %s" + +#: ../tcosmonitor/Initialize.py:217 +msgid "GPL-2 license file not found" +msgstr "O arquivo da licença GPL-2 não foi encontrado." + +#: ../tcosmonitor/LocalData.py:212 +#, python-format +msgid "Selected network inteface (%s) don't have IP address" +msgstr "A interface de rede selecionada (%s) não possui endereço IP." + +#: ../tcosmonitor/LocalData.py:260 ../tcosmonitor/ping.py:108 +#: ../tcosmonitor/ping.py:171 +msgid "Testing if found clients have 8998 or 8999 port open..." +msgstr "" +"Verificando se os terminais encontrados possuem as\n" +"portas 8998 ou 8999 abertas..." + +#: ../tcosmonitor/LocalData.py:282 +msgid "" +"Static list method configured but no hosts in list.\n" +"\n" +"Please, open preferences, click on 'Open Static Host list' and add some " +"hosts." +msgstr "" +"Está selecionado o método lista estática dos terminais,\n" +"mas não há terminais configurados.\n" +"\n" +"Por favor, acesse o menu preferências,\n" +"Clique em 'Abrir lista fixa dos terminais' e adicione\n" +"pelo menos um." + +#: ../tcosmonitor/TcosPreferences.py:264 +msgid "" +"You have select more than 5 button menus.\n" +"Only allowed to select a maximum of 5 buttons." +msgstr "" +"Você selecionou mais que 5 botões de menu.\n" +"São permitidos selecionar apenas 5 botões." + +#: ../tcosmonitor/TcosPreferences.py:275 +msgid "New settings saved." +msgstr "Novas configurações salvas." + +#: ../tcosmonitor/TcosMenus.py:102 ../tcosmonitor/TcosMenus.py:114 +#, python-format +msgid "Actions for %s" +msgstr "Ações para %s" + +#: ../tcosmonitor/TcosMenus.py:107 +msgid "Actions for selected host" +msgstr "Ações para o terminal selecionado" + +#: ../tcosmonitor/TcosMenus.py:168 ../tcosmonitor/TcosMenus.py:299 +#, python-format +msgid "%d hidden actions" +msgstr "%d ações ocultas" + +#: ../tcosmonitor/TcosMenus.py:243 ../tcosmonitor/TcosMenus.py:245 +msgid "Actions for selected hosts" +msgstr "Ações para todos os terminais selecionados" + +#: ../tcosmonitor/TcosMenus.py:247 +msgid "Actions for all hosts" +msgstr "Ações para todos os terminais" + +#: ../tcosmonitor/TcosMenus.py:304 +msgid "Save hosts positions" +msgstr "Posições dos terminais salvas" + +#: ../tcosmonitor/TcosMenus.py:312 +msgid "Reset hosts positions" +msgstr "Resetar as posições dos terminais" + +#: ../tcosmonitor/ping.py:80 +#, python-format +msgid "Ping to %s..." +msgstr "Ping para %s..." + +#: ../tcosmonitor/ping.py:89 +msgid "Waiting for pings..." +msgstr "Aguardando as repostas dos pings..." + +#: ../tcosmonitor/ping.py:127 ../tcosmonitor/ping.py:192 +#: ../tcosmonitor/TcosActions.py:185 ../tcosmonitor/TcosActions.py:264 +msgid "Not connected hosts found." +msgstr "Nenhum terminal conectado foi encontrado" + +#: ../tcosmonitor/ping.py:134 ../tcosmonitor/ping.py:197 +#: ../tcosmonitor/TcosActions.py:187 ../tcosmonitor/TcosActions.py:259 +#, python-format +msgid "Found %d hosts" +msgstr "Encontrado %d terminais" + +#: ../tcosmonitor/TcosActions.py:162 ../tcosmonitor/TcosActions.py:241 +msgid "Searching for connected hosts..." +msgstr "Procurando por terminais conectados..." + +#: ../tcosmonitor/TcosActions.py:1019 +msgid "Searching info of hosts..." +msgstr "Procurando por informações dos terminais..." + +#: ../tcosmonitor/TcosActions.py:1058 +#, python-format +msgid "Connecting to %s..." +msgstr "Conectando a %s..." + +#: ../tcosmonitor/TcosExtensions.py:41 +msgid "Exception:" +msgstr "Excessão:" + +#: ../tcosmonitor/TcosExtensions.py:77 +msgid "Error: no IP!" +msgstr "Erro: sem IP!" + +#: ../tcosmonitor/TcosExtensions.py:154 +msgid "No clients connected, press refresh button." +msgstr "Não há terminais conectados, clique no botão atualizar." + +#: ../tcosmonitor/TcosExtensions.py:251 ../tcosmonitor/TcosExtensions.py:253 +#, python-format +msgid "Can't exec this action at '%s' because you are connected at this host!" +msgstr "" +"Não foi possível executar esta ação em: '%s', porque você já está conectado " +"nele!" + +#: ../tcosmonitor/TcosExtensions.py:267 +#, python-format +msgid "Doing action \"%(action)s\" in %(ip)s..." +msgstr "Realizando a ação \"%(action)s\" em %(ip)s ..." + +#: ../tcosmonitor/TcosExtensions.py:285 +#, python-format +msgid "Done action \"%(action)s\" in %(ip)s" +msgstr "Ação \"%(action)s\" realizada em %(ip)s" + +#: ../tcosmonitor/TcosCommon.py:89 +#, python-format +msgid "" +"ThreadController: Found error executing %(cmd)s\n" +"\n" +"If problem persist, disable Thread Controller\n" +"in Preferences and report bug.\n" +"Error=%(error)s" +msgstr "" +"ThreadController: Encontrou um erro ao executar %(cmd)s\n" +"\n" +"Se o problema persistir, desative Thread Controller\n" +"no menu Preferências e reporte o bug.\n" +"Error=%(error)s" + +#: ../ui/tcosmonitor-prefwindow.ui:35 ../ui/tcospersonalize.ui:7 +#: ../ui/tcosmonitor-mainwindow.ui:36 +msgid "Preferences" +msgstr "Preferências" + +#: ../ui/tcosmonitor-prefwindow.ui:62 +msgid "Show host list on startup" +msgstr "Exibir a lista de terminais no startup" + +#: ../ui/tcosmonitor-prefwindow.ui:80 +msgid "Scan network method" +msgstr "Método de busca dos terminais" + +#: ../ui/tcosmonitor-prefwindow.ui:91 +msgid "" +"Network interface\n" +"(thin client)" +msgstr "" +"Interface de rede\n" +"(thin clients)" + +#: ../ui/tcosmonitor-prefwindow.ui:127 +msgid "Show system process" +msgstr "Mostrar os processos do sistema" + +#: ../ui/tcosmonitor-prefwindow.ui:144 +msgid "Don't do actions when running TcosMonitor in thin client" +msgstr "" +"Não executar ações quando o TcosMonitor\n" +"for executado a partir de um terminal." + +#: ../ui/tcosmonitor-prefwindow.ui:163 +msgid "List of hosts" +msgstr "Lista de terminais" + +#: ../ui/tcosmonitor-prefwindow.ui:200 +msgid "Open static host list" +msgstr "Abrir lista fixa dos terminais" + +#: ../ui/tcosmonitor-prefwindow.ui:225 +msgid "Only show hosts running tcosxmlrpc (8998 port)" +msgstr "" +"Só mostre os terminais que estão\n" +"executando o TcosMxlRpc (porta 8998)" + +#: ../ui/tcosmonitor-prefwindow.ui:242 +msgid "Only do all actions on selected hosts (requires restart TcosMonitor)" +msgstr "" +"Só realizar as ações para os terminais selecionados \n" +"(precisa reiniciar TcosMonitor)." + +#: ../ui/tcosmonitor-prefwindow.ui:259 +msgid "Enable SSL connections to XMLRPC clients" +msgstr "Habilitar SSL nas conexões XMLRPC com os terminais" + +#: ../ui/tcosmonitor-prefwindow.ui:278 +msgid "Host list mode" +msgstr "Modo Lista" + +#: ../ui/tcosmonitor-prefwindow.ui:302 +msgid "Show right menu with groups (NEW)" +msgstr "Mostrar os menus em grupo (NOVO)" + +#: ../ui/tcosmonitor-prefwindow.ui:319 +#, fuzzy +msgid "Don't show thin client if TcosMonitor is running there" +msgstr "" +"Não executar ações quando o TcosMonitor\n" +"for executado a partir de um terminal." + +#: ../ui/tcosmonitor-prefwindow.ui:351 +msgid "Settings" +msgstr "Configurações" + +#: ../ui/tcosmonitor-prefwindow.ui:376 +msgid "Update host list every (seg)" +msgstr "Atualizar a lista de terminais a cada (segundos)" + +#: ../ui/tcosmonitor-prefwindow.ui:389 +msgid "" +"Update host list every selected seconds.\n" +"\n" +"Value=0 disable update." +msgstr "" +"Atualiza a lista de terminais a cada número\n" +"de segundos selecionado\n" +"\n" +"Valor=0 desabilita a atualização." + +#: ../ui/tcosmonitor-prefwindow.ui:405 +msgid "Cache timeout (seg)" +msgstr "Tempo de vida do cache (seg)" + +#: ../ui/tcosmonitor-prefwindow.ui:419 +msgid "" +"Cache some data and connection status during selected seconds.\n" +"\n" +"Value=0 disable cache." +msgstr "" +"Fazer o cache dos dados e do estado das conexões durante o número\n" +"de segundos selecionado.\n" +"\n" +"Valor=0 desabilita o cache." + +#: ../ui/tcosmonitor-prefwindow.ui:437 +msgid "Screenshot size:" +msgstr "Tamanho da captura de tela" + +#: ../ui/tcosmonitor-prefwindow.ui:450 ../ui/tcosmonitor-prefwindow.ui:479 +msgid "% Size of screnshot." +msgstr "%s do tamanho da captura de tela" + +#: ../ui/tcosmonitor-prefwindow.ui:466 +msgid "Mini screenshot size:" +msgstr "Tamanho das mini-capturas de tela" + +#: ../ui/tcosmonitor-prefwindow.ui:495 +msgid "Timeout actions (seg)" +msgstr "Tempo de espera para ações (seg)" + +#: ../ui/tcosmonitor-prefwindow.ui:508 +msgid "" +"Timeout in seg for actions\n" +"\n" +"Value=0 default" +msgstr "" +"Tempo de espera para ações\n" +"\n" +"O padrão é 0." + +#: ../ui/tcosmonitor-prefwindow.ui:526 +msgid "SSH remote username" +msgstr "Usuário remoto SSH" + +#: ../ui/tcosmonitor-prefwindow.ui:553 +msgid "VLC method to send" +msgstr "VLC método de envio" + +#: ../ui/tcosmonitor-prefwindow.ui:578 +msgid "" +"<b>Experimental: Thread Controller</b>\n" +"( if you have problems, disable it )" +msgstr "" +"<b>Experimente usar o\n" +"Controle de Threads</b>\n" +"( Se tiver problemas, desative-o )." + +#: ../ui/tcosmonitor-prefwindow.ui:591 +msgid "Actions controlled" +msgstr "Ações controladas" + +#: ../ui/tcosmonitor-prefwindow.ui:611 +msgid "Block ports: (80,8080... etc)" +msgstr "Portas bloqueadas: (80,8080... etc)" + +#: ../ui/tcosmonitor-prefwindow.ui:653 ../ui/tcospersonalize.ui:333 +msgid "Advanced" +msgstr "Avançado" + +#: ../ui/tcosmonitor-prefwindow.ui:680 +msgid "TcosXmlRpc username" +msgstr "Usuário do TcosXmlRpc" + +#: ../ui/tcosmonitor-prefwindow.ui:706 +msgid "TcosXmlRpc password" +msgstr "Senha do TcosXmlRpc" + +#: ../ui/tcosmonitor-prefwindow.ui:735 +msgid "" +"<b>NOTE:</b>\n" +"Default user is <b>root</b> and default password is <b>root</b>.\n" +"\n" +"For <u>thin clients</u> change TCOS_ROOT_PASSWD or use TcosConfig and " +"regenerate boot images again.\n" +"\n" +"For <u>standalone</u> users you can use a system account (root) but this is " +"not recomended. Install tcos-standalone and start it by root. Set user and " +"password, this will create a <b>/etc/tcospasswd</b> file only used by TCOS " +"and your root acount will be secure." +msgstr "" +"<b>NOTA:</b>\n" +"Para administrar os terminais, o usuário padrão é <b>root</b>\n" +"e a senha é <b>root</b>.\n" +" \n" +"Você pode modificá-los com o TCOS_ROOT_PASSWD ou com\n" +"TcosConfig e depois gerar as imagens de inicialização novamente.\n" +"\n" +"Para os terminais <u>autonomos(standalone)</u> pode usar a conta do sistema\n" +"(root), mas isto não é recomendável, instale o pacote tcos-standalone, " +"execute-o como administrador e configure um usuário. A senha será\n" +"armazenada em <b>/etc/tcospasswd</b>, arquivo que só precisa do TCOS,\n" +"porque a sua conta de root estará a salva." + +#: ../ui/tcosmonitor-prefwindow.ui:772 +msgid "Authentication " +msgstr "Autenticação" + +#: ../ui/tcosmonitor-prefwindow.ui:795 +msgid "<b>Info avalaible from tcosxmlrpc</b>" +msgstr "<b>Informações disponíveis do TcosXmlRpc</b>" + +#: ../ui/tcosmonitor-prefwindow.ui:806 +msgid "Tcos general info" +msgstr "Informações gerais do TCOS" + +#: ../ui/tcosmonitor-prefwindow.ui:821 +msgid "Cpu info" +msgstr "Informações da CPU" + +#: ../ui/tcosmonitor-prefwindow.ui:836 +msgid "Kernel and modules info" +msgstr "Informações do Kernel e dos módulos" + +#: ../ui/tcosmonitor-prefwindow.ui:851 +msgid "PCI bus info" +msgstr "Informações dos dispositivos PCI" + +#: ../ui/tcosmonitor-prefwindow.ui:866 +msgid "Ram and swap info" +msgstr "Informações da memória RAM e SWAP" + +#: ../ui/tcosmonitor-prefwindow.ui:881 +msgid "Process info" +msgstr "Informações do processo" + +#: ../ui/tcosmonitor-prefwindow.ui:896 +msgid "Network info" +msgstr "Informações da rede" + +#: ../ui/tcosmonitor-prefwindow.ui:926 +msgid "Sound server info" +msgstr "Informações do servidor de som" + +#: ../ui/tcosmonitor-prefwindow.ui:962 +msgid "Avalaible info" +msgstr "Informações disponíveis" + +#: ../ui/tcosmonitor-prefwindow.ui:985 +msgid "<b>Show / hide menu items</b>" +msgstr "<b>Mostrar/ocultar os itens do menu</b>" + +#: ../ui/tcosmonitor-prefwindow.ui:1003 +msgid "Lock and unlock screen" +msgstr "Bloquear/desbloquear a tela" + +#: ../ui/tcosmonitor-prefwindow.ui:1019 +msgid "Remote SSH shell" +msgstr "Shell SSH remoto" + +#: ../ui/tcosmonitor-prefwindow.ui:1037 +msgid "Configure Xorg settings" +msgstr "Configurações do Xorg" + +#: ../ui/tcosmonitor-prefwindow.ui:1066 ../ui/tcosmonitor-prefwindow.ui:1427 +msgid "Exe app on user display" +msgstr "Executar uma aplicação" + +#: ../ui/tcosmonitor-prefwindow.ui:1082 ../ui/tcosmonitor-prefwindow.ui:1441 +msgid "Send a text message" +msgstr "Enviar menssagem de texto" + +#: ../ui/tcosmonitor-prefwindow.ui:1100 +msgid "Show running apps" +msgstr "Mostrar as aplicações em execução" + +#: ../ui/tcosmonitor-prefwindow.ui:1116 ../ui/tcosmonitor-prefwindow.ui:1457 +msgid "Send video broadcast" +msgstr "Enviar um vídeo em broadcast" + +#: ../ui/tcosmonitor-prefwindow.ui:1150 +msgid "Demo mode" +msgstr "Modo demonstração" + +#: ../ui/tcosmonitor-prefwindow.ui:1179 +msgid "Wake on LAN" +msgstr "Wake on LAN" + +#: ../ui/tcosmonitor-prefwindow.ui:1195 +msgid "Audio conference mode" +msgstr "Modo de audioconferência" + +#: ../ui/tcosmonitor-prefwindow.ui:1213 +msgid "Screenshots" +msgstr "Capturas de tela" + +#: ../ui/tcosmonitor-prefwindow.ui:1229 +msgid "Reboot and poweroff" +msgstr "Reinicializar ou desligar" + +#: ../ui/tcosmonitor-prefwindow.ui:1243 +msgid "Lock and unlock internet" +msgstr "Bloquear/desbloquear o acesso a Internet" + +#: ../ui/tcosmonitor-prefwindow.ui:1259 +msgid "DPMS monitor on/off" +msgstr "Ligar/desligar o DPMS no monitor" + +#: ../ui/tcosmonitor-prefwindow.ui:1277 +msgid "Connect using VNC" +msgstr "Conectar usando o VNC" + +#: ../ui/tcosmonitor-prefwindow.ui:1293 +msgid "Connect using iTALC" +msgstr "Conectar usando o iTALC" + +#: ../ui/tcosmonitor-prefwindow.ui:1308 +msgid "Restart session with new settings" +msgstr "Reiniciar a sessão com as novas configurações" + +#: ../ui/tcosmonitor-prefwindow.ui:1385 +msgid "Menus" +msgstr "Menus" + +#: ../ui/tcosmonitor-prefwindow.ui:1408 +msgid "<b>Show / hide menu buttons</b>" +msgstr "<b>Mostrar/ocultar os menus da aplicação</b>" + +#: ../ui/tcosmonitor-prefwindow.ui:1491 +msgid "Audio conference" +msgstr "Audioconferência" + +#: ../ui/tcosmonitor-prefwindow.ui:1525 +msgid "Audio Chat control" +msgstr "Controle de Chat de Áudio" + +#: ../ui/tcosmonitor-prefwindow.ui:1569 +msgid "Menu buttons" +msgstr "Menu Botões" + +#: ../ui/tcosmonitor-abouttcos.ui:6 +msgid "About TCOS" +msgstr "Sobre o TCOS" + +#: ../ui/tcosmonitor-abouttcos.ui:19 +msgid "<span size=\"xx-large\">TcosMonitor</span>" +msgstr "<span size=\"xx-large\">TcosMonitor</span>" + +#: ../ui/tcosmonitor-abouttcos.ui:62 +msgid "<b>Version:</b>" +msgstr "<b>Versão:</b>" + +#: ../ui/tcosmonitor-abouttcos.ui:90 +msgid "" +"Thin client and standalone\n" +"monitoring tool." +msgstr "" +"Ferramenta de monitoramento\n" +"dos terminais." + +#: ../ui/tcosmonitor-abouttcos.ui:131 +msgid "Project web site" +msgstr "Site do projeto" + +#: ../ui/tcosmonitor-abouttcos.ui:178 +msgid "About" +msgstr "Sobre" + +#: ../ui/tcosmonitor-abouttcos.ui:212 +msgid "License" +msgstr "Licença" + +#: ../ui/tcosmonitor-abouttcos.ui:230 +msgid "" +"Main developers:\n" +" * Mario Izquierdo <mariodebian at gmail.com>\n" +" * Ignacio Vidal <vidal_joshur at gva.es>\n" +"\n" +"Contributors:\n" +" * Andrés Jimenez\n" +" * Quirón\n" +"\n" +"Special thanks to:\n" +" Comunidad de Madrid, MaX group (Spain)" +msgstr "" +"Desenvolvedores principais :\n" +" * Mario Izquierdo <mariodebian@gmail.com>\n" +" * Ignacio Vidal <vidal_joshur@gva.es>\n" +"\n" +"Colaboradores:\n" +" * Andrés Jimenez\n" +" * Quirón\n" +"\n" +"Agradescimento especial a:\n" +" Comunidade de Madri, Grupo MaX(Espanha)" + +#: ../ui/tcosmonitor-abouttcos.ui:259 +msgid "Authors" +msgstr "Autores:" + +#: ../ui/tcosmonitor-abouttcos.ui:275 +msgid "Translated to your language by:" +msgstr "" +"Traduzido por:\n" +"Aécio dos Santos Pires <aecio@tcosproject.org>\n" +"\n" +"Luis Méndez Alejo\n" +"<gnumax@gmail.com>\n" +"\n" +"Maria del Mar Alejo Campos\n" +"<marymarsoueu2@hotmail.com>" + +#: ../ui/tcosmonitor-abouttcos.ui:287 +msgid "Mario Izquierdo <mariodebian@gmail.com>" +msgstr "Mario Izquierdo <mariodebian@gmail.com>" + +#: ../ui/tcosmonitor-abouttcos.ui:307 +msgid "Translators" +msgstr "Tradutores" + +#: ../ui/tcosmonitor-abouttcos.ui:324 +msgid "" +"TCOS is a free software project that need a lot of work to be the best thin " +"client plataform.\n" +"\n" +"We work every day a lot of hours to make changes and support more devices " +"and features.\n" +"\n" +"We want to continue developing this software but need your help, if you use, " +"sell or hack TCOS pehaps you could donate some money to project.\n" +"\n" +"Click on next url to get some info." +msgstr "" +"O TCOS é um projeto de Software Livre que precisa\n" +"de muito trabalho para tentar ser a melhor\n" +"plataforma para o uso de thin clients.\n" +"\n" +"Diariamente, trabalhamos durante muitas horas\n" +"para fazer modificações e suportar mais dispositivos\n" +"e características.\n" +"\n" +"Queremos continuar fazendo isto, mas precisamos\n" +"da sua ajuda. Se você usar, vender ou modificar o TCOS,\n" +"talvez possa doar algum dinheiro ao projeto.\n" +"\n" +"Clique no botão 'Doações' para obter mais informações." + +#: ../ui/tcosmonitor-abouttcos.ui:370 +msgid "<u>http://wiki.tcosproject.org/TcosProject:Site_support</u>" +msgstr "<u>http://wiki.tcosproject.org/TcosProject:Site_support/es</u>" + +#: ../ui/tcosmonitor-abouttcos.ui:392 +msgid "Don't show donations message on start." +msgstr "Não mostrar a mensagem de doação no início." + +#: ../ui/tcosmonitor-abouttcos.ui:415 +msgid "Donate" +msgstr "Doações" + +#: ../ui/tray.ui:20 +msgid "<big><b>TCOS devices</b></big>" +msgstr "<big><b>Dispositivos TCOS</b></big>" + +#: ../ui/tray.ui:57 +msgid "Hide" +msgstr "Ocultar" + +#: ../ui/tcos-volume-manager.ui:39 +msgid "Restart sound" +msgstr "Reiniciar o som" + +#: ../ui/tcos-volume-manager.ui:54 +msgid "Sound levels" +msgstr "Níveis de som" + +#: ../ui/tcos-volume-manager.ui:90 +msgid "Main Channels" +msgstr "Canais de som principais" + +#: ../ui/tcos-volume-manager.ui:113 +msgid "Secondary Channels" +msgstr "Canais de som secundários" + +#: ../ui/tcosmonitor-chatwindow.ui:8 +msgid "Chat emission list" +msgstr "Lista de emissão do chat" + +#: ../ui/tcosmonitor-chatwindow.ui:17 +msgid "<span size=\"x-large\">Chat emission list</span>" +msgstr "<span size=\"x-large\">Lista de Emissão do Chat</span>" + +#: ../ui/tcosmonitor-chatwindow.ui:80 +msgid "Connect" +msgstr "Conectar" + +#: ../ui/tcosmonitor-chatwindow.ui:128 +msgid "Disconnect" +msgstr "Desconectar" + +#: ../ui/tcosmonitor-chatwindow.ui:176 +msgid "Exit" +msgstr "Sair" + +#: ../ui/tcosmonitor-staticwindow.ui:8 +msgid "Static hosts list" +msgstr "Lista Fixa de Terminais" + +#: ../ui/tcosmonitor-staticwindow.ui:17 +msgid "<span size=\"x-large\">Static Hosts list</span>" +msgstr "<span size=\"x-large\">Lista Fixa de Terminais</span>" + +#: ../ui/tcosmonitor-staticwindow.ui:80 +msgid "Add" +msgstr "Adicionar" + +#: ../ui/tcosmonitor-staticwindow.ui:128 +msgid "Modify" +msgstr "Modificar" + +#: ../ui/tcosmonitor-staticwindow.ui:176 +msgid "Delete" +msgstr "Deletar" + +#: ../ui/tcosmonitor-staticwindow.ui:225 +msgid "Get from connected" +msgstr "Obter a partir dos conectados" + +#: ../ui/tcosmonitor-staticwindow.ui:292 ../ui/tcosmonitor-mainwindow.ui:771 +#: ../ui/tcosmonitor-staticwindownew.ui:150 +msgid "Cancel" +msgstr "Cancelar" + +#: ../ui/tcosmonitor-staticwindow.ui:340 +#: ../ui/tcosmonitor-staticwindownew.ui:198 +msgid "Save" +msgstr "Salvar" + +#: ../ui/tcospersonalize.ui:34 +msgid "<b>unknow host</b>" +msgstr "<b>terminal desconhecido</b>" + +#: ../ui/tcospersonalize.ui:74 +msgid "Disable Ctrl + Alt + Backspace (for kill Xorg)" +msgstr "Desabilitar Ctrl+Alt+Backspace (para matar o Xorg)" + +#: ../ui/tcospersonalize.ui:211 +msgid "Get avalaible drivers" +msgstr "Carregar os drivers disponíveis" + +#: ../ui/tcospersonalize.ui:248 +msgid "Display Settings" +msgstr "Configuração Gráfica" + +#: ../ui/tcospersonalize.ui:351 +msgid "Default boot kernel" +msgstr "Kernel de inicialização padrão" + +#: ../ui/tcospersonalize.ui:376 +msgid "<b>PXE Boot options</b>" +msgstr "Opções de inicialização via PXE" + +#: ../ui/tcospersonalize.ui:391 +msgid "Default boot method" +msgstr "Método de inicialização padrão" + +#: ../ui/tcospersonalize.ui:419 +msgid "Command line" +msgstr "Linha de comando" + +#: ../ui/tcospersonalize.ui:507 +msgid "Boot options" +msgstr "Opções de inicialização" + +#: ../ui/tcospersonalize.ui:551 +msgid "Delete Config" +msgstr "Apagar as configurações" + +#: ../ui/tcosmonitor-mainwindow.ui:8 +msgid "TcosMonitor" +msgstr "TcosMonitor" + +#: ../ui/tcosmonitor-mainwindow.ui:22 +msgid "Exit TcosMonitor" +msgstr "Sair do TcosMonitor" + +#: ../ui/tcosmonitor-mainwindow.ui:35 +msgid "Open preferences dialog" +msgstr "Abrir o menu Prefêrencias" + +#: ../ui/tcosmonitor-mainwindow.ui:48 +msgid "Update host list" +msgstr "Atualizar a lista de terminais" + +#: ../ui/tcosmonitor-mainwindow.ui:49 +msgid "Refresh" +msgstr "Atualizar" + +#: ../ui/tcosmonitor-mainwindow.ui:71 +msgid "All Hosts" +msgstr "Todos os terminais" + +#: ../ui/tcosmonitor-mainwindow.ui:99 +msgid "Find" +msgstr "Pesquisar" + +#: ../ui/tcosmonitor-mainwindow.ui:111 +msgid "About this app" +msgstr "Sobre esta aplicação" + +#: ../ui/tcosmonitor-mainwindow.ui:219 +msgid "Start audio chat" +msgstr "Iniciar chat de áudio" + +#: ../ui/tcosmonitor-mainwindow.ui:331 +msgid "Send audio/video" +msgstr "Enviar áudio/vídeo" + +#: ../ui/tcosmonitor-mainwindow.ui:443 +msgid "Exe app" +msgstr "Executar aplicação" + +#: ../ui/tcosmonitor-mainwindow.ui:499 +msgid "Send message" +msgstr "Enviar mensagem" + +#: ../ui/tcosmonitor-mainwindow.ui:581 +msgid "List view" +msgstr "Visualizar lista" + +#: ../ui/tcosmonitor-mainwindow.ui:629 +msgid "Icon view" +msgstr "Visualizar ícone" + +#: ../ui/tcosmonitor-mainwindow.ui:689 +msgid "Simulate my classroom" +msgstr "Simule minha sala de aula" + +#: ../ui/tcosmonitor-staticwindownew.ui:8 +msgid "New or edit hosts" +msgstr "Novo ou editar terminal" + +#: ../ui/tcosmonitor-staticwindownew.ui:32 +msgid "" +"You can add a simple host, \n" +" example: <b>192.168.0.100</b>\n" +"\n" +"or range of hosts, \n" +" example: <b>192.168.0.100-120</b>\n" +"\n" +"MAC address is optional" +msgstr "" +"Você pode adicionar um terminal.\n" +" Exemplo: <b>192.168.0.100</b>\n" +"\n" +"Ou adicionar uma faixa de rede. \n" +" Exemplo: <b>192.168.0.100-120</b>\n" +"\n" +"O endereço MAC é opcional." + +#: ../ui/tcosmonitor-staticwindownew.ui:57 +msgid "IP address *" +msgstr "Endereço IP *" + +#: ../ui/tcosmonitor-askwindow.ui:8 +msgid "Question" +msgstr "Pergunta" + +#: ../ui/tcosmonitor-askwindow.ui:50 +msgid "You can drag and drop launcher file to this box" +msgstr "Pode arrastar e soltar um lançador nesta caixa" + +#: ../ui/tcosmonitor-askwindow.ui:61 +msgid "<b>Run app in unknow host</b>" +msgstr "<b>Executar as aplicações no terminal desconhecido</b>" + +#~ msgid "Lliurex Lab" +#~ msgstr "Laboratório Lliurex" + +#~ msgid "" +#~ "Cloning client, please wait.\n" +#~ "Poweroff button has been temporaly disabled..." +#~ msgstr "" +#~ "Clonando o terminal, por favor espere.\n" +#~ "O botão desligar foi temporariamente desabilitado..." + +#~ msgid "Client successfully cloned!!. Please restart client." +#~ msgstr "Terminal clonado com sucesso!! Por favor reinicie-o." + +#~ msgid "Cloning has failed!!" +#~ msgstr "Falha ao clonar!!" + +#~ msgid "Normal" +#~ msgstr "Normal" + +#~ msgid "Quit from TcosMonitor" +#~ msgstr "Sair do TcosMonitor" + +#~ msgid "Salir de Lliurex Lab" +#~ msgstr "Sair do laboratório Lliurex" + +#~ msgid "<span size=\"xx-large\">Lliurex Lab</span>" +#~ msgstr "<span size=\"xx-large\">TcosMonitor</span>" + +#~ msgid "About Lliurex Lab" +#~ msgstr "Sobre o laboratório Lliurex" + +#~ msgid "Clonning clients...." +#~ msgstr "Clonando terminais..." + +#~ msgid "Open share" +#~ msgstr "Abrir compartilhamento" + +#~ msgid "Program mode" +#~ msgstr "Modo programa" + +#~ msgid "Clone clients" +#~ msgstr "Clonar terminais" + +#~ msgid "Can't move icon, another host is near." +#~ msgstr "Não pôde mover o ícone. Outro terminal etá ocupando esta posição" + +#~ msgid "" +#~ "Error getting Xorg info:\n" +#~ "%s" +#~ msgstr "" +#~ "Erro ao obter a informação do Xorg:\n" +#~ "%s" + +#~ msgid "Send my MIC audio" +#~ msgstr "Enviar meu áudio do microfone" + +#~ msgid "Chat conference mode off." +#~ msgstr "Chat de conferência desativada." + +#~ msgid "No host found" +#~ msgstr "Nenhum terminal foi encontrado" diff --git a/po/qcv.po b/po/qcv.po new file mode 100644 index 0000000..4eed0b3 --- /dev/null +++ b/po/qcv.po @@ -0,0 +1,2882 @@ +# translation of devhelp.po to +# Devhelp translation to Catalan. +# Copyright © 2003, 2008 Free Software Foundation, Inc. +# Aleix Badia <abadia@ica.es>, 2003. +# Raül Cambeiro <rulet@menta.net>, 2003. +# Jordi Mallach <jordi@sindominio.ne>, 2003. +# +# +msgid "" +msgstr "" +"Project-Id-Version: qcv\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-02-09 20:04+0100\n" +"PO-Revision-Date: 2008-10-30 18:05+0100\n" +"Last-Translator: Pilar Embid Giner <embid_mar@gva.es>\n" +"Language-Team: Valencian <lliurex@gva.es>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../tcosmonitor.py:127 +#, python-format +msgid "" +"The user \"%s\" must be member of the group \"tcos\" to exec tcosmonitor.\n" +"\n" +"If you are system administrator, add your user to tcos group." +msgstr "" +"L'usuari \"%s\" ha de ser membre del grup \"tcos\".\n" +"\n" +"Si sou administrador del sistema, afegiu l'usuari al grup tcos." + +#: ../tcosmonitor.py:144 ../tcosmonitor/shared.py:116 +msgid "Lliurex Lab" +msgstr "Lliurex Lab" + +#: ../tcosmonitor.py:255 +msgid "Send files disabled. rsync not configured." +msgstr "L'enviament de fitxer està inhabilitat. No està configutat rsync." + +#: ../tcosmonitor.py:340 ../tcospersonalize.py:552 +#: ../tcos-volume-manager.py:374 +msgid "Exiting" +msgstr "S'està eixint" + +#: ../tcos-devices-ng.py:189 +#, python-format +msgid "Rebooting in %s seconds" +msgstr "L'equip es reiniciarà en %s segons" + +#: ../tcos-devices-ng.py:191 +#, python-format +msgid "Shutting down in %s seconds" +msgstr "L'equip s'apagarà en %s segons" + +#: ../tcos-devices-ng.py:207 ../tcos-devices-ng.py:210 +#, python-format +msgid "" +"ERROR during action %(action)s:\n" +"%(errortxt)s" +msgstr "" +"S'ha produït un ERROR mentres es realitzava l'acció %(action)s:\n" +"%(errortxt)s" + +#: ../tcos-devices-ng.py:240 +msgid "Tcos device daemon" +msgstr "Dimoni de dispositius TCOS" + +#: ../tcos-devices-ng.py:284 ../tcos-volume-manager.py:143 +#, python-format +msgid "Error connecting with TcosXmlRpc in %s." +msgstr "S'ha produït un error mentres es connectava amb tcosxmlrpc en %s" + +#: ../tcos-devices-ng.py:308 +#, python-format +msgid "Cdrom device %s" +msgstr "Dispositiu cdrom %s" + +#: ../tcos-devices-ng.py:311 +msgid "Mount Cdrom" +msgstr "Munta el cdrom" + +#: ../tcos-devices-ng.py:312 +msgid "Umount Cdrom" +msgstr "Desmunta el cdrom" + +#: ../tcos-devices-ng.py:334 +#, python-format +msgid "Disk partition %s" +msgstr "Partición del disc %s" + +#: ../tcos-devices-ng.py:337 +msgid "Mount disk partition" +msgstr "Munta la partició del disc" + +#: ../tcos-devices-ng.py:338 +msgid "Umount disk partition" +msgstr "Desmunta la partició del disc" + +#: ../tcos-devices-ng.py:350 +msgid "No floppy detected" +msgstr "No s'ha detectat cap disquet" + +#: ../tcos-devices-ng.py:362 ../tcos-devices-ng.py:683 +#: ../tcos-devices-ng.py:689 ../tcos-devices-ng.py:695 +msgid "Floppy" +msgstr "Disquet" + +#: ../tcos-devices-ng.py:365 +msgid "Mount Floppy" +msgstr "Munta el disquet" + +#: ../tcos-devices-ng.py:366 +msgid "Umount Floppy" +msgstr "Desmunta el disquet" + +#: ../tcos-devices-ng.py:376 +msgid "Floppy mounted. Ready for use." +msgstr "Disquet muntat. Preparat per a usar." + +#: ../tcos-devices-ng.py:378 +msgid "Floppy umounted. You can extract it." +msgstr "Disquet desmuntat. Ara pot extraure'l." + +#: ../tcos-devices-ng.py:394 +msgid "Hard disk partition mounted. Ready for use." +msgstr "Partició muntada del disc dur. Preparat per a usar." + +#: ../tcos-devices-ng.py:397 +msgid "Hard disk partition umounted." +msgstr "Partició desmuntada del disc dur." + +#: ../tcos-devices-ng.py:419 +msgid "Audio cdrom mounted., you can listen music opening wav files." +msgstr "Cdrom d'àudio muntat., ara podeu obrir els fitxers de música wav." + +#: ../tcos-devices-ng.py:421 +msgid "Cdrom mounted. Ready for use." +msgstr "Cdrom muntat. Preparat per a usar." + +#: ../tcos-devices-ng.py:424 +msgid "Cdrom umounted. You can extract it." +msgstr "Cdrom desmuntat. Ara podeu extraure'l." + +#: ../tcos-devices-ng.py:448 +msgid "" +"Cloning client, please wait.\n" +"Poweroff button has been temporaly disabled..." +msgstr "" + +#: ../tcos-devices-ng.py:453 +msgid "Client successfully cloned!!. Please restart client." +msgstr "" + +#: ../tcos-devices-ng.py:458 +msgid "Cloning has failed!!" +msgstr "" + +#: ../tcos-devices-ng.py:538 +#, python-format +msgid "" +"Mounting device %s\n" +"Please wait..." +msgstr "" +"S'està muntant el dispositiu %s\n" +"Per favor, espere..." + +#: ../tcos-devices-ng.py:587 +msgid "Error mounting LTSPFS, check versions of LTSPFS packages" +msgstr "" +"S'ha produït un error mentres es muntava LTSPFS, comproveu les versions dels " +"paquets LTSPFS" + +#: ../tcos-devices-ng.py:613 +#, python-format +msgid "" +"Umounting device %s.\n" +"Please wait..." +msgstr "" +"S'està desmuntant el dispositiu %s.\n" +"Per favor, espere..." + +#: ../tcos-devices-ng.py:660 +msgid "usbdisk" +msgstr "disc-usb" + +#: ../tcos-devices-ng.py:662 +msgid "firewiredisk" +msgstr "disc-firewire" + +#: ../tcos-devices-ng.py:687 +msgid "Can't mount floppy" +msgstr "No es pot muntar el disquet" + +#: ../tcos-devices-ng.py:698 +msgid "Can't umount floppy" +msgstr "No es pot desmuntar el disquet" + +#: ../tcos-devices-ng.py:711 ../tcos-devices-ng.py:721 +#: ../tcos-devices-ng.py:732 ../tcos-devices-ng.py:847 +#: ../tcos-devices-ng.py:859 ../tcos-devices-ng.py:878 +#: ../tcos-devices-ng.py:890 ../tcos-devices-ng.py:922 +#, python-format +msgid "Cdrom_%s" +msgstr "Cdrom_%s" + +#: ../tcos-devices-ng.py:719 +msgid "Can't mount cdrom" +msgstr "No es pot muntar el cdrom" + +#: ../tcos-devices-ng.py:735 +msgid "Can't umount cdrom" +msgstr "No es pot desmuntar el cdrom" + +#: ../tcos-devices-ng.py:753 ../tcos-devices-ng.py:763 +#: ../tcos-devices-ng.py:774 +#, python-format +msgid "Disk_%s" +msgstr "Disc_%s" + +#: ../tcos-devices-ng.py:761 +msgid "Can't mount hard disk partition" +msgstr "No es pot muntar la partició del disc dur" + +#: ../tcos-devices-ng.py:777 +msgid "Can't umount hard disk partition" +msgstr "No es pot desmuntar la partició del disc dur" + +#: ../tcos-devices-ng.py:818 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Connected CDROM USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Des del terminal %(host)s.\n" +"Dispositiu CDROM USB connectat %(device)s\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:822 +#, python-format +msgid "CDROM USB device %s" +msgstr "Dispositiu CDROM USB %s" + +#: ../tcos-devices-ng.py:825 +#, python-format +msgid "Mount CDROM USB device %s" +msgstr "Munta el dispositiu CDROM USB %s" + +#: ../tcos-devices-ng.py:826 +#, python-format +msgid "Umount CDROM USB device %s" +msgstr "Desmunta el dispositiu CDROM USB %s" + +#: ../tcos-devices-ng.py:851 ../tcos-devices-ng.py:882 +#: ../tcos-devices-ng.py:1012 ../tcos-devices-ng.py:1023 +#: ../tcos-devices-ng.py:1069 ../tcos-devices-ng.py:1149 +#: ../tcos-devices-ng.py:1160 ../tcos-devices-ng.py:1206 +#, python-format +msgid "Error, can't mount device %s" +msgstr "S'ha produït un error, no es pot muntar el dispositiu %s" + +#: ../tcos-devices-ng.py:909 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Disconnected CDROM USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Des del terminal %(host)s.\n" +"Dispositiu CDROM USB desconnectat %(device)s\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:937 +#, python-format +msgid "Can't umount cdrom usb %s" +msgstr "No es pot desmuntar el cdrom usb %s" + +#: ../tcos-devices-ng.py:962 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Connected USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Des del terminal %(host)s.\n" +"Dispositiu USB connectat %(device)s\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:965 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Disconnected USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Des del terminal %(host)s.\n" +"Dispositiu USB desconnectat %(device)s\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:993 +#, python-format +msgid "USB device %s" +msgstr "Dispositiu USB %s" + +#: ../tcos-devices-ng.py:996 +#, python-format +msgid "Mount USB device %s" +msgstr "Munta el dispositiu USB %s" + +#: ../tcos-devices-ng.py:997 +#, python-format +msgid "Umount USB device %s" +msgstr "Desmunta el dispositiu USB %s" + +#: ../tcos-devices-ng.py:1099 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Connected Firewire device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Des del terminal %(host)s.\n" +"Dispositiu Firewire connectat %(device)s\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:1102 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Disconnected Firewire device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" +"Des del terminal %(host)s.\n" +"Dispositiu Firewire desconnectat %(device)s\n" +"%(vendor)s %(model)s" + +#: ../tcos-devices-ng.py:1130 +#, python-format +msgid "Firewire device %s" +msgstr "Dispositiu Firewire %s" + +#: ../tcos-devices-ng.py:1133 +#, python-format +msgid "Mount Firewire device %s" +msgstr "Munta el dispositiu Firewire %s" + +#: ../tcos-devices-ng.py:1134 +#, python-format +msgid "Umount Firewire device %s" +msgstr "Desmunta el dispositiu Firewire %s" + +#: ../tcos-devices-ng.py:1217 +#, python-format +msgid "CDROM USB device %s umounted. You can extract it." +msgstr "Dispositiu CDROM USB %s desmuntat. Ara podeu extraure'l." + +#: ../tcos-devices-ng.py:1220 +#, python-format +msgid "CDROM USB device %s mounted. Ready for use." +msgstr "Dispositiu CDROM USB %s muntat. Preparat per a usar." + +#: ../tcos-devices-ng.py:1258 +#, python-format +msgid "USB device %s umounted. You can extract it." +msgstr "Dispositiu USB %s desmuntat. Ara podeu extraure'l." + +#: ../tcos-devices-ng.py:1261 +#, python-format +msgid "USB device %s mounted. Ready for use." +msgstr "Dispositiu USB %s muntat. Preparat per a usar." + +#: ../tcos-devices-ng.py:1297 +#, python-format +msgid "Firewire device %s umounted. You can extract it." +msgstr "Dispositiu Firewire %s desmuntat. Ara podeu extraure'l." + +#: ../tcos-devices-ng.py:1300 +#, python-format +msgid "Firewire device %s mounted. Ready for use." +msgstr "Dispositiu Firewire %s muntat. Preparat per a usar." + +#: ../tray.glade:38 +msgid "<big><b>TCOS devices</b></big>" +msgstr "" + +#: ../tray.glade:105 +msgid "Hide" +msgstr "" + +#: ../tcospersonalize.glade:8 ../tcosmonitor.glade:60 +#: ../tcosmonitor.glade:1405 +msgid "Preferences" +msgstr "Preferències" + +#: ../tcospersonalize.glade:57 +msgid "<b>unknow host</b>" +msgstr "<b>equip desconegut</b>" + +#: ../tcospersonalize.glade:103 ../tcosmonitor/extensions/info.py:365 +msgid "Enable mouse wheel" +msgstr "Activa la roda del ratolí" + +#: ../tcospersonalize.glade:125 +msgid "Disable Ctrl + Alt + Backspace (for kill Xorg)" +msgstr "Inhabilita Ctrl+Alt+Backspace (per a tancar l'Xorg)" + +#: ../tcospersonalize.glade:146 ../tcosmonitor/extensions/info.py:357 +msgid "Xorg Resolution" +msgstr "Resolució de l'Xorg" + +#: ../tcospersonalize.glade:208 ../tcosmonitor/extensions/info.py:359 +msgid "Xorg Color depth" +msgstr "Profunditat de color de l'Xorg" + +#: ../tcospersonalize.glade:253 ../tcosmonitor/extensions/info.py:353 +msgid "X Session Type" +msgstr "Tipus de sessió X" + +#: ../tcospersonalize.glade:299 ../tcosmonitor/extensions/info.py:361 +msgid "DPMS energy monitor control" +msgstr "Control d'energia del monitor DPMS" + +#: ../tcospersonalize.glade:326 ../tcosmonitor/extensions/info.py:355 +msgid "Xorg Driver" +msgstr "Controlador d'Xorg" + +#: ../tcospersonalize.glade:352 +msgid "Get avalaible drivers" +msgstr "Carrega els controladors disponibles" + +#: ../tcospersonalize.glade:383 +msgid "Display Settings" +msgstr "Configuració de la pantalla" + +#: ../tcospersonalize.glade:426 ../tcosmonitor/extensions/info.py:375 +msgid "X Horiz sync" +msgstr "Sincronització horitzontal X" + +#: ../tcospersonalize.glade:454 ../tcosmonitor/extensions/info.py:377 +msgid "X Vert sync" +msgstr "Sincronització vertical X" + +#: ../tcospersonalize.glade:541 ../tcosmonitor.glade:2500 +msgid "Advanced" +msgstr "Avançat" + +#: ../tcospersonalize.glade:573 +msgid "Default boot kernel" +msgstr "Nucli d'arrancada per defecte" + +#: ../tcospersonalize.glade:617 +msgid "<b>PXE Boot options</b>" +msgstr "<b>Opcions d'arrancada de PXE</b>" + +#: ../tcospersonalize.glade:645 +msgid "Default boot method" +msgstr "Mètode d'arrancada per defecte" + +#: ../tcospersonalize.glade:690 +msgid "Command line" +msgstr "Línia d'ordes" + +#: ../tcospersonalize.glade:801 +msgid "Boot options" +msgstr "Opcions d'arrancada" + +#: ../tcospersonalize.glade:915 +msgid "Delete Config" +msgstr "Elimina la configuració" + +#: ../tcos-volume-manager.glade:9 ../tcos-volume-manager.py:229 +msgid "Tcos Volume Manager" +msgstr "Gestor de volum del TCOS" + +#: ../tcos-volume-manager.glade:67 +msgid "Restart sound" +msgstr "" + +#: ../tcos-volume-manager.glade:90 +msgid "Sound levels" +msgstr "Nivells de volum" + +#: ../tcos-volume-manager.glade:152 +msgid "Main Channels" +msgstr "Canals principals" + +#: ../tcos-volume-manager.glade:194 +msgid "Secondary Channels" +msgstr "Canals secundaris" + +#: ../tcospersonalize.py:115 +msgid "" +"Need a host to configure!!!\n" +"Try exec:\n" +" tcospersonalize --host=XXX.XXX.XXX.XXX" +msgstr "" +"Es necessita una adreça d'equip a configurar!!!\n" +"Proveu a executar:\n" +" tcospersonalize --host=XXX.XXX.XXX.XXX" + +#: ../tcospersonalize.py:180 +msgid "host: " +msgstr "equip: " + +#: ../tcospersonalize.py:444 +msgid "Host down, can't connect to tcosxmlrpc." +msgstr "L'equip és inaccessible, no es pot connectar a tcosxmlrpc." + +#: ../tcospersonalize.py:452 +#, python-format +msgid "New %d drivers loaded from terminal." +msgstr "S'han carregat %d controladors des del terminal." + +#: ../tcospersonalize.py:511 +#, python-format +msgid "Really delete config of %s?" +msgstr "Esteu segur que voleu eliminar la configuració de %s?" + +#: ../tcospersonalize.py:514 +msgid "Deleted!" +msgstr "Esborrat!" + +#: ../tcos-volume-manager.py:101 ../tcos-volume-manager.py:113 +#, python-format +msgid "" +"Tcos Sound levels on:\n" +"%s" +msgstr "" +"Nivells de volum del TCOS en:\n" +"%s" + +#: ../tcos-volume-manager.py:121 +#, python-format +msgid "ERROR: It appears that TcosXmlRpc is not running on %s." +msgstr "ERROR: Sembla que el tcosxmlrpc no està en execució en %s" + +#: ../tcos-volume-manager.py:213 +msgid "Loading channels info..." +msgstr "S'està carregant la informació dels canals..." + +#: ../tcos-volume-manager.py:226 +msgid "Error loading channels info (xauth error)" +msgstr "" +"S'ha produït un error en carregar la informació de canals (error de xauth)" + +#: ../tcos-volume-manager.py:230 +#, python-format +msgid "<span size='large'><b>Sound mixer of %s host</b></span>" +msgstr "<span size='large'><b>Mesclador d'àudio de l'equip %s</b></span>" + +#: ../tcos-volume-manager.py:296 ../tcosmonitor/extensions/info.py:442 +msgid "Mute" +msgstr "Sense so" + +#: ../tcos-volume-manager.py:315 +msgid "Main controls ready" +msgstr "Els controls principals estan preparats" + +#: ../tcos-volume-manager.py:319 +msgid "All remote controls loaded." +msgstr "Tots els controls remots estan carregats." + +#: ../tcos-volume-manager.py:328 ../tcosmonitor/extensions/info.py:557 +#, python-format +msgid "Changing value of %(channel)s channel, to %(value)s%%..." +msgstr "S'està canviant el valor del canal %(channel)s, a %(value)s%%..." + +#: ../tcos-volume-manager.py:335 ../tcosmonitor/extensions/info.py:564 +#, python-format +msgid "Changed value of %(channel)s channel, to %(value)s" +msgstr "S'ha canviat el valor del canal %(channel)s, a %(value)s" + +#: ../tcos-volume-manager.py:342 ../tcosmonitor/extensions/info.py:571 +#, python-format +msgid "Unmuting %s channel..." +msgstr "S'està eliminant l'emmudiment al canal %s..." + +#: ../tcos-volume-manager.py:347 ../tcosmonitor/extensions/info.py:576 +#, python-format +msgid "Muting %s channel..." +msgstr "S'està emmudint el canal %s..." + +#: ../tcos-volume-manager.py:350 ../tcosmonitor/extensions/info.py:579 +#, python-format +msgid "Status of %(channel)s channel, is \"%(newvalue)s\"" +msgstr "L'estat del canal %(channel)s és \"%(newvalue)s\"" + +#: ../tcosmonitor/TcosDBus.py:86 +msgid "TcosDBus not allowed in local display" +msgstr "El TcosDBus no està permés en pantalla local." + +#: ../tcosmonitor/TcosDBus.py:114 +#, python-format +msgid "Seems that tcosxmlrpc isn't running on host=\"%s\"" +msgstr "Sembla que el tcosxmlrpc no s'està executant en l'equip=\"%s\"" + +#: ../tcosmonitor/TcosDBus.py:135 +msgid "tcosxmlrpc ERROR conection unavalaible." +msgstr "S'ha produït un ERROR del tcosxmlrpc la connexió no està disponible" + +#: ../tcosmonitor/TcosDBus.py:151 +msgid "ERROR conecting to tcosxmlrpc, check username and password." +msgstr "" +"No es pot connectar a tcosxmlrpc, comproveu el nom d'usuari i la contrasenya." + +#: ../tcosmonitor/TcosDBus.py:243 +msgid "Message from admin" +msgstr "Missatge de l'administrador" + +#: ../tcosmonitor/TcosDBus.py:333 ../tcosmonitor/TcosDBus.py:349 +#: ../tcosmonitor/TcosDBus.py:367 ../tcosmonitor/TcosDBus.py:385 +msgid "User not allowed to run this dbus call." +msgstr "L'usuari no té permeses estes telefonades dbus." + +#: ../tcosmonitor/TcosStaticHosts.py:154 ../tcosmonitor/TcosListView.py:69 +msgid "IP address" +msgstr "Adreça IP" + +#: ../tcosmonitor/TcosStaticHosts.py:160 ../tcosmonitor.glade:4775 +msgid "MAC address" +msgstr "Adreça MAC" + +#: ../tcosmonitor/TcosStaticHosts.py:270 +msgid "No hosts found, please click on Refresh button using another method." +msgstr "" +"No s'han trobat equips, per favor, premeu el botó Actualitza usant un altre " +"mètode." + +#: ../tcosmonitor/shared.py:109 +msgid "Traditional list only" +msgstr "Només la llista tradicional" + +#: ../tcosmonitor/shared.py:110 +msgid "Icons only" +msgstr "Només icones" + +#: ../tcosmonitor/shared.py:111 +msgid "Simulate classroom" +msgstr "Simula una aula" + +#: ../tcosmonitor/shared.py:112 +msgid "Lists, icons and classroom with tabs" +msgstr "Llistes, icones i aula amb pestanyes" + +#: ../tcosmonitor/shared.py:117 +msgid "Normal" +msgstr "Normal" + +#: ../tcosmonitor/shared.py:276 ../tcosmonitor/shared.py:319 +#: ../tcosmonitor/TcosMenus.py:35 +msgid "Terminal actions" +msgstr "Accions per al terminal" + +#: ../tcosmonitor/shared.py:277 ../tcosmonitor/shared.py:320 +#: ../tcosmonitor/TcosMenus.py:36 +msgid "User actions" +msgstr "Accions per a l'usuari" + +#: ../tcosmonitor/shared.py:278 ../tcosmonitor/shared.py:321 +#: ../tcosmonitor/TcosMenus.py:37 +msgid "Audio, video and files" +msgstr "Fitxers d'àudio i vídeo" + +#: ../tcosmonitor/shared.py:285 ../tcosmonitor/extensions/info.py:47 +msgid "Refresh terminal info" +msgstr "Actualitza la informació del terminal" + +#: ../tcosmonitor/shared.py:286 ../tcosmonitor/extensions/clean.py:40 +#: ../tcosmonitor/extensions/clean.py:41 +msgid "Clean info about terminal" +msgstr "Neteja la informació del terminal" + +#: ../tcosmonitor/shared.py:287 ../tcosmonitor/TcosTrayIcon.py:54 +#: ../tcosmonitor/extensions/reboot.py:40 ../tcosmonitor/TcosTrayIcon2.py:58 +msgid "Reboot" +msgstr "Reinicia" + +#: ../tcosmonitor/shared.py:288 ../tcosmonitor/TcosTrayIcon.py:55 +#: ../tcosmonitor/extensions/reboot.py:42 ../tcosmonitor/TcosTrayIcon2.py:59 +msgid "Poweroff" +msgstr "Apaga" + +#: ../tcosmonitor/shared.py:289 ../tcosmonitor/extensions/lockscreen.py:40 +msgid "Lock screen" +msgstr "Bloqueja la pantalla" + +#: ../tcosmonitor/shared.py:290 ../tcosmonitor/extensions/lockscreen.py:42 +msgid "Unlock screen" +msgstr "Desbloqueja la pantalla" + +#: ../tcosmonitor/shared.py:291 ../tcosmonitor/extensions/italc.py:43 +msgid "Connect to remote screen (iTALC)" +msgstr "Connecta a la pantalla remota (iTALC)" + +#: ../tcosmonitor/shared.py:292 ../tcosmonitor/extensions/vnc.py:49 +msgid "Connect to remote screen (VNC)" +msgstr "Connecta a la pantalla remota (VNC)" + +#: ../tcosmonitor/shared.py:293 ../tcosmonitor/extensions/screenshot.py:45 +msgid "Screenshot" +msgstr "Captura de pantalla" + +#: ../tcosmonitor/shared.py:294 ../tcosmonitor/extensions/remotessh.py:40 +msgid "Give a remote xterm" +msgstr "Executa un terminal xterm remot" + +#: ../tcosmonitor/shared.py:295 +#: ../tcosmonitor/extensions/tcospersonalize.py:40 +msgid "Configure this host" +msgstr "Configura este equip" + +#: ../tcosmonitor/shared.py:296 ../tcosmonitor/extensions/logout.py:40 +msgid "Logout client" +msgstr "Desconnecta el client" + +#: ../tcosmonitor/shared.py:297 ../tcosmonitor/extensions/restartxorg.py:41 +msgid "Restart X session with new settings" +msgstr "Reinicia la sessió X amb la nova configuració" + +#: ../tcosmonitor/shared.py:298 ../tcosmonitor/extensions/appsmsg.py:53 +msgid "Exec app on user display" +msgstr "Executa l'aplicació en la pantalla d'usuari" + +#: ../tcosmonitor/shared.py:299 ../tcosmonitor/extensions/appsmsg.py:54 +msgid "Send a text message to user" +msgstr "Envia un missatge de text a l'usuari" + +#: ../tcosmonitor/shared.py:300 ../tcosmonitor/extensions/viewproc.py:41 +msgid "Show running apps of this client" +msgstr "Mostra les aplicacions en execució d'este client" + +#: ../tcosmonitor/shared.py:301 ../tcosmonitor/shared.py:339 +msgid "Audio/Video broadcast" +msgstr "Difusió d'àudio/vídeo" + +#: ../tcosmonitor/shared.py:302 ../tcosmonitor/shared.py:340 +#: ../tcosmonitor/extensions/sendfiles.py:49 +#: ../tcosmonitor/extensions/sendfiles.py:50 ../tcosmonitor.glade:627 +#: ../tcosmonitor.glade:3205 ../tcosmonitor.glade:3653 +msgid "Send files" +msgstr "Envia els fitxers" + +#: ../tcosmonitor/shared.py:303 ../tcosmonitor/extensions/vnc.py:50 +msgid "Demo mode (from this host)" +msgstr "Mode de demostració (des d'este equip)" + +#: ../tcosmonitor/shared.py:304 ../tcosmonitor/extensions/wakeonlan.py:41 +msgid "Boot client (WakeOnLan)" +msgstr "Arranca el client (WakeOnLan)" + +#: ../tcosmonitor/shared.py:305 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:38 +msgid "Lock internet" +msgstr "Bloqueja Internet" + +#: ../tcosmonitor/shared.py:306 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:39 +msgid "Unlock internet" +msgstr "Desbloqueja Internet" + +#: ../tcosmonitor/shared.py:307 ../tcosmonitor/extensions/dpms.py:40 +msgid "DPMS Power off monitor" +msgstr "Desactiva el DPMS per al monitor (control d'energia del monitor)" + +#: ../tcosmonitor/shared.py:308 ../tcosmonitor/extensions/dpms.py:42 +msgid "DPMS Power on monitor" +msgstr "Activa el DPMS per al monitor (control d'energia del monitor)" + +#: ../tcosmonitor/shared.py:309 +msgid "Send MIC audio (from this host)" +msgstr "Envia àudio MIC (des d'este equip)" + +#: ../tcosmonitor/shared.py:328 ../tcosmonitor/extensions/reboot.py:41 +msgid "Reboot all clients" +msgstr "Reinicia tots els clients" + +#: ../tcosmonitor/shared.py:329 ../tcosmonitor/extensions/reboot.py:43 +msgid "Poweroff all clients" +msgstr "Apaga tots els clients" + +#: ../tcosmonitor/shared.py:330 ../tcosmonitor/extensions/lockscreen.py:41 +msgid "Lock all screens" +msgstr "Bloqueja totes les pantalles" + +#: ../tcosmonitor/shared.py:331 ../tcosmonitor/extensions/lockscreen.py:43 +msgid "Unlock all screens" +msgstr "Desbloqueja totes les pantalles" + +#: ../tcosmonitor/shared.py:332 ../tcosmonitor/extensions/logout.py:41 +msgid "Logout clients" +msgstr "Desconnecta tots els clients" + +#: ../tcosmonitor/shared.py:333 ../tcosmonitor/extensions/restartxorg.py:42 +msgid "Restart X session of all clients" +msgstr "Reinicia la sessió X de tots els clients" + +#: ../tcosmonitor/shared.py:334 ../tcosmonitor/extensions/appsmsg.py:56 +msgid "Exec same app in all connected users" +msgstr "Executa la mateixa aplicació en tots els usuaris connectats" + +#: ../tcosmonitor/shared.py:335 ../tcosmonitor/extensions/appsmsg.py:57 +msgid "Send a text message to all connected users" +msgstr "Envia un missatge de text a tots els usuaris connectats" + +#: ../tcosmonitor/shared.py:336 ../tcosmonitor/extensions/vnc.py:52 +msgid "Enter demo mode, all connected users see my screen" +msgstr "Entra en mode de demostració, tots els usuaris veuen la meua pantalla" + +#: ../tcosmonitor/shared.py:337 +msgid "Enter conference mode, all connected users can hear me" +msgstr "Entra en mode conferència, tots els usuaris poden escoltar-me" + +#: ../tcosmonitor/shared.py:338 ../tcosmonitor/extensions/screenshot.py:46 +msgid "Capture All clients screens" +msgstr "Captura totes les pantalles dels clients" + +#: ../tcosmonitor/shared.py:341 ../tcosmonitor/extensions/wakeonlan.py:42 +msgid "Boot All clients (WakeOnLan)" +msgstr "Arranca tots els clients (WakeOnLan)" + +#: ../tcosmonitor/shared.py:342 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:41 +msgid "Lock internet in all connected users" +msgstr "Bloqueja Internet a tots els usuaris connectats" + +#: ../tcosmonitor/shared.py:343 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:42 +msgid "Unlock internet in all connected users" +msgstr "Desbloqueja Internet a tots els usuaris connectats" + +#: ../tcosmonitor/shared.py:344 ../tcosmonitor/extensions/dpms.py:41 +msgid "DPMS Power off monitors" +msgstr "Desactiva el DPMS per als monitors (control d'energia del monitor)" + +#: ../tcosmonitor/shared.py:345 ../tcosmonitor/extensions/dpms.py:43 +msgid "DPMS Power on monitors" +msgstr "Activa el DPMS per als monitors (control d'energia del monitor)" + +#: ../tcosmonitor/shared.py:346 +msgid "Chat audio conference" +msgstr "Audioconferència" + +#: ../tcosmonitor/shared.py:541 +#, python-format +msgid "QUESTION: %(txt)s, RESPONSE %(response)s" +msgstr "PREGUNTA: %(txt)s, RESPOSTA %(response)s" + +#: ../tcosmonitor/shared.py:558 ../tcosmonitor/shared.py:569 +#, python-format +msgid "INFO: %s" +msgstr "INFO: %s" + +# FIXME: handleme +#: ../tcosmonitor/shared.py:580 +#, python-format +msgid "ERROR: %s" +msgstr "ERROR: %s" + +#: ../tcosmonitor/TcosClassView.py:50 ../tcosmonitor/TcosIconView.py:46 +msgid "IP" +msgstr "IP" + +#: ../tcosmonitor/TcosClassView.py:51 ../tcosmonitor/TcosIconView.py:47 +#: ../tcosmonitor/TcosListView.py:63 +msgid "Hostname" +msgstr "Nom de l'ordinador" + +#: ../tcosmonitor/TcosClassView.py:52 ../tcosmonitor/TcosIconView.py:48 +#: ../tcosmonitor/TcosListView.py:75 +msgid "Username" +msgstr "Nom d'usuari" + +#: ../tcosmonitor/TcosClassView.py:53 ../tcosmonitor/TcosIconView.py:49 +#: ../tcosmonitor/TcosListView.py:86 +msgid "Logged" +msgstr "Connectat" + +#: ../tcosmonitor/TcosClassView.py:54 ../tcosmonitor/TcosIconView.py:50 +#: ../tcosmonitor/TcosListView.py:102 +msgid "Time log in" +msgstr "Temps de connexió" + +#: ../tcosmonitor/TcosClassView.py:55 ../tcosmonitor/TcosIconView.py:51 +msgid "Screen locked" +msgstr "Pantalla bloquejada" + +#: ../tcosmonitor/TcosClassView.py:56 ../tcosmonitor/TcosIconView.py:52 +msgid "Network locked" +msgstr "Xarxa bloquejada" + +#: ../tcosmonitor/TcosClassView.py:58 +msgid "" +"Place mouse on any computer to see brief info about it.\n" +"You can select and unselect multiple host clicking on every one.\n" +"Drag and drop hosts to positions and save clicking on right mouse button." +msgstr "" +"Moveu el ratolí sobre cada equip per a obtindre una informació breu de cada " +"un.\n" +"Podeu seleccionar i desseleccionar múltiples equips fent clic en cadascun.\n" +"Arrossegueu i deixeu anar els equips a les posicions i guardeu-les fent clic " +"amb el botó dret." + +#: ../tcosmonitor/TcosClassView.py:176 +msgid "Positions reset to defaults." +msgstr "Posicions reinicialitzades per defecte." + +#: ../tcosmonitor/TcosClassView.py:194 +msgid "Positions saved." +msgstr "Posicions guardades." + +#: ../tcosmonitor/TcosClassView.py:314 +#, python-format +msgid "%s is not a valid file to exe or send" +msgstr "%s no és un fitxer vàlid per a executar-lo o enviar-lo" + +#: ../tcosmonitor/TcosClassView.py:400 ../tcosmonitor/TcosIconView.py:155 +msgid "yes" +msgstr "sí" + +#: ../tcosmonitor/TcosClassView.py:402 ../tcosmonitor/TcosIconView.py:157 +msgid "no" +msgstr "no" + +#: ../tcosmonitor/TcosTrayIcon.py:49 ../tcosmonitor/TcosTrayIcon2.py:53 +#: ../tcosmonitor.glade:43 +msgid "Quit" +msgstr "Ix" + +#: ../tcosmonitor/TcosTrayIcon.py:65 +msgid "TcosDevices" +msgstr "Dispositius TCOS" + +#: ../tcosmonitor/TcosTrayIcon.py:172 ../tcosmonitor/TcosTrayIcon.py:186 +#: ../tcosmonitor/TcosTrayIcon2.py:67 +msgid "Tcos Devices" +msgstr "Dispositius TCOS" + +#: ../tcosmonitor/TcosTrayIcon.py:232 ../tcosmonitor/TcosTrayIcon2.py:344 +msgid "Usb flash" +msgstr "Memòria USB flash" + +#: ../tcosmonitor/TcosTrayIcon.py:234 ../tcosmonitor/TcosTrayIcon2.py:346 +msgid "Mount USB1" +msgstr "Munta USB1" + +#: ../tcosmonitor/TcosTrayIcon.py:235 ../tcosmonitor/TcosTrayIcon2.py:347 +msgid "Umount USB1" +msgstr "Desmunta USB1" + +#: ../tcosmonitor/extensions/lockscreen.py:49 +#: ../tcosmonitor/extensions/lockscreen.py:57 +msgid "" +"Can't connect to tcosxmlrpc.\n" +"Please verify user and password in prefences!" +msgstr "" +"No es pot connectar a tcosxmlrpc.\n" +"Per favor verifiqueu l'usuari i la contrasenya en les preferències." + +#: ../tcosmonitor/extensions/lockscreen.py:81 +#, python-format +msgid "Do you want to lock the following screens: %s?" +msgstr "Voleu bloquejar la pantalla dels següents equips: %s?" + +#: ../tcosmonitor/extensions/lockscreen.py:90 +#, python-format +msgid "Do you want to unlock the following screens: %s?" +msgstr "Voleu desbloquejar la pantalla dels següents equips: %s?" + +#: ../tcosmonitor/extensions/appsmsg.py:65 +msgid "Clients not connected" +msgstr "No hi ha clients connectats" + +#: ../tcosmonitor/extensions/appsmsg.py:88 +#, python-format +msgid "" +"<b>Exec app in user(s) screen(s)\n" +"or open web address to:</b>\n" +"%s" +msgstr "" +"<b>Executa l'aplicació en la pantalla(s) d'usuari(s)\n" +"o obri l'adreça web a:</b>\n" +"%s" + +#: ../tcosmonitor/extensions/appsmsg.py:90 +#, python-format +msgid "" +"<b>Send a message to:</b>\n" +"%s" +msgstr "" +"<b>Envia un missatge a:</b>\n" +"%s" + +#: ../tcosmonitor/extensions/appsmsg.py:123 +#: ../tcosmonitor/extensions/appsmsg.py:164 +msgid "Can't exec application, user is not logged" +msgstr "No es poden executar aplicacions, l'usuari no està connectat" + +#: ../tcosmonitor/extensions/appsmsg.py:142 +#: ../tcosmonitor/extensions/appsmsg.py:153 +#, python-format +msgid "%s is not a valid application" +msgstr "%s no és una aplicació vàlida" + +#: ../tcosmonitor/extensions/appsmsg.py:173 +msgid "Can't send message, user is not logged" +msgstr "No es poden enviar missatges, l'usuari no està connectat" + +#: ../tcosmonitor/extensions/appsmsg.py:288 +#: ../tcosmonitor/extensions/appsmsg.py:297 +#, python-format +msgid "%s is not application" +msgstr "%s no és una aplicació" + +#: ../tcosmonitor/extensions/appsmsg.py:354 +#, python-format +msgid "" +"Error while exec remote app:\n" +"Reason: %s" +msgstr "" +"S'ha produït un error quan s'executava aplicació remota:\n" +"Raó: %s" + +#: ../tcosmonitor/extensions/appsmsg.py:361 +#, python-format +msgid "" +"Error while send message:\n" +"Reason: %s" +msgstr "" +"S'ha produït un error quan s'enviava un missatge:\n" +"Raó: %s" + +#: ../tcosmonitor/extensions/remotessh.py:47 +msgid "Enter password of remote thin client (if asked for it)" +msgstr "Introduïu la contrasenya del client lleuger (si es demanara)" + +#: ../tcosmonitor/extensions/dpms.py:79 +#, python-format +msgid "Do you want to switch off the following monitors: %s?" +msgstr "Voleu desconnectar els monitors següents: %s?" + +#: ../tcosmonitor/extensions/dpms.py:88 +#, python-format +msgid "Do you want to switch on the following monitors: %s?" +msgstr "Voleu connectar els monitors següents: %s?" + +#: ../tcosmonitor/extensions/screenshot.py:66 +#: ../tcosmonitor/extensions/screenshot.py:83 +#, python-format +msgid "Can't make screenshot, error: %s" +msgstr "No es pot fer una captura de pantalla, error: %s" + +#: ../tcosmonitor/extensions/screenshot.py:75 +msgid "Trying to order terminal to do a screenshot..." +msgstr "S'està intentant manar al terminal que faça una captura de pantalla..." + +#: ../tcosmonitor/extensions/screenshot.py:87 +msgid "Get another screenshot" +msgstr "Fes una altra captura de pantalla" + +#: ../tcosmonitor/extensions/screenshot.py:102 +#, python-format +msgid "Screenshot of <span style='font-style: italic'>%s</span>" +msgstr "Captura de pantalla de <span style='font-style: italic'>%s</span>" + +#: ../tcosmonitor/extensions/screenshot.py:125 +#, python-format +msgid "Screenshot of %s, done." +msgstr "La captura de pantalla de %s està feta." + +#: ../tcosmonitor/extensions/screenshot.py:132 +msgid "Save Screenshot" +msgstr "Guarda la captura de pantalla" + +#: ../tcosmonitor/extensions/screenshot.py:144 +msgid "Select file to save screenshot..." +msgstr "Seleccioneu el fitxer per a guardar la captura de pantalla..." + +#: ../tcosmonitor/extensions/screenshot.py:148 +#, python-format +msgid "screenshot_of_%(hostname)s_date_%(date)s.png" +msgstr "screenshot_of_%(hostname)s_date_%(date)s.png" + +#: ../tcosmonitor/extensions/screenshot.py:152 +msgid "Image Files ( *.png, *.jpg)" +msgstr "Fitxers d'imatge (*.png, *.jpg)" + +#: ../tcosmonitor/extensions/screenshot.py:162 +msgid "File must be png or jpg." +msgstr "El fitxer ha de ser png o jpg." + +#: ../tcosmonitor/extensions/screenshot.py:185 +msgid "Screenshots of all hosts" +msgstr "Captura de pantalla de tots els equips" + +#: ../tcosmonitor/extensions/screenshot.py:201 +#, python-format +msgid "Screenshot of %s" +msgstr "Captura de pantalla de %s" + +#: ../tcosmonitor/extensions/sendfiles.py:62 +#: ../tcosmonitor/extensions/sendfiles.py:120 +msgid "Can't send files, user is not logged" +msgstr "No es poden enviar fitxers, l'usuari no està connectat" + +#: ../tcosmonitor/extensions/sendfiles.py:66 +#: ../tcosmonitor/extensions/sendfiles.py:142 +#: ../tcosmonitor/extensions/sendfiles.py:237 +msgid "" +"TcosMonitor need special configuration for rsync daemon to send files.\n" +"\n" +"Please read configuration requeriments in:\n" +"/usr/share/doc/tcosmonitor/README.rsync" +msgstr "" +"El TcosMonitor necessita una configuració especial del dimoni rsync per a " +"enviar fitxers.\n" +"\n" +"Llegiu la configuració requerida en:\n" +"/usr/share/doc/tcosmonitor/README.rsync" + +#: ../tcosmonitor/extensions/sendfiles.py:84 +#: ../tcosmonitor/extensions/sendfiles.py:176 +#: ../tcosmonitor/extensions/sendfiles.py:270 +msgid "Waiting for send files..." +msgstr "S'està esperant l'enviament de fitxers..." + +#: ../tcosmonitor/extensions/sendfiles.py:93 +#: ../tcosmonitor/extensions/sendfiles.py:95 +#: ../tcosmonitor/extensions/sendfiles.py:99 +#: ../tcosmonitor/extensions/sendfiles.py:108 +#: ../tcosmonitor/extensions/sendfiles.py:189 +#: ../tcosmonitor/extensions/sendfiles.py:191 +#: ../tcosmonitor/extensions/sendfiles.py:195 +#: ../tcosmonitor/extensions/sendfiles.py:204 +#: ../tcosmonitor/extensions/sendfiles.py:283 +#: ../tcosmonitor/extensions/sendfiles.py:285 +#: ../tcosmonitor/extensions/sendfiles.py:289 +#: ../tcosmonitor/extensions/sendfiles.py:298 +msgid "Teacher" +msgstr "Mestre" + +#: ../tcosmonitor/extensions/sendfiles.py:95 +#: ../tcosmonitor/extensions/sendfiles.py:108 +#: ../tcosmonitor/extensions/sendfiles.py:191 +#: ../tcosmonitor/extensions/sendfiles.py:204 +#: ../tcosmonitor/extensions/sendfiles.py:285 +#: ../tcosmonitor/extensions/sendfiles.py:298 +#, python-format +msgid "" +"Teacher has sent some files to %(teacher)s folder:\n" +"\n" +"%(basenames)s" +msgstr "" +"El professor ha enviat diversos fitxers a la carpeta %(teacher)s:\n" +"\n" +"%(basenames)s" + +#: ../tcosmonitor/extensions/sendfiles.py:104 +#: ../tcosmonitor/extensions/sendfiles.py:200 +#: ../tcosmonitor/extensions/sendfiles.py:294 +#: ../tcosmonitor/extensions/reboot.py:108 +#: ../tcosmonitor/extensions/videolan.py:194 +#: ../tcosmonitor/extensions/videolan.py:389 +#: ../tcosmonitor/extensions/videolan.py:629 +#, python-format +msgid "" +"Error while exec remote app:\n" +"Reason:%s" +msgstr "" +"S'ha produït un error quan s'executava l'aplicació remota:\n" +"Raó: %s" + +#: ../tcosmonitor/extensions/sendfiles.py:105 +#: ../tcosmonitor/extensions/sendfiles.py:201 +#: ../tcosmonitor/extensions/sendfiles.py:295 +msgid "Error creating destination folder." +msgstr "S'ha produït un error en crear el directori destinació." + +#: ../tcosmonitor/extensions/sendfiles.py:110 +#: ../tcosmonitor/extensions/sendfiles.py:205 +#: ../tcosmonitor/extensions/sendfiles.py:300 +msgid "Files sent." +msgstr "Fitxers enviats." + +#: ../tcosmonitor/extensions/sendfiles.py:125 +#: ../tcosmonitor/extensions/sendfiles.py:220 +msgid "Select file or files..." +msgstr "Seleccioneu el fitxer o fitxers..." + +#: ../tcosmonitor/extensions/sendfiles.py:178 +#: ../tcosmonitor/extensions/sendfiles.py:272 +msgid "Do you want open file(s) on client?" +msgstr "Voleu obrir el fitxer(s) en el client?" + +#: ../tcosmonitor/extensions/sendfiles.py:215 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:113 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:155 +#: ../tcosmonitor/extensions/videolan.py:457 +#: ../tcosmonitor/extensions/vnc.py:61 ../tcosmonitor/extensions/vnc.py:105 +#: ../tcosmonitor/extensions/vnc.py:298 +#: ../tcosmonitor/extensions/audiortp.py:224 +#: ../tcosmonitor/extensions/audiortp.py:270 +#: ../tcosmonitor/extensions/audiortp.py:368 +#: ../tcosmonitor/extensions/audiortp.py:402 +#: ../tcosmonitor/extensions/audiortp.py:455 +msgid "No users logged." +msgstr "No hi ha usuaris connectats." + +#: ../tcosmonitor/extensions/info.py:91 +#, python-format +msgid "Connecting with %s to retrieve some info..." +msgstr "S'està connectant a %s per a rebre informació..." + +#: ../tcosmonitor/extensions/info.py:117 +msgid "Tcos info" +msgstr "Informació de Tcos" + +#: ../tcosmonitor/extensions/info.py:120 +msgid "PXES info" +msgstr "Informació de PXES" + +#: ../tcosmonitor/extensions/info.py:123 +msgid "LTSP info" +msgstr "Informació d'LTSP" + +#: ../tcosmonitor/extensions/info.py:126 +msgid "Standalone info" +msgstr "Informació de l'equip autònom" + +#: ../tcosmonitor/extensions/info.py:129 +msgid "Unknow client info" +msgstr "Informació de client desconegut" + +#: ../tcosmonitor/extensions/info.py:135 ../tcosmonitor/LocalData.py:43 +#: ../tcosmonitor/LocalData.py:62 ../tcosmonitor/TcosCommon.py:163 +#: ../tcosmonitor/TcosCommon.py:171 ../tcosmonitor/TcosCommon.py:187 +#: ../tcosmonitor/TcosCommon.py:190 +msgid "unknow" +msgstr "desconegut" + +#: ../tcosmonitor/extensions/info.py:138 +msgid "Hostname: " +msgstr "Equip: " + +#: ../tcosmonitor/extensions/info.py:139 +msgid "Ip address: " +msgstr "Adreça IP: " + +#: ../tcosmonitor/extensions/info.py:140 +msgid "TcosXmlRpc version: " +msgstr "Versió de TcosXmlRpc: " + +#: ../tcosmonitor/extensions/info.py:149 +msgid "Tcos image version: " +msgstr "Versió de la imatge del TCOS: " + +#: ../tcosmonitor/extensions/info.py:150 +msgid "Tcos image date: " +msgstr "Data de la imatge del TCOS: " + +#: ../tcosmonitor/extensions/info.py:151 +msgid "Date of thin client: " +msgstr "Data del client lleuger: " + +#: ../tcosmonitor/extensions/info.py:152 +msgid "Uptime: " +msgstr "Temps encés: " + +#: ../tcosmonitor/extensions/info.py:163 +msgid "Kernel info" +msgstr "Informació del nucli" + +#: ../tcosmonitor/extensions/info.py:172 +msgid "Force download and mount all modules" +msgstr "Força la baixada i munta tots els mòduls" + +# Mozilla 1.3->groupByNone.label +#: ../tcosmonitor/extensions/info.py:183 +msgid "None" +msgstr "Cap" + +#: ../tcosmonitor/extensions/info.py:186 +msgid "Kernel version: " +msgstr "Versió del nucli: " + +#: ../tcosmonitor/extensions/info.py:187 +msgid "Kernel complete version: " +msgstr "Versió completa del nucli: " + +#: ../tcosmonitor/extensions/info.py:188 +msgid "Loaded Modules: " +msgstr "Mòduls carregats: " + +#: ../tcosmonitor/extensions/info.py:189 +msgid "Modules not found: " +msgstr "Mòduls no trobats: " + +#: ../tcosmonitor/extensions/info.py:205 +msgid "Cpu info: " +msgstr "Informació de la CPU: " + +#: ../tcosmonitor/extensions/info.py:212 +msgid "Cpu model: " +msgstr "Model de CPU: " + +#: ../tcosmonitor/extensions/info.py:213 +msgid "Cpu vendor: " +msgstr "Venedor de la CPU: " + +#: ../tcosmonitor/extensions/info.py:214 +msgid "Cpu speed: " +msgstr "Velocitat de la CPU: " + +#: ../tcosmonitor/extensions/info.py:225 +msgid "PCI buses: " +msgstr "Busos PCI: " + +#: ../tcosmonitor/extensions/info.py:254 +msgid "Process running: " +msgstr "Processos en execució:" + +#: ../tcosmonitor/extensions/info.py:267 +msgid "Ram info: " +msgstr "Informació de la ram:" + +#: ../tcosmonitor/extensions/info.py:274 +msgid "Total Ram: " +msgstr "RAM total: " + +#: ../tcosmonitor/extensions/info.py:275 +msgid "Free RAM: " +msgstr "RAM lliure: " + +#: ../tcosmonitor/extensions/info.py:276 +msgid "Active RAM: " +msgstr "RAM activa: " + +#: ../tcosmonitor/extensions/info.py:279 +msgid "Swap info: " +msgstr "Informació de la SWAP:" + +#: ../tcosmonitor/extensions/info.py:285 +msgid "Swap enabled: " +msgstr "Swap activada: " + +#: ../tcosmonitor/extensions/info.py:286 +msgid "Total Swap: " +msgstr "Swap total: " + +#: ../tcosmonitor/extensions/info.py:287 +msgid "Used Swap: " +msgstr "Swap usada: " + +#: ../tcosmonitor/extensions/info.py:297 +msgid "Network info: " +msgstr "Informació de la xarxa:" + +#: ../tcosmonitor/extensions/info.py:307 +msgid "Network hostname: " +msgstr "Nom de màquina de xarxa: " + +#: ../tcosmonitor/extensions/info.py:308 +msgid "Network IP: " +msgstr "Adreça IP: " + +#: ../tcosmonitor/extensions/info.py:309 +msgid "Network MASK: " +msgstr "Màscara de xarxa: " + +#: ../tcosmonitor/extensions/info.py:310 +msgid "Network MAC: " +msgstr "Xarxa de MAC: " + +#: ../tcosmonitor/extensions/info.py:311 +msgid "Data received(rx): " +msgstr "Dades rebudes(rx): " + +#: ../tcosmonitor/extensions/info.py:312 +msgid "Data send(tx): " +msgstr "Dades enviades(tx): " + +#: ../tcosmonitor/extensions/info.py:322 ../tcosmonitor.glade:2896 +msgid "Xorg info" +msgstr "Informació de l'Xorg" + +#: ../tcosmonitor/extensions/info.py:348 +msgid "enabled" +msgstr "activat" + +#: ../tcosmonitor/extensions/info.py:350 +msgid "disabled" +msgstr "desactivat" + +#: ../tcosmonitor/extensions/info.py:363 +msgid "Disable kill X with Ctrl+Alt+Backspace" +msgstr "Inhabilita matar l'X amb Ctrl+Alt+Backspace" + +#: ../tcosmonitor/extensions/info.py:367 +msgid "Refresh rate" +msgstr "Taxa de refresc" + +#: ../tcosmonitor/extensions/info.py:369 +msgid "Xorg font server" +msgstr "Servidor de tipus de lletra de l'Xorg" + +#: ../tcosmonitor/extensions/info.py:371 +msgid "Mouse device" +msgstr "Dispositiu del ratolí" + +#: ../tcosmonitor/extensions/info.py:373 +msgid "Mouse protocol" +msgstr "Protocol del ratolí" + +#: ../tcosmonitor/extensions/info.py:390 +msgid "PulseAudio Sound server is running" +msgstr "El servidor PulseAudio està en funcionament" + +#: ../tcosmonitor/extensions/info.py:408 +msgid "Remote Sound Mixer" +msgstr "Mesclador de so remot" + +#: ../tcosmonitor/extensions/info.py:480 +msgid "PulseAudio Control" +msgstr "Control de PulseAudio" + +#: ../tcosmonitor/extensions/info.py:485 +msgid "PulseAudio Meter" +msgstr "Comptador de PulseAudio " + +#: ../tcosmonitor/extensions/info.py:490 +msgid "PulseAudio Manager" +msgstr "Gestor de PulseAudio" + +#: ../tcosmonitor/extensions/info.py:494 +msgid "PulseAudio utils: " +msgstr "Utilitats de PulseAudio: " + +#: ../tcosmonitor/extensions/info.py:500 +msgid "PulseAudio stats" +msgstr "Estadístiques de PulseAudio: " + +#: ../tcosmonitor/extensions/info.py:512 +msgid "Currently in use" +msgstr "Actualment en ús" + +#: ../tcosmonitor/extensions/info.py:513 +msgid "Allocated during whole lifetime" +msgstr "S'ha assignat per sempre" + +#: ../tcosmonitor/extensions/info.py:514 +msgid "Sample cache size" +msgstr "Mida de la memòria cau de mostra" + +#: ../tcosmonitor/extensions/info.py:515 +msgid "User name" +msgstr "Nom d'usuari" + +#: ../tcosmonitor/extensions/info.py:516 +msgid "Host Name" +msgstr "Nom de l'ordinador" + +#: ../tcosmonitor/extensions/info.py:517 +msgid "Server Name" +msgstr "Nom del servidor" + +#: ../tcosmonitor/extensions/info.py:518 +msgid "Server Version" +msgstr "Versió del servidor" + +#: ../tcosmonitor/extensions/info.py:519 +msgid "Default Sample Specification" +msgstr "Especificació de la mostra per defecte" + +#: ../tcosmonitor/extensions/info.py:520 +msgid "Default Sink" +msgstr "Eixida d'àudio per defecte" + +#: ../tcosmonitor/extensions/info.py:521 +msgid "Default Source" +msgstr "Entrada d'àudio per defecte" + +#: ../tcosmonitor/extensions/info.py:522 +msgid "Cookie" +msgstr "Galleta" + +#: ../tcosmonitor/extensions/info.py:528 +msgid "Sound server is not running" +msgstr "El servidor de so no està en funcionament" + +#: ../tcosmonitor/extensions/info.py:589 ../tcosmonitor/extensions/info.py:597 +#: ../tcosmonitor/extensions/info.py:605 +msgid "PulseAudio apps need /dev/shm." +msgstr "L'aplicació PulseAudio necessita /dev/shm" + +#: ../tcosmonitor/extensions/logout.py:48 +#: ../tcosmonitor/extensions/logout.py:71 +msgid "User not logged" +msgstr "L'usuari no està connectat." + +#: ../tcosmonitor/extensions/logout.py:51 +#, python-format +msgid "Do you want to logout user: %s?" +msgstr "Voleu desconnectar l'usuari: %s?" + +#: ../tcosmonitor/extensions/logout.py:55 +#: ../tcosmonitor/extensions/logout.py:77 +#, python-format +msgid "Session will close in %s seconds" +msgstr "La sessió es tancarà en %s segons" + +#: ../tcosmonitor/extensions/logout.py:73 +#, python-format +msgid "Do you want to logout the following users: %s?" +msgstr "Voleu desconnectar els següents usuaris: %s?" + +#: ../tcosmonitor/extensions/reboot.py:48 +#, python-format +msgid "Do you want to reboot: %s?" +msgstr "Voleu tornar a arracar: %s?" + +#: ../tcosmonitor/extensions/reboot.py:51 +#: ../tcosmonitor/extensions/reboot.py:61 +#, python-format +msgid "Pc will reboot in %s seconds" +msgstr "L'equip es reiniciarà en %s segons" + +#: ../tcosmonitor/extensions/reboot.py:58 +#, python-format +msgid "Do you want to reboot the following clients: %s?" +msgstr "Voleu tornar a arracar els clients següents: %s?" + +#: ../tcosmonitor/extensions/reboot.py:67 +#, python-format +msgid "Do you want to poweroff: %s?" +msgstr "Voleu apagar l'equip: %s?" + +#: ../tcosmonitor/extensions/reboot.py:70 +#: ../tcosmonitor/extensions/reboot.py:80 +#, python-format +msgid "Pc will shutdown in %s seconds" +msgstr "L'equip s'apagarà en %s segons" + +#: ../tcosmonitor/extensions/reboot.py:77 +#, python-format +msgid "Do you want to poweroff the following clients: %s?" +msgstr "Voleu apagar els clients següents: %s?" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:50 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:109 +msgid "Internet connection has been disabled" +msgstr "La connexió a Internet s'ha inhabilitat" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:54 +msgid "Can't disable internet, user is not logged" +msgstr "No es pot inhabilitar Internet, l'usuari no està connectat" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:59 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:85 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:103 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:147 +#, python-format +msgid "" +"In order to lock and unlock internet you need to be in 'tcos' group.\n" +"\n" +"Exe by root: adduser %s tcos" +msgstr "" +"Per a bloquejar i desbloquejar internet heu de estar en el grup 'tcos'.\n" +"\n" +"Executeu com a root: adduser %s tcos" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:77 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:151 +msgid "Internet connection has been enabled" +msgstr "La connexió a Internet s'ha habilitat" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:81 +msgid "Can't enable internet, user is not logged" +msgstr "No es pot habilitar Internet, l'usuari no està connectat" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:116 +#, python-format +msgid "Do you want disable internet to following users: %s?" +msgstr "Voleu inhabilitar Internet als següents usuaris: %s?" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:158 +#, fuzzy, python-format +msgid "Do you want enable internet to following users:%s?" +msgstr "Voleu habilitar Internet als següents usuaris: %s?" + +#: ../tcosmonitor/extensions/videolan.py:48 +#: ../tcosmonitor/extensions/videolan.py:49 +msgid "Send Audio/Video broadcast" +msgstr "Envia difusió d'àudio/vídeo" + +#: ../tcosmonitor/extensions/videolan.py:65 +#: ../tcosmonitor/extensions/videolan.py:219 +msgid "Can't send video broadcast, user is not logged" +msgstr "No es pot enviar la difusió de vídeo, l'usuari no està connectat" + +#: ../tcosmonitor/extensions/videolan.py:149 +#: ../tcosmonitor/extensions/videolan.py:347 +#: ../tcosmonitor/extensions/videolan.py:578 +#, python-format +msgid "" +"Not allowed white spaces in \"%s\".\n" +"Please rename it." +msgstr "" +"No es permeten espais en \"%s\".\n" +"Reanomeneu-lo." + +#: ../tcosmonitor/extensions/videolan.py:159 +#: ../tcosmonitor/extensions/videolan.py:359 +#: ../tcosmonitor/extensions/videolan.py:594 +msgid "Waiting for start video transmission..." +msgstr "S'està esperant per a arrancar la transmissió de vídeo..." + +#: ../tcosmonitor/extensions/videolan.py:167 +#: ../tcosmonitor/extensions/videolan.py:367 +#: ../tcosmonitor/extensions/videolan.py:602 +#: ../tcosmonitor/extensions/vnc.py:91 ../tcosmonitor/extensions/vnc.py:283 +msgid "Error while exec app" +msgstr "S'ha produït un error quan s'executava l'aplicació" + +#: ../tcosmonitor/extensions/videolan.py:199 +#: ../tcosmonitor/extensions/videolan.py:393 +#: ../tcosmonitor/extensions/videolan.py:634 +msgid "Running in broadcast video transmission." +msgstr "S'està executant en mode de difusió de vídeo." + +#: ../tcosmonitor/extensions/videolan.py:208 +#: ../tcosmonitor/extensions/videolan.py:402 +#, python-format +msgid "" +"Running in broadcast video transmission to user %(host)s. Broadcast Nº %" +"(count)s" +msgstr "" +"S'està executant en mode de difusió de vídeo a l'usuari %(host)s. Difusió " +"núm. %(count)s" + +#: ../tcosmonitor/extensions/videolan.py:311 +#: ../tcosmonitor/extensions/videolan.py:541 +msgid "Select audio/video file.." +msgstr "Selecciona el fitxer d'àudio/vídeo..." + +#: ../tcosmonitor/extensions/videolan.py:314 +#: ../tcosmonitor/extensions/videolan.py:544 +msgid "Play DVD" +msgstr "Reproduïx el DVD" + +#: ../tcosmonitor/extensions/videolan.py:315 +#: ../tcosmonitor/extensions/videolan.py:545 +msgid "Play SVCD/VCD" +msgstr "Reproduïx el SVCD/VCD" + +#: ../tcosmonitor/extensions/videolan.py:316 +#: ../tcosmonitor/extensions/videolan.py:546 +msgid "Play AudioCD" +msgstr "Reproduïx l'àudioCD" + +#: ../tcosmonitor/extensions/videolan.py:361 +#: ../tcosmonitor/extensions/videolan.py:596 +msgid "" +"First select the DVD chapter or play movie\n" +"then press enter to send clients..." +msgstr "" +"Primer seleccioneu el capítol del DVD o reproduïu la pel·lícula\n" +"després, premeu retorn per a enviar-ho als clients..." + +#: ../tcosmonitor/extensions/videolan.py:370 +msgid "Lock keyboard and mouse on client?" +msgstr "Voleu bloquejar el teclat i el ratolí del client?" + +#: ../tcosmonitor/extensions/videolan.py:444 +msgid "Video broadcast stopped." +msgstr "La difusió de vídeo està parada." + +#: ../tcosmonitor/extensions/videolan.py:605 +msgid "Lock keyboard and mouse on clients?" +msgstr "Voleu bloquejar el teclat i el ratolí en els clients?" + +#: ../tcosmonitor/extensions/videolan.py:643 +#, python-format +msgid "Running in broadcast video transmission. Broadcast Nº %s" +msgstr "S'està executant en mode de difusió de vídeo. Difusió núm. %s" + +#: ../tcosmonitor/extensions/restartxorg.py:51 +#, python-format +msgid "Restart X session of %s with new config?" +msgstr "Voleu reiniciar la sessió X de %s amb la nova configuració?" + +#: ../tcosmonitor/extensions/restartxorg.py:64 +#, python-format +msgid "%s is not supported to restart Xorg!" +msgstr "%s no permet reiniciar l'Xorg!" + +#: ../tcosmonitor/extensions/restartxorg.py:78 +msgid "No thin clients found." +msgstr "No s'han trobat clients lleugers." + +#: ../tcosmonitor/extensions/restartxorg.py:81 +#, python-format +msgid "Do you want to restart X screens (only thin clients):%s?" +msgstr "" +"Voleu reiniciar les sessions X dels següents equips (només clients lleugers):" +"%s?" + +#: ../tcosmonitor/extensions/italc.py:51 ../tcosmonitor/extensions/vnc.py:128 +msgid "No user logged." +msgstr "L'usuari no està connectat." + +#: ../tcosmonitor/extensions/italc.py:75 +msgid "Can't start IVS, please add iTALC support" +msgstr "No es pot arrancar el procés IVS. Afegiu el suport per a iTALC" + +#: ../tcosmonitor/extensions/tcospersonalize.py:54 +#, python-format +msgid "%s is not supported to personalize!" +msgstr "%s no permet personalitzar!" + +#: ../tcosmonitor/extensions/vnc.py:64 +#, python-format +msgid "Do you want to start demo mode the following users: %s?" +msgstr "Voleu iniciar en mode demostració els següents usuaris: %s?" + +#: ../tcosmonitor/extensions/vnc.py:76 +msgid "Waiting for start demo mode..." +msgstr "S'està esperant l'arrancada del mode demostració..." + +#: ../tcosmonitor/extensions/vnc.py:109 ../tcosmonitor/extensions/vnc.py:302 +#, python-format +msgid "Running in demo mode with %s clients." +msgstr "S'està executant en mode demostració amb %s equips." + +#: ../tcosmonitor/extensions/vnc.py:120 +#, python-format +msgid "Running in demo mode from server. Demo Nº %s" +msgstr "" +"S'està executant en mode demostració des del servidor. Demostració núm. %s" + +#: ../tcosmonitor/extensions/vnc.py:142 ../tcosmonitor/extensions/vnc.py:245 +#, python-format +msgid "Connecting with %s to start VNC support" +msgstr "S'està connectant a %s per a arrancar el suport per a VNC" + +#: ../tcosmonitor/extensions/vnc.py:171 +#, python-format +msgid "" +"Can't start VNC, error:\n" +"%s" +msgstr "" +"S'ha produït un error, no es pot arrancar el VNC:\n" +"%s" + +#: ../tcosmonitor/extensions/vnc.py:175 +msgid "Waiting for start of VNC server..." +msgstr "S'està esperant que comence el servidor VNC..." + +#: ../tcosmonitor/extensions/vnc.py:202 +msgid "Can't start VNC, please add X11VNC support" +msgstr "No es pot arrancar el VNC, per favor afegiu el suport per a X11VNC." + +#: ../tcosmonitor/extensions/vnc.py:218 +msgid "Can't start demo mode, user is not logged" +msgstr "No es pot arrancar el mode demostració, l'usuari no està connectat" + +#: ../tcosmonitor/extensions/vnc.py:221 +#, python-format +msgid "Do you want demo mode from user %s?" +msgstr "Voleu iniciar el mode demostració des de l'usuari %s?" + +#: ../tcosmonitor/extensions/vnc.py:268 +#, python-format +msgid "Waiting for start demo mode from user %s..." +msgstr "S'està esperant l'arrancada del mode demostració des de l'usuari %s..." + +#: ../tcosmonitor/extensions/vnc.py:317 +#, python-format +msgid "Running in demo mode from user %(host)s. Demo Nº %(count)s" +msgstr "" +"S'està executant en mode demostració des de l'usuari %(host)s. Demostració " +"núm. %(count)s" + +#: ../tcosmonitor/extensions/vnc.py:354 +msgid "Demo mode off." +msgstr "El mode demostració està desactivat." + +#: ../tcosmonitor/extensions/wakeonlan.py:50 +#: ../tcosmonitor/extensions/wakeonlan.py:75 +msgid "" +"Wake On Lan only works with static list.\n" +"\n" +"Enable scan method \"static\" in Preferences\n" +"and (wake on lan) support in bios of clients." +msgstr "" +"L'arrancada per xarxa només funciona amb llista estática.\n" +"\n" +"Activa el mètode d'escaneig \"static\" en Preferències\n" +"i el suport (wake on lan) en la bios dels clients." + +#: ../tcosmonitor/extensions/wakeonlan.py:54 +#, python-format +msgid "Do you want boot %s client?" +msgstr "Voleu arrancar el client %s ?" + +#: ../tcosmonitor/extensions/wakeonlan.py:67 +#: ../tcosmonitor/extensions/wakeonlan.py:91 +#, python-format +msgid "No register MAC address for ip: \"%s\"" +msgstr "No hi ha cao adreça MAC per a l'IP: \"%s\"" + +#: ../tcosmonitor/extensions/wakeonlan.py:71 +#: ../tcosmonitor/extensions/wakeonlan.py:98 +#, python-format +msgid "Not valid MAC address: \"%s\"" +msgstr "L'adreça MAC no és vàlida: \"%s\"" + +#: ../tcosmonitor/extensions/wakeonlan.py:79 +msgid "Do you want boot all clients?" +msgstr "Voleu arrancar tots els clients?" + +#: ../tcosmonitor/extensions/viewproc.py:48 +msgid "Can't show runnings apps, user is not logged" +msgstr "" +"No es poden veure les aplicacions en execució, l'usuari no està connectat." + +#: ../tcosmonitor/extensions/viewproc.py:58 +msgid "User not connected, no processes." +msgstr "L'usuari no està connectat, no existixen processos." + +#: ../tcosmonitor/extensions/viewproc.py:76 +#, python-format +msgid "Running processes for user \"%s\": " +msgstr "S'estan executant els processos per a l'usuari \"%s\":" + +#: ../tcosmonitor/extensions/viewproc.py:80 +msgid "" +"ALERT: There are some system process hidden. Enable it in Preferences dialog." +msgstr "" +"AVÍS: Hi ha diversos processos del sistema ocults. Podeu activar-los en la " +"finestra de Preferències." + +# Projecte_Gnome_2.2 [libgtop.libgtop-GNOME-2-0-port.ca.po] +#: ../tcosmonitor/extensions/viewproc.py:85 +msgid "Pid" +msgstr "Identificador de procés" + +#: ../tcosmonitor/extensions/viewproc.py:86 +msgid "Process command" +msgstr "Orde del procés" + +#: ../tcosmonitor/extensions/viewproc.py:91 +msgid "Kill this process" +msgstr "Mata este procés" + +#: ../tcosmonitor/extensions/viewproc.py:127 +msgid "Are you sure you want to stop this process?" +msgstr "Esteu segur que voleu parar este procés?" + +#: ../tcosmonitor/extensions/viewproc.py:136 +#, python-format +msgid "" +"Error while killing app:\n" +"Reason: %s" +msgstr "" +"S'ha produït un error quan es tancava l'aplicació:\n" +"Raó: %s" + +#: ../tcosmonitor/extensions/audiortp.py:49 ../tcosmonitor.glade:255 +msgid "Send audio conference" +msgstr "Envia audioconferència" + +#: ../tcosmonitor/extensions/audiortp.py:50 ../tcosmonitor.glade:3697 +msgid "Audio chat conference" +msgstr "Xat d'audioconferència" + +#: ../tcosmonitor/extensions/audiortp.py:51 ../tcosmonitor.glade:441 +msgid "Audio chat list" +msgstr "Llista de xats d'àudio" + +#: ../tcosmonitor/extensions/audiortp.py:52 +msgid "Send audio conference (from this host)" +msgstr "Envia audioconferència (des d'este equip)" + +#: ../tcosmonitor/extensions/audiortp.py:68 +msgid "Emission" +msgstr "Emissió" + +#: ../tcosmonitor/extensions/audiortp.py:74 +msgid "State" +msgstr "Estat" + +# Winrar 2.9->Dialog Box Control:rarlng.dll +#: ../tcosmonitor/extensions/audiortp.py:78 +msgid "Channel" +msgstr "Canal" + +#: ../tcosmonitor/extensions/audiortp.py:230 +#: ../tcosmonitor/extensions/audiortp.py:317 +#: ../tcosmonitor/extensions/audiortp.py:408 +msgid "" +"Your pulseaudio server is too old.\n" +"Is required pulseaudio version >= 0.9.10" +msgstr "" +"El vostre servidor de pulseaudio és molt antic.\n" +"Es requerix una versió de pulseaudio >= 0.9.10" + +#: ../tcosmonitor/extensions/audiortp.py:233 +#, python-format +msgid "Do you want to start audio conference to the following users: %s?" +msgstr "Voleu iniciar el mode d'audioconferència als usuaris següents: %s?" + +#: ../tcosmonitor/extensions/audiortp.py:238 +msgid "You have entered in audio conference" +msgstr "Heu entrat en audioconferència" + +#: ../tcosmonitor/extensions/audiortp.py:262 +msgid "Waiting for start audio conference..." +msgstr "S'està esperant l'arrancada de l'audioconferència..." + +#: ../tcosmonitor/extensions/audiortp.py:290 +#: ../tcosmonitor/extensions/audiortp.py:385 +#, python-format +msgid "Running in audio conference with %s clients." +msgstr "S'està executant en mode audioconferència amb %s clients." + +#: ../tcosmonitor/extensions/audiortp.py:300 +#, python-format +msgid "Running in audio conference from server. Conference Nº %s" +msgstr "" +"S'està executant en mode audioconferència des del servidor. Conferència núm. " +"%s" + +#: ../tcosmonitor/extensions/audiortp.py:311 +msgid "Can't start conference mode, user is not logged" +msgstr "No es pot arrancar el mode conferència, l'usuari no està connectat" + +#: ../tcosmonitor/extensions/audiortp.py:320 +#, python-format +msgid "Do you want audio conference from user %s?" +msgstr "Voleu iniciar el mode audioconferència des de l'usuari %s?" + +#: ../tcosmonitor/extensions/audiortp.py:326 +#, python-format +msgid "You have entered in audio conference from user %s" +msgstr "Heu entrat en l'audioconferència des de l'usuari %s" + +#: ../tcosmonitor/extensions/audiortp.py:354 +#, python-format +msgid "Waiting for start audio conference from user %s..." +msgstr "" +"S'està esperant l'arrancada de l'audioconferència des de l'usuari %s..." + +#: ../tcosmonitor/extensions/audiortp.py:395 +#, python-format +msgid "Running in audio conference from user %(host)s. Conference Nº %(count)s" +msgstr "" +"S'està executant en mode audioconferència des de l'usuari %(host)s. " +"Conferència núm. %(count)s" + +#: ../tcosmonitor/extensions/audiortp.py:411 +#, python-format +msgid "Do you want to start audio chat conference to the following users: %s?" +msgstr "Voleu iniciar el mode xat d'audioconferència als usuaris següents: %s?" + +#: ../tcosmonitor/extensions/audiortp.py:416 +#, python-format +msgid "You have entered in audio chat conference. Participants: %s" +msgstr "Heu entrat en el xat d'audioconferència. Participants: %s" + +#: ../tcosmonitor/extensions/audiortp.py:438 +msgid "Waiting for start audio chat conference..." +msgstr "S'està esperant l'arrancada del xat d'audioconferència..." + +#: ../tcosmonitor/extensions/audiortp.py:444 +msgid "Do you want to connect to this audio chat conference now?" +msgstr "Voleu connectar-vos a este xat d'audioconferecia ara?" + +#: ../tcosmonitor/extensions/audiortp.py:478 +#, python-format +msgid "Running in audio chat conference with %s clients." +msgstr "S'està executant en mode xat d'audioconferència amb %s clients." + +#: ../tcosmonitor/extensions/audiortp.py:490 +#, python-format +msgid "Running in audio chat conference. Conference Nº %s" +msgstr "S'està executant en mode xat d'audioconferència. Conferència núm. %s" + +#: ../tcosmonitor/extensions/audiortp.py:516 +msgid "Conference mode off." +msgstr "El mode conferència està desactivat." + +#: ../tcosmonitor/extensions/audiortp.py:535 +msgid "Audio chat conference off." +msgstr "Xat d'audioconferència desactivat." + +#: ../tcosmonitor/TcosXmlRpc.py:83 +msgid "" +"Username or password are empty,\n" +"please edit in preferences dialog!" +msgstr "" +"L'usuari o la contrasenya estan buits,\n" +"per favor, editeu el diàleg de preferències" + +#: ../tcosmonitor/TcosIconView.py:54 +msgid "Place mouse on any computer to see brief info about it." +msgstr "" +"Moveu el ratolí per damunt de cada equip per a obtindre una descripció més " +"detallada." + +#: ../tcosmonitor/TcosListView.py:81 +msgid "Active" +msgstr "Actiu" + +#: ../tcosmonitor/TcosListView.py:91 +msgid "Screen Blocked" +msgstr "Pantalla bloquejada" + +#: ../tcosmonitor/TcosListView.py:96 +msgid "Num of process" +msgstr "Nombre de processos" + +#: ../tcosmonitor/TcosListView.py:111 +msgid "Sel" +msgstr "Selecciona" + +#: ../tcosmonitor/TcosListView.py:147 +#, python-format +msgid "Error connecting to tcosxmlrpc in %s" +msgstr "S'ha produït un error en connectar a tcosxmlrpc en %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:148 +#, fuzzy, python-format +msgid "Floppy: %s" +msgstr "Disquet" + +# FIXME: handleme +#: ../tcosmonitor/TcosTrayIcon2.py:150 +#, fuzzy, python-format +msgid "CDROM: %s" +msgstr "ERROR: %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:152 +#, fuzzy, python-format +msgid "USB: %s" +msgstr "Dispositiu USB %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:154 +#, fuzzy, python-format +msgid "HDD partition: %s" +msgstr "Partición del disc %s" + +#: ../tcosmonitor/TcosTrayIcon2.py:156 +#, fuzzy, python-format +msgid "Unknow: %s" +msgstr "desconegut" + +#: ../tcosmonitor/Initialize.py:111 +#, fuzzy +msgid "Quit from TcosMonitor" +msgstr "Ix del TcosMonitor" + +#: ../tcosmonitor/Initialize.py:191 +msgid "Salir de Lliurex Lab" +msgstr "Ix de Lliurex Lab" + +#: ../tcosmonitor/Initialize.py:237 +msgid "GPL-2 license file not found" +msgstr "El fitxer de llicència GPL-2 no s'ha trobat" + +#: ../tcosmonitor/Initialize.py:265 +msgid "<span size=\"xx-large\">Lliurex Lab</span>" +msgstr "<span size=\"x-large\">Lliurex Lab</span>" + +#: ../tcosmonitor/Initialize.py:266 +msgid "About Lliurex Lab" +msgstr "Quant al Lliurex Lab" + +#: ../tcosmonitor/LocalData.py:212 +#, python-format +msgid "Selected network inteface (%s) don't have IP address" +msgstr "La interfície de xarxa seleccionada (%s) no té adreça IP" + +#: ../tcosmonitor/LocalData.py:249 ../tcosmonitor/ping.py:98 +#: ../tcosmonitor/ping.py:161 +msgid "Testing if found clients have 8998 or 8999 port open..." +msgstr "" +"S'està comprovant si els clients trobats tenen el port 8998 o 8999 obert..." + +#: ../tcosmonitor/LocalData.py:270 +msgid "" +"Static list method configured but no hosts in list.\n" +"\n" +"Please, open preferences, click on 'Open Static Host list' and add some " +"hosts." +msgstr "" +"Està configurat el mètode de llista estàtica d'equips però no hi ha equips " +"en la llista.\n" +"\n" +"Per favor, obriu les preferències, feu clic en 'Obri la llista estàtica " +"d'equips' i afegiu-ne alguns." + +#: ../tcosmonitor/TcosPreferences.py:273 +msgid "" +"You have select more than 5 button menus.\n" +"Only allowed to select a maximum of 5 buttons." +msgstr "" +"Heu seleccionat més de 5 botons de menús.\n" +"Només està permés seleccionar un màxim de 5 botons." + +#: ../tcosmonitor/TcosPreferences.py:284 +msgid "New settings saved." +msgstr "Configuració nova guardada." + +# Netscape_4.7->Dialog Box Control:TEXTIMP.DLL +#: ../tcosmonitor/TcosPreferences.py:582 ../tcosmonitor/TcosExtensions.py:365 +msgid "Stop" +msgstr "Para" + +#: ../tcosmonitor/TcosMenus.py:98 ../tcosmonitor/TcosMenus.py:110 +#, python-format +msgid "Actions for %s" +msgstr "Accions per a %s" + +#: ../tcosmonitor/TcosMenus.py:103 +msgid "Actions for selected host" +msgstr "Accions per a l'equip seleccionat" + +#: ../tcosmonitor/TcosMenus.py:164 ../tcosmonitor/TcosMenus.py:295 +#, python-format +msgid "%d hidden actions" +msgstr "%d accions ocultes" + +#: ../tcosmonitor/TcosMenus.py:239 ../tcosmonitor/TcosMenus.py:241 +msgid "Actions for selected hosts" +msgstr "Accions per als equips seleccionats" + +#: ../tcosmonitor/TcosMenus.py:243 +msgid "Actions for all hosts" +msgstr "Accions per a tots els equips" + +#: ../tcosmonitor/TcosMenus.py:300 +msgid "Save hosts positions" +msgstr "Guarda les posicions dels equips" + +#: ../tcosmonitor/TcosMenus.py:308 +msgid "Reset hosts positions" +msgstr "Reinicialitza les posicions dels equips" + +#: ../tcosmonitor/ping.py:80 +#, python-format +msgid "Ping to %s..." +msgstr "Ping a %s..." + +#: ../tcosmonitor/ping.py:89 +msgid "Waiting for pings..." +msgstr "S'estan esperant els pings..." + +#: ../tcosmonitor/ping.py:117 ../tcosmonitor/ping.py:182 +#: ../tcosmonitor/TcosActions.py:186 ../tcosmonitor/TcosActions.py:272 +msgid "Not connected hosts found." +msgstr "No s'han trobat equips connectats." + +#: ../tcosmonitor/ping.py:124 ../tcosmonitor/ping.py:187 +#: ../tcosmonitor/TcosActions.py:189 ../tcosmonitor/TcosActions.py:267 +#, python-format +msgid "Found %d hosts" +msgstr "S'han trobat %d equips" + +#: ../tcosmonitor/TcosActions.py:163 ../tcosmonitor/TcosActions.py:249 +msgid "Searching for connected hosts..." +msgstr "S'estan buscant equips connectats..." + +#: ../tcosmonitor/TcosActions.py:1027 +msgid "Searching info of hosts..." +msgstr "S'està buscant informació d'equips..." + +#: ../tcosmonitor/TcosActions.py:1066 +#, python-format +msgid "Connecting to %s..." +msgstr "S'està connectant a %s..." + +#: ../tcosmonitor/TcosExtensions.py:42 +msgid "Exception:" +msgstr "Excepció:" + +#: ../tcosmonitor/TcosExtensions.py:75 +msgid "Error: no IP!" +msgstr "Error: No s'ha indicat cap adreça IP." + +#: ../tcosmonitor/TcosExtensions.py:152 +msgid "No clients connected, press refresh button." +msgstr "No hi ha clients connectats, premeu el botó d'actualitzar." + +#: ../tcosmonitor/TcosExtensions.py:243 ../tcosmonitor/TcosExtensions.py:251 +#, fuzzy +msgid "Clonning clients...." +msgstr "S'està connectant a %s..." + +#: ../tcosmonitor/TcosExtensions.py:278 ../tcosmonitor/TcosExtensions.py:280 +#, python-format +msgid "Can't exec this action at '%s' because you are connected at this host!" +msgstr "" +"No es pot executar esta acció a '%s' perquè esteu connectat a este equip." + +#: ../tcosmonitor/TcosExtensions.py:294 +#, python-format +msgid "Doing action \"%(action)s\" in %(ip)s..." +msgstr "S'està realitzant l'acció \"%(action)s\" en l'equip %(ip)s..." + +#: ../tcosmonitor/TcosExtensions.py:312 +#, python-format +msgid "Done action \"%(action)s\" in %(ip)s" +msgstr "L'acció \"%(action)s\" s'ha acabat en %(ip)s" + +#: ../tcosmonitor/TcosCommon.py:85 +#, python-format +msgid "" +"ThreadController: Found error executing %(cmd)s\n" +"\n" +"If problem persist, disable Thread Controller\n" +"in Preferences and report bug.\n" +"Error=%(error)s" +msgstr "" +"Controlador de fils: S'ha trobat un error en executar %(cmd)s\n" +"\n" +"Si el problema persistix, desactiveu el Controlador de fils\n" +"en Preferències i informeu de l'error.\n" +"Error=%(error)s" + +#: ../tcosmonitor.glade:10 +msgid "TcosMonitor" +msgstr "TcosMonitor" + +#: ../tcosmonitor.glade:42 +msgid "Exit TcosMonitor" +msgstr "Ix del TcosMonitor" + +#: ../tcosmonitor.glade:59 +msgid "Open preferences dialog" +msgstr "Obri el diàleg de preferències" + +#: ../tcosmonitor.glade:76 +msgid "Update host list" +msgstr "Actualitza la llista d'equips" + +# Netscape_4.7->Menu:RESDLL.DLL +# 3 +#: ../tcosmonitor.glade:77 +msgid "Refresh" +msgstr "Refresca" + +#: ../tcosmonitor.glade:107 +msgid "All Hosts" +msgstr "Tots els equips" + +# Winrar 2.9->Dialog Caption:rarlng.dll +#: ../tcosmonitor.glade:151 +msgid "Find" +msgstr "Busca" + +#: ../tcosmonitor.glade:167 +msgid "About this app" +msgstr "Quant a esta aplicació" + +#: ../tcosmonitor.glade:348 +msgid "Start audio chat" +msgstr "Inicia el xat d'àudio" + +#: ../tcosmonitor.glade:534 +msgid "Send audio/video" +msgstr "Envia el fitxer d'àudio/vídeo" + +#: ../tcosmonitor.glade:720 +msgid "Exe app" +msgstr "Executa l'aplicació" + +#: ../tcosmonitor.glade:813 +msgid "Send message" +msgstr "Envia el missatge" + +#: ../tcosmonitor.glade:907 +msgid "Open share" +msgstr "Obri share" + +#: ../tcosmonitor.glade:1022 +msgid "List view" +msgstr "Vista de llista" + +#: ../tcosmonitor.glade:1100 +msgid "Icon view" +msgstr "Vista d'icones" + +#: ../tcosmonitor.glade:1197 +msgid "Simulate my classroom" +msgstr "Simula la meua aula" + +# Winrar 2.9->Dialog Box Control:rarlng.dll +#: ../tcosmonitor.glade:1321 ../tcosmonitor.glade:4528 +#: ../tcosmonitor.glade:4911 +msgid "Cancel" +msgstr "Cancel·la" + +#: ../tcosmonitor.glade:1449 +msgid "Show host list on startup" +msgstr "Mostra la llista d'equips a l'arrancada" + +#: ../tcosmonitor.glade:1470 +msgid "Scan network method" +msgstr "Mètode d'escaneig de xarxa" + +#: ../tcosmonitor.glade:1498 +msgid "" +"Network interface\n" +"(thin client)" +msgstr "" +"Interfície de xarxa\n" +"(clients lleugers)" + +#: ../tcosmonitor.glade:1586 +msgid "Show system process" +msgstr "Mostra els processos del sistema" + +#: ../tcosmonitor.glade:1608 +#, fuzzy +msgid "Don't do actions when running TcosMonitor in thin client" +msgstr "" +"No executes accions quan el Lliurex Lab s'execute des d'un client lleuger" + +#: ../tcosmonitor.glade:1629 +msgid "List of hosts" +msgstr "Llista d'equips" + +#: ../tcosmonitor.glade:1699 +msgid "Open static host list" +msgstr "Obri la llista d'equips estàtics" + +#: ../tcosmonitor.glade:1739 +msgid "Only show hosts running tcosxmlrpc (8998 port)" +msgstr "Mostra només els equips que executen amb tcosmxlrpc (port 8998)" + +#: ../tcosmonitor.glade:1761 +#, fuzzy +msgid "Only do all actions on selected hosts (requires restart TcosMonitor)" +msgstr "" +"Fes només les accions per a equips seleccionats (cal reiniciar el Lliurex " +"Lab)" + +#: ../tcosmonitor.glade:1783 +msgid "Enable SSL connections to XMLRPC clients" +msgstr "Habilita les connexions SSL als clients XMLRPC" + +#: ../tcosmonitor.glade:1804 +msgid "Host list mode" +msgstr "Mode llista d'equips" + +#: ../tcosmonitor.glade:1862 +msgid "Show right menu with groups (NEW)" +msgstr "Mostra el menú de la dreta amb grups (NOU)" + +#: ../tcosmonitor.glade:1883 +msgid "Program mode" +msgstr "Mode de programa" + +# Winrar 2.9->String:rarlng.dll +#: ../tcosmonitor.glade:1969 +msgid "Settings" +msgstr "Paràmetres" + +#: ../tcosmonitor.glade:2009 +msgid "Update host list every (seg)" +msgstr "Actualitza la llista d'equips cada (seg)" + +#: ../tcosmonitor.glade:2038 +msgid "" +"Update host list every selected seconds.\n" +"\n" +"Value=0 disable update." +msgstr "" +"Actualitza la llista d'equips cada nombre\n" +"de segons seleccionat.\n" +"Valor=0 inhabilita l'actualització." + +#: ../tcosmonitor.glade:2062 +msgid "Cache timeout (seg)" +msgstr "Temps de vida de la memòria cau (seg)" + +#: ../tcosmonitor.glade:2090 +msgid "" +"Cache some data and connection status during selected seconds.\n" +"\n" +"Value=0 disable cache." +msgstr "" +"Guarda en la memòria cau dades i l'estat de connexió durant el nombre de " +"segons seleccionat.\n" +"\n" +"Valor=0 inhabilita la memòria cau." + +#: ../tcosmonitor.glade:2114 +msgid "Screenshot size:" +msgstr "Grandària de captura de pantalla:" + +#: ../tcosmonitor.glade:2142 ../tcosmonitor.glade:2192 +msgid "% Size of screnshot." +msgstr "%s de grandària de captura de pantalla." + +#: ../tcosmonitor.glade:2164 +msgid "Mini screenshot size:" +msgstr "Grandària de les minicaptures de pantalla:" + +#: ../tcosmonitor.glade:2214 +msgid "Timeout actions (seg)" +msgstr "Temps d'espera per a accions (seg)" + +#: ../tcosmonitor.glade:2242 +msgid "" +"Timeout in seg for actions\n" +"\n" +"Value=0 default" +msgstr "" +"Temps d'espera en segons per a accions\n" +"\n" +"Valor=per defecte 0" + +#: ../tcosmonitor.glade:2266 +msgid "SSH remote username" +msgstr "Usuari remot SSH" + +#: ../tcosmonitor.glade:2315 +msgid "VLC method to send" +msgstr "VLC mètode d'enviament" + +#: ../tcosmonitor.glade:2371 +msgid "" +"<b>Experimental: Thread Controller</b>\n" +"( if you have problems, disable it )" +msgstr "" +"<b>Experimental: Control de fils</b>\n" +"( Si teniu problemes, desactiveu-lo )" + +#: ../tcosmonitor.glade:2401 +msgid "Actions controlled" +msgstr "Accions controlades" + +#: ../tcosmonitor.glade:2422 +msgid "Block ports: (80,8080... etc)" +msgstr "Bloqueja els ports: (80,8080... etc)" + +#: ../tcosmonitor.glade:2540 +msgid "TcosXmlRpc username" +msgstr "Usuari del TcosXmlRpc" + +#: ../tcosmonitor.glade:2589 +msgid "TcosXmlRpc password" +msgstr "Contrasenya del TcosXmlRpc" + +#: ../tcosmonitor.glade:2638 +msgid "" +"<b>NOTE:</b>\n" +"Default user is <b>root</b> and default password is <b>root</b>.\n" +"\n" +"For <u>thin clients</u> change TCOS_ROOT_PASSWD or use TcosConfig and " +"regenerate boot images again.\n" +"\n" +"For <u>standalone</u> users you can use a system account (root) but this is " +"not recomended. Install tcos-standalone and start it by root. Set user and " +"password, this will create a <b>/etc/tcospasswd</b> file only used by TCOS " +"and your root acount will be secure." +msgstr "" +"<b>NOTA:</b>\n" +"L'usuari per defecte és <b>root</b> i la contrasenya és <b>root</b>.\n" +"\n" +"Per a <u>clients lleugers</u> canvieu el TCOS_ROOT_PASSWD o utilitzeu el " +"TcosConfig i regenereu les imatges d'arrancada de nou.\n" +"\n" +"Per a equips <u>autònoms(standalone)</u> podeu utilitzar el compte del " +"sistema (root) però això no és recomandable. Instal·leu el paquet tcos-" +"standalone i executeu-ho com a administrador. Establiu un usuari i una " +"contrasenya.La contrasenya es guardarà en <b>/etc/tcospasswd</b>, fitxer que " +"només el necessita el TCOS perquè el vostre compte de superusuari (root) " +"estiga segur." + +#: ../tcosmonitor.glade:2700 +msgid "Authentication " +msgstr "Autenticació" + +#: ../tcosmonitor.glade:2737 +msgid "<b>Info avalaible from tcosxmlrpc</b>" +msgstr "<b>Informació disponible de tcosxmlrpc</b>" + +#: ../tcosmonitor.glade:2763 +msgid "Tcos general info" +msgstr "Informació general de Tcos" + +#: ../tcosmonitor.glade:2782 +msgid "Cpu info" +msgstr "Informació de la CPU" + +#: ../tcosmonitor.glade:2801 +msgid "Kernel and modules info" +msgstr "Informació del nucli i els mòduls" + +#: ../tcosmonitor.glade:2820 +msgid "PCI bus info" +msgstr "Informació del bus PCI" + +#: ../tcosmonitor.glade:2839 +msgid "Ram and swap info" +msgstr "Informació de la RAM i la SWAP" + +#: ../tcosmonitor.glade:2858 +msgid "Process info" +msgstr "Informació de processos" + +#: ../tcosmonitor.glade:2877 +msgid "Network info" +msgstr "Informació de la xarxa" + +#: ../tcosmonitor.glade:2915 +msgid "Sound server info" +msgstr "Informació del servidor de so" + +#: ../tcosmonitor.glade:2966 +msgid "Avalaible info" +msgstr "Informació disponible" + +#: ../tcosmonitor.glade:3003 +msgid "<b>Show / hide menu items</b>" +msgstr "<b>Mostra / oculta elements de menú</b>" + +#: ../tcosmonitor.glade:3038 +msgid "Lock and unlock screen" +msgstr "Bloqueja i desbloqueja pantalles" + +#: ../tcosmonitor.glade:3060 +msgid "Remote SSH shell" +msgstr "Intèrpret d'ordes SSH remot" + +#: ../tcosmonitor.glade:3082 +msgid "Configure Xorg settings" +msgstr "Configura els paràmetres de l'Xorg" + +#: ../tcosmonitor.glade:3117 ../tcosmonitor.glade:3587 +msgid "Exe app on user display" +msgstr "Executa l'aplicació en la pantalla de l'usuari" + +#: ../tcosmonitor.glade:3139 ../tcosmonitor.glade:3609 +msgid "Send a text message" +msgstr "Envia un missatge de text" + +#: ../tcosmonitor.glade:3161 +msgid "Show running apps" +msgstr "Mostra les aplicacions en execució" + +#: ../tcosmonitor.glade:3183 ../tcosmonitor.glade:3631 +msgid "Send video broadcast" +msgstr "Envia la difusió del vídeo" + +#: ../tcosmonitor.glade:3227 +msgid "Demo mode" +msgstr "Mode demostració" + +#: ../tcosmonitor.glade:3262 +msgid "Wake on LAN" +msgstr "Desperta per xarxa" + +#: ../tcosmonitor.glade:3284 +msgid "Audio conference mode" +msgstr "Mode àudio conferència" + +#: ../tcosmonitor.glade:3306 +msgid "Screenshots" +msgstr "Captures de pantalla" + +#: ../tcosmonitor.glade:3328 +msgid "Reboot and poweroff" +msgstr "Apaga i reinicia" + +#: ../tcosmonitor.glade:3350 +msgid "Lock and unlock internet" +msgstr "Bloqueja i desbloqueja Internet" + +#: ../tcosmonitor.glade:3372 +msgid "DPMS monitor on/off" +msgstr "Control DPMS del monitor" + +#: ../tcosmonitor.glade:3394 +msgid "Connect using VNC" +msgstr "Connecta usant el VNC" + +#: ../tcosmonitor.glade:3415 +msgid "Connect using iTALC" +msgstr "Connecta usant l'iTALC" + +#: ../tcosmonitor.glade:3436 +#, fuzzy +msgid "Clone clients" +msgstr "S'està connectant a %s..." + +#: ../tcosmonitor.glade:3458 +msgid "Restart session with new settings" +msgstr "Reinicia la sessió amb la nova configuració" + +#: ../tcosmonitor.glade:3515 +msgid "Menus" +msgstr "Menús" + +#: ../tcosmonitor.glade:3552 +msgid "<b>Show / hide menu buttons</b>" +msgstr "<b>Mostra / oculta els botons del menú</b>" + +#: ../tcosmonitor.glade:3675 +msgid "Audio conference" +msgstr "Audioconferència" + +#: ../tcosmonitor.glade:3719 +msgid "Audio Chat control" +msgstr "Control de xat d'àudio" + +#: ../tcosmonitor.glade:3776 +msgid "Menu buttons" +msgstr "Botons de menú" + +#: ../tcosmonitor.glade:3864 +msgid "Question" +msgstr "Pregunta" + +#: ../tcosmonitor.glade:3939 +msgid "You can drag and drop launcher file to this box" +msgstr "Podeu arrossegar i deixar anar un llançador a esta caixa" + +#: ../tcosmonitor.glade:3964 +msgid "<b>Run app in unknow host</b>" +msgstr "<b>Executa l'aplicació en un equip desconegut</b>" + +#: ../tcosmonitor.glade:4058 +msgid "Static hosts list" +msgstr "Llista d'equips estàtics" + +#: ../tcosmonitor.glade:4081 +msgid "<span size=\"x-large\">Static Hosts list</span>" +msgstr "<span size=\"x-large\">Llista d'equips estàtics</span>" + +# Winrar 2.9->Dialog Box Control:rarlng.dll +#: ../tcosmonitor.glade:4190 +msgid "Add" +msgstr "Afegix" + +# Projecte_Mandrake [tm-mandrake.po] +#: ../tcosmonitor.glade:4268 +msgid "Modify" +msgstr "Modifica" + +#: ../tcosmonitor.glade:4346 +msgid "Delete" +msgstr "Esborra" + +#: ../tcosmonitor.glade:4425 +msgid "Get from connected" +msgstr "Pren des dels connectats" + +#: ../tcosmonitor.glade:4606 ../tcosmonitor.glade:4989 +msgid "Save" +msgstr "Guarda" + +#: ../tcosmonitor.glade:4652 +msgid "New or edit hosts" +msgstr "Nou o edita la llista d'equips" + +#: ../tcosmonitor.glade:4706 +msgid "" +"You can add a simple host, \n" +" example: <b>192.168.0.100</b>\n" +"\n" +"or range of hosts, \n" +" example: <b>192.168.0.100-120</b>\n" +"\n" +"MAC address is optional" +msgstr "" +"Podeu afegir un únic equip,\n" +" exemple: <b>192.168.0.100</b>\n" +"\n" +"o un rang d'equips, \n" +" exemple: <b>192.168.0.100-120</b>\n" +"\n" +"l'adreça MAC és opcional" + +#: ../tcosmonitor.glade:4747 +msgid "IP address *" +msgstr "Adreça IP *" + +#: ../tcosmonitor.glade:5033 +msgid "About TCOS" +msgstr "Quant al TCOS" + +#: ../tcosmonitor.glade:5056 +msgid "<span size=\"xx-large\">TcosMonitor</span>" +msgstr "<span size=\"x-large\">TcosMonitor</span>" + +#: ../tcosmonitor.glade:5129 +msgid "<b>Version:</b>" +msgstr "<b>Versió:</b>" + +#: ../tcosmonitor.glade:5186 +msgid "" +"Thin client and standalone\n" +"monitoring tool." +msgstr "" + +#: ../tcosmonitor.glade:5254 +msgid "Project web site" +msgstr "Pàgina web del projecte" + +#: ../tcosmonitor.glade:5332 +msgid "About" +msgstr "Quant a" + +#: ../tcosmonitor.glade:5390 +msgid "License" +msgstr "Llicència" + +#: ../tcosmonitor.glade:5423 +msgid "" +"Main developers:\n" +" * Mario Izquierdo <mariodebian at gmail.com>\n" +" * Ignacio Vidal <vidal_joshur at gva.es>\n" +"\n" +"Contributors:\n" +" * Andrés Jimenez\n" +" * Quirón\n" +"\n" +"Special thanks to:\n" +" Comunidad de Madrid, MaX group (Spain)" +msgstr "" +"Programadors principals:\n" +" * Mario Izquierdo <mariodebian at gmail.com>\n" +" * Ignacio Vidal <vidal_joshur at gva.es>\n" +"\n" +"Han contribuït:\n" +" * Andrés Jimenez\n" +" * Quirón\n" +"\n" +"Molt especialment gràcies a:\n" +" Comunitat de Madrid, grup MaX (Espanya)" + +#: ../tcosmonitor.glade:5467 +msgid "Authors" +msgstr "Autors" + +#: ../tcosmonitor.glade:5496 +msgid "Translated to your language by:" +msgstr "Traduït al vostre idioma per:" + +#: ../tcosmonitor.glade:5521 +msgid "Mario Izquierdo <mariodebian@gmail.com>" +msgstr "Pilar Embid (Lliurex) <embid_mar@gva.es>" + +#: ../tcosmonitor.glade:5556 +msgid "Translators" +msgstr "Traductors" + +#: ../tcosmonitor.glade:5585 +msgid "" +"TCOS is a free software project that need a lot of work to be the best thin " +"client plataform.\n" +"\n" +"We work every day a lot of hours to make changes and support more devices " +"and features.\n" +"\n" +"We want to continue developing this software but need your help, if you use, " +"sell or hack TCOS pehaps you could donate some money to project.\n" +"\n" +"Click on next url to get some info." +msgstr "" +"El TCOS és un projecte lliure que necessita molt de treball per a intentar " +"ser la millor plataforma de clients lleugers.\n" +"\n" +"Treballem cada dia moltes hores per fer canvis i admetre més dispositius i " +"característiques.\n" +"\n" +"Volem continuar fent-ho però necessitem la vostra ajuda, si utilitzeu, veneu " +"o modifiqueu el TCOS, potser podreu donar alguns diners al projecte.\n" +"\n" +"Feu clic en l'url següent per a obtindre més informació." + +#: ../tcosmonitor.glade:5657 +msgid "<u>http://wiki.tcosproject.org/TcosProject:Site_support</u>" +msgstr "<u>http://wiki.tcosproject.org/TcosProject:Site_support/es</u>" + +#: ../tcosmonitor.glade:5695 +msgid "Don't show donations message on start." +msgstr "No mostres este missatge de donacions a l'inici." + +#: ../tcosmonitor.glade:5719 +msgid "Donate" +msgstr "Donacions" + +#: ../tcosmonitor.glade:5756 +msgid "Chat emission list" +msgstr "Llista d'emissió de xat" + +#: ../tcosmonitor.glade:5779 +msgid "<span size=\"x-large\">Chat emission list</span>" +msgstr "<span size=\"x-large\">Emissió de xat</span>" + +# Translators: Menu item Verb/Connect +#: ../tcosmonitor.glade:5888 +msgid "Connect" +msgstr "Connecta" + +# Translators: Menu item Verb/Branch/Separate/Separate/Disconnect +#: ../tcosmonitor.glade:5966 +msgid "Disconnect" +msgstr "Desconnecta" + +#: ../tcosmonitor.glade:6044 +msgid "Exit" +msgstr "Ix" + +#~ msgid "" +#~ "Lliurex Lab is a customized program\n" +#~ "based on Mario Izquierdo TcosMonitor\n" +#~ "and Tcos monitoring tool." +#~ msgstr "" +#~ "El programa Lliurex Lab és una adaptació\n" +#~ "basada en el programa de seguiment\n" +#~ "TcosMonitor i Tcos de Mario Izquierdo." + +#, fuzzy +#~ msgid "Clone clients (from this host)" +#~ msgstr "Mode de demostració (des d'este equip)" + +#, fuzzy +#~ msgid "No clients to clone." +#~ msgstr "No s'han trobat clients lleugers." + +#, fuzzy +#~ msgid "Do you want to clone the following clients: %s?" +#~ msgstr "Voleu apagar els clients següents: %s?" + +#, fuzzy +#~ msgid "Waiting for start clone mode..." +#~ msgstr "S'està esperant l'arrancada del mode demostració..." + +#, fuzzy +#~ msgid "Select image file to clone.." +#~ msgstr "Seleccioneu el fitxer o fitxers..." + +#, fuzzy +#~ msgid "Running in clone mode with %s clients." +#~ msgstr "S'està executant en mode demostració amb %s equips." + +#, fuzzy +#~ msgid "Running in clone mode from server. Clone Nº %s" +#~ msgstr "" +#~ "S'està executant en mode demostració des del servidor. Demostració núm. %s" + +#, fuzzy +#~ msgid "Do you want to clone from client %s?" +#~ msgstr "Voleu iniciar el mode demostració des de l'usuari %s?" + +#, fuzzy +#~ msgid "Do you want only create a image from host %s?" +#~ msgstr "Voleu iniciar el mode demostració des de l'usuari %s?" + +#, fuzzy +#~ msgid "Waiting for start clone mode from client %s..." +#~ msgstr "" +#~ "S'està esperant l'arrancada del mode demostració des de l'usuari %s..." + +#, fuzzy +#~ msgid "Select file to save clone image..." +#~ msgstr "Seleccioneu el fitxer per a guardar la captura de pantalla..." + +#, fuzzy +#~ msgid "Running in clone mode from client %(host)s. Clone Nº %(count)s" +#~ msgstr "" +#~ "S'està executant en mode demostració des de l'usuari %(host)s. " +#~ "Demostració núm. %(count)s" + +#, fuzzy +#~ msgid "Clone mode off." +#~ msgstr "El mode conferència està desactivat." diff --git a/po/tcosmonitor.pot b/po/tcosmonitor.pot new file mode 100644 index 0000000..7586c14 --- /dev/null +++ b/po/tcosmonitor.pot @@ -0,0 +1,2613 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-03-18 15:48+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../tcosmonitor.py:129 +#, python-format +msgid "" +"The user \"%s\" must be member of the group \"tcos\" to exec tcosmonitor.\n" +"\n" +"If you are system administrator, add your user to tcos group." +msgstr "" + +#: ../tcosmonitor.py:247 +msgid "Send files disabled. rsync not configured." +msgstr "" + +#: ../tcosmonitor.py:329 ../tcospersonalize.py:562 +#: ../tcos-volume-manager.py:378 +msgid "Exiting" +msgstr "" + +#: ../tcos-devices-ng.py:188 +#, python-format +msgid "Rebooting in %s seconds" +msgstr "" + +#: ../tcos-devices-ng.py:190 +#, python-format +msgid "Shutting down in %s seconds" +msgstr "" + +#: ../tcos-devices-ng.py:206 ../tcos-devices-ng.py:209 +#, python-format +msgid "" +"ERROR during action %(action)s:\n" +"%(errortxt)s" +msgstr "" + +#: ../tcos-devices-ng.py:239 +msgid "Tcos device daemon" +msgstr "" + +#: ../tcos-devices-ng.py:283 ../tcos-volume-manager.py:143 +#, python-format +msgid "Error connecting with TcosXmlRpc in %s." +msgstr "" + +#: ../tcos-devices-ng.py:314 +#, python-format +msgid "Cdrom device %s" +msgstr "" + +#: ../tcos-devices-ng.py:317 +msgid "Mount Cdrom" +msgstr "" + +#: ../tcos-devices-ng.py:318 +msgid "Umount Cdrom" +msgstr "" + +#: ../tcos-devices-ng.py:340 +#, python-format +msgid "Disk partition %s" +msgstr "" + +#: ../tcos-devices-ng.py:343 +msgid "Mount disk partition" +msgstr "" + +#: ../tcos-devices-ng.py:344 +msgid "Umount disk partition" +msgstr "" + +#: ../tcos-devices-ng.py:356 +msgid "No floppy detected" +msgstr "" + +#: ../tcos-devices-ng.py:368 ../tcos-devices-ng.py:674 +#: ../tcos-devices-ng.py:680 ../tcos-devices-ng.py:686 +msgid "Floppy" +msgstr "" + +#: ../tcos-devices-ng.py:371 +msgid "Mount Floppy" +msgstr "" + +#: ../tcos-devices-ng.py:372 +msgid "Umount Floppy" +msgstr "" + +#: ../tcos-devices-ng.py:382 +msgid "Floppy mounted. Ready for use." +msgstr "" + +#: ../tcos-devices-ng.py:384 +msgid "Floppy umounted. You can extract it." +msgstr "" + +#: ../tcos-devices-ng.py:400 +msgid "Hard disk partition mounted. Ready for use." +msgstr "" + +#: ../tcos-devices-ng.py:403 +msgid "Hard disk partition umounted." +msgstr "" + +#: ../tcos-devices-ng.py:425 +msgid "Audio cdrom mounted., you can listen music opening wav files." +msgstr "" + +#: ../tcos-devices-ng.py:427 +msgid "Cdrom mounted. Ready for use." +msgstr "" + +#: ../tcos-devices-ng.py:430 +msgid "Cdrom umounted. You can extract it." +msgstr "" + +#: ../tcos-devices-ng.py:529 +#, python-format +msgid "" +"Mounting device %s\n" +"Please wait..." +msgstr "" + +#: ../tcos-devices-ng.py:578 +msgid "Error mounting LTSPFS, check versions of LTSPFS packages" +msgstr "" + +#: ../tcos-devices-ng.py:604 +#, python-format +msgid "" +"Umounting device %s.\n" +"Please wait..." +msgstr "" + +#: ../tcos-devices-ng.py:651 +msgid "usbdisk" +msgstr "" + +#: ../tcos-devices-ng.py:653 +msgid "firewiredisk" +msgstr "" + +#: ../tcos-devices-ng.py:678 +msgid "Can't mount floppy" +msgstr "" + +#: ../tcos-devices-ng.py:689 +msgid "Can't umount floppy" +msgstr "" + +#: ../tcos-devices-ng.py:702 ../tcos-devices-ng.py:712 +#: ../tcos-devices-ng.py:723 ../tcos-devices-ng.py:836 +#: ../tcos-devices-ng.py:848 ../tcos-devices-ng.py:867 +#: ../tcos-devices-ng.py:879 ../tcos-devices-ng.py:911 +#, python-format +msgid "Cdrom_%s" +msgstr "" + +#: ../tcos-devices-ng.py:710 +msgid "Can't mount cdrom" +msgstr "" + +#: ../tcos-devices-ng.py:726 +msgid "Can't umount cdrom" +msgstr "" + +#: ../tcos-devices-ng.py:742 ../tcos-devices-ng.py:752 +#: ../tcos-devices-ng.py:763 +#, python-format +msgid "Disk_%s" +msgstr "" + +#: ../tcos-devices-ng.py:750 +msgid "Can't mount hard disk partition" +msgstr "" + +#: ../tcos-devices-ng.py:766 +msgid "Can't umount hard disk partition" +msgstr "" + +#: ../tcos-devices-ng.py:807 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Connected CDROM USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" + +#: ../tcos-devices-ng.py:811 +#, python-format +msgid "CDROM USB device %s" +msgstr "" + +#: ../tcos-devices-ng.py:814 +#, python-format +msgid "Mount CDROM USB device %s" +msgstr "" + +#: ../tcos-devices-ng.py:815 +#, python-format +msgid "Umount CDROM USB device %s" +msgstr "" + +#: ../tcos-devices-ng.py:840 ../tcos-devices-ng.py:871 +#: ../tcos-devices-ng.py:1001 ../tcos-devices-ng.py:1012 +#: ../tcos-devices-ng.py:1058 ../tcos-devices-ng.py:1138 +#: ../tcos-devices-ng.py:1149 ../tcos-devices-ng.py:1195 +#, python-format +msgid "Error, can't mount device %s" +msgstr "" + +#: ../tcos-devices-ng.py:898 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Disconnected CDROM USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" + +#: ../tcos-devices-ng.py:926 +#, python-format +msgid "Can't umount cdrom usb %s" +msgstr "" + +#: ../tcos-devices-ng.py:951 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Connected USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" + +#: ../tcos-devices-ng.py:954 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Disconnected USB device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" + +#: ../tcos-devices-ng.py:982 +#, python-format +msgid "USB device %s" +msgstr "" + +#: ../tcos-devices-ng.py:985 +#, python-format +msgid "Mount USB device %s" +msgstr "" + +#: ../tcos-devices-ng.py:986 +#, python-format +msgid "Umount USB device %s" +msgstr "" + +#: ../tcos-devices-ng.py:1088 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Connected Firewire device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" + +#: ../tcos-devices-ng.py:1091 +#, python-format +msgid "" +"From terminal %(host)s.\n" +"Disconnected Firewire device %(device)s\n" +"%(vendor)s %(model)s" +msgstr "" + +#: ../tcos-devices-ng.py:1119 +#, python-format +msgid "Firewire device %s" +msgstr "" + +#: ../tcos-devices-ng.py:1122 +#, python-format +msgid "Mount Firewire device %s" +msgstr "" + +#: ../tcos-devices-ng.py:1123 +#, python-format +msgid "Umount Firewire device %s" +msgstr "" + +#: ../tcos-devices-ng.py:1206 +#, python-format +msgid "CDROM USB device %s umounted. You can extract it." +msgstr "" + +#: ../tcos-devices-ng.py:1209 +#, python-format +msgid "CDROM USB device %s mounted. Ready for use." +msgstr "" + +#: ../tcos-devices-ng.py:1247 +#, python-format +msgid "USB device %s umounted. You can extract it." +msgstr "" + +#: ../tcos-devices-ng.py:1250 +#, python-format +msgid "USB device %s mounted. Ready for use." +msgstr "" + +#: ../tcos-devices-ng.py:1286 +#, python-format +msgid "Firewire device %s umounted. You can extract it." +msgstr "" + +#: ../tcos-devices-ng.py:1289 +#, python-format +msgid "Firewire device %s mounted. Ready for use." +msgstr "" + +#: ../tcospersonalize.py:115 +msgid "" +"Need a host to configure!!!\n" +"Try exec:\n" +" tcospersonalize --host=XXX.XXX.XXX.XXX" +msgstr "" + +#: ../tcospersonalize.py:190 +msgid "host: " +msgstr "" + +#: ../tcospersonalize.py:454 +msgid "Host down, can't connect to tcosxmlrpc." +msgstr "" + +#: ../tcospersonalize.py:462 +#, python-format +msgid "New %d drivers loaded from terminal." +msgstr "" + +#: ../tcospersonalize.py:521 +#, python-format +msgid "Really delete config of %s?" +msgstr "" + +#: ../tcospersonalize.py:524 +msgid "Deleted!" +msgstr "" + +#: ../tcos-volume-manager.py:101 ../tcos-volume-manager.py:113 +#, python-format +msgid "" +"Tcos Sound levels on:\n" +"%s" +msgstr "" + +#: ../tcos-volume-manager.py:121 +#, python-format +msgid "ERROR: It appears that TcosXmlRpc is not running on %s." +msgstr "" + +#: ../tcos-volume-manager.py:217 +msgid "Loading channels info..." +msgstr "" + +#: ../tcos-volume-manager.py:230 +msgid "Error loading channels info (xauth error)" +msgstr "" + +#: ../tcos-volume-manager.py:233 ../ui/tcos-volume-manager.ui:8 +msgid "Tcos Volume Manager" +msgstr "" + +#: ../tcos-volume-manager.py:234 +#, python-format +msgid "<span size='large'><b>Sound mixer of %s host</b></span>" +msgstr "" + +#: ../tcos-volume-manager.py:300 ../tcosmonitor/extensions/info.py:442 +msgid "Mute" +msgstr "" + +#: ../tcos-volume-manager.py:319 +msgid "Main controls ready" +msgstr "" + +#: ../tcos-volume-manager.py:323 +msgid "All remote controls loaded." +msgstr "" + +#: ../tcos-volume-manager.py:332 ../tcosmonitor/extensions/info.py:557 +#, python-format +msgid "Changing value of %(channel)s channel, to %(value)s%%..." +msgstr "" + +#: ../tcos-volume-manager.py:339 ../tcosmonitor/extensions/info.py:564 +#, python-format +msgid "Changed value of %(channel)s channel, to %(value)s" +msgstr "" + +#: ../tcos-volume-manager.py:346 ../tcosmonitor/extensions/info.py:571 +#, python-format +msgid "Unmuting %s channel..." +msgstr "" + +#: ../tcos-volume-manager.py:351 ../tcosmonitor/extensions/info.py:576 +#, python-format +msgid "Muting %s channel..." +msgstr "" + +#: ../tcos-volume-manager.py:354 ../tcosmonitor/extensions/info.py:579 +#, python-format +msgid "Status of %(channel)s channel, is \"%(newvalue)s\"" +msgstr "" + +#: ../tcosmonitor/TcosDBus.py:94 +msgid "TcosDBus not allowed in local display" +msgstr "" + +#: ../tcosmonitor/TcosDBus.py:122 +#, python-format +msgid "Seems that tcosxmlrpc isn't running on host=\"%s\"" +msgstr "" + +#: ../tcosmonitor/TcosDBus.py:143 +msgid "tcosxmlrpc ERROR conection unavalaible." +msgstr "" + +#: ../tcosmonitor/TcosDBus.py:159 +msgid "ERROR conecting to tcosxmlrpc, check username and password." +msgstr "" + +#: ../tcosmonitor/TcosDBus.py:251 +msgid "Message from admin" +msgstr "" + +#: ../tcosmonitor/TcosDBus.py:341 ../tcosmonitor/TcosDBus.py:357 +#: ../tcosmonitor/TcosDBus.py:375 ../tcosmonitor/TcosDBus.py:393 +msgid "User not allowed to run this dbus call." +msgstr "" + +#: ../tcosmonitor/TcosStaticHosts.py:163 ../tcosmonitor/TcosListView.py:70 +msgid "IP address" +msgstr "" + +#: ../tcosmonitor/TcosStaticHosts.py:169 +#: ../ui/tcosmonitor-staticwindownew.ui:68 +msgid "MAC address" +msgstr "" + +#: ../tcosmonitor/TcosStaticHosts.py:279 +msgid "No hosts found, please click on Refresh button using another method." +msgstr "" + +#: ../tcosmonitor/shared.py:108 +msgid "Traditional list only" +msgstr "" + +#: ../tcosmonitor/shared.py:109 +msgid "Icons only" +msgstr "" + +#: ../tcosmonitor/shared.py:110 +msgid "Simulate classroom" +msgstr "" + +#: ../tcosmonitor/shared.py:111 +msgid "Lists, icons and classroom with tabs" +msgstr "" + +#: ../tcosmonitor/shared.py:270 ../tcosmonitor/shared.py:312 +#: ../tcosmonitor/TcosMenus.py:35 +msgid "Terminal actions" +msgstr "" + +#: ../tcosmonitor/shared.py:271 ../tcosmonitor/shared.py:313 +#: ../tcosmonitor/TcosMenus.py:36 +msgid "User actions" +msgstr "" + +#: ../tcosmonitor/shared.py:272 ../tcosmonitor/shared.py:314 +#: ../tcosmonitor/TcosMenus.py:37 +msgid "Audio, video and files" +msgstr "" + +#: ../tcosmonitor/shared.py:279 ../tcosmonitor/extensions/info.py:47 +msgid "Refresh terminal info" +msgstr "" + +#: ../tcosmonitor/shared.py:280 ../tcosmonitor/extensions/clean.py:40 +#: ../tcosmonitor/extensions/clean.py:41 +msgid "Clean info about terminal" +msgstr "" + +#: ../tcosmonitor/shared.py:281 ../tcosmonitor/TcosTrayIcon.py:54 +#: ../tcosmonitor/extensions/reboot.py:40 ../tcosmonitor/TcosTrayIcon2.py:58 +msgid "Reboot" +msgstr "" + +#: ../tcosmonitor/shared.py:282 ../tcosmonitor/TcosTrayIcon.py:55 +#: ../tcosmonitor/extensions/reboot.py:42 ../tcosmonitor/TcosTrayIcon2.py:59 +msgid "Poweroff" +msgstr "" + +#: ../tcosmonitor/shared.py:283 ../tcosmonitor/extensions/lockscreen.py:40 +msgid "Lock screen" +msgstr "" + +#: ../tcosmonitor/shared.py:284 ../tcosmonitor/extensions/lockscreen.py:42 +msgid "Unlock screen" +msgstr "" + +#: ../tcosmonitor/shared.py:285 ../tcosmonitor/extensions/italc.py:43 +msgid "Connect to remote screen (iTALC)" +msgstr "" + +#: ../tcosmonitor/shared.py:286 ../tcosmonitor/extensions/vnc.py:54 +msgid "Connect to remote screen (VNC)" +msgstr "" + +#: ../tcosmonitor/shared.py:287 ../tcosmonitor/extensions/screenshot.py:45 +msgid "Screenshot" +msgstr "" + +#: ../tcosmonitor/shared.py:288 ../tcosmonitor/extensions/remotessh.py:40 +msgid "Give a remote xterm" +msgstr "" + +#: ../tcosmonitor/shared.py:289 +#: ../tcosmonitor/extensions/tcospersonalize.py:40 +#: ../ui/tcosmonitor-prefwindow.ui:1324 +msgid "Configure this host" +msgstr "" + +#: ../tcosmonitor/shared.py:290 ../tcosmonitor/extensions/logout.py:40 +msgid "Logout client" +msgstr "" + +#: ../tcosmonitor/shared.py:291 ../tcosmonitor/extensions/restartxorg.py:41 +msgid "Restart X session with new settings" +msgstr "" + +#: ../tcosmonitor/shared.py:292 ../tcosmonitor/extensions/appsmsg.py:52 +msgid "Exec app on user display" +msgstr "" + +#: ../tcosmonitor/shared.py:293 ../tcosmonitor/extensions/appsmsg.py:53 +msgid "Send a text message to user" +msgstr "" + +#: ../tcosmonitor/shared.py:294 ../tcosmonitor/extensions/viewproc.py:41 +msgid "Show running apps of this client" +msgstr "" + +#: ../tcosmonitor/shared.py:295 ../tcosmonitor/shared.py:332 +msgid "Audio/Video broadcast" +msgstr "" + +#: ../tcosmonitor/shared.py:296 ../tcosmonitor/shared.py:333 +#: ../tcosmonitor/extensions/sendfiles.py:49 +#: ../tcosmonitor/extensions/sendfiles.py:50 +#: ../ui/tcosmonitor-prefwindow.ui:1134 ../ui/tcosmonitor-prefwindow.ui:1475 +#: ../ui/tcosmonitor-mainwindow.ui:387 +msgid "Send files" +msgstr "" + +#: ../tcosmonitor/shared.py:297 ../tcosmonitor/extensions/vnc.py:55 +msgid "Demo mode (from this host)" +msgstr "" + +#: ../tcosmonitor/shared.py:298 ../tcosmonitor/extensions/wakeonlan.py:41 +msgid "Boot client (WakeOnLan)" +msgstr "" + +#: ../tcosmonitor/shared.py:299 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:38 +msgid "Lock internet" +msgstr "" + +#: ../tcosmonitor/shared.py:300 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:39 +msgid "Unlock internet" +msgstr "" + +#: ../tcosmonitor/shared.py:301 ../tcosmonitor/extensions/dpms.py:40 +msgid "DPMS Power off monitor" +msgstr "" + +#: ../tcosmonitor/shared.py:302 ../tcosmonitor/extensions/dpms.py:42 +msgid "DPMS Power on monitor" +msgstr "" + +#: ../tcosmonitor/shared.py:303 +msgid "Send MIC audio (from this host)" +msgstr "" + +#: ../tcosmonitor/shared.py:321 ../tcosmonitor/extensions/reboot.py:41 +msgid "Reboot all clients" +msgstr "" + +#: ../tcosmonitor/shared.py:322 ../tcosmonitor/extensions/reboot.py:43 +msgid "Poweroff all clients" +msgstr "" + +#: ../tcosmonitor/shared.py:323 ../tcosmonitor/extensions/lockscreen.py:41 +msgid "Lock all screens" +msgstr "" + +#: ../tcosmonitor/shared.py:324 ../tcosmonitor/extensions/lockscreen.py:43 +msgid "Unlock all screens" +msgstr "" + +#: ../tcosmonitor/shared.py:325 ../tcosmonitor/extensions/logout.py:41 +msgid "Logout clients" +msgstr "" + +#: ../tcosmonitor/shared.py:326 ../tcosmonitor/extensions/restartxorg.py:42 +msgid "Restart X session of all clients" +msgstr "" + +#: ../tcosmonitor/shared.py:327 ../tcosmonitor/extensions/appsmsg.py:55 +msgid "Exec same app in all connected users" +msgstr "" + +#: ../tcosmonitor/shared.py:328 ../tcosmonitor/extensions/appsmsg.py:56 +msgid "Send a text message to all connected users" +msgstr "" + +#: ../tcosmonitor/shared.py:329 ../tcosmonitor/extensions/vnc.py:57 +msgid "Enter demo mode, all connected users see my screen" +msgstr "" + +#: ../tcosmonitor/shared.py:330 +msgid "Enter conference mode, all connected users can hear me" +msgstr "" + +#: ../tcosmonitor/shared.py:331 ../tcosmonitor/extensions/screenshot.py:46 +msgid "Capture All clients screens" +msgstr "" + +#: ../tcosmonitor/shared.py:334 ../tcosmonitor/extensions/wakeonlan.py:42 +msgid "Boot All clients (WakeOnLan)" +msgstr "" + +#: ../tcosmonitor/shared.py:335 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:41 +msgid "Lock internet in all connected users" +msgstr "" + +#: ../tcosmonitor/shared.py:336 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:42 +msgid "Unlock internet in all connected users" +msgstr "" + +#: ../tcosmonitor/shared.py:337 ../tcosmonitor/extensions/dpms.py:41 +msgid "DPMS Power off monitors" +msgstr "" + +#: ../tcosmonitor/shared.py:338 ../tcosmonitor/extensions/dpms.py:43 +msgid "DPMS Power on monitors" +msgstr "" + +#: ../tcosmonitor/shared.py:339 +msgid "Chat audio conference" +msgstr "" + +#: ../tcosmonitor/shared.py:340 ../tcosmonitor/extensions/livevnc.py:51 +#: ../ui/tcosmonitor-prefwindow.ui:1342 +msgid "Live view screens with VNC" +msgstr "" + +#: ../tcosmonitor/shared.py:538 +#, python-format +msgid "QUESTION: %(txt)s, RESPONSE %(response)s" +msgstr "" + +#: ../tcosmonitor/shared.py:555 ../tcosmonitor/shared.py:566 +#, python-format +msgid "INFO: %s" +msgstr "" + +#: ../tcosmonitor/shared.py:577 +#, python-format +msgid "ERROR: %s" +msgstr "" + +#: ../tcosmonitor/TcosClassView.py:50 ../tcosmonitor/TcosIconView.py:47 +msgid "IP" +msgstr "" + +#: ../tcosmonitor/TcosClassView.py:51 ../tcosmonitor/TcosIconView.py:48 +#: ../tcosmonitor/TcosListView.py:64 +msgid "Hostname" +msgstr "" + +#: ../tcosmonitor/TcosClassView.py:52 ../tcosmonitor/TcosIconView.py:49 +#: ../tcosmonitor/TcosListView.py:76 +msgid "Username" +msgstr "" + +#: ../tcosmonitor/TcosClassView.py:53 ../tcosmonitor/TcosIconView.py:50 +#: ../tcosmonitor/TcosListView.py:87 +msgid "Logged" +msgstr "" + +#: ../tcosmonitor/TcosClassView.py:54 ../tcosmonitor/TcosIconView.py:51 +#: ../tcosmonitor/TcosListView.py:103 +msgid "Time log in" +msgstr "" + +#: ../tcosmonitor/TcosClassView.py:55 ../tcosmonitor/TcosIconView.py:52 +msgid "Screen locked" +msgstr "" + +#: ../tcosmonitor/TcosClassView.py:56 ../tcosmonitor/TcosIconView.py:53 +msgid "Network locked" +msgstr "" + +#: ../tcosmonitor/TcosClassView.py:58 +msgid "" +"Place mouse on any computer to see brief info about it.\n" +"You can select and unselect multiple host clicking on every one.\n" +"Drag and drop hosts to positions and save clicking on right mouse button." +msgstr "" + +#: ../tcosmonitor/TcosClassView.py:179 +msgid "Positions reset to defaults." +msgstr "" + +#: ../tcosmonitor/TcosClassView.py:197 +msgid "Positions saved." +msgstr "" + +#: ../tcosmonitor/TcosClassView.py:323 +#, python-format +msgid "%s is not a valid file to exe or send" +msgstr "" + +#: ../tcosmonitor/TcosClassView.py:409 ../tcosmonitor/TcosIconView.py:156 +msgid "yes" +msgstr "" + +#: ../tcosmonitor/TcosClassView.py:411 ../tcosmonitor/TcosIconView.py:158 +msgid "no" +msgstr "" + +#: ../tcosmonitor/TcosTrayIcon.py:49 ../tcosmonitor/extensions/vnc.py:298 +#: ../tcosmonitor/TcosTrayIcon2.py:53 ../ui/tcosmonitor-mainwindow.ui:23 +msgid "Quit" +msgstr "" + +#: ../tcosmonitor/TcosTrayIcon.py:65 +msgid "TcosDevices" +msgstr "" + +#: ../tcosmonitor/TcosTrayIcon.py:172 ../tcosmonitor/TcosTrayIcon.py:186 +#: ../tcosmonitor/TcosTrayIcon2.py:67 +msgid "Tcos Devices" +msgstr "" + +#: ../tcosmonitor/TcosTrayIcon.py:232 ../tcosmonitor/TcosTrayIcon2.py:351 +msgid "Usb flash" +msgstr "" + +#: ../tcosmonitor/TcosTrayIcon.py:234 ../tcosmonitor/TcosTrayIcon2.py:353 +msgid "Mount USB1" +msgstr "" + +#: ../tcosmonitor/TcosTrayIcon.py:235 ../tcosmonitor/TcosTrayIcon2.py:354 +msgid "Umount USB1" +msgstr "" + +#: ../tcosmonitor/extensions/lockscreen.py:49 +#: ../tcosmonitor/extensions/lockscreen.py:57 +msgid "" +"Can't connect to tcosxmlrpc.\n" +"Please verify user and password in prefences!" +msgstr "" + +#: ../tcosmonitor/extensions/lockscreen.py:81 +#, python-format +msgid "Do you want to lock the following screens: %s?" +msgstr "" + +#: ../tcosmonitor/extensions/lockscreen.py:90 +#, python-format +msgid "Do you want to unlock the following screens: %s?" +msgstr "" + +#: ../tcosmonitor/extensions/appsmsg.py:64 +msgid "Clients not connected" +msgstr "" + +#: ../tcosmonitor/extensions/appsmsg.py:87 +#, python-format +msgid "" +"<b>Exec app in user(s) screen(s)\n" +"or open web address to:</b>\n" +"%s" +msgstr "" + +#: ../tcosmonitor/extensions/appsmsg.py:89 +#, python-format +msgid "" +"<b>Send a message to:</b>\n" +"%s" +msgstr "" + +#: ../tcosmonitor/extensions/appsmsg.py:122 +#: ../tcosmonitor/extensions/appsmsg.py:163 +msgid "Can't exec application, user is not logged" +msgstr "" + +#: ../tcosmonitor/extensions/appsmsg.py:141 +#: ../tcosmonitor/extensions/appsmsg.py:152 +#, python-format +msgid "%s is not a valid application" +msgstr "" + +#: ../tcosmonitor/extensions/appsmsg.py:172 +msgid "Can't send message, user is not logged" +msgstr "" + +#: ../tcosmonitor/extensions/appsmsg.py:289 +#: ../tcosmonitor/extensions/appsmsg.py:298 +#, python-format +msgid "%s is not application" +msgstr "" + +#: ../tcosmonitor/extensions/appsmsg.py:353 +#, python-format +msgid "" +"Error while exec remote app:\n" +"Reason: %s" +msgstr "" + +#: ../tcosmonitor/extensions/appsmsg.py:360 +#, python-format +msgid "" +"Error while send message:\n" +"Reason: %s" +msgstr "" + +#: ../tcosmonitor/extensions/remotessh.py:47 +msgid "Enter password of remote thin client (if asked for it)" +msgstr "" + +#: ../tcosmonitor/extensions/dpms.py:79 +#, python-format +msgid "Do you want to switch off the following monitors: %s?" +msgstr "" + +#: ../tcosmonitor/extensions/dpms.py:88 +#, python-format +msgid "Do you want to switch on the following monitors: %s?" +msgstr "" + +#: ../tcosmonitor/extensions/screenshot.py:66 +#: ../tcosmonitor/extensions/screenshot.py:83 +#, python-format +msgid "Can't make screenshot, error: %s" +msgstr "" + +#: ../tcosmonitor/extensions/screenshot.py:75 +msgid "Trying to order terminal to do a screenshot..." +msgstr "" + +#: ../tcosmonitor/extensions/screenshot.py:87 +msgid "Get another screenshot" +msgstr "" + +#: ../tcosmonitor/extensions/screenshot.py:102 +#, python-format +msgid "Screenshot of <span style='font-style: italic'>%s</span>" +msgstr "" + +#: ../tcosmonitor/extensions/screenshot.py:125 +#, python-format +msgid "Screenshot of %s, done." +msgstr "" + +#: ../tcosmonitor/extensions/screenshot.py:139 +msgid "Save Screenshot" +msgstr "" + +#: ../tcosmonitor/extensions/screenshot.py:151 +msgid "Select file to save screenshot..." +msgstr "" + +#: ../tcosmonitor/extensions/screenshot.py:155 +#, python-format +msgid "screenshot_of_%(hostname)s_date_%(date)s.png" +msgstr "" + +#: ../tcosmonitor/extensions/screenshot.py:159 +msgid "Image Files ( *.png, *.jpg)" +msgstr "" + +#: ../tcosmonitor/extensions/screenshot.py:169 +msgid "File must be png or jpg." +msgstr "" + +#: ../tcosmonitor/extensions/screenshot.py:192 +msgid "Screenshots of all hosts" +msgstr "" + +#: ../tcosmonitor/extensions/screenshot.py:208 +#, python-format +msgid "Screenshot of %s" +msgstr "" + +#: ../tcosmonitor/extensions/sendfiles.py:62 +#: ../tcosmonitor/extensions/sendfiles.py:120 +msgid "Can't send files, user is not logged" +msgstr "" + +#: ../tcosmonitor/extensions/sendfiles.py:66 +#: ../tcosmonitor/extensions/sendfiles.py:142 +#: ../tcosmonitor/extensions/sendfiles.py:237 +msgid "" +"TcosMonitor need special configuration for rsync daemon to send files.\n" +"\n" +"Please read configuration requeriments in:\n" +"/usr/share/doc/tcosmonitor/README.rsync" +msgstr "" + +#: ../tcosmonitor/extensions/sendfiles.py:84 +#: ../tcosmonitor/extensions/sendfiles.py:176 +#: ../tcosmonitor/extensions/sendfiles.py:270 +msgid "Waiting for send files..." +msgstr "" + +#: ../tcosmonitor/extensions/sendfiles.py:93 +#: ../tcosmonitor/extensions/sendfiles.py:95 +#: ../tcosmonitor/extensions/sendfiles.py:99 +#: ../tcosmonitor/extensions/sendfiles.py:108 +#: ../tcosmonitor/extensions/sendfiles.py:189 +#: ../tcosmonitor/extensions/sendfiles.py:191 +#: ../tcosmonitor/extensions/sendfiles.py:195 +#: ../tcosmonitor/extensions/sendfiles.py:204 +#: ../tcosmonitor/extensions/sendfiles.py:283 +#: ../tcosmonitor/extensions/sendfiles.py:285 +#: ../tcosmonitor/extensions/sendfiles.py:289 +#: ../tcosmonitor/extensions/sendfiles.py:298 +msgid "Teacher" +msgstr "" + +#: ../tcosmonitor/extensions/sendfiles.py:95 +#: ../tcosmonitor/extensions/sendfiles.py:108 +#: ../tcosmonitor/extensions/sendfiles.py:191 +#: ../tcosmonitor/extensions/sendfiles.py:204 +#: ../tcosmonitor/extensions/sendfiles.py:285 +#: ../tcosmonitor/extensions/sendfiles.py:298 +#, python-format +msgid "" +"Teacher has sent some files to %(teacher)s folder:\n" +"\n" +"%(basenames)s" +msgstr "" + +#: ../tcosmonitor/extensions/sendfiles.py:104 +#: ../tcosmonitor/extensions/sendfiles.py:200 +#: ../tcosmonitor/extensions/sendfiles.py:294 +#: ../tcosmonitor/extensions/reboot.py:108 +#: ../tcosmonitor/extensions/videolan.py:194 +#: ../tcosmonitor/extensions/videolan.py:389 +#: ../tcosmonitor/extensions/videolan.py:629 +#, python-format +msgid "" +"Error while exec remote app:\n" +"Reason:%s" +msgstr "" + +#: ../tcosmonitor/extensions/sendfiles.py:105 +#: ../tcosmonitor/extensions/sendfiles.py:201 +#: ../tcosmonitor/extensions/sendfiles.py:295 +msgid "Error creating destination folder." +msgstr "" + +#: ../tcosmonitor/extensions/sendfiles.py:110 +#: ../tcosmonitor/extensions/sendfiles.py:205 +#: ../tcosmonitor/extensions/sendfiles.py:300 +msgid "Files sent." +msgstr "" + +#: ../tcosmonitor/extensions/sendfiles.py:125 +#: ../tcosmonitor/extensions/sendfiles.py:220 +msgid "Select file or files..." +msgstr "" + +#: ../tcosmonitor/extensions/sendfiles.py:178 +#: ../tcosmonitor/extensions/sendfiles.py:272 +msgid "Do you want open file(s) on client?" +msgstr "" + +#: ../tcosmonitor/extensions/sendfiles.py:215 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:113 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:155 +#: ../tcosmonitor/extensions/videolan.py:457 +#: ../tcosmonitor/extensions/vnc.py:68 ../tcosmonitor/extensions/vnc.py:112 +#: ../tcosmonitor/extensions/vnc.py:422 +#: ../tcosmonitor/extensions/audiortp.py:229 +#: ../tcosmonitor/extensions/audiortp.py:275 +#: ../tcosmonitor/extensions/audiortp.py:373 +#: ../tcosmonitor/extensions/audiortp.py:407 +#: ../tcosmonitor/extensions/audiortp.py:460 +msgid "No users logged." +msgstr "" + +#: ../tcosmonitor/extensions/info.py:91 +#, python-format +msgid "Connecting with %s to retrieve some info..." +msgstr "" + +#: ../tcosmonitor/extensions/info.py:117 +msgid "Tcos info" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:120 +msgid "PXES info" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:123 +msgid "LTSP info" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:126 +msgid "Standalone info" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:129 +msgid "Unknow client info" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:135 ../tcosmonitor/LocalData.py:43 +#: ../tcosmonitor/LocalData.py:62 ../tcosmonitor/TcosCommon.py:182 +#: ../tcosmonitor/TcosCommon.py:190 ../tcosmonitor/TcosCommon.py:206 +#: ../tcosmonitor/TcosCommon.py:209 +msgid "unknow" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:138 +msgid "Hostname: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:139 +msgid "Ip address: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:140 +msgid "TcosXmlRpc version: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:149 +msgid "Tcos image version: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:150 +msgid "Tcos image date: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:151 +msgid "Date of thin client: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:152 +msgid "Uptime: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:163 +msgid "Kernel info" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:172 +msgid "Force download and mount all modules" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:183 +msgid "None" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:186 +msgid "Kernel version: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:187 +msgid "Kernel complete version: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:188 +msgid "Loaded Modules: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:189 +msgid "Modules not found: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:205 +msgid "Cpu info: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:212 +msgid "Cpu model: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:213 +msgid "Cpu vendor: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:214 +msgid "Cpu speed: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:225 +msgid "PCI buses: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:254 +msgid "Process running: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:267 +msgid "Ram info: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:274 +msgid "Total Ram: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:275 +msgid "Free RAM: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:276 +msgid "Active RAM: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:279 +msgid "Swap info: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:285 +msgid "Swap enabled: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:286 +msgid "Total Swap: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:287 +msgid "Used Swap: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:297 +msgid "Network info: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:307 +msgid "Network hostname: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:308 +msgid "Network IP: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:309 +msgid "Network MASK: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:310 +msgid "Network MAC: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:311 +msgid "Data received(rx): " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:312 +msgid "Data send(tx): " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:322 ../ui/tcosmonitor-prefwindow.ui:911 +msgid "Xorg info" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:348 +msgid "enabled" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:350 +msgid "disabled" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:353 ../ui/tcospersonalize.ui:159 +msgid "X Session Type" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:355 ../ui/tcospersonalize.ui:201 +msgid "Xorg Driver" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:357 ../ui/tcospersonalize.ui:94 +msgid "Xorg Resolution" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:359 ../ui/tcospersonalize.ui:133 +msgid "Xorg Color depth" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:361 ../ui/tcospersonalize.ui:179 +msgid "DPMS energy monitor control" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:363 +msgid "Disable kill X with Ctrl+Alt+Backspace" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:365 ../ui/tcospersonalize.ui:57 +msgid "Enable mouse wheel" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:367 +msgid "Refresh rate" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:369 +msgid "Xorg font server" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:371 +msgid "Mouse device" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:373 +msgid "Mouse protocol" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:375 ../ui/tcospersonalize.ui:273 +msgid "X Horiz sync" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:377 ../ui/tcospersonalize.ui:284 +msgid "X Vert sync" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:390 +msgid "PulseAudio Sound server is running" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:408 +msgid "Remote Sound Mixer" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:480 +msgid "PulseAudio Control" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:485 +msgid "PulseAudio Meter" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:490 +msgid "PulseAudio Manager" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:494 +msgid "PulseAudio utils: " +msgstr "" + +#: ../tcosmonitor/extensions/info.py:500 +msgid "PulseAudio stats" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:512 +msgid "Currently in use" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:513 +msgid "Allocated during whole lifetime" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:514 +msgid "Sample cache size" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:515 +msgid "User name" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:516 +msgid "Host Name" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:517 +msgid "Server Name" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:518 +msgid "Server Version" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:519 +msgid "Default Sample Specification" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:520 +msgid "Default Sink" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:521 +msgid "Default Source" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:522 +msgid "Cookie" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:528 +msgid "Sound server is not running" +msgstr "" + +#: ../tcosmonitor/extensions/info.py:589 ../tcosmonitor/extensions/info.py:597 +#: ../tcosmonitor/extensions/info.py:605 +msgid "PulseAudio apps need /dev/shm." +msgstr "" + +#: ../tcosmonitor/extensions/logout.py:48 +#: ../tcosmonitor/extensions/logout.py:71 +msgid "User not logged" +msgstr "" + +#: ../tcosmonitor/extensions/logout.py:51 +#, python-format +msgid "Do you want to logout user: %s?" +msgstr "" + +#: ../tcosmonitor/extensions/logout.py:55 +#: ../tcosmonitor/extensions/logout.py:77 +#, python-format +msgid "Session will close in %s seconds" +msgstr "" + +#: ../tcosmonitor/extensions/logout.py:73 +#, python-format +msgid "Do you want to logout the following users: %s?" +msgstr "" + +#: ../tcosmonitor/extensions/reboot.py:48 +#, python-format +msgid "Do you want to reboot: %s?" +msgstr "" + +#: ../tcosmonitor/extensions/reboot.py:51 +#: ../tcosmonitor/extensions/reboot.py:61 +#, python-format +msgid "Pc will reboot in %s seconds" +msgstr "" + +#: ../tcosmonitor/extensions/reboot.py:58 +#, python-format +msgid "Do you want to reboot the following clients: %s?" +msgstr "" + +#: ../tcosmonitor/extensions/reboot.py:67 +#, python-format +msgid "Do you want to poweroff: %s?" +msgstr "" + +#: ../tcosmonitor/extensions/reboot.py:70 +#: ../tcosmonitor/extensions/reboot.py:80 +#, python-format +msgid "Pc will shutdown in %s seconds" +msgstr "" + +#: ../tcosmonitor/extensions/reboot.py:77 +#, python-format +msgid "Do you want to poweroff the following clients: %s?" +msgstr "" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:50 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:109 +msgid "Internet connection has been disabled" +msgstr "" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:54 +msgid "Can't disable internet, user is not logged" +msgstr "" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:59 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:85 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:103 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:147 +#, python-format +msgid "" +"In order to lock and unlock internet you need to be in 'tcos' group.\n" +"\n" +"Exe by root: adduser %s tcos" +msgstr "" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:77 +#: ../tcosmonitor/extensions/tcosnetcontroller.py:151 +msgid "Internet connection has been enabled" +msgstr "" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:81 +msgid "Can't enable internet, user is not logged" +msgstr "" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:116 +#, python-format +msgid "Do you want disable internet to following users: %s?" +msgstr "" + +#: ../tcosmonitor/extensions/tcosnetcontroller.py:158 +#, python-format +msgid "Do you want enable internet to following users:%s?" +msgstr "" + +#: ../tcosmonitor/extensions/videolan.py:48 +#: ../tcosmonitor/extensions/videolan.py:49 +msgid "Send Audio/Video broadcast" +msgstr "" + +#: ../tcosmonitor/extensions/videolan.py:65 +#: ../tcosmonitor/extensions/videolan.py:219 +msgid "Can't send video broadcast, user is not logged" +msgstr "" + +#: ../tcosmonitor/extensions/videolan.py:149 +#: ../tcosmonitor/extensions/videolan.py:347 +#: ../tcosmonitor/extensions/videolan.py:578 +#, python-format +msgid "" +"Not allowed white spaces in \"%s\".\n" +"Please rename it." +msgstr "" + +#: ../tcosmonitor/extensions/videolan.py:159 +#: ../tcosmonitor/extensions/videolan.py:359 +#: ../tcosmonitor/extensions/videolan.py:594 +msgid "Waiting for start video transmission..." +msgstr "" + +#: ../tcosmonitor/extensions/videolan.py:167 +#: ../tcosmonitor/extensions/videolan.py:367 +#: ../tcosmonitor/extensions/videolan.py:602 +#: ../tcosmonitor/extensions/vnc.py:98 ../tcosmonitor/extensions/vnc.py:407 +msgid "Error while exec app" +msgstr "" + +#: ../tcosmonitor/extensions/videolan.py:199 +#: ../tcosmonitor/extensions/videolan.py:393 +#: ../tcosmonitor/extensions/videolan.py:634 +msgid "Running in broadcast video transmission." +msgstr "" + +#: ../tcosmonitor/extensions/videolan.py:208 +#: ../tcosmonitor/extensions/videolan.py:402 +#, python-format +msgid "" +"Running in broadcast video transmission to user %(host)s. Broadcast Nº %" +"(count)s" +msgstr "" + +#: ../tcosmonitor/extensions/videolan.py:311 +#: ../tcosmonitor/extensions/videolan.py:541 +msgid "Select audio/video file.." +msgstr "" + +#: ../tcosmonitor/extensions/videolan.py:314 +#: ../tcosmonitor/extensions/videolan.py:544 +msgid "Play DVD" +msgstr "" + +#: ../tcosmonitor/extensions/videolan.py:315 +#: ../tcosmonitor/extensions/videolan.py:545 +msgid "Play SVCD/VCD" +msgstr "" + +#: ../tcosmonitor/extensions/videolan.py:316 +#: ../tcosmonitor/extensions/videolan.py:546 +msgid "Play AudioCD" +msgstr "" + +#: ../tcosmonitor/extensions/videolan.py:361 +#: ../tcosmonitor/extensions/videolan.py:596 +msgid "" +"First select the DVD chapter or play movie\n" +"then press enter to send clients..." +msgstr "" + +#: ../tcosmonitor/extensions/videolan.py:370 +msgid "Lock keyboard and mouse on client?" +msgstr "" + +#: ../tcosmonitor/extensions/videolan.py:444 +msgid "Video broadcast stopped." +msgstr "" + +#: ../tcosmonitor/extensions/videolan.py:605 +msgid "Lock keyboard and mouse on clients?" +msgstr "" + +#: ../tcosmonitor/extensions/videolan.py:643 +#, python-format +msgid "Running in broadcast video transmission. Broadcast Nº %s" +msgstr "" + +#: ../tcosmonitor/extensions/restartxorg.py:51 +#, python-format +msgid "Restart X session of %s with new config?" +msgstr "" + +#: ../tcosmonitor/extensions/restartxorg.py:64 +#, python-format +msgid "%s is not supported to restart Xorg!" +msgstr "" + +#: ../tcosmonitor/extensions/restartxorg.py:78 +msgid "No thin clients found." +msgstr "" + +#: ../tcosmonitor/extensions/restartxorg.py:81 +#, python-format +msgid "Do you want to restart X screens (only thin clients):%s?" +msgstr "" + +#: ../tcosmonitor/extensions/italc.py:51 ../tcosmonitor/extensions/vnc.py:135 +msgid "No user logged." +msgstr "" + +#: ../tcosmonitor/extensions/italc.py:75 +msgid "Can't start IVS, please add iTALC support" +msgstr "" + +#: ../tcosmonitor/extensions/tcospersonalize.py:54 +#, python-format +msgid "%s is not supported to personalize!" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:71 +#, python-format +msgid "Do you want to start demo mode the following users: %s?" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:83 +msgid "Waiting for start demo mode..." +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:116 ../tcosmonitor/extensions/vnc.py:426 +#, python-format +msgid "Running in demo mode with %s clients." +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:127 +#, python-format +msgid "Running in demo mode from server. Demo Nº %s" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:149 ../tcosmonitor/extensions/vnc.py:369 +#, python-format +msgid "Connecting with %s to start VNC support" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:178 +#, python-format +msgid "" +"Can't start VNC, error:\n" +"%s" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:182 +msgid "Waiting for start of VNC server..." +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:211 +msgid "Can't start VNC, please add X11VNC support" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:237 +msgid "Switch to view only" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:242 ../tcosmonitor/extensions/vnc.py:273 +msgid "Switch to full control" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:269 +#, python-format +msgid "VNC host %s" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:281 +msgid "Switch to fullscreen" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:290 +#: ../tcosmonitor/extensions/livevnc.py:72 +#: ../tcosmonitor/TcosPreferences.py:539 ../tcosmonitor/TcosExtensions.py:338 +msgid "Stop" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:342 +msgid "Can't start demo mode, user is not logged" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:345 +#, python-format +msgid "Do you want demo mode from user %s?" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:392 +#, python-format +msgid "Waiting for start demo mode from user %s..." +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:446 +#, python-format +msgid "Running in demo mode from user %(host)s. Demo Nº %(count)s" +msgstr "" + +#: ../tcosmonitor/extensions/vnc.py:501 +msgid "Demo mode off." +msgstr "" + +#: ../tcosmonitor/extensions/wakeonlan.py:50 +#: ../tcosmonitor/extensions/wakeonlan.py:75 +msgid "" +"Wake On Lan only works with static list.\n" +"\n" +"Enable scan method \"static\" in Preferences\n" +"and (wake on lan) support in bios of clients." +msgstr "" + +#: ../tcosmonitor/extensions/wakeonlan.py:54 +#, python-format +msgid "Do you want boot %s client?" +msgstr "" + +#: ../tcosmonitor/extensions/wakeonlan.py:67 +#: ../tcosmonitor/extensions/wakeonlan.py:91 +#, python-format +msgid "No register MAC address for ip: \"%s\"" +msgstr "" + +#: ../tcosmonitor/extensions/wakeonlan.py:71 +#: ../tcosmonitor/extensions/wakeonlan.py:98 +#, python-format +msgid "Not valid MAC address: \"%s\"" +msgstr "" + +#: ../tcosmonitor/extensions/wakeonlan.py:79 +msgid "Do you want boot all clients?" +msgstr "" + +#: ../tcosmonitor/extensions/livevnc.py:76 +msgid "Live view of all hosts" +msgstr "" + +#: ../tcosmonitor/extensions/livevnc.py:194 +msgid "Running in LiveView mode" +msgstr "" + +#: ../tcosmonitor/extensions/viewproc.py:48 +msgid "Can't show runnings apps, user is not logged" +msgstr "" + +#: ../tcosmonitor/extensions/viewproc.py:58 +msgid "User not connected, no processes." +msgstr "" + +#: ../tcosmonitor/extensions/viewproc.py:76 +#, python-format +msgid "Running processes for user \"%s\": " +msgstr "" + +#: ../tcosmonitor/extensions/viewproc.py:80 +msgid "" +"ALERT: There are some system process hidden. Enable it in Preferences dialog." +msgstr "" + +#: ../tcosmonitor/extensions/viewproc.py:85 +msgid "Pid" +msgstr "" + +#: ../tcosmonitor/extensions/viewproc.py:86 +msgid "Process command" +msgstr "" + +#: ../tcosmonitor/extensions/viewproc.py:91 +msgid "Kill this process" +msgstr "" + +#: ../tcosmonitor/extensions/viewproc.py:127 +msgid "Are you sure you want to stop this process?" +msgstr "" + +#: ../tcosmonitor/extensions/viewproc.py:136 +#, python-format +msgid "" +"Error while killing app:\n" +"Reason: %s" +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:49 +#: ../ui/tcosmonitor-mainwindow.ui:163 +msgid "Send audio conference" +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:50 +#: ../ui/tcosmonitor-prefwindow.ui:1507 +msgid "Audio chat conference" +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:51 +#: ../ui/tcosmonitor-mainwindow.ui:275 +msgid "Audio chat list" +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:52 +msgid "Send audio conference (from this host)" +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:73 +msgid "Emission" +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:79 +msgid "State" +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:83 +msgid "Channel" +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:235 +#: ../tcosmonitor/extensions/audiortp.py:322 +#: ../tcosmonitor/extensions/audiortp.py:413 +msgid "" +"Your pulseaudio server is too old.\n" +"Is required pulseaudio version >= 0.9.10" +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:238 +#, python-format +msgid "Do you want to start audio conference to the following users: %s?" +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:243 +msgid "You have entered in audio conference" +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:267 +msgid "Waiting for start audio conference..." +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:295 +#: ../tcosmonitor/extensions/audiortp.py:390 +#, python-format +msgid "Running in audio conference with %s clients." +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:305 +#, python-format +msgid "Running in audio conference from server. Conference Nº %s" +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:316 +msgid "Can't start conference mode, user is not logged" +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:325 +#, python-format +msgid "Do you want audio conference from user %s?" +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:331 +#, python-format +msgid "You have entered in audio conference from user %s" +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:359 +#, python-format +msgid "Waiting for start audio conference from user %s..." +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:400 +#, python-format +msgid "Running in audio conference from user %(host)s. Conference Nº %(count)s" +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:416 +#, python-format +msgid "Do you want to start audio chat conference to the following users: %s?" +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:421 +#, python-format +msgid "You have entered in audio chat conference. Participants: %s" +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:443 +msgid "Waiting for start audio chat conference..." +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:449 +msgid "Do you want to connect to this audio chat conference now?" +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:483 +#, python-format +msgid "Running in audio chat conference with %s clients." +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:495 +#, python-format +msgid "Running in audio chat conference. Conference Nº %s" +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:521 +msgid "Conference mode off." +msgstr "" + +#: ../tcosmonitor/extensions/audiortp.py:540 +msgid "Audio chat conference off." +msgstr "" + +#: ../tcosmonitor/TcosXmlRpc.py:85 +msgid "" +"Username or password are empty,\n" +"please edit in preferences dialog!" +msgstr "" + +#: ../tcosmonitor/TcosIconView.py:55 +msgid "Place mouse on any computer to see brief info about it." +msgstr "" + +#: ../tcosmonitor/TcosListView.py:82 +msgid "Active" +msgstr "" + +#: ../tcosmonitor/TcosListView.py:92 +msgid "Screen Blocked" +msgstr "" + +#: ../tcosmonitor/TcosListView.py:97 +msgid "Num of process" +msgstr "" + +#: ../tcosmonitor/TcosListView.py:112 +msgid "Sel" +msgstr "" + +#: ../tcosmonitor/TcosListView.py:148 +#, python-format +msgid "Error connecting to tcosxmlrpc in %s" +msgstr "" + +#: ../tcosmonitor/TcosTrayIcon2.py:154 +#, python-format +msgid "Floppy: %s" +msgstr "" + +#: ../tcosmonitor/TcosTrayIcon2.py:156 +#, python-format +msgid "CDROM: %s" +msgstr "" + +#: ../tcosmonitor/TcosTrayIcon2.py:158 +#, python-format +msgid "USB: %s" +msgstr "" + +#: ../tcosmonitor/TcosTrayIcon2.py:160 +#, python-format +msgid "HDD partition: %s" +msgstr "" + +#: ../tcosmonitor/TcosTrayIcon2.py:162 +#, python-format +msgid "Unknow: %s" +msgstr "" + +#: ../tcosmonitor/Initialize.py:217 +msgid "GPL-2 license file not found" +msgstr "" + +#: ../tcosmonitor/LocalData.py:212 +#, python-format +msgid "Selected network inteface (%s) don't have IP address" +msgstr "" + +#: ../tcosmonitor/LocalData.py:260 ../tcosmonitor/ping.py:108 +#: ../tcosmonitor/ping.py:171 +msgid "Testing if found clients have 8998 or 8999 port open..." +msgstr "" + +#: ../tcosmonitor/LocalData.py:282 +msgid "" +"Static list method configured but no hosts in list.\n" +"\n" +"Please, open preferences, click on 'Open Static Host list' and add some " +"hosts." +msgstr "" + +#: ../tcosmonitor/TcosPreferences.py:264 +msgid "" +"You have select more than 5 button menus.\n" +"Only allowed to select a maximum of 5 buttons." +msgstr "" + +#: ../tcosmonitor/TcosPreferences.py:275 +msgid "New settings saved." +msgstr "" + +#: ../tcosmonitor/TcosMenus.py:102 ../tcosmonitor/TcosMenus.py:114 +#, python-format +msgid "Actions for %s" +msgstr "" + +#: ../tcosmonitor/TcosMenus.py:107 +msgid "Actions for selected host" +msgstr "" + +#: ../tcosmonitor/TcosMenus.py:168 ../tcosmonitor/TcosMenus.py:299 +#, python-format +msgid "%d hidden actions" +msgstr "" + +#: ../tcosmonitor/TcosMenus.py:243 ../tcosmonitor/TcosMenus.py:245 +msgid "Actions for selected hosts" +msgstr "" + +#: ../tcosmonitor/TcosMenus.py:247 +msgid "Actions for all hosts" +msgstr "" + +#: ../tcosmonitor/TcosMenus.py:304 +msgid "Save hosts positions" +msgstr "" + +#: ../tcosmonitor/TcosMenus.py:312 +msgid "Reset hosts positions" +msgstr "" + +#: ../tcosmonitor/ping.py:80 +#, python-format +msgid "Ping to %s..." +msgstr "" + +#: ../tcosmonitor/ping.py:89 +msgid "Waiting for pings..." +msgstr "" + +#: ../tcosmonitor/ping.py:127 ../tcosmonitor/ping.py:192 +#: ../tcosmonitor/TcosActions.py:185 ../tcosmonitor/TcosActions.py:264 +msgid "Not connected hosts found." +msgstr "" + +#: ../tcosmonitor/ping.py:134 ../tcosmonitor/ping.py:197 +#: ../tcosmonitor/TcosActions.py:187 ../tcosmonitor/TcosActions.py:259 +#, python-format +msgid "Found %d hosts" +msgstr "" + +#: ../tcosmonitor/TcosActions.py:162 ../tcosmonitor/TcosActions.py:241 +msgid "Searching for connected hosts..." +msgstr "" + +#: ../tcosmonitor/TcosActions.py:1019 +msgid "Searching info of hosts..." +msgstr "" + +#: ../tcosmonitor/TcosActions.py:1058 +#, python-format +msgid "Connecting to %s..." +msgstr "" + +#: ../tcosmonitor/TcosExtensions.py:41 +msgid "Exception:" +msgstr "" + +#: ../tcosmonitor/TcosExtensions.py:77 +msgid "Error: no IP!" +msgstr "" + +#: ../tcosmonitor/TcosExtensions.py:154 +msgid "No clients connected, press refresh button." +msgstr "" + +#: ../tcosmonitor/TcosExtensions.py:251 ../tcosmonitor/TcosExtensions.py:253 +#, python-format +msgid "Can't exec this action at '%s' because you are connected at this host!" +msgstr "" + +#: ../tcosmonitor/TcosExtensions.py:267 +#, python-format +msgid "Doing action \"%(action)s\" in %(ip)s..." +msgstr "" + +#: ../tcosmonitor/TcosExtensions.py:285 +#, python-format +msgid "Done action \"%(action)s\" in %(ip)s" +msgstr "" + +#: ../tcosmonitor/TcosCommon.py:89 +#, python-format +msgid "" +"ThreadController: Found error executing %(cmd)s\n" +"\n" +"If problem persist, disable Thread Controller\n" +"in Preferences and report bug.\n" +"Error=%(error)s" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:35 ../ui/tcospersonalize.ui:7 +#: ../ui/tcosmonitor-mainwindow.ui:36 +msgid "Preferences" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:62 +msgid "Show host list on startup" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:80 +msgid "Scan network method" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:91 +msgid "" +"Network interface\n" +"(thin client)" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:127 +msgid "Show system process" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:144 +msgid "Don't do actions when running TcosMonitor in thin client" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:163 +msgid "List of hosts" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:200 +msgid "Open static host list" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:225 +msgid "Only show hosts running tcosxmlrpc (8998 port)" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:242 +msgid "Only do all actions on selected hosts (requires restart TcosMonitor)" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:259 +msgid "Enable SSL connections to XMLRPC clients" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:278 +msgid "Host list mode" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:302 +msgid "Show right menu with groups (NEW)" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:319 +msgid "Don't show thin client if TcosMonitor is running there" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:351 +msgid "Settings" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:376 +msgid "Update host list every (seg)" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:389 +msgid "" +"Update host list every selected seconds.\n" +"\n" +"Value=0 disable update." +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:405 +msgid "Cache timeout (seg)" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:419 +msgid "" +"Cache some data and connection status during selected seconds.\n" +"\n" +"Value=0 disable cache." +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:437 +msgid "Screenshot size:" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:450 ../ui/tcosmonitor-prefwindow.ui:479 +msgid "% Size of screnshot." +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:466 +msgid "Mini screenshot size:" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:495 +msgid "Timeout actions (seg)" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:508 +msgid "" +"Timeout in seg for actions\n" +"\n" +"Value=0 default" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:526 +msgid "SSH remote username" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:553 +msgid "VLC method to send" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:578 +msgid "" +"<b>Experimental: Thread Controller</b>\n" +"( if you have problems, disable it )" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:591 +msgid "Actions controlled" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:611 +msgid "Block ports: (80,8080... etc)" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:653 ../ui/tcospersonalize.ui:333 +msgid "Advanced" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:680 +msgid "TcosXmlRpc username" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:706 +msgid "TcosXmlRpc password" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:735 +msgid "" +"<b>NOTE:</b>\n" +"Default user is <b>root</b> and default password is <b>root</b>.\n" +"\n" +"For <u>thin clients</u> change TCOS_ROOT_PASSWD or use TcosConfig and " +"regenerate boot images again.\n" +"\n" +"For <u>standalone</u> users you can use a system account (root) but this is " +"not recomended. Install tcos-standalone and start it by root. Set user and " +"password, this will create a <b>/etc/tcospasswd</b> file only used by TCOS " +"and your root acount will be secure." +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:772 +msgid "Authentication " +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:795 +msgid "<b>Info avalaible from tcosxmlrpc</b>" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:806 +msgid "Tcos general info" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:821 +msgid "Cpu info" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:836 +msgid "Kernel and modules info" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:851 +msgid "PCI bus info" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:866 +msgid "Ram and swap info" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:881 +msgid "Process info" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:896 +msgid "Network info" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:926 +msgid "Sound server info" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:962 +msgid "Avalaible info" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:985 +msgid "<b>Show / hide menu items</b>" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:1003 +msgid "Lock and unlock screen" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:1019 +msgid "Remote SSH shell" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:1037 +msgid "Configure Xorg settings" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:1066 ../ui/tcosmonitor-prefwindow.ui:1427 +msgid "Exe app on user display" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:1082 ../ui/tcosmonitor-prefwindow.ui:1441 +msgid "Send a text message" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:1100 +msgid "Show running apps" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:1116 ../ui/tcosmonitor-prefwindow.ui:1457 +msgid "Send video broadcast" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:1150 +msgid "Demo mode" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:1179 +msgid "Wake on LAN" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:1195 +msgid "Audio conference mode" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:1213 +msgid "Screenshots" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:1229 +msgid "Reboot and poweroff" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:1243 +msgid "Lock and unlock internet" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:1259 +msgid "DPMS monitor on/off" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:1277 +msgid "Connect using VNC" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:1293 +msgid "Connect using iTALC" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:1308 +msgid "Restart session with new settings" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:1385 +msgid "Menus" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:1408 +msgid "<b>Show / hide menu buttons</b>" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:1491 +msgid "Audio conference" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:1525 +msgid "Audio Chat control" +msgstr "" + +#: ../ui/tcosmonitor-prefwindow.ui:1569 +msgid "Menu buttons" +msgstr "" + +#: ../ui/tcosmonitor-abouttcos.ui:6 +msgid "About TCOS" +msgstr "" + +#: ../ui/tcosmonitor-abouttcos.ui:19 +msgid "<span size=\"xx-large\">TcosMonitor</span>" +msgstr "" + +#: ../ui/tcosmonitor-abouttcos.ui:62 +msgid "<b>Version:</b>" +msgstr "" + +#: ../ui/tcosmonitor-abouttcos.ui:90 +msgid "" +"Thin client and standalone\n" +"monitoring tool." +msgstr "" + +#: ../ui/tcosmonitor-abouttcos.ui:131 +msgid "Project web site" +msgstr "" + +#: ../ui/tcosmonitor-abouttcos.ui:178 +msgid "About" +msgstr "" + +#: ../ui/tcosmonitor-abouttcos.ui:212 +msgid "License" +msgstr "" + +#: ../ui/tcosmonitor-abouttcos.ui:230 +msgid "" +"Main developers:\n" +" * Mario Izquierdo <mariodebian at gmail.com>\n" +" * Ignacio Vidal <vidal_joshur at gva.es>\n" +"\n" +"Contributors:\n" +" * Andrés Jimenez\n" +" * Quirón\n" +"\n" +"Special thanks to:\n" +" Comunidad de Madrid, MaX group (Spain)" +msgstr "" + +#: ../ui/tcosmonitor-abouttcos.ui:259 +msgid "Authors" +msgstr "" + +#: ../ui/tcosmonitor-abouttcos.ui:275 +msgid "Translated to your language by:" +msgstr "" + +#: ../ui/tcosmonitor-abouttcos.ui:287 +msgid "Mario Izquierdo <mariodebian@gmail.com>" +msgstr "" + +#: ../ui/tcosmonitor-abouttcos.ui:307 +msgid "Translators" +msgstr "" + +#: ../ui/tcosmonitor-abouttcos.ui:324 +msgid "" +"TCOS is a free software project that need a lot of work to be the best thin " +"client plataform.\n" +"\n" +"We work every day a lot of hours to make changes and support more devices " +"and features.\n" +"\n" +"We want to continue developing this software but need your help, if you use, " +"sell or hack TCOS pehaps you could donate some money to project.\n" +"\n" +"Click on next url to get some info." +msgstr "" + +#: ../ui/tcosmonitor-abouttcos.ui:370 +msgid "<u>http://wiki.tcosproject.org/TcosProject:Site_support</u>" +msgstr "" + +#: ../ui/tcosmonitor-abouttcos.ui:392 +msgid "Don't show donations message on start." +msgstr "" + +#: ../ui/tcosmonitor-abouttcos.ui:415 +msgid "Donate" +msgstr "" + +#: ../ui/tray.ui:20 +msgid "<big><b>TCOS devices</b></big>" +msgstr "" + +#: ../ui/tray.ui:57 +msgid "Hide" +msgstr "" + +#: ../ui/tcos-volume-manager.ui:39 +msgid "Restart sound" +msgstr "" + +#: ../ui/tcos-volume-manager.ui:54 +msgid "Sound levels" +msgstr "" + +#: ../ui/tcos-volume-manager.ui:90 +msgid "Main Channels" +msgstr "" + +#: ../ui/tcos-volume-manager.ui:113 +msgid "Secondary Channels" +msgstr "" + +#: ../ui/tcosmonitor-chatwindow.ui:8 +msgid "Chat emission list" +msgstr "" + +#: ../ui/tcosmonitor-chatwindow.ui:17 +msgid "<span size=\"x-large\">Chat emission list</span>" +msgstr "" + +#: ../ui/tcosmonitor-chatwindow.ui:80 +msgid "Connect" +msgstr "" + +#: ../ui/tcosmonitor-chatwindow.ui:128 +msgid "Disconnect" +msgstr "" + +#: ../ui/tcosmonitor-chatwindow.ui:176 +msgid "Exit" +msgstr "" + +#: ../ui/tcosmonitor-staticwindow.ui:8 +msgid "Static hosts list" +msgstr "" + +#: ../ui/tcosmonitor-staticwindow.ui:17 +msgid "<span size=\"x-large\">Static Hosts list</span>" +msgstr "" + +#: ../ui/tcosmonitor-staticwindow.ui:80 +msgid "Add" +msgstr "" + +#: ../ui/tcosmonitor-staticwindow.ui:128 +msgid "Modify" +msgstr "" + +#: ../ui/tcosmonitor-staticwindow.ui:176 +msgid "Delete" +msgstr "" + +#: ../ui/tcosmonitor-staticwindow.ui:225 +msgid "Get from connected" +msgstr "" + +#: ../ui/tcosmonitor-staticwindow.ui:292 ../ui/tcosmonitor-mainwindow.ui:771 +#: ../ui/tcosmonitor-staticwindownew.ui:150 +msgid "Cancel" +msgstr "" + +#: ../ui/tcosmonitor-staticwindow.ui:340 +#: ../ui/tcosmonitor-staticwindownew.ui:198 +msgid "Save" +msgstr "" + +#: ../ui/tcospersonalize.ui:34 +msgid "<b>unknow host</b>" +msgstr "" + +#: ../ui/tcospersonalize.ui:74 +msgid "Disable Ctrl + Alt + Backspace (for kill Xorg)" +msgstr "" + +#: ../ui/tcospersonalize.ui:211 +msgid "Get avalaible drivers" +msgstr "" + +#: ../ui/tcospersonalize.ui:248 +msgid "Display Settings" +msgstr "" + +#: ../ui/tcospersonalize.ui:351 +msgid "Default boot kernel" +msgstr "" + +#: ../ui/tcospersonalize.ui:376 +msgid "<b>PXE Boot options</b>" +msgstr "" + +#: ../ui/tcospersonalize.ui:391 +msgid "Default boot method" +msgstr "" + +#: ../ui/tcospersonalize.ui:419 +msgid "Command line" +msgstr "" + +#: ../ui/tcospersonalize.ui:507 +msgid "Boot options" +msgstr "" + +#: ../ui/tcospersonalize.ui:551 +msgid "Delete Config" +msgstr "" + +#: ../ui/tcosmonitor-mainwindow.ui:8 +msgid "TcosMonitor" +msgstr "" + +#: ../ui/tcosmonitor-mainwindow.ui:22 +msgid "Exit TcosMonitor" +msgstr "" + +#: ../ui/tcosmonitor-mainwindow.ui:35 +msgid "Open preferences dialog" +msgstr "" + +#: ../ui/tcosmonitor-mainwindow.ui:48 +msgid "Update host list" +msgstr "" + +#: ../ui/tcosmonitor-mainwindow.ui:49 +msgid "Refresh" +msgstr "" + +#: ../ui/tcosmonitor-mainwindow.ui:71 +msgid "All Hosts" +msgstr "" + +#: ../ui/tcosmonitor-mainwindow.ui:99 +msgid "Find" +msgstr "" + +#: ../ui/tcosmonitor-mainwindow.ui:111 +msgid "About this app" +msgstr "" + +#: ../ui/tcosmonitor-mainwindow.ui:219 +msgid "Start audio chat" +msgstr "" + +#: ../ui/tcosmonitor-mainwindow.ui:331 +msgid "Send audio/video" +msgstr "" + +#: ../ui/tcosmonitor-mainwindow.ui:443 +msgid "Exe app" +msgstr "" + +#: ../ui/tcosmonitor-mainwindow.ui:499 +msgid "Send message" +msgstr "" + +#: ../ui/tcosmonitor-mainwindow.ui:581 +msgid "List view" +msgstr "" + +#: ../ui/tcosmonitor-mainwindow.ui:629 +msgid "Icon view" +msgstr "" + +#: ../ui/tcosmonitor-mainwindow.ui:689 +msgid "Simulate my classroom" +msgstr "" + +#: ../ui/tcosmonitor-staticwindownew.ui:8 +msgid "New or edit hosts" +msgstr "" + +#: ../ui/tcosmonitor-staticwindownew.ui:32 +msgid "" +"You can add a simple host, \n" +" example: <b>192.168.0.100</b>\n" +"\n" +"or range of hosts, \n" +" example: <b>192.168.0.100-120</b>\n" +"\n" +"MAC address is optional" +msgstr "" + +#: ../ui/tcosmonitor-staticwindownew.ui:57 +msgid "IP address *" +msgstr "" + +#: ../ui/tcosmonitor-askwindow.ui:8 +msgid "Question" +msgstr "" + +#: ../ui/tcosmonitor-askwindow.ui:50 +msgid "You can drag and drop launcher file to this box" +msgstr "" + +#: ../ui/tcosmonitor-askwindow.ui:61 +msgid "<b>Run app in unknow host</b>" +msgstr "" diff --git a/pylint.rc b/pylint.rc new file mode 100644 index 0000000..59c4f98 --- /dev/null +++ b/pylint.rc @@ -0,0 +1,318 @@ +# lint Python modules using external checkers. +# +# This is the main checker controling the other ones and the reports +# generation. It is itself both a raw checker and an astng checker in order +# to: +# * handle message activation / deactivation at the module level +# * handle some basic but necessary stats'data (number of classes, methods...) +# +[MASTER] + +# Specify a configuration file. +#rcfile= + +# Python code to execute, usually for sys.path manipulation such as +# pygtk.require(). +#init-hook= + +# Profiled execution. +profile=no + +# Add <file or directory> to the black list. It should be a base name, not a +# path. You may set this option multiple times. +ignore=CVS + +# Pickle collected data for later comparisons. +persistent=yes + +# Set the cache size for astng objects. +cache-size=500 + +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. +load-plugins= + + +[MESSAGES CONTROL] + +# Enable only checker(s) with the given id(s). This option conflicts with the +# disable-checker option +#enable-checker= + +# Enable all checker(s) except those with the given id(s). This option +# conflicts with the enable-checker option +#disable-checker= + +# Enable all messages in the listed categories. +#enable-msg-cat= + +# Disable all messages in the listed categories. +#disable-msg-cat= + +# Enable the message(s) with the given id(s). +#enable-msg= + +# Disable the message(s) with the given id(s). +disable-msg=C0322,C0111,C0103,C0301,W0703,W0613,W0612,W0201,R0201,W0622,R0902,R0913,R0904 +#C0301,C0302 +#W0703: Catch "Exception" +#W0613:Unused argument 'data' +#W0612: Unused variable 'spass' +#W0201:Attribute 'ask_mode' defined outside __init__ +#R0201:Method could be a function +#W0622:Redefining built-in 'iter' +#R0902:Too many instance attributes +#R0913:Too many arguments +#R0904:Too many public methods + +[REPORTS] + +# set the output format. Available formats are text, parseable, colorized, msvs +# (visual studio) and html +output-format=colorized + +# Include message's id in output +include-ids=yes + +# Put messages in a separate file for each module / package specified on the +# command line instead of printing them on stdout. Reports (if any) will be +# written in a file name "pylint_global.[txt|html]". +files-output=no + +# Tells wether to display a full report or only the messages +reports=yes + +# Python expression which should return a note less than 10 (10 is the highest +# note).You have access to the variables errors warning, statement which +# respectivly contain the number of errors / warnings messages and the total +# number of statements analyzed. This is used by the global evaluation report +# (R0004). +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) + +# Add a comment according to your evaluation note. This is used by the global +# evaluation report (R0004). +comment=yes + +# Enable the report(s) with the given id(s). +#enable-report= + +# Disable the report(s) with the given id(s). +#disable-report= + + +# checks for : +# * doc strings +# * modules / classes / functions / methods / arguments / variables name +# * number of arguments, local variables, branchs, returns and statements in +# functions, methods +# * required module attributes +# * dangerous default values as arguments +# * redefinition of function / method / class +# * uses of the global statement +# +[BASIC] + +# Required attributes for module, separated by a comma +required-attributes= + +# Regular expression which should only match functions or classes name which do +# not require a docstring +no-docstring-rgx=__.*__ + +# Regular expression which should only match correct module names +module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Regular expression which should only match correct module level names +const-rgx=(([A-Z_][A-Z1-9_]*)|(__.*__))$ + +# Regular expression which should only match correct class names +class-rgx=[A-Z_][a-zA-Z0-9]+$ + +# Regular expression which should only match correct function names +function-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct method names +method-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct instance attribute names +attr-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct argument names +argument-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct variable names +variable-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct list comprehension / +# generator expression variable names +inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ + +# Good variable names which should always be accepted, separated by a comma +good-names=i,j,k,ex,Run,_ + +# Bad variable names which should always be refused, separated by a comma +bad-names=foo,bar,baz,toto,tutu,tata + +# List of builtins function names that should not be used, separated by a comma +bad-functions=map,filter,apply,input + + +# try to find bugs in the code using type inference +# +[TYPECHECK] + +# Tells wether missing members accessed in mixin class should be ignored. A +# mixin class is detected if its name ends with "mixin" (case insensitive). +ignore-mixin-members=yes + +# List of classes names for which member attributes should not be checked +# (useful for classes with attributes dynamicaly set). +ignored-classes=SQLObject + +# When zope mode is activated, consider the acquired-members option to ignore +# access to some undefined attributes. +zope=no + +# List of members which are usually get through zope's acquisition mecanism and +# so shouldn't trigger E0201 when accessed (need zope=yes to be considered). +acquired-members=REQUEST,acl_users,aq_parent + + +# checks for +# * unused variables / imports +# * undefined variables +# * redefinition of variable from builtins or from an outer scope +# * use of variable before assigment +# +[VARIABLES] + +# Tells wether we should check for unused import in __init__ files. +init-import=yes + +# A regular expression matching names used for dummy variables (i.e. not used). +dummy-variables-rgx=_|dummy + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid to define new builtins when possible. +additional-builtins= + + +# checks for : +# * methods without self as first argument +# * overridden methods signature +# * access only to existant members via self +# * attributes not defined in the __init__ method +# * supported interfaces implementation +# * unreachable code +# +[CLASSES] + +# List of interface methods to ignore, separated by a comma. This is used for +# instance to not check methods defines in Zope's Interface base class. +ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__,__new__,setUp + + +# checks for +# * external modules dependencies +# * relative / wildcard imports +# * cyclic imports +# * uses of deprecated modules +# +[IMPORTS] + +# Deprecated modules which should not be used, separated by a comma +deprecated-modules=regsub,string,TERMIOS,Bastion,rexec + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report R0402 must not be disabled) +import-graph= + +# Create a graph of external dependencies in the given file (report R0402 must +# not be disabled) +ext-import-graph= + +# Create a graph of internal dependencies in the given file (report R0402 must +# not be disabled) +int-import-graph= + + +# checks for sign of poor/misdesign: +# * number of methods, attributes, local variables... +# * size, complexity of functions, methods +# +[DESIGN] + +# Maximum number of arguments for function / method +max-args=5 + +# Maximum number of locals for function / method body +max-locals=30 + +# Maximum number of return / yield for function / method body +max-returns=6 + +# Maximum number of branch for function / method body +max-branchs=12 + +# Maximum number of statements in function / method body +max-statements=100 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of attributes for a class (see R0902). +max-attributes=7 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=2 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=20 + + +# checks for : +# * unauthorized constructions +# * strict indentation +# * line length +# * use of <> instead of != +# +[FORMAT] + +# Maximum number of characters on a single line. +max-line-length=120 + +# Maximum number of lines in a module +max-module-lines=1000 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + + +# checks for: +# * warning notes in the code like FIXME, XXX +# * PEP 263: source code with non ascii character but no encoding declaration +# +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=FIXME,XXX,TODO + + +# checks for similarities and duplicated code. This computation may be +# memory / CPU intensive, so you should disable it if you experiments some +# problems. +# +[SIMILARITIES] + +# Minimum lines number of a similarity. +min-similarity-lines=4 + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes diff --git a/server-utils/tcos-server-utils.py b/server-utils/tcos-server-utils.py new file mode 100755 index 0000000..49d7df9 --- /dev/null +++ b/server-utils/tcos-server-utils.py @@ -0,0 +1,196 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- +# +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +import os, sys +import getopt +from gettext import gettext as _ + + + +if os.geteuid() != 0: + print "tcos-server-utils ERROR: you must be root to run this" + sys.exit(1) + +# append current dir to sys-path if exec from sources +for m in range(len(sys.path)): + if "server-utils" in sys.path[m]: + sys.path[m]=os.path.dirname(sys.path[m]) + +from tcosmonitor import shared + + +def print_debug(txt): + if shared.debug: + print "%s::%s" %("tcos-server-utils", txt) + + + +shared.from_cron=False +actions=["reboot", "poweroff", "restartx", "message", "nothing"] +action = "" +text="" +users="" + +def usage(): + print "tcos-server-utils help:" + print "" + print " tcos-server-utils --action=XXX (action must be: %s ) " %(", ".join(actions) ) + print " (use --action=nothing to test with doing nothing!!!)" + print " tcos-server-utils --text=\"foo\" (if action=message this text will be displayed " + print " in all connected users with notification-daemon)" + print " --users=foo,bar (coma separated list of users we want to do action" + print " only valid for --action=message)" + print " tcos-server-utils -d [--debug] (write debug data to stdout)" + print " tcos-server-utils -h [--help] (this help)" + + +try: + opts, args = getopt.getopt(sys.argv[1:], ":hd", ["help", "cron", "debug", "action=", "text=", "users="]) +except getopt.error, msg: + print msg + print "for command line options use tcos-server-utils --help" + sys.exit(2) + + + +# process options +for o, a in opts: + if o in ("--help"): + usage() + sys.exit(0) + + if o in ("-d", "--debug"): + shared.debug = True + if o in ("--cron"): + shared.from_cron=True + if o == "--action": + if not a in actions: + print "TCOS tcos-server-utils ERROR: action \"%s\" not avalaible" %(a) + sys.exit(1) + action = a + if o == "--text": + text=a + if o == "--users": + users=a + + +if action=="": + print "tcos-server-utils ERROR: action must be in: %s" %(", ".join(actions) ) + sys.exit(0) + + +class ServerUtils: + def __init__(self): + self.name="ServerUtils" + self.worker_running = False + + # get all devices + import tcosmonitor.TcosCommon + import tcosmonitor.TcosXmlRpc + import tcosmonitor.TcosConf + self.common=tcosmonitor.TcosCommon.TcosCommon(self) + self.config=tcosmonitor.TcosConf.TcosConf(self) + self.xmlrpc=tcosmonitor.TcosXmlRpc.TcosXmlRpc(self) + + + if self.config.GetVar("xmlrpc_username") == "" or self.config.GetVar("xmlrpc_password") == "": + print "tcos-server-utils ERROR: need to create /root/.tcosmonitor.conf with user and pass." + print " see /usr/share/doc/tcosmonitor/README.tcos-server-utils" + sys.exit(1) + + import tcosmonitor.LocalData + self.localdata=tcosmonitor.LocalData.LocalData(self) + + self.alltcosclients=[] + self.allclients=self.localdata.GetAllClients("netstat") + + if len(self.allclients) == 0: + print "tcos-server-utils No host connected, exiting..." + sys.exit(0) + + for host in self.allclients: + self.xmlrpc.newhost(host) + if self.xmlrpc.connected: + print_debug ("Host %s connected" %(host) ) + self.alltcosclients.append(host) + else: + print_debug ("Host %s NOT connected" %(host) ) + + + print ("Doing action \"%s\" in %s" %(action, self.alltcosclients) ) + + if action == "message": + if text != "": + print ( "Searching for all connected users..." ) + + connected_users=[] + #connected_users=['magna26'] + if users != "": + connected_users = users.split(',') + print "Users from cdmline: %s" %(connected_users) + else: + + for client in self.alltcosclients: + if self.localdata.IsLogged(client): + connected_users.append(self.localdata.GetUsername(client)) + + print ( "Connected users: %s" %connected_users) + + from tcosmonitor.TcosDBus import TcosDBusAction + self.dbus_action=TcosDBusAction( self, \ + admin=self.config.GetVar("xmlrpc_username"), \ + passwd=self.config.GetVar("xmlrpc_password") ) + + result=self.dbus_action.do_message ( connected_users, text ) + if not result: + print "ERROR: sending dbus msg: %s" %(self.dbus_action.get_error_msg() ) + else: + print "DBus message send ok." + + else: + print ( "ERROR: message action need a --text value" ) + + + for client in self.alltcosclients: + if action == "reboot": + print ( "Restarting %s..." %client ) + self.xmlrpc.newhost(client) + self.xmlrpc.Exe("reboot") + elif action == "poweroff": + print ( "Shutting down %s..." %client ) + self.xmlrpc.newhost(client) + self.xmlrpc.Exe("poweroff") + elif action == "restartx": + print ( "Restarting Xorg of %s..." %client ) + self.xmlrpc.newhost(client) + self.xmlrpc.Exe("restartx") + elif action == "message": + pass + else: + print ( "Unknow action %s in client %s" %(action, client) ) + + + +if __name__ == "__main__": + app=ServerUtils() + diff --git a/setup.py b/setup.py new file mode 100755 index 0000000..36ef34e --- /dev/null +++ b/setup.py @@ -0,0 +1,125 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- +# +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# This script is inspired by the debian package python-chardet +import os +import glob +from distutils.core import setup +from distutils.command.build import build +from distutils.command.install_data import install_data as install_data + + +data_files = [] + +import sys + +def get_debian_version(): + f=open('debian/changelog', 'r') + line=f.readline() + f.close() + version=line.split()[1].replace('(','').replace(')','') + return version + +class build_locales(build): + def run(self): + os.system("cd po && make") + + # parse __VERSION__ in build_scripts + for pyfile in glob.glob( "%s/*.py" %self.build_scripts): + process_version(pyfile) + + libdir=self.build_lib + '/tcosmonitor' + for pyfile in glob.glob( "%s/*.py" %libdir): + process_version(pyfile) + + extdir=libdir+'/extensions' + for pyfile in glob.glob( "%s/*.py" %extdir): + process_version(pyfile) + + build.run(self) + +class tcosmonitor_install_data(install_data): + def run(self): + install_data.run(self) + + # rename scripts (delete .py extension) + for pyfile in glob.glob(self.install_dir + '/bin/*.py'): + new=pyfile.split('.py')[0] + print(" * Renaming %s => %s" %(pyfile, new ) ) + os.rename( pyfile, new ) + + +def process_version(pyfile): + version=get_debian_version() + print("sed -i -e 's/__VERSION__/%s/g' %s" %(version, pyfile) ) + os.system("sed -i -e 's/__VERSION__/%s/g' %s" %(version, pyfile) ) + +for (path, dirs, files) in os.walk("po"): + if "tcosmonitor.mo" in files: + target = path.replace("po", "share/locale", 1) + data_files.append((target, [os.path.join(path, "tcosmonitor.mo")])) + +def get_files(ipath): + files = [] + for afile in glob.glob('%s/*'%(ipath) ): + if os.path.isfile(afile): + files.append(afile) + return files + +# images (menus and buttons) +data_files.append(('share/tcosmonitor/images', get_files("images") )) +data_files.append(('share/pixmaps', ['images/tcos-icon-32x32.png'] )) + +# Interface files +data_files.append(('share/tcosmonitor/ui', get_files("ui") )) + + +# config files and Xsession.d launcher +data_files.append( ('/etc/tcos', ['tcosmonitor.conf']) ) +data_files.append( ('/etc/tcos', ['tcos-devices-ng.conf']) ) +data_files.append( ('/etc/X11/Xsession.d', ['dbus/81tcos-utils']) ) + + +# Desktop files +data_files.append( ('share/applications/', ['tcosmonitor.desktop', + 'tcospersonalize.desktop', + 'tcos-volume-manager.desktop']) ) + + +setup(name='TcosMonitor', + description = 'Thin Client Manager for teachers', + version=get_debian_version(), + author = 'Mario Izquierdo', + author_email = 'mariodebian@gmail.com', + url = 'http://www.tcosproject.org', + license = 'GPLv2', + platforms = ['linux'], + keywords = ['thin client', 'teacher monitor', 'ltsp'], + packages=['tcosmonitor', 'tcosmonitor.extensions'], + package_dir = {'':''}, + scripts=['tcosmonitor.py', 'tcos-volume-manager.py', 'tcos-devices-ng.py', + 'tcospersonalize.py', 'dbus/tcos-dbus-client.py', + 'server-utils/tcos-server-utils.py'], + cmdclass = {'build': build_locales, 'install_data' : tcosmonitor_install_data}, + data_files=data_files + ) + diff --git a/tcos-devices-ng.conf b/tcos-devices-ng.conf new file mode 100644 index 0000000..313767c --- /dev/null +++ b/tcos-devices-ng.conf @@ -0,0 +1,35 @@ +# here you can disable some tcos-devices-ng parts +# to all users +# +# this settings are more important than ~/.tcos-devices-ng.py +# + +# disable floppy +#disable_floppy=1 + +#disable all cdroms +#disable_cdroms=1 + +#disable hard disk partitions +#disable_hdd=1 + +# disable quit item +#disable_quit=1 + +# can change mount point too +# +# DON'T use spaces or any other char (only letters and numbers) +# +#hdc=myCdReader +#hdd=cdWriter +#hda1=winData +#hda2=debianData + + +# enable reboot and poweroff +enable_reboot_poweroff=1 + +# Timeout to reboot or poweroff +#reboot_poweroff_timeout=10 + + diff --git a/tcos-devices-ng.py b/tcos-devices-ng.py new file mode 100755 index 0000000..580a858 --- /dev/null +++ b/tcos-devices-ng.py @@ -0,0 +1,1464 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +import os, sys +import gobject +import getopt +from gettext import gettext as _ +import time +import socket + + +CONF_FILE="~/.tcos-devices-ng.conf" +ALL_CONF_FILE="/etc/tcos/tcos-devices-ng.conf" + + +import pygtk +pygtk.require('2.0') +import gtk + +from tcosmonitor import shared +# check for local DISPLAY +remotehost=display="" +if "DISPLAY" in os.environ and os.environ['DISPLAY'] != '': + remotehost=str(shared.parseIPAddress(os.environ["DISPLAY"])) + +action = "" + +if remotehost == "": + print ("tcos-devices-ng: Not allowed to run in local DISPLAY") + sys.exit(0) + +# load conf file and exit if not active +if not shared.test_start("tcos-devices-ng") : + print ("tcos-devices-ng disabled at %s" % (shared.module_conf_file)) + sys.exit(1) + + +from tcosmonitor.TcosTrayIcon2 import TcosTrayIcon +import threading + +import pynotify +import pwd + +# tell gtk we use threads +gtk.gdk.threads_init() + + + + +def usage(): + print ("tcos-devices-ng help:") + print ("") + print (" tcos-devices-ng -d [--debug] (write debug data to stdout)") + print (" tcos-devices-ng -h [--help] (this help)") + +try: + opts, args = getopt.getopt(sys.argv[1:], ":hd", ["help", "debug" ]) +except getopt.error, msg: + print (msg) + print ("for command line options use tcos-devices-ng --help") + sys.exit(2) + + +# process options +for o, a in opts: + if o in ("-d", "--debug"): + shared.debug = True + if o in ("-h", "--help"): + usage() + sys.exit() + + + + + + +def log( message ): + print ( "%d %s" % (os.getpid(), message) ) + +def print_debug(txt): + if shared.debug: + print >>sys.stderr, "%d %s::%s" % (os.getpid(), "tcos-devices-ng", txt) + #print("%d %s::%s" % (os.getpid(), "tcos-devices-ng", txt), file=sys.stderr) + + + + +class TcosDevicesNG: + def __init__(self): + self.host=None + self.hostname=None + self.name="TcosDevicesNG" + self.mounted={} + self.mntconf={} + self.username=None + self.loadconf(CONF_FILE) + self.loadconf(ALL_CONF_FILE) + + ######## Create icon ############# + disable_quit=self.mntconf.has_key("disable_quit") and self.mntconf['disable_quit'] == "1" + enable_reboot_and_poweroff=self.mntconf.has_key("enable_reboot_poweroff") and self.mntconf['enable_reboot_poweroff'] == "1" + self.systray=TcosTrayIcon(disable_quit=disable_quit, allow_reboot_poweroff=enable_reboot_and_poweroff) + + + self.systray.status=True + + self.initremote() + self.desktop=self.get_desktop() + + ######## read floppys ############# + if self.mntconf.has_key("disable_floppy") and self.mntconf['disable_floppy'] == "1" : + print_debug("__init__() floppy disabled from CONF_FILE") + else: + self.getremote_floppy() + + ######## read cdroms ############# + if self.mntconf.has_key("disable_cdroms") and self.mntconf['disable_cdroms'] == "1" : + print_debug("__init__() cdroms disabled from CONF_FILE") + else: + self.getremote_cdroms() + + ######## read hard disk ############# + if self.mntconf.has_key("disable_hdd") and self.mntconf['disable_hdd'] == "1" : + print_debug("__init__() hdd disabled from CONF_FILE") + else: + self.getremote_hdd() + + self.quitting=False + + # register quit event + if not disable_quit: + self.systray.register_action("quit", lambda w: self.exit() ) + + # register reboot and poweroff + if enable_reboot_and_poweroff: + self.systray.register_action("reboot", self.menu_remote_reboot_poweroff, 'reboot' ) + self.systray.register_action("poweroff", self.menu_remote_reboot_poweroff, 'poweroff' ) + + self.udev_events={ + "insert": {"ID_BUS": "usb", "ACTION":"add"}, + "remove": {"ID_BUS": "usb", "ACTION":"remove"}, + "insert-firewire":{"ID_BUS": "ieee1394", "ACTION":"add"}, + "remove-firewire":{"ID_BUS": "ieee1394", "ACTION":"remove"}, + "mount-floppy": {"DEVPATH": "/block/fd0", "ACTION":"mount"}, + "umount-floppy": {"DEVPATH": "/block/fd0", "ACTION":"umount"}, + "mount-cdrom": {"DEVPATH": "/block/hd*", "ACTION":"mount"}, + "umount-cdrom": {"DEVPATH": "/block/hd*", "ACTION":"umount"}, + "mount-flash": {"DEVPATH": "/block/sd*", "ACTION":"mount"}, + "umount-flash": {"DEVPATH": "/block/sd*", "ACTION":"umount"}, + "newcdrom": {"ID_FS_TYPE":"iso9660", "ACTION":"add"} + } + + def menu_remote_reboot_poweroff(self, *args): + try: + action=args[0][0] + except Exception, err: + print_debug("menu_remote_reboot_poweroff() Exception, error=%s"%err) + return + remote_hostname=self.xauth.get_hostname() + xauth_cookie=self.xauth.get_cookie() + if self.mntconf.has_key("reboot_poweroff_timeout"): + timeout=self.mntconf['reboot_poweroff_timeout'] + else: + timeout="5" + + if action == "reboot": + self.show_notification( _("Rebooting in %s seconds") %(timeout) ) + elif action == "poweroff": + self.show_notification( _("Shutting down in %s seconds") %(timeout) ) + else: + # unknow signal + return + print_debug("remote_reboot_poweroff() action=%s, remote_hostname=%s, xauth_cookie=%s"%(action, remote_hostname, xauth_cookie)) + cmd=threading.Thread(target=self.remote_reboot_poweroff, args=[action, timeout, xauth_cookie, remote_hostname] ) + cmd.start() + return + + def remote_reboot_poweroff(self, action, timeout, xauth_cookie, remote_hostname): + print_debug("remote_reboot_poweroff() waiting %s seconds"%timeout) + #time.sleep(int(timeout)) + try: + result=self.xmlrpc.tc.tcos.rebootpoweroff( action, timeout, xauth_cookie, remote_hostname) + print_debug("remote_reboot_poweroff() result=%s"%result.strip()) + if result.startswith("error"): + self.show_notification( _("ERROR during action %(action)s:\n%(errortxt)s") %{"action":action, "errortxt":result.replace('error: ','')} ) + except Exception, err: + print_debug("remote_reboot_poweroff() Exception: %s"%err) + self.show_notification( _("ERROR during action %(action)s:\n%(errortxt)s") %{"action":action, "errortxt":err} ) + return + + def loadconf(self, conffile): + print_debug ( "loadconf() __init__ conffile=%s" %conffile ) + conf=os.path.expanduser(conffile) + if os.path.isfile(conf): + print_debug ("loadconf() found conf file %s" %conf) + f=open(conf, "r") + data=f.readlines() + f.close() + for line in data: + if line == '\n': continue + if line.find('#') == 0: continue + line=line.replace('\n', '') + if "=" in line: + try: + self.mntconf["%s"%line.split('=')[0]] = line.split('=')[1] + except Exception, err: + print_debug("loadconf() Exception, error=%s"%err) + pass + print_debug( "loadconf mntconf=%s" %self.mntconf ) + return + + def show_notification(self, msg, urgency=pynotify.URGENCY_CRITICAL, timeout=20000): + pynotify.init("tcos-devices-ng") + if os.path.isfile("/usr/share/pixmaps/tcos-icon-32x32-custom.png"): + image_uri="file://usr/share/pixmaps/tcos-icon-32x32-custom.png" + else: + image_uri="file://" + os.path.abspath(shared.IMG_DIR) + "/tcos-devices-32x32.png" + n = pynotify.Notification( _("Tcos device daemon") , msg, image_uri ) + n.set_urgency(urgency) + # don't attach to status icon with multiple notifications + #if hasattr(pynotify.Notification, 'attach_to_status_icon'): + # n.attach_to_status_icon(self.systray.statusIcon) + n.set_category("device") + n.set_timeout(timeout) # 15 sec + if not n.show(): + print_debug ("show_notification() Failed to send notification") + + + def initremote(self): + # get all devices + import tcosmonitor.TcosXmlRpc + import tcosmonitor.TcosConf + import tcosmonitor.TcosCommon + import tcosmonitor.TcosXauth + + self.xauth=tcosmonitor.TcosXauth.TcosXauth(self) + self.xauth.init_standalone() + + self.common=tcosmonitor.TcosCommon.TcosCommon(self) + print_debug ( "loading config class..." ) + + self.config=tcosmonitor.TcosConf.TcosConf(self, openfile=False) + self.xmlrpc=tcosmonitor.TcosXmlRpc.TcosXmlRpc(self) + + self.username=self.common.get_username() + self.host=self.common.get_display(ip_mode=True) + self.hostname=self.common.get_display(ip_mode=False) + + print_debug("initremote() username=%s host=%s hostname=%s"%(self.username, self.host, self.hostname)) + + if not self.common.user_in_group("fuse"): + print ("tcos-devices-ng: ERROR: User not in group fuse") + shared.error_msg(_("TCOS_DEVICES: Your user is not in group fuse and you can not use USB devices. Please contact with your administrator.")) + sys.exit(1) + nossl=True + # make a test and exit if no cookie match + if not self.xauth.test_auth(nossl): + print ("tcos-devices-ng: ERROR: Xauth cookie don't match") + sys.exit(1) + + self.xmlrpc.newhost(self.host, nossl) + if not self.xmlrpc.connected: + print ( _("Error connecting with TcosXmlRpc in %s.") %(self.host) ) + sys.exit(1) + + # check for enabled devices + disable_usb=self.xmlrpc.IsEnabled("TCOS_DISABLE_USB") + disable_ide=self.xmlrpc.IsEnabled("TCOS_DISABLE_IDE") + if disable_usb or disable_ide: + print ("tcos-devices-ng: TCOS_DISABLE_USB or TCOS_DISABLE_IDE enabled, exiting...") + sys.exit(0) + + def get_desktop_path(self): + try: + desktop=self.common.exe_cmd("/usr/lib/tcos/get-xdg-desktop", verbose=1, background=False, lines=0, cthreads=0) + except: + desktop=os.path.expanduser("~/") + if not os.path.isdir(desktop): + desktop=os.path.expanduser("~/") + return desktop + + def getremote_cdroms(self): + self.cdrom_devices=self.xmlrpc.GetDevicesInfo(device="", mode="--getcdrom").split('|') + self.cdrom_devices=self.cdrom_devices[0:-1] + print_debug ( "get_data() cdroms=%s" %(self.cdrom_devices) ) + for cdrom in self.cdrom_devices: + # get device status + cdrom_status= self.xmlrpc.GetDevicesInfo(device="/dev/%s" %cdrom, mode="--getstatus") + if cdrom_status == "0": + mount=True + umount=False + else: + mount=False + umount=True + cdrom_desc = self.xmlrpc.GetDevicesInfo(device="/dev/%s" %cdrom, mode="--getid") + self.systray.register_device("cdrom_%s"%cdrom, + _("Cdrom device %s" ) %cdrom, + "cdrom.png", True, + { + "cdrom_%s_mount" %cdrom: [ _("Mount Cdrom"), "cdrom_mount.png", mount, None, "/dev/%s"%cdrom], + "cdrom_%s_umount"%cdrom: [ _("Umount Cdrom"), "cdrom_umount.png", umount, None, "/dev/%s"%cdrom] + }, + "/dev/%s"%(cdrom), + cdrom_desc) + self.systray.register_action("cdrom_%s_mount" %cdrom, self.cdrom, "mount", cdrom ) + self.systray.register_action("cdrom_%s_umount" %cdrom, self.cdrom, "umount", cdrom ) + + def getremote_hdd(self): + self.hdd_devices=self.xmlrpc.GetDevicesInfo(device="", mode="--gethdd").split('|') + self.hdd_devices=self.hdd_devices[0:-1] + print_debug ( "getremote_hdd() hdd=%s" %(self.hdd_devices) ) + for hdd in self.hdd_devices: + # get device status + hdd_status= self.xmlrpc.GetDevicesInfo(device="/dev/%s" %hdd, mode="--getstatus") + if hdd_status == "0": + mount=True + umount=False + else: + mount=False + umount=True + hdd_desc = self.xmlrpc.GetDevicesInfo(device="/dev/%s" %hdd[0:3], mode="--getid") + self.systray.register_device("hdd_%s"%hdd, + _("Disk partition %s") %hdd, + "hdd_mount.png", True, + { + "hdd_%s_mount" %hdd: [ _("Mount disk partition"), "hdd_mount.png", mount, None, "/dev/%s"%hdd], + "hdd_%s_umount"%hdd: [ _("Umount disk partition"), "hdd_umount.png", umount, None, "/dev/%s"%hdd] + }, + "/dev/%s"%(hdd), + hdd_desc) + self.systray.register_action("hdd_%s_mount" %hdd, self.hdd, "mount", hdd ) + self.systray.register_action("hdd_%s_umount" %hdd, self.hdd, "umount", hdd ) + + + + def getremote_floppy(self): + have_floppy=self.xmlrpc.GetDevicesInfo(device="/dev/fd0", mode="--exists") + if have_floppy == "0": + print_debug ( _("No floppy detected") ) + return + floppy_status=self.xmlrpc.GetDevicesInfo(device="/dev/fd0", mode="--getstatus") + if floppy_status == "0": + mount=True + n=1 + self.systray.status=False + else: + mount=False + n=2 + self.systray.status=True + self.systray.register_device("floppy", + _("Floppy"), + "floppy%s.png"%n, True, + { + "floppy_mount": [ _("Mount Floppy"), "floppy_mount.png", mount, None, "/dev/fd0"], + "floppy_umount": [ _("Umount Floppy"), "floppy_umount.png", not mount, None, "/dev/fd0"] + }, + "/dev/fd0") + self.systray.register_action("floppy_mount" , self.floppy, "mount" ) + self.systray.register_action("floppy_umount" , self.floppy, "umount" ) + return + + def update_floppy(self, *args): + if len(args) > 0: + if args[0] == "mount": + self.show_notification ( _("Floppy mounted. Ready for use.") ) + elif args[0] == "umount": + self.show_notification ( _("Floppy umounted. You can extract it.") ) + floppy_status=self.xmlrpc.GetDevicesInfo(device="/dev/fd0", mode="--getstatus") + if floppy_status == "0": + ismounted=False + n=1 + else: + ismounted=True + n=2 + print_debug ("update_floppy() floppy ismounted=%s" %ismounted) + self.systray.items["floppy"][1]="floppy%s.png"%n + self.systray.update_status("floppy", "floppy_mount", not ismounted) + self.systray.update_status("floppy", "floppy_umount", ismounted) + + def update_hdd(self, *args): + if len(args) > 0: + if args[0] == "mount": + self.show_notification ( _("Hard disk partition mounted. Ready for use.") ) + return + elif args[0] == "umount": + self.show_notification ( _("Hard disk partition umounted.") ) + return + else: + dev=args[0] + hdd_status=self.xmlrpc.GetDevicesInfo(device="/dev/%s"%dev, mode="--getstatus") + if hdd_status == "0": + ismounted=False + n=1 + else: + ismounted=True + n=2 + print_debug ("update_hdd() hdd ismounted=%s" %ismounted) + self.systray.update_status("hdd_%s"%dev, "hdd_%s_mount"%dev, not ismounted) + self.systray.update_status("hdd_%s"%dev, "hdd_%s_umount"%dev, ismounted) + + + + def update_cdrom(self, dev, action=None): + if action == "mount" or action == "umount": + devtype=self.xmlrpc.GetDevicesInfo(device=dev, mode="--cdaudio") + if action == "mount": + if devtype == "1": + self.show_notification ( _("Audio cdrom mounted., you can listen music opening wav files.") ) + else: + self.show_notification ( _("Cdrom mounted. Ready for use.") ) + return + elif action == "umount": + self.show_notification ( _("Cdrom umounted. You can extract it.") ) + return + + cdrom_status=self.xmlrpc.GetDevicesInfo(device="/dev/%s"%dev, mode="--getstatus") + if cdrom_status == "0": + ismounted=False + n=1 + else: + ismounted=True + n=2 + print_debug ("update_cdrom() cdrom ismounted=%s" %ismounted) + self.systray.update_status("cdrom_%s"%dev, "cdrom_%s_mount"%dev, not ismounted) + self.systray.update_status("cdrom_%s"%dev, "cdrom_%s_umount"%dev, ismounted) + + + def udev_daemon(self): + start1=time.time() + print_debug ("udev_daemon() starting...") + udev=self.xmlrpc.GetDevicesInfo(device="", mode="--getudev").split('|') + print_debug("udev_daemon GetDevicesInfo time=%f" %(time.time() - start1) ) + if "error" in " ".join(udev): return + udev=udev[:-1] + if len(udev) < 1 or udev[0] == "unknow": return + udev=self.remove_dupes(udev) + for line in udev: + data={} + tmp=line.split('#') + for i in tmp: + if '=' in i: + data[i.split("=")[0]]=i.split("=")[1] + for event in self.udev_events: + action_found=False + #print_debug ( " UDEV=> checking for event %s" %event ) + # check for all events + for udev_var in self.udev_events[event]: + #print_debug ( " UDEV=> checking for udev_var %s value=%s" %(udev_var, self.udev_events[event]["%s"%udev_var]) ) + if not data.has_key(udev_var): + action_found=False + break + + if "*" in self.udev_events["%s"%event]["%s"%udev_var]: + even=self.udev_events["%s"%event]["%s"%udev_var].replace('*','') + if even in data["%s"%udev_var]: + action_found=True + else: + action_found=False + break + else: + if self.udev_events["%s"%event]["%s"%udev_var] == data["%s"%udev_var]: + action_found=True + else: + action_found=False + break + + if action_found: + self.worker_running=False + worker=shared.Workers(self, target=self.do_udev_event, args=[data], dog=False) + worker.start() + + print_debug("end of udev_daemon time=%f" %(time.time() - start1) ) + return + + + def do_udev_event(self, *args): + data=args[0] + #print_debug ("do_udev_event() data=%s" %data) + if data.has_key("ID_FS_TYPE") and data['ID_FS_TYPE'] == "iso9660": + # newcdrom ADD (mount it) + if data['ACTION'] == "add": + self.cdrom( ('mount', data["DEVPATH"].split("/")[2]), ) + else: + if data['ACTION'] == "mount": + # check if CDROM is automonted before + if self.xmlrpc.GetDevicesInfo(device=data["DEVPATH"], mode="--getstatus") == "1": + return + self.cdrom( (data['ACTION'], data["DEVPATH"].split("/")[2]), ) + + if data.has_key("ID_BUS") and data["ID_BUS"] == "usb": + if data.has_key("DEVPATH") and "/block/sr" in data["DEVPATH"]: + self.cdrom_usb(data) + else: + self.usb(data) + + if data.has_key("ID_BUS") and data["ID_BUS"] == "ieee1394": + self.firewire(data) + + if data.has_key("DEVPATH") and "/block/hd" in data["DEVPATH"]: + if len(data["DEVPATH"].split('/')) > 3: + # we have a hdd + self.update_hdd(data["ACTION"]) + else: + # we have a cdrom + self.update_cdrom("/dev/" + data["DEVPATH"].split("/")[2], action=data["ACTION"]) + + if data.has_key("DEVPATH") and "/block/fd" in data["DEVPATH"]: + self.update_floppy(data["ACTION"]) + + if data.has_key("DEVPATH") and data["ID_BUS"] == "ieee1394" and "/block/sd" in data["DEVPATH"]: + # FIXME SATA devices not detected as HDD + self.update_firewire(data) + elif data.has_key("DEVPATH") and "/block/sd" in data["DEVPATH"]: + self.update_usb(data) + + def mounter_remote(self, device, fstype, mode="--mount"): + print_debug ( "mounter_remote() device=%s fstype=%s" %(device, fstype) ) + if device == None: + return False + mnt_point="/mnt/%s" %(device[5:]) + if mode == "--mount": + # send notification + self.show_notification( _("Mounting device %s\nPlease wait..." ) %(device), urgency=pynotify.URGENCY_NORMAL ) + + print_debug ( "mount_remote() mounting device=%s fstype=%s mnt_point=%s" %(device, fstype, mnt_point) ) + elif mode == "--umount": + print_debug ( "mount_remote() umounting device=%s fstype=%s mnt_point=%s" %(device, fstype, mnt_point) ) + + # set socket timeout bigger (floppy can take some time) + socket.setdefaulttimeout(15) + + if fstype != "vfat": + # if we know that device is vfat dont try to get type again + dtype=self.xmlrpc.GetDevicesInfo(device=device, mode="--gettype") + if dtype == "ntfs-3g" and mode == "--mount": + print_debug ( "mounter_remote() Ummm mounting a NTFS-3G, creating a thread" ) + # create a thread + try: + ntfs_3g=threading.Thread(target=self.xmlrpc.GetDevicesInfo, args=(device,mode) ) + ntfs_3g.start() + return True + except Exception, err: + print_debug("ntfs-3g thread Exception, error=%s"%err) + return True + + # set socket timeout bigger (floppy can take some time) + socket.setdefaulttimeout(15) + + mount=self.xmlrpc.GetDevicesInfo(device=device, mode=mode) + if mount != mnt_point: + print_debug ( "mounter_remote() mount failed, retry with filesystem") + print_debug ( "mounter_remote() FIRST ERROR mount='%s' mnt_point='%s'" %(mount, mnt_point)) + return False + """ + # try to mount with filesystem + mount=self.xmlrpc.GetDevicesInfo(device="%s %s" %(device, fstype), mode=mode) + if mount != mnt_point: + print_debug ("mounter_remote() SECOND ERROR mount='%s' mnt_point='%s'" %(mount, mnt_point)) + return False + """ + print_debug("mounter_remote(device=%s fstype=%s) mount OK"%(device, fstype)) + return True + + def mounter_local(self, local_mount_point, remote_mnt, device="", label="", mode="mount"): + if mode == "mount": + if not os.path.isdir(local_mount_point): + os.mkdir (local_mount_point) + # wait until appear in desktop icon folder + time.sleep(2) + output=self.common.exe_cmd("ltspfs %s:%s %s 2>&1" %(self.host, remote_mnt, local_mount_point), verbose=1, background=False, lines=0, cthreads=0) + if "ERROR" in output: + self.show_notification( _("Error mounting LTSPFS, check versions of LTSPFS packages"), urgency=pynotify.URGENCY_CRITICAL) + return False + + """ + # DISABLED: too late to show notification better in mounter_remote + # send notification + self.show_notification( + _("Mounting device %(device)s in \n%(mnt_point)s\nPlease wait..." )\ + %{"device":device, "mnt_point":local_mount_point}, urgency=pynotify.URGENCY_NORMAL ) + """ + if mode == "umount": + if os.path.isdir(local_mount_point): + print_debug ( "mounter_local() umounting %s" %(local_mount_point) ) + self.common.exe_cmd("fusermount -u %s" %(local_mount_point), verbose=1, background=False, lines=0, cthreads=0 ) + self.common.exe_cmd("fusermount -uz %s 2>/dev/null" %(local_mount_point), verbose=1, background=False, lines=0, cthreads=0 ) + print_debug ( "mounter_local() removing dir %s" %(local_mount_point) ) + try: + os.rmdir(local_mount_point) + except Exception, err: + print_debug("mounter_local(umount %s) Exception, error %s"%(local_mount_point, err)) + + mydevice="" + for dev in self.mounted: + if local_mount_point == self.mounted[dev]: + mydevice=device + + self.show_notification( _("Umounting device %s.\nPlease wait..." ) %(mydevice)\ + , urgency=pynotify.URGENCY_NORMAL ) + return True + + + def get_local_mountpoint(self, data): + desktop=self.get_desktop_path() + + #fslabel=self.get_value(data, "ID_FS_LABEL") + #fsvendor=self.get_value(data, "ID_VENDOR") + if data.has_key("ID_FS_LABEL"): + fslabel=data['ID_FS_LABEL'] + else: + fslabel="" + + if data.has_key("ID_VENDOR"): + fsvendor=data['ID_VENDOR'] + else: + fsvendor="" + + counter=1 + if fslabel != "": + print_debug ( "get_local_mountpoint() have label...." ) + if not os.path.isdir(desktop + "/" + fslabel): + print_debug ( "get_local_mountpoint() %s dir not exists, returning..." %(desktop + "/" + fslabel) ) + return desktop + "/" + fslabel + else: + print_debug ( "get_local_mountpoint() %s dir exists, searching for numbered dirs..." %(desktop + "/" + fslabel) ) + while True: + if not os.path.isdir(desktop + "/" + fslabel + "-" + str(counter) ): + print_debug ( "get_local_mountpoint() %s dir not exists, returning..." %(desktop + "/" + fslabel + "-" + str(counter)) ) + return desktop + "/" + fslabel + "-" + str(counter) + counter+=1 + if fsvendor != "": + print_debug ( "get_local_mountpoint() have vendor not label...." ) + if not os.path.isdir(desktop + "/" + fsvendor): + print_debug ( "get_local_mountpoint() %s dir not exists, returning..." %(desktop + "/" + fsvendor) ) + return desktop + "/" + fsvendor + else: + print_debug ( "get_local_mountpoint() %s dir exists, searching for numbered dirs..." %(desktop + "/" + fsvendor) ) + while True: + if not os.path.isdir(desktop + "/" + fsvendor + "-" + str(counter) ): + print_debug ( "get_local_mountpoint() %s dir not exists, returning..." %(desktop + "/" + fsvendor + "-" + str(counter)) ) + return desktop + "/" + fsvendor + "-" + str(counter) + counter+=1 + else: + if data.has_key("ID_BUS") and data["ID_BUS"] == "usb": + mnt=_("usbdisk") + else: + mnt=_("firewiredisk") + print_debug ( "get_local_mountpoint() don't have label or vendor" ) + if not os.path.isdir(desktop + "/" + mnt): + print_debug ( "get_local_mountpoint() %s dir not exists, returning..." %(desktop + "/" + mnt) ) + return desktop + "/" + mnt + else: + print_debug ( "get_local_mountpoint() %s dir exists, searching for numbered dirs..." %(desktop + "/" + mnt) ) + while True: + if not os.path.isdir(desktop + "/" + mnt + "-" + str(counter) ): + print_debug ( "get_local_mountpoint() %s dir not exists, returning..." %(desktop + "/" + mnt + "-" + str(counter)) ) + return desktop + "/" + mnt + "-" + str(counter) + counter+=1 + + def floppy(self, action): + action=action[0] + print_debug("floppy call %s" %action) + desktop=self.get_desktop_path() + + if self.mntconf.has_key("fd0"): + local_mount_point=os.path.join(desktop, self.mntconf['fd0'] ) + else: + local_mount_point=os.path.join(desktop, _("Floppy") ) + + if action == "mount": + if not self.mounter_remote("/dev/fd0", "", mode="--mount"): + self.show_notification ( _("Can't mount floppy") ) + return + if not self.mounter_local(local_mount_point, "/mnt/fd0", device="/dev/fd0", label=_("Floppy"), mode="mount"): + return + self.launch_desktop_filemanager(local_mount_point) + self.update_floppy() + return + if action == "umount": + self.mounter_local(local_mount_point, "/mnt/fd0", device="/dev/fd0", label=_("Floppy"), mode="umount") + + if not self.mounter_remote("/dev/fd0", "", mode="--umount"): + self.show_notification ( _("Can't umount floppy") ) + return + self.update_floppy() + + + def cdrom(self, *args): + action=args[0][0] + cdrom_device=args[0][1] + desktop=self.get_desktop_path() + + if self.mntconf.has_key(cdrom_device): + local_mount_point=os.path.join(desktop, self.mntconf[cdrom_device] ) + else: + local_mount_point=os.path.join(desktop, _("Cdrom_%s") %cdrom_device ) + + + absdev="/dev/%s"%cdrom_device + + if action == "mount": + print_debug ( "cdrom() remote_mnt=%s device=%s" %("/mnt/%s"%cdrom_device, cdrom_device) ) + if not self.mounter_remote(absdev, "", mode="--mount"): + self.show_notification ( _("Can't mount cdrom") ) + return + if not self.mounter_local(local_mount_point, "/mnt/%s"%cdrom_device, device=absdev, label=_("Cdrom_%s") %cdrom_device, mode="mount"): + return + + # change status + self.update_cdrom(cdrom_device) + self.launch_desktop_filemanager(local_mount_point) + return + + if action == "umount": + print_debug ( "cdrom() remote_mnt=%s device=%s" %("/mnt/%s"%cdrom_device, cdrom_device) ) + + self.mounter_local(local_mount_point, "/mnt/%s"%cdrom_device, device=absdev, label=_("Cdrom_%s") %cdrom_device, mode="umount") + + if not self.mounter_remote(absdev, "", mode="--umount"): + self.show_notification ( _("Can't umount cdrom") ) + return + + # change status + self.update_cdrom(cdrom_device) + # eject CDROM + self.xmlrpc.GetDevicesInfo(device=cdrom_device, mode="--eject") + return + + + def hdd(self, *args): + action=args[0][0] + hdd_device=args[0][1] + desktop=self.get_desktop_path() + + if self.mntconf.has_key(hdd_device): + local_mount_point=os.path.join(desktop, self.mntconf[hdd_device] ) + else: + local_mount_point=os.path.join(desktop, _("Disk_%s") %hdd_device ) + + + absdev="/dev/%s"%hdd_device + + if action == "mount": + print_debug ( "hdd() remote_mnt=%s device=%s" %("/mnt/%s"%hdd_device, hdd_device) ) + if not self.mounter_remote(absdev, "", mode="--mount"): + self.show_notification ( _("Can't mount hard disk partition") ) + return + if not self.mounter_local(local_mount_point, "/mnt/%s"%hdd_device, device=absdev, label=_("Disk_%s") %hdd_device, mode="mount"): + return + + # change status + self.update_hdd(hdd_device) + self.launch_desktop_filemanager(local_mount_point) + return + + if action == "umount": + print_debug ( "hdd() remote_mnt=%s device=%s" %("/mnt/%s"%hdd_device, hdd_device) ) + + self.mounter_local(local_mount_point, "/mnt/%s"%hdd_device, device=absdev, label=_("Disk_%s") %hdd_device, mode="umount") + + if not self.mounter_remote(absdev, "", mode="--umount"): + self.show_notification ( _("Can't umount hard disk partition") ) + return + + # change status + self.update_hdd(hdd_device) + return + + def cdrom_usb(self, *args): + data=args[0] + if isinstance(data, tuple): data=args[0][0] + + print_debug("cdrom_usb() data=%s" %data) + if data.has_key('DEVPATH'): + device="/dev/"+data["DEVPATH"].split('/')[2] + else: + device=data['DEVNAME'] + action=data['ACTION'] + devid=device.split('/')[2] + remote_mnt="/mnt/%s" %(devid) + + usb_status=self.xmlrpc.GetDevicesInfo(device=device, mode="--getstatus") + if usb_status == "0": + mount=True + n=1 + else: + mount=False + n=2 + + if action == "add": + if not data.has_key('ID_VENDOR'): + vendor="" + else: + vendor=data['ID_VENDOR'] + if not data.has_key('ID_MODEL'): + model="" + else: + model=data['ID_MODEL'] + if not data.has_key('ID_FS_TYPE'): + fstype="" + else: + fstype=data['ID_FS_TYPE'] + self.show_notification( _("From terminal %(host)s.\nConnected CDROM USB device %(device)s\n%(vendor)s %(model)s" ) \ + %{"host":self.hostname, "device":device, "vendor":vendor, "model":model } ) + ########### add USB CDROM device ############ + self.systray.register_device("usb_%s"%devid, + _("CDROM USB device %s") %devid, + "usb%s.png"%n, True, + { + "usb_%s_mount" %devid: [ _("Mount CDROM USB device %s") %(devid), "usb_mount.png", mount, None, device], + "usb_%s_umount" %devid: [ _("Umount CDROM USB device %s") %(devid), "usb_umount.png", not mount, None, device] + }, + device, + "%s %s"%(vendor, model)) + + self.systray.register_action("usb_%s_mount" %devid , self.cdrom_usb, { + "DEVNAME": device, "ACTION": "mount", "ID_FS_TYPE": fstype, "FORCE_MOUNT":True + } + ) + self.systray.register_action("usb_%s_umount" %devid , self.cdrom_usb, { + "DEVNAME": device, "ACTION": "umount", "ID_FS_TYPE": fstype, "FORCE_MOUNT":True + } + ) + ############################################### + # We can have only a cdrom connected without cd inserted + if fstype != "": + desktop=self.get_desktop_path() + + if self.mntconf.has_key(devid): + local_mount_point=os.path.join(desktop, self.mntconf[devid] ) + else: + local_mount_point=os.path.join(desktop, _("Cdrom_%s") %devid ) + + print_debug ( "cdrom_usb() remote_mnt=%s device=%s" %(remote_mnt, devid) ) + if not self.mounter_remote(device, fstype, mode="--mount"): + self.show_notification ( _("Error, can't mount device %s") %(device) ) + return + + if device in self.mounted: + data['ID_FS_LABEL']=os.path.basename(self.mounted[device]) + data['ID_VENDOR']=os.path.basename(self.mounted[device]) + + # remote device is mounted, mount_local and launch filemanager + if not self.mounter_local(local_mount_point, remote_mnt, device=device, label=_("Cdrom_%s") %devid, mode="mount"): + return + self.launch_desktop_filemanager(local_mount_point) + self.mounted[device]=local_mount_point + + # change status + self.update_cdrom_usb(devid, action) + return + + elif action == "mount": + if not data.has_key('ID_FS_TYPE'): + fstype="" + else: + fstype=data['ID_FS_TYPE'] + desktop=self.get_desktop_path() + + if self.mntconf.has_key(devid): + local_mount_point=os.path.join(desktop, self.mntconf[devid] ) + else: + local_mount_point=os.path.join(desktop, _("Cdrom_%s") %devid ) + + print_debug ( "cdrom_usb() remote_mnt=%s device=%s" %(remote_mnt, devid) ) + if not self.mounter_remote(device, fstype, mode="--mount"): + self.show_notification ( _("Error, can't mount device %s") %(device) ) + return + + if device in self.mounted: + data['ID_FS_LABEL']=os.path.basename(self.mounted[device]) + data['ID_VENDOR']=os.path.basename(self.mounted[device]) + + # remote device is mounted, mount_local and launch filemanager + if not self.mounter_local(local_mount_point, remote_mnt, device=device, label=_("Cdrom_%s") %devid, mode="mount"): + return + + # change status + self.update_cdrom_usb(devid, action) + self.launch_desktop_filemanager(local_mount_point) + self.mounted[device]=local_mount_point + return + + elif action == "remove" or action == "umount": + if action == "remove": + if not data.has_key('ID_VENDOR'): + vendor="" + else: + vendor=data['ID_VENDOR'] + if not data.has_key('ID_MODEL'): + model="" + else: + model=data['ID_MODEL'] + self.show_notification( _("From terminal %(host)s.\nDisconnected CDROM USB device %(device)s\n%(vendor)s %(model)s" ) \ + %{"host":self.hostname, "device":device, "vendor":vendor, "model":model } ) + print_debug ("cdrom_usb() UNREGISTER SERVICE") + self.systray.unregister_device("usb_%s"%devid) + if device in self.mounted: + local_mount_point=self.mounted[device] + else: + print_debug ( "remove_cdrom_usb() device %s not found in self.mounted" %(device) ) + return + # umount local fuse + # check if fuse is mounted + status=self.common.exe_cmd("mount |grep -c %s" %(local_mount_point), verbose=1, background=False, lines=0, cthreads=0 ) + if int(status) != 0: + self.mounter_local(local_mount_point, remote_mnt, device=device, label=_("Cdrom_%s") %devid, mode="umount") + + # umount remote device + # check if remote is mounted (user can umount before from desktop icon) + print_debug("cdrom_usb() GETSTATUS device=%s"%device) + status=self.xmlrpc.GetDevicesInfo(device=device, mode="--getstatus") + try: + status=int(status) + if status == 0: + print_debug ( "remove_cdrom_usb() device=%s seems not mounted" %(device) ) + self.systray.update_status("usb_%s"%devid, "usb_%s_mount"%devid, True) + self.systray.update_status("usb_%s"%devid, "usb_%s_umount"%devid, False) + + else: + if not self.mounter_remote(device, "", mode="--umount"): + self.show_notification ( _("Can't umount cdrom usb %s") %(device) ) + return + self.update_cdrom_usb(devid, action) + except Exception, err: + print_debug ( "cdrom_usb() Exception error %s"%err ) + + def usb(self, *args): + data=args[0] + if isinstance(data, tuple): data=args[0][0] + + print_debug("usb() data=%s" %data) + + device=data['DEVNAME'] + action=data['ACTION'] + if not data.has_key('ID_FS_TYPE'): + # we don't have a filesystem only a full device (ex: /dev/sda) + if not data.has_key('ID_VENDOR'): + vendor="" + else: + vendor=data['ID_VENDOR'] + if not data.has_key('ID_MODEL'): + model="" + else: + model=data['ID_MODEL'] + if action == "add": + self.show_notification( _("From terminal %(host)s.\nConnected USB device %(device)s\n%(vendor)s %(model)s" ) \ + %{"host":self.hostname, "device":device, "vendor":vendor, "model":model } ) + if action == "remove": + self.show_notification( _("From terminal %(host)s.\nDisconnected USB device %(device)s\n%(vendor)s %(model)s" ) \ + %{"host":self.hostname, "device":device, "vendor":vendor, "model":model } ) + return + + else: + # we have a filesystem ex: /dev/sda1 + if not data.has_key('ID_FS_TYPE'): + fstype="" + else: + fstype=data['ID_FS_TYPE'] + + if fstype == "swap" or fstype == "extended": return + + usb_status=self.xmlrpc.GetDevicesInfo(device=device, mode="--getstatus") + if usb_status == "0": + mount=True + n=1 + else: + mount=False + n=2 + + # add to menu + devid=device.split('/')[2] + remote_mnt="/mnt/%s" %(devid) + if action == "add" or action == "mount": + if action == "add": + ########### add USB device ############ + self.systray.register_device("usb_%s"%devid, + _("USB device %s") %devid, + "usb%s.png"%n, True, + { + "usb_%s_mount" %devid: [ _("Mount USB device %s") %(devid), "usb_mount.png", mount, None, device], + "usb_%s_umount" %devid: [ _("Umount USB device %s") %(devid), "usb_umount.png", not mount, None, device] + }, + device) + + self.systray.register_action("usb_%s_mount" %devid , self.usb, { + "DEVNAME": device, "ACTION": "mount", "ID_FS_TYPE": fstype, "FORCE_MOUNT":True + } + ) + self.systray.register_action("usb_%s_umount" %devid , self.usb, { + "DEVNAME": device, "ACTION": "umount", "ID_FS_TYPE": fstype, "FORCE_MOUNT":True + } + ) + ############################################### + + if not self.mounter_remote(device, fstype, "--mount"): + self.show_notification ( _("Error, can't mount device %s") %(device) ) + return + + if device in self.mounted: + data['ID_FS_LABEL']=os.path.basename(self.mounted[device]) + data['ID_VENDOR']=os.path.basename(self.mounted[device]) + + if action == "mount": + # mount from menu and wait for udev mount event + if data.has_key("FORCE_MOUNT") and data["FORCE_MOUNT"]: + if not self.mounter_remote(device, fstype, "--mount"): + self.show_notification ( _("Error, can't mount device %s") %(device) ) + return + + # remote device is mounted, mount_local and launch filemanager + local_mount_point = self.get_local_mountpoint(data) + label = os.path.basename(local_mount_point) + + # mount with fuse and ltspfs + if not self.mounter_local(local_mount_point, remote_mnt, device=device, label=label, mode="mount"): + return + + # launch desktop filemanager + self.launch_desktop_filemanager(local_mount_point) + self.mounted[device]=local_mount_point + ########################################## + + + elif action == "remove" or action == "umount": + if action == "remove": + print_debug ("usb() UNREGISTER SERVICE") + self.systray.unregister_device("usb_%s"%devid) + if device in self.mounted: + local_mount_point=self.mounted[device] + label = os.path.basename(local_mount_point) + else: + print_debug ( "remove_usb() device %s not found in self.mounted" %(device) ) + return + # umount local fuse + # check if fuse is mounted + status=self.common.exe_cmd("mount |grep -c %s" %(local_mount_point), verbose=1, background=False, lines=0, cthreads=0 ) + if int(status) != 0: + self.mounter_local(local_mount_point, remote_mnt, device=device, label=label, mode="umount") + + # umount remote device + # check if remote is mounted (user can umount before from desktop icon) + print_debug("usb() GETSTATUS device =%s"%device) + status=self.xmlrpc.GetDevicesInfo(device=device, mode="--getstatus") + try: + status=int(status) + if status == 0: + print_debug ( "remove_usb() device=%s seems not mounted" %(device) ) + self.systray.update_status("usb_%s"%devid, "usb_%s_mount"%devid, True) + self.systray.update_status("usb_%s"%devid, "usb_%s_umount"%devid, False) + + else: + if not self.mounter_remote(device, fstype, "--umount"): + self.show_notification ( _("Error, can't mount device %s") %(device) ) + return + except Exception, err: + print_debug ( "usb() Exception error %s"%err ) + + + #if device in self.mounted: + # del self.mounted[device] + #else: + # print_debug ( "remove_usb() devive=%s not in self.mounted dictionary" ) + + def firewire(self, *args): + data=args[0] + if isinstance(data, tuple): data=args[0][0] + + print_debug("firewire() data=%s" %data) + + device=data['DEVNAME'] + action=data['ACTION'] + if not data.has_key('ID_FS_TYPE'): + # we don't have a filesystem only a full device (ex: /dev/sda) + if not data.has_key('ID_VENDOR'): + vendor="" + else: + vendor=data['ID_VENDOR'] + if not data.has_key('ID_MODEL'): + model="" + else: + model=data['ID_MODEL'] + if action == "add": + self.show_notification( _("From terminal %(host)s.\nConnected Firewire device %(device)s\n%(vendor)s %(model)s" ) \ + %{"host":self.hostname, "device":device, "vendor":vendor, "model":model } ) + if action == "remove": + self.show_notification( _("From terminal %(host)s.\nDisconnected Firewire device %(device)s\n%(vendor)s %(model)s" ) \ + %{"host":self.hostname, "device":device, "vendor":vendor, "model":model } ) + return + + else: + # we have a filesystem ex: /dev/sda1 + if not data.has_key('ID_FS_TYPE'): + fstype="" + else: + fstype=data['ID_FS_TYPE'] + + if fstype == "swap" or fstype == "extended": return + + usb_status=self.xmlrpc.GetDevicesInfo(device=device, mode="--getstatus") + if usb_status == "0": + mount=True + n=1 + else: + mount=False + n=2 + + # add to menu + devid=device.split('/')[2] + remote_mnt="/mnt/%s" %(devid) + if action == "add" or action == "mount": + if action == "add": + ########### add Firewire device ############ + self.systray.register_device("usb_%s"%devid, + _("Firewire device %s") %devid, + "usb%s.png"%n, True, + { + "usb_%s_mount" %devid: [ _("Mount Firewire device %s") %(devid), "usb_mount.png", mount, None, device], + "usb_%s_umount" %devid: [ _("Umount Firewire device %s") %(devid), "usb_umount.png", not mount, None, device] + }, + device) + + self.systray.register_action("usb_%s_mount" %devid , self.firewire, { + "DEVNAME": device, "ACTION": "mount", "ID_FS_TYPE": fstype, "FORCE_MOUNT":True + } + ) + self.systray.register_action("usb_%s_umount" %devid , self.firewire, { + "DEVNAME": device, "ACTION": "umount", "ID_FS_TYPE": fstype, "FORCE_MOUNT":True + } + ) + ############################################### + + if not self.mounter_remote(device, fstype, "--mount"): + self.show_notification ( _("Error, can't mount device %s") %(device) ) + return + + if device in self.mounted: + data['ID_FS_LABEL']=os.path.basename(self.mounted[device]) + data['ID_VENDOR']=os.path.basename(self.mounted[device]) + + if action == "mount": + # mount from menu and wait for udev mount event + if data.has_key("FORCE_MOUNT") and data["FORCE_MOUNT"]: + if not self.mounter_remote(device, fstype, "--mount"): + self.show_notification ( _("Error, can't mount device %s") %(device) ) + return + + # remote device is mounted, mount_local and launch filemanager + local_mount_point = self.get_local_mountpoint(data) + label = os.path.basename(local_mount_point) + + # mount with fuse and ltspfs + if not self.mounter_local(local_mount_point, remote_mnt, device=device, label=label, mode="mount"): + return + + # launch desktop filemanager + self.launch_desktop_filemanager(local_mount_point) + self.mounted[device]=local_mount_point + ########################################## + + + elif action == "remove" or action == "umount": + if action == "remove": + print_debug ("firewire() UNREGISTER SERVICE") + self.systray.unregister_device("usb_%s"%devid) + if device in self.mounted: + local_mount_point=self.mounted[device] + label = os.path.basename(local_mount_point) + else: + print_debug ( "remove_firewire() device %s not found in self.mounted" %(device) ) + return + # umount local fuse + # check if fuse is mounted + status=self.common.exe_cmd("mount |grep -c %s" %(local_mount_point), verbose=1, background=False, lines=0, cthreads=0 ) + if int(status) != 0: + self.mounter_local(local_mount_point, remote_mnt, device=device, label=label, mode="umount") + + # umount remote device + # check if remote is mounted (user can umount before from desktop icon) + print_debug("firewire() GETSTATUS device =%s"%device) + status=self.xmlrpc.GetDevicesInfo(device=device, mode="--getstatus") + try: + status=int(status) + if status == 0: + print_debug ( "remove_firewire() device=%s seems not mounted" %(device) ) + self.systray.update_status("usb_%s"%devid, "usb_%s_mount"%devid, True) + self.systray.update_status("usb_%s"%devid, "usb_%s_umount"%devid, False) + + else: + if not self.mounter_remote(device, fstype, "--umount"): + self.show_notification ( _("Error, can't mount device %s") %(device) ) + return + except Exception, err: + print_debug ( "firewire() Exception error %s"%err ) + + def update_cdrom_usb(self, devid, action=None): + #print_debug ("update_cdrom_usb()") + + device="/dev/%s" %devid + + if action == "umount": + self.show_notification ( _("CDROM USB device %s umounted. You can extract it.") %(devid) ) + + if action == "mount" or action == "add": + self.show_notification ( _("CDROM USB device %s mounted. Ready for use.") %(devid) ) + + print_debug("update_cdrom_usb() GETSTATUS device=%s action=%s"%(device, action) ) + + usb_status=self.xmlrpc.GetDevicesInfo(device, mode="--getstatus") + if usb_status == "0": + ismounted=False + n=1 + else: + ismounted=True + n=2 + print_debug ("update_cdrom_usb() usb devid=%s ismounted=%s" %(devid, ismounted) ) + #self.systray.items["usb_"%devid][1]="usb%s.png"%n + self.systray.update_status("usb_%s"%devid, "usb_%s_mount"%devid, not ismounted) + self.systray.update_status("usb_%s"%devid, "usb_%s_umount"%devid, ismounted) + + + def update_usb(self, *args): + #print_debug ("update_usb()") + data=args[0] + action=data['ACTION'] + + if not data.has_key("ID_FS_TYPE"): + # don't update if we have disk (only partititions) + return + + if data["ID_FS_TYPE"] == "" or data["ID_FS_TYPE"] == "swap" or data["ID_FS_TYPE"] == "extended": + # don't update if fstype is empty (devicesctl.sh and udev put FILESYSTEM always) + return + + device="/dev/%s" %data['DEVPATH'].split('/')[2] + + if( len( data['DEVPATH'].split('/') ) ) > 3: + devid=data['DEVPATH'].split('/')[3] + else: + devid=data['DEVPATH'].split('/')[2] + + if action == "umount": + self.show_notification ( _("USB device %s umounted. You can extract it.") %(devid) ) + + if action == "mount": + self.show_notification ( _("USB device %s mounted. Ready for use.") %(devid) ) + + print_debug("update_usb() GETSTATUS device=%s data=%s"%(device, data) ) + usb_status=self.xmlrpc.GetDevicesInfo(data['DEVNAME'], mode="--getstatus") + if usb_status == "0": + ismounted=False + n=1 + else: + ismounted=True + n=2 + print_debug ("update_usb() usb devid=%s ismounted=%s" %(devid, ismounted) ) + #self.systray.items["usb_"%devid][1]="usb%s.png"%n + self.systray.update_status("usb_%s"%devid, "usb_%s_mount"%devid, not ismounted) + self.systray.update_status("usb_%s"%devid, "usb_%s_umount"%devid, ismounted) + + def update_firewire(self, *args): + #print_debug ("update_firewire()") + data=args[0] + action=data['ACTION'] + + if not data.has_key("ID_FS_TYPE"): + # don't update if we have disk (only partititions) + return + + if data["ID_FS_TYPE"] == "" or data["ID_FS_TYPE"] == "swap" or data["ID_FS_TYPE"] == "extended": + # don't update if fstype is empty (devicesctl.sh and udev put FILESYSTEM always) + return + + device="/dev/%s" %data['DEVPATH'].split('/')[2] + + if( len( data['DEVPATH'].split('/') ) ) > 3: + devid=data['DEVPATH'].split('/')[3] + else: + devid=data['DEVPATH'].split('/')[2] + + if action == "umount": + self.show_notification ( _("Firewire device %s umounted. You can extract it.") %(devid) ) + + if action == "mount": + self.show_notification ( _("Firewire device %s mounted. Ready for use.") %(devid) ) + + print_debug("update_firewire() GETSTATUS device=%s data=%s"%(device, data) ) + usb_status=self.xmlrpc.GetDevicesInfo(data['DEVNAME'], mode="--getstatus") + if usb_status == "0": + ismounted=False + n=1 + else: + ismounted=True + n=2 + print_debug ("update_firewire() usb devid=%s ismounted=%s" %(devid, ismounted) ) + #self.systray.items["usb_"%devid][1]="usb%s.png"%n + self.systray.update_status("usb_%s"%devid, "usb_%s_mount"%devid, not ismounted) + self.systray.update_status("usb_%s"%devid, "usb_%s_umount"%devid, ismounted) + + def remove_dupes(self, mylist): + """ + check for duplicate events, + kernel sometimes create 3-4 umount events before mounting a device + the events are created and diff at max 1 second + """ + if len(mylist) != 1: + have_umount=False + have_mount=False + umount_index=None + nodupes=[] + try: + nodupes=list(set(mylist)) + except: + pass + + # if have ACTION=umount and ACTION=mount and + # DEVPATH is the same remove ACTION=umount + for event in nodupes: + action=self.get_value(event.split('#'), "ACTION") + if action == "umount": + have_umount=True + umount_index=event + if action == "mount": have_mount=True + + if have_mount and have_umount: + for i in range(len(nodupes)): + if self.get_value(nodupes[i].split('#'), "ACTION") == "umount": + #print_debug ( "remove_dupes() Deleting umount ACTION: %s" %nodupes[i] ) + del nodupes[i] + break + mylist=nodupes + return mylist + + + + def get_value(self, data, key=None): + """ + returns value of given key, example: + data=["ID_BUS=usb", "DEVICE=/dev/sda", "FSTYPE=vfat"] + if key="DEVICE" + returns "/dev/sda" + udev current avalaible keys: + "ID_BUS" "DEVNAME" "ACTION" "ID_FS_LABEL" "ID_FS_TYPE" "ID_VENDOR" "ID_MODEL" "DEVPATH" + """ + #print_debug ( "::==> get_value() searching for \"%s\"" %key ) + for uvar in data: + if uvar.split('=')[0] == key: + print_debug ( "::==> get_value() FOUND key=%s value=%s" %(key, uvar.split('=')[1]) ) + return uvar.split('=')[1] + # return empty string if not found + return "" + + + def get_desktop(self): + is_gnome=self.common.exe_cmd("ps ux |grep gnome-panel |grep -c -v grep", verbose=1, background=False, lines=0, cthreads=0 ) + is_kde = self.common.exe_cmd("ps ux |grep -e startkde -e kwin |grep -c -v grep", verbose=1, background=False, lines=0, cthreads=0 ) + is_xfce= self.common.exe_cmd("ps ux |grep xfce4-panel |grep -c -v grep", verbose=1, background=False, lines=0, cthreads=0 ) + try: + if int(is_gnome) > 0: + return "gnome" + elif int(is_kde) > 0: + return "kde" + elif int(is_xfce) > 0: + return "xfce4" + except Exception, e: + print_debug("Can't read desktop type, error: %s"%e) + return "" + + def launch_desktop_filemanager(self, path=""): + if self.desktop == "gnome": + cmd="nautilus %s" %(path) + elif self.desktop == "kde": + if os.path.isfile("/usr/bin/dolphin"): + cmd="dolphin %s" %(path) + else: + cmd="konqueror %s" %(path) + elif self.desktop == "xfce4": + cmd="Thunar %s" %(path) + else: + print_debug ( "launch_desktop_filemanager() unknow desktop, not launching filemanager" ) + return + # exe filemanager in a new thread to not freeze status icon + filemanager=threading.Thread(target=self.exec_filemanager, args=[cmd] ) + filemanager.start() + return + + def exec_filemanager(self, *args): + print_debug("exec_filemanager() args='%s'" %(args[0]) ) + self.common.exe_cmd(args[0], verbose=1, background=False, lines=0, cthreads=0 ) + + def umount_all(self): + mounted=self.common.exe_cmd("grep ^ltspfs /proc/mounts |grep -e \"user_id=%s\" -e \"user=%s\" | awk '{print $2}'" %(os.getuid(), pwd.getpwuid(os.getuid())[0]), verbose=1, background=False, lines=0, cthreads=0 ) + if isinstance(mounted, str): + mounted=[mounted] + for mount in mounted: + print_debug( "umount_all() umounting %s..." %mount ) + self.common.exe_cmd("fusermount -u %s 2>&1" %mount, verbose=1, background=False, lines=0, cthreads=0) + self.common.exe_cmd("fusermount -uz %s 2>/dev/null" %mount, verbose=1, background=False, lines=0, cthreads=0) + # delete dir + try: + os.rmdir(mount) + except Exception, err: + print_debug("umount_all() Exception, error %s"%err) + + def exit(self): + # say udev_daemon loop to quit + self.quitting=True + self.umount_all() + self.mainloop.quit() + + def run (self): + self.mainloop = gobject.MainLoop() + try: + self.mainloop.run() + except KeyboardInterrupt: # listen Ctrl+C + self.exit() + + + + +if __name__ == "__main__": + + # init app + app=TcosDevicesNG() + + # start gui in a thread + tcosdevices=threading.Thread(target=app.run ) + tcosdevices.start() + + # start udev loop + while True: + try: + if app.quitting: break + if app.desktop == "": app.desktop=app.get_desktop() + app.udev_daemon() + time.sleep(3) + except KeyboardInterrupt: + print ("Get KeyboardInterrupt (udev loop), existing...") + app.quitting=True + app.mainloop.quit() + break + + # join gui thread + tcosdevices.join() + sys.exit(0) + diff --git a/tcos-volume-manager.desktop b/tcos-volume-manager.desktop new file mode 100644 index 0000000..22b463d --- /dev/null +++ b/tcos-volume-manager.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Version=1.0 +Encoding=UTF-8 +Name=Tcos Volume levels remote control +Exec=tcos-volume-manager +Terminal=false +Type=Application +Icon=/usr/share/tcosmonitor/images/tcos-volume-32x32.png +Categories=Application;AudioVideo;GTK;GNOME diff --git a/tcos-volume-manager.py b/tcos-volume-manager.py new file mode 100755 index 0000000..dde7815 --- /dev/null +++ b/tcos-volume-manager.py @@ -0,0 +1,387 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- +# +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +import os, sys +import gobject +import getopt +from gettext import gettext as _ + +import pygtk +pygtk.require('2.0') +import gtk +from tcosmonitor import shared + +# load conf file and exit if not active +if not shared.test_start("tcos-volume-manager") : + print >> sys.stderr, "tcos-volume-manager disabled at %s" % (shared.module_conf_file) + #print("tcos-volume-manager disabled at %s" % (shared.module_conf_file), file=sys.stderr) + sys.exit(1) + + +import pwd + +def print_debug(txt): + if shared.debug: + print >> sys.stderr, "%s::%s" % ("tcos-volume-manager", txt) + #print("%s::%s" % ("tcos-volume-manager", txt), file=sys.stderr) + +def get_username(): + return pwd.getpwuid(os.getuid())[0] + + +def usage(): + print ("tcos-volume-manager help:") + print ("") + print (" tcos-volume-manager [--host=XXX.XXX.XXX.XXX] ") + print (" (force host to connect to change volumes, default is DISPLAY)") + print (" tcos-volume-manager -d [--debug] (write debug data to stdout)") + print (" tcos-volume-manager -h [--help] (this help)") + + +try: + opts, args = getopt.getopt(sys.argv[1:], ":hd", ["help", "debug", "host="]) +except getopt.error, msg: + print (msg) + print ("for command line options use tcosconfig --help") + sys.exit(2) + +shared.remotehost=str(shared.parseIPAddress(os.environ["DISPLAY"])) + +# process options +for o, a in opts: + if o in ("-d", "--debug"): + print ("DEBUG ACTIVE") + shared.debug = True + if o == "--host": + shared.remotehost = str(shared.parseIPAddress(a)) + if o in ("-h", "--help"): + usage() + sys.exit() + +if shared.remotehost == "": + print ("tcos-volume-manager: Not allowed to run in local DISPLAY") + #shared.error_msg ( _("tcos-volume-manager isn't allowed to run in local DISPLAY\nForce with --host=xx.xx.xx.xx") ) + sys.exit(0) + + + +class TcosVolumeManager: + def __init__(self, host): + self.host=host + self.name="TcosVolumeManager" + self.visible=False + + if hasattr(gtk, 'status_icon_new_from_file'): + # use gtk.status_icon + icon = gtk.status_icon_new_from_file(shared.IMG_DIR + "tcos-volume-32x32.png") + icon.set_tooltip( _("Tcos Sound levels on:\n%s") %(self.host) ) + icon.connect("activate", self.on_tray_icon_press_event) + else: + import egg.trayicon + icon = egg.trayicon.TrayIcon("TCOS_sound") + eventbox = gtk.EventBox() + icon.add(eventbox) + image=gtk.Image() + image.set_from_file (shared.IMG_DIR + "tcos-volume-32x32.png") + eventbox.add(image) + tips = gtk.Tooltips() # deprecated + + tips.set_tip(icon, ( _("Tcos Sound levels on:\n%s") %(self.host) )[0:79]) + tips.enable() + icon.show_all() + eventbox.connect("button_press_event", self.on_tray_icon_press_event) + + + from tcosmonitor.ping import PingPort + if PingPort(self.host, shared.xmlremote_port, 0.5).get_status() != "OPEN": + shared.error_msg( _("ERROR: It appears that TcosXmlRpc is not running on %s.") %(self.host) ) + sys.exit(1) + + + import tcosmonitor.TcosXauth + self.xauth=tcosmonitor.TcosXauth.TcosXauth(self) + self.xauth.init_standalone() + + # get all channels + import tcosmonitor.TcosXmlRpc + import tcosmonitor.TcosConf + self.config=tcosmonitor.TcosConf.TcosConf(self, openfile=False) + self.xmlrpc=tcosmonitor.TcosXmlRpc.TcosXmlRpc(self) + + nossl=True + # make a test and exit if no cookie match + if not self.xauth.test_auth(nossl): + print ("tcos-volume-manager: ERROR: Xauth cookie don't match") + #sys.exit(1) + + self.xmlrpc.newhost(self.host,nossl) + if not self.xmlrpc.connected: + shared.error_msg( _("Error connecting with TcosXmlRpc in %s.") %(self.host) ) + sys.exit(1) + + # check for enabled sound + have_sound=self.xmlrpc.IsEnabled("TCOS_SOUND") + if not have_sound: + print ("tcos-volume-manager: TCOS_SOUND is disabled") + sys.exit(0) + + self.allchannels=self.xmlrpc.GetSoundChannelsContents() + print_debug ("__init__() %s" %( self.allchannels ) ) + + self.ui = gtk.Builder() + self.ui.set_translation_domain(shared.PACKAGE) + + # Widgets + self.ui.add_from_file(shared.GLADE_DIR + 'tcos-volume-manager.ui') + self.mainwindow = self.ui.get_object('mainwindow') + + # close windows signals + #self.mainwindow.connect('destroy', self.quitapp ) + self.mainwindow.connect('delete-event', self.mainwindow_close ) + + self.mainlabel=self.ui.get_object('mainlabel') + + self.scrolledwindow=self.ui.get_object('scrolledwindow') + self.scrolledwindow2=self.ui.get_object('scrolledwindow2') + + self.quitbutton=self.ui.get_object('quitbutton') + self.quitbutton.connect('clicked', self.quitapp ) + + self.statusbar=self.ui.get_object('statusbar') + self.refreshbutton=self.ui.get_object('refreshbutton') + self.refreshbutton.connect('clicked', self.on_refresh_button ) + + self.restartbutton=self.ui.get_object('restartbutton') + self.restartbutton.connect('clicked', self.on_restart_button ) + + # only show if we found this file in $HOME dir + allowfile=os.path.expanduser("~/.tcos-volume-manager.allow.restartpulse") + if os.path.isfile(allowfile): + self.restartbutton.show() + + # restart on start + restartfile=os.path.expanduser("~/.tcos-volume-manager.start.restartpulse") + if os.path.isfile(restartfile): + self.xmlrpc.RestartSoundDaemon() + + # FIXME try to not focus on quitbutton + self.refreshbutton.grab_focus() + + self.get_channel_info() + + def on_refresh_button(self, widget): + self.allchannels=self.xmlrpc.GetSoundChannelsContents() + self.scrolledwindow.foreach( self.delete_child, self.scrolledwindow ) + self.scrolledwindow2.foreach( self.delete_child, self.scrolledwindow2 ) + self.get_channel_info() + + def on_restart_button(self, widget): + self.xmlrpc.RestartSoundDaemon() + self.on_refresh_button(None) + + def delete_child(self, widget, scrolled): + scrolled.remove(widget) + + def get_channel_info(self): + # retry cookie auth + nossl=True + self.xauth.test_auth(nossl) + + primary_channels=[] + secondary_channels=[] + if self.allchannels != None and len(self.allchannels) > 0: + gobject.timeout_add( 50, self.write_into_statusbar, _("Loading channels info...") ) + for channel in self.allchannels: + #if not channel in shared.sound_only_channels: + if not channel['name'] in shared.sound_only_channels: + secondary_channels.append(channel) + continue + primary_channels.append(channel) + gobject.timeout_add( 500, self.populate_mixer, primary_channels, self.scrolledwindow) + gobject.timeout_add( 1500, self.populate_mixer, secondary_channels, self.scrolledwindow2) + #gobject.timeout_add( 4000, self.write_into_statusbar, _("Ready") ) + + else: + print_debug ( "ERROR: No auth" ) + gobject.timeout_add( 2000, self.write_into_statusbar, _("Error loading channels info (xauth error)") ) + + self.mainwindow.set_icon_from_file(shared.IMG_DIR + 'tcos-icon-32x32.png') + self.mainwindow.set_title( _("Tcos Volume Manager") ) + self.mainlabel.set_markup( _("<span size='large'><b>Sound mixer of %s host</b></span>") %(self.host) ) + + #self.mainwindow.show() + + #self.populate_mixer(primary_channels, self.scrolledwindow) + #self.populate_mixer(secondary_channels, self.scrolledwindow2) + + + def populate_mixer(self, all_channels, scrollwindow): + box1 = gtk.HBox(False, 0) + box1.set_border_width(0) + box1.show() + scrollwindow.add_with_viewport(box1) + + for channel in all_channels: + #frame = gtk.Frame(channel) + frame = gtk.Frame(channel['name']) + #frame.show() + box2 = gtk.VBox(True, 0) + box2.set_border_width(0) + + ########################################################### + #value=self.xmlrpc.GetSoundInfo(channel, mode="--getlevel") + #value=value.replace('%','') + value=channel['level'] + try: + value=float(value) + except Exception, err: + print_debug("Exception, can't get float value, error=%s"%err) + value=0.0 + ctype=channel['type'] + #ismute=self.xmlrpc.GetSoundInfo(channel, mode="--getmute") + ismute=channel['mute'] + if ismute == "off": + ismute = True + else: + ismute = False + #print_debug ( "populate_mixer() channel=%s ismute=%s volume level=%s" %(channel, ismute, value) ) + print_debug ( "populate_mixer() channel=%s ismute=%s volume level=%s ctype=%s" %(channel['name'], ismute, value, ctype) ) + ############################################################# + adjustment = gtk.Adjustment(value=0, + lower=0, + upper=100, + step_incr=1, + page_incr=1) + volume_slider = None + volume_slider = gtk.VScale(adjustment) + volume_slider.set_digits(0) + volume_slider.set_inverted(True) + + volume_slider.set_size_request(30, 100) + volume_slider.set_value_pos(gtk.POS_TOP) + volume_slider.set_value( value ) + #volume_slider.connect("button_release_event", self.slider_value_changed, adjustment, channel, self.host) + #volume_slider.connect("scroll_event", self.slider_value_changed, adjustment, channel, self.host) + volume_slider.connect("button_release_event", self.slider_value_changed, adjustment, channel['name'], self.host) + volume_slider.connect("scroll_event", self.slider_value_changed, adjustment, channel['name'], self.host) + if "volume" in ctype: + volume_slider.show() + else: + volume_slider.hide() + + box2.pack_start(volume_slider, False, True, 0) + + + + volume_checkbox=gtk.CheckButton(label=_("Mute"), use_underline=True) + volume_checkbox.set_active(ismute) + #volume_checkbox.connect("toggled", self.checkbox_value_changed, channel, self.host) + volume_checkbox.connect("toggled", self.checkbox_value_changed, channel['name'], self.host) + if "switch" in ctype: + volume_checkbox.show() + else: + volume_checkbox.hide() + + + box2.pack_start(volume_checkbox, False, True, 0) + box2.show() + frame.add(box2) + + frame.show() + box1.pack_start(frame, True, True, 0) + + # write in statusbar if populating primary controls + if scrollwindow == self.scrolledwindow: + self.write_into_statusbar( _("Main controls ready") ) + + # write in statusbar if populating secondary controls + if scrollwindow == self.scrolledwindow2: + self.write_into_statusbar( _("All remote controls loaded.") ) + return False + + + def slider_value_changed(self, widget, event, adj, channel, ip): + value=widget.get_value() + print_debug ( "slider_value_changed() ip=%s channel=%s value=%s" %(ip, channel, value) ) + + self.write_into_statusbar( \ + _("Changing value of %(channel)s channel, to %(value)s%%..." )\ + %{"channel":channel, "value":value} ) + + tmp=self.xmlrpc.SetSound(ip, channel, str(value)+"%") + newvalue="%2d%%"%int(tmp['level']) + + self.write_into_statusbar( \ + _("Changed value of %(channel)s channel, to %(value)s" ) \ + %{"channel":channel, "value":newvalue} ) + + def checkbox_value_changed(self, widget, channel, ip): + value=widget.get_active() + if not value: + value="off" + self.write_into_statusbar( _("Unmuting %s channel..." ) %(channel) ) + tmp=self.xmlrpc.SetSound(ip, channel, value="", mode="--setunmute") + newvalue=tmp['mute'] + else: + value="on" + self.write_into_statusbar( _("Muting %s channel..." ) %(channel) ) + tmp=self.xmlrpc.SetSound(ip, channel, value="", mode="--setmute") + newvalue=tmp['mute'] + self.write_into_statusbar( _("Status of %(channel)s channel, is \"%(newvalue)s\"" )\ + %{"channel":channel, "newvalue":newvalue} ) + + def write_into_statusbar(self, msg, *args): + context_id=self.statusbar.get_context_id("status") + self.statusbar.pop(context_id) + self.statusbar.push(context_id, msg) + return False + + def on_tray_icon_press_event(self, *args): + if self.visible: + self.mainwindow.hide() + else: + self.mainwindow.show() + self.visible = not self.visible + return + + def mainwindow_close(self, widget, event): + print_debug ( "mainwindow_close() closing mainwindow to systray" ) + self.visible=False + self.mainwindow.hide() + return True + + def quitapp(self, *args): + print_debug ( _("Exiting") ) + self.mainloop.quit() + + + def run (self): + self.mainloop = gobject.MainLoop() + try: + self.mainloop.run() + except KeyboardInterrupt: # Ctrl+C Event + self.quitapp() + +if __name__ == "__main__": + app=TcosVolumeManager(shared.remotehost) + app.run() diff --git a/tcosmonitor.conf b/tcosmonitor.conf new file mode 100644 index 0000000..0d6fbc7 --- /dev/null +++ b/tcosmonitor.conf @@ -0,0 +1,22 @@ +# conf file of tcosmonitor + + +# tcos-devices-ng enable or disable (values 0 or 1) +tcos-devices-ng=1 + +# tcos-volume-manager enable or disable (values 0 or 1) +tcos-volume-manager=1 + + +# for enable exclude users, change to "tcosmonitor-exclude" +# put users in group tcosmonitor-exclude and these users +# will not show in tcosmonitor +dont_show_users_in_group="" + +# Only allow to exec tcosmonitor when user is in group tcos +# (values 0 disabled, 1 enabled) +check_tcosmonitor_user_group=0 + +# Net controller (disable/enable internet) only block ports specified in Tcosmonitor->Preferences +tnc_only_ports="no" + diff --git a/tcosmonitor.desktop b/tcosmonitor.desktop new file mode 100644 index 0000000..31991aa --- /dev/null +++ b/tcosmonitor.desktop @@ -0,0 +1,14 @@ +[Desktop Entry] +Version=1.0 +Name=TcosMonitor +Name[en_GB]=TcosMonitor +Name[es]=TcosMonitor +Comment=Thin client network monitor +Comment[en_GB]=Thin client network monitor +Comment[es]=Monitorizar una red de clientes ligeros +Exec=/usr/bin/tcosmonitor $@ +Terminal=false +Type=Application +Icon=/usr/share/pixmaps/tcos-icon-32x32.png +GenericName[es_ES]=TcosMonitor +Categories=GNOME;Settings;System;DesktopSettings;Monitor diff --git a/tcosmonitor.py b/tcosmonitor.py new file mode 100644 index 0000000..1538a8d --- /dev/null +++ b/tcosmonitor.py @@ -0,0 +1,374 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +import sys +import os + +#if not os.path.isfile("Initialize.py"): +# #print "DEBUG: append tcosmonitor dir" +# sys.path.append("/usr/share/tcosmonitor") + +import pygtk +pygtk.require('2.0') +import gtk + +from time import time +import getopt +from gettext import gettext as _ +from threading import Thread + +gtk.gdk.threads_init() + +import gobject + +from tcosmonitor import shared + +import grp, pwd + +import gettext + +# Medusa +import asyncore +from medusa import default_handler +from medusa import filesys +from medusa import ftp_server +from medusa import status_handler + +# M2Crypto +try: + from tcosmonitor import ftps_server +except: + print "NO FTP TLS support" + pass +from threading import Thread +import M2Crypto + +class TCOSFTPSERVER (Thread): + def __init__(self): + self.FTP_PORT = 8997 + M2Crypto.Rand.load_file('/tmp/randpooltcos.dat', -1) + self.ssl_ctx=M2Crypto.SSL.Context('sslv23') + self.ssl_ctx.load_cert('/etc/tcos/ssl/tcos_server.pem') + self.ssl_ctx.load_client_CA('/etc/tcos/ssl/tcos_ca.crt') + self.ssl_ctx.set_verify(M2Crypto.SSL.verify_none, 10) + self.ssl_ctx.set_session_id_ctx('127.0.0.1:9443') + self.ssl_ctx.set_tmp_dh('/etc/tcos/ssl/tcos_dh1024.pem') + self.ssl_ctx.set_info_callback() + Thread.__init__(self) + def run(self): + if not os.path.isdir("/tmp/tcos_share"): os.mkdir("/tmp/tcos_share") + self.fauthz = ftp_server.anon_authorizer('/tmp/tcos_share') + self.ftps = ftps_server.ftp_tls_server(self.fauthz, self.ssl_ctx, port=self.FTP_PORT) + self.ftps.status() + self.sh=status_handler.status_extension([self.ftps]) + M2Crypto.Rand.save_file('/tmp/randpooltcos.dat') + asyncore.loop() + + +gettext.bindtextdomain(shared.PACKAGE, shared.LOCALE_DIR) +gettext.textdomain(shared.PACKAGE) + + +def print_debug(txt): + if shared.debug: + print >>sys.stderr, "%s::%s" % ("tcosmonitor", txt) + #print("%s::%s" % ("tcosmonitor", txt), file=sys.stderr) + return + +def crono(start, txt): + print_debug ("crono(), %s get %f seconds" %(txt, (time() - float(start))) ) + return + +def usage(): + print ("TcosMonitor help:") + print ("") + print (" tcosmonitor -d [--debug] (write debug data to stdout)") + print (" tcosmonitor -h [--help] (this help)") + + +try: + OPTS, ARGS = getopt.getopt(sys.argv[1:], ":hd", ["help", "debug"]) +except getopt.error, msg: + print (msg) + print ("for command line options use tcosconfig --help") + sys.exit(2) + +# process options +for o, a in OPTS: + if o in ("-d", "--debug"): + print ("DEBUG ACTIVE") + shared.debug = True + if o in ("-h", "--help"): + usage() + sys.exit() + +import tcosmonitor + +class TcosMonitor(object): + def __init__(self): + # if true auto-update is active, false only one update + self.updating=False + self.name="TcosMonitor" + self.force_selected_ip=None + # register triggers + self.triggers={} + self.mainloop = gobject.MainLoop() + + self.groupconf=self.loadconf( os.path.abspath(shared.GLOBAL_CONF) ) + + try: + if int(self.groupconf['check_tcosmonitor_user_group']) == 1: + shared.check_tcosmonitor_user_group=True + except Exception, err: + print_debug("__init__() Exception getting group, error=%s"%err) + pass + + if self.groupconf['dont_show_users_in_group'] != '': + shared.dont_show_users_in_group=self.groupconf['dont_show_users_in_group'] + #else: + # shared.dont_show_users_in_group=None + + if self.groupconf['tnc_only_ports'] != "no": + shared.tnc_only_ports="yes" + + ################################################## + + self.worker_running=False + self.ingroup_tcos=False + + if shared.check_tcosmonitor_user_group: + for group in os.getgroups(): + if grp.getgrgid(group)[0] == "tcos": + self.ingroup_tcos=True + if os.getuid() == 0: + self.ingroup_tcos=True + if self.ingroup_tcos == False and os.getuid() != 0: + shared.error_msg( _("The user \"%s\" must be member of the group \"tcos\"\ + to exec tcosmonitor.\n\nIf you are system administrator, add your\ + user to tcos group." %pwd.getpwuid(os.getuid())[0])) + sys.exit(1) + + + # Widgets + self.ui = gtk.Builder() + self.ui.set_translation_domain(shared.PACKAGE) + print_debug("Loading ui file...") + self.ui.add_from_file(shared.GLADE_DIR + 'tcosmonitor-mainwindow.ui') + + + self.mainwindow = self.ui.get_object('mainwindow') + self.mainwindow.set_icon_from_file(shared.IMG_DIR +\ + 'tcos-icon-32x32.png') + + self.is_fullscreen=False + + # close windows signals + self.mainwindow.connect('destroy', self.quitapp ) + self.mainwindow.connect("delete_event", self.quitapp) + + # reduce mainwindow size if running in height < 1024x768 + #>>> gtk.gdk.screen_height() + #>>> gtk.gdk.screen_width() + if gtk.gdk.screen_height() < 768: + print_debug("set lower size of mainwindow") + self.mainwindow.set_size_request(760,520) + + # ui file (mainwindow) visible=False, show now + self.mainwindow.show() + + + # FIXME + self.scrolledtextview = self.ui.get_object('scrolledtextview') + #import htmltextview + #htmltextview.HtmlHandler().set_main(self) + + self.datatxt = tcosmonitor.htmltextview.HtmlTextView(self) + self.datatxt.show() + self.scrolledtextview.add(self.datatxt) + self.datatxt.clean() + + + + # init classes + self.common=tcosmonitor.TcosCommon.TcosCommon(self) + self.config=tcosmonitor.TcosConf.TcosConf(self) + self.localdata=tcosmonitor.LocalData.LocalData(self) + self.xmlrpc=tcosmonitor.TcosXmlRpc.TcosXmlRpc(self) + self.xauth=tcosmonitor.TcosXauth.TcosXauth(self) + self.preferences=tcosmonitor.TcosPreferences.TcosPreferences(self) + + self.menus=tcosmonitor.TcosMenus.TcosMenus(self) + + self.actions=tcosmonitor.TcosActions.TcosActions(self) + + # views + self.listview=tcosmonitor.TcosListView.TcosListView(self) + self.iconview=tcosmonitor.TcosIconView.TcosIconView(self) + self.classview=tcosmonitor.TcosClassView.TcosClassView(self) + + self.init=tcosmonitor.Initialize.Initialize(self) + + self.static=tcosmonitor.TcosStaticHosts.TcosStaticHosts(self) + + + ######### init some elements ########### + self.init.init_progressbar() + self.init.initabouttcos() + ######################################### + self.init.initbuttons() + self.preferences.populate_pref() + + + + self.extloader=tcosmonitor.TcosExtensions.TcosExtLoader(self) + + + if not shared.dbus_disabled: + self.dbus_action=tcosmonitor.TcosDBus.TcosDBusAction(self, + admin=self.config.GetVar("xmlrpc_username"), + passwd=self.config.GetVar("xmlrpc_password")) + + self.stop_running_actions=[] + # generate host list if checked + if self.config.GetVar("populate_list_at_startup") == "1": + self.populate_host_list() + self.actions.update_hostlist() + + try: + self.ftp_thread = TCOSFTPSERVER() + self.ftp_thread.setDaemon(1) + self.ftp_thread.start() + except Exception, err: + pass + + def loadconf(self, conffile): + conf={} + print_debug ( "loadconf() conffile=%s" %conffile ) + if os.path.isfile(conffile): + print_debug ("loadconf() found conf file %s" %conffile) + f=open(conffile, "r") + data=f.readlines() + f.close() + for line in data: + if line == '\n': + continue + if line.find('#') == 0: + continue + line=line.replace('\n', '') + if "=" in line: + try: + conf["%s"%line.split('=')[0]] = line.split('=')[1].replace('"', '') + except Exception, err: + print_debug("loadconf() Exception: %s" %err) + pass + print_debug( "loadconf conf=%s" %conf ) + return conf + + def button_actions(self, widget, action): + print_debug ( "button_actionst() action=%s" %action) + + if action == "audio": + if self.actions.button_action_audio != None: + self.actions.button_action_audio() + elif action == "chat": + if self.actions.button_action_chat != None: + self.actions.button_action_chat() + elif action == "list": + if self.actions.button_action_list != None: + self.actions.button_action_list() + elif action == "video": + if self.actions.button_action_video != None: + self.actions.button_action_video() + elif action == "send": + if self.actions.button_action_send != None: + self.actions.button_action_send() + elif action == "exe": + if self.actions.button_action_exe != None: + self.actions.button_action_exe() + elif action == "text": + if self.actions.button_action_text != None: + self.actions.button_action_text() + return + + def search_host(self, widget): + print_debug ( "search_host()" ) + txt=self.searchtxt.get_text() + if txt == "": + allclients=self.localdata.GetAllClients( self.config.GetVar("scan_network_method") ) + Thread( target=self.actions.populate_hostlist, args=([allclients]) ).start() + model=self.tabla.get_model() + notvalid=[] + model.foreach(self.delete_not_searched, (notvalid)) + notvalid.reverse() + for host in notvalid: + model.remove( model.get_iter(host) ) + + def delete_not_searched(self, model, path, iter, data): + txt=self.searchtxt.get_text() + hostname=model.get_value(iter, 0) + ip=model.get_value(iter, 1) + username=model.get_value(iter, 2) + if txt != hostname and txt != ip and txt != username: + data.append(path) + + def write_into_statusbar(self, msg, *args): + #print_debug("STATUSBAR: Writing \"%s\" into statusbar" % msg) + context_id=self.statusbar.get_context_id("status") + self.statusbar.pop(context_id) + self.statusbar.push(context_id, msg) + return + + def quitapp(self, *args): + print_debug ( _("Exiting") ) + #gtk.main_quit() + widgets=self.stop_running_actions[:] + print_debug("Running actions: %s" %len(widgets)) + for widget in widgets: + print_debug("Stop running action... widget=%s" %(widget)) + try: + widget.clicked() + except: + pass + if os.path.isdir("/tmp/tcos_share/"): + for filename in os.listdir("/tmp/tcos_share/"): + if os.path.isfile("/tmp/tcos_share/%s" %filename): + os.remove("/tmp/tcos_share/%s" %filename) + if os.path.isdir("/tmp/tcos_share"): + os.rmdir("/tmp/tcos_share") + + if os.path.isfile(os.path.expanduser('~/.tcosvnc')): + os.remove(os.path.expanduser('~/.tcosvnc')) + + self.mainloop.quit() + + + def run (self): + try: + self.mainloop.run() + except KeyboardInterrupt: # Press Ctrl+C + self.quitapp() + + + +if __name__ == '__main__': + app = TcosMonitor () + # Run app + app.run () diff --git a/tcosmonitor/Avahi.py b/tcosmonitor/Avahi.py new file mode 100644 index 0000000..dee3a26 --- /dev/null +++ b/tcosmonitor/Avahi.py @@ -0,0 +1,179 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + + +import dbus +import gobject +import avahi +import avahi.ServiceTypeDatabase +import time +from dbus import DBusException +from dbus.mainloop.glib import DBusGMainLoop + +from pprint import pprint + + +__all__ = ['ZeroconfService', 'AvahiDiscover'] + + + +class AvahiDiscover(object): + def __init__(self, discover_types=['_workstation._tcp'], + default_service_name='tcosxmlrpc', + loop=None): + self.services={} + self.default_service_name=default_service_name + if loop: + self.loop + else: + self.loop = DBusGMainLoop() + self.bus = dbus.SystemBus(mainloop=self.loop) + self.server = dbus.Interface( self.bus.get_object(avahi.DBUS_NAME, '/'), + 'org.freedesktop.Avahi.Server') + + if len(discover_types)> 0: + for srv in discover_types: + self.add_service(srv) + else: + for srv in avahi.ServiceTypeDatabase.ServiceTypeDatabase().items(): + self.add_service(srv[0]) + + def add_service(self, stype): + print "add_service() stype=%s"%stype + sbrowser = dbus.Interface(self.bus.get_object(avahi.DBUS_NAME, + self.server.ServiceBrowserNew(avahi.IF_UNSPEC, + avahi.PROTO_INET, stype, 'local', dbus.UInt32(0))), + avahi.DBUS_INTERFACE_SERVICE_BROWSER) + + sbrowser.connect_to_signal("ItemNew", self.new_service) + sbrowser.connect_to_signal('ItemRemove', self.remove_service) + + def mainLoop(self): + gobject.MainLoop().run() + + def new_service(self, interface, protocol, name, stype, domain, flags): + if flags & avahi.LOOKUP_RESULT_LOCAL: + # local service, skip + return + + self.server.ResolveService(interface, protocol, name, stype, + domain, avahi.PROTO_INET, dbus.UInt32(0), + reply_handler=self.service_resolved, error_handler=self.print_error) + + def remove_service(self, interface, protocol, name, stype, domain, flags): + if self.services.has_key(str(name)): + self.services.pop(str(name)) + self.callback() + print "------------------------------------------------------------" + pprint(self.services) + print "------------------------------------------------------------" + + + def service_resolved(self, *args): + service_name=str(args[2]) + if self.default_service_name and not service_name.startswith(self.default_service_name): + return + name = args[5].split('.')[0] + ip = args[7] + port = args[8] + txt = args[9] + #print "NEW hostname=%s ip=%s port=%s TXT=%s"%(name, ip, port, avahi.txt_array_to_string_array(txt)) + self.services[str(args[2])]={'port':int(port), + 'ip': str(ip), + 'hostname':str(name), + 'txt':avahi.txt_array_to_string_array(txt), + 'service_type':str(args[3]), + 'service_name':str(args[2])} + print "------------------------------------------------------------" + pprint(self.services) + print "------------------------------------------------------------" + self.callback() + + def print_error(self, *args): + print 'error_handler' + print args + + def getConnectedIP(self): + ips=[] + for srv in self.services: + ips.append(self.services[srv]['ip']) + return ips + + def callback(self): + pass + + def get_all_ips(self): + allips=[] + for srv in self.services: + allips.append(self.services[srv]['ip']) + return allips + +class ZeroconfService: + """A simple class to publish a network service with zeroconf using avahi. + + Example: + from ZeroconfService import ZeroconfService + import time + + service = ZeroconfService(name="Joe's awesome FTP server", + port=3000, stype="_ftp._tcp") + service.publish() + time.sleep(10) + service.unpublish() + """ + + def __init__(self, name, port, stype="_http._tcp", + domain="", host="", text=""): + self.name = name + self.stype = stype + self.domain = domain + self.host = host + self.port = port + self.text = text + + def publish(self): + bus = dbus.SystemBus() + server = dbus.Interface( + bus.get_object( + avahi.DBUS_NAME, + avahi.DBUS_PATH_SERVER), + avahi.DBUS_INTERFACE_SERVER) + + g = dbus.Interface( + bus.get_object(avahi.DBUS_NAME, + server.EntryGroupNew()), + avahi.DBUS_INTERFACE_ENTRY_GROUP) + + g.AddService(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC,dbus.UInt32(0), + self.name, self.stype, self.domain, self.host, + dbus.UInt16(self.port), self.text) + + g.Commit() + self.group = g + + def unpublish(self): + self.group.Reset() + + +if __name__ == "__main__": + #app=AvahiDiscover('_http._tcp', 'tcosxmlrpc') + app=AvahiDiscover( ['_workstation._tcp', '_http._tcp'] , 'tcos') + app.mainLoop() diff --git a/tcosmonitor/Initialize.py b/tcosmonitor/Initialize.py new file mode 100644 index 0000000..39c0f76 --- /dev/null +++ b/tcosmonitor/Initialize.py @@ -0,0 +1,228 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +import gtk +from gettext import gettext as _ +from time import time +import os +import sys + +import tcosmonitor.shared + +# constant to font sizes +PANGO_SCALE=1024 + + + +def print_debug(txt): + if tcosmonitor.shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + + +def crono(start, txt): + print_debug ("crono(), %s get %f seconds" %(txt, (time() - start)) ) + return + + + +class Initialize(object): + + def __init__(self, main): + print_debug ( "__init__() starting" ) + self.main=main + self.ui=self.main.ui + self.model=gtk.ListStore(str, str, str, + gtk.gdk.Pixbuf, gtk.gdk.Pixbuf, gtk.gdk.Pixbuf, + str, str, bool,bool) + + self.main.updating=True + + self.searching=False # boolean True thread running False not running + + self.main.statusbar=self.ui.get_object('statusbar') + + self.main.viewtabs=self.ui.get_object('viewtabs') + self.main.viewtabs.set_property('show-tabs', False) + self.main.viewtabs.connect("switch_page", self.on_viewtabs_change) + + self.ask_mode=None + + def on_viewtabs_change(self, widget, pointer, tabnum): + if tabnum != 0: + self.main.searchbutton.set_sensitive(False) + self.main.searchtxt.set_sensitive(False) + else: + self.main.searchbutton.set_sensitive(True) + self.main.searchtxt.set_sensitive(True) + + def init_progressbar(self): + self.main.progressbar=self.ui.get_object('progressbar') + self.main.progressbutton=self.ui.get_object('progressbutton') + self.main.progressbutton.connect('clicked', + self.main.actions.on_progressbutton_click ) + self.main.progressbar.hide() + self.main.progressbox=self.ui.get_object('progressbox') + + + + def initbuttons(self): + print_debug ( "initbuttons()" ) + self.main.quitbutton = self.ui.get_object('quitbutton') + self.main.quitbutton.connect('clicked', self.main.quitapp) + + self.main.preferencesbutton = self.ui.get_object('preferencesbutton') + self.main.preferencesbutton.connect('clicked', + self.main.actions.on_preferencesbutton_click) + + self.main.refreshbutton = self.ui.get_object('refreshbutton') + self.main.refreshbutton.connect('clicked', + self.main.actions.on_refreshbutton_click) + + self.main.fullscreenbutton = self.ui.get_object('fullscreenbutton') + self.main.fullscreenbutton.connect('clicked', + self.main.actions.on_fullscreenbutton_click) + + self.main.allhostbutton = self.ui.get_object('allhostbutton') + self.main.allhostbutton.connect('clicked', + self.main.actions.on_allhostbutton_click) + + self.main.aboutbutton = self.ui.get_object('aboutbutton') + self.main.aboutbutton.connect('clicked', + self.main.actions.on_aboutbutton_click) + + + self.main.searchbutton = self.ui.get_object('searchbutton') + self.main.searchbutton.connect('clicked', + self.main.actions.on_searchbutton_click) + + self.main.searchtxt = self.ui.get_object('searchtxt') + self.main.searchtxt.connect('activate', self.main.search_host) + + self.main.toolbar2 = self.ui.get_object('toolbar2') + + self.main.button_audio = self.ui.get_object('button_audio') + self.main.handlebox_audio = self.ui.get_object('handlebox_audio') + self.main.button_audio.connect('clicked', + self.main.button_actions, "audio") + + self.main.button_chat = self.ui.get_object('button_chat') + self.main.handlebox_chat = self.ui.get_object('handlebox_chat') + self.main.button_chat.connect('clicked', + self.main.button_actions, "chat") + + self.main.button_list = self.ui.get_object('button_list') + self.main.handlebox_list = self.ui.get_object('handlebox_list') + self.main.button_list.connect('clicked', + self.main.button_actions, "list") + + self.main.button_video = self.ui.get_object('button_video') + self.main.handlebox_video = self.ui.get_object('handlebox_video') + self.main.button_video.connect('clicked', + self.main.button_actions, "video") + + self.main.button_send = self.ui.get_object('button_send') + self.main.handlebox_send = self.ui.get_object('handlebox_send') + self.main.button_send.connect('clicked', + self.main.button_actions, "send") + + self.main.button_exe = self.ui.get_object('button_exe') + self.main.handlebox_exe = self.ui.get_object('handlebox_exe') + self.main.button_exe.connect('clicked', self.main.button_actions, "exe") + + self.main.button_text = self.ui.get_object('button_text') + self.main.handlebox_text = self.ui.get_object('handlebox_text') + self.main.button_text.connect('clicked', self.main.button_actions, "text") + + for button in ['button_audio', 'button_chat', + 'button_list', 'button_video', + 'button_send', 'button_exe', 'button_text']: + + if os.path.isfile(tcosmonitor.shared.IMG_DIR + "/%s.png" %(button)): + img=self.ui.get_object( button.replace("button", "image") ) + if img: + img.set_from_file(tcosmonitor.shared.IMG_DIR + "/%s.png" %(button) ) + else: + print_debug("WARNING: Error loading button image %s"%button) + else: + print_debug("WARNING: Image file '%s' don't exists" + %(tcosmonitor.shared.IMG_DIR + "/%s.png" %(button)) ) + + + def initabouttcos(self): + self.aboutui = gtk.Builder() + + self.aboutui.set_translation_domain(tcosmonitor.shared.PACKAGE) + self.aboutui.add_from_file(tcosmonitor.shared.GLADE_DIR + 'tcosmonitor-abouttcos.ui') + + self.main.abouttcos = self.aboutui.get_object('abouttcos') + self.main.abouttcos.hide() + self.main.abouttcos.set_icon_from_file(tcosmonitor.shared.IMG_DIR +'tcos-icon-32x32.png') + + self.main.abouttabs = self.aboutui.get_object('abouttabs') + + #self.main.abouttcos.connect("close", self.on_about_close) + self.main.abouttcos.connect("delete_event", self.main.actions.on_abouttcos_close) + + self.main.abouttcos_version=self.aboutui.get_object('abouttcos_version') + self.main.abouttcos_version.set_text(tcosmonitor.shared.version) + + self.main.donateurllabel = self.aboutui.get_object('donateurllabel') + + self.main.abouttcos_donatebutton = self.aboutui.get_object('abouttcos_donatebutton') + self.main.abouttcos_donatebutton.connect('clicked', self.main.actions.on_donateurl_click) + + # LOAD LICENSE_FILE in TextView + self.main.abouttcos_license = self.aboutui.get_object('abouttcos_license') + textbuffer = self.main.abouttcos_license.get_buffer() + if os.path.isfile(tcosmonitor.shared.LICENSE_FILE): + fd1=open(tcosmonitor.shared.LICENSE_FILE, "r") + data=fd1.read() + fd1.close() + textbuffer.set_text(data) + else: + textbuffer.set_text( _("GPL-2 license file not found") ) + + self.main.abouttcos_logo = self.aboutui.get_object('abouttcos_logo') + self.main.abouttcos_logo.set_from_file(tcosmonitor.shared.IMG_DIR +'tcos-logo.png') + + self.main.abouttcos_webbutton = self.aboutui.get_object('abouttcos_webbutton') + self.main.abouttcos_webbutton.connect('clicked', self.main.actions.on_weburl_click) + + self.main.abouttcos_donatecheck = self.aboutui.get_object('abouttcos_donatecheck') + self.main.abouttcos_donatecheck.connect('toggled', self.main.actions.on_abouttcos_donatecheck_change) + + if self.main.config.GetVar("show_about") == 1: + self.main.abouttcos.show() + self.main.abouttabs.set_current_page(0) + self.main.config.SetVar("show_about", "0") + self.main.config.SaveToFile() + + if self.main.config.GetVar("show_donate") == 1: + self.main.abouttcos.show() + self.main.abouttabs.set_current_page(self.main.abouttabs.get_n_pages()-1) + self.main.abouttcos_donatecheck.set_active(False) + else: + self.main.abouttcos_donatecheck.set_active(True) + + +if __name__ == '__main__': + init=Initialize (None) + diff --git a/tcosmonitor/LocalData.py b/tcosmonitor/LocalData.py new file mode 100644 index 0000000..25406d8 --- /dev/null +++ b/tcosmonitor/LocalData.py @@ -0,0 +1,812 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + + +import tcosmonitor.shared +import os +import sys +from gettext import gettext as _ +from time import time +from tcosmonitor.ping import Ping + +import utmp +from UTMPCONST import WTMP_FILE, USER_PROCESS + +import pwd, grp +import socket + +COL_HOST, COL_IP, COL_USERNAME, COL_ACTIVE, COL_LOGGED, COL_BLOCKED, COL_PROCESS, COL_TIME = range(8) + + + +unknow=_("unknow") + + +def print_debug(txt): + if tcosmonitor.shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + +def crono(start, txt): + print_debug ("crono(), %s get %f seconds" %(txt, (time() - start)) ) + return + + + +class LocalData: + def __init__(self, main): + print_debug ( "__init__()" ) + self.main=main + self.allclients=None + self.allclients=[] + self.dhostname=_("unknow") + self.hostname=None + self.username=None + self.ip=None + self.active=None + self.logged=None + self.blocked=None + self.num_process=None + self.time_login=None + self.allhostdata=[] + self.arptable=[] + if self.main: + self.cache_timeout=self.main.config.GetVar("cache_timeout") + + def newhost(self, host): + print_debug ( "newhost(%s)" %(host) ) + self.hostname=None + self.ip=host + self.username=None + self.active=None + self.logged=None + self.blocked=None + self.num_process=None + self.time_login=None + + def cache(self, ip, num): + """ + cache array is like this: + self.allhostdata [ ip, hostname, username, numprocess() , timelogged() , isLogged(bool), time() ] + 0 1 2 3 4 5 6 + """ + #print_debug ( "cache(ip=\"%s\" [ %s ])" %(ip, num) ) + for i in range(len(self.allhostdata)): + if self.allhostdata[i][0] == ip: + #print_debug ( "cache() %s cached from %s secs" %(ip, float(time() - self.allhostdata[i][6])) ) + if time() - self.allhostdata[i][6] < self.cache_timeout: + #print_debug ( "cache() IS CACHED" ) + #print_debug ( "cache() %s" %(self.allhostdata[i]) ) + return self.allhostdata[i][num] + else: + #clean cache + #print_debug ( "cache() DELETE OLD CACHE" ) + #print_debug ( self.allhostdata ) + self.allhostdata.pop(i) + print_debug ( self.allhostdata ) + return None + #print_debug ( "\n%s\n" %(self.allhostdata) ) + return None + + def add_to_cache(self, ip, num, value): + print_debug ( "add_to_cache(\"%s\", \"%s\", \"%s\")" %(ip, num, value) ) + + if self.cache(ip, num) != None: + #print_debug ( "add_to_cache() already cached" ) + return + + new=True + for host in self.allhostdata: + if host[0] == ip: + new=False + + if new: + self.allhostdata.append( [ip, None, None, None, None, None, time() ] ) + + for i in range(len(self.allhostdata)): + if self.allhostdata[i][0] == ip: + if self.allhostdata[i][num] == value: + if time() - self.allhostdata[i][6] < self.cache_timeout: + print_debug ( "cached at %s secs" %(float(time() - self.allhostdata[i][6])) ) + return + # save value in num pos + #print_debug ( "add_to_cache(%s)[%d]=%s EDIT HOST" %(ip, num, value) ) + self.allhostdata[i][num]=value + self.allhostdata[i][6]=time() + + #print_debug ( self.allhostdata ) + + def get_username(self): + return pwd.getpwuid(os.getuid())[0] + + def get_userid(self): + return os.getuid() + + def user_in_group(self, user=None, group=None): + print_debug("in group tcos: %s"%(self.main.ingroup_tcos)) + if self.main.ingroup_tcos: + return self.main.ingroup_tcos + if not user: + user=self.get_username() + sgroups=grp.getgrall() + if user == "root": + return True + for (sgroup, spass, sid, susers) in sgroups: + if sgroup == group and user in susers: + print_debug("user %s is in group %s"%(user, sgroup)) + return True + return False + + def sorted_copy(self, alist): + # inspired by Alex Martelli + # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52234 + indices = map(self._generate_index, alist) + decorated = zip(indices, alist) + decorated.sort() + return [ item for index, item in decorated ] + + def _generate_index(self, txt): + """ + Splits a string into alpha and numeric elements, which + is used as an index for sorting" + """ + # + # the index is built progressively + # using the _append function + # + index = [] + def _append(fragment, alist=index): + if fragment.isdigit(): + fragment = int(fragment) + alist.append(fragment) + + # initialize loop + prev_isdigit = txt[0].isdigit() + current_fragment = '' + # group a string into digit and non-digit parts + for char in txt: + curr_isdigit = char.isdigit() + if curr_isdigit == prev_isdigit: + current_fragment += char + else: + _append(current_fragment) + current_fragment = char + prev_isdigit = curr_isdigit + _append(current_fragment) + return tuple(index) + + + def GetAllClients(self, method): + """ + Read active connections at 6000 local port + OTHER BEST METHOD??? "who" ??? + read netstat -putan|grep 6000|awk '{print $5}'| awk -F ":" '{print $2}| sort|uniq' + """ + + if method == "nmap": + self.allclients=[] + interface=self.main.config.GetVar("network_interface") + print_debug ( "GetAllClients() using method \"nmap\" in interface %s" %(interface) ) + + ping=Ping(self.main) + ss=ping.get_net_address(interface) + if ss == None: + self.main.write_into_statusbar( \ + _("Selected network inteface (%s) don't have IP address" ) %(interface) ) + return [] + print_debug ( "GetAllClients() method=nmap starting worker without dog iface=%s ip=%s" %(interface, ss) ) + self.main.worker=tcosmonitor.shared.Workers(self.main, ping.ping_iprange_nmap, [ss], dog=False ) + self.main.worker.start() + + return [] + + elif method == "ping": + self.allclients=[] + interface=self.main.config.GetVar("network_interface") + print_debug ( "GetAllClients() using method \"ping\" in interface %s" %(interface) ) + + ping=Ping(self.main) + ss=ping.get_ip_address(interface) + if ss == None: + self.main.write_into_statusbar( \ + _("Selected network inteface (%s) don't have IP address" ) %(interface) ) + return [] + print_debug ( "GetAllClients() method=ping starting worker without dog iface=%s ip=%s" %(interface, ss) ) + self.main.worker=tcosmonitor.shared.Workers(self.main, ping.ping_iprange, [ss], dog=False ) + self.main.worker.start() + + return [] + + elif method == "netstat": + print_debug ( "GetAllClients() using method \"netstat\" in port 600[0-9]" ) + start=time() + self.allclients=[] + self.hostname=None + #read this command output + cmd="LC_ALL=C LC_MESSAGES=C netstat -putan 2>/dev/null | grep \":600[0-9] \"| grep ESTABLISHED | awk '{print $5}'" + + output=self.main.common.exe_cmd(cmd) + + #avoid to have a spimple string + if isinstance(output, str): + output=[output] + + for xhost in output: + host=xhost.split(':', 1)[0] + if host != "" and host != "0.0.0.0": + if host not in self.allclients: + #print(host) + self.allclients.append(host) + # sort list + self.allclients.sort() + + # sort numeric + self.allclients = self.sorted_copy(self.allclients) + + # check for notshowwhentcosmonitor + if self.main.config.GetVar("notshowwhentcosmonitor") == 1: + # if $DISPLAY = xx.xx.xx.xx:0 remove from allclients + try: + if str(tcosmonitor.shared.parseIPAddress(os.environ["DISPLAY"])) != '': + # running tcosmonitor on thin client + i=str(tcosmonitor.shared.parseIPAddress(os.environ["DISPLAY"])) + self.allclients.pop(i) + except Exception, err: + print_debug("GetAllClients() can't read DISPLAY, %s"%err) + + # onlys show host running tcosxmlrpc in 8998 or 8999 port + if self.main.config.GetVar("onlyshowtcos") == 1: + if hasattr(self.main, "write_into_statusbar"): + self.main.write_into_statusbar( _("Testing if found clients have 8998 or 8999 port open...") ) + hosts=[] + for host in self.allclients: + # view status of port 8998 or 8999 + if self.main.xmlrpc.newhost(host): + if self.main.xmlrpc.GetVersion(): + print_debug("GetAllClients() host=%s ports 8998 or 8999 OPEN" %(host)) + hosts.append(host) + else: + print_debug("GetAllClients() host=%s ports 8998 or 8999 OPEN but not tcosxmlrpc" %(host)) + else: + print_debug("GetAllClients() host=%s ports 8998 or 8999 CLOSED" %(host)) + #hosts.append(host) + self.allclients=hosts + + + print_debug ( "GetAllClients() Host connected=%s" %(self.allclients) ) + crono(start, "GetAllClients()") + return self.allclients + + elif method == "consolekit": + print_debug ( "GetAllClients() using method \"consolekit\"" ) + self.allclients=[] + from tcosmonitor.Sessions import Connections + conobj=Connections() + for conn in conobj.connections: + if not conn['is_local']: + self.allclients.append(conn['remote_host_name']) + return self.allclients + + elif method == "avahi": + print_debug ( "GetAllClients() using method \"avahi\"" ) + self.allclients=[] + if not hasattr(self.main, 'avahi'): + from tcosmonitor.Avahi import AvahiDiscover + self.main.avahi=AvahiDiscover( ['_workstation._tcp'] , 'tcos') + self.main.avahi.callback=self.main.actions.populate_host_list + + return self.main.avahi.get_all_ips() + + else: + self.allclients=[] + if len(self.main.static.data) < 1: + tcosmonitor.shared.error_msg( _("Static list method configured but no hosts in list.\n\nPlease, open preferences, click on 'Open Static Host list' and add some hosts.") ) + return self.allclients + + ping=Ping(self.main) + + for host in self.main.static.data: + # we have a single ip or range of ips?? + ip=host[0] + if ip.find("-") != -1: + base=ip.split(".") + minip=int(base[3].split("-")[0]) + maxip=int(base[3].split("-")[1]) + if minip < maxip: + for i in range(minip, maxip): + newip=".".join(base[0:3]) + ".%s" %(i) + self.allclients.append(newip) + else: + for i in range(maxip, minip): + newip=".".join(base[0:3]) + ".%s" %(i) + self.allclients.append(newip) + else: + self.allclients.append(ip) + + self.main.worker=tcosmonitor.shared.Workers(self.main, ping.ping_iprange_static, [self.allclients], dog=False ) + self.main.worker.start() + return [] + + + def ipValid(self, ip): + # ip is XXX.XXX.XXX.XXX + # http://mail.python.org/pipermail/python-list/2006-March/333963.html + + try: + xip=ip.split('.') + if len(xip) != 4: + #print_debug ( "ipValid() len != 4" ) + return False + for block in xip: + if int(block) < 0 or int(block) >= 255: + print_debug ( "ipValid() block < 0 or >= 255 %s" %(block) ) + return False + return True + except Exception, err: + print_debug("ipValid() Exception, error=%s"%err) + return False + + def GetIpAddress(self, hostname): + try: + return socket.getaddrinfo(hostname, None)[0][4][0] + except Exception, err: + print_debug("GetIpAddress() Exception, error=%s"%err) + return None + + def GetHostname(self, ip): + """ + Try to resolve ip to hostname + first read /etc/hosts + second search into dhcpd.conf + """ + print_debug("GetHostname() ip=%s" %(ip)) + ######## cache( ip, 1=hostname) + cached=self.cache(ip, 1) + if cached != None: + print_debug("GetHostname() return cached DATA '%s'"%cached) + return cached + + start=time() + #if self.hostname != None: + # return self.hostname + + self.hostname=unknow + + # use python-dns module to search for reverse DNS + self.hostname=self.main.common.revlookup(ip) + if self.hostname != unknow: + self.add_to_cache( ip, 1 , self.hostname ) + return self.hostname + + ######## new method ######### + old_timeout=socket.getdefaulttimeout() + try: + socket.setdefaulttimeout(2) + self.hostname = socket.gethostbyaddr(ip)[0] + self.add_to_cache( ip, 1 , self.hostname ) + socket.setdefaulttimeout(old_timeout) + return self.hostname + except Exception, err: + print_debug("GetHostname() Exception, error=%s"%err) + socket.setdefaulttimeout(old_timeout) + + #read hostname from /etc/hosts + fd=file("/etc/hosts", 'r') + allfile=fd.read() + allfile=allfile.split('\n') + fd.close() + print_debug ( "GetHostname() searching ip=%s" %(ip) ) + for line in allfile: + if line.find('#')==0: + continue + if line.find(' ')==0: + continue + if len(line) == 0: + continue + + # split cuts with '\t' or ' ' + xline=line.split() + + #print_debug ( "xline=%s" %(xline) ) + if self.ipValid(xline[0]): + if xline[0]==ip and len(xline) == 2: + self.hostname = xline[1] + self.add_to_cache( ip, 1 , self.hostname ) + return self.hostname + + + print_debug ( "GetHostname() search in /etc/hosts no results, try DHCP leases """ ) + + #search in dhcpd.conf if /etc/dhcp3/dhcpd.conf exists + if not os.path.isfile("/etc/dhcp3/dhcpd.conf"): + print_debug ( "GetHostname() /etc/dhcp3/dhcpd.conf not found" ) + crono(start, "GetHostname()") + # save into cache + self.add_to_cache( ip, 1 , self.hostname ) + return self.hostname + else: + cmd="grep -A 3 -B 3 \"fixed.*%s;\" /etc/dhcp3/dhcpd.conf|grep -v \"^#\"|grep host|awk '{print $2}'" %(ip) + print_debug ( "GetHostname(%s) cmd=\"%s\"" %(ip, cmd) ) + stdout = self.main.common.exe_cmd(cmd, verbose=0, background=False, lines=1) + output = stdout.readlines() + if len(output) > 1: + print_debug ( "GetHostname() DHCP have many leases=%s" %(output) ) + crono(start, "GetHostname()") + # save into cache + self.add_to_cache( ip, 1 , self.hostname ) + return self.hostname + + elif len(output) == 0: + print_debug ( "GetHostname() DHCP not found enter" ) + crono(start, "GetHostname()") + # save into cache + self.add_to_cache( ip, 1 , self.hostname ) + return self.hostname + + else: + for lease in output: + self.hostname=lease.replace('\n', '') + print_debug ( "GetHostname() found DHCP hostname=%s for ip=%s" %(self.hostname, ip) ) + crono(start, "GetHostname()") + # save into cache + self.add_to_cache( ip, 1 , self.hostname ) + return self.hostname + + crono(start, "GetHostname()") + # save into cache + self.add_to_cache( ip, 1 , self.hostname ) + return self.hostname + + def GetUsernameAndHost(self, ip): + print_debug("GetUsernameAndHost() => get username and host") + if self.username != None and self.username != tcosmonitor.shared.NO_LOGIN_MSG: + username=self.username + else: + username=self.GetUsername(ip) + + if self.main.xmlrpc.IsStandalone(ip=ip): + return "%s:%s" % (username, ip) + else: + return username + + def isLastExclude(self, username, ingroup=None): + print_debug("isExclude() username=%s ingroup=%s "%(username, ingroup) ) + exclude="noexclude" + if ingroup != None: + try: + cmd="groups %s 2>/dev/null" %username + usersingroup=[] + usersingroup=self.main.common.exe_cmd(cmd).split() + #usersingroup=grp.getgrnam(ingroup)[3] + except Exception, err: + usersingroup=[] + print_debug("usersingroup: %s" %usersingroup) + for group in usersingroup: + if ingroup == group: + exclude="exclude" + return exclude + + def GetLast(self, ip, ingroup=None): + start=time() + last=None + data={} + if ip != "" and not self.ipValid(ip): + ip=self.GetIpAddress(ip) + hostname=self.GetHostname(ip) + print_debug("GetLast() ip=%s hostname=%s "%(ip, hostname) ) + + if self.main.config.GetVar("consolekit") == 1: + # try to connect with GDM througth dbus to read all + # sessions & display info, better than read wtmp + if os.path.isfile("/etc/dbus-1/system.d/gdm.conf"): + from tcosmonitor.Sessions import Sessions + app=Sessions() + for session in app.sessions: + if session.remote_host_name == ip: + print_debug("GetLast() session=%s"%session) + crono(start, "GetLast()") + data= {"pid":0, + "user":session.user, + "host":tcosmonitor.shared.parseIPAddress(session.remote_host_name), + "time":session.since, + "timelogged":session.diff, + "exclude":self.isLastExclude(session.user, ingroup)} + return data + + + for i in range(10): + last_file=WTMP_FILE + if i != 0: + last_file=WTMP_FILE+".%d" %i + if os.path.isfile(last_file): + print_debug("GetLast() Searching in %s" %last_file) + a = utmp.UtmpRecord(last_file) + while 1: + b = a.getutent() + if not b: + break + if b[0] == USER_PROCESS: + uthost=str(tcosmonitor.shared.parseIPAddress(b.ut_host)) + utline=str(tcosmonitor.shared.parseIPAddress(b.ut_line)) + half1="%s" %(uthost[:(len(uthost)/2)]) + half2="%s" %(uthost[(len(uthost)/2):]) + if half1 == half2 and str(tcosmonitor.shared.parseIPAddress(half1)) == utline: + b.ut_host = half1 + else: + b.ut_host = uthost + #print_debug(" ==> '%s' != '%s' ut_line=%s" %(uthost, ip, b.ut_line) ) + if uthost == ip or uthost == hostname: + if b.ut_line.startswith("pts/") or not \ + os.path.isdir("/proc/%s"%b.ut_pid): + continue + print_debug(" Ip \"%s:0\" => found host=%s hostname=%s ut_line=%s user=%s pid=%s" % \ + (ip, hostname, b.ut_host, b.ut_line, b.ut_user, b.ut_pid)) + last=b + a.endutent() + if last and os.path.isdir("/proc/%s"%last.ut_pid): + break + + if last and os.path.isdir("/proc/%s"%last.ut_pid): + # take diff between now and login time + diff=time()-last.ut_tv[0] + + # get days and set diff to rest + days=int(diff/(3600*24)) + diff=diff-days*3600*24 + + # get hours and set diff to rest + hours=int(diff/3600) + diff=diff-hours*3600 + + # get minutes and set seconds to rest + minutes=int(diff/60) + seconds=int(diff-minutes*60) + + print_debug ("GetLast() days=%s hours=%s minutes=%s seconds=%s"%(days, hours, minutes, diff)) + + # only print days if > 0 + if days == 0: + timelogged="%02dh:%02dm"%(hours,minutes) + else: + timelogged="%dd %02dh:%02dm"%(days,hours,minutes) + + exclude=self.isLastExclude(last.ut_user, ingroup) + + data={"pid":last.ut_pid, "user":last.ut_user, "host":last.ut_host.split(":")[0], "time":last.ut_tv[0], "timelogged":timelogged, "exclude":exclude} + print_debug("GetLast() data=%s"%data) + crono(start, "GetLast()") + return data + + def GetUsername(self, ip): + """ + read username + """ + ######## cache( ip, 1=hostname) + # FIXME esto falla mas que una escopeta de feria + #cached=self.cache(ip, 2) + #if cached != None: + # print_debug ( "GetUsername() RETURNING CACHE DATA" ) + # return cached + + #if self.username != None: + # return self.username + + self.username=tcosmonitor.shared.NO_LOGIN_MSG + + if self.main.xmlrpc.IsStandalone(ip=ip): + print_debug("GetUsername(%s) standalone" %ip) + self.username=self.main.xmlrpc.GetStandalone("get_user") + return self.username + + print_debug("GetUsername(%s) NO standalone" %ip) + + if not self.IsActive(ip): + print_debug ( "GetUsername(%s) not active, returning NO_LOGIN_MSG" %(ip) ) + return tcosmonitor.shared.NO_LOGIN_MSG + + output=self.GetLast(ip) + if output and output['user']: + self.username=output['user'] + self.add_to_cache( ip, 2 , self.username ) + return self.username + + print_debug ( "GetUsername() fail to search username, return unknow" ) + self.add_to_cache( ip, 2 , self.username ) + return self.username + + def IsActive(self, host): + """ + return True or False if host is active + use xmlrpc echo + """ + #print_debug ( "IsActive(%s) = %s " %(host, self.main.xmlrpc.GetVersion()) ) + if not self.main.xmlrpc.newhost(host): + return False + if self.main.xmlrpc.GetVersion() != None: + print_debug ( "IsActive(%s)=True" %(host) ) + return True + else: + print_debug ( "IsActive(%s)=False" %(host) ) + return False + + def IsLogged(self, host): + """ + return True if is logged + """ + if not self.main.xmlrpc.newhost(host): + return False + print_debug("IsLogged() => Username=%s" %self.username) + + if self.username == None: + self.GetUsername(host) + + if self.username == tcosmonitor.shared.NO_LOGIN_MSG or self.username == None: + return False + elif self.username != None and self.username != tcosmonitor.shared.NO_LOGIN_MSG: + return True + + + def IsBlocked(self, host): + """ + return if lockscreen is exec + """ + if not self.main.xmlrpc.newhost(host): + return False + status=self.main.xmlrpc.status_lockscreen() + if status == 1: + print_debug("IsBlocked(ip=%s) TRUE status=%s"%(host, status)) + return True + else: + print_debug("IsBlocked(ip=%s) FALSE status=%s"%(host, status)) + return False + + def IsBlockedNet(self, host, username=None): + if not self.main.xmlrpc.newhost(host): + return False + + if username != None and username != tcosmonitor.shared.NO_LOGIN_MSG: + username=username + elif self.IsLogged(host): + username=self.username + else: + return False + + if self.main.xmlrpc.IsStandalone(host): + if self.main.xmlrpc.tnc("status", username) == "disabled": + return True + else: + return False + + cmd="/usr/lib/tcos/tnc status %s"%(username) + output=self.main.common.exe_cmd(cmd) + + if output == "disabled": + return True + elif output == "enabled": + return False + elif output == "denied": + print_debug("You don't have permission to execute tcos-net controller /usr/lib/tcos/tnc") + return False + return False + + def BlockNet(self, action, username, ports=None, iface=None): + print_debug("BlockNet() action=%s username=%s ports=%s iface=%s only-ports=%s" % \ + (action, username, ports, iface, tcosmonitor.shared.tnc_only_ports)) + if ports == None: + ports="" + if iface == None: + iface="" + cmd="/usr/lib/tcos/tnc %s --only-ports=%s %s %s %s" % \ + (action, tcosmonitor.shared.tnc_only_ports, ports, iface, username) + output=self.main.common.exe_cmd(cmd) + print_debug("output=%s"%output) + return output + + def Route(self, action, ip, netmask, iface): + print_debug("Route() action=%s multicast=%s netmask=%s iface=%s" % \ + (action, ip, netmask, iface)) + cmd="/usr/lib/tcos/tnc %s %s %s %s"%(action, ip, netmask, iface) + output=self.main.common.exe_cmd(cmd) + print_debug("output=%s"%output) + return output + + def isExclude(self, host, ingroup=None): + if self.username == None or self.username == tcosmonitor.shared.NO_LOGIN_MSG: + return False + + output=self.GetLast(host, ingroup) + if output and output['exclude'] == "exclude": + return True + return False + + def GetUserID(self, username): + try: + uid=pwd.getpwnam(username)[2] + except Exception, err: + uid=None + print_debug("GetUserID Exception error %s"%err) + return uid + + def GetNumProcess(self, host): + """ + return number of process + """ + if not self.main.xmlrpc.newhost(host): + return False + + #self.username=self.GetUsername(host) + if self.username == None or self.username == tcosmonitor.shared.NO_LOGIN_MSG: + return "---" + + if self.main.xmlrpc.IsStandalone(host): + return self.main.xmlrpc.GetStandalone("get_process") + + # use uid to support long usernames (>8) + uid=self.GetUserID(self.username) + cmd="ps U %s -o pid | sed 's/[[:blank:]]//g' | grep -c ^[0-9]"%(uid) + process=self.main.common.exe_cmd(cmd) + + print_debug ("GetNumProcess() process=%s" %(process) ) + return process + + + + def GetTimeLogged(self, host): + if not self.main.xmlrpc.newhost(host): + return False + + if self.username == tcosmonitor.shared.NO_LOGIN_MSG or self.username == None: + return "---" + + output=self.GetLast(host) + if output and output['timelogged']: + return output['timelogged'] + + # no time + return "---" + + def get_arptable(self): + """ + Get a list of dictionaries with IP address MAC and iface + """ + data=[] + names=['IP address', 'HW type', 'Flags', 'HW address', 'Mask', 'Device'] + f=open("/proc/net/arp", 'r') + for l in f.readlines(): + if l.startswith("IP address"): + continue + tmp=l.strip().split() + data.append({'ip':tmp[0], 'mac':tmp[3], 'iface':tmp[5]}) + f.close() + self.arptable=data + return data + +if __name__ == '__main__': + tcosmonitor.shared.debug=True + local=LocalData (None) + #import sys + #print local.GetLast(sys.argv[1]) + #local.GetAllClients() + #local.GetHostname("192.168.0.2") + #local.GetHostname("192.168.0.10") + #local.GetUsername("192.168.0.10") + #local.GetTimeLogged("192.168.0.10") + print local.get_arptable() diff --git a/tcosmonitor/Sessions.py b/tcosmonitor/Sessions.py new file mode 100644 index 0000000..6f0976f --- /dev/null +++ b/tcosmonitor/Sessions.py @@ -0,0 +1,302 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +import pwd +import os +import time +import datetime +import gzip + +import dbus +import dateutil.parser + +CK_PATH="/var/log/ConsoleKit/" + + +def username(uid): + try: + return pwd.getpwuid( int(uid) ).pw_name + except Exception, err: + return None + +class Connection(object): + def __repr__(self): + return "<Connection '%s': %s>"%(self.session_x11_display, str(self.__dict__)) + + def __init__(self, line): + self.type=None + self.seat_id=None + self.session_type=None + self.session_remote_host_name=None + self.session_unix_user=None + self.username=None + self.session_creation_time=None + self.session_x11_display=None + self.time=None + self.strtime=None + self.diffint=0 + self.__parse__(line) + if self.session_unix_user: + self.username=username(self.session_unix_user) + if self.session_x11_display: + self.session_x11_display=self.session_x11_display.replace("'", "") + self.diff=self.diffnow() + + def __parse__(self, line): + for elem in line.split(): + if not "=" in elem and "." in elem: + self.strtime=elem + self.time=time.localtime( float(elem) ) + continue + if not "=" in elem: continue + #print elem + varname=elem.split('=')[0].replace('-', '_') + value=elem.split('=')[1] + if hasattr(self, varname): + setattr(self, varname, value) + + def diffnow(self): + diff=datetime.timedelta(0, time.time() - float(self.strtime)) + """ + >>> d = timedelta(microseconds=-1) + >>> (d.days, d.seconds, d.microseconds) + (-1, 86399, 999999) + """ + self.diffint=int(diff.days)*86400 + int(diff.seconds) + if diff.days > 0: + return "%dd %s"%(diff.days, datetime.timedelta(0, diff.seconds)) + else: + return "%s"%datetime.timedelta(0, diff.seconds) + + + +class ConsoleKitHistory(object): + def __init__(self, username=None, last=False): + self.logfiles=[] + self.data=[] + self.searchlogs() + # reverse logs + #self.logfiles.reverse() + #print self.logfiles + self.readlogs() + if username: + newdata=[] + for con in self.data: + if con.username == username: + newdata.append(con) + self.data=newdata + + # sort array by diffint + self.data=sorted(self.data, key=lambda data: data.diffint) + + if last and len(self.data)>0: + newdata=[self.data[0]] + self.data=newdata + + def readlogs(self): + for logfile in self.logfiles: + if ".gz" in logfile: + f = gzip.open(logfile, 'rb') + else: + f=open(logfile, 'r') + for line in f.readlines(): + if "type=SEAT_SESSION_ADDED" in line: + con=Connection(line) + if con.username and int(con.session_unix_user) > 500 and con.session_x11_display != '' : + self.data.append( con ) + f.close() + + def searchlogs(self): + if os.path.isfile(CK_PATH + "history"): + self.logfiles.append(CK_PATH + "history") + i=1 + if os.path.isfile(CK_PATH + "history" + "." + str(i)): + self.logfiles.append(CK_PATH + "history" + "." + str(i)) + for i in range(2,10): + if os.path.isfile(CK_PATH + "history" + "." + str(i) + ".gz"): + self.logfiles.append(CK_PATH + "history" + "." + str(i) + ".gz") + + +class Display(object): + def __repr__(self): + return "<Display '%s': %s>"%(self.x11_display, str(self.__dict__)) + + def __init__(self, obj): + self.id=None + self.seatid=None + self.active=False + self.is_local=None + + self.remote_host_name=None + self.x11_display=None + + self.unix_user=None + self.user=None + self.__parse__(obj) + + def __parse__(self, obj): + self.id=str(obj.GetId()) + self.seatid=str(obj.GetSeatId()) + + self.is_local=bool(obj.IsLocal()) + + self.remote_host_name=str(obj.GetRemoteHostname()) + self.x11_display=str(obj.GetX11DisplayName()) + + + bus = dbus.SystemBus () + manager_obj = bus.get_object ('org.freedesktop.ConsoleKit', '/org/freedesktop/ConsoleKit/Manager') + manager = dbus.Interface (manager_obj, 'org.freedesktop.ConsoleKit.Manager') + + for sessionid in manager.GetSessions(): + session_obj = bus.get_object ('org.freedesktop.ConsoleKit', sessionid) + session = dbus.Interface (session_obj, 'org.freedesktop.ConsoleKit.Session') + if session.GetX11Display() == self.x11_display: + + self.unix_user=int(session.GetUnixUser()) + if self.unix_user > 900: + self.user=username(self.unix_user) + + self.since= str(session.GetCreationTime()) + self.active=True + self.diff=self.diffnow(self.since) + return + + def diffnow(self, date): + diff=datetime.timedelta(0, time.mktime(time.gmtime()) - time.mktime(dateutil.parser.parse(date).timetuple())) + """ + if days == 0: + timelogged="%02dh:%02dm"%(hours,minutes) + else: + timelogged="%dd %02dh:%02dm"%(days,hours,minutes) + """ + if diff.days > 0: + return "%dd %s"%(diff.days, datetime.timedelta(0, diff.seconds)) + else: + return "%s"%datetime.timedelta(0, diff.seconds) + +class Sessions(object): + def __init__(self): + self.sessions=[] + self.__get_all__() + pass + + def __get_all__(self): + bus = dbus.SystemBus () + manager_obj = bus.get_object ('org.gnome.DisplayManager', '/org/gnome/DisplayManager/Manager') + manager = dbus.Interface (manager_obj, 'org.gnome.DisplayManager.Manager') + + sessions=[] + for display in manager.GetDisplays(): + display_obj = bus.get_object ('org.gnome.DisplayManager', display) + session = dbus.Interface (display_obj, 'org.gnome.DisplayManager.Display') + self.sessions.append( Display(session) ) + +class Connections(object): + def __init__(self): + self.connections=[] + self.__get_all__() + + def __get_all__(self): + bus = dbus.SystemBus() + manager_obj = bus.get_object ('org.freedesktop.ConsoleKit', '/org/freedesktop/ConsoleKit/Manager') + manager = dbus.Interface (manager_obj, 'org.freedesktop.ConsoleKit.Manager') + + for sessionid in manager.GetSessions(): + session_obj = bus.get_object ('org.freedesktop.ConsoleKit', sessionid) + session = dbus.Interface (session_obj, 'org.freedesktop.ConsoleKit.Session') + + userid=int(session.GetUnixUser()) + usernametxt=None + active=False + diff=None + if str(session.GetSessionType()) != 'LoginWindow':#FIXME userid > 900: better??? + usernametxt=username(userid) + active=True + diff=self.diffnow(str(session.GetCreationTime())) + + con={'unix_user':userid, + 'user':usernametxt, + 'since':str(session.GetCreationTime()), + 'active':active, + 'diff':diff, + #'id':str(session.GetId()), + 'is_local':bool(session.IsLocal()), + 'remote_host_name':str(session.GetRemoteHostName()), + 'x11_display':str(session.GetX11Display()) + } + self.connections.append(con) + + def diffnow(self, date): + diff=datetime.timedelta(0, time.mktime(time.gmtime()) - time.mktime(dateutil.parser.parse(date).timetuple())) + """ + if days == 0: + timelogged="%02dh:%02dm"%(hours,minutes) + else: + timelogged="%dd %02dh:%02dm"%(days,hours,minutes) + """ + if diff.days > 0: + return "%dd %s"%(diff.days, datetime.timedelta(0, diff.seconds)) + else: + return "%s"%datetime.timedelta(0, diff.seconds) + + +class MultiSeat(Connections): + def __init__(self): + Connections.__init__(self) + EMPTY={'is_local': None, 'unix_user': None, 'remote_host_name': None, 'active': None, 'diff': '', 'x11_display': '', 'since': '', 'user': ''} + multiseats={} + for seat in self.get_seats(): + multiseats[seat]=EMPTY + multiseats[seat]['x11_display']=":%s"%seat + isrunning=False + for con in self.connections: + if con['x11_display'] == ":%s"%seat: + multiseats[seat]=con + isrunning=True + multiseats[seat]['running']=isrunning + self.connections=multiseats + + def get_seats(self): + if os.path.isdir('/dev/usbseat/'): + return ['0'] + os.listdir('/dev/usbseat/') + return ['0'] + + +if __name__ == "__main__": +# # search for last connection of user prueba +# app=ConsoleKitHistory(None, last=False) +# from pprint import pprint +# for con in app.data: +# pprint (con) +# print "\n" + + +# print "\n------------------------------\n" + +# # list all connections +# app=Sessions() +# for session in app.sessions: +# print(session) +# print "\n" + + app=Connections() + for con in app.connections: + print con diff --git a/tcosmonitor/TcosActions.py b/tcosmonitor/TcosActions.py new file mode 100644 index 0000000..e13d001 --- /dev/null +++ b/tcosmonitor/TcosActions.py @@ -0,0 +1,459 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +from time import time +import gobject +import gtk +from gettext import gettext as _ +import sys + + +import tcosmonitor.shared + +def print_debug(txt): + if tcosmonitor.shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + +def crono(start, txt): + print_debug ("crono(), %s get %f seconds" %(txt, (time() - start)) ) + return + + + +class TcosActions: + def __init__(self, main): + print_debug ( "__init__()" ) + self.main=main + self.button_action_audio=None + self.button_action_chat=None + self.button_action_list=None + self.button_action_video=None + self.button_action_send=None + self.button_action_exe=None + self.button_action_text=None + self.excludes=0 + self.lenclients=0 + #self.model=self.main.init.model + #self.main.progressstop_args={} + + def on_allhostbutton_click(self, widget): + print_debug("on_allhostbutton_click() ....") + event = gtk.gdk.Event(gtk.gdk.BUTTON_PRESS) + self.main.menus.RightClickMenuAll() + self.main.allmenu.popup( None, None, None, event.button, event.time) + return True + + def on_preferencesbutton_click(self, widget): + self.main.pref.show() + + def on_aboutbutton_click(self, widget): + #self.main.about.show() + self.main.abouttcos.show() + + def on_fullscreenbutton_click(self, widget): + if self.main.is_fullscreen: + self.main.mainwindow.unfullscreen() + self.main.is_fullscreen=False + self.main.fullscreenbutton.set_stock_id("gtk-fullscreen") + else: + self.main.mainwindow.fullscreen() + self.main.is_fullscreen=True + self.main.fullscreenbutton.set_stock_id("gtk-leave-fullscreen") + + def on_progressbutton_click(self, widget): + print_debug( "on_progressbutton_click()" ) + + if not self.main.worker.is_stoped(): + self.main.worker.stop() + self.main.progressbutton.hide() + + + def on_refreshbutton_click(self, widget): + if self.main.config.GetVar("xmlrpc_username") == "" or self.main.config.GetVar("xmlrpc_password") == "": + return + self.main.write_into_statusbar ( _("Searching for connected hosts...") ) + + # clear cached ips and ports + self.main.xmlrpc.resethosts() + self.datatxt = self.main.datatxt + # clear datatxt if len allclients is 0 + self.datatxt.clean() + self.lenclients=0 + self.excludes=0 + + method=self.main.config.GetVar("scan_network_method") + + if method in ['ping', 'static', 'nmap']: + # clean icons and files + self.main.listview.clear() + self.main.iconview.clear() + self.main.classview.clear() + allclients=self.main.localdata.GetAllClients(self.main.config.GetVar("scan_network_method")) + # ping will call populate_hostlist when finish + return + else: + # clean icons and files + self.main.listview.clear() + self.main.iconview.clear() + self.main.classview.clear() + allclients=self.main.localdata.GetAllClients(self.main.config.GetVar("scan_network_method")) + if len(allclients) == 0: + self.main.write_into_statusbar ( _("Not connected hosts found.") ) + return + self.main.write_into_statusbar ( _("Found %d hosts" ) %len(allclients) ) + self.lenclients=len(allclients) + # populate_list in a thread + self.main.worker=tcosmonitor.shared.Workers(self.main, \ + self.populate_hostlist, + [allclients] ) + self.main.worker.start() + return + + + def on_searchbutton_click(self, widget): + if self.main.config.GetVar("xmlrpc_username") == "" or \ + self.main.config.GetVar("xmlrpc_password") == "": + return + print_debug ( "on_searchbutton_click()" ) + self.main.search_host(widget) + + def on_donatebutton_click(self, widget): + self.main.donatewindow.show() + + def on_donatewindow_close(self, *args): + notshowagain=self.main.donateshowagain.get_active() + if notshowagain: + self.main.config.SetVar("show_donate", "0") + self.main.config.SaveToFile() + self.main.donatewindow.hide() + return True + + def on_donateurl_click(self, *args): + url=self.main.donateurllabel.get_text() + self.main.common.exe_cmd("x-www-browser %s"%url, \ + verbose=0, \ + background=True) + + def on_weburl_click(self, *args): + self.main.common.exe_cmd("x-www-browser %s" % tcosmonitor.shared.website, \ + verbose=0, \ + background=True) + + def on_abouttcos_close(self, *args): + self.main.abouttcos.hide() + return True + + def on_abouttcos_donatecheck_change(self, *args): + notshowagain=self.main.abouttcos_donatecheck.get_active() + if notshowagain: + self.main.config.SetVar("show_donate", "0") + self.main.config.SaveToFile() + else: + self.main.config.SetVar("show_donate", "1") + self.main.config.SaveToFile() + ############################################################################ + + def populate_host_list(self): + #allclients=self.main.localdata.GetAllClients( self.main.config.GetVar("scan_network_method") ) + #Thread( target=self.populate_hostlist, args=([allclients]) ).start() + # clear cached ips and ports + self.main.xmlrpc.resethosts() + self.datatxt = self.main.datatxt + # clear datatxt if len allclients is 0 + self.datatxt.clean() + self.lenclients=0 + self.excludes=0 + self.main.write_into_statusbar ( _("Searching for connected hosts...") ) + + # clean icons and files + self.main.listview.clear() + self.main.iconview.clear() + self.main.classview.clear() + + method=self.main.config.GetVar("scan_network_method") + + if method in ['ping', 'static', 'nmap']: + allclients=self.main.localdata.GetAllClients(self.main.config.GetVar("scan_network_method")) + self.main.refreshbutton.set_sensitive(True) + return False + # ping will call populate_hostlist when finish + + elif method == 'avahi': + allclients=self.main.avahi.get_all_ips() + if not allclients: + self.main.write_into_statusbar ( _("Not connected hosts found.") ) + return False + + if len(allclients)>0: + self.main.write_into_statusbar ( _("Found %d hosts" ) %len(allclients) ) + self.main.worker=tcosmonitor.shared.Workers(self.main, self.populate_hostlist, [allclients] ) + self.main.worker.start() + return False + + else: + allclients=self.main.localdata.GetAllClients(self.main.config.GetVar("scan_network_method")) + if len(allclients) != 0: + self.main.write_into_statusbar ( _("Found %d hosts" ) %len(allclients) ) + # populate_list in a thread + self.lenclients=len(allclients) + self.main.worker=tcosmonitor.shared.Workers(self.main, self.populate_hostlist, [allclients] ) + self.main.worker.start() + return False + self.main.write_into_statusbar ( _("Not connected hosts found.") ) + self.main.refreshbutton.set_sensitive(True) + + print_debug ( "POPULATE_HOST_LIST() returning %s" %(self.main.updating) ) + #return self.main.updating + return False + + def set_progressbar(self, txt, number, show_percent=True): + percent=int(number*100) + if show_percent: + self.main.progressbar.set_text("%s (%d %%)" %(txt, percent)) + else: + self.main.progressbar.set_text("%s" %(txt)) + self.main.progressbar.set_fraction(number) + + def update_progressbar(self, number): + number=float(number) + if number > 1: + return + print_debug( "update_progressbar() set number=%f" %(number) ) + self.main.progressbar.set_fraction(number) + + def populate_hostlist(self, clients): + print_debug ( "populate_hostlist() init" ) + start1=time() + + # clean list + print_debug ( "populate_hostlist() clear list and start progressbar!!!" ) + + self.main.common.threads_enter("TcosActions:populate_hostlist show progressbar") + + if tcosmonitor.shared.disable_textview_on_update and self.main.iconview.isactive(): + self.main.tabla.set_sensitive(True) + + #disable refresh button + self.main.refreshbutton.set_sensitive(False) + self.main.progressbar.show() + self.main.progressbutton.show() + self.set_progressbar( _("Searching info of hosts..."), 0) + if self.main.config.GetVar("listmode") == "both": + self.main.listview.clear() + self.main.iconview.clear() + self.main.classview.clear() + elif self.main.listview.isenabled(): + self.main.listview.clear() + elif self.main.iconview.isenabled(): + self.main.iconview.clear() + elif self.main.classview.isenabled(): + self.main.classview.clear() + self.main.common.threads_leave("TcosActions:populate_hostlist show progressbar") + + inactive_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'inactive.png') + active_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'active.png') + active_ssl_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'active_ssl.png') + + logged_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'logged.png') + unlogged_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'unlogged.png') + + locked_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'locked.png') + locked_net_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'locked_net.png') + locked_net_screen_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'locked_net_screen.png') + unlocked_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'unlocked.png') + dpms_off_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'menu_dpms_off.png') + dpms_on_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'menu_dpms_on.png') + + i=0 + for host in clients: + start2=time() + try: + if self.main.worker.is_stoped(): + print_debug ( "populate_hostlist() WORKER IS STOPPED" ) + break + except Exception, err: + print_debug("populate_hostlist() can't read worker status, error=%s"%err) + i += 1 + self.main.common.threads_enter("TcosActions:populate_hostlist show connecting") + self.main.progressbar.show() + self.set_progressbar( _("Connecting to %s...") %(host), float(i)/float(len(clients)) ) + self.main.common.threads_leave("TcosActions:populate_hostlist show connecting") + + + self.main.localdata.newhost(host) + # Avoid frezee tcosmonitor trying to connect always + if not self.main.xmlrpc.newhost(host): + print_debug("Host %s is not tcosxmlrpc, continue with populate_hostlist..." %host) + continue + + data={} + data['host']=host + data['ip']=host + data['standalone']=False + data['logged']=False + print_debug("populate_hostlist() => get username") + data['username']=self.main.localdata.GetUsername(data['ip']) + + if data['username'].startswith('error: tcos-last'): + data['username']="---" + + if tcosmonitor.shared.dont_show_users_in_group != None and not data['username'] in ["---", None]: + if self.main.xmlrpc.IsStandalone(data['ip']): + groupexclude=self.main.xmlrpc.GetStandalone("get_exclude", \ + tcosmonitor.shared.dont_show_users_in_group) + print_debug("***standalone***, get_exclude(%s)=%s"%(data['ip'], groupexclude)) + else: + groupexclude=self.main.localdata.isExclude(data['ip'], \ + tcosmonitor.shared.dont_show_users_in_group) + print_debug("***thin-client***, isExclude(%s)=%s"%(data['ip'], groupexclude)) + + if groupexclude in ['exclude', True]: + print_debug("Host %s excluded, blacklisted by group" %data['ip']) + self.excludes+=1 + self.main.write_into_statusbar ( _("Found %(len)d hosts, %(ex)d hosts excluded" ) %{"len":self.lenclients, "ex":self.excludes} ) + continue + + print_debug("populate_hostlist() => get hostname") + data['hostname']=self.main.localdata.GetHostname(data['ip']) + + try: + print_debug("populate_hostlist() => get num process") + data['num_process']=self.main.localdata.GetNumProcess(data['ip']) + except Exception, err: + print_debug("populate_hostlist() Exception getting num process, error=%s"%err) + data['num_process']="---" + + print_debug("populate_hostlist() => get time logged") + if self.main.xmlrpc.IsStandalone(data['ip']): + data['time_logged']=self.main.xmlrpc.GetStandalone("get_time") + data['standalone']=True + else: + data['time_logged']=self.main.localdata.GetTimeLogged(data['ip']) + data['standalone']=False + + if not data['time_logged'] or data['time_logged'] == "" or data['time_logged'].startswith('error: tcos-last'): + data['time_logged']="---" + + print_debug("populate_hostlist() => get active connection") + if self.main.localdata.IsActive(data['ip']): + data['active']=True + if self.main.xmlrpc.sslconnection: + data['image_active']=active_ssl_image + else: + data['image_active']=active_image + else: + data['image_active']=inactive_image + data['active']=False + + print_debug("populate_hostlist() => get is logged") + if self.main.localdata.IsLogged(data['ip']): + data['image_logged']=logged_image + data['logged']=True + else: + data['image_logged']=unlogged_image + data['logged']=False + + print_debug("populate_hostlist() => get is blocked") + if self.main.localdata.IsBlocked(data['ip']): + data['blocked_screen']=True + else: + data['blocked_screen']=False + + print_debug("populate_hostlist() => get is blocked net") + if self.main.localdata.IsBlockedNet(host, data['username']): + data['blocked_net']=True + else: + data['blocked_net']=False + + print_debug("populate_hostlist() => get status dpms") + if self.main.xmlrpc.dpms('status', data['ip']) == "Off": + data['dpms_off']=True + else: + data['dpms_off']=False + + if data['dpms_off']: + data['image_blocked']=dpms_off_image + elif data['blocked_screen'] and data['blocked_net']: + data['image_blocked']=locked_net_screen_image + elif data['blocked_screen'] == False and data['blocked_net']: + data['image_blocked']=locked_net_image + elif data['blocked_screen'] and data['blocked_net'] == False: + data['image_blocked']=locked_image + else: + data['image_blocked']=unlocked_image + + if self.main.config.GetVar("listmode") == "both": + self.main.common.threads_enter("TcosActions:populate_hostlist all generate_icon") + self.main.listview.generate_file(data) + self.main.iconview.generate_icon(data) + self.main.classview.generate_icon(data) + self.main.common.threads_leave("TcosActions:populate_hostlist all generate_icon") + + elif self.main.listview.isactive(): + self.main.common.threads_enter("TcosActions:populate_hostlist LIST generate_icon") + self.main.listview.generate_file(data) + self.main.common.threads_leave("TcosActions:populate_hostlist LIST generate_icon") + + elif self.main.iconview.isactive(): + self.main.common.threads_enter("TcosActions:populate_hostlist ICON generate_icon") + self.main.iconview.generate_icon(data) + self.main.common.threads_leave("TcosActions:populate_hostlist ICON generate_icon") + + elif self.main.classview.isactive(): + self.main.common.threads_enter("TcosActions:populate_hostlist CLASS generate_icon") + self.main.classview.generate_icon(data) + self.main.common.threads_leave("TcosActions:populate_hostlist CLASS generate_icon") + + + crono(start2, "populate_host_list(%s)" %(data['ip']) ) + + self.main.common.threads_enter("TcosActions:populate_hostlist END") + self.main.progressbar.hide() + self.main.progressbutton.hide() + self.main.refreshbutton.set_sensitive(True) + self.main.progressbutton.set_sensitive(True) + + if tcosmonitor.shared.disable_textview_on_update and \ + self.main.iconview.isactive(): + self.main.tabla.set_sensitive(True) + + self.main.common.threads_leave("TcosActions:populate_hostlist END") + + try: + self.main.worker.set_finished() + except Exception, err: + print_debug("populate_hostlist() Exception setting worker status, err=%s" %err) + crono(start1, "populate_host_list(ALL)" ) + return + + def update_hostlist(self): + #if self.main.config.GetVar("populate_list_at_startup") == "1": + if float(self.main.config.GetVar("refresh_interval")) > 0: + update_every=float(self.main.config.GetVar("refresh_interval")) + if float(self.main.config.GetVar("refresh_interval")) >= 10: + update_every=float(2) + self.main.refreshbutton.set_sensitive(False) + print_debug ( "update_hostlist() every %f secs" %(update_every) ) + gobject.timeout_add(int(update_every * 1000), self.populate_host_list ) + return + +if __name__ == "__main__": + app=TcosActions(None) diff --git a/tcosmonitor/TcosClassView.py b/tcosmonitor/TcosClassView.py new file mode 100644 index 0000000..9d5ca89 --- /dev/null +++ b/tcosmonitor/TcosClassView.py @@ -0,0 +1,489 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +import sys +import gtk +from gettext import gettext as _ + + + +import tcosmonitor.shared +import os + +def print_debug(txt): + if tcosmonitor.shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + +class TcosClassView(object): + def __init__(self, main): + print_debug("__init__()") + self.main=main + self.ui=self.main.ui + self.hosts={} + self.__selected_icon=None + self.selected=[] + self.class_external_exe=None + self.class_external_video=None + self.class_external_send=None + self.avalaible_info=[ + [_("IP"), 'ip' ], + [ _("Hostname"), 'hostname' ], + [ _("Username"), 'username'], + [ _("Logged"), 'logged'], + [ _("Time log in"), 'time_logged'], + [ _("Screen locked"), 'blocked_screen'], + [ _("Network locked"), 'blocked_net'], + ] + self.default_tip = _("Place mouse on any computer to see brief info about it.\n\ +You can select and unselect multiple host clicking on every one.\n\ +Drag and drop hosts to positions and save clicking on right mouse button.") + + + self.icon_tooltips = None + + self.classview=self.ui.get_object('classview') + self.classeventbox=self.ui.get_object('classeventbox') + self.classeventbox1=self.ui.get_object('classeventbox1') + self.classview.drag_dest_set(gtk.DEST_DEFAULT_MOTION | + gtk.DEST_DEFAULT_HIGHLIGHT | + gtk.DEST_DEFAULT_DROP, + [], gtk.gdk.ACTION_MOVE) + self.classview.drag_dest_set(0, [], 0) + self.classview.connect('drag_motion', self.motion_cb) + self.classview.connect('drag_drop', self.on_drag_data_received) + self.classeventbox.connect("button_press_event", self.on_classview_click) + #self.classeventbox.connect("size-allocate", self.get_max_pos) + self.classeventbox.connect("motion-notify-event", self.on_classview_event) + + self.oldpos={} + #self.classview.set_size_request(200, 200) + self.initialX=10 + self.initialY=10 + self.position=[10,10] + self.iconsize=[115,115] + + # gtk.Frame don't support changing background color (default gray) use gtk eventbox + print_debug("setting white background") + self.classeventbox.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("white")) + self.classeventbox1.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse('white')) + self.loadpos() + + def get_max_pos(self, *args): + x, y, width, height = self.classeventbox.get_allocation() + #print_debug("get_max_pos() width=%s height=%s"%(width, height)) + return [width, height] + + + def isenabled(self): + """ + return True if only configuration enable IconView + prevent to work if ClassView is hidden + """ + if self.main.config.GetVar("listmode") == 'icons' or \ + self.main.config.GetVar("listmode") == 'both' or \ + self.main.config.GetVar("listmode") == 'class': + return True + return False + + def isactive(self): + """ + Return True if IconView is enabled and is active (We click on it) + know this getting tabindex of viewtabas widget. + 0 => active list view + 1 => active icon view + """ + if not self.isenabled: + return False + if self.main.viewtabs.get_current_page() != 2: + return False + #print_debug("isactive() ClassView Mode active") + return True + + def set_selected(self, ip): + self.__selected_icon=ip + + def get_selected(self): + return self.__selected_icon + + def get_host(self, ip): + if self.hosts.has_key(ip): + return self.hosts[ip]['hostname'] + + def __increment_position(self): + maxpos=self.get_max_pos() + #print_debug("__increment_position() self.position[0](%s) >= maxpos[0](%s) -self.iconsize[0](%s)"%(self.position[0], maxpos[0], self.iconsize[0])) + if self.position[0] + self.iconsize[0] >= maxpos[0] - self.iconsize[0]: + #print_debug("__increment_position() NEW FILE") + self.position[1]=self.position[1]+self.iconsize[1] + self.position[0]=self.initialX + else: + self.position[0]=self.position[0]+self.iconsize[0] + print_debug("__increment_position() position=%s"%(self.position)) + + def __getoverride(self, ax, ay, aip): + # read oldpos to know override saved settings + for h in self.oldpos: + if h == aip: + # self movement + continue + x, y = self.oldpos[h] + diffx=abs(ax-x) - (self.iconsize[0]-5) + diffy=abs(ay-y) - (self.iconsize[1]-20) + if diffx < 0 and diffy < 0: + #print_debug("__getoverride() h=%s self.oldpos[h]=%s => [%s,%s] diffx=%s diffy=%s"%(h, self.oldpos[h], ax, ay, diffx, diffy)) + return True + # read pos of printed icons + for w in self.classview.get_children(): + x, y, width, height = w.get_allocation() + ip=[] + for c in w.get_children(): + c.get_model().foreach(lambda model, path, iter: ip.append(model.get_value(iter, 1)) ) + if aip == ip[0]: + # self movement + continue + diffx=abs(ax-x) - (self.iconsize[0]-5) + diffy=abs(ay-y) - (self.iconsize[1]-20) + #print_debug("__getoverride() ### POSITION ### Elem[%s,%s] new[%s,%s] => abs(ax-x)=%s abs(ay-y)=%s restax=%s restay=%s"%(x,y,ax,ay,abs(ax-x), abs(ay-y), diffx, diffy )) + if diffx < 0 and diffy < 0: + print_debug("__getoverride() ### POSITION ### Elem[%s,%s] new[%s,%s] => abs(ax-x)=%s abs(ay-y)=%s restax=%s restay=%s"%(x, y, ax, ay, abs(ax-x), abs(ay-y), diffx, diffy )) + return True + return False + + def savepos(self, widget, action): + if action == "reset": + self.oldpos={} + self.main.config.SetVar("positions", "") + self.main.config.SaveToFile() + print_debug("savepos() reset to %s"%self.oldpos) + self.main.write_into_statusbar( _("Positions reset to defaults.") ) + return + for w in self.classview.get_children(): + x, y, width, height = w.get_allocation() + ip=[] + for c in w.get_children(): + c.get_model().foreach(lambda model, path, iter: ip.append(model.get_value(iter, 1)) ) + print_debug("savepos() ### POSITION ### x=%s y=%s width=%s height=%s ip=%s"%(x, y, width, height, ip)) + self.oldpos[ip[0]]=[x,y] + print_debug("savepos() self.oldpos=%s"%self.oldpos) + txt="" + for ip in self.oldpos: + txt+="%s:%s:%s,"%(ip, self.oldpos[ip][0], self.oldpos[ip][1] ) + # remove last coma + txt=txt[:-1] + print_debug("savepos() txt=%s"%txt) + self.main.config.SetVar("positions", txt) + self.main.config.SaveToFile() + self.main.write_into_statusbar( _("Positions saved.") ) + + def loadpos(self): + print_debug("loadpos()") + txt=self.main.config.GetVar("positions") + if txt == "": + return + self.oldpos={} + a=txt.split(',') + for host in a: + if len(host) < 1: + continue + h=host.split(':') + self.oldpos[h[0]]=[int(h[1]),int(h[2])] + print_debug("loadpos() self.oldpos=%s"%self.oldpos) + + def clear(self): + for w in self.classview.get_children(): + w.destroy() + self.position=[self.initialX,self.initialY] + print_debug("clear() restore position to %s"%(self.position)) + self.selected=[] + + + def generate_icon(self, data): + print_debug("generate_icon() ip=%s hostname=%s"%(data['ip'], data['hostname']) ) + + iconview=gtk.IconView() + model = gtk.ListStore(str, str, gtk.gdk.Pixbuf) + if data['username'] == tcosmonitor.shared.NO_LOGIN_MSG and not data['standalone']: + pixbuf = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + tcosmonitor.shared.icon_image_no_logged) + elif data['standalone']: + pixbuf = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + tcosmonitor.shared.icon_image_standalone) + else: + pixbuf = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + tcosmonitor.shared.icon_image_thin) + + if not data['active']: + pixbuf.saturate_and_pixelate(pixbuf, 0.6, True) + + if data['image_blocked']: + pixbuf2 = data['image_blocked'] + print_debug("generate_icon() compositing isblocked=True") + pixbuf2.composite(pixbuf, 0, 0, pixbuf.props.width, pixbuf.props.height, 0, 0, 1.0, 1.0, gtk.gdk.INTERP_HYPER, 255) + + iconview.set_model(model) + iconview.set_text_column(0) + iconview.set_pixbuf_column(2) + if hasattr(iconview.props, 'has_tooltip'): + iconview.props.has_tooltip = True + + #if data['username'] == tcosmonitor.shared.NO_LOGIN_MSG: + # model.append([data['username'], data['ip'], pixbuf]) + # show hostname instead of username in standalone + if data['standalone']: + model.append([data['hostname'].split('.')[0], data['ip'], pixbuf]) + else: + model.append([data['username'], data['ip'], pixbuf]) + + iconview.show() + # in old versions of gtk we need to put explicity iconview size + if gtk.gtk_version < (2, 10, 0): + iconview.set_size_request(pixbuf.props.width+14, pixbuf.props.height+28) + + # connect drag and drop signal with external data + iconview.drag_dest_set( gtk.DEST_DEFAULT_ALL, [( 'text/uri-list', 0, 2 ), ], gtk.gdk.ACTION_DEFAULT | gtk.gdk.ACTION_COPY) + iconview.connect( 'drag_data_received', self.on_external_drag_data_received, data['ip']) + + #iconview.set_size_request(110,110) + iconview.set_item_width(82) + button = gtk.Button() + button.set_relief(gtk.RELIEF_NONE) + button.add(iconview) + + + button.drag_source_set(gtk.gdk.BUTTON1_MASK, [], gtk.gdk.ACTION_COPY) + if data['active']: + button.connect("button_press_event", self.on_iconview_click, data['ip']) + button.connect("enter", self.on_button_enter, data['ip']) + button.set_size_request(111, 113) + button.show_all() + + if self.oldpos.has_key(data['ip']): + # we have and old possition + print_debug("generate_icon() found old position => %s"%self.oldpos[data['ip']]) + self.classview.put(button, self.oldpos[data['ip']][0], self.oldpos[data['ip']][1] ) + else: + #while self.__getoverride(self.position[0], self.position[1], data['ip'] ): + # print_debug("generate_icon() OVERRIDE ICON !!!") + # self.__increment_position() + self.classview.put(button, self.position[0], self.position[1]) + print_debug("generate_icon() put not positioned icon at [%s,%s] !!!"%(self.position[0], self.position[1])) + self.__increment_position() + + self.hosts[data['ip']]=data + + def on_external_drag_data_received( self, widget, context, x, y, selection, targetType, dtime, ip_recv): + ip=None + if not self.ismultiple(): + if not ip_recv: + return + ip=ip_recv + self.set_selected(ip) + print_debug("get_selected()=%s get_multiple()=%s" %(self.get_selected(), self.get_multiple())) + filenames=[] + files = selection.data.split('\n') + extensions = (".avi", ".mpg", ".mpeg", ".ogg", ".ogm", ".asf", ".divx", + ".wmv", ".vob", ".m2v", ".m4v", ".mp2", ".mp4", ".ac3", + ".ogg", ".mp1", ".mp2", ".mp3", ".wav", ".wma") + print_debug("on_external_drag_data_received() files=%s dtime=%s ip=%s"%(files, dtime, ip)) + for f in files: + if f: + filenames.append(f.strip().replace('%20', ' ')) + #break + if len(filenames) < 1: + return + + if filenames[0].startswith('file:///') and filenames[0].lower().endswith('.desktop') and os.path.isfile(filenames[0][7:]): + if self.class_external_exe != None: + self.class_external_exe(filenames[0][7:]) + print_debug("get_selected() ip=%s file=%s" %(self.get_selected(), filenames[0][7:])) + elif filenames[0].startswith('file:///') and filter(filenames[0].lower().endswith, extensions) and os.path.isfile(filenames[0][7:]): + if self.class_external_video != None: + self.class_external_video(filenames[0][7:]) + print_debug("get_selected() ip=%s file=%s" %(self.get_selected(), filenames[0][7:])) + elif filenames[0].startswith('file:///') and os.path.isfile(filenames[0][7:]): + if self.class_external_send != None: + self.class_external_send(filenames) + print_debug("get_selected() ip=%s file=%s" %(self.get_selected(), filenames)) + else: + tcosmonitor.shared.error_msg( _("%s is not a valid file to exe or send") %(os.path.basename(filenames[0][7:])) ) + return True + + def on_drag_data_received(self, widget, context, x, y, dtime): + button=context.get_source_widget() + if not button: + #print context + #print dir(context) + #print context.get_data() + #print context.targets + print_debug("on_drag_data_received() no button detected") + return + bx, by, width, height = button.get_allocation() + # calculate newx and newy with valid positions + newx=x-(width/2) + newy=y-(height/2) + maxpos=self.get_max_pos() + if newx < 0: + newx=10 + if newy < 0: + newy=10 + print_debug("on_drag_data_received() newx=%s newy=%s maxpos[0]=%s maxpos[1]=%s"%(newx, newy, maxpos[0], maxpos[1])) + if newx > maxpos[0]: + print_debug("on_drag_data_received() newx=%s > maxpos[0]=%s or negative"%(newx, maxpos[0])) + return + if newy > maxpos[1]: + print_debug("on_drag_data_received() newy=%s > maxpos[1]=%s or negative"%(newy, maxpos[1])) + return + # get button ip address and pass to __getoverride to not put 2 hosts (with different IP) in same position + ip=[] + for c in button.get_children(): + c.get_model().foreach(lambda model, path, iter: ip.append(model.get_value(iter, 1)) ) + if self.hosts[ip[0]]['active']: + # set unselect if host is active + self.change_select(c, ip[0]) + #if self.__getoverride(newx, newy, ip[0]): + # print_debug("on_drag_data_received() ip=%s another host is near x=%s y=%s, don't move!!"%(ip[0], x, y) ) + # self.main.write_into_statusbar( _("Can't move icon, another host is near.") ) + # return + self.classview.move(button, newx, newy) + + def motion_cb(self, widget, context, x, y, time): + context.drag_status(gtk.gdk.ACTION_MOVE, time) + return True + + def change_select(self, widget, ip): + #print_debug("change_colour() ip=%s widget=%s"%(ip,widget)) + colour_selected=gtk.gdk.color_parse("#98ec98") # green + colour_white=gtk.gdk.color_parse("white") + style = widget.get_style().copy() + + if self.isselected(ip): + style.base[gtk.STATE_NORMAL] = colour_white + style.base[gtk.STATE_PRELIGHT] = colour_white + self.set_unselect(ip) + else: + style.base[gtk.STATE_NORMAL] = colour_selected + style.base[gtk.STATE_PRELIGHT] = colour_selected + self.set_select(ip) + widget.set_style(style) + + def on_iconview_click(self, widget, event, ip): + if event.button == 3: + # right click show menu + print_debug("on_iconview_click() ip=%s" %(ip)) + self.main.menus.RightClickMenuOne( None , None, ip) + self.main.menu.popup( None, None, None, event.button, event.time) + #self.set_select(ip) + self.set_selected(ip) + return True + if event.button == 1: + # select host (change color) and call set_selected or set_unselected + for c in widget.get_children(): + self.change_select(c, ip) + + def on_classview_click(self, iv, event): + if event.button == 3: + # need to remake allmenu (for title selected|all ) + #print_debug( "on_classview_click() all=%s"%self.selected ) + self.main.menus.RightClickMenuAll() + self.main.allmenu.popup( None, None, None, event.button, event.time) + return + + def on_button_enter(self, button, ip): + txt="" + data=self.hosts[ip] + for info in self.avalaible_info: + if data[info[1]] == True: + value=_("yes") + elif data[info[1]] == False: + value=_("no") + else: + value=data[info[1]] + txt+=" %s: %s \n" %(info[0], value) + if hasattr(button, 'set_tooltip_text'): + button.set_tooltip_text(txt) + else: + self.icon_tooltips = gtk.Tooltips() #deprecated + self.icon_tooltips.set_tip(button, txt) + + def get_multiple(self): + return self.selected + + def set_select(self, ip): + print_debug("set_select() ip=%s all=%s"%(ip, self.selected)) + if ip in self.selected: + return + self.selected.append(ip) + + def set_unselect(self, ip): + if self.isselected(ip): + self.selected.remove(ip) + print_debug("set_unselect() ip=%s all=%s"%(ip, self.selected)) + + def isselected(self, ip): + if ip in self.selected: + #print_debug("isselected() TRUE ip=%s"%ip) + return True + #print_debug("isselected() FALSE ip=%s"%ip) + return False + + def ismultiple(self): + if not self.isactive(): + return False + print_debug("ismultiple() self.selected=%s"%self.selected) + if len(self.selected) > 0: + return True + else: + return False + + def on_classview_event(self, widget, event): + if not event.state: + #print_debug("on_classview_event() tip") + if hasattr(widget, 'set_tooltip_text'): + widget.set_tooltip_text(self.default_tip) + else: + self.icon_tooltips = gtk.Tooltips() # deprecated + self.icon_tooltips.set_tip(widget, self.default_tip) + + + def change_lockscreen(self, ip, pixbuf2, status_screen, status_net): + print_debug("change_lockscreen() ip=%s pixbuf=%s"%(ip, pixbuf2)) + self.hosts[ip]['blocked_screen']=status_screen + self.hosts[ip]['blocked_net']=status_net + data=self.hosts[ip] + if data['username'] == tcosmonitor.shared.NO_LOGIN_MSG: + pixbuf = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + tcosmonitor.shared.icon_image_no_logged) + else: + pixbuf = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + tcosmonitor.shared.icon_image_thin) + pixbuf2.composite(pixbuf, 0, 0, pixbuf.props.width, pixbuf.props.height, 0, 0, 1.0, 1.0, gtk.gdk.INTERP_HYPER, 255) + for w in self.classview.get_children(): + for c in w.get_children(): + model=c.get_model() + if model[0][1] == ip: + model2 = gtk.ListStore(str, str, gtk.gdk.Pixbuf) + c.set_model(model2) + c.set_text_column(0) + c.set_pixbuf_column(2) + if data['username'] == tcosmonitor.shared.NO_LOGIN_MSG: + model2.append([data['hostname'].replace('.aula',''), data['ip'], pixbuf]) + else: + model2.append([data['username'], data['ip'], pixbuf]) + #model[0][2]=pixbuf + return + + + diff --git a/tcosmonitor/TcosCommon.py b/tcosmonitor/TcosCommon.py new file mode 100644 index 0000000..ba18d13 --- /dev/null +++ b/tcosmonitor/TcosCommon.py @@ -0,0 +1,342 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +import os +import sys +import socket +import pwd +import tcosmonitor.shared +import threading +from subprocess import Popen, PIPE, STDOUT +from gettext import gettext as _ + +import netifaces + +import DNS + +from time import sleep + +def print_debug(txt): + if tcosmonitor.shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + +class TcosCommon: + + def __init__(self, main): + self.main=main + self.thread_lock=False + self.vars={} + self.extensions={} + print_debug("__init__()") + self.theme=None + + def get_username(self): + return pwd.getpwuid(os.getuid())[0] + + def get_userid(self): + return os.getuid() + + def user_in_group(self, group): + groups=self.exe_cmd("id") + if group != "": + if group in groups: + return True + else: return False + return False + + def cleanproc(self, proc): + try: + os.waitpid(proc.pid, os.WCONTINUED) + except os.error, err: + print_debug("OSError exception: %s" %err) + pass + + def exe_cmd(self, cmd, verbose=1, background=False, lines=0, cthreads=1): + try: + self.p = Popen(cmd, shell=True, bufsize=0, stdout=PIPE, stderr=STDOUT, close_fds=True) + except Exception, e: + print_debug("Exception in subprocess cmd(%s), error='%s'"%(cmd, e)) + return None + + if self.main.config.GetVar("threadscontrol") == 1 and cthreads == 1: + try: + th=threading.Thread(target=self.cleanproc, args=(self.p,) ) + th.setDaemon(1) + th.start() + except Exception, err: + msg= _("ThreadController: Found error executing %(cmd)s\n\nIf problem persist, disable Thread Controller\nin Preferences and report bug.\nError=%(error)s" %{'cmd':cmd, 'error':err}) + print_debug(msg) + self.threads_enter("TcosCommon:exe_cmd ThreadController error") + tcosmonitor.shared.error_msg(msg) + self.threads_leave("TcosCommon:exe_cmd ThreadController error") + + print_debug("Threads count: %s" %threading.activeCount()) + + if background: + return + + output=[] + stdout = self.p.stdout + if lines == 1: + return stdout + try: + result=stdout.readlines() + except Exception, e: + print_debug("Exception in subprocess::readlines() cmd(%s), error='%s'"%(cmd, e)) + return None + + for line in result: + if line != '\n': + line=line.replace('\n', '') + output.append(line) + if len(output) == 1: + return output[0] + elif len(output) > 1: + if verbose==1: + print_debug ( "exe_cmd(%s) %s" %(cmd, output) ) + return output + else: + if verbose == 1: + print_debug ( "exe_cmd(%s)=None" %(cmd) ) + return [] + + def get_ip_address(self, ifname): + print_debug("get_ip_address() ifname=%s" %(ifname) ) + if not ifname in netifaces.interfaces(): + return None + ip=netifaces.ifaddresses(ifname) + if ip.has_key(netifaces.AF_INET): + return ip[netifaces.AF_INET][0]['addr'] + return None + + def GetAllNetworkInterfaces(self): + self.vars["allnetworkinterfaces"]=[] + for dev in netifaces.interfaces(): + if not dev in tcosmonitor.shared.hidden_network_ifaces: + self.vars["allnetworkinterfaces"].append(dev) + ip=netifaces.ifaddresses(dev) + print_debug ( "GetAllNetworkInterfaces() %s" %( self.vars["allnetworkinterfaces"] ) ) + return self.vars["allnetworkinterfaces"] + + def get_my_local_ip(self, last=True, force=False): + print_debug("get_my_local_ip(), last=%s, force=%s" %(last, force)) + if force == True or not "local_ip" in self.vars or len(self.vars["local_ip"]) == 0: + #print_debug("get_my_local_ip()") + self.vars["local_ip"]=[] + for dev in self.GetAllNetworkInterfaces(): + ip=self.get_ip_address(dev) + if ip: + print_debug("get_my_local_ip() dev loop, found ip=%s"%ip) + self.vars["local_ip"].append(ip) + + print_debug("get_my_local_ip() self.vars=%s"%self.vars) + + if len(self.vars["local_ip"]) == 0: + print_debug("get_my_local_ip() NO IP found returning None") + return None + elif last: + print_debug("get_my_local_ip() last=True, returning [0]=%s"%self.vars["local_ip"][0]) + return self.vars["local_ip"][0] + else: + print_debug("get_my_local_ip() last=False, returning []=%s"%self.vars["local_ip"]) + return self.vars["local_ip"] + + def get_all_my_ips(self): + print_debug("get_all_my_ips()") + if "local_ip" in self.vars: + return self.vars["local_ip"] + return self.get_my_local_ip(last=False) + + def revlookup(self, name): + """ Copy from python-dns lazy.py + Added support for small timeout (0,5 secs) + convenience routine for doing a reverse lookup of an address""" + print_debug("revlookup name=%s"%(name) ) + + if DNS.Base.defaults['server'] == []: + DNS.Base.DiscoverNameServers() + a = name.split('.') + a.reverse() + b = ".".join(a)+'.in-addr.arpa' + # this will only return one of any records returned. + response=_("unknow") + for nameserver in DNS.Base.defaults['server']: + try: + print_debug("revlookup() reverse name=%s"%b) + c=DNS.Base.DnsRequest(b, qtype = 'ptr', timeout=0.2, server=nameserver).req() + response=c.answers[0]['data'] + except DNS.Base.DNSError, err: + print_debug("revlookup() nameserver=%s Exception Timeout, error=%s"%(nameserver,err)) + except IndexError, err: + print_debug("revlookup() nameserver=%s Exception IndexError, error=%s"%(nameserver,err)) + return response + + def lookup(self, name): + response=name + if DNS.Base.defaults['server'] == []: + DNS.Base.DiscoverNameServers() + # /etc/resolv.conf can have 2 or more nameservers + # ask every nameserver DNS + for nameserver in DNS.Base.defaults['server']: + try: + c=DNS.Base.DnsRequest(name, qtype = 'a', timeout=0.2, server=nameserver).req() + response=c.answers[0]['data'] + except DNS.Base.DNSError, err: + print_debug("lookup() nameserver=%s Exception Timeout, error=%s"%(nameserver,err)) + except IndexError, err: + print_debug("lookup() nameserver=%s Exception IndexError, error=%s"%(nameserver, err)) + return response + + def DNSgethostbyaddr(self, ip): + hostname=_("unknow") + + hostname=self.revlookup(ip) + if hostname == _("unknow"): + try: + hostname=socket.gethostbyaddr(ip)[2][0] + except Exception, err: + print_debug("DNSgethostbyaddr Exception socket.gethostbyaddr, error=%s"%err) + return hostname + + + def get_display(self, ip_mode=True): + print_debug("get_display() ip_mode=%s"%(ip_mode) ) + self.vars["display_host"]=str(tcosmonitor.shared.parseIPAddress(os.environ["DISPLAY"])) + self.vars["display_hostname"]=self.vars["display_host"] + self.vars["display_ip"]=self.vars["display_host"] + + + if self.vars["display_host"] != "": + #self.vars["display_hostname"]=self.DNSgethostbyaddr(self.vars["display_host"]) + self.vars["display_hostname"]=self.vars["display_host"] + self.vars["display_ip"]=self.lookup(self.vars["display_host"]) + + else: + print_debug("get_display() running in local DISPLAY") + self.vars["display_ip"]=self.get_my_local_ip() + if self.vars["display_ip"]: + # only get hostname if IP != None + self.vars["display_hostname"]=self.DNSgethostbyaddr(self.vars["display_ip"]) + + + if ip_mode: + display=self.vars["display_ip"] + else: + display=self.vars["display_hostname"] + + print_debug ( "get_display() ip_mode='%s' display_host=%s display_hostname=%s display_ip=%s" + %(ip_mode, self.vars["display_host"], self.vars["display_hostname"], self.vars["display_ip"]) ) + return display + + def get_extensions(self): + if "extensions" in self.vars: + return self.vars["extensions"] + self.vars["extensions"]=[] + #FIXME tcosmonitor.shared.EXTENSIONS what is this??? + for ext in os.listdir(tcosmonitor.shared.EXTENSIONS): + if ext.endswith('.py') and ext != "__init__.py" and ext != "template.py": + #print_debug("get_extensions() extension=%s" %ext) + self.vars["extensions"].append( ext.split(".py")[0] ) + print_debug("get_extensions() all=%s"%self.vars['extensions']) + return self.vars["extensions"] + + def register_extension(self, ext): + print_debug("register_extension() ext=%s"%ext) + tmp=__import__(ext, fromlist=['extensions']) + # init extension + self.extensions[ext]=tmp.__extclass__(self.main) + # call register method + self.extensions[ext].register() + + + def init_all_extensions(self): + """Init all extensions that contains a extension_filter string""" + self.extensions={} + for ext in self.get_extensions(): + try: + self.extensions[ext]=__import__("extensions." + ext) + except Exception, err: + print_debug("init_all_extensions() EXCEPTION importing '%s', error=%s"%(ext, err) ) + continue + print_debug("init_extensions() init '%s'" %(ext)) + self.register_extension( eval("self.extensions[ext]."+ext) ) + #self.init_extension( eval("self.extensions[ext]."+ext) ) + + + def threads_enter(self, fromtxt=None): + import gtk + #print_debug("===> threads_enter() FROM %s"%fromtxt) + if self.thread_lock: + self.wait() + self.thread_lock=True + gtk.gdk.threads_enter() + + def threads_leave(self, fromtxt=None): + import gtk + #print_debug("======> threads_leave() FROM %s"%fromtxt) + gtk.gdk.threads_leave() + self.thread_lock=False + + def wait(self): + """ + wait (max 4 sec) for self.lock == True + """ + print_debug("\n\nwait() CALLED\n\n") + if not self.thread_lock: + return + i=0 + for i in range(40): + print_debug("wait() ************* i=%s ***************"%i) + if not self.thread_lock: + return + sleep(0.1) + + def get_icon_theme(self): + if self.theme: + return self.theme + try: + import gconf + except Exception, err: + print_debug("get_icon_theme() conf module not installed, error=%s"%err) + return None + c=gconf.client_get_default() + self.theme=c.get_string("/desktop/gnome/interface/icon_theme") + print_debug("get_icon_theme() readed gconf theme=%s"%self.theme) + return self.theme + +if __name__ == '__main__': + tcosmonitor.shared.debug=True + #import sys + app=TcosCommon(TcosCommon) + #print app.get_my_local_ip(last=True) + #print app.get_display() + #print app.get_all_my_ips() + #app.get_extensions() + #app.init_all_extensions() + print app.get_display(ip_mode=True) + print app.get_display(ip_mode=False) + #print app.get_icon_theme() + #print app.get_all_my_ips() + #print app.GetAllNetworkInterfaces() + #print app.get_ip_address('eth0') + #print app.get_ip_address('eth1') + #print app.get_ip_address('br0') + #print app.get_ip_address('br0:0') diff --git a/tcosmonitor/TcosConf.py b/tcosmonitor/TcosConf.py new file mode 100644 index 0000000..050b412 --- /dev/null +++ b/tcosmonitor/TcosConf.py @@ -0,0 +1,211 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +import os +import sys +from time import time +import tcosmonitor.shared + +def print_debug(txt): + if tcosmonitor.shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + +def crono(start, txt): + print_debug ("crono(), %s get %f seconds" %(txt, (time() - float(start))) ) + return + +class TcosConf: + def __init__(self, main, openfile=True): + print_debug ( "__init__()" ) + self.main=main + self.FirstRunning=False + self.allnetworkinterfaces=[] + #self.GetAllNetworkInterfaces() + + # reset memory data + self.data="" + self.vars=None + self.use_secrets=False + self.vars=[] + self.vars_secrets=[] + + if openfile: + self.CheckConfFile() + self.reset() + else: + print_debug ( "__init__() not opening conf file" ) + + + def reset(self): + print_debug("reset() reset data...") + # reset memory data + self.data="" + self.vars=None + self.vars=[] + self.use_secrets=False + self.vars_secrets=[] + self.OpenFile() + + def OpenFile(self): + self.CheckConfFile() + conf=None + conf=[] + print_debug("open_file() reading data from \"%s\"..." \ + %(tcosmonitor.shared.config_file) ) + try: + fd=file(tcosmonitor.shared.config_file, 'r') + except Exception, err: + print("Error Opening %s file, error=%s"%(tcosmonitor.shared.config_file, err) ) + return + self.data=fd.readlines() + fd.close() + for line in self.data: + if line != '\n': + line=line.replace('\n', '') + conf.append(line) + print_debug ( "OpenFile() Found %d vars" %( len(conf)) ) + if len(conf) <1: + print_debug ( "OpenFile() FILE IS EMPTY!!!" ) + return + for i in range( len(conf) ): + if conf[i].find("#") != 0: + (var, value)=conf[i].split("=", 1) + self.vars.append([var, value]) + + if os.path.isfile(tcosmonitor.shared.config_file_secrets): + if self.main.ingroup_tcos == False and os.getuid() != 0: + return + try: + fd=file(tcosmonitor.shared.config_file_secrets, 'r') + except Exception, err: + print("Error saving %s file, error=%s"%(tcosmonitor.shared.config_file_secrets, err) ) + return + self.data=fd.readline() + fd.close() + if self.data != "\n": + (var1, var2)=self.data.replace("\n", "").split(":") + self.vars_secrets.append([var1, var2]) + self.use_secrets=True + return + + def CheckConfFile(self): + conf=None + conf=[] + if not os.path.isfile(tcosmonitor.shared.config_file): + print_debug ( "CheckConfFile() %s not exists" %(tcosmonitor.shared.config_file) ) + self.CreateConfFile() + return + + try: + fd=file(tcosmonitor.shared.config_file, 'r') + except Exception, err: + print("Error Opening %s file, error=%s"%(tcosmonitor.shared.config_file, err) ) + return + self.data=fd.readlines() + fd.close() + for line in self.data: + if line != '\n': + line=line.replace('\n', '') + conf.append(line) + if len(conf) <1: + print_debug ( "CheckConfFile() FILE IS EMPTY!!!" ) + self.CreateConfFile() + return + + def CreateConfFile(self): + print_debug ( "CreateConfFile()" ) + # save this into file + fd=file(tcosmonitor.shared.config_file, 'w') + for item in tcosmonitor.shared.DefaultConfig: + key=item[0] + value=item[1] + print_debug ("key=%s value=%s" %(key, value)) + fd.write("%s=%s\n" %(key, value) ) + fd.close() + # make chmod 600 + os.chmod(tcosmonitor.shared.config_file, 0600) + self.FirstRunning=True + + def SetVar(self, varname, value): + print_debug ( "SetVar(%s)=\"%s\"" %(varname, value) ) + self.newdata=None + self.newdata=[] + for i in range(len(self.vars)): + if varname == self.vars[i][0]: + print_debug ( "changing value %s to %s of %s" \ + %(self.vars[i][1], value, varname) ) + self.vars[i][1]="%s" %(value) + return + print_debug ("SetVar() WARNING var=%s value=%s not in vars!!!" %(varname, value)) + + + def SaveToFile(self): + print_debug ( "SaveToFile() len(self.vars)=%d" %( len(self.vars) ) ) + if len(self.vars) < 1: + print_debug ( "SaveToFile() self.vars is empty" ) + return + + fd=file(tcosmonitor.shared.config_file, 'w') + for i in range(len(self.vars)): + fd.write("%s=%s\n" %(self.vars[i][0], self.vars[i][1])) + fd.close + os.chmod(tcosmonitor.shared.config_file, 0600) + print_debug ( "SaveToFile() new settings SAVED!!!") + return + + def GetVar(self, varname): + if self.use_secrets: + if varname == "xmlrpc_username": + return self.vars_secrets[0][0] + elif varname == "xmlrpc_password": + return self.vars_secrets[0][1] + for i in range( len(self.vars) ): + if self.vars[i][0].find(varname) == 0: + if self.vars[i][1] == "1": + return 1 + return self.vars[i][1] + # search for new var + for _var in tcosmonitor.shared.DefaultConfig: + if _var[0] == varname: + print_debug ( "GetVar() NEW VAR FOUND, %s, adding to list \"\""\ + %(varname) ) + self.vars.append( [_var[0], _var[1], "new"] ) + return _var[1] + print_debug ( "GetVar() not found, %s, returning \"\"" %(varname) ) + return "" + + def IsNew(self, varname): + for var in self.vars: + #print_debug("IsNew() searching in var %s" %var) + if var[0] == varname and len(var) == 3 and var[2] == "new": + return True + print_debug("IsNew() self.vars=%s"%self.vars) + print_debug("IsNew() var %s not found in self.vars"%varname) + return False + + +if __name__ == '__main__': + conf = TcosConf(None) + + conf.SetVar("xmlrpc_username", "user2") + print_debug ( conf.vars ) + conf.SaveToFile() + diff --git a/tcosmonitor/TcosDBus.py b/tcosmonitor/TcosDBus.py new file mode 100644 index 0000000..5180189 --- /dev/null +++ b/tcosmonitor/TcosDBus.py @@ -0,0 +1,483 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# dbus classes for tcosmonitor + +import dbus +import dbus.service +import dbus.glib +import gobject +import os +import signal +import subprocess, threading +import pwd +import sys +from gettext import gettext as _ +import pynotify +from time import sleep + +# needed for __escape__ function +import xml.sax.saxutils + +import tcosmonitor.shared +def print_debug(txt): + if tcosmonitor.shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + + +class TcosDBusServer: + def __init__(self): + self.username = pwd.getpwuid(os.getuid())[0] + self.admin=None + self.passwd=None + self.error_msg=None + print_debug ( "TcosDBusServer() __init__ as username=%s" %(self.username) ) + print_debug ( "TcosDBusServer() admin='%s' passwd='*****'" %(self.admin) ) + + self.__dic__= { + '\"' : '"', + '\'' : ''' + } + + + import tcosmonitor.TcosCommon + self.common=tcosmonitor.TcosCommon.TcosCommon(self) + self.host=self.common.get_display(ip_mode=True) + # in Ubuntu with NetworkManager probably don't have IP now, make a wait loop + if self.host is None: + while not self.host: + print "TcosDBusServer: No IP found (%s) waiting..." % (self.host) + sleep(3) + self.host=self.common.get_display(ip_mode=True) + # If here IP found get hostname + self.hostname=self.common.get_display(ip_mode=False) + + self.bus = dbus.SystemBus() + + def auth(self): + #print_debug ( "self.admin=%s self.passwd=%s" %(self.admin, self.passwd) ) + if not self.admin or not self.passwd: + print_debug ( "Need admin and passwd data to do this action" ) + return False + + if self.host == "" and not tcosmonitor.shared.allow_local_display: + self.error_msg=_("TcosDBus not allowed in local display") + print_debug ( "auth() not allowed in local display" ) + return False + + import tcosmonitor.ping + # for standalone use local ip as self.host + if tcosmonitor.shared.allow_local_display: + p=tcosmonitor.ping.Ping(None) + ips=p.get_server_ips() + if len(ips) < 1: + print "tcos-dbus-client **WARNING** Can't get IP adrress, trying with hostname" + else: + if len(ips) > 1: + print "tcos-dbus-client **WARNING** This host have more than one IP: %s using first: %s" % (ips, ips[0]) + self.host=ips[0] + + # is self.host is empty try with hostname + if self.host == "": + import socket + self.host=socket.gethostname() + + + # check if tcosxmlrpc is running + status=tcosmonitor.ping.PingPort(self.host, tcosmonitor.shared.xmlremote_port).get_status() + print_debug ( "isPortListening() status=%s" %(status) ) + + if status == "CLOSED" or status == "ERROR": + print_debug ( "auth() seems that tcosxmlrpc isn't running on host=\"%s\"" %(self.host) ) + self.error_msg=_("Seems that tcosxmlrpc isn't running on host=\"%s\"" %(self.host) ) + return False + else: + print_debug ("auth() status=%s" %(status)) + + # check tcosxmlrpc username and pass + if not self.connect_tcosxmlrpc(self.host): + print_debug ( "auth() tcosxmlrpc says access denied" ) + return False + + # if here grant access + return True + + def connect_tcosxmlrpc(self, host): + self.url = 'http://%s:%d/RPC2' % (host, tcosmonitor.shared.xmlremote_port) + print_debug ( "connect_tcosxmlrpc() url=%s" %(self.url) ) + try: + import xmlrpclib + self.tc = xmlrpclib.Server(self.url) + print_debug ( "connect_tcosxmlrpc() tcosxmlrpc running on %s" %(host) ) + except Exception, err: + self.error_msg=_("tcosxmlrpc ERROR conection unavalaible." ) + print_debug("connect_tcosxmlrpc() ERROR conection unavalaible !!!, error=%s"%err) + return False + + cmd= "uname" + # try to exec something + print_debug("connect_tcosxmlrpc() try to exec \"%s\" " %(cmd) ) + try: + result=self.tc.tcos.exe(cmd, self.admin, self.passwd) + except Exception, err: + print_debug("connect_tcosxmlrpc() cmd error=%s"%err) + + if result == cmd: + print_debug ( "connect_tcosxmlrpc() cmd run OK." ) + return True + else: + self.error_msg=_("ERROR conecting to tcosxmlrpc, check username and password." ) + print_debug ( "error connecting: %s" %(result) ) + return False + + def send_error_msg(self): + #FIXME, how to return error message with dbus??? + pass + + def parse_dbus_str(self, data): + #print_debug( "parse_dbus_str() data=%s type=%s" %(data, type(data)) ) + if isinstance(data, dbus.String): + return str(data) + return(data) + + def get_desktop_path(self): + print_debug ( "get_desktop_path()") + cmd="/usr/lib/tcos/get-xdg-desktop" + try: + p = subprocess.Popen(cmd, shell=True, bufsize=0, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True) + except Exception, e: + print_debug("Exception in subprocess cmd(%s), error='%s'"%(cmd, e)) + return None + desktop=None + try: + result=p.stdout.readlines() + for line in result: + if line != '\n': + desktop=line.replace('\n', '') + except Exception, e: + print_debug("Exception in subprocess::readlines() cmd(%s), error='%s'"%(cmd, e)) + return None + if not os.path.isdir(desktop): + desktop=os.path.expanduser("~/Desktop") + return desktop + + def new_message(self, message): + print_debug ( "new_message() %s" %(message) ) + + self.admin = self.parse_dbus_str(message[0][0]) + self.passwd = self.parse_dbus_str(message[0][1]) + if not self.auth(): + self.send_error_msg() + return + + for user in message[1]: + print_debug ("new_message() loop users => user=%s" %(user) ) + if user == self.username: + msg_type=self.parse_dbus_str(message[2][0]) + print_debug ( "new_message() Ummm one message for me!!" ) + if msg_type == "sendfiles": + tmp=[] + print_debug(message[3]) + if " " in message[3][0]: + # standalone + # dbus.Array([dbus.String(u'Teacher 192.168.0.254 True')], signature=...) + tmp=self.parse_dbus_str(message[3][0]).split() + else: + # thin client + # dbus.Array([dbus.String(u'Teacher'), dbus.String(u'192.168.0.254'), dbus.String(u'True')], signature=...) + tmp=message[3] + msg_arg_1=self.parse_dbus_str(tmp[0]) + msg_arg_2=self.parse_dbus_str(tmp[1]) + msg_arg_3=self.parse_dbus_str(tmp[2]) + print_debug ( "new_message() type=%s arg_1=%s arg_2=%s arg_3=%s" %(msg_type, msg_arg_1, msg_arg_2, msg_arg_3) ) + else: + msg_args=self.parse_dbus_str(message[3][0]) + print_debug ( "new_message() type=%s args=%s" %(msg_type, msg_args) ) + + if msg_type == "kill": + pid=int(msg_args) + self.user_kill(pid) + if msg_type == "killall": + self.user_killall(msg_args) + elif msg_type == "exec": + self.user_exec(msg_args) + elif msg_type == "mess": + self.user_msg(msg_args) + elif msg_type == "sendfiles": + self.user_sendfiles(msg_arg_1, msg_arg_2, msg_arg_3) + else: + print_debug ( "new_message() ERROR, unknow type of message=\"%s\"" %(msg_type) ) + print_debug ( "new_message() finish !!!" ) + + def cleanproc(self, proc): + try: + os.waitpid(proc.pid, os.WCONTINUED) + except os.error, err: + print_debug("OSError exception: %s" %err) + + def user_kill(self, pid): + print_debug ( "user_kill() %s" %(pid) ) + pid=int(pid) + try: + os.kill(pid, signal.SIGKILL) + except Exception, err: + print_debug ( "user_kill() error, pid not found %d, error=%s" %(pid, err) ) + return + + def user_killall(self, app): + print_debug ( "user_killall() %s" %(app) ) + p = subprocess.Popen("killall -s KILL %s" %(app), shell=True, close_fds=True) + try: + th=threading.Thread(target=self.cleanproc, args=(p,) ) + #th.setDaemon(1) + th.start() + print_debug("Threads count: %s" %threading.activeCount()) + except Exception, err: + print_debug ( "user_killall() error, error=%s" %(err) ) + return + + def user_exec(self, cmd): + print_debug ( "user_exec() %s" %(cmd) ) + p = subprocess.Popen(cmd, shell=True, close_fds=True) + try: + th=threading.Thread(target=self.cleanproc, args=(p,) ) + #th.setDaemon(1) + th.start() + print_debug("Threads count: %s" %threading.activeCount()) + except Exception, err: + print_debug ( "user_exec() error, error=%s" %(err) ) + #pass + return + + def user_sendfiles(self, dir, server, openfile): + print_debug ( "user_sendfiles() dir=%s server=%s open=%s" %(dir, server, openfile)) + desktop=self.get_desktop_path() + local_dir=os.path.join(desktop, dir) + cmd="/usr/lib/tcos/tcos-ftpclient --dir=%s --server=%s --open=%s" %(local_dir, server, openfile) + print_debug("user_sendfiles() cmd=%s" %cmd) + p = subprocess.Popen(cmd, shell=True, close_fds=True) + try: + th=threading.Thread(target=self.cleanproc, args=(p,) ) + #th.setDaemon(1) + th.start() + print_debug("Threads count: %s" %threading.activeCount()) + except Exception, err: + print_debug ( "user_sendfiles() error, error=%s" %(err) ) + #pass + return + + def __escape__(self, txt): + return xml.sax.saxutils.escape(txt, self.__dic__) + + def user_msg(self, txt): + print_debug ( "user_msg() %s" %(txt) ) + # use pynotify better??? + self.show_notification( self.__escape__( _("Message from admin") ), self.__escape__( txt ) ) +# p = subprocess.Popen("zenity --info --text='%s' --title='%s'" %(txt.replace("'", "´"), _("Message from admin").replace("'", "´")), shell=True, close_fds=True) +# try: +# th=threading.Thread(target=self.cleanproc, args=(p,) ) +# #th.setDaemon(1) +# th.start() +# print_debug("Threads count: %s" %threading.activeCount()) +# except Exception, err: +# print_debug ( "user_msg() error, error=%s" %(err) ) +# pass +# return + + def show_notification(self, title, msg, urgency=pynotify.URGENCY_CRITICAL): + print_debug("show_notification() title='%s', msg='%s'" %(title, msg) ) + pynotify.init("tcosmonitor") + if os.path.isfile("/usr/share/pixmaps/tcos-icon-32x32-custom.png"): + image_uri="file://usr/share/pixmaps/tcos-icon-32x32-custom.png" + else: + image_uri="file://usr/share/pixmaps/tcos-icon-32x32.png" + n = pynotify.Notification( title , msg, image_uri ) + n.set_urgency(urgency) + n.set_category("TcosDBus") + n.set_timeout(40000) # 15 sec + if not n.show(): + print_debug ("show_notification() Failed to send notification") + + def start(self): + self.bus.add_signal_receiver(self.new_message, + signal_name='GotSignal', + dbus_interface='com.consoltux.TcosMonitor.Comm', + path='/TCOSObject') + + mainloop = gobject.MainLoop() + mainloop.run() + + +class TcosDBusClient(dbus.service.Object): + def __init__(self, bus_name, object_path="/TCOSObject"): + print_debug ( "TcosDBusClient() starting client" ) + dbus.service.Object.__init__(self, bus_name, object_path) + + @dbus.service.signal("com.consoltux.TcosMonitor.Comm", signature="aas") + def GotSignal(self, message): + pass + +class TcosDBusAction: + def __init__(self, main, admin="", passwd=""): + print_debug ("TcosDBusAction() starting action...") + self.admin=admin + self.passwd=passwd + self.connection = False + self.error = None + self.done = False + self.main=main + try: + system_bus = dbus.SystemBus() + except Exception, err: + self.error = "Error getting system bus. Is DBus running?" + print_debug ( "TcosDbusAction::__init__() error, error=%s" %(err) ) + return + + try: + name = dbus.service.BusName("com.consoltux.TcosMonitor", bus=system_bus) + except Exception, err: + self.error = "Error getting name of TcosMonitor dbus, are you autorized?" + print_debug ( "TcosDbusAction::__init__() error, error=%s" %(err) ) + return + + self.dbus_iface = TcosDBusClient(name) + self.connection=True + + def set_auth(self, admin, passwd): + self.admin=admin + self.passwd=passwd + + def get_error_msg(self): + return self.error + + def do_sendfiles(self, users, dir, server, open): + print_debug ( "do_sendfiles() users=%s dir=%s server=%s open=%s" %(users, dir, server, open) ) + + if not self.connection: + print_debug ( self.error ) + return False + try: + self.dbus_iface.GotSignal( [ [self.admin, self.passwd], users , ["sendfiles"] , [dir, server, open] ]) + self.done = True + + except Exception, err: + self.error = _("User not allowed to run this dbus call.") + print_debug ( "User not allowed to use dbus, error=%s"%err ) + + return self.done + + def do_exec(self, users, app): + print_debug ( "do_exec() users=%s app=%s" %(users, app) ) + + if not self.connection: + print_debug ( self.error ) + return False + try: + self.dbus_iface.GotSignal( [ [self.admin, self.passwd], users , ["exec"] , [app] ]) + self.done = True + + except Exception, err: + self.error = _("User not allowed to run this dbus call.") + print_debug ( "User not allowed to use dbus, error=%s"%err ) + + return self.done + + def do_message(self, users, text=""): + print_debug ( "do_message() users=%s text='%s'" %(users, text) ) + + if not self.connection: + print_debug ( self.error ) + return False + try: + self.dbus_iface.GotSignal( [ [self.admin, self.passwd], users , ["mess"] , [text] ]) + self.done = True + + except Exception, err: + self.error = _("User not allowed to run this dbus call.") + print_debug ( "User not allowed to use dbus, error=%s"%err ) + + return self.done + + def do_kill(self, users, pid="0"): + print_debug ( "do_kill() users=%s pid=%s" %(users, pid) ) + + if not self.connection: + print_debug ( self.error ) + return False + + try: + print_debug ( "send signal" ) + self.dbus_iface.GotSignal( [ [self.admin, self.passwd], users , ["kill"] , [pid] ]) + self.done = True + + except Exception, err: + self.error = _("User not allowed to run this dbus call.") + print_debug ( "User not allowed to use dbus, error=%s"%err ) + + return self.done + + def do_killall(self, users, proc=""): + print_debug ( "do_kill() users=%s proc=%s" %(users, proc) ) + + if not self.connection: + print_debug ( self.error ) + return False + + try: + print_debug ( "send signal" ) + self.dbus_iface.GotSignal( [ [self.admin, self.passwd], users , ["killall"] , [proc] ]) + self.done = True + + except Exception, err: + self.error = _("User not allowed to run this dbus call.") + print_debug ( "User not allowed to use dbus, error=%s"%err ) + + return self.done + + +if __name__ == "__main__": + tcosmonitor.shared.debug=True + if len(sys.argv) < 2: + print ( "Need --server or --client param " ) + sys.exit(1) + + if sys.argv[1] == "--server": + print_debug ("starting server") + server=TcosDBusServer().start() + + if sys.argv[1] == "--client": + action=TcosDBusAction(admin="root", passwd="root") + result2 = action.do_message( ["mario"] , "Test message from dbus interface") + if not result2: + print action.get_error_msg() + + #result = action.do_exec( ["prueba"] , "xterm") + #if not result: + # print action.get_error_msg() + + #result = action.do_kill( ["mario"] , "9146") + #if not result: + # print action.get_error_msg() + + + + + diff --git a/tcosmonitor/TcosExtensions.py b/tcosmonitor/TcosExtensions.py new file mode 100644 index 0000000..4f08fc3 --- /dev/null +++ b/tcosmonitor/TcosExtensions.py @@ -0,0 +1,401 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +import tcosmonitor.shared +import os +import sys +import exceptions +from gettext import gettext as _ +import gtk +import socket + +def print_debug(txt): + if tcosmonitor.shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + +class Error(exceptions.Exception): + def __init__(self, msg): + self.msg = msg + def __str__(self): + tcosmonitor.shared.error_msg( _("Exception:") + "\n" + "="*40 + "\n\nError:\n" + self.msg ) + return "<Error : %s>" % self.msg + __repr__ = __str__ + def __call__(self): + return (self.msg,) + + +class TcosExtension(object): + def __init__(self, main): + #print_debug("__init__()") + if not main: + raise Error, "self.main not defined" + + self.main=main + self.preferences={} + + def register(self): + raise Error, "TcosExtension register() not defined" + + def get_client(self): + if self.main.iconview.isactive(): + self.main.selected_ip=self.main.iconview.get_selected() + self.main.selected_host=self.main.iconview.get_host(self.main.selected_ip) + elif self.main.classview.isactive(): + self.main.selected_ip=self.main.classview.get_selected() + self.main.selected_host=self.main.classview.get_host(self.main.selected_ip) + else: + self.main.selected_ip=self.main.listview.get_selected() + self.main.selected_host=self.main.listview.get_host(self.main.selected_ip) + + if self.main.force_selected_ip != None: + self.main.selected_ip=self.main.force_selected_ip + self.main.force_selected_ip=None + + if not self.main.selected_ip: + # show a msg + tcosmonitor.shared.error_msg ( _("Error: no IP!") ) + return False + + self.connected_users=[] + self.connected_users_txt="" + self.connected_users_txt_all="" + self.newallclients=[] + self.allclients_logged=[] + self.main.localdata.newhost(self.main.selected_ip) + self.main.xmlrpc.newhost(self.main.selected_ip) + self.client_type = self.main.xmlrpc.ReadInfo("get_client") + self.host=self.main.localdata.GetHostname(self.main.selected_ip) + counter=1 + counter_all=1 + if self.main.localdata.IsLogged(self.main.selected_ip): + username=self.main.localdata.GetUsernameAndHost(self.main.selected_ip) + if username.find(":") != -1: + usern, ip = username.split(":") + self.connected_users_txt+="%s, " %(usern) + self.connected_users_txt_all+="%s, " %(usern) + else: + self.connected_users_txt+="%s, " %(username) + self.connected_users_txt_all+="%s, " %(username) + self.connected_users.append(username) + if counter % 4 == 0: + self.connected_users_txt+="\n" + if counter_all % 4 == 0: + self.connected_users_txt_all+="\n" + counter=int(counter+1) + counter_all=int(counter_all+1) + self.newallclients.append(self.main.selected_ip) + self.allclients_logged.append(self.main.selected_ip) + elif not self.main.xmlrpc.IsStandalone(self.main.selected_ip): + self.allclients_logged.append(self.main.selected_ip) + self.connected_users_txt_all+="%s, " %(self.main.selected_ip) + if counter_all % 4 == 0: + self.connected_users_txt_all+="\n" + counter_all=int(counter_all+1) + else: + self.connected_users_txt_all+="%s, " %(self.main.selected_ip) + if counter_all % 4 == 0: + self.connected_users_txt_all+="\n" + counter_all=int(counter_all+1) + + if self.connected_users_txt[-2:] == "\n": + self.connected_users_txt=self.connected_users_txt[:-2] + if self.connected_users_txt[-2:] == ", ": + self.connected_users_txt=self.connected_users_txt[:-2] + + if self.connected_users_txt_all[-2:] == "\n": + self.connected_users_txt_all=self.connected_users_txt_all[:-2] + if self.connected_users_txt_all[-2:] == ", ": + self.connected_users_txt_all=self.connected_users_txt_all[:-2] + + print_debug("get_clients() self.main.selected_ip=%s self.main.selected_host=%s"%(self.main.selected_ip, self.main.selected_host) ) + return True + #if not self.doaction_onthisclient(action, self.main.selected_ip): + # # show a msg + # tcosmonitor.shared.info_msg ( _("Can't exec this action because you are connected at this host!") ) + # return + +######################################################################################## + + + def get_all_clients(self): + # don't make actions in clients not selected + if self.main.iconview.ismultiple(): + allclients=self.main.iconview.get_multiple() + + elif self.main.classview.ismultiple(): + allclients=self.main.classview.get_multiple() + + elif self.main.listview.isactive() and self.main.config.GetVar("selectedhosts") == 1: + allclients=self.main.listview.getmultiple() + if len(allclients) == 0: + allclients=self.main.localdata.allclients + else: + # get all clients connected + allclients=self.main.localdata.allclients + + if len(allclients) == 0: + tcosmonitor.shared.info_msg ( _("No clients connected, press refresh button.") ) + return False + + self.allclients=allclients + + self.connected_users=[] + self.connected_users_txt="" + self.connected_users_txt_all="" + self.allclients_txt="" + self.newallclients=[] + self.newallclients_txt="" + self.allclients_logged=[] + self.allclients_logged_txt="" + counter=1 + counter_all=1 + for client in allclients: + self.allclients_txt+="\n %s" %(client) + self.main.localdata.newhost(client) + if self.main.localdata.IsLogged(client): + username=self.main.localdata.GetUsernameAndHost(client) + if username.find(":") != -1: + usern, ip = username.split(":") + self.connected_users_txt+="%s, " %(usern) + self.connected_users_txt_all+="%s, " %(usern) + else: + self.connected_users_txt+="%s, " %(username) + self.connected_users_txt_all+="%s, " %(username) + self.connected_users.append(username) + if counter % 4 == 0: + self.connected_users_txt+="\n" + if counter_all % 4 == 0: + self.connected_users_txt_all+="\n" + counter=int(counter+1) + counter_all=int(counter_all+1) + self.newallclients.append(client) + self.newallclients_txt+="\n %s" %(client) + self.allclients_logged.append(client) + self.allclients_logged_txt+="\n %s" %(client) + elif not self.main.xmlrpc.IsStandalone(client): + self.allclients_logged.append(client) + self.allclients_logged_txt+="\n %s" %(client) + self.connected_users_txt_all+="%s, " %(client) + if counter_all % 4 == 0: + self.connected_users_txt_all+="\n" + counter_all=int(counter_all+1) + else: + self.connected_users_txt_all+="%s, " %(client) + if counter_all % 4 == 0: + self.connected_users_txt_all+="\n" + counter_all=int(counter_all+1) + + if self.connected_users_txt[-2:] == "\n": + self.connected_users_txt=self.connected_users_txt[:-2] + if self.connected_users_txt[-2:] == ", ": + self.connected_users_txt=self.connected_users_txt[:-2] + + if self.connected_users_txt_all[-2:] == "\n": + self.connected_users_txt_all=self.connected_users_txt_all[:-2] + if self.connected_users_txt_all[-2:] == ", ": + self.connected_users_txt_all=self.connected_users_txt_all[:-2] + return True + +######################################################################################## + + + def doaction_onthisclient(self, action, ip): + # return True if an exec action + # return False if can not + # get $DISPLAY + host=str(tcosmonitor.shared.parseIPAddress(os.environ["DISPLAY"])) + if host == "": + return True + print_debug("doaction_onthisclient() host=%s ip=%s action=%s filteraction=%s" % \ + (host, ip, action, action.split(' ')[0]) ) + # convert to IP + host=socket.gethostbyname(host) + print_debug("doaction_onthisclient() comparing %s <=> %s" % \ + (host, socket.gethostbyname(host) ) ) + if int(self.main.config.GetVar("blockactioninthishost")) == 1 and \ + host == socket.gethostbyname(ip): + print_debug("doaction_onthisclient() ALERT !!! searching for dangerous actions") + # dangerous actions + if action.split(' ')[0] in ["poweroff", "reboot", "lockscreen", "restartx", "down-controller"]: + print_debug("doaction_onthisclient() returning FALSE") + return False + print_debug("doaction_onthisclient() no dangerous action") + print_debug("doaction_onthisclient() no host match") + return True + + + def action_for_clients(self, allclients, action): + if not allclients or len(allclients) < 1: + return + + print_debug("action_for_clients() allclients='%s' action='%s'"%(allclients, action)) + + self.main.common.threads_enter("TcosActions::action_for_clients cleaning") + self.start_action() + self.main.progressbar.show() + self.main.common.threads_leave("TcosActions::action_for_clients cleaning") + + + for ip in allclients: + if not self.doaction_onthisclient(action, ip): + # show a msg + print_debug( _("Can't exec this action at '%s' because you are connected at this host!") %ip ) + self.main.common.threads_enter("TcosActions::action_for_clients doing action") + self.main.write_into_statusbar( _("Can't exec this action at '%s' because you are connected at this host!") %ip ) + self.main.common.threads_leave("TcosActions::action_for_clients doing action") + continue + + + percent=float( allclients.index(ip)/len(allclients) ) + + print_debug ( "doing %s in %s, percent complete=%f"\ + %(action, ip, percent) ) + + mydict={} + mydict["action"]=action + mydict["ip"]=ip + self.main.common.threads_enter("TcosActions::action_for_clients doing action") + self.main.actions.set_progressbar( _("Doing action \"%(action)s\" in %(ip)s...") %mydict , percent ) + self.main.common.threads_leave("TcosActions::action_for_clients doing action") + + if not self.main.xmlrpc.connected: + print_debug("action_for_clients() xmlrpc not connected") + continue + + try: + # call new IP + self.main.xmlrpc.newhost(ip) + # overwrite real_action in your extension + self.real_action(ip, action) + ######################################## + except Exception, err: + print_debug ( "action_for_clients() error while exec '%s' in %s error: %s" %(action, ip, err) ) + + self.main.common.threads_enter("TcosActions::action_for_clients END client") + self.main.actions.set_progressbar( _("Done action \"%(action)s\" in %(ip)s") %mydict , 1 ) + self.main.common.threads_leave("TcosActions::action_for_clients END") + #sleep(tcosmonitor.shared.wait_between_many_host) + + self.main.common.threads_enter("TcosActions::action_for_clients END all") + self.finish_action() + self.main.progressbar.hide() + self.main.common.threads_leave("TcosActions::action_for_clients END all") + return + + def change_lockscreen(self, ip): + """ + change lockscreen icon + status=True icon=locked.png + status=False icon=unlocked.png + """ + #self.main.localdata.newhost(ip) + status_net=self.main.localdata.IsBlockedNet(ip) + status_screen=self.main.localdata.IsBlocked(ip) + status_dpms=self.main.xmlrpc.dpms('status', ip) + print_debug ( "change_lockscreen(%s)=(LOCK)%s,(NET)%s,(DPMS)%s" %(ip, status_screen, status_net, status_dpms) ) + + locked_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'locked.png') + locked_net_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'locked_net.png') + locked_net_screen_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'locked_net_screen.png') + unlocked_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'unlocked.png') + dpms_off_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'menu_dpms_off.png') + dpms_on_image = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + 'menu_dpms_on.png') + + if status_dpms == 'Off': + image=dpms_off_image + elif status_screen and status_net: + image=locked_net_screen_image + elif status_screen == False and status_net: + image=locked_net_image + #elif status_screen == False and status_net == False and status_dpms == 'On': + # image=dpms_on_image + elif status_screen and status_net == False: + image=locked_image + else: + image=unlocked_image + + if self.main.classview.isactive(): + self.main.classview.change_lockscreen(ip, image, status_screen, status_net) + if self.main.iconview.isactive(): + self.main.iconview.change_lockscreen(ip, image, status_screen, status_net) + if self.main.listview.isactive(): + self.main.listview.change_lockscreen(ip, image) + + def add_progressbox(self, args, text): + print_debug("add_progressbox() args=%s, text=%s" %(args, text)) + table=gtk.Table(2, 2, False) + table.show() + button=gtk.Button(_("Stop")) + image = gtk.Image() + image.set_from_stock (gtk.STOCK_STOP, gtk.ICON_SIZE_BUTTON) + button.set_image(image) + button.connect('clicked', self.on_progressbox_click, args, table) + button.show() + label=gtk.Label( text ) + label.show() + table.attach(button, 0, 1, 0, 1, False, False, 0, 0) + table.attach(label, 1, 2, 0, 1 ) + self.main.progressbox.add(table) + self.main.progressbox.show() + self.main.stop_running_actions.append(button) + print_debug("add_progressbox() widget=%s" %(button)) + + def on_progressbox_click(self, widget, args, box): + #def on_progressbox_click(self, *args): + raise Error, "TcosExtension on_progressbox_click() not defined" + + def real_action(self, ip, action): + #def real_action(self, *args): + raise Error, "TcosExtension real_action() not defined" + + def start_action(self, *args): + print_debug("start_action() not defined") + + def finish_action(self, *args): + print_debug("finish_action() not defined") + + +class TcosExtLoader(object): + def __init__(self, main): + self.main=main + self.extensions=None + + import tcosmonitor.extensions as __ext__ + self.extensions=__ext__ + + #print_debug ("TcosExtLoader::__init__()%s" %self.extensions ) + + for _ext in self.extensions.__all__: + obj=getattr( self.extensions, _ext ) + if hasattr(obj, "__extclass__"): + print_debug( "TcosExtLoader::__init__() registering extension %s"%_ext ) + tmp=obj.__extclass__(self.main) + tmp.register() + else: + raise Error, "Extension '%s' don't have defined __extclass__ attribute" % _ext + return + + + +if __name__ == '__main__': + tcosmonitor.shared.debug=True + app=TcosExtLoader(None) diff --git a/tcosmonitor/TcosIconView.py b/tcosmonitor/TcosIconView.py new file mode 100644 index 0000000..e88e58e --- /dev/null +++ b/tcosmonitor/TcosIconView.py @@ -0,0 +1,226 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +import sys +import gtk +from gettext import gettext as _ + + +import tcosmonitor.shared + +def print_debug(txt): + if tcosmonitor.shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + +class TcosIconView(object): + + def __init__(self, main): + print_debug("__init__()") + self.main=main + self.ui=self.main.ui + + + self.__selected_icon=None + self.avalaible_info=[ + [_("IP"), 'ip' ], + [ _("Hostname"), 'hostname' ], + [ _("Username"), 'username'], + [ _("Logged"), 'logged'], + [ _("Time log in"), 'time_logged'], + [ _("Screen locked"), 'blocked_screen'], + [ _("Network locked"), 'blocked_net'], + ] + self.default_tip = _("Place mouse on any computer to see brief info about it.") + + self.icon_tooltips = None + self.hosts={} + self.iconview=self.ui.get_object('iconview') + self.model = gtk.ListStore(str, str, gtk.gdk.Pixbuf) + self.iconview.set_model(self.model) + self.iconview.set_text_column(0) + self.iconview.set_pixbuf_column(2) + + if hasattr(self.iconview.props, 'has_tooltip'): + self.iconview.props.has_tooltip = True + self.iconview.connect("motion-notify-event", self.on_iconview_event) + self.iconview.connect("button_press_event", self.on_iconview_click) + + def isenabled(self): + """ + return True if only configuration enable IconView + prevent to work if IconView is hidden + """ + if self.main.config.GetVar("listmode") == 'icons' or self.main.config.GetVar("listmode") == 'both': + return True + return False + + def isactive(self): + """ + Return True if IconView is enabled and is active (We click on it) + know this getting tabindex of viewtabas widget. + 0 => active list view + 1 => active icon view + """ + if not self.isenabled: + return False + if self.main.viewtabs.get_current_page() != 1: + return False + print_debug("isactive() IconView Mode active") + return True + + def get_multiple(self): + allhosts=[] + selected=self.iconview.get_selected_items() + if len(selected) > 0: + for sel in selected: + allhosts.append( self.model[sel][1] ) + print_debug("get_multiple() allhosts=%s"%allhosts) + return allhosts + + def ismultiple(self): + if not self.isactive(): + return False + print_debug("ismultiple() num selected=%s"%len(self.iconview.get_selected_items())) + if len(self.iconview.get_selected_items()) > 0: + return True + else: + return False + + def clear(self): + print_debug("clear() clean iconview") + self.model.clear() + self.hosts={} + self.set_selected(None) + + def set_selected(self, ip): + self.__selected_icon=ip + + def get_selected(self): + return self.__selected_icon + + def get_host(self, ip): + if self.hosts.has_key(ip): + return self.hosts[ip]['hostname'] + + def generate_icon(self, data): + print_debug("generate_icon() data=%s"%data) + + if data['username'] == tcosmonitor.shared.NO_LOGIN_MSG: + pixbuf = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + tcosmonitor.shared.icon_image_no_logged) + else: + pixbuf = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + tcosmonitor.shared.icon_image_thin) + + if not data['active']: + pixbuf.saturate_and_pixelate(pixbuf, 0.6, True) + + if data['image_blocked']: + pixbuf2 = data['image_blocked'] + pixbuf2.composite(pixbuf, 0, 0, pixbuf.props.width, pixbuf.props.height, 0, 0, 1.0, 1.0, gtk.gdk.INTERP_HYPER, 255) + + if data['username'] == tcosmonitor.shared.NO_LOGIN_MSG: + self.model.append([data['hostname'].replace('.aula',''), data['ip'], pixbuf]) + else: + self.model.append([data['username'], data['ip'], pixbuf]) + self.hosts[data['ip']]=data + + def generate_tooltip(self, ip): + if not self.hosts.has_key(ip): + return "" + data=self.hosts[ip] + txt="" + + for info in self.avalaible_info: + if data[info[1]] == True: + value=_("yes") + elif data[info[1]] == False: + value=_("no") + else: + value=data[info[1]] + txt+=" %s: %s \n" %(info[0], value) + # remove last '\n' + return txt[:-1] + + def on_iconview_event(self, iv, event): + """Deletes old tooltip and adds new one for new icon.""" + # On mouse move, old tooltip must dissapear. + + # Adds tip if no buttons are pressed during the move. + if not event.state: + #print_debug("on_iconview_event() iv=%s event=%s"%(iv, event)) + if not hasattr(iv, 'set_tooltip_text'): + self.icon_tooltips = gtk.Tooltips() # deprecated + + pos = iv.get_path_at_pos(int(event.x), int(event.y)) + if pos: + mod = list(iv.get_model()[pos]) + tip=self.generate_tooltip(mod[1]) + else: + tip=self.default_tip + + if not hasattr(iv, 'set_tooltip_text'): + self.icon_tooltips.set_tip(iv, tip) + else: + iv.set_tooltip_text(tip) + + + def on_iconview_click(self, iv, event): + if event.button == 3: + pos = self.iconview.get_path_at_pos(int(event.x), int(event.y)) + if len(self.iconview.get_selected_items()) < 2 and pos: + #generate menu + self.main.menus.RightClickMenuOne( pos , self.model) + + self.iconview.grab_focus() + #self.iconview.set_cursor( path, col, 0) + self.iconview.select_path(pos) + ip=iv.get_model()[pos][1] + self.set_selected(ip) + + self.main.menu.popup( None, None, None, event.button, event.time) + return True + else: + # need to remake allmenu (for title selected|all ) + self.main.menus.RightClickMenuAll() + self.main.allmenu.popup( None, None, None, event.button, event.time) + print_debug ( "on_iconview_click() NO icon selected" ) + self.set_selected(None) + return + + + def change_lockscreen(self, ip, pixbuf2, status_screen, status_net): + self.hosts[ip]['blocked_screen']=status_screen + self.hosts[ip]['blocked_net']=status_net + data=self.hosts[ip] + if data['username'] == tcosmonitor.shared.NO_LOGIN_MSG: + pixbuf = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + tcosmonitor.shared.icon_image_no_logged) + else: + pixbuf = gtk.gdk.pixbuf_new_from_file(tcosmonitor.shared.IMG_DIR + tcosmonitor.shared.icon_image_thin) + pixbuf2.composite(pixbuf, 0, 0, pixbuf.props.width, pixbuf.props.height, 0, 0, 1.0, 1.0, gtk.gdk.INTERP_HYPER, 255) + for m in self.model: + if m[1] == ip: + m[2]=pixbuf + return + + + + + + diff --git a/tcosmonitor/TcosListView.py b/tcosmonitor/TcosListView.py new file mode 100644 index 0000000..cfe1146 --- /dev/null +++ b/tcosmonitor/TcosListView.py @@ -0,0 +1,277 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +import sys +import gtk +from gettext import gettext as _ + + +import tcosmonitor.shared + +COL_HOST, COL_IP, COL_USERNAME, COL_ACTIVE, COL_LOGGED, COL_BLOCKED, COL_PROCESS, COL_TIME, COL_SEL, COL_SEL_ST = range(10) + + +# constant to font sizes +PANGO_SCALE=1024 + + +def print_debug(txt): + if tcosmonitor.shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + +class TcosListView(object): + + def __init__(self, main): + print_debug("__init__()") + self.main=main + self.ui=self.main.ui + + + self.main.updating=True + self.searching=False # boolean True thread running False not running + + # define as None and register with info extension + self.populate_datatxt=None + + self.model=gtk.ListStore(str, str, str, gtk.gdk.Pixbuf, gtk.gdk.Pixbuf, gtk.gdk.Pixbuf, str, str, bool,bool) + + self.main.tabla = self.ui.get_object('hostlist') + self.main.tabla.set_model (self.model) + + cell1 = gtk.CellRendererText () + column1 = gtk.TreeViewColumn (_("Hostname"), cell1, text = COL_HOST) + column1.set_resizable (True) + column1.set_sort_column_id(COL_HOST) + self.main.tabla.append_column (column1) + + cell2 = gtk.CellRendererText () + column2 = gtk.TreeViewColumn (_("IP address"), cell2, text = COL_IP) + column2.set_resizable (True) + column2.set_sort_column_id(COL_IP) + self.main.tabla.append_column (column2) + + cell3 = gtk.CellRendererText () + column3 = gtk.TreeViewColumn (_("Username"), cell3, text = COL_USERNAME) + column3.set_resizable (True) + column3.set_sort_column_id(COL_USERNAME) + self.main.tabla.append_column (column3) + + cell4 = gtk.CellRendererPixbuf() + column4 = gtk.TreeViewColumn (_("Active"), cell4, pixbuf = COL_ACTIVE) + #column4.set_sort_column_id(COL_ACTIVE) + self.main.tabla.append_column (column4) + + cell5 = gtk.CellRendererPixbuf() + column5 = gtk.TreeViewColumn (_("Logged"), cell5, pixbuf = COL_LOGGED) + #column5.set_sort_column_id(COL_LOGGED) + self.main.tabla.append_column (column5) + + cell6 = gtk.CellRendererPixbuf() + column6 = gtk.TreeViewColumn (_("Screen Blocked"), cell6, pixbuf = COL_BLOCKED) + #column6.set_sort_column_id(COL_BLOCKED) + self.main.tabla.append_column (column6) + + cell7 = gtk.CellRendererText () + column7 = gtk.TreeViewColumn (_("Num of process"), cell7, text = COL_PROCESS) + column7.set_resizable (True) + column7.set_sort_column_id(COL_PROCESS) + self.main.tabla.append_column (column7) + + cell8 = gtk.CellRendererText () + column8 = gtk.TreeViewColumn (_("Time log in"), cell8, text = COL_TIME) + column8.set_resizable (True) + column8.set_sort_column_id(COL_TIME) + self.main.tabla.append_column (column8) + + if self.main.config.GetVar("selectedhosts") == 1: + cell9 = gtk.CellRendererToggle () + cell9.connect('toggled', self.on_sel_click, self.model, COL_SEL_ST) + #column9 = gtk.TreeViewColumn(_("Sel"), cell9, active=COL_SEL_ST, activatable=1) # activatable make warnings , not needed + column9 = gtk.TreeViewColumn(_("Sel"), cell9, active=COL_SEL_ST) + self.main.tabla.append_column (column9) + + # print rows in alternate colors if theme allow + self.main.tabla.set_rules_hint(True) + + self.main.tabla_file = self.main.tabla.get_selection() + self.main.tabla_file.connect("changed", self.on_hostlist_click) + # allow to work right click + self.main.tabla.connect_object("button_press_event", self.on_hostlist_event, self.main.menu) + return + + def on_hostlist_click(self, hostlist): + if self.main.worker_running: + return + + if not self.populate_datatxt: + print_debug ("on_hostlist_click() self.populate_datatxt() NOT DEFINED") + return + + self.main.progressbar.hide() + (model, iter) = hostlist.get_selected() + if not iter: + return + self.main.selected_host=model.get_value(iter,COL_HOST) + self.main.selected_ip=model.get_value(iter, COL_IP) + + print_debug ( "on_hostlist_clic() selectedhost=%s selectedip=%s" \ + %(self.main.selected_host, self.main.selected_ip) ) + + # call to read remote info + #self.main.localdata.newhost(self.main.selected_ip) + self.main.xmlrpc.newhost(self.main.selected_ip) + self.main.xmlrpc.ip=self.main.selected_ip + if not self.main.xmlrpc.isPortListening(self.main.selected_ip, self.main.xmlrpc.lastport): + print_debug ( "on_host_list_click() XMLRPC not running in %s" %(self.main.selected_ip) ) + self.main.write_into_statusbar ( _("Error connecting to tcosxmlrpc in %s") %(self.main.selected_ip) ) + return + + print_debug ( "on_host_list_click() AUTH OK" ) + + self.main.write_into_statusbar ( "" ) + print_debug ( "on_hostlist_click() callig worker to populate in Thread" ) + + + self.main.worker=tcosmonitor.shared.Workers( self.main,\ + target=self.populate_datatxt, args=([self.main.selected_ip]) ).start() + + return + + + def on_hostlist_event(self, widget, event): + if event.button == 3: + x = int(event.x) + y = int(event.y) + time = event.time + pthinfo = self.main.tabla.get_path_at_pos(x, y) + if pthinfo is not None: + + path, col, cellx, celly = pthinfo + #generate menu + self.main.menus.RightClickMenuOne( path ) + + self.main.tabla.grab_focus() + self.main.tabla.set_cursor( path, col, 0) + self.main.menu.popup( None, None, None, event.button, time) + return 1 + else: + self.main.menus.RightClickMenuAll() + self.main.allmenu.popup( None, None, None, event.button, time) + print_debug ( "on_hostlist_event() NO row selected" ) + return + + def on_sel_click(self, cell, path, model, col=0): + # reverse status of sel row (saved in COL_SEL_ST) + iter = model.get_iter(path) + self.model.set_value(iter, col, not model[path][col]) + print_debug("on_sel_click() ip=%s status=%s" %(model[path][COL_IP], model[path][col])) + return True + + def isenabled(self): + """ + return True if only configuration enable IconView + prevent to work if ClassView is hidden + """ + if self.main.config.GetVar("listmode") == 'list' or \ + self.main.config.GetVar("listmode") == 'both': + return True + return False + + def isactive(self): + """ + Return True if IconView is enabled and is active (We click on it) + know this getting tabindex of viewtabas widget. + 0 => active list view + 1 => active icon view + """ + if not self.isenabled: + return False + if self.main.viewtabs.get_current_page() != 0: + return False + return True + + def clear(self): + self.model.clear() + + def generate_file(self, data): + self.iter = self.model.append (None) + self.model.set_value (self.iter, COL_HOST, data['hostname'] ) + self.model.set_value (self.iter, COL_IP, data['host'] ) + self.model.set_value (self.iter, COL_USERNAME, data['username'] ) + self.model.set_value (self.iter, COL_ACTIVE, data['image_active'] ) + self.model.set_value (self.iter, COL_LOGGED, data['image_logged'] ) + self.model.set_value (self.iter, COL_BLOCKED, data['image_blocked'] ) + self.model.set_value (self.iter, COL_PROCESS, data['num_process'] ) + self.model.set_value (self.iter, COL_TIME, data['time_logged'] ) + + def getmultiple(self): + allclients=[] + #model=self.main.tabla.get_model() + rows = [] + self.model.foreach(lambda model, path, iter: rows.append(path)) + for host in rows: + iter=self.model.get_iter(host) + if self.model.get_value(iter, COL_SEL_ST): + allclients.append(self.model.get_value(iter, COL_IP)) + return allclients + + def get_selected(self): + (model, iter) = self.main.tabla.get_selection().get_selected() + if iter == None: + print_debug( "get_selected() not selected thin client !!!" ) + return + return model.get_value(iter, COL_IP) + + def get_host(self, ip): + (model, iter) = self.main.tabla.get_selection().get_selected() + if iter == None: + print_debug( "get_selected() not selected thin client !!!" ) + return + return model.get_value(iter, COL_HOST) + + def change_lockscreen(self, ip, image): + self.model.foreach(self.__lockscreen_changer, [ip, image]) + + + def __lockscreen_changer(self, model, path, iter, args): + ip, image = args + # change image if ip is the same. + if model.get_value(iter, COL_IP) == ip: + model.set_value(iter, COL_BLOCKED, image) + + def refresh_client_info(self, ip, data): + self.model.foreach(self.__refresh_client_info, [ip, data] ) + + def __refresh_client_info(self, model, path, iter, args): + ip, data = args + print_debug ( "__refresh_client_info() ip=%s model_ip=%s" %(ip, model.get_value(iter, COL_IP)) ) + # update data if ip is the same. + if model.get_value(iter, COL_IP) == ip: + #self.set_client_data(ip, model, iter) + model.set_value (iter, COL_HOST, data['hostname'] ) + model.set_value (iter, COL_IP, data['ip'] ) + model.set_value (iter, COL_USERNAME, data['username'] ) + model.set_value (iter, COL_ACTIVE, data['image_active'] ) + model.set_value (iter, COL_LOGGED, data['image_logged'] ) + model.set_value (iter, COL_BLOCKED, data['image_blocked'] ) + model.set_value (iter, COL_PROCESS, data['num_process'] ) + model.set_value (iter, COL_TIME, data['time_logged'] ) + diff --git a/tcosmonitor/TcosMenus.py b/tcosmonitor/TcosMenus.py new file mode 100644 index 0000000..2d0c522 --- /dev/null +++ b/tcosmonitor/TcosMenus.py @@ -0,0 +1,263 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +import gtk +from gettext import gettext as _ +import os +import sys + +import tcosmonitor.shared + +menus_group = [ + [ 0, _("Terminal actions") , "active.png"], + [ 1, _("User actions") , "logged.png"], + [ 2, _("Audio, video and files"), "multimedia.png"], +] + +def print_debug(txt): + if tcosmonitor.shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + +class TcosMenus(object): + def __init__(self, main): + print_debug("__init__()") + self.main=main + self.ui=self.main.ui + + self.simplemenus=[] + self.allmenus=[] + + self.main.menu=gtk.Menu() + self.main.allmenu=gtk.Menu() + + #self.broadcast_count={} + + def register_simple(self, name, icon, group, action, func_name): + #print_debug("register_simple() name=%s, icons=%s, group=%s, action=%s" %(name, icon, group, action)) + self.simplemenus.append( [name, icon, group, action, func_name] ) + #print_debug("%s" %[name, icon, group, action, func_name] ) + + def register_all(self, name, icon, group, action, func_name): + #print_debug("register_all() name=%s, icons=%s, group=%s, action=%s" %(name, icon, group, action)) + self.allmenus.append( [name, icon, group, action, func_name] ) + + def MustShowMenu(self, func_name, menutype): + item_name="ck_menu_%s" %func_name + + if not item_name in tcosmonitor.shared.preferences_menus: + #print_debug("MustShowMenu() %s %s NOT FOUND return True item_name=%s" %(func_name, menutype, item_name) ) + return True + + if menutype == "menuone": + for number in tcosmonitor.shared.preferences_menus[item_name][1]: + if number in tcosmonitor.shared.preferences_menus_always_show[menutype]: + #print_debug("MustShowMenu() %s %s FOUND in MENUONE return True" %(func_name, menutype) ) + return True + + if menutype == "menuall": + for number in tcosmonitor.shared.preferences_menus[item_name][2]: + if number in tcosmonitor.shared.preferences_menus_always_show[menutype]: + #print_debug("MustShowMenu() %s %s found in MENUALL return True" %(func_name, menutype) ) + return True + + if func_name in self.main.preferences.visible_menu_items["names"]: + #print_debug("MustShow() number %s found at %s menutype %s"%(number, self.main.preferences.visible_menu_items[menutype], menutype)) + return True + #print_debug("MustShowMenu() %s %s return False item_name=%s" %(func_name, menutype, item_name) ) + return False + + def RightClickMenuOne(self, path=None, model=None, ip=None): + """ menu for one client""" + print_debug ( "RightClickMenuOne() creating menu" ) + self.main.menu=gtk.Menu() + + #print_debug ("%s"%self.simplemenus) + + totalhidemenus=0 + #menu header + if ip: + menu_items = gtk.MenuItem( _("Actions for %s") %(ip) ) + self.main.menu.append(menu_items) + menu_items.set_sensitive(False) + menu_items.show() + elif path == None: + menu_items = gtk.MenuItem(_("Actions for selected host")) + self.main.menu.append(menu_items) + menu_items.set_sensitive(False) + menu_items.show() + else: + if not model: + model=self.main.tabla.get_model() + menu_items = gtk.MenuItem( _("Actions for %s") %(model[path][1]) ) + ip=model[path][1] + self.main.menu.append(menu_items) + menu_items.set_sensitive(False) + menu_items.show() + + for mainmenu in menus_group: + if mainmenu[2] != None and os.path.isfile(tcosmonitor.shared.IMG_DIR + mainmenu[2]): + menu_item = gtk.ImageMenuItem(mainmenu[1], True) + icon = gtk.Image() + icon.set_from_file(tcosmonitor.shared.IMG_DIR + mainmenu[2]) + menu_item.set_image(icon) + else: + menu_item=gtk.MenuItem(mainmenu[1]) + + submenu = gtk.Menu() + count=0 + # parse submenu items and create submenu + for _s in self.simplemenus: + if _s[2] != mainmenu[0]: + continue + if _s[1] != None and os.path.isfile(tcosmonitor.shared.IMG_DIR + _s[1]): + sub = gtk.ImageMenuItem(_s[0], True) + icon = gtk.Image() + icon.set_from_file(tcosmonitor.shared.IMG_DIR + _s[1]) + sub.set_image(icon) + else: + sub=gtk.MenuItem(_s[0]) + # show ??? + if self.MustShowMenu(_s[4], "menuone"): + #print_debug("RightClickMenuOne() [SHOW] %s"%_s) + sub.connect("activate", _s[3], ip) + sub.show() + count+=1 + else: + #print_debug("RightClickMenuOne() [HIDE] %s"%_s) + sub.hide() + totalhidemenus+=1 + if self.main.config.GetVar("menugroups") == 1: + #print_debug("RightClickMenuOne() MENU GROUPS") + submenu.append(sub) + else: + #print_debug("RightClickMenuOne() PLAIN MENU") + self.main.menu.append(sub) + menu_item.set_submenu(submenu) + # if submenu is empty don't show + if count == 0: + menu_item.hide() + else: + menu_item.show() + # append to main menu + if self.main.config.GetVar("menugroups") == 1: + self.main.menu.append(menu_item) + if totalhidemenus > 0: + hide_items = gtk.MenuItem(_("%d hidden actions") %totalhidemenus) + hide_items.set_sensitive(False) + hide_items.show() + self.main.menu.append(hide_items) + return + + def RightClickMenuAll(self): + """ menu for ALL clients""" + self.main.allmenu=gtk.Menu() + + totalhidemenus=0 + #menu headers + if self.main.config.GetVar("selectedhosts") == 1: + menu_items = gtk.MenuItem(_("Actions for selected hosts")) + elif self.main.iconview.ismultiple() or self.main.classview.ismultiple(): + menu_items = gtk.MenuItem(_("Actions for selected hosts")) + else: + menu_items = gtk.MenuItem(_("Actions for all hosts")) + self.main.allmenu.append(menu_items) + menu_items.set_sensitive(False) + menu_items.show() + + + for mainmenu in menus_group: + if mainmenu[2] != None and os.path.isfile(tcosmonitor.shared.IMG_DIR + mainmenu[2]): + menu_item = gtk.ImageMenuItem(mainmenu[1], True) + icon = gtk.Image() + icon.set_from_file(tcosmonitor.shared.IMG_DIR + mainmenu[2]) + menu_item.set_image(icon) + else: + menu_item=gtk.MenuItem(mainmenu[1]) + + submenu = gtk.Menu() + count=0 + # parse submenu items and create submenu + for _s in self.allmenus: + if _s[2] != mainmenu[0]: + continue + if _s[1] != None and os.path.isfile(tcosmonitor.shared.IMG_DIR + _s[1]): + sub = gtk.ImageMenuItem(_s[0], True) + icon = gtk.Image() + icon.set_from_file(tcosmonitor.shared.IMG_DIR + _s[1]) + sub.set_image(icon) + else: + sub=gtk.MenuItem(_s[0]) + if self.MustShowMenu(_s[4], "menuall"): + #print_debug("RightClickMenuOne() [SHOW] %s"%_s) + sub.connect("activate", _s[3], ) + sub.show() + count+=1 + else: + sub.hide() + totalhidemenus+=1 + if self.main.config.GetVar("menugroups") == 1: + #print_debug("RightClickMenuAll() MENU GROUPS") + submenu.append(sub) + else: + #print_debug("RightClickMenuAll() PLAIN MENU") + self.main.allmenu.append(sub) + menu_item.set_submenu(submenu) + # if submenu is empty don't show + if count == 0: + menu_item.hide() + else: + menu_item.show() + # append to main allmenu + if self.main.config.GetVar("menugroups") == 1: + self.main.allmenu.append(menu_item) + if totalhidemenus > 0: + hide_items = gtk.MenuItem(_("%d hidden actions") %totalhidemenus) + hide_items.set_sensitive(False) + hide_items.show() + self.main.allmenu.append(hide_items) + if self.main.classview.isactive(): + save_pos = gtk.ImageMenuItem(_("Save hosts positions"), True) + icon = gtk.Image() + icon.set_from_stock (gtk.STOCK_SAVE, gtk.ICON_SIZE_BUTTON) + save_pos.set_image(icon) + save_pos.connect("activate", self.main.classview.savepos, "save") + save_pos.show() + self.main.allmenu.append(save_pos) + + reset_pos = gtk.ImageMenuItem(_("Reset hosts positions"), True) + icon = gtk.Image() + icon.set_from_stock (gtk.STOCK_REFRESH, gtk.ICON_SIZE_BUTTON) + reset_pos.set_image(icon) + reset_pos.connect("activate", self.main.classview.savepos, "reset") + reset_pos.show() + self.main.allmenu.append(reset_pos) + return + + def on_rightclickmenuone_click(self, menu, number): + print_debug ( "on_rightclickmenuone_click() => onehost_menuitems[%d]=%s" \ + % (number, tcosmonitor.shared.onehost_menuitems[number][0]) ) + self.main.actions.menu_event_one(number) + + def on_rightclickmenuall_click(self, menu, number): + print_debug ( "on_rightclickmenuall_click() => allhost_menuitems[%d]=%s" \ + % (number, tcosmonitor.shared.allhost_menuitems[number][0]) ) + self.main.actions.menu_event_all(number) + diff --git a/tcosmonitor/TcosMonitorDaemon.py b/tcosmonitor/TcosMonitorDaemon.py new file mode 100644 index 0000000..ffe36dd --- /dev/null +++ b/tcosmonitor/TcosMonitorDaemon.py @@ -0,0 +1,32 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +import xmlrpclib + +class TcosMonitorDaemon: + + def __init__(self): + pass + + + def foo(self): + pass + diff --git a/tcosmonitor/TcosPAM.py b/tcosmonitor/TcosPAM.py new file mode 100644 index 0000000..46091e0 --- /dev/null +++ b/tcosmonitor/TcosPAM.py @@ -0,0 +1,62 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +import PAM + + +def auth(user, password): + class AuthConv: + def __init__(self, password): + self.password = password + + def __call__(self, auth, query_list, userData): + resp = [] + for query, qt in query_list: + if qt == PAM.PAM_PROMPT_ECHO_ON: + resp.append((self.password, 0)) + elif qt == PAM.PAM_PROMPT_ECHO_OFF: + resp.append((self.password, 0)) + elif qt == PAM.PAM_PROMPT_ERROR_MSG or type == PAM.PAM_PROMPT_TEXT_INFO: + print query + resp.append(('', 0)) + else: + return None + return resp + + + auth = PAM.pam() + auth.start("passwd") + auth.set_item(PAM.PAM_USER, user) + auth.set_item(PAM.PAM_CONV, AuthConv(password)) + try: + auth.authenticate() + auth.acct_mgmt() + return True + except PAM.error, resp: + if resp[1] == 9: + print "error: TcosPAM error in pam connection. Are you root?" + else: + print "error: TcosPAM user:%s error:%s" % (user, resp) + return False + + +if __name__ == '__main__': + print auth("test", "test") diff --git a/tcosmonitor/TcosPreferences.py b/tcosmonitor/TcosPreferences.py new file mode 100644 index 0000000..a81d42e --- /dev/null +++ b/tcosmonitor/TcosPreferences.py @@ -0,0 +1,556 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +import sys +from time import time +import gtk +from gettext import gettext as _ + +import tcosmonitor.shared + +def print_debug(txt): + if tcosmonitor.shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + +class TcosPreferences: + + def __init__(self, main): + self.main=main + #self.ui=self.main.ui + self.visible_menu_items=[] + self.ui=gtk.Builder() + self.ui.set_translation_domain(tcosmonitor.shared.PACKAGE) + + # init pref window and buttons + self.ui.add_from_file(tcosmonitor.shared.GLADE_DIR + 'tcosmonitor-prefwindow.ui') + self.main.pref = self.ui.get_object('prefwindow') + self.main.pref.hide() + self.main.pref.set_icon_from_file(tcosmonitor.shared.IMG_DIR + 'tcos-icon-32x32.png') + # dont destroy window + # http://www.async.com.br/faq/pygtk/index.py?req=show&file=faq10.006.htp + self.main.pref.connect('delete-event', self.prefwindow_close ) + + # extensions table + self.main.extensions_table=self.ui.get_object('extensions_table') + + # buttons + self.main.pref_ok = self.ui.get_object('pref_ok_button') + self.main.pref_ok.connect('clicked', self.on_pref_ok_button_click) + self.main.pref_cancel = self.ui.get_object('pref_cancel_button') + self.main.pref_cancel.connect('clicked', self.on_pref_cancel_button_click) + + # make pref widgets + self.main.pref_spin_update = self.ui.get_object('spin_update') + self.main.pref_cache_timeout = self.ui.get_object('spin_cache_timeout') + self.main.pref_actions_timeout = self.ui.get_object('spin_actions_timeout') + self.main.pref_scrotsize = self.ui.get_object('spin_scrotsize') + self.main.pref_miniscrotsize = self.ui.get_object('spin_miniscrotsize') + self.main.pref_xmlrpc_username = self.ui.get_object('xmlrpc_username') + self.main.pref_xmlrpc_password = self.ui.get_object('xmlrpc_password') + + self.main.pref_ssh_remote_username = self.ui.get_object('ssh_remote_username') + self.main.pref_ports_tnc = self.ui.get_object('ports_net_controller') + self.main.pref_vlc_method_send = self.ui.get_object('vlc_method_send') + self.populate_select(self.main.pref_vlc_method_send, tcosmonitor.shared.vlc_methods_send ) + + # populate selects (only on startup) + self.main.combo_network_interfaces = self.ui.get_object('combo_networkinterface') + self.populate_select(self.main.combo_network_interfaces, self.main.common.GetAllNetworkInterfaces() ) + + # scan method + self.main.pref_combo_scan_method = self.ui.get_object('combo_scanmethod') + self.populate_select(self.main.pref_combo_scan_method, tcosmonitor.shared.scan_methods ) + + # static host list button + self.main.pref_open_static = self.ui.get_object('button_open_static') + self.main.pref_open_static.connect('clicked', self.on_button_open_static) + + # add signal changed to scan_method to enable/disable button on the fly + #self.main.pref_combo_scan_method.connect('changed', self.on_scan_method_change) + + # listmode method + self.main.pref_combo_listmode = self.ui.get_object('combo_listmode') + self.populate_select(self.main.pref_combo_listmode, tcosmonitor.shared.list_modes ) + + + # checkboxes + self.main.pref_populatelistatstartup = self.ui.get_object('ck_showliststartup') + #self.main.pref_cybermode = self.ui.get_object('ck_cybermode') + self.main.pref_systemprocess = self.ui.get_object('ck_systemprocess') + self.main.pref_threadscontrol = self.ui.get_object('ck_threadscontrol') + self.main.pref_enable_sslxmlrpc = self.ui.get_object('ck_enable_sslxmlrpc') + self.main.pref_consolekit = self.ui.get_object('ck_consolekit') + self.main.pref_blockactioninthishost = self.ui.get_object('ck_blockactioninthishost') + self.main.pref_notshowwhentcosmonitor = self.ui.get_object('ck_notshowwhentcosmonitor') + self.main.pref_onlyshowtcos = self.ui.get_object('ck_onlyshowtcos') + self.main.pref_selectedhosts = self.ui.get_object('ck_selectedhosts') + + self.main.pref_tcosinfo = self.ui.get_object('ck_tcosinfo') + self.main.pref_cpuinfo = self.ui.get_object('ck_cpuinfo') + self.main.pref_kernelmodulesinfo = self.ui.get_object('ck_kernelmodulesinfo') + self.main.pref_pcibusinfo = self.ui.get_object('ck_pcibusinfo') + self.main.pref_ramswapinfo = self.ui.get_object('ck_ramswapinfo') + self.main.pref_processinfo = self.ui.get_object('ck_processinfo') + self.main.pref_networkinfo = self.ui.get_object('ck_networkinfo') + self.main.pref_xorginfo = self.ui.get_object('ck_xorginfo') + self.main.pref_soundserverinfo = self.ui.get_object('ck_soundserverinfo') + + self.main.pref_menugroups = self.ui.get_object('ck_menugroups') + + # menus show hide + for menu in tcosmonitor.shared.preferences_menus: + setattr(self.main, "pref_" + menu, self.ui.get_object(menu) ) + + for menu in tcosmonitor.shared.button_preferences_menus: + setattr(self.main, "pref_" + menu, self.ui.get_object(menu) ) + + + def SaveSettings(self): + """ + save settings + """ + start=time() + print_debug ( "SaveSettings() INIT" ) + self.main.config.SetVar("xmlrpc_username", "" + self.main.pref_xmlrpc_username.get_text() ) + self.main.config.SetVar("xmlrpc_password", "" + self.main.pref_xmlrpc_password.get_text() ) + + self.main.config.SetVar("ssh_remote_username", "" + self.main.pref_ssh_remote_username.get_text() ) + self.main.config.SetVar("ports_tnc", "" + self.main.pref_ports_tnc.get_text() ) + + if self.main.pref_vlc_method_send.get_active() == 0: + self.main.config.SetVar("vlc_method_send", "ffmpeg-MPEG4") + elif self.main.pref_vlc_method_send.get_active() == 1: + self.main.config.SetVar("vlc_method_send", "ffmpeg-MPEG1") + elif self.main.pref_vlc_method_send.get_active() == 2: + self.main.config.SetVar("vlc_method_send", "x264-MPEG4") + elif self.main.pref_vlc_method_send.get_active() == 3: + self.main.config.SetVar("vlc_method_send", "http-Theora") + elif self.main.pref_vlc_method_send.get_active() == 4: + self.main.config.SetVar("vlc_method_send", "http-MPEG1") + + self.main.config.SetVar("refresh_interval", float(self.main.pref_spin_update.get_value()) ) + + self.main.config.SetVar("scrot_size", int(self.main.pref_scrotsize.get_value()) ) + self.main.config.SetVar("miniscrot_size", int(self.main.pref_miniscrotsize.get_value()) ) + + self.main.config.SetVar("cache_timeout", float(self.main.pref_cache_timeout.get_value()) ) + self.main.config.SetVar("actions_timeout", int(self.main.pref_actions_timeout.get_value()) ) + + self.main.config.SetVar("tcosmonitorversion", tcosmonitor.shared.version ) + + self.read_checkbox(self.main.pref_populatelistatstartup, "populate_list_at_startup") + #self.read_checkbox(self.main.pref_cybermode, "work_as_cyber_mode") + self.read_checkbox(self.main.pref_systemprocess, "systemprocess") + self.read_checkbox(self.main.pref_threadscontrol, "threadscontrol") + self.read_checkbox(self.main.pref_enable_sslxmlrpc, "enable_sslxmlrpc") + self.read_checkbox(self.main.pref_consolekit, "consolekit") + self.read_checkbox(self.main.pref_blockactioninthishost, "blockactioninthishost") + self.read_checkbox(self.main.pref_notshowwhentcosmonitor, "notshowwhentcosmonitor") + self.read_checkbox(self.main.pref_onlyshowtcos, "onlyshowtcos") + self.read_checkbox(self.main.pref_selectedhosts, "selectedhosts") + + method=tcosmonitor.shared.scan_methods[self.main.pref_combo_scan_method.get_active()] + self.main.config.SetVar("scan_network_method", method) +# if self.main.pref_combo_scan_method.get_active() == 0: +# self.main.config.SetVar("scan_network_method", "netstat") +# elif self.main.pref_combo_scan_method.get_active() == 1: +# self.main.config.SetVar("scan_network_method", "ping") +# elif self.main.pref_combo_scan_method.get_active() == 2: +# self.main.config.SetVar("scan_network_method", "nmap") +# else: +# self.main.config.SetVar("scan_network_method", "static") + + active=self.main.pref_combo_listmode.get_active() + self.main.config.SetVar("listmode", tcosmonitor.shared.list_modes[active][0]) + + self.main.config.SetVar("statichosts", self.main.static.get_static_conf() ) + + self.read_checkbox(self.main.pref_tcosinfo, "tcosinfo") + self.read_checkbox(self.main.pref_kernelmodulesinfo, "kernelmodulesinfo") + self.read_checkbox(self.main.pref_pcibusinfo, "pcibusinfo") + self.read_checkbox(self.main.pref_ramswapinfo, "ramswapinfo") + self.read_checkbox(self.main.pref_processinfo, "processinfo") + self.read_checkbox(self.main.pref_networkinfo, "networkinfo") + self.read_checkbox(self.main.pref_tcosinfo, "tcosinfo") + self.read_checkbox(self.main.pref_cpuinfo, "cpuinfo") + self.read_checkbox(self.main.pref_xorginfo, "xorginfo") + self.read_checkbox(self.main.pref_soundserverinfo, "soundserverinfo") + + self.read_checkbox(self.main.pref_menugroups, "menugroups") + + # read all combo values and save text + self.main.config.SetVar("network_interface", \ + self.read_select_value(self.main.combo_network_interfaces, "network_interface") ) + + visible_menus=[] + for menu in tcosmonitor.shared.preferences_menus: + pref_name=menu.replace('ck_menu_', '') + widget=getattr(self.main, "pref_" + menu) + if widget.get_active(): + visible_menus.append("%s:1" %pref_name) + else: + visible_menus.append("%s:0" %pref_name) + # convert array into string separated by comas + self.main.config.SetVar("visible_menus", ",".join(visible_menus) ) + + visible_buttons_menus=[] + for menu in tcosmonitor.shared.button_preferences_menus: + pref_name=menu.replace('ck_button_menu_', '') + widget=getattr(self.main, "pref_" + menu) + if widget.get_active(): + visible_buttons_menus.append("%s:1" %pref_name) + else: + visible_buttons_menus.append("%s:0" %pref_name) + # convert array into string separated by comas + self.main.config.SetVar("visible_buttons_menus", ",".join(visible_buttons_menus) ) + + # reput auth in dbus + self.main.dbus_action.set_auth( self.main.pref_xmlrpc_username.get_text(), self.main.pref_xmlrpc_password.get_text() ) + + self.main.config.SaveToFile() + + def read_checkbox(self, widget, varname): + if widget.get_active() == 1: + print_debug ( "read_checkbox(%s) CHECKED" %(widget.name) ) + self.main.config.SetVar(varname, 1) + else: + print_debug ( "read_checkbox(%s) UNCHECKED" %(widget.name) ) + self.main.config.SetVar(varname, 0) + + def read_select_value(self, widget, varname): + selected=-1 + try: + selected=widget.get_active() + except Exception, err: + print_debug ( "read_select() ERROR reading %s, error=%s" %(varname, err) ) + #FIXME ALERT + model=widget.get_model() + value=model[selected][0] + print_debug ( "read_select() reading %s=%s" %(varname, value) ) + return value + + + def prefwindow_close(self, widget, event): + print_debug ( "prefwindow_close() closing preferences window" ) + self.main.pref.hide() + return True + + def check_button_pref_menus(self): + total=0 + for menu in tcosmonitor.shared.button_preferences_menus: + pref_name=menu.replace('ck_button_menu_', '') + widget_pref=getattr(self.main, "pref_" + menu) + if widget_pref.get_active(): + total+=1 + if total > 5: + tcosmonitor.shared.info_msg(_("You have select more than 5 button menus.\nOnly allowed to select a maximum of 5 buttons.")) + return True + return False + + def on_pref_ok_button_click(self, widget): + if self.check_button_pref_menus(): + return + self.SaveSettings() + # refresh pref widgets + self.populate_pref() + print_debug ( "on_pref_ok_button_click() SAVE SETTINGS !!!" ) + self.main.write_into_statusbar ( _("New settings saved.") ) + self.main.pref.hide() + + def on_pref_cancel_button_click(self, widget): + print_debug ( "on_pref_cancel_button_click()" ) + # refresh pref widgets + self.populate_pref() + self.main.pref.hide() + + def on_button_open_static(self, widget): + print_debug("on_button_open_static()") + self.main.static.show_static() + self.main.pref.hide() + + def on_scan_method_change(self, widget): + if widget.get_active() == 2: + self.main.pref_open_static.set_sensitive(True) + else: + self.main.pref_open_static.set_sensitive(False) + + + def populate_pref(self): + # set default for combos + self.set_active_in_select(self.main.pref_combo_scan_method, \ + self.main.config.GetVar("scan_network_method")) + self.set_active_in_select(self.main.combo_network_interfaces, \ + self.main.config.GetVar("network_interface")) + + #if self.main.config.GetVar("scan_network_method") != "static": + # self.main.pref_open_static.set_sensitive(False) + #else: + # self.main.pref_open_static.set_sensitive(True) + + # set value of spin + self.main.pref_spin_update.set_value( float(self.main.config.GetVar("refresh_interval")) ) + self.main.pref_cache_timeout.set_value( float(self.main.config.GetVar("cache_timeout")) ) + self.main.pref_actions_timeout.set_value( float(self.main.config.GetVar("actions_timeout")) ) + self.main.pref_scrotsize.set_value( float(self.main.config.GetVar("scrot_size")) ) + self.main.pref_miniscrotsize.set_value( float(self.main.config.GetVar("miniscrot_size")) ) + + # set value of text widgets + if self.main.config.use_secrets == False: + self.main.pref_xmlrpc_username.set_sensitive(True) + self.main.pref_xmlrpc_password.set_sensitive(True) + self.main.pref_xmlrpc_username.set_text(\ + self.main.config.GetVar("xmlrpc_username").replace('"', '') ) + + self.main.pref_xmlrpc_password.set_text(\ + self.main.config.GetVar("xmlrpc_password").replace('"', '') ) + else: + self.main.pref_xmlrpc_username.set_text("") + self.main.pref_xmlrpc_password.set_text("") + self.main.pref_xmlrpc_username.set_sensitive(False) + self.main.pref_xmlrpc_password.set_sensitive(False) + + self.main.pref_ssh_remote_username.set_text(\ + self.main.config.GetVar("ssh_remote_username").replace('"', '') ) + + self.main.pref_ports_tnc.set_text(\ + self.main.config.GetVar("ports_tnc").replace('"', '') ) + + self.set_active_in_select(self.main.pref_vlc_method_send, \ + self.main.config.GetVar("vlc_method_send")) + + self.set_active_in_select(self.main.pref_combo_listmode, \ + self.main.config.GetVar("listmode") ) + + # populate checkboxes + self.populate_checkboxes(self.main.pref_populatelistatstartup, "populate_list_at_startup") + #self.populate_checkboxes(self.main.pref_cybermode, "work_as_cyber_mode") + self.populate_checkboxes(self.main.pref_systemprocess, "systemprocess") + self.populate_checkboxes(self.main.pref_threadscontrol, "threadscontrol") + self.populate_checkboxes(self.main.pref_enable_sslxmlrpc, "enable_sslxmlrpc") + self.populate_checkboxes(self.main.pref_consolekit, "consolekit") + self.populate_checkboxes(self.main.pref_blockactioninthishost, "blockactioninthishost") + self.populate_checkboxes(self.main.pref_notshowwhentcosmonitor, "notshowwhentcosmonitor") + self.populate_checkboxes(self.main.pref_onlyshowtcos, "onlyshowtcos") + self.populate_checkboxes(self.main.pref_selectedhosts, "selectedhosts") + + self.populate_checkboxes(self.main.pref_tcosinfo, "tcosinfo") + self.populate_checkboxes(self.main.pref_cpuinfo, "cpuinfo") + self.populate_checkboxes(self.main.pref_kernelmodulesinfo, "kernelmodulesinfo") + self.populate_checkboxes(self.main.pref_pcibusinfo, "pcibusinfo") + self.populate_checkboxes(self.main.pref_ramswapinfo, "ramswapinfo") + self.populate_checkboxes(self.main.pref_processinfo, "processinfo") + self.populate_checkboxes(self.main.pref_networkinfo, "networkinfo") + self.populate_checkboxes(self.main.pref_xorginfo, "xorginfo") + self.populate_checkboxes(self.main.pref_soundserverinfo, "soundserverinfo") + + self.populate_checkboxes(self.main.pref_menugroups, "menugroups") + + # button menus show hide + visible_buttons_menus=[] + visible_buttons_menu_keys={} + first_run=False + total=0 + + visible_buttons_menus_txt=self.main.config.GetVar("visible_buttons_menus") + if visible_buttons_menus_txt != "": + print_debug("visible_buttons_menus is not empty") + visible_buttons_menus=visible_buttons_menus_txt.split(',') + for item in visible_buttons_menus: + item = item.split(":") + if len(item) == 1: + visible_buttons_menu_keys[item[0]]="1" + else: + visible_buttons_menu_keys[item[0]]=item[1] + else: + first_run=self.main.config.IsNew("visible_buttons_menus") + first_run=True + print_debug("visible_buttons_menus is empty first_run=%s"%first_run) + + self.main.toolbar2.show() + for menu in tcosmonitor.shared.button_preferences_menus: + pref_name=menu.replace('ck_button_menu_', '') + widget_button=getattr(self.main, "handlebox_" + pref_name) + widget_pref=getattr(self.main, "pref_" + menu) + if first_run: + # first run, set defaults + if tcosmonitor.shared.button_preferences_menus[menu][0] != False: + #widget.set_active(shared.preferences_menus[menu][0]) + #visible_menu_items.append(menu) + #continue + #visible_menus.append("%s:1" %pref_name) + visible_buttons_menu_keys[pref_name]="1" + + if pref_name in visible_buttons_menu_keys.keys(): + if visible_buttons_menu_keys[pref_name] == "1": + widget_button.show() + widget_pref.set_active(1) + total+=1 + elif visible_buttons_menu_keys[pref_name] == "0": + widget_button.hide() + widget_pref.set_active(0) + elif pref_name not in visible_buttons_menu_keys.keys() and \ + tcosmonitor.shared.button_preferences_menus[menu][0] != False: + widget_button.show() + widget_pref.set_active(1) + total+=1 + else: + widget_button.hide() + widget_pref.set_active(0) + if total == 0: + self.main.toolbar2.hide() + + # menus show hide + visible_menus=[] + visible_menu_items=[] + visible_menu_keys={} + first_run=False + + visible_menus_txt=self.main.config.GetVar("visible_menus") + if visible_menus_txt != "": + print_debug("visible_menus is not empty") + visible_menus=visible_menus_txt.split(',') + for item in visible_menus: + item = item.split(":") + if len(item) == 1: + visible_menu_keys[item[0]]="1" + else: + visible_menu_keys[item[0]]=item[1] + else: + first_run=self.main.config.IsNew("visible_menus") + first_run=True + print_debug("visible_menus is empty first_run=%s"%first_run) + + self.visible_menu_items={"menuone":[], "menuall":[], "names":[]} + for menu in tcosmonitor.shared.preferences_menus: + pref_name=menu.replace('ck_menu_', '') + widget=getattr(self.main, "pref_" + menu) + if not widget: + continue + if first_run: + # first run, set defaults + if tcosmonitor.shared.preferences_menus[menu][0] != False: + #widget.set_active(shared.preferences_menus[menu][0]) + #visible_menu_items.append(menu) + #continue + #visible_menus.append("%s:1" %pref_name) + visible_menu_keys[pref_name]="1" + + if pref_name in visible_menu_keys.keys(): + if visible_menu_keys[pref_name] == "1": + widget.set_active(1) + visible_menu_items.append(menu) + self.visible_menu_items["names"].append(pref_name) + elif visible_menu_keys[pref_name] == "0": + widget.set_active(0) + elif pref_name not in visible_menu_keys.keys() and \ + tcosmonitor.shared.preferences_menus[menu][0] != False: + widget.set_active(1) + visible_menu_items.append(menu) + self.visible_menu_items["names"].append(pref_name) + else: + widget.set_active(0) + + for item in visible_menu_items: + self.visible_menu_items["menuone"]+=tcosmonitor.shared.preferences_menus[item][1] + self.visible_menu_items["menuall"]+=tcosmonitor.shared.preferences_menus[item][2] + + print_debug("visible_menu_items() %s"%self.visible_menu_items) + # make menus + self.main.menus.RightClickMenuOne(None) + self.main.menus.RightClickMenuAll() + + listmode=self.main.config.GetVar("listmode") + oldtab=self.main.viewtabs.get_current_page() + + if listmode == 'list': + self.main.viewtabs.set_property('show-tabs', False) + self.main.viewtabs.set_current_page(0) + self.main.searchbutton.set_sensitive(True) + self.main.searchtxt.set_sensitive(True) + elif listmode == 'icons': + self.main.viewtabs.set_property('show-tabs', False) + self.main.viewtabs.set_current_page(1) + self.main.searchbutton.set_sensitive(False) + self.main.searchtxt.set_sensitive(False) + elif listmode == 'class': + self.main.viewtabs.set_property('show-tabs', False) + self.main.viewtabs.set_current_page(2) + self.main.searchbutton.set_sensitive(False) + self.main.searchtxt.set_sensitive(False) + else: + self.main.viewtabs.set_property('show-tabs', True) + self.main.viewtabs.set_current_page(2) + self.main.searchbutton.set_sensitive(False) + self.main.searchtxt.set_sensitive(False) + + + print_debug("populate_pref() done") + + def populate_checkboxes(self, widget, varname): + checked=self.main.config.GetVar(varname) + if checked == "": + checked=1 + checked=int(checked) + if checked == 1: + widget.set_active(1) + else: + widget.set_active(0) + return + + def populate_select(self, widget, values): + valuelist = gtk.ListStore(str, str) + for value in values: + if isinstance(value, list): + valuelist.append([value[0], value[1]]) + else: + valuelist.append([value.split()[0], value.split()[0]]) + widget.set_model(valuelist) + widget.set_text_column(1) + model=widget.get_model() + return + + def set_active_in_select(self, widget, default): + model=widget.get_model() + for i in range(len(model)): + if model[i][0] == default: + print_debug ("set_active_in_select() default is %s, index %d" %( model[i][0] , i ) ) + widget.set_active(i) + return + + def add_extension_row(self, args, text): + # FIXME add checkboxes for every extension + print_debug("add_extension_file() args=%s, text=%s" %(args, text)) + table=gtk.Table(2, 2, False) + table.show() + button=gtk.Button(_("Stop")) + image = gtk.Image() + image.set_from_stock (gtk.STOCK_STOP, gtk.ICON_SIZE_BUTTON) + button.set_image(image) + # FIXME need to add actipon for button click event + #button.connect('clicked', self.on_progressbox_click, args, table) + button.show() + label=gtk.Label( text ) + label.show() + table.attach(button, 0, 1, 0, 1, False, False, 0, 0) + table.attach(label, 1, 2, 0, 1 ) + self.main.progressbox.add(table) + self.main.progressbox.show() + diff --git a/tcosmonitor/TcosStaticHosts.py b/tcosmonitor/TcosStaticHosts.py new file mode 100644 index 0000000..90289b8 --- /dev/null +++ b/tcosmonitor/TcosStaticHosts.py @@ -0,0 +1,281 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +import sys +import gtk +from gettext import gettext as _ +import tcosmonitor.shared +from time import time + +COL_IP, COL_MAC= range(2) + +# constant to font sizes +PANGO_SCALE=1024 + +def print_debug(txt): + if tcosmonitor.shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + +def crono(start, txt): + print_debug ("crono(), %s get %f seconds" %(txt, (time() - start)) ) + return + +class TcosStaticHosts: + + def __init__(self, main): + print_debug ("__init__ starting") + self.selected_ip=None + self.selected_mac=None + self.mode="add" + self.data=[] + self.main=main + self.ui=self.main.ui + self.model=gtk.ListStore(str, str) + + self.ui = gtk.Builder() + self.ui.set_translation_domain(tcosmonitor.shared.PACKAGE) + + self.ui.add_from_file(tcosmonitor.shared.GLADE_DIR + 'tcosmonitor-staticwindow.ui') + + self.main.staticwindow=self.ui.get_object('staticwindow') + self.main.staticwindow.connect('delete-event', self.staticwindow_close ) + + self.ui.add_from_file(tcosmonitor.shared.GLADE_DIR + 'tcosmonitor-staticwindownew.ui') + self.ui.set_translation_domain(tcosmonitor.shared.PACKAGE) + self.main.staticwindownew=self.ui.get_object('staticwindownew') + self.main.staticwindownew.connect('delete-event', self.staticwindownew_close ) + + self.init_statichostlist() + + self.main.static_button_cancel=self.ui.get_object('button_static_cancel') + self.main.static_button_cancel.connect('clicked', self.staticwindow_close) + + self.main.static_button_save=self.ui.get_object('button_static_save') + self.main.static_button_save.connect('clicked', self.staticwindow_save) + + self.main.static_button_add=self.ui.get_object('button_static_add') + self.main.static_button_add.connect('clicked', self.static_add) + + self.main.static_button_modify=self.ui.get_object('button_static_modify') + self.main.static_button_modify.connect('clicked', self.static_modify) + + self.main.static_button_delete=self.ui.get_object('button_static_delete') + self.main.static_button_delete.connect('clicked', self.static_delete) + + self.main.static_button_get=self.ui.get_object('button_static_get') + self.main.static_button_get.connect('clicked', self.static_get) + + # static_line buttons + self.main.static_button_line_cancel=self.ui.get_object('button_static_line_cancel') + self.main.static_button_line_cancel.connect('clicked', self.staticwindownew_close) + + self.main.static_button_line_save=self.ui.get_object('button_static_line_save') + self.main.static_button_line_save.connect('clicked', self.on_static_new) + + # new line + self.main.static_new_ip=self.ui.get_object('static_new_ip') + self.main.static_new_mac=self.ui.get_object('static_new_mac') + + self.control_buttons(False) + + self.init_data(self.main.config.GetVar("statichosts")) + + + def init_data(self, txt): + if txt == "": + return + tmp=txt.split("#") + for host in tmp: + self.data.append(host.split("|")) + #remove last empty element + self.data=self.data[:-1] + print_debug("init_data() self.data=%s" %self.data) + self.populate_data(self.data) + + def populate_data(self, data): + for host in data: + self.new_line=True + model=self.main.staticlist.get_model() + model.foreach(self.line_exists, host) + + if self.new_line: + print_debug("populate_data() adding ip=%s" %host[0]) + self.iter = self.model.append (None) + self.model.set_value (self.iter, COL_IP, host[0] ) + self.model.set_value (self.iter, COL_MAC, host[1] ) + + def line_exists(self, model, path, iter, args): + ip, mac = args + # change mac if ip is the same. + if model.get_value(iter, 0) == ip: + model.set_value(iter, 1, mac) + self.new_line=False + + + def staticwindow_close(self, *args): + self.main.staticwindow.hide() + return True + + def staticwindownew_close(self, *args): + self.main.staticwindownew.hide() + return True + + def init_statichostlist(self): + print_debug ( "init_statichostlist()" ) + + self.main.staticlist = self.ui.get_object('staticlist') + self.main.staticlist.set_model (self.model) + + cell1 = gtk.CellRendererText () + column1 = gtk.TreeViewColumn (_("IP address"), cell1, text = COL_IP) + column1.set_resizable (True) + column1.set_sort_column_id(COL_IP) + self.main.staticlist.append_column (column1) + + cell2 = gtk.CellRendererText () + column2 = gtk.TreeViewColumn (_("MAC address"), cell2, text = COL_MAC) + column2.set_resizable (True) + column2.set_sort_column_id(COL_MAC) + self.main.staticlist.append_column (column2) + + self.table_file = self.main.staticlist.get_selection() + self.table_file.connect("changed", self.on_static_list_change) + + return + + def show_static(self): + self.main.staticwindow.show() + + def on_static_list_change (self, data): + (model, iter) = self.main.staticlist.get_selection().get_selected() + if not iter: + self.control_buttons(False) + return + self.selected_ip=model.get_value(iter,0) + self.selected_mac=model.get_value(iter, 1) + print_debug("selected_ip=%s selected_mac=%s" %(self.selected_ip, self.selected_mac)) + self.control_buttons(True) + + def control_buttons(self, seteditable): + if seteditable: + self.main.static_button_modify.set_sensitive(True) + self.main.static_button_delete.set_sensitive(True) + else: + self.main.static_button_modify.set_sensitive(False) + self.main.static_button_delete.set_sensitive(False) + + def static_add(self, widget): + self.mode="add" + self.main.static_new_ip.set_sensitive(True) + self.main.staticwindownew.show() + + def on_static_new(self, widget): + print_debug("on_static_new()") + # read ip and mac address + ip=self.main.static_new_ip.get_text() + mac=self.main.static_new_mac.get_text() + + if self.mode == "add": + # put into treeview + self.iter = self.model.append (None) + self.model.set_value (self.iter, COL_IP, ip ) + self.model.set_value (self.iter, COL_MAC, mac ) + + if self.mode == "edit": + model=self.main.staticlist.get_model() + model.foreach(self.line_changer, [ip, mac]) + + self.main.static_new_ip.set_text("") + self.main.static_new_mac.set_text("") + self.staticwindownew_close() + + def line_changer(self, model, path, iter, args): + ip, mac = args + # change mac if ip is the same. + if model.get_value(iter, 0) == ip: + model.set_value(iter, 1, mac) + + + def static_modify(self, widget): + print_debug("on_static_modify()") + self.mode="edit" + self.main.static_new_ip.set_sensitive(False) + # read ip and mac address + self.main.static_new_ip.set_text(self.selected_ip) + self.main.static_new_mac.set_text(self.selected_mac) + self.main.staticwindownew.show() + + def static_delete(self, widget): + print_debug("static_delete()") + (model, iter) = self.main.staticlist.get_selection().get_selected() + if iter: + model.remove(iter) + + def line_saver(self, model, path, iter, args): + ip=model.get_value(iter, 0) + mac=model.get_value(iter,1) + self.data.append([ip, mac]) + + def staticwindow_save(self, widget): + print_debug("staticwindow_save()") + # save in conf file + self.main.preferences.SaveSettings() + self.staticwindow_close() + + def get_static_conf(self): + # get items in treeview + self.data=[] + model=self.main.staticlist.get_model() + model.foreach(self.line_saver, [self.data]) + print_debug("get_static_conf() data=%s" %self.data) + + # convert in text format + txt="" + for host in self.data: + # host separated with # and ip mac separated with | + txt+="%s|%s#" %(host[0], host[1]) + print_debug("get_static_conf() txt=%s" %txt) + return txt + + + + def static_get(self, widget): + print_debug ("static_get()") + if len(self.main.localdata.allclients) < 1: + # exit if no hosts + tcosmonitor.shared.error_msg ( _("No hosts found, please click on Refresh button using another method.") ) + return + + print_debug ("static_get() allclients=%s"%self.main.localdata.allclients) + self.data=[] + # scan hosts and get MAC address + for host in self.main.localdata.allclients: + if not self.main.xmlrpc.newhost(host): + continue + mac=self.main.xmlrpc.ReadInfo("network_mac") + if not mac: + mac = "" + self.data.append([host, mac]) + + print_debug("static_get() data=%s"%self.data) + self.populate_data(self.data) + + diff --git a/tcosmonitor/TcosTrayIcon.py b/tcosmonitor/TcosTrayIcon.py new file mode 100644 index 0000000..95fe56f --- /dev/null +++ b/tcosmonitor/TcosTrayIcon.py @@ -0,0 +1,248 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +import gtk +import os +import sys +from gettext import gettext as _ +from time import time + +import tcosmonitor.shared + +def print_debug(txt): + if tcosmonitor.shared.debug: + print >> sys.stderr, "[%d] %s::%s" % (os.getpid(), __name__, txt) + #print("[%d] %s::%s" % (os.getpid(), __name__, txt), file=sys.stderr) + + +def crono(start, txt): + print_debug ("crono(), %s get %f seconds" %(txt, (time() - start)) ) + return + + +class TcosTrayIcon: + def __init__(self, disable_quit=True, allow_reboot_poweroff=True): + self.actions={} + self.args={} + #self.statusIcon = gtk.StatusIcon() + self.menu=gtk.Menu() + if not disable_quit: + self.items={ "quit": [_("Quit"), "menu_kill.png", True, None] } + else: + self.items={} + + if allow_reboot_poweroff: + self.items["reboot"]=[_("Reboot"), "menu_reboot.png", True, None] + self.items["poweroff"]=[_("Poweroff"), "menu_poweroff.png", True, None] + + self.InitMenu() + self.InitStatusIcon() + + + def InitMenu(self): + #print_debug ("InitMenu()") + self.menu.popdown() + self.menu=gtk.Menu() + menu_item = gtk.MenuItem(_("TcosDevices")) + self.menu.append(menu_item) + menu_item.set_sensitive(False) + menu_item.show() + + + _sorted=self.items.keys() + _sorted.sort() + for m in _sorted: + if m != "quit": + self.menu.append(self.create_menu(self.items[m], m) ) + + # add quit menu at bottom + if self.items.has_key("quit"): + self.menu.append(self.create_menu(self.items["quit"], "quit") ) + return + + def update_status(self, device, actions, status): + print_debug ("updating status of %s to %s" %(actions, status)) + + if self.items.has_key("%s"%device): + self.items["%s"%device][3]["%s"%actions][2]=status + self.InitMenu() + else: + print_debug( " WW: no updating status of %s"%(actions) ) + + def register_action(self, action, function, *args): + self.actions["%s" %action]=function + self.args["%s" %action]=args + #self.InitMenu() + return + + def unregister_action(self, action): + self.actions.pop(action) + #self.InitMenu() + return + + + def register_device(self, device, devname, devimage, show, actions, devid): + self.items["%s"%(device)]=[ devname, devimage, show, actions, devid] + self.InitMenu() + #print self.items["%s"%(device)] + + def unregister_device(self, device): + if self.items.has_key(device): + self.items.pop("%s"%device) + else: + print "WARNING: device %s not found" % device + + def create_menu(self, item, name): + #print_debug (" => creating menu %s for %s" %(item,name) ) + # search for icon + icon_file_found=False + if item[1] != None: + icon_file_found=True + icon_file=tcosmonitor.shared.IMG_DIR + item[1] + if not os.path.isfile(icon_file): + icon_file_found=False + + + if icon_file_found: + # we have icon + menu_items=gtk.ImageMenuItem(item[0], True) + icon = gtk.Image() + icon.set_from_file(icon_file) + menu_items.set_image(icon) + else: + buf = item[0] + menu_items = gtk.MenuItem(buf) + + + menu_items.show() + menu_items.set_sensitive(item[2]) + #print_debug("create_menu() name=%s item=%s" %(name, item)) + #print "name=%s sensitive=%s " %(name, item[2]) + + if item[3]: + submenu = gtk.Menu() + + _sorted=item[3].keys() + _sorted.sort() + + for subitem in _sorted: + #print_debug("create_menu() name=%s item=%s" %(subitem, item[3][subitem])) + #print_debug( " => creando submenu %s item=%s" %(subitem, item[3][subitem]) ) + submenu.append( self.create_menu(item[3][subitem], subitem) ) + + menu_items.set_submenu(submenu) + #menu_items.connect("activate", self.do_action, name) + else: + menu_items.connect("activate", self.do_action, name) + + return menu_items + + def do_action(self, widget, name): + print_debug ("do_action() widget=%s name=%s" %(widget, name) ) + if self.actions.has_key(name): + #print_debug("do_action() function=%s args=%s" %(self.actions[name], self.args[name]) ) + self.actions[name](self.args[name]) + else: + print "TcosTrayIcon WARNING: no menu action set for \"%s\" event" % (name) + return + + def InitStatusIcon(self): + if hasattr(gtk, 'status_icon_new_from_file'): + # use gtk.status_icon + self.statusIcon = gtk.status_icon_new_from_file(tcosmonitor.shared.IMG_DIR + "tcos-devices-32x32.png") + self.statusIcon.set_tooltip( _("Tcos Devices") ) + self.statusIcon.connect('popup-menu', self.popup_menu) + else: + # based on http://www.burtonini.com/computing/notify.py + import egg.trayicon + icon = egg.trayicon.TrayIcon("TCOS") + eventbox = gtk.EventBox() + icon.add(eventbox) + #tcos-icon-32x32.png + image=gtk.Image() + image.set_from_file (tcosmonitor.shared.IMG_DIR + "tcos-devices-32x32.png") + eventbox.add(image) + tips = gtk.Tooltips() + + tips.set_tip(icon, ( _("Tcos Devices") )[0:79]) + tips.enable() + icon.show_all() + eventbox.connect("button_press_event", self.popup_menu2) + return + + def popup_menu(self, widget, button, mtime): + self.InitMenu() + if self.menu: + self.menu.show_all() + self.menu.popup(None, None, None, 3, mtime) + return + + def popup_menu2(self, widget, event): + self.InitMenu() + self.menu.popup(None, None, None, event.button, event.time) + + + + + +if __name__ == "__main__": + + def myprint(*args): + print "MYPRINT %s" % args + + tcosmonitor.shared.debug=True + + def change(*args): + systray.status = not systray.status + systray.update_status("usb1", "usb1_mount", systray.status) + systray.update_status("usb1", "usb1_umount", not systray.status) + + systray=TcosTrayIcon() + + systray.status=True + + systray.update_status("cdrom1", "cdrom1_mount", False) + systray.update_status("cdrom1", "cdrom1_umount", False) + + #systray.register_action("quit", lambda w: gtk.main_quit() ) + systray.register_action("quit", change ) + + systray.register_action("cdrom1_mount", myprint ) + systray.register_action("cdrom1_umount", myprint ) + + systray.register_device("usb1", _("Usb flash"), "floppy_mount.png", True, + { + "usb1_mount":[ _("Mount USB1"), "floppy_mount.png", False, None, "/dev/sda1"], + "usb1_umount":[ _("Umount USB1"), "floppy_umount.png", False, None, "/dev/sda1"], + }, "/dev/sda1" + ) + + + + systray.update_status("usb1", "usb1_mount", True) + systray.update_status("usb1", "usb1_umount", False) + + systray.register_action("usb1_umount", change ) + systray.register_action("usb1_mount", change ) + #systray.register_action("usb1", change ) + + + gtk.main() + diff --git a/tcosmonitor/TcosTrayIcon2.py b/tcosmonitor/TcosTrayIcon2.py new file mode 100644 index 0000000..dbcec3d --- /dev/null +++ b/tcosmonitor/TcosTrayIcon2.py @@ -0,0 +1,377 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +import gtk +import os +import sys +from gettext import gettext as _ +from time import time + +import gobject + +import tcosmonitor.shared + +def print_debug(txt): + if tcosmonitor.shared.debug: + print >> sys.stderr, "[%d] %s::%s" % (os.getpid(), __name__, txt) + #print("[%d] %s::%s" % (os.getpid(), __name__, txt), file=sys.stderr) + +def crono(start, txt): + print_debug ("crono(), %s get %f seconds" %(txt, (time() - start)) ) + return + + +class TcosTrayIcon(object): + def __init__(self, disable_quit=True, allow_reboot_poweroff=True): + self.actions={} + self.args={} + self.first_time=True + + self.menu=gtk.Menu() + if not disable_quit: + self.items={ "quit": [_("Quit"), "menu_kill.png", True, None, None, False] } + else: + self.items={} + + if allow_reboot_poweroff: + self.items["reboot"]=[_("Reboot"), "menu_reboot.png", True, None, None, False] + self.items["poweroff"]=[_("Poweroff"), "menu_poweroff.png", True, None, None, False] + + self.InitStatusIcon() + self.InitMenu() + + + def InitStatusIcon(self): + self.statusIcon = gtk.status_icon_new_from_file(tcosmonitor.shared.IMG_DIR + "tcos-devices-32x32.png") + self.statusIcon.set_tooltip( _("Tcos Devices") ) + + # locale support + import gettext + gettext.bindtextdomain(tcosmonitor.shared.PACKAGE, tcosmonitor.shared.LOCALE_DIR) + gettext.textdomain(tcosmonitor.shared.PACKAGE) + + self.ui = gtk.Builder() + self.ui.set_translation_domain(tcosmonitor.shared.PACKAGE) + self.ui.add_from_file(tcosmonitor.shared.GLADE_DIR + 'tray.ui') + + self.window = self.ui.get_object('popup') + self.hide_button = self.ui.get_object("hide_button") + + self.hide_button.connect("clicked", self.close_popup) + self.statusIcon.connect('popup-menu', self.popup_window) + self.statusIcon.connect('activate', self.popup_window) + + self.devbox=self.ui.get_object("devbox") + self.window = self.ui.get_object('popup') + + + def InitMenu(self): + #print_debug (" ##### InitMenu() ######") + + # clean devbox + self.devbox=self.ui.get_object("devbox") + self.devbox.foreach( lambda(widget): widget.destroy() ) + + # sort items + _sorted=self.items.keys() + _sorted.sort() + + + for m in _sorted: + if m not in ["poweroff", "reboot", "quit"]: + self.append_item(self.items[m], m) + + for extra in ["poweroff", "reboot", "quit"]: + # add quit, reboot and poweroff menus at bottom + if self.items.has_key(extra): + self.append_item(self.items[extra], extra ) + + def append_item(self, item, title): + #print_debug("append_item() title=%s item=%s" %(title,item) ) + #return + + # need a table with 3 columns + # + # #################################### + # # # # # + # # Icon # Device info # Button # + # # # # # + # #################################### + # + table=gtk.Table(1, 3, False) + table.set_col_spacings(5) + + status=self.items[title][5] + #if title not in ['reboot', 'poweroff', 'quit']: + # print " title %s status=%s"%(title, status) + + ####################################### + icon = gtk.Image() + if item[1] != None: + icon_file_found=True + icon_file=tcosmonitor.shared.IMG_DIR + item[1] + if not os.path.isfile(icon_file): + icon_file_found=False + if title not in ['reboot', 'poweroff', 'quit'] and icon_file_found: + # we have icon + icon.set_from_file(icon_file) + icon.set_sensitive(status) + + icon.show() + #table.attach(icon, 0, 1, 0, 1, gtk.FILL, False, 0, 0) + table.attach(icon, 0, 1, 0, 1, gtk.FILL) + ######################################## + + + + label=gtk.Label() + label.set_use_markup(True) + label.set_alignment(0, 0.5) + label.set_justify(gtk.JUSTIFY_LEFT) + if title not in ['reboot', 'poweroff', 'quit']: + if "floppy" in title: + devtype=_("Floppy: %s") %item[4] + elif "cdrom" in title: + devtype=_("CDROM: %s") %item[4] + elif "usb" in title: + devtype=_("USB: %s") %item[4] + elif "hdd" in title: + devtype=_("HDD partition: %s") %item[4] + else: + devtype=_("Unknow: %s") %item[4] + # have device description??? + if item[6] is not None and item[6] != "unknow": + devdesc=item[6] + else: + devdesc=item[0] + label.set_markup( "<b>%s</b>\n<small>%s</small>" %(devtype, devdesc) ) + label.set_sensitive(status) + else: + label.set_markup("<b>%s</b>"%item[0]) + label.show() + #table.attach(label, 1, 2, 0, 1, gtk.EXPAND, False, 0, 0) + table.attach(label, 1, 2, 0, 1, gtk.EXPAND) + + ########## BUTTON ######## + + button_image=gtk.Image() + button=gtk.Button() + button.set_sensitive(True) + if title in ['reboot', 'poweroff', 'quit']: + button_image.set_from_file(icon_file) + #button.set_sensitive(True) + else: + button_image.set_from_file(tcosmonitor.shared.IMG_DIR + "eject.png") + #button.set_sensitive(False) + + button.set_image(button_image) + button.connect("clicked", self.do_action, title, item) + button.show() + #table.attach(button, 2, 3, 0, 1, gtk.FILL, False, 0, 0) + table.attach(button, 2, 3, 0, 1, gtk.FILL) + + table.show() + self.devbox.add(table) + + # add separator + separator=gtk.HSeparator() + self.devbox.add(separator) + + + def close_popup(self, *args): + #print_debug( "close_popup() args=%s" %str(args) ) + gobject.timeout_add(100, self.window.hide) + + def popup_window(self, *args): + #print_debug("popup_window() args=%s" %str(args)) + + # get popup size + winx, winy = self.window.size_request() + + # get window size + width=gtk.gdk.screen_width() + height=gtk.gdk.screen_height() + + # get trayicon position + a, rect, c = self.statusIcon.get_geometry() + + # new pos + if rect.x + winx > width: + #print( "rect.x=%s + winx=%s GREATER with=%s" %(rect.x, winx, width) ) + newx=abs(width-winx) + else: + #print( "rect.x=%s + winx=%s LOWER with=%s" %(rect.x, winx, width) ) + newx=rect.x + + if rect.y + winy > height: + #print( "rect.y=%s + winy=%s GREATER que height=%s" %(rect.y, winy, height) ) + newy=abs( height-winy-(self.statusIcon.get_size()) -5 ) + else: + #print( "rect.y=%s + winy=%s LOWER que height=%s" %(rect.y, winy, height) ) + newy=abs( rect.y-(self.statusIcon.get_size()) ) + + # move + self.window.move( newx, newy ) + #print "newx=%s newy=%s"%(newx, newy) + + # ugly hack to avoid wrong height + if self.first_time: + #self.window.show() + #self.window.hide() + self.first_time=False + self.popup_window() + + gobject.timeout_add(100, self.window.show) + #self.window.show() + + + def update_status(self, device, actions, status): + print_debug ("update_status() device=%s of %s to %s" %(device, actions, status)) + + if self.items.has_key(device): + if "_mount" in actions and status: + #print " action UMOUNTING..." + # if xxx_mount is True device is umounted + self.items[device][5]=False + + if "_umount" in actions and status: + #print " action MOUNTING..." + self.items[device][5]=True + + #print " STATUS of %s is %s" %(device, status) + + self.items["%s"%device][3]["%s"%actions][2]=status + #self.InitMenu() + gobject.timeout_add(100, self.InitMenu) + else: + print_debug( " WW: no updating status of %s"%(actions) ) + + def register_action(self, action, function, *args): + #print_debug("register_action() action=%s function=%s, args=%s" %(action, function, args) ) + self.actions["%s" %action]=function + self.args["%s" %action]=args + #self.InitMenu() + return + + def unregister_action(self, action): + self.actions.pop(action) + #self.InitMenu() + return + + def register_device(self, device, devname, devimage, show, actions, devid, devdesc=None): + if devdesc is not None: + devdesc=devdesc.replace('_', ' ').replace('|', '') + print_debug("register_device() device='%s' devname='%s' devimage='%s' show='%s' actions='%s' devid='%s' devdesc='%s'" + %(device, devname, devimage, show, actions, devid, devdesc) ) + self.items["%s"%(device)]=[ devname, devimage, show, actions, devid, False, devdesc] + self.InitMenu() + #print self.items["%s"%(device)] + + def unregister_device(self, device): + print_debug("unregister_device() device=%s" %(device) ) + if self.items.has_key(device): + self.items.pop(device) + else: + print "WARNING: device %s not found" % device + + + def do_action(self, widget, name, item=None): + print_debug ("do_action() widget=%s name=%s" %(widget, name) ) + if self.actions.has_key(name): + #print_debug("do_action() function=%s args=%s" %(self.actions[name], self.args[name]) ) + self.actions[name](self.args[name]) + else: + if item: + #print self.items[name][5] + if self.items[name][5]: # mounted => umount + #print "umount" + key="%s_umount" %name + + else: + #print "mount" + key="%s_mount" %name + + if self.actions.has_key(key): + self.actions[key](self.args[key]) + else: + print "TcosTrayIcon WARNING: no menu action set for \"%s\" event" % (name) + return + + + + + + +if __name__ == "__main__": + + def myprint(*args): + print "MYPRINT %s" % args + + tcosmonitor.shared.debug=True + + def change(*args): + systray.status = not systray.status + systray.update_status("usb1", "usb1_mount", systray.status) + systray.update_status("usb1", "usb1_umount", not systray.status) + + systray=TcosTrayIcon(disable_quit=False) + + systray.status=True + + systray.update_status("cdrom1", "cdrom1_mount", False) + systray.update_status("cdrom1", "cdrom1_umount", False) + + #systray.register_action("quit", lambda w: gtk.main_quit() ) + systray.register_action("quit", change ) + + systray.register_action("cdrom1_mount", myprint ) + systray.register_action("cdrom1_umount", myprint ) + + systray.register_device("usb1", _("Usb flash"), "floppy_mount.png", True, + { + "usb1_mount":[ _("Mount USB1"), "floppy_mount.png", False, None, "/dev/sda1"], + "usb1_umount":[ _("Umount USB1"), "floppy_umount.png", False, None, "/dev/sda1"], + }, "/dev/sda1" + ) + + def usb(action): + print "ACTION usb, action=%s" % action + if action == "umount": + print "desmontando....." + systray.update_status("usb1", "usb1_mount", True) + systray.update_status("usb1", "usb1_umount", False) + print "................... desmontado" + else: + print "montando........" + systray.update_status("usb1", "usb1_mount", False) + systray.update_status("usb1", "usb1_umount", True) + print ".................... montado" + + systray.update_status("usb1", "usb1_mount", True) + systray.update_status("usb1", "usb1_umount", False) + + systray.register_action("usb1_umount", usb , "umount") + systray.register_action("usb1_mount", usb , "mount") + #systray.register_action("usb1", change ) + + + gtk.main() + + diff --git a/tcosmonitor/TcosXauth.py b/tcosmonitor/TcosXauth.py new file mode 100644 index 0000000..2272cff --- /dev/null +++ b/tcosmonitor/TcosXauth.py @@ -0,0 +1,128 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +import sys +import binascii +from Xlib import xauth + +from tcosmonitor import shared +def print_debug(txt): + if shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + + +import tcosmonitor.TcosCommon +import tcosmonitor.TcosConf +import tcosmonitor.TcosXmlRpc + +class TcosXauth(object): + def __init__(self, main): + self.main=main + self.cookie=None + + self.common=tcosmonitor.TcosCommon.TcosCommon(self) + self.display_host=self.common.get_display(ip_mode=False) + self.display_ip=self.common.get_display(ip_mode=True) + + print_debug("display_host='%s'" %self.display_host) + print_debug("display_ip='%s'" %self.display_ip) + + def init_standalone(self): + print_debug ( "init_standalone() " ) + self.name="TcosXauth" + self.config=tcosmonitor.TcosConf.TcosConf(self, openfile=False) + self.xmlrpc=tcosmonitor.TcosXmlRpc.TcosXmlRpc(self) + + def read_cookie(self): + if self.cookie != None: + # return last cookie (cookie in X session don't change) + return self.cookie + + # use python-xlib for getting IPAddress and data (support IPV6) + for line in self.parseDisplay(): + if line[0] == self.display_host or line[0] == self.display_ip: + self.cookie=line[1] + return self.cookie + + return None + + def parseDisplay(self): + """ + read xauth and get IP addr using xlib python bindings + """ + a=xauth.Xauthority() + entries=a.entries + lines=[] + for entry in entries: + ipv4=str(shared.parseIPAddress(entry[1], return_ipv4=True)) + if ipv4 is None: + ipv4=entry[1] + cookie=self.parseCookie(entry[4]) + print_debug("parseDisplay() ip=%s cookie=%s"%(ipv4, cookie)) + lines.append([ipv4, cookie]) + return lines + + def parseCookie(self, cookiestr): + """ + read bin cookie and return hex string + """ + cookie=[] + for i in cookiestr: + cookie.append(binascii.hexlify(i)) + return "".join(cookie) + + def get_cookie(self): + return self.read_cookie() + + def get_hostname(self): + return self.display_ip + + def test_auth(self, nossl=False): + cookie=self.read_cookie() + print_debug("test_auth() cookie=%s ip=%s"%(cookie, self.display_ip)) + if cookie == None: + print_debug ( "test_auth() Can't read cookie" ) + return + self.xmlrpc.newhost(self.display_ip, nossl) + if not self.xmlrpc.connected: + print_debug ( "test_auth() No connection" ) + return + try: + returned = self.xmlrpc.tc.tcos.xauth(cookie, self.display_ip) + except Exception, err: + print_debug("test_auth() Exception error: %s"%err) + returned = "error" + + if "OK" in returned: + return True + else: return False + + + +if __name__ == "__main__": + shared.debug=True + app=TcosXauth(None) + app.init_standalone() + if app.test_auth(): + print "Xauth OK" + else: + print "Xauth error" diff --git a/tcosmonitor/TcosXmlRpc.py b/tcosmonitor/TcosXmlRpc.py new file mode 100644 index 0000000..ad4dd6c --- /dev/null +++ b/tcosmonitor/TcosXmlRpc.py @@ -0,0 +1,928 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +import xmlrpclib +from time import time, sleep +import sys +import tcosmonitor.shared +from gettext import gettext as _ +import socket + +from tcosmonitor.ping import PingPort +# needed for __escape__ function +import xml.sax.saxutils + +import traceback + + +def print_debug(txt): + if tcosmonitor.shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + + +def howmany(start, txt): + print_debug ("howmany() Time to %s=%f" %(txt, (time() - start)) ) + + + +class TcosXmlRpc: + def __init__(self, main): + print_debug ( "__init__()" ) + self.main=main + self.ip=None + self.version=None + self.logged=False + self.connected=False + self.url=None + self.tc=None + self.lock=False + self.sslconnection=False + self.ports=[] + self.resethosts() + + self.__dic__= { + '\"' : '´´', + '\'' : '´' + } + + if self.main != None: + self.cache_timeout=self.main.config.GetVar("cache_timeout") + self.username=self.main.config.GetVar("xmlrpc_username") + self.password=self.main.config.GetVar("xmlrpc_password") + + if self.username == "" or self.password == "": + # warn empty username and password + if self.main.name == "TcosMonitor": + self.main.common.threads_enter("TcosXmlRpc:__init__ no user or password") + tcosmonitor.shared.error_msg( _("Username or password are empty,\nplease edit in preferences dialog!") ) + self.main.common.threads_leave("TcosXmlRpc:__init__ no user or password") + else: + print_debug ( "running outside tcosmonitor" ) + + def resethosts(self): + self.lasthost=None + self.lastport=None + self.laststandalone_ip=None + self.aliveStatus=None + self.isStandAlone=None + + def wait(self): + """ + wait (max 4 sec) for self.lock == True + """ + print_debug("############## wait() lock=%s #################"%self.lock) + if not self.lock: + return + i=0 + for i in range(40): + print_debug("############## wait() i=%s ##############"%i) + if not self.lock: + return + sleep(0.1) + + def isPortListening(self, ip, port, force=False): + """ + check if ip and port is live and running something (using sockets) + + """ + if not ip: + return False + if not port: + return False + + # this avoid to scan same ip a lot of times, but can give errors FIXME + if not force and self.lasthost == ip and self.lastport == port and self.aliveStatus == "OPEN": + print_debug("isPortListening() not scanning again, using lastip=%s lastport=%s OPEN" %(ip, port)) + return True + elif not force and self.lasthost == ip and self.lastport == port and self.aliveStatus == "CLOSED": + print_debug("isPortListening() not scanning again, using lastip=%s lastport=%s CLOSED" %(ip, port)) + return False + + + self.aliveStatus=PingPort(ip,port).get_status() + self.lastport=port + #print_debug ( "isPortListening() PING PORT DONE status=%s" %(self.aliveStatus) ) + if self.aliveStatus == "OPEN": + print_debug ( "isPortListening(%s:%s) PinPort => OPEN" %(ip, port)) + return True + else: + print_debug ( "isPortListening(%s:%s) PinPort => CLOSED" %(ip, port) ) + return False + + + def newhost(self, ip, nossl=False): + #print_debug ( "newhost(%s)" %(ip) ) + if not ip: + print_debug("\n\n##########################################\n\n") + print_debug("newhost() ip is None") + print_debug("\n\n##########################################\n\n") + if tcosmonitor.shared.debug: + sys.exit(1) + else: + return + self.ip=ip + self.version=None + self.logged=None + cached = None + force=False + + # this avoid to scan same ip a lot of times, but can give errors FIXME + if self.lasthost == ip and self.connected: + #print_debug("newhost() not scanning again, using lastip=%s lastport=%s SSL=%s" %(ip,self.lastport, self.sslconnection)) + return True + + # change ip, force new + if self.lasthost != ip: + self.resethosts() + + self.lasthost=ip + # reset SSL status too + self.sslconnection=False + self.connected=False + self.lastport=tcosmonitor.shared.xmlremote_port + + #print_debug("newhost() enable_sslxmlrpc='%s'" %(self.main.config.GetVar("enable_sslxmlrpc")) ) + + if self.main.config.GetVar("enable_sslxmlrpc") == 1 and nossl == False: + print_debug("newhost() SSL enabled, trying to ping %s port" %(tcosmonitor.shared.xmlremote_sslport)) + force=True + if self.isPortListening(ip, tcosmonitor.shared.xmlremote_sslport): + print_debug("newhost() SSL enabled **********") + self.sslconnection=True + + if not self.sslconnection: + if not self.isPortListening(ip, tcosmonitor.shared.xmlremote_port, force): + print_debug("newhost() SSL disabled, trying to ping %s port" %(tcosmonitor.shared.xmlremote_port)) + self.connected=False + self.sslconnection=False + return False + + if self.main.config.GetVar("enable_sslxmlrpc") == 1 and self.sslconnection: + self.url = 'https://%s:%d/RPC2' % (self.ip, tcosmonitor.shared.xmlremote_sslport) + else: + self.url = 'http://%s:%d/RPC2' % (self.ip, tcosmonitor.shared.xmlremote_port) + try: + # set min socket timeout to 2 secs + socket.setdefaulttimeout(2) + self.tc = xmlrpclib.ServerProxy(self.url, verbose=False) + self.connected=True + # save socket default timeout + socket.setdefaulttimeout(tcosmonitor.shared.socket_default_timeout) + print_debug ( "newhost() tcosxmlrpc running on %s" %(self.url) ) + print_debug( {'conected':self.connected, 'ssl':self.sslconnection, 'ip':self.lasthost, 'port':self.lastport} ) + return True + except Exception, err: + print_debug("newhost() ERROR conection unavalaible !!! error: %s"%err) + self.connected=False + self.CheckSSL(err) + return False + + def CheckSSL(self, err): + txt="%s" %err + if txt.find("SSL2_READ_INTERNAL") != -1 and txt.find("bad mac decode") != -1: + print_debug("SSL BAD MAC DECODE... Deactivating ssl security layer over xmlrpc.") + self.main.config.SetVar("enable_sslxmlrpc", 0) + self.main.config.SaveToFile() + self.main.xmlrpc.resethosts() + return True + + def GetVersion(self): + if not self.connected: + print_debug ("GetVersion() Error, NO CONNECTION!!") + return None + if self.version != None: + return self.version + try: + self.version=self.tc.tcos.version() + return self.version + except Exception, err: + print_debug("GetVersion() Exception error %s"%err) + self.CheckSSL(err) + return None + + + def Exe(self, cmd): + """ + Exe a command in thin client + """ + print_debug ("EXE() INIT, %s" %(cmd) ) + if not self.connected: + print_debug ("Exe() Error, NO CONNECTION!!") + return None + + print_debug ("Exe(): user=\"%s\" pass=\"******\" " \ + %(self.main.config.GetVar("xmlrpc_username") ) ) + + try: + self.tc.tcos.exe(cmd, \ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password")) + except Exception, err: + print_debug("Exe() Exception error %s"%err) + self.CheckSSL(err) + + def Kill(self, app): + """ + kill a running app in thin client + """ + print_debug ("Kill() INIT, %s" %(app) ) + if not self.connected: + print_debug ("Kill() Error, NO CONNECTION!!") + return None + + try: + self.tc.tcos.kill(app, \ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password")) + except Exception, err: + print_debug("Kill() Exception error %s"%err) + self.CheckSSL(err) + + def GetStatus(self, cmd): + """ + get cmd and exec a xmlrpc request + parse value, and return: + 1 if running + 0 if not running + None if access denied + """ + if not self.connected: + print_debug ("GetStatus() Error, NO CONNECTION!!") + return None + + try: + status=self._ParseResult( self.tc.tcos.status(cmd) ) + except Exception, err: + print_debug("GetStatus() Exception PARSER error %s"%err) + self.CheckSSL(err) + return False + + if status == "1": + print_debug ("GetStatus() %s is running" %(cmd) ) + return True + else: + print_debug ("GetStatus() %s is NOT running" %(cmd) ) + return False + + def _ParseResult(self, txt): + print_debug ( "_ParseResult(%s)" %(txt) ) + if txt == None or txt == True or txt == False: + return txt + + if txt.find("error") == 0: + return None + else: + return txt + + def ReadInfo(self, string): + """ + server.tcos.info("cpu_model") + """ + if not self.connected: + print_debug ( "ReadInfo() NO CONNECTION" ) + return None + try: + result=self.tc.tcos.info(string) + except Exception, err: + print_debug ( "ReadInfo(%s): ERROR, can't connect to XMLRPC server!!! error %s" %(string, err) ) + self.CheckSSL(err) + return "" + if result.find('error') == 0: + print_debug ( "ReadInfo(%s): ERROR, result contains error string!!!" %string ) + return "" + else: + return result + + def IsStandalone(self, ip=None): + if not ip: + print_debug("IsStandalone() WARNING using old IP: %s" %self.ip) + else: + self.newhost(ip) + + if not self.connected: + print_debug("IsStandalone() NO CONNECTION") + return False + + # use last data + if self.laststandalone_ip == ip: + return self.isStandAlone + + self.laststandalone_ip=ip + + if self.ReadInfo("get_client") == "standalone": + print_debug("IsStandalone() ip=%s TRUE" %ip) + self.isStandAlone=True + return True + + print_debug("IsStandalone() ip=%s FALSE" %ip) + self.isStandAlone=False + return False + + + def GetStandalone(self, item, ingroup=None): + if item == "get_user": + if not self.connected: + print_debug ( "GetStandalone() NO CONNECTION" ) + return tcosmonitor.shared.NO_LOGIN_MSG + try: + result=self.tc.tcos.standalone("get_user", "") + except Exception, err: + print_debug("GetStandalone(get_user) Exception error: %s"%err) + self.CheckSSL(err) + return tcosmonitor.shared.NO_LOGIN_MSG + + if result.find('error') == 0: + return tcosmonitor.shared.NO_LOGIN_MSG + elif result == "": + return tcosmonitor.shared.NO_LOGIN_MSG + else: + return result + + elif item == "get_process": + try: + return self.tc.tcos.standalone("get_process", "") + except Exception, err: + print_debug("GetStandalone(get_process) Exception error: %s"%err) + self.CheckSSL(err) + return "" + + elif item == "get_server": + nossl=self.main.config.GetVar("enable_sslxmlrpc") + try: + return self.tc.tcos.standalone("get_server", "%s" %nossl) + except Exception, err: + print_debug("GetStandalone(get_server) Exception error %s"%err) + self.CheckSSL(err) + return "" + + elif item == "get_time": + try: + return self.tc.tcos.standalone("get_time", "") + except Exception, err: + print_debug("GetStandalone(get_time) Exception error %s"%err) + self.CheckSSL(err) + return None + + elif item == "get_exclude": + if not self.connected: + print_debug ( "GetStandalone() NO CONNECTION" ) + return False + try: + result=self.tc.tcos.standalone("get_exclude", "%s" %ingroup) + if result.find('error') == 0 or result == "" or result == "noexclude": + return False + else: + return True + except Exception, err: + print_debug("GetStandalone(get_exclude) Exception error %s"%err) + self.CheckSSL(err) + return False + + else: + return "" + + def __escape__(self, txt): + return xml.sax.saxutils.escape(txt, self.__dic__) + + + def IsEnabled(self, item): + if self.main.name in ["TcosVolumeManager", "TcosDevicesNG"]: + user=self.main.xauth.get_cookie() + passwd=self.main.xauth.get_hostname() + if user == None: + print_debug ( "IsEnabled() error loading cookie info" ) + return False + print_debug ( "IsEnabled() cookie=%s hostname=%s" %(user, passwd) ) + else: + user=self.main.config.GetVar("xmlrpc_username") + passwd=self.main.config.GetVar("xmlrpc_password") + + # connect to host + if not self.connected: + print_debug ( "IsEnabled() NO CONNECTION" ) + return False + + try: + result=self.tc.tcos.config("--get", item, user, passwd ) + except Exception, err: + print_debug("IsEnabled(--isenabled) Exception error: %s"%err) + self.CheckSSL(err) + return False + + if result.find('error') == 0: + print_debug ( "IsEnabled(): ERROR, result contains error string!!!\n%s" %(result)) + return False + else: + print_debug ( "IsEnabled(): result='%s'" %(result)) + if result == "-1" or result == "0": + return False + return True + + + def DBus(self, action, data): + username=self.GetStandalone("get_user") + remote_user=self.main.config.GetVar("xmlrpc_username") + remote_passwd=self.main.config.GetVar("xmlrpc_password") + if action == "mess": + data=self.__escape__( data ) + cmd="--auth='%s:%s' --type=%s --text='%s' --username=%s" %(remote_user, remote_passwd, action, data, username ) + print_debug ("DBus() cmd=%s" %(cmd) ) + try: + return self.tc.tcos.dbus(cmd, remote_user, remote_passwd) + except Exception, err: + print_debug("DBus Exception error %s"%err) + self.CheckSSL(err) + return None + + def GetSoundChannels(self): + """ + Exec soundctl.sh with some of these args + --showcontrols ( return all mixer channels ) + --getlevel CHANNEL ( return CHANNEL level xx% xx% left and right ) + --setlevel CHANNEL xx% ( change and return CHANNEL level xx% xx% left and right ) + --getmute CHANNEL ( return off if mute or on if unmute CHANNEL ) + --setmute CHANNEL ( mute CHANNEL and return off if succesfull ) + --setunmute CHANNEL ( unmute CHANNEL and return on if succesfull ) + """ + + if self.main.name == "TcosVolumeManager": + user=self.main.xauth.get_cookie() + passwd=self.main.xauth.get_hostname() + if user == None: + print_debug ( "GetSoundChannels() error loading cookie info" ) + return None + print_debug ( "GetSoundChannels() cookie=%s hostname=%s" %(user, passwd) ) + else: + user=self.main.config.GetVar("xmlrpc_username") + passwd=self.main.config.GetVar("xmlrpc_password") + + + + if not self.connected: + print_debug ( "GetSoundChannels() NO CONNECTION" ) + return None + + try: + result=self.tc.tcos.sound("--showcontrols", "", user, passwd ) + except Exception, err: + print_debug("GetSoundChannels(--showcontrols) Exception error: %s"%err) + self.CheckSSL(err) + return "" + + if result.find('error') == 0: + print_debug ( "GetSoundChannels(): ERROR, result contains error string!!!\n%s" %(result)) + #self.main.write_into_statusbar( "ERROR: %s" %(result) ) + return "" + else: + number=len(result.split('|')) + return result.split('|')[:number-1] + + def GetSoundChannelsContents(self): + """ + Exec soundctl.sh with some of these args + --showcontents ( return all mixer channels ) + """ + + if self.main.name == "TcosVolumeManager": + user=self.main.xauth.get_cookie() + passwd=self.main.xauth.get_hostname() + if user == None: + print_debug ( "GetSoundChannelsContents() error loading cookie info" ) + return [] + print_debug ( "GetSoundChannelsContents() cookie=%s hostname=%s" %(user, passwd) ) + else: + user=self.main.config.GetVar("xmlrpc_username") + passwd=self.main.config.GetVar("xmlrpc_password") + + + + if not self.connected: + print_debug ( "GetSoundChannelsContents() NO CONNECTION" ) + return [] + + try: + result=self.tc.tcos.sound("--showcontents", "", user, passwd ) + except Exception, err: + print_debug("GetSoundChannelsContents(--showcontents) Exception error: %s"%err) + self.CheckSSL(err) + return [] + + if result.find('error') == 0: + print_debug ( "GetSoundChannelsContents(): ERROR, result contains error string!!!\n%s" %(result)) + #self.main.write_into_statusbar( "ERROR: %s" %(result) ) + return [] + else: + channels=[] + tmp=result.split('#') + number=len(tmp) + for i in range(len(tmp)): + c=tmp[i].split(',') + if len(c) != 4: + print_debug("***NOT CHANNEL*** c=%s"%c) + continue + channels.append( {'name':c[0], 'type': c[1], 'level': c[2], 'mute': c[3]} ) + return channels + + + def GetSoundInfo(self, channel, mode="--getlevel"): + """ + mode = "--getlevel" + mode = "--getmute" + mode = "--getserverinfo" + """ + user=self.main.config.GetVar("xmlrpc_username") + passwd=self.main.config.GetVar("xmlrpc_password") + + if self.main.name == "TcosVolumeManager": + user=self.main.xauth.get_cookie() + passwd=self.main.xauth.get_hostname() + if user == None: + print_debug ( "GetSoundInfo() error loading cookie info" ) + return None + print_debug ( "GetSoundInfo() cookie=%s hostname=%s" %(user, passwd) ) + + if not self.connected: + print_debug ( "GetSoundInfo() NO CONNECTION" ) + return None + + try: + result=self.tc.tcos.sound(mode, " \"%s\" " %(channel), user, passwd ) + except Exception, err: + print_debug("GetSoundInfo() Exception error: %s"%err) + self.CheckSSL(err) + return "" + + if result.find('error') == 0: + print_debug ( "GetSoundInfo(): ERROR, result contains error string!!!\n%s" %(result)) + return "" + else: + return result + + def SetSound(self, ip, channel, value, mode="--setlevel"): + if channel == "": + return {} + if not self.connected: + print_debug ( "SetSound() NO CONNECTION" ) + return {} + user=self.main.config.GetVar("xmlrpc_username") + passwd=self.main.config.GetVar("xmlrpc_password") + + if self.main.name == "TcosVolumeManager": + user=self.main.xauth.get_cookie() + passwd=self.main.xauth.get_hostname() + if user == None: + print_debug ( "SetSound() error loading cookie info" ) + return {} + print_debug ( "SetSound() cookie=%s hostname=%s" %(user, passwd) ) + + try: + result=self.tc.tcos.sound(mode, " \"%s\" \"%s\" " %(channel,value), user, passwd) + print_debug("SetSound() result=%s"%result) + except Exception, err: + print_debug("SetSound() Exception error: %s"%err) + self.CheckSSL(err) + return {} + + if result.find('error') == 0: + print_debug ( "SetSound(): ERROR, result contains error string!!!\n%s" %(result)) + #self.main.write_into_statusbar( "ERROR: %s" %(result) ) + return {} + else: + c=result.split(',') + if len(c) != 4: + print_debug("***NOT CHANNEL*** c=%s"%c) + return {} + return {'name':c[0], 'type': c[1], 'level': c[2], 'mute': c[3]} + + def RestartSoundDaemon(self): + """ + Exec soundctl.sh --restartpulse + ( return nothing ) + """ + + if self.main.name == "TcosVolumeManager": + user=self.main.xauth.get_cookie() + passwd=self.main.xauth.get_hostname() + if user == None: + print_debug ( "RestartSoundDaemon() error loading cookie info" ) + return [] + print_debug ( "RestartSoundDaemon() cookie=%s hostname=%s" %(user, passwd) ) + else: + user=self.main.config.GetVar("xmlrpc_username") + passwd=self.main.config.GetVar("xmlrpc_password") + + if not self.connected: + print_debug ( "RestartSoundDaemon() NO CONNECTION" ) + return [] + + try: + result=self.tc.tcos.sound("--restartpulse", "", user, passwd ) + except Exception, err: + print_debug("RestartSoundDaemon (--restartpulse) Exception error: %s"%err) + return [] + + if result.find('error') == 0: + print_debug ( "RestartSoundDaemon(): ERROR, result contains error string!!!\n%s" %(result)) + return + + + def GetDevicesInfo(self, device, mode="--getsize"): + if not self.connected: + print_debug ( "GetDevicesInfo() NO CONNECTION" ) + return None + remote_hostname=self.main.xauth.get_hostname() + xauth_cookie=self.main.xauth.get_cookie() + if mode == "--getxdrivers": + xauth_cookie="foo" + if xauth_cookie == None: + return "GetDevicesInfo error: xauth cookie don't match" + # wait for other petitions + self.wait() + # lock process + self.lock=True + # don't fail if timeout + try: + result=self.tc.tcos.devices(mode, " \"%s\" " %(device), \ + xauth_cookie, \ + remote_hostname ) + self.lock=False + if "error" in result: + print_debug ( "GetDevicesInfo(device=%s, mode=%s): ERROR, result contains error string!!!\n%s" %(device, mode, result)) + return result + except Exception, err: + self.lock=False + print_debug("GetDevicesInfo(device=%s, mode=%s) EXCEPTION getting info err=%s"%(device, mode, err) ) + self.CheckSSL(err) + return "" + + def lockscreen(self, ip=None): + if ip: + self.newhost(ip) + if self.isPortListening(self.ip, self.lastport): + try: + self.tc.tcos.lockscreen( \ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password")) + return True + except Exception, err: + print_debug ("lockscreen() Exception, error: %s" %err) + self.CheckSSL(err) + return False + + def unlockscreen(self, ip=None): + if ip: + self.newhost(ip) + if self.isPortListening(self.ip, self.lastport): + try: + self.tc.tcos.unlockscreen(\ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password")) + return True + except Exception, err: + print_debug ("unlockscreen() Exception, error: %s" %err) + self.CheckSSL(err) + return False + + def lockcontroller(self, action, ip=None): + if ip: + self.newhost(ip) + if self.isPortListening(self.ip, self.lastport): + try: + self.tc.tcos.lockcontroller("%s" %action, \ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password")) + return True + except Exception, err: + print_debug ("lockcontroller() Exception, error: %s" %err) + self.CheckSSL(err) + return False + + def unlockcontroller(self, action, ip=None): + if ip: + self.newhost(ip) + if self.isPortListening(self.ip, self.lastport): + try: + self.tc.tcos.unlockcontroller("%s" %action, \ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password")) + return True + except Exception, err: + print_debug ("unlockcontroller() Exception, error: %s" %err) + self.CheckSSL(err) + return False + + def status_lockscreen(self, ip=None): + if ip: + self.newhost(ip) + if self.isPortListening(self.ip, self.lastport): + #self.login () + result=self._ParseResult(self.GetStatus("lockscreen")) + print_debug ( "lockscreen() %s" %(result) ) + return result + return False + + def tnc(self, action, username, ports=None, ip=None): + print_debug("tnc() action=%s username=%s ports=%s ip=%s only-ports=%s"%(action, username, ports, ip, tcosmonitor.shared.tnc_only_ports)) + if ip: + self.newhost(ip) + try: + if action == "status": + return self.tc.tcos.tnc("%s" %action, "", "", "%s" %username, \ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password") ) + elif action == "enable-internet": + return self.tc.tcos.tnc("%s" %action, "--only-ports=%s" %tcosmonitor.shared.tnc_only_ports, "", "%s" %username, \ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password")) + elif action == "disable-internet": + return self.tc.tcos.tnc("%s" %action, "--only-ports=%s" %tcosmonitor.shared.tnc_only_ports, "%s" %ports, "%s" %username, \ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password")) + except Exception, err: + print_debug ("tnc() Exception, error: %s" %err) + self.CheckSSL(err) + return False + + def screenshot(self, size="65"): + print_debug ( "screenshot() size=%s" %(size) ) + try: + result=self._ParseResult( self.tc.tcos.screenshot(\ + "%s" %(size),\ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password")) ) + + print_debug ( "screenshot(size=%s percent) %s done" %(size, result) ) + return True + except Exception, err: + print_debug ("screenshot() Exception, error: %s" %err) + self.CheckSSL(err) + return False + + def getscreenshot(self, size="65"): + try: + result=self.tc.tcos.getscreenshot(\ + "%s" %(size),\ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password")) + + print_debug ( "getscreenshot(size=%s percent) done result=%s" %(size, result[0]) ) + return result + except Exception, err: + print_debug ("getscreenshot() Exception, error: %s" %err) + self.CheckSSL(err) + return [False, err] + + def vnc(self, action, ip, args=""): + self.newhost(ip) + print_debug("vnc(action='%s' ip='%s' args='%s')"%(action, ip, args) ) + try: + if action == "genpass": + passwd=args + return self.tc.tcos.vnc("genpass", "%s /tmp/.tcosvnc" %passwd, \ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password") ) + elif action == "startserver": + return self.tc.tcos.vnc("startserver", "/tmp/.tcosvnc", \ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password") ) + elif action == "startscale": + size=int(self.main.config.GetVar("miniscrot_size")) + scale="%sx%s"%(size/100., size/100.) + return self.tc.tcos.vnc("startscale", "/tmp/.tcosvnc %s"%scale, \ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password") ) + elif action == "stopserver": + return self.tc.tcos.vnc("stopserver", "", \ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password") ) + elif action == "startclient": + server_ip=args + return self.tc.tcos.vnc("startclient", "%s /tmp/.tcosvnc" %server_ip, \ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password") ) + elif action == "stopclient": + return self.tc.tcos.vnc("stopclient", "", \ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password") ) + except Exception, err: + print_debug ("vnc() Exception, error: %s" %err) + traceback.print_exc(file=sys.stderr) + self.CheckSSL(err) + return False + + def rtp(self, action, ip, broadcast=None): + self.newhost(ip) + try: + if action == "startrtp-recv": + return self.tc.tcos.rtp("startrtp-recv", broadcast, \ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password") ) + elif action == "stoprtp-recv": + return self.tc.tcos.rtp("stoprtp-recv", "", \ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password") ) + elif action == "startrtp-send": + return self.tc.tcos.rtp("startrtp-send", broadcast, \ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password") ) + elif action == "stoprtp-send": + return self.tc.tcos.rtp("stoprtp-send", "", \ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password") ) + elif action == "startrtp-chat": + return self.tc.tcos.rtp("startrtp-chat", broadcast, \ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password") ) + elif action == "stoprtp-chat": + return self.tc.tcos.rtp("stoprtp-chat", "", \ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password") ) + except Exception, err: + print_debug ("rtp() Exception, error: %s" %err) + self.CheckSSL(err) + return False + + def vlc(self, ip, volume, lock): + self.newhost(ip) + try: + return self.tc.tcos.vlc("%s" %volume, "%s" %lock, \ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password") ) + except Exception, err: + print_debug ("vlc() Exception, error: %s" %err) + self.CheckSSL(err) + return False + + def dpms(self, action, ip=None): + print_debug("dpms() action=%s ip=%s"%(action, ip)) + if ip: + self.newhost(ip) + if not self.connected: + return False + if action == "on" or action == "off" or action == "status": + try: + return self.tc.tcos.dpms("%s" %action, \ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password") ) + except Exception, err: + print_debug ("dpms() Exception, error: %s" %err) + self.CheckSSL(err) + return False + +if __name__ == '__main__': + tcosmonitor.shared.debug = True + app=TcosXmlRpc (None) + + + if app.isPortListening("192.168.0.3", "80"): + print "80 is listening" + else: + print "80 is NOT listening" + + if app.isPortListening("192.168.0.3", "8998"): + print "8998 is listening" + else: + print "8998 is NOT listening" + + #if app.isPortListening("192.168.0.10", "8998"): + # print "8998 is listening" + #else: + # print "8998 is NOT listening" + #start=time() + #print_debug ("TCOS_VERSION: %s" %(app.GetVersion()) ) + #howmany(start, "get version info") + + start=time() + app.newhost("192.168.0.3") + print_debug ("TCOS_«tilda»_STATUS: %s" %(app.GetStatus("tilda")) ) + howmany(start, "get status of tilda") + + #app.Exe("xterm") + #app.status_lockscreen() + #app.lockscreen() + #sleep(2) + #app.status_lockscreen() + #app.unlockscreen() + #app.Exe("glxgears -printfps > glxgears.log") + + #start=time() + #app.logout() + #howmany(start, "logout") diff --git a/tcosmonitor/WakeOnLan.py b/tcosmonitor/WakeOnLan.py new file mode 100644 index 0000000..48b8066 --- /dev/null +++ b/tcosmonitor/WakeOnLan.py @@ -0,0 +1,68 @@ +# -*- coding: UTF-8 -*- +########################################################################## +# Wake-On-LAN +# +# Copyright (C) 2002 by Micro Systems Marc Balmer +# Written by Marc Balmer, marc@msys.ch, http://www.msys.ch/ +# This code is free software under the GPL +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 1. +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +import struct, socket +import tcosmonitor.shared +import sys + + +def print_debug(txt): + if tcosmonitor.shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + +def WakeOnLan(ethernet_address): + errortxt=None + # Construct a six-byte hardware address + if not ethernet_address: + print_debug("Not valid ethernet address: \"%s\""%ethernet_address) + return False + + try: + addr_byte = ethernet_address.split(':') + hw_addr = struct.pack('BBBBBB', int(addr_byte[0], 16), + int(addr_byte[1], 16), + int(addr_byte[2], 16), + int(addr_byte[3], 16), + int(addr_byte[4], 16), + int(addr_byte[5], 16)) + + # Build the Wake-On-LAN "Magic Packet"... + + msg = '\xff' * 6 + hw_addr * 16 + + # ...and send it to the broadcast address using UDP + + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) + s.sendto(msg, ('<broadcast>', 9)) + s.close() + print_debug("WakeOnLan() send to %s done"%ethernet_address) + return True + except Exception, err: + print_debug("Exception error %s"%err) + return False + + + +# Example use +#WakeOnLan('0:3:93:81:68:b2') diff --git a/tcosmonitor/__init__.py b/tcosmonitor/__init__.py new file mode 100644 index 0000000..c6438b3 --- /dev/null +++ b/tcosmonitor/__init__.py @@ -0,0 +1,54 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +import glob as __glob__ +import os as __os__ +import sys as __sys__ + +def __load__(): + """ + read contents of tcosmonitor dir and put in __all__ list + """ + _ext_dir=__os__.path.dirname( __file__ ) + _ext=[] + for file_ in __glob__.glob(_ext_dir+"/*.py"): + if file_ == "__init__.py": + continue + _ext_name = __os__.path.basename(file_).split('.py')[0] + if _ext_name == "__init__": + continue + _ext.append( _ext_name ) + try: + if __sys__.version_info[0:3] < (2, 5, 0): + __import__('tcosmonitor.' + _ext_name, globals(), locals(), ['extensions'] ) + else: + __import__('tcosmonitor.' + _ext_name, fromlist = ['extensions'] ) + except Exception, err: + print ("Exception importing tcosmonitor='%s', err='%s'"%(_ext_name, err)) + return _ext + + +if not "DISPLAY" in __os__.environ or __os__.environ['DISPLAY'] == '': + print >> __sys__.stderr, ("WARNING: [tcosmonitor.__init__] No display defined, no importing extensions") +else: + if "TCOSMONITOR_NO_EXTENSIONS" in __os__.environ: + print >> __sys__.stderr, ("TCOSMONITOR_NO_EXTENSIONS in environment, no load extensions") + else: + __all__=__load__() diff --git a/tcosmonitor/counter.py b/tcosmonitor/counter.py new file mode 100644 index 0000000..ca5b7ad --- /dev/null +++ b/tcosmonitor/counter.py @@ -0,0 +1,51 @@ +# -*- coding: UTF-8 -*- +# -*- Mode: Python; tab-width: 4 -*- +# +# Source taken from python-M2Crypto demos +# +# It is tempting to add an __int__ method to this class, but it's not +# a good idea. This class tries to gracefully handle integer +# overflow, and to hide this detail from both the programmer and the +# user. Note that the __str__ method can be relied on for printing out +# the value of a counter: +# +# >>> print 'Total Client: %s' % self.total_clients +# +# If you need to do arithmetic with the value, then use the 'as_long' +# method, the use of long arithmetic is a reminder that the counter +# will overflow. + +class counter: + "general-purpose counter" + + def __init__ (self, initial_value=0): + self.value = initial_value + + def increment (self, delta=1): + result = self.value + try: + self.value = self.value + delta + except OverflowError: + self.value = long(self.value) + delta + return result + + def decrement (self, delta=1): + result = self.value + try: + self.value = self.value - delta + except OverflowError: + self.value = long(self.value) - delta + return result + + def as_long (self): + return long(self.value) + + def __nonzero__ (self): + return self.value != 0 + + def __repr__ (self): + return '<counter value=%s at %x>' % (self.value, id(self)) + + def __str__ (self): + return str(long(self.value)) + #return str(long(self.value))[:-1] diff --git a/tcosmonitor/extensions/Makefile b/tcosmonitor/extensions/Makefile new file mode 100644 index 0000000..e3820c9 --- /dev/null +++ b/tcosmonitor/extensions/Makefile @@ -0,0 +1,15 @@ +all: + #none + +include ../../common.mk + + +clean: + rm -f *~ *.pyc + +install: + install -d $(DESTDIR)/$(PREFIX)/share/$(PACKAGE)/extensions + @for ext in $(shell ls *.py |grep -v template); do \ + echo "install -m 644 $$ext $(DESTDIR)/$(PREFIX)/share/$(PACKAGE)/extensions" ; \ + install -m 644 $$ext $(DESTDIR)/$(PREFIX)/share/$(PACKAGE)/extensions ; \ + done diff --git a/tcosmonitor/extensions/__init__.py b/tcosmonitor/extensions/__init__.py new file mode 100644 index 0000000..6285c3e --- /dev/null +++ b/tcosmonitor/extensions/__init__.py @@ -0,0 +1,47 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +import glob as __glob__ +import os as __os__ +import sys as __sys__ + +def __load__(): + """ + read contents of extensions dir and put in __all__ list + """ + _ext_dir=__os__.path.dirname( __file__ ) + _ext=[] + for file_ in __glob__.glob(_ext_dir+"/*.py"): + if file_ == "__init__.py": + continue + _ext_name = __os__.path.basename(file_).split('.py')[0] + if _ext_name == "__init__": + continue + _ext.append( _ext_name ) + try: + if __sys__.version_info[0:3] < (2, 5, 0): + __import__('tcosmonitor.extensions.' + _ext_name, globals(), locals(), ['extensions'] ) + else: + __import__('tcosmonitor.extensions.' + _ext_name, fromlist = ['extensions'] ) + except Exception, err: + print ("Exception importing extension='%s', err='%s'"%(_ext_name, err)) + return _ext + +__all__=__load__() diff --git a/tcosmonitor/extensions/appsmsg.py b/tcosmonitor/extensions/appsmsg.py new file mode 100644 index 0000000..88e34bd --- /dev/null +++ b/tcosmonitor/extensions/appsmsg.py @@ -0,0 +1,373 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +""" template extension """ + +from gettext import gettext as _ + +from tcosmonitor import shared +from tcosmonitor.TcosExtensions import TcosExtension + +import gtk +from time import time +import os +import sys +import glob + +def print_debug(txt): + if shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + +def crono(start, txt): + print_debug ("crono(), %s get %f seconds" %(txt, (time() - start)) ) + return + +class AppsAndMsgs(TcosExtension): + def register(self): + self.init_ask() + self.main.classview.class_external_exe=self.exe_app_external + self.main.actions.button_action_exe=self.exe_app_all + self.main.actions.button_action_text=self.send_msg_all + + self.main.menus.register_simple( _("Exec app on user display") , "menu_exec.png", 1, self.exe_app, "exe") + self.main.menus.register_simple( _("Send a text message to user") , "menu_msg.png", 1, self.send_msg, "text") + + self.main.menus.register_all( _("Exec same app in all connected users") , "menu_exec.png", 1, self.exe_app_all, "exe") + self.main.menus.register_all( _("Send a text message to all connected users") , "menu_msg.png", 1, self.send_msg_all, "text") + +############################################################################## + def askfor(self, mode="mess", msg="", users=None, users_txt=None): + if users == None or users_txt == None: + users=[] + self.ask_usernames=[] + if len(users) == 0 or users[0] == shared.NO_LOGIN_MSG: + shared.error_msg( _("Clients not connected") ) + return + else: + self.ask_usernames=users + + #users_txt="" + #counter=1 + #for user in self.ask_usernames: + # users_txt+="%s, " %(user) + # print_debug("askfor() counter=%s" %(counter) ) + # if counter % 4 == 0: + # users_txt+="\n" + # counter=int(counter+1) + + #if users_txt[-2:] == "\n": users_txt=users_txt[:-2] + #if users_txt[-2:] == ", ": users_txt=users_txt[:-2] + + if mode == "exec": + # enable drag & drop + self.main.ask_fixed.show() + self.main.ask_dragdrop.show() + self.main.image_entry.show() + self.main.image_entry.set_from_stock(gtk.STOCK_DIALOG_QUESTION, 4) + self.main.ask_label.set_markup( _("<b>Exec app in user(s) screen(s)\nor open web address to:</b>\n%s" ) %( users_txt ) ) + elif mode == "mess": + self.main.ask_label.set_markup( _("<b>Send a message to:</b>\n%s" ) %( users_txt ) ) + elif mode == "any": + self.main.ask_label.set_markup( msg ) + self.ask_mode=mode + self.main.ask.show() + return True + + + def on_ask_exec_click(self, widget): + app=self.main.ask_entry.get_text() + if app != "": + self.exe_app_in_client_display(app) + return + + + def on_ask_cancel_click(self, widget): + self.main.ask.hide() + self.main.ask_entry.set_text("") + # disable drag & drop + self.main.ask_fixed.hide() + self.main.image_entry.hide() + self.main.ask_dragdrop.hide() + return +############################################################################## + + def exe_app_external(self, filename=None, txt=None): + if self.main.classview.ismultiple() or txt != None: + if not self.get_all_clients(): + return + elif not self.get_client(): + return + + if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: + shared.error_msg ( _("Can't exec application, user is not logged") ) + return + #print_debug("user=%s data=%s" %(self.connected_users, data) + app="" + self.ask_usernames=self.connected_users + self.ask_mode="exec" + + if txt != None: + app="x-www-browser %s" %txt + self.exe_app_in_client_display(app) + return + + print_debug("open_file() reading data from \"%s\"..." \ + %(filename) ) + try: + fd=file(filename, 'r') + data=fd.readlines() + fd.close() + except Exception, err: + shared.error_msg( _("%s is not a valid application") %(os.path.basename(filename)) ) + return + + for line in data: + if line != '\n': + if line.startswith("Exec="): + line=line.replace('\n', '') + action, app=line.split("=",1) + app=app.replace("%U","").replace("%u","").replace("%F","").replace("%f","").replace("%c","").replace("%i","").replace("%m","") + + if len(app) <1: + shared.error_msg( _("%s is not a valid application") %(os.path.basename(filename)) ) + + if app != "": + self.exe_app_in_client_display(app) + return + + + def exe_app(self, w, ip): + if not self.get_client(): + return + if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: + shared.error_msg ( _("Can't exec application, user is not logged") ) + return + self.askfor(mode="exec", users=self.connected_users, users_txt=self.connected_users_txt) + + + def send_msg(self, w, ip): + if not self.get_client(): + return + if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: + shared.error_msg ( _("Can't send message, user is not logged") ) + return + self.askfor(mode="mess", users=self.connected_users, users_txt=self.connected_users_txt) + + def exe_app_all(self, *args): + if not self.get_all_clients(): + return + self.askfor(mode="exec", users=self.connected_users, users_txt=self.connected_users_txt) + + def send_msg_all(self, *args): + if not self.get_all_clients(): + return + self.askfor(mode="mess", users=self.connected_users, users_txt=self.connected_users_txt) + + +####################### INIT ############################################ + def init_ask(self): + self.main.ask_ip=None + + self.ui = gtk.Builder() + self.ui.set_translation_domain(shared.PACKAGE) + self.ui.add_from_file(shared.GLADE_DIR + 'tcosmonitor-askwindow.ui') + + self.main.ask = self.ui.get_object('askwindow') + self.main.ask.connect('delete-event', self.askwindow_close ) + self.main.ask.set_icon_from_file(shared.IMG_DIR +'tcos-icon-32x32.png') + + + self.main.ask_label = self.ui.get_object('txt_asklabel') + ## arrastrar y soltar + self.main.ask_fixed = self.ui.get_object('ask_fixed') + self.main.ask_dragdrop = self.ui.get_object('label99') + self.main.image_entry = self.ui.get_object('image_askentry') + self.main.image_entry.drag_dest_set( gtk.DEST_DEFAULT_ALL, [( 'text/uri-list', 0, 2 ), ], gtk.gdk.ACTION_DEFAULT | gtk.gdk.ACTION_COPY) + self.main.image_entry.connect( 'drag_data_received', self.on_drag_data_received) + self.main.ask_fixed.hide() + self.main.image_entry.hide() + self.main.ask_dragdrop.hide() + ## fin arrastrar y soltar + self.liststore = gtk.ListStore(str) + for s in shared.appslist: + self.liststore.append([s]) + + self.main.ask_entry = self.ui.get_object('txt_askentry') + self.main.ask_completion = gtk.EntryCompletion() + self.main.ask_completion.set_model(self.liststore) + self.main.ask_entry.set_completion(self.main.ask_completion) + self.main.ask_completion.set_text_column(0) + + self.main.ask_completion.connect('match-selected', self.match_cb) + self.main.ask_entry.connect('activate', self.activate_cb) + + self.main.ask_cancel = self.ui.get_object('ask_cancelbutton') + self.main.ask_exec = self.ui.get_object('ask_exebutton') + + # buttons signals + self.main.ask_exec.connect('clicked', self.on_ask_exec_click) + self.main.ask_cancel.connect('clicked', self.on_ask_cancel_click) + + + def askwindow_close(self, widget, event): + print_debug ( "askwindow_close() closing ask window" ) + self.main.ask.hide() + return True + + def on_drag_data_received( self, widget, context, x, y, selection, targetType, dtime): + files = selection.data.split('\n', 1) + start1=time() + print_debug("on_drag_data_received() files=%s dtime=%s"%(files, dtime)) + for f in files: + if f: + desktop = f.strip().replace('%20', ' ') + break + + if desktop.startswith('file:///') and desktop.lower().endswith('.desktop') and os.path.isfile(desktop[7:]): + print_debug("open_file() reading data from \"%s\"..." \ + %(desktop[7:]) ) + fd=file(desktop[7:], 'r') + data=fd.readlines() + fd.close() + + # try to load gnome theme with gconf + mytheme=[] + theme=self.main.common.get_icon_theme() + print_debug("on_drag_data_received() gconf theme=%s"%theme) + + str_image="" + files=[] + + if theme and os.path.isdir("/usr/share/icons/%s"%theme): + files+=glob.glob("/usr/share/icons/%s/48x48/*.png"%(theme)) + + files+=glob.glob("/usr/share/icons/hicolor/48x48/*/*.png") + \ + glob.glob("/usr/share/icons/gnome/48x48/*/*.png") + \ + glob.glob("/usr/share/pixmaps/*png") +\ + glob.glob("/usr/share/pixmaps/*xpm") + + for line in data: + if line != '\n': + if line.startswith("Exec="): + line=line.replace('\n', '') + action, str_exec=line.split("=",1) + str_exec=str_exec.replace("%U","").replace("%u","").replace("%F","").replace("%f","").replace("%c","").replace("%i","").replace("%m","") + elif line.startswith("Icon="): + line=line.replace('\n', '') + action, image_name=line.split("=",1) + if not os.path.isfile(image_name): + start2=time() + for f in files: + if image_name in f or image_name.replace('_', '-') in f: + str_image=f + crono(start2, "on_drag_data_received() ICON FOUND AT %s"%f ) + break + else: + str_image=image_name + + if len(str_exec) <1: + shared.error_msg( _("%s is not application") %(os.path.basename(desktop[7:])) ) + else: + if len(str_image) <1: + print_debug("on_drag_data_received() image '%s' not found"%image_name) + self.main.image_entry.set_from_stock(gtk.STOCK_DIALOG_QUESTION, 4) + else: + self.main.image_entry.set_from_file(str_image) + self.main.ask_entry.set_text(str_exec) + else: + shared.error_msg( _("%s is not application") %(os.path.basename(desktop[7:])) ) + crono(start1, "on_drag_data_received() end" ) + return True + + def match_cb(self, completion, model, iter): + print_debug ( "match_cb() " ) + print_debug( "%s was selected" %(model[iter][0]) ) + self.exe_app_in_client_display(model[iter][0]) + return + + + def activate_cb(self, entry): + text = self.main.ask_entry.get_text() + print_debug ( "activate_cb() text=%s" %(text) ) + + # append to liststore + if text: + if text not in [row[0] for row in self.liststore]: + self.liststore.append([text]) + #self.main.ask_entry.set_text('') + + # exe app + self.exe_app_in_client_display(text) + return + + def exe_app_in_client_display(self, arg): + usernames=self.ask_usernames + newusernames=[] + print_debug("exe_app_in_client_display() usernames=%s" %usernames) + + if arg.startswith('rm ') or arg.find(" rm ") != -1 \ + or arg.startswith('mv ') or arg.find(" mv ") != -1 \ + or arg.startswith('cp ') or arg.find(" cp ") != -1: + arg="" + + #if self.ask_mode == "mess": + # arg=arg.replace("'", "´") + if self.ask_mode == "exec": + if arg.startswith('http://') or arg.startswith('https://') or arg.startswith('ftp://'): + arg="xdg-open %s" %arg + + for user in usernames: + if user.find(":") != -1: + # we have a standalone user... + usern, ip = user.split(":") + print_debug("exe_app_in_client_display() STANDALONE username=%s ip=%s" %(usern, ip)) + self.main.xmlrpc.newhost(ip) + self.main.xmlrpc.DBus(self.ask_mode, arg) + else: + newusernames.append(user) + + # we have a thin client user + if self.ask_mode == "exec": + result = self.main.dbus_action.do_exec( newusernames , arg ) + if not result: + shared.error_msg ( _("Error while exec remote app:\nReason: %s") %( self.main.dbus_action.get_error_msg() ) ) + else: + self.main.ask.hide() + self.main.ask_entry.set_text("") + elif self.ask_mode == "mess": + result = self.main.dbus_action.do_message( newusernames , arg) + if not result: + shared.error_msg ( _("Error while send message:\nReason: %s") %( self.main.dbus_action.get_error_msg() ) ) + self.main.ask_dragdrop.hide() + self.main.ask_fixed.hide() + self.main.image_entry.hide() + self.main.ask.hide() + self.main.ask_entry.set_text("") + dbus_action=None + self.ask_mode=None + return + +__extclass__=AppsAndMsgs + + + + + + diff --git a/tcosmonitor/extensions/audiortp.py b/tcosmonitor/extensions/audiortp.py new file mode 100644 index 0000000..3914ae3 --- /dev/null +++ b/tcosmonitor/extensions/audiortp.py @@ -0,0 +1,542 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +""" template extension """ + +from gettext import gettext as _ +import gtk +import sys + +from tcosmonitor import shared +from tcosmonitor.TcosExtensions import TcosExtension +COL_N, COL_ACTIVE,COL_B,COL_BOOL= range(4) + +def print_debug(txt): + if shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + + +class AudioRTP(TcosExtension): + def register(self): + self.rtp_count={} + self.rtp_control_count={} + self.control_list=False + self.init_chat() + self.main.actions.button_action_audio=self.rtp_all + self.main.actions.button_action_chat=self.rtp_chat + self.main.actions.button_action_list=self.control_chat + + self.main.menus.register_all( _("Send audio conference") , "menu_rtp.png", 2, self.rtp_all, "conference") + self.main.menus.register_all( _("Audio chat conference") , "menu_chat.png", 2, self.rtp_chat, "conference") + self.main.menus.register_all( _("Audio chat list") , "menu_list.png", 2, self.control_chat, "conference") + self.main.menus.register_simple( _("Send audio conference (from this host)") , "menu_rtp.png", 2, self.rtp_simple, "conference") + + + def init_chat(self): + print_debug ("init chat control") + self.selected_emission=None + + self.model=gtk.ListStore(str, gtk.gdk.Pixbuf, str, 'gboolean') + + self.ui = gtk.Builder() + self.ui.set_translation_domain(shared.PACKAGE) + + self.ui.add_from_file(shared.GLADE_DIR + 'tcosmonitor-chatwindow.ui') + + self.main.chatwindow=self.ui.get_object('chatwindow') + self.main.chatwindow.connect('delete-event', self.chat_exit ) + + self.main.chatlist = self.ui.get_object('chatlist') + self.main.chatlist.set_model (self.model) + + cell1 = gtk.CellRendererText () + column1 = gtk.TreeViewColumn (_("Emission"), cell1, text = COL_N) + column1.set_resizable (True) + column1.set_sort_column_id(COL_N) + self.main.chatlist.append_column (column1) + + cell2 = gtk.CellRendererPixbuf() + column2 = gtk.TreeViewColumn (_("State"), cell2, pixbuf = COL_ACTIVE) + self.main.chatlist.append_column (column2) + + cell3 = gtk.CellRendererText () + column3 = gtk.TreeViewColumn (_("Channel"), cell3, text = COL_B) + column3.set_resizable (True) + column3.set_sort_column_id(COL_B) + self.main.chatlist.append_column (column3) + + self.table_file = self.main.chatlist.get_selection() + self.table_file.connect("changed", self.on_chat_list_change) + + self.main.chat_button_disconnect=self.ui.get_object('button_chat_disconnect') + self.main.chat_button_disconnect.connect('clicked', self.chat_disconnect) + + self.main.chat_button_connect=self.ui.get_object('button_chat_connect') + self.main.chat_button_connect.connect('clicked', self.chat_connect) + + self.main.chat_button_exit=self.ui.get_object('button_exit') + self.main.chat_button_exit.connect('clicked', self.chat_exit) + + self.main.chat_button_disconnect.set_sensitive(False) + self.main.chat_button_connect.set_sensitive(False) + + self.main.chatwindow.hide() + + def control_chat(self, *args): + #if len(self.rtp_count) < 1: + # shared.info_msg( _("No active chats to manage") ) + # return + + self.populate_data(self.rtp_count) + self.main.chatwindow.show() + self.control_list=True + + def populate_data(self, data): + self.image_noactive = gtk.gdk.pixbuf_new_from_file(shared.IMG_DIR + 'no.png') + self.image_active = gtk.gdk.pixbuf_new_from_file(shared.IMG_DIR + 'ok.png') + + for item in data: + if data[item] not in self.rtp_control_count.keys(): + continue + self.new_line=True + model=self.main.chatlist.get_model() + model.foreach(self.line_exists, data[item]) + + if self.new_line: + self.iter = self.model.append (None) + name="Chat %s" %item + self.model.set_value (self.iter, COL_N, name ) + self.model.set_value (self.iter, COL_B, data[item] ) + if len(self.rtp_control_count[data[item]]) < 1: + self.model.set_value (self.iter, COL_ACTIVE, self.image_noactive ) + self.model.set_value (self.iter, COL_BOOL, False ) + + else: + self.model.set_value (self.iter, COL_ACTIVE, self.image_active ) + self.model.set_value (self.iter, COL_BOOL, True ) + + def control_buttons(self, active): + if active: + self.main.chat_button_disconnect.set_sensitive(True) + self.main.chat_button_connect.set_sensitive(False) + else: + self.main.chat_button_disconnect.set_sensitive(False) + self.main.chat_button_connect.set_sensitive(True) + + def on_chat_list_change (self, data): + (model, iter) = self.main.chatlist.get_selection().get_selected() + if not iter: + self.control_buttons(False) + return + self.selected_num=model.get_value(iter,0) + self.selected_channel=model.get_value(iter, 2) + self.connected_rtp=model.get_value(iter, 3) + print_debug("selected_num=%s selected_channel=%s connected=%s" %(self.selected_num, self.selected_channel, self.connected_rtp)) + if self.connected_rtp: + self.control_buttons(True) + else: + self.control_buttons(False) + + def chat_disconnect(self, *args): + (model, iter) = self.main.chatlist.get_selection().get_selected() + if not iter: + self.control_buttons(False) + return + self.selected_channel=model.get_value(iter, 2) + self.main.common.exe_cmd("pactl unload-module %s" %self.rtp_control_count[self.selected_channel][0]) + self.main.common.exe_cmd("pactl unload-module %s" %self.rtp_control_count[self.selected_channel][1]) + self.rtp_control_count[self.selected_channel]=[] + print_debug("chat_connects %s" %self.rtp_control_count) + model.foreach(self.line_changer, [self.selected_channel, self.image_noactive, False]) + self.main.chat_button_disconnect.set_sensitive(False) + self.main.chat_button_connect.set_sensitive(True) + return True + + def chat_connect(self, *args): + (model, iter) = self.main.chatlist.get_selection().get_selected() + if not iter: + self.control_buttons(False) + return + self.selected_channel=model.get_value(iter, 2) + output_send = self.main.common.exe_cmd("pactl load-module module-rtp-send format=s16be channels=2 rate=44100 source=@DEFAULT_SOURCE@ loop=0 destination=%s" %self.selected_channel) + output_recv = self.main.common.exe_cmd("pactl load-module module-rtp-recv sap_address=%s" %self.selected_channel) + if output_send != "" or output_recv != "": + self.rtp_control_count[self.selected_channel]=[output_send, output_recv] + print_debug("chat_connects %s" %self.rtp_control_count) + model.foreach(self.line_changer, [self.selected_channel, self.image_active, True]) + self.main.chat_button_disconnect.set_sensitive(True) + self.main.chat_button_connect.set_sensitive(False) + return True + + def chat_exit(self, *args): + self.main.chatwindow.hide() + self.model.clear() + self.control_list=False + return True + + def line_exists(self, model, path, iter, args): + ip = args + # change mac if ip is the same. + if model.get_value(iter, 2) == ip: + self.new_line=False + + def line_changer(self, model, path, iter, args): + ip, image, active = args + # change mac if ip is the same. + if model.get_value(iter, 2) == ip: + model.set_value(iter, 1, image) + model.set_value(iter, 3, active) + + def line_delete(self, model, path, iter, args): + ip = args + if model.get_value(iter, 2) == ip: + self.delete_iter=iter + + def chat_delete(self, data): + print_debug("chat_delete() data=%s" %data) + model=self.main.chatlist.get_model() + self.delete_iter=None + model.foreach(self.line_delete, data) + # delete iter if found + if self.delete_iter is not None: + model.remove(self.delete_iter) + + def rtp_all(self, *args): + if not self.get_all_clients(): + return + # conference mode + if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: + shared.error_msg( _("No users logged.") ) + return + + cmd=("LC_ALL=C LC_MESSAGES=C pactl --version 2>/dev/null | awk '{print $2}' | awk -F\".\" '{if ((int($2) >= 9) && (int($3) >= 10)) printf 1}'") + output=self.main.common.exe_cmd(cmd) + if output != "1": + shared.error_msg( _("Your pulseaudio server is too old.\nIs required pulseaudio version >= 0.9.10") ) + return + + msg=_( _("Do you want to start audio conference to the following users: %s?" )%(self.connected_users_txt) ) + + if not shared.ask_msg ( msg ): + return + + remote_msg=_("You have entered in audio conference") + eth=self.main.config.GetVar("network_interface") + max_uip=255 + uip=0 + while uip <= max_uip: + uip_cmd="225.0.0.%s" %(uip) + cmd=("LC_ALL=C LC_MESSAGES=C netstat -putan 2>/dev/null | grep -c %s" %(uip_cmd) ) + print_debug("Check broadcast ip %s." %(uip_cmd) ) + output=self.main.common.exe_cmd(cmd) + uip+=1 + if output == "0" and uip_cmd not in self.rtp_count.values(): + print_debug("Broadcast ip found: %s" %(uip_cmd)) + ip_broadcast="%s" %uip_cmd + break + elif uip == max_uip: + print_debug("Not found an available broadcast ip") + return + result = self.main.localdata.Route("route-add", ip_broadcast, "255.255.255.255", eth) + if result == "error": + print_debug("Add multicast-ip route failed") + return + self.main.common.exe_cmd("/usr/lib/tcos/pactl-controller.sh start-server") + output = self.main.common.exe_cmd("pactl load-module module-rtp-send format=s16be channels=2 rate=44100 source=@DEFAULT_SOURCE@ loop=0 destination=%s" %ip_broadcast) + + self.main.write_into_statusbar( _("Waiting for start audio conference...") ) + + total=0 + for client in self.newallclients: + self.main.xmlrpc.rtp("startrtp-recv", client, ip_broadcast ) + total+=1 + + if total < 1: + self.main.write_into_statusbar( _("No users logged.") ) + # kill x11vnc + self.main.common.exe_cmd("pactl unload-module %s" %output) + result = self.main.localdata.Route("route-del", ip_broadcast, "255.255.255.255", eth) + if result == "error": + print_debug("Del multicast-ip route failed") + if len(self.rtp_count.keys()) == 0: + self.main.common.exe_cmd("/usr/lib/tcos/pactl-controller.sh stop-server") + else: + newusernames=[] + for user in self.connected_users: + if user.find(":") != -1: + # we have a standalone user... + usern, ip = user.split(":") + self.main.xmlrpc.newhost(ip) + self.main.xmlrpc.DBus("mess", remote_msg) + else: + newusernames.append(user) + + self.main.dbus_action.do_message( newusernames, remote_msg ) + self.main.write_into_statusbar( _("Running in audio conference with %s clients.") %(total) ) + # new mode Stop Button + if len(self.rtp_count.keys()) != 0: + count=len(self.rtp_count.keys())-1 + nextkey=self.rtp_count.keys()[count]+1 + self.rtp_count[nextkey]=ip_broadcast + else: + nextkey=1 + self.rtp_count[nextkey]=ip_broadcast + #self.main.menus.broadcast_count[ip_broadcast]=None + self.add_progressbox( {"target": "rtp", "pid":output, "allclients":self.newallclients, "ip":"", "ip_broadcast":ip_broadcast, "iface":eth, "key":nextkey}, _("Running in audio conference from server. Conference Nº %s") %(nextkey) ) + + + def rtp_simple(self, widget, ip_simple): + if not self.get_client(): + return + + client_simple=self.connected_users_txt + + # conference mode + if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: + shared.error_msg( _("Can't start conference mode, user is not logged") ) + return + + cmd=("LC_ALL=C LC_MESSAGES=C pactl --version 2>/dev/null | awk '{print $2}' | awk -F\".\" '{if ((int($2) >= 9) && (int($3) >= 10)) printf 1}'") + output=self.main.common.exe_cmd(cmd) + if output != "1": + shared.error_msg( _("Your pulseaudio server is too old.\nIs required pulseaudio version >= 0.9.10") ) + return + + msg=_( _("Do you want audio conference from user %s?" ) %(client_simple) ) + if not shared.ask_msg ( msg ): + return + + + # Allow one client + # if len(self.allclients) == 0: return + remote_msg=_("You have entered in audio conference from user %s") %client_simple + eth=self.main.config.GetVar("network_interface") + max_uip=255 + uip=0 + while uip <= max_uip: + uip_cmd="225.0.0.%s" %(uip) + cmd=("LC_ALL=C LC_MESSAGES=C netstat -putan 2>/dev/null | grep -c %s" %(uip_cmd) ) + print_debug("Check broadcast ip %s." %(uip_cmd) ) + output=self.main.common.exe_cmd(cmd) + uip+=1 + if output == "0" and uip_cmd not in self.rtp_count.values(): + print_debug("Broadcast ip found: %s" %(uip_cmd)) + ip_broadcast="%s" %uip_cmd + break + elif uip == max_uip: + print_debug("Not found an available broadcast ip") + return + + if not self.get_all_clients(): + return + + result = self.main.localdata.Route("route-add", ip_broadcast, "255.255.255.255", eth) + if result == "error": + print_debug("Add multicast-ip route failed") + return + + #self.main.xmlrpc.newhost(ip) + self.main.xmlrpc.rtp("startrtp-send", ip_simple, ip_broadcast ) + self.main.write_into_statusbar( _("Waiting for start audio conference from user %s...") %(client_simple) ) + + output = self.main.common.exe_cmd("pactl load-module module-rtp-recv sap_address=%s" %ip_broadcast) + + newallclients2=[] + total=1 + for client in self.newallclients: + self.main.localdata.newhost(client) + if client != ip_simple: + self.main.xmlrpc.rtp("startrtp-recv", client, ip_broadcast ) + total+=1 + newallclients2.append(client) + + if total < 1: + self.main.write_into_statusbar( _("No users logged.") ) + self.main.common.exe_cmd("pactl unload-module %s" %output) + self.main.xmlrpc.rtp("stoprtp-send", ip_simple ) + result = self.main.localdata.Route("route-del", ip_broadcast, "255.255.255.255", eth) + if result == "error": + print_debug("Del multicast-ip route failed") + else: + newusernames=[] + for user in self.connected_users: + if user.find(":") != -1: + # we have a standalone user... + usern, ip = user.split(":") + self.main.xmlrpc.newhost(ip) + self.main.xmlrpc.DBus("mess", remote_msg) + else: + newusernames.append(user) + self.main.dbus_action.do_message( newusernames, remote_msg ) + self.main.write_into_statusbar( _("Running in audio conference with %s clients.") %(total) ) + # new mode Stop Button + if len(self.rtp_count.keys()) != 0: + count=len(self.rtp_count.keys())-1 + nextkey=self.rtp_count.keys()[count]+1 + self.rtp_count[nextkey]=ip_broadcast + else: + nextkey=1 + self.rtp_count[nextkey]=ip_broadcast + #self.main.menus.broadcast_count[ip_broadcast]=None + self.add_progressbox( {"target": "rtp", "pid":output, "allclients":newallclients2, "ip":ip_simple, "ip_broadcast":ip_broadcast, "iface":eth, "key":nextkey}, _("Running in audio conference from user %(host)s. Conference Nº %(count)s") %{"host":client_simple, "count":nextkey} ) + + def rtp_chat(self, *args): + if not self.get_all_clients(): + return + # conference mode + if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: + shared.error_msg( _("No users logged.") ) + return + + cmd=("LC_ALL=C LC_MESSAGES=C pactl --version 2>/dev/null | awk '{print $2}' | awk -F\".\" '{if ((int($2) >= 9) && (int($3) >= 10)) printf 1}'") + output=self.main.common.exe_cmd(cmd) + if output != "1": + shared.error_msg( _("Your pulseaudio server is too old.\nIs required pulseaudio version >= 0.9.10") ) + return + + msg=_( _("Do you want to start audio chat conference to the following users: %s?" )%(self.connected_users_txt) ) + + if not shared.ask_msg ( msg ): + return + + remote_msg=_("You have entered in audio chat conference. Participants: %s") %self.connected_users_txt + eth=self.main.config.GetVar("network_interface") + max_uip=255 + uip=0 + while uip <= max_uip: + uip_cmd="225.0.0.%s" %(uip) + cmd=("LC_ALL=C LC_MESSAGES=C netstat -putan 2>/dev/null | grep -c %s" %(uip_cmd) ) + print_debug("Check broadcast ip %s." %(uip_cmd) ) + output=self.main.common.exe_cmd(cmd) + uip+=1 + if output == "0" and uip_cmd not in self.rtp_count.values(): + print_debug("Broadcast ip found: %s" %(uip_cmd)) + ip_broadcast="%s" %uip_cmd + break + elif uip == max_uip: + print_debug("Not found an available broadcast ip") + return + result = self.main.localdata.Route("route-add", ip_broadcast, "255.255.255.255", eth) + if result == "error": + print_debug("Add multicast-ip route failed") + return + + self.main.write_into_statusbar( _("Waiting for start audio chat conference...") ) + + output_send="" + output_recv="" + self.rtp_control_count[ip_broadcast]=[] + self.main.common.exe_cmd("/usr/lib/tcos/pactl-controller.sh start-server") + msg=_( "Do you want to connect to this audio chat conference now?" ) + if shared.ask_msg ( msg ): + output_send = self.main.common.exe_cmd("pactl load-module module-rtp-send format=s16be channels=2 rate=44100 source=@DEFAULT_SOURCE@ loop=0 destination=%s" %ip_broadcast) + output_recv = self.main.common.exe_cmd("pactl load-module module-rtp-recv sap_address=%s" %ip_broadcast) + self.rtp_control_count[ip_broadcast]=[output_send, output_recv] + total=0 + for client in self.newallclients: + self.main.xmlrpc.rtp("startrtp-chat", client, ip_broadcast ) + total+=1 + + if total < 1: + self.main.write_into_statusbar( _("No users logged.") ) + # kill x11vnc + if output_send != "" or output_recv != "": + self.main.common.exe_cmd("pactl unload-module %s" %output_send) + self.main.common.exe_cmd("pactl unload-module %s" %output_recv) + del self.rtp_control_count[ip_broadcast] + result = self.main.localdata.Route("route-del", ip_broadcast, "255.255.255.255", eth) + if result == "error": + print_debug("Del multicast-ip route failed") + if len(self.rtp_count.keys()) == 0: + self.main.common.exe_cmd("/usr/lib/tcos/pactl-controller.sh stop-server") + else: + newusernames=[] + for user in self.connected_users: + if user.find(":") != -1: + # we have a standalone user... + usern, ip = user.split(":") + self.main.xmlrpc.newhost(ip) + self.main.xmlrpc.DBus("mess", remote_msg) + else: + newusernames.append(user) + self.main.dbus_action.do_message( newusernames, remote_msg ) + + self.main.write_into_statusbar( _("Running in audio chat conference with %s clients.") %(total) ) + # new mode Stop Button + if len(self.rtp_count.keys()) != 0: + count=len(self.rtp_count.keys())-1 + nextkey=self.rtp_count.keys()[count]+1 + self.rtp_count[nextkey]=ip_broadcast + else: + nextkey=1 + self.rtp_count[nextkey]=ip_broadcast + if self.control_list: + self.populate_data(self.rtp_count) + #self.main.menus.broadcast_count[ip_broadcast]=None + self.add_progressbox( {"target": "rtp-chat", "pid_send":output_send, "pid_recv":output_recv, "allclients":self.newallclients, "ip":"", "ip_broadcast":ip_broadcast, "iface":eth, "key":nextkey}, _("Running in audio chat conference. Conference Nº %s") %(nextkey) ) + + def on_progressbox_click(self, widget, args, box): + box.destroy() + print_debug("on_progressbox_click() widget=%s, args=%s, box=%s" %(widget, args, box) ) + + if not args['target']: + return + + self.main.stop_running_actions.remove(widget) + + if args['target'] == "rtp": + del self.rtp_count[args['key']] + if args['ip_broadcast'] != "": + result = self.main.localdata.Route("route-del", args['ip_broadcast'], "255.255.255.255", args['iface']) + if result == "error": + print_debug("Del multicast-ip route failed") + #del self.main.menus.broadcast_count[args['ip_broadcast']] + for client in args['allclients']: + self.main.xmlrpc.rtp("stoprtp-recv", client) + if "pid" in args: + self.main.common.exe_cmd("pactl unload-module %s" %args['pid']) + if args['ip'] != "": + self.main.xmlrpc.rtp("stoprtp-send", args['ip'] ) + if len(self.rtp_count.keys()) == 0: + self.main.common.exe_cmd("/usr/lib/tcos/pactl-controller.sh stop-server") + self.main.write_into_statusbar( _("Conference mode off.") ) + + if args['target'] == "rtp-chat": + del self.rtp_count[args['key']] + if args['ip_broadcast'] != "": + result = self.main.localdata.Route("route-del", args['ip_broadcast'], "255.255.255.255", args['iface']) + if result == "error": + print_debug("Del multicast-ip route failed") + #del self.main.menus.broadcast_count[args['ip_broadcast']] + for client in args['allclients']: + self.main.xmlrpc.rtp("stoprtp-chat", client) + if self.rtp_control_count.has_key(args['ip_broadcast']) and len(self.rtp_control_count[args['ip_broadcast']]) > 0: + self.main.common.exe_cmd("pactl unload-module %s" %self.rtp_control_count[args['ip_broadcast']][0]) + self.main.common.exe_cmd("pactl unload-module %s" %self.rtp_control_count[args['ip_broadcast']][1]) + del self.rtp_control_count[args['ip_broadcast']] + if self.control_list: + self.chat_delete(args['ip_broadcast']) + if len(self.rtp_count.keys()) == 0: + self.main.common.exe_cmd("/usr/lib/tcos/pactl-controller.sh stop-server") + self.main.write_into_statusbar( _("Audio chat conference off.") ) + + + +__extclass__=AudioRTP diff --git a/tcosmonitor/extensions/clean.py b/tcosmonitor/extensions/clean.py new file mode 100644 index 0000000..2aa63c9 --- /dev/null +++ b/tcosmonitor/extensions/clean.py @@ -0,0 +1,58 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +""" template extension """ + +from gettext import gettext as _ +import sys + +from tcosmonitor import shared +from tcosmonitor.TcosExtensions import TcosExtension + + +def print_debug(txt): + if shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + + +class Clean(TcosExtension): + def register(self): + self.main.menus.register_simple(_("Clean info about terminal"), "menu_clear.png", 0, self.clean, "clean") + self.main.menus.register_all( _("Clean info about terminal"), "menu_clear.png", 0, self.clean, "clean") + + def clean(self, *args): + print_debug("clean()") + self.main.datatxt.clean() + self.main.write_into_statusbar('') + + + + + + +__extclass__=Clean + + + + + + + + diff --git a/tcosmonitor/extensions/dpms.py b/tcosmonitor/extensions/dpms.py new file mode 100644 index 0000000..44b35d5 --- /dev/null +++ b/tcosmonitor/extensions/dpms.py @@ -0,0 +1,98 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +""" template extension """ + +from gettext import gettext as _ +import sys + +from tcosmonitor import shared +from tcosmonitor.TcosExtensions import TcosExtension + + +def print_debug(txt): + if shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + + +class Dpms(TcosExtension): + def register(self): + self.main.menus.register_simple( _("DPMS Power off monitor"), "menu_dpms_off.png", 0, self.dpms_off, "dpms") + self.main.menus.register_all( _("DPMS Power off monitors"), "menu_dpms_off.png", 0, self.dpms_off_all, "dpms") + self.main.menus.register_simple( _("DPMS Power on monitor"), "menu_dpms_on.png", 0, self.dpms_on, "dpms") + self.main.menus.register_all( _("DPMS Power on monitors"), "menu_dpms_on.png", 0, self.dpms_on_all, "dpms") + + def dpms_off(self, w, ip): + if not self.get_client(): + return + # DPMS off + self.main.xmlrpc.dpms('off') + self.change_lockscreen(self.main.selected_ip) + + def dpms_on(self, w, ip): + if not self.get_client(): + return + # DPMS on + self.main.xmlrpc.dpms('on') + self.change_lockscreen(self.main.selected_ip) + + def real_action(self, ip, action): + print_debug("real_action() ip=%s action='%s'"%(ip, action) ) + + if action == 'dpmsoff': + result=self.main.xmlrpc.dpms('off') + print_debug("real_action() DPMS OFF result=%s"%result) + self.main.common.threads_enter("extensions/dpms::real_action dpms off") + self.change_lockscreen(ip) + self.main.common.threads_leave("extensions/dpms::real_action dpms off") + elif action == 'dpmson': + result=self.main.xmlrpc.dpms('on') + print_debug("real_action() DPMS ON result=%s"%result) + self.main.common.threads_enter("extensions/dpms::real_action dpms on") + self.change_lockscreen(ip) + self.main.common.threads_leave("extensions/dpms::real_action dpms on") + + + def dpms_off_all(self, *args): + if not self.get_all_clients(): + return + msg=_( _("Do you want to switch off the following monitors: %s?" ) %(self.connected_users_txt_all) ) + if shared.ask_msg ( msg ): + self.main.worker=shared.Workers(self.main, None, None) + self.main.worker.set_for_all_action(self.action_for_clients, \ + self.allclients_logged, "dpmsoff" ) + + def dpms_on_all(self, *args): + if not self.get_all_clients(): + return + msg=_( _("Do you want to switch on the following monitors: %s?" ) %(self.connected_users_txt_all) ) + if shared.ask_msg ( msg ): + self.main.worker=shared.Workers(self.main, None, None) + self.main.worker.set_for_all_action(self.action_for_clients, \ + self.allclients_logged, "dpmson" ) + + +__extclass__=Dpms + + + + + + diff --git a/tcosmonitor/extensions/info.py b/tcosmonitor/extensions/info.py new file mode 100644 index 0000000..80fefab --- /dev/null +++ b/tcosmonitor/extensions/info.py @@ -0,0 +1,616 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +""" template extension """ + +from gettext import gettext as _ +from time import time +import gtk +import os +import sys + +from tcosmonitor import shared +from tcosmonitor.TcosExtensions import TcosExtension +from tcosmonitor.ping import PingPort + +def crono(start, txt): + print_debug ("crono(), %s get %f seconds" %(txt, (time() - start)) ) + return + +def print_debug(txt): + if shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + + +class Info(TcosExtension): + def register(self): + self.main.menus.register_simple(_("Refresh terminal info"), "menu_refresh.png", 0, self.get_info, "info") + # register file click event target + self.main.listview.populate_datatxt=self.populate_datatxt + + def get_info(self, widget, ip): + if not self.get_client(): + return + print_debug("get_info() ip=%s"%(ip)) + self.main.xmlrpc.ip=ip + self.main.worker=shared.Workers( self.main,\ + target=self.populate_datatxt, args=(ip,) ).start() + + + def populate_datatxt(self, ip): + start1=time() + print_debug ("populate_datatxt() INIT ip %s"%ip) + + if not self.main.xmlrpc.connected: + print_debug ( "populate_datatxt(%s) NO CONNECTION" %(ip) ) + crono(start1, "populate_datatxt(%s)" %(ip) ) + return + + # dictionary with all data + tcos_vars={} + + self.datatxt = self.main.datatxt + + # clear datatxt + self.main.common.threads_enter("TcosActions:populate_datatxt clean datatxt") + self.datatxt.clean() + self.main.common.threads_leave("TcosActions:populate_datatxt clean datatxt") + tcos_vars["get_client"] = self.main.xmlrpc.ReadInfo("get_client") + print_debug ( "Client type=%s" %(tcos_vars["get_client"]) ) + + # print into statusbar + self.main.common.threads_enter("TcosActions:populate_datatxt show progressbar") + + if shared.disable_textview_on_update and self.main.listview.isactive(): + self.main.tabla.set_sensitive(True) + + #self.main.write_into_statusbar( _("Connecting with %s to retrieve some info..." ) %(ip) ) + + self.main.progressbar.show() + #self.main.progressbutton.show() + self.main.actions.set_progressbar( _("Connecting with %s to retrieve some info..." ) %(ip) , 0, show_percent=False) + + self.main.common.threads_leave("TcosActions:populate_datatxt show progressbar") + + + info_percent=0.0 + info_items=0 + for elem in self.main.config.vars: + # elem can have 2 or 3 elements (don't use key,value in for) + key=elem[0] + value=elem[1] + if self.main.config.GetVar(key) == 1: + info_items += 1 + if info_items != 0: + percent_step=float((100/info_items)) + percent_step=percent_step/100 + + + + if self.main.config.GetVar("tcosinfo") == 1: + info_percent+=percent_step + self.main.common.threads_enter("TcosActions:populate_datatxt update progressbar") + self.main.actions.update_progressbar( info_percent ) + self.main.common.threads_leave("TcosActions:populate_datatxt update progressbar") + + if tcos_vars["get_client"] == "tcos": + self.datatxt.insert_block( _("Tcos info") , image=shared.IMG_DIR + "tcos-icon-32x32.png" ) + + elif tcos_vars["get_client"] == "pxes": + self.datatxt.insert_block( _("PXES info") , image="/usr/share/pixmaps/pxesconfig/2X.png" ) + + elif tcos_vars["get_client"] == "ltsp": + self.datatxt.insert_block( _("LTSP info") , image=shared.IMG_DIR + "ltsp_logo.png" ) + + elif tcos_vars["get_client"] == "standalone": + self.datatxt.insert_block( _("Standalone info") , image=shared.IMG_DIR + "standalone.png" ) + + elif tcos_vars["get_client"] == "multiseat": + self.datatxt.insert_block( _("Multiseat info") , image=shared.IMG_DIR + "standalone.png" ) + + else: + self.datatxt.insert_block( _("Unknow client info") ) + + tcos_vars["hostname"]=self.main.localdata.GetHostname(ip) + tcos_vars["version"]=self.main.xmlrpc.GetVersion() + + if not tcos_vars["version"]: + tcos_vars["version"]=_("unknow") + + self.datatxt.insert_list( [ + [ _("Hostname: "), tcos_vars["hostname"] ] , \ + [ _("Ip address: "), ip ] , \ + [ _("TcosXmlRpc version: "), tcos_vars["version"] ] + ] ) + + tcos_vars["tcos_version"]=self.main.xmlrpc.ReadInfo("tcos_version") + tcos_vars["tcos_generation_date"]=self.main.xmlrpc.ReadInfo("tcos_generation_date") + tcos_vars["tcos_date"]=self.main.xmlrpc.ReadInfo("tcos_date") + tcos_vars["tcos_uptime"]=self.main.xmlrpc.ReadInfo("tcos_uptime") + + self.datatxt.insert_list( [ \ + [_("Tcos image version: "), tcos_vars["tcos_version"] ], \ + [_("Tcos image date: "), tcos_vars["tcos_generation_date"] ], \ + [_("Date of thin client: "), tcos_vars["tcos_date"] ], + [_("Uptime: "), tcos_vars["tcos_uptime"] ] + ] ) + + + + if self.main.config.GetVar("kernelmodulesinfo") == 1: + info_percent+=percent_step + self.main.common.threads_enter("TcosActions:populate_datatxt update progressbar") + self.main.actions.update_progressbar( info_percent ) + self.main.common.threads_leave("TcosActions:populate_datatxt update progressbar") + + self.datatxt.insert_block( _("Kernel info"), image=shared.IMG_DIR + "info_kernel.png" ) + + tcos_vars["kernel_version"]=self.main.xmlrpc.ReadInfo("kernel_version") + tcos_vars["kernel_complete_version"]=self.main.xmlrpc.ReadInfo("kernel_complete_version") + tcos_vars["modules_loaded"]=self.main.xmlrpc.ReadInfo("modules_loaded") + tcos_vars["modules_notfound"]=self.main.xmlrpc.ReadInfo("modules_notfound") + + if tcos_vars["modules_notfound"] != "OK" and tcos_vars["get_client"] == "tcos": + + blabel=_("Force download and mount all modules") + self.main.action_button=gtk.Button( label=blabel ) + self.main.action_button.connect("clicked", self.on_downloadallmodules_click) + self.main.action_button.show() + + tcos_vars["modules_notfound"] = """ + <span style='color:red'>%s </span> + <input type='button' name='%s' label='%s' /> + """ % (tcos_vars["modules_notfound"], "self.main.action_button" , blabel) + + else: + tcos_vars["modules_notfound"] = _("None") + + self.datatxt.insert_list( [ \ + [_("Kernel version: "), tcos_vars["kernel_version"] ], \ + [_("Kernel complete version: "), tcos_vars["kernel_complete_version"] ], \ + [_("Loaded Modules: "), tcos_vars["modules_loaded"] ], \ + [_("Modules not found: "), tcos_vars["modules_notfound"] ] + ] ) + + + cpuinfo=self.main.config.GetVar("cpuinfo") + pciinfo=self.main.config.GetVar("pcibusinfo") + ramswapinfo=self.main.config.GetVar("ramswapinfo") + networkinfo=self.main.config.GetVar("networkinfo") + + + if cpuinfo == 1: + info_percent+=percent_step + self.main.common.threads_enter("TcosActions:populate_datatxt update progressbar") + self.main.actions.update_progressbar( info_percent ) + self.main.common.threads_leave("TcosActions:populate_datatxt update progressbar") + + self.datatxt.insert_block( _("Cpu info: "), image=shared.IMG_DIR + "info_cpu.png" ) + + tcos_vars["cpu_model"]=self.main.xmlrpc.ReadInfo("cpu_model") + tcos_vars["cpu_vendor"]=self.main.xmlrpc.ReadInfo("cpu_vendor") + tcos_vars["cpu_speed"]=self.main.xmlrpc.ReadInfo("cpu_speed") + + self.datatxt.insert_list( [ \ + [_("Cpu model: "), tcos_vars["cpu_model"] ], \ + [_("Cpu vendor: "), tcos_vars["cpu_vendor"] ], \ + [_("Cpu speed: "), tcos_vars["cpu_speed"] ] + ] ) + + + if pciinfo == 1: + info_percent+=percent_step + self.main.common.threads_enter("TcosActions:populate_datatxt update progressbar") + self.main.actions.update_progressbar( info_percent ) + self.main.common.threads_leave("TcosActions:populate_datatxt update progressbar") + + # PCI info + self.datatxt.insert_block( _("PCI buses: ") , image=shared.IMG_DIR + "info_pci.png" ) + + pcilist=[] + try: + allpci=self.main.xmlrpc.tc.tcos.pci("pci_all").split(' ') + except Exception, err: + print_debug("info() Exception pci error %s"%err) + self.main.xmlrpc.CheckSSL(err) + + for pci_id in allpci: + if pci_id != "": + try: + pci_info=self.main.xmlrpc.tc.tcos.pci(pci_id) + pcilist.append( [pci_id + " ", pci_info] ) + except Exception, err: + print_debug("info() Exception pci error %s"%err) + self.main.xmlrpc.CheckSSL(err) + + self.datatxt.insert_list( pcilist ) + + + + if self.main.config.GetVar("processinfo") == 1 and tcos_vars["get_client"] != "standalone": + info_percent+=percent_step + self.main.common.threads_enter("TcosActions:populate_datatxt update progressbar") + self.main.actions.update_progressbar( info_percent ) + self.main.common.threads_leave("TcosActions:populate_datatxt update progressbar") + + self.datatxt.insert_block( _("Process running: "), image=shared.IMG_DIR + "info_proc.png" ) + + proclist=[] + allprocess=self.main.xmlrpc.ReadInfo("get_process").split('|') + self.datatxt.insert_proc( allprocess ) + + + if ramswapinfo == 1: + info_percent+=percent_step + self.main.common.threads_enter("TcosActions:populate_datatxt update progressbar") + self.main.actions.update_progressbar( info_percent ) + self.main.common.threads_leave("TcosActions:populate_datatxt update progressbar") + + self.datatxt.insert_block( _("Ram info: "), image=shared.IMG_DIR + "info_ram.png" ) + + tcos_vars["ram_total"]=self.main.xmlrpc.ReadInfo("ram_total") + tcos_vars["ram_free"]=self.main.xmlrpc.ReadInfo("ram_free") + tcos_vars["ram_active"]=self.main.xmlrpc.ReadInfo("ram_active") + + self.datatxt.insert_list( [ \ + [_("Total Ram: "), tcos_vars["ram_total"] ], \ + [_("Free RAM: "), tcos_vars["ram_free"] ], \ + [_("Active RAM: "), tcos_vars["ram_active"] ] + ] ) + + self.datatxt.insert_block( _("Swap info: "), image=shared.IMG_DIR + "info_swap.png" ) + tcos_vars["swap_avalaible"]=self.main.xmlrpc.ReadInfo("swap_avalaible") + tcos_vars["swap_total"]=self.main.xmlrpc.ReadInfo("swap_total") + tcos_vars["swap_used"]=self.main.xmlrpc.ReadInfo("swap_used") + + self.datatxt.insert_list( [ \ + [_("Swap enabled: "), tcos_vars["swap_avalaible"] ], \ + [_("Total Swap: "), tcos_vars["swap_total"] ], \ + [_("Used Swap: "), tcos_vars["swap_used"] ] + ] ) + + + + if networkinfo == 1: + info_percent+=percent_step + self.main.common.threads_enter("TcosActions:populate_datatxt update progressbar") + self.main.actions.update_progressbar( info_percent ) + self.main.common.threads_leave("TcosActions:populate_datatxt update progressbar") + self.datatxt.insert_block( _("Network info: ") , image=shared.IMG_DIR + "info_net.png" ) + + tcos_vars["network_hostname"]=self.main.xmlrpc.ReadInfo("network_hostname") + tcos_vars["network_ip"]=self.main.xmlrpc.ReadInfo("network_ip") + tcos_vars["network_mask"]=self.main.xmlrpc.ReadInfo("network_mask") + tcos_vars["network_mac"]=self.main.xmlrpc.ReadInfo("network_mac") + tcos_vars["network_rx"]=self.main.xmlrpc.ReadInfo("network_rx") + tcos_vars["network_tx"]=self.main.xmlrpc.ReadInfo("network_tx") + + self.datatxt.insert_list( [ \ + [_("Network hostname: "), tcos_vars["network_hostname"] ], \ + [_("Network IP: "), tcos_vars["network_ip"] ], \ + [_("Network MASK: "), tcos_vars["network_mask"] ], \ + [_("Network MAC: "), tcos_vars["network_mac"] ], \ + [_("Data received(rx): "), tcos_vars["network_rx"] ], \ + [_("Data send(tx): "), tcos_vars["network_tx"] ] + ] ) + + + if self.main.config.GetVar("xorginfo") == 1 and tcos_vars["get_client"] != "standalone": + info_percent+=percent_step + self.main.common.threads_enter("TcosActions:populate_datatxt update progressbar") + self.main.actions.update_progressbar( info_percent ) + self.main.common.threads_leave("TcosActions:populate_datatxt update progressbar") + + self.datatxt.insert_block( _("Xorg info") , image=shared.IMG_DIR + "info_xorg.png" ) + + xorglist=[] + try: + alldata=self.main.xmlrpc.tc.tcos.xorg("get", "", \ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password") ).split() + except Exception, err: + print_debug("info() Exception networking error %s"%err) + self.main.xmlrpc.CheckSSL(err) + + print_debug ( "populate_datatxt() %s" %( " ".join(alldata) ) ) + if alldata[0].find("error") == 0: + #shared.error_msg( _("Error getting Xorg info:\n%s" ) %( " ".join(alldata)) ) + pass + else: + for data in alldata: + try: + (key, value)=data.split('=') + except Exception, err: + print_debug("populate_datatxt() Exception spliting data=%s, err=%s"%(data, err)) + key=data + value="" + + if value== "1": + value = _("enabled") + elif value == "0": + value = _("disabled") + + if key == "xsession": + key=_("X Session Type") + elif key == "xdriver": + key=_("Xorg Driver") + elif key == "xres": + key=_("Xorg Resolution") + elif key == "xdepth": + key=_("Xorg Color depth") + elif key == "xdpms": + key=_("DPMS energy monitor control") + elif key == "xdontzap": + key=_("Disable kill X with Ctrl+Alt+Backspace") + elif key == "xmousewheel": + key=_("Enable mouse wheel") + elif key == "xrefresh": + key=_("Refresh rate") + elif key == "xfontserver": + key = _("Xorg font server") + elif key == "xmousedev": + key = _("Mouse device") + elif key == "xmouseprotocol": + key = _("Mouse protocol") + elif key == "xhorizsync": + key = _("X Horiz sync") + elif key == "xvertsync": + key = _("X Vert sync") + xorglist.append( [key + " " , value] ) + self.datatxt.insert_list(xorglist) + + + if self.main.config.GetVar("soundserverinfo") == 1: + info_percent+=percent_step + self.main.common.threads_enter("TcosActions:populate_datatxt update progressbar") + self.main.actions.update_progressbar( info_percent ) + self.main.common.threads_leave("TcosActions:populate_datatxt update progressbar") + + # make a ping to port + if tcos_vars["get_client"] == "standalone" or PingPort(ip, shared.pulseaudio_soundserver_port, 0.5).get_status() == "OPEN": + self.datatxt.insert_block ( _("PulseAudio Sound server is running"), image=shared.IMG_DIR + "info_sound_ok.png" ) + + channel_list=[] + tcos_sound_vars={} + #tcos_sound_vars["allchannels"]=self.main.xmlrpc.GetSoundChannels() + tcos_sound_vars["allchannels"]=self.main.xmlrpc.GetSoundChannelsContents() + #print_debug ( "populate_datatxt() sound channels=%s" %(tcos_sound_vars["allchannels"]) ) + + counter=0 + self.main.volume_sliders=[] + self.main.volume_checkboxes=[] + + self.datatxt.insert_html(""" + <br /> + <div style='text-align:center; background-color:#f3d160 ; margin-left: 25%%; margin-right: 25%%'> + <img file="%s" /> + <span style='font-weight: bold; font-size: 150%%'>%s</span> + </div> + """ %( shared.IMG_DIR + "icon_mixer.png", _("Remote Sound Mixer")) ) + + + for channel in tcos_sound_vars["allchannels"]: + volumebutton=None + # only show channel in list + if not channel['name'] in shared.sound_only_channels: + print_debug("populate_datatxt() *** AUDIO CHANNEL HIDDEN*** channel=%s"%channel) + continue + txt=""" + <div style='text-align:center; background-color:#f3d160 ; margin-left: 25%%; margin-right: 25%%'> + <span style='font-size: 120%%'>%s: </span> + """ %(channel['name']) + + + #value=self.main.xmlrpc.GetSoundInfo(channel, mode="--getlevel") + #value=value.replace('%','') + value=channel['level'] + try: + value=float(value) + except Exception, err: + print_debug("populate_datatxt() Exception getting volume=%s, err=%s"%(value, err) ) + value=0.0 + + #ismute=self.main.xmlrpc.GetSoundInfo(channel, mode="--getmute") + ismute=channel['mute'] + if ismute == "off": + ismute = True + else: + ismute = False + + ctype=channel['type'] + print_debug ( "populate_datatxt() channel=%s ismute=%s volume level=%s ctype=%s" %(channel['name'], ismute, value, ctype) ) + ############ mute checkbox ################## + volume_checkbox=gtk.CheckButton(label=_("Mute"), use_underline=True) + volume_checkbox.set_active(ismute) + volume_checkbox.connect("toggled", self.checkbox_value_changed, channel['name'], ip) + if "switch" in ctype: + volume_checkbox.show() + else: + volume_checkbox.hide() + self.main.volume_checkboxes.append(volume_checkbox) + + txt+="<input type='checkbox' name='self.main.volume_checkboxes' index='%s' />" %(counter) + + + ############# volume slider ################### + adjustment = gtk.Adjustment(value=0, + lower=0, + upper=100, + step_incr=1, + page_incr=1) + volume_slider = gtk.HScale(adjustment) + volume_slider.set_size_request(100, 30) + volume_slider.set_value_pos(gtk.POS_RIGHT) + volume_slider.set_digits(0) + volume_slider.set_value( value ) + volume_slider.connect("button_release_event", self.slider_value_changed, adjustment, channel['name'], ip) + volume_slider.connect("scroll_event", self.slider_value_changed, adjustment, channel['name'], ip) + if "volume" in ctype: + volume_slider.show() + else: + volume_slider.hide() + self.main.volume_sliders.append(volume_slider) + txt+="<input type='slider' name='self.main.volume_sliders' index='%s' />" %(counter) + + txt+="</div>" + self.datatxt.insert_html(txt) + counter+=1 + + if tcos_vars["get_client"] == "tcos": + # PulseAudio utils + self.main.openvolumecontrol_button=None + self.main.openvolumecontrol_button=gtk.Button(label=_("PulseAudio Control") ) + self.main.openvolumecontrol_button.connect("clicked", self.on_openvolumecontrol_button_click, ip) + self.main.openvolumecontrol_button.show() + + self.main.openvolumemeter_button=None + self.main.openvolumemeter_button=gtk.Button(label=_("PulseAudio Meter") ) + self.main.openvolumemeter_button.connect("clicked", self.on_openvolumemeter_button_click, ip) + self.main.openvolumemeter_button.show() + + self.main.volumemanager_button=None + self.main.volumemanager_button=gtk.Button(label=_("PulseAudio Manager") ) + self.main.volumemanager_button.connect("clicked", self.on_volumemanager_button_click, ip) + self.main.volumemanager_button.show() + + self.datatxt.insert_block(_("PulseAudio utils: ") + """ + <input type='button' name='self.main.volumemanager_button' /> + <input type='button' name='self.main.openvolumecontrol_button' /> + <input type='button' name='self.main.openvolumemeter_button' /> + """) + + self.datatxt.insert_block( _("PulseAudio stats") ) + pulseaudioinfo=self.main.xmlrpc.GetSoundInfo(channel="", mode="--getserverinfo").split('|') + #print pulseaudioinfo + allpulseaudioinfo=[] + allpulseaudioinfo_trans=[] + output=[] + for line in pulseaudioinfo: + if line != "" and line.find(":") != -1: + key, value = line.split(':') + allpulseaudioinfo.append([ key+":", value ]) + allpulseaudioinfo_trans.append(value) + if len(allpulseaudioinfo_trans) == 11: + output.append( ["%s:" %( _("Currently in use")), allpulseaudioinfo_trans[0] ]) + output.append( ["%s:" %( _("Allocated during whole lifetime")), allpulseaudioinfo_trans[1] ]) + output.append( ["%s:" %( _("Sample cache size")), allpulseaudioinfo_trans[2] ]) + output.append( ["%s:" %( _("User name")), allpulseaudioinfo_trans[3] ]) + output.append( ["%s:" %( _("Host Name")), allpulseaudioinfo_trans[4] ]) + output.append( ["%s:" %( _("Server Name")), allpulseaudioinfo_trans[5] ]) + output.append( ["%s:" %( _("Server Version")), allpulseaudioinfo_trans[6] ]) + output.append( ["%s:" %( _("Default Sample Specification")), allpulseaudioinfo_trans[7] ]) + output.append( ["%s:" %( _("Default Sink")), allpulseaudioinfo_trans[8] ]) + output.append( ["%s:" %( _("Default Source")), allpulseaudioinfo_trans[9] ]) + output.append( ["%s:" %( _("Cookie")), allpulseaudioinfo_trans[10] ]) + self.datatxt.insert_list( output ) + else: + self.datatxt.insert_list( allpulseaudioinfo ) + + else: + self.datatxt.insert_block ( _("Sound server is not running"), image=shared.IMG_DIR + "info_sound_ko.png") + + self.main.common.threads_enter("TcosActions:populate_datatxt end") + self.datatxt.display() + self.main.actions.update_progressbar( 1 ) + self.main.progressbar.hide() + + if shared.disable_textview_on_update and self.main.iconview.isactive(): + self.main.tabla.set_sensitive(True) + + self.main.common.threads_leave("TcosActions:populate_datatxt end") + + crono(start1, "populate_datatxt(%s)" %(ip) ) + return False + + def on_downloadallmodules_click(self, widget): + print_debug ( "on_downloadallmodules_click() ################" ) + if self.main.selected_ip != None: + print_debug( "on_downloadallmodules_click() downloading modules for %s" %(self.main.selected_ip) ) + # download allmodules.squashfs and mount it + self.main.xmlrpc.Exe("useallmodules.sh") + return + + + def slider_value_changed(self, widget, adjustment, event, channel, ip): + value=widget.get_value() + print_debug ( "slider_value_changed() ip=%s channel=%s value=%s" %(ip, channel, value) ) + + self.main.write_into_statusbar( \ + _("Changing value of %(channel)s channel, to %(value)s%%..." )\ + %{"channel":channel, "value":value} ) + + tmp=self.main.xmlrpc.SetSound(ip, channel, str(value)+"%") + newvalue="%2d%%"%int(tmp['level']) + + self.main.write_into_statusbar( \ + _("Changed value of %(channel)s channel, to %(value)s" ) \ + %{"channel":channel, "value":newvalue} ) + + def checkbox_value_changed(self, widget, channel, ip): + value=widget.get_active() + if not value: + value="off" + self.main.write_into_statusbar( _("Unmuting %s channel..." ) %(channel) ) + tmp=self.main.xmlrpc.SetSound(ip, channel, value="", mode="--setunmute") + newvalue=tmp['mute'] + else: + value="on" + self.main.write_into_statusbar( _("Muting %s channel..." ) %(channel) ) + tmp=self.main.xmlrpc.SetSound(ip, channel, value="", mode="--setmute") + newvalue=tmp['mute'] + self.main.write_into_statusbar( _("Status of %(channel)s channel, is \"%(newvalue)s\"" )\ + %{"channel":channel, "newvalue":newvalue} ) + + + def on_openvolumecontrol_button_click(self, widget, ip): + print_debug ( "on_openvolumecontrol_button_click() ip=%s" %(ip) ) + cmd="PULSE_SERVER=\"%s\" pavucontrol" %(ip) + if os.path.isdir("/dev/shm"): + self.main.common.exe_cmd( cmd, verbose=0, background=True ) + else: + shared.error_msg ( _("PulseAudio apps need /dev/shm.") ) + + def on_openvolumemeter_button_click(self, widget, ip): + print_debug ( "on_openvolumemeter_button_click() ip=%s" %(ip) ) + cmd="PULSE_SERVER=\"%s\" pavumeter" %(ip) + if os.path.isdir("/dev/shm"): + self.main.common.exe_cmd( cmd, verbose=0, background=True ) + else: + shared.error_msg ( _("PulseAudio apps need /dev/shm.") ) + + def on_volumemanager_button_click(self, widget, ip): + print_debug ( "on_volumemanager_button_click() ip=%s" %(ip) ) + cmd="PULSE_SERVER=\"%s\" paman" %(ip) + if os.path.isdir("/dev/shm"): + self.main.common.exe_cmd( cmd, verbose=0, background=True ) + else: + shared.error_msg ( _("PulseAudio apps need /dev/shm.") ) + + + +__extclass__=Info + + + + + + + + diff --git a/tcosmonitor/extensions/italc.py b/tcosmonitor/extensions/italc.py new file mode 100644 index 0000000..00bfe59 --- /dev/null +++ b/tcosmonitor/extensions/italc.py @@ -0,0 +1,88 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +""" template extension """ + +from gettext import gettext as _ +from time import sleep +import sys + +from tcosmonitor import shared +from tcosmonitor.TcosExtensions import TcosExtension + + +def print_debug(txt): + if shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + + +class iTalc(TcosExtension): + def register(self): + self.main.menus.register_simple( _("Connect to remote screen (iTALC)"), "menu_remote.png", 1, self.ivs, "italc") + + + def ivs(self, w, ip): + if not self.get_client(): + return + + if len(self.allclients_logged) == 0: + shared.error_msg( _("No user logged.") ) + return + + self.main.worker=shared.Workers(self.main, target=self.start_ivs, args=(self.allclients_logged) ) + self.main.worker.start() + + def start_ivs(self, ip): + self.main.xmlrpc.newhost(ip) + # check if remote proc is running + if not self.main.xmlrpc.GetStatus("ivs"): + self.main.common.threads_enter("TcosActions:start_ivs write connecting msg") + self.main.write_into_statusbar( "Connecting with %s to start iTALC support" %(ip) ) + self.main.common.threads_leave("TcosActions:start_ivs write connecting msg") + + try: + self.main.xmlrpc.newhost(ip) + self.main.xmlrpc.Exe("startivs") + self.main.common.threads_enter("TcosActions:start_ivs write waiting msg") + self.main.write_into_statusbar( "Waiting for start of IVS server..." ) + self.main.common.threads_leave("TcosActions:start_ivs write waiting msg") + sleep(5) + except Exception, err: + print_debug("start_ivs() Exception, error=%s"%err) + self.main.common.threads_enter("TcosActions:start_ivs write error msg") + shared.error_msg ( _("Can't start IVS, please add iTALC support") ) + self.main.common.threads_leave("TcosActions:start_ivs write error msg") + return + + cmd = "icv " + ip + " root" + print_debug ( "start_process() threading \"%s\"" %(cmd) ) + self.main.common.exe_cmd (cmd, verbose=0, background=True) + + self.main.common.threads_enter("TcosActions:start_ivs END") + self.main.write_into_statusbar( "" ) + self.main.common.threads_leave("TcosActions:start_ivs END") + +__extclass__=iTalc + + + + + + diff --git a/tcosmonitor/extensions/livevnc.py b/tcosmonitor/extensions/livevnc.py new file mode 100644 index 0000000..cfbc511 --- /dev/null +++ b/tcosmonitor/extensions/livevnc.py @@ -0,0 +1,220 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +from gettext import gettext as _ + + +import gtk +import sys + +# needed for get_screenshot +from time import sleep + +from tcosmonitor import shared +from tcosmonitor.TcosExtensions import TcosExtension +from tcosmonitor.ping import PingPort + +import gtkvnc +from random import Random +import string + +def print_debug(txt): + if shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + + + +class LiveVNC(TcosExtension): + def register(self): + self.main.menus.register_all( _("Live view screens with VNC") , "menu_remote.png", 1, self.live_all, "livevnc") + self.main.livevnc={} + self.vncpasswd="" + self.vncxres={} + self.main.triggers['clean.datatxt']=self.__cleandatatxt + self.main.stop_liveview_button=None + + ########### MULTIPLE HOSTS ############### + + def live_all(self, widget): + if not self.get_all_clients(): + return + self.vncpasswd=''.join( Random().sample(string.letters+string.digits, 12) ) + + self.main.worker=shared.Workers(self.main, None, None) + self.main.worker.set_for_all_action(self.action_for_clients, self.allclients, 'livevnc' ) + + + def start_action(self, *args): + print_debug("START_ACTION") + self.main.datatxt.clean() + self.main.stop_liveview_button=gtk.Button(_("Stop") ) + self.main.stop_liveview_button.connect("clicked", self.__cleandatatxt, 'force') + self.main.stop_liveview_button.show() + + self.main.datatxt.insert_block( _("Live view of all hosts") ) + #"""<span> </span><input type='button' name="self.main.stop_liveview_button" />""" ) + self.main.datatxt.insert_html("<br/>") + + def real_action(self, ip, action): + #print_debug("real_action() ip=%s self.main.livevnc=%s" %(ip, self.main.livevnc) ) + max_wait=10 + + + # generate pass on client + #self.main.xmlrpc.newhost(ip) + self.main.xmlrpc.vnc("genpass", ip, self.vncpasswd) + + + # start x11vnc + result=self.main.xmlrpc.vnc("startscale", ip) + print_debug("real_action() start remote x11vnc result=%s"%result) + if result.find("error") != -1: + return + + # wait for start + status = "CLOSED" + + wait=0 + while status != "OPEN": + status=PingPort(ip, 5900).get_status() + if status == "CLOSED": + sleep(1) + wait+=1 + if wait > max_wait: + break + + # start vnc and save in self.main.vnc dict + self.main.livevnc[ip]=gtkvnc.Display() + self.main.livevnc[ip].set_credential(gtkvnc.CREDENTIAL_PASSWORD, self.vncpasswd) + self.main.livevnc[ip].set_credential(gtkvnc.CREDENTIAL_CLIENTNAME, self.main.name) + + self.main.livevnc[ip].connect("vnc-auth-credential", self._vnc_auth_cred, ip) + #self.main.livevnc[ip].connect("size-request", self._force_resize, ip) + self.main.livevnc[ip].connect("vnc-connected", self._vnc_connected, ip) + #self.main.livevnc[ip].connect("clicked", self._vnc_clicked, ip) + self.main.livevnc[ip].connect("button-press-event", self.on_iconview_click, ip) + # this freeze GUI + #self.main.livevnc[ip].set_tooltip_text("%s"%ip) + + #print dir(self.main.livevnc[ip]) + + print_debug("real_action() vnc started!!! ") + + def _vnc_clicked(self, vnc, ip): + print_debug("_vnc_clicked() vnc=%s ip=%s"%(vnc, ip)) + + + def on_iconview_click(self, widget, event, ip): + if event.button == 3: + self.main.force_selected_ip=ip + # right click show menu + self.main.menus.RightClickMenuOne( None , None, ip) + self.main.menu.popup( None, None, None, event.button, event.time) + return True + + + def _vnc_auth_cred(self, *args): + #print_debug("vnc_auth_cred() args=%s"%args) + return + + + def _force_resize(self, src, size, ip): + #print_debug("_force_resize() src=%s size=%s ip=%s"%(src, size, ip)) + w, h = src.get_size_request() + #print "_force_resize() w=%s h=%s"%(w, h) + if w == -1 or h == -1: + print_debug("_force_resize() returning w=%s h=%s ip=%s"%(w, h, ip)) + return + width=300 + height=200 + if self.vncxres.has_key(ip): + # cached data + width=self.vncxres[ip][0] + height=self.vncxres[ip][1] + else: + self.vncxres[ip]=[width, height] + try: + screensize=self.main.xmlrpc.ReadInfo("screensize") + if screensize != '': + width=int(screensize.split('x')[0]) * 100 / int(self.main.config.GetVar("miniscrot_size")) + height=int(screensize.split('x')[1]) * 100 / int(self.main.config.GetVar("miniscrot_size")) + self.vncxres[ip]=[width, height] + print_debug("_force_resize() RESIZE w=%s h=%s"%(width, height)) + except Exception, err: + print_debug("_force_resize() Exception err=%s"%err) + width=300 + height=200 + self.vncxres[ip]=[width, height] + self.main.livevnc[ip].set_size_request(self.vncxres[ip][0], self.vncxres[ip][1]) + + + def _vnc_connected(self, vnc, ip): + print_debug("_vnc_connected() vnc=%s livevnc[ip]=%s ip=%s"%(vnc, self.main.livevnc[ip], ip)) + self.main.livevnc[ip].show() + self.main.livevnc[ip].realize() + + + def finish_action(self, *args): + for ip in self.main.livevnc: + #self.main.livevnc[ip] + hostname=self.main.localdata.GetUsername(ip) + if hostname == shared.NO_LOGIN_MSG: + hostname=self.main.localdata.GetHostname(ip) + self.main.datatxt.insert_html( + "<span style='background-color:#f3d160'>" + + "\n\t<livevnc ip='%s' objdict='livevnc' title='%s' title_rotate='90'/> " %(ip, hostname) + + "<span style='background-color:#f3d160; color:#f3d160'>__</span>\n</span>"+ + "") + self.main.livevnc[ip].open_host(ip, '5900') + #self.main.livevnc[ip].set_scaling(True) + self.main.livevnc[ip].set_read_only(True) + self.main.livevnc[ip].show() + # draw widgets + self.main.datatxt.display() + stopargs={"target": "livevnc"} + self.add_progressbox( stopargs, _("Running in LiveView mode") ) + + def on_progressbox_click(self, widget, args, box): + try: + box.destroy() + except: + pass + self.__cleandatatxt(None, 'force') + + + + def __cleandatatxt(self, *args): + # stop all livevnc connections + for ip in self.main.livevnc: + print_debug("__cleandatatxt() STOPPING ip=%s"%ip) + self.main.livevnc[ip].close() + # stop server (don't wait) + self.main.xmlrpc.vnc("stopserver", ip ) + self.main.livevnc={} + + if len(args) == 2 and args[1] == 'force': + self.main.datatxt.clean() + self.main.stop_liveview_button=None + + + +__extclass__=LiveVNC + diff --git a/tcosmonitor/extensions/lockscreen.py b/tcosmonitor/extensions/lockscreen.py new file mode 100644 index 0000000..02b8317 --- /dev/null +++ b/tcosmonitor/extensions/lockscreen.py @@ -0,0 +1,100 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +""" template extension """ + +from gettext import gettext as _ +import sys + +from tcosmonitor import shared +from tcosmonitor.TcosExtensions import TcosExtension + + +def print_debug(txt): + if shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + + +class LockUnlockScreen(TcosExtension): + def register(self): + self.main.menus.register_simple( _("Lock screen"), "menu_lock.png", 0, self.lock, "lock") + self.main.menus.register_all( _("Lock all screens"), "menu_lock.png", 0, self.lock_all, "lock") + self.main.menus.register_simple( _("Unlock screen"), "menu_unlock.png", 0, self.unlock, "lock") + self.main.menus.register_all( _("Unlock all screens"), "menu_unlock.png", 0, self.unlock_all, "lock") + + def lock(self, w, ip): + if not self.get_client(): + return + if not self.main.xmlrpc.lockscreen(): + shared.error_msg( _("Can't connect to tcosxmlrpc.\nPlease verify user and password in prefences!") ) + return + self.change_lockscreen(ip) + + def unlock(self, w, ip): + if not self.get_client(): + return + if not self.main.xmlrpc.unlockscreen(): + shared.error_msg( _("Can't connect to tcosxmlrpc.\nPlease verify user and password in prefences!") ) + return + self.change_lockscreen(ip) + + def real_action(self, ip, action): + print_debug("real_action() ip=%s action='%s'"%(ip, action) ) + + if action == 'lockscreen': + self.main.xmlrpc.lockscreen() + # update icon + self.main.common.threads_enter("extensions/lockscreen::real_action lockscreen") + self.change_lockscreen(ip) + self.main.common.threads_leave("extensions/lockscreen::real_action lockscreen") + elif action == 'unlockscreen': + self.main.xmlrpc.unlockscreen() + # update icon + self.main.common.threads_enter("extensions/lockscreen::real_action unlockscreen") + self.change_lockscreen(ip) + self.main.common.threads_leave("extensions/lockscreen::real_action unlockscreen") + + + def lock_all(self, *args): + if not self.get_all_clients(): + return + msg=_( _("Do you want to lock the following screens: %s?" )%(self.connected_users_txt_all) ) + if shared.ask_msg ( msg ): + self.main.worker=shared.Workers(self.main, None, None) + self.main.worker.set_for_all_action(self.action_for_clients, \ + self.allclients_logged, "lockscreen" ) + + def unlock_all(self, *args): + if not self.get_all_clients(): + return + msg=_( _("Do you want to unlock the following screens: %s?" )%(self.connected_users_txt_all) ) + if shared.ask_msg ( msg ): + self.main.worker=shared.Workers(self.main, None, None) + self.main.worker.set_for_all_action(self.action_for_clients, \ + self.allclients_logged, "unlockscreen" ) + + +__extclass__=LockUnlockScreen + + + + + + diff --git a/tcosmonitor/extensions/logout.py b/tcosmonitor/extensions/logout.py new file mode 100644 index 0000000..bab6441 --- /dev/null +++ b/tcosmonitor/extensions/logout.py @@ -0,0 +1,94 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +""" template extension """ + +from gettext import gettext as _ +import sys + +from tcosmonitor import shared +from tcosmonitor.TcosExtensions import TcosExtension + + +def print_debug(txt): + if shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + + +class LogOut(TcosExtension): + def register(self): + self.main.menus.register_simple( _("Logout client"), "menu_restartx.png", 0, self.logout, "restartx") + self.main.menus.register_all( _("Logout clients"), "menu_restartx.png" , 0, self.logout_all, "restartx") + + + def logout(self, w, ip): + if not self.get_client(): + return + if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: + shared.error_msg ( _("User not logged") ) + return + + msg=_( _("Do you want to logout user: %s?" ) %(self.connected_users_txt) ) + if shared.ask_msg ( msg ): + newusernames=[] + timeout=self.main.config.GetVar("actions_timeout") + msg=_("Session will close in %s seconds") %timeout + remote_cmd="/usr/lib/tcos/session-cmd-send LOGOUT %s %s" %(timeout, msg.replace("'", "´")) + + if self.connected_users[0].find(":") != -1: + # we have a standalone user... + self.main.xmlrpc.DBus("exec", remote_cmd ) + else: + newusernames.append(self.connected_users[0]) + + self.main.dbus_action.do_exec(newusernames, remote_cmd ) + + def logout_all(self, widget): + if not self.get_all_clients(): + return + + if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: + shared.error_msg ( _("User not logged") ) + return + msg=_( _("Do you want to logout the following users: %s?" )%(self.connected_users_txt) ) + if shared.ask_msg ( msg ): + newusernames=[] + timeout=self.main.config.GetVar("actions_timeout") + msg=_("Session will close in %s seconds") %timeout + remote_cmd="/usr/lib/tcos/session-cmd-send LOGOUT %s %s" %(timeout, msg.replace("'", "´")) + + for user in self.connected_users: + if user.find(":") != -1: + # we have a standalone user... + usern, ip = user.split(":") + self.main.xmlrpc.newhost(ip) + self.main.xmlrpc.DBus("exec", remote_cmd ) + else: + newusernames.append(user) + + self.main.dbus_action.do_exec( newusernames, remote_cmd ) + +__extclass__=LogOut + + + + + + diff --git a/tcosmonitor/extensions/reboot.py b/tcosmonitor/extensions/reboot.py new file mode 100644 index 0000000..be943cb --- /dev/null +++ b/tcosmonitor/extensions/reboot.py @@ -0,0 +1,120 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +""" template extension """ + +from gettext import gettext as _ +import sys + +from tcosmonitor import shared +from tcosmonitor.TcosExtensions import TcosExtension + + +def print_debug(txt): + if shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + + +class RebootPoweroff(TcosExtension): + def register(self): + self.main.menus.register_simple(_("Reboot"), "menu_reboot.png", 0, self.reboot, "reboot") + self.main.menus.register_all( _("Reboot all clients"), "menu_reboot.png", 0, self.reboot_all, "reboot") + self.main.menus.register_simple( _("Poweroff"), "menu_poweroff.png", 0, self.poweroff, "reboot") + self.main.menus.register_all( _("Poweroff all clients"), "menu_poweroff.png", 0, self.poweroff_all, "reboot") + + def reboot(self, w, ip): + if not self.get_client(): + return + msg=_( _("Do you want to reboot: %s?" ) %(self.connected_users_txt_all) ) + if shared.ask_msg ( msg ): + timeout=self.main.config.GetVar("actions_timeout") + msg=(_("Pc will reboot in %s seconds") %timeout) + self.exe_app_in_client("reboot", timeout, msg, users=[ip], connected_users=self.connected_users) + + + def reboot_all(self, *args): + if not self.get_all_clients(): + return + msg=_( _("Do you want to reboot the following clients: %s?" ) %(self.connected_users_txt_all) ) + if shared.ask_msg ( msg ): + timeout=self.main.config.GetVar("actions_timeout") + msg=(_("Pc will reboot in %s seconds") %timeout) + self.exe_app_in_client("reboot", timeout, msg, users=self.allclients, connected_users=self.connected_users) + + def poweroff(self, w, ip): + if not self.get_client(): + return + msg=_( _("Do you want to poweroff: %s?" ) %(self.connected_users_txt_all) ) + if shared.ask_msg ( msg ): + timeout=self.main.config.GetVar("actions_timeout") + msg=(_("Pc will shutdown in %s seconds") %timeout) + self.exe_app_in_client("poweroff", timeout, msg, users=[ip], connected_users=self.connected_users) + + + def poweroff_all(self, *args): + if not self.get_all_clients(): + return + msg=_( _("Do you want to poweroff the following clients: %s?" )%(self.connected_users_txt_all) ) + if shared.ask_msg ( msg ): + timeout=self.main.config.GetVar("actions_timeout") + msg=(_("Pc will shutdown in %s seconds") %timeout) + self.exe_app_in_client("poweroff", timeout, msg, users=self.allclients, connected_users=self.connected_users) + + def real_action(self, ip, action): + print_debug("real_action() ip=%s action='%s'"%(ip, action) ) + self.main.xmlrpc.Exe(action) + + + def exe_app_in_client(self, mode, timeout=0, msg="", users=[], connected_users=[]): + remote_cmd=("/usr/lib/tcos/session-cmd-send %s %s %s" %(mode.upper(), timeout, msg.replace("'", "´"))) + action="down-controller %s %s" %(mode, timeout) + print_debug("exe_app_in_client() usernames=%s" %users) + + if len(connected_users) != 0 and connected_users[0] != shared.NO_LOGIN_MSG: + newusernames=[] + for user in connected_users: + if user.find(":") != -1: + # we have a standalone user... + usern, ip = user.split(":") + self.main.xmlrpc.newhost(ip) + self.main.xmlrpc.DBus("exec", remote_cmd ) + else: + # we have a thin client + newusernames.append(user) + + result = self.main.dbus_action.do_exec( newusernames, remote_cmd ) + + if not result: + shared.error_msg ( _("Error while exec remote app:\nReason:%s") %( self.main.dbus_action.get_error_msg() ) ) + + self.main.worker=shared.Workers(self.main, None, None) + self.main.worker.set_for_all_action(self.action_for_clients, users, action ) + return + + + + +__extclass__=RebootPoweroff + + + + + + diff --git a/tcosmonitor/extensions/remotessh.py b/tcosmonitor/extensions/remotessh.py new file mode 100644 index 0000000..bafd35b --- /dev/null +++ b/tcosmonitor/extensions/remotessh.py @@ -0,0 +1,57 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +""" template extension """ + +from gettext import gettext as _ +import sys + +from tcosmonitor import shared +from tcosmonitor.TcosExtensions import TcosExtension + + +def print_debug(txt): + if shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + + +class RemoteSSH(TcosExtension): + def register(self): + self.main.menus.register_simple( _("Give a remote xterm"), "menu_xterm.png", 0, self.remotessh, "shell") + + + def remotessh(self, w, ip): + if not self.get_client(): + return + # give a remote xterm throught SSH + pass_msg=_("Enter password of remote thin client (if asked for it)") + cmd="xterm -e \"echo '%s'; ssh %s@%s || sleep 5\"" %(pass_msg, self.main.config.GetVar("ssh_remote_username"),ip) + print_debug ( "remotessh() cmd=%s" %(cmd) ) + th=self.main.common.exe_cmd( cmd, verbose=0, background=True ) + + + +__extclass__=RemoteSSH + + + + + + diff --git a/tcosmonitor/extensions/restartxorg.py b/tcosmonitor/extensions/restartxorg.py new file mode 100644 index 0000000..5f3420f --- /dev/null +++ b/tcosmonitor/extensions/restartxorg.py @@ -0,0 +1,194 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +""" template extension """ + +from gettext import gettext as _ +import gtk +import sys + +from tcosmonitor import shared +from tcosmonitor.TcosExtensions import TcosExtension + + +def print_debug(txt): + if shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + + +class RestartXorg(TcosExtension): + def register(self): + self.main.menus.register_simple( _("Restart X session with new settings"), "menu_newconf.png", 0, self.restartx, "xorg") + self.main.menus.register_all( _("Restart X session of all clients"), "menu_newconf.png" , 0, self.restartx_all, "xorg") + + + def restartx(self, w, ip): + if not self.get_client(): + return + # restart xorg with new settings + # thin client must download again XXX.XXX.XXX.XXX.conf and rebuild xorg.conf + if self.client_type == "tcos": + msg=_( "Restart X session of %s with new config?" ) %(self.host) + if shared.ask_msg ( msg ): + # see xmlrpc/xorg.h, rebuild will download and sed xorg.conf.tpl + try: + self.main.xmlrpc.tc.tcos.xorg("rebuild", "--restartxorg", \ + self.main.config.GetVar("xmlrpc_username"), \ + self.main.config.GetVar("xmlrpc_password") ) + except Exception, err: + print_debug("restartx() Exception error %s"%err) + self.main.xmlrpc.CheckSSL(err) + + self.refresh_client_info(ip) + else: + shared.info_msg( _("%s is not supported to restart Xorg!") %(self.client_type) ) + + def restartx_all(self, widget): + if not self.get_all_clients(): + return + onlythinclients=[] + onlythinclients_txt="" + + for client in self.allclients: + if not self.main.xmlrpc.IsStandalone(client): + onlythinclients.append(client) + onlythinclients_txt+="\n %s" %(client) + + if len(onlythinclients) == 0: + shared.error_msg( _("No thin clients found.") ) + return + + msg=_( _("Do you want to restart X screens (only thin clients):%s?" )%(onlythinclients_txt) ) + if shared.ask_msg ( msg ): + self.main.worker=shared.Workers(self.main, None, None) + self.main.worker.set_for_all_action(self.action_for_clients, onlythinclients, "restartx" ) + + + def real_action(self, ip, action): + print_debug("real_action() ip=%s action='%s'"%(ip, action) ) + self.main.xmlrpc.Exe(action) + + + def refresh_client_info(self, ip): + print_debug ( "refresh_client_info() updating host data..." ) + + inactive_image = gtk.gdk.pixbuf_new_from_file(shared.IMG_DIR + 'inactive.png') + active_image = gtk.gdk.pixbuf_new_from_file(shared.IMG_DIR + 'active.png') + active_ssl_image = gtk.gdk.pixbuf_new_from_file(shared.IMG_DIR + 'active_ssl.png') + + logged_image = gtk.gdk.pixbuf_new_from_file(shared.IMG_DIR + 'logged.png') + unlogged_image = gtk.gdk.pixbuf_new_from_file(shared.IMG_DIR + 'unlogged.png') + + locked_image = gtk.gdk.pixbuf_new_from_file(shared.IMG_DIR + 'locked.png') + locked_net_image = gtk.gdk.pixbuf_new_from_file(shared.IMG_DIR + 'locked_net.png') + locked_net_screen_image = gtk.gdk.pixbuf_new_from_file(shared.IMG_DIR + 'locked_net_screen.png') + unlocked_image = gtk.gdk.pixbuf_new_from_file(shared.IMG_DIR + 'unlocked.png') + dpms_off_image = gtk.gdk.pixbuf_new_from_file(shared.IMG_DIR + 'menu_dpms_off.png') + dpms_on_image = gtk.gdk.pixbuf_new_from_file(shared.IMG_DIR + 'menu_dpms_on.png') + + # disable cache + self.main.localdata.cache_timeout=0 + + data={} + data['ip']=ip + print_debug("refresh_client_info() => get username") + data['username']=self.main.localdata.GetUsername(ip) + + print_debug("refresh_client_info() => get hostname") + data['hostname']=self.main.localdata.GetHostname(ip) + + if data['username'].startswith('error: tcos-last'): + data['username']="---" + + try: + print_debug("refresh_client_info() => get num process") + data['num_process']=self.main.localdata.GetNumProcess(ip) + except Exception, err: + print_debug("refresh_client_info() Exception error=%s"%err) + data['num_process']="---" + + print_debug("refresh_client_info() => get time logged") + data['time_logged']=self.main.localdata.GetTimeLogged(ip) + + if not data['time_logged'] or data['time_logged'] == "" or data['time_logged'].startswith('error: tcos-last'): + data['time_logged']="---" + + print_debug("refresh_client_info() => get active connection") + if self.main.localdata.IsActive(ip): + if self.main.xmlrpc.sslconnection: + data['image_active']=active_ssl_image + else: + data['image_active']=active_image + else: + data['image_active']=inactive_image + + print_debug("refresh_client_info() => get is logged") + if self.main.localdata.IsLogged(ip): + data['image_logged']=logged_image + else: + data['image_logged']=unlogged_image + + print_debug("refresh_client_info() => get is blocked") + if self.main.localdata.IsBlocked(ip): + data['blocked_screen']=True + else: + data['blocked_screen']=False + + print_debug("refresh_client_info() => get is blocked net") + if self.main.localdata.IsBlockedNet(ip, data['username']): + data['blocked_net']=True + else: + data['blocked_net']=False + + if self.main.xmlrpc.dpms('status', ip) == "Off": + data['dpms_off']=True + else: + data['dpms_off']=False + + if data['dpms_off']: + data['image_blocked']=dpms_off_image + elif data['blocked_screen'] and data['blocked_net']: + data['image_blocked']=locked_net_screen_image + elif data['blocked_screen'] == False and data['blocked_net']: + data['image_blocked']=locked_net_image + elif data['blocked_screen'] and data['blocked_net'] == False: + data['image_blocked']=locked_image + else: + data['image_blocked']=unlocked_image + + #enable cache again + self.main.localdata.cache_timeout=shared.cache_timeout + + if self.main.classview.isactive(): + self.main.classview.change_lockscreen(ip, data['image_blocked'], data['blocked_screen'], data['blocked_net']) + if self.main.iconview.isactive(): + self.main.iconview.change_lockscreen(ip, data['image_blocked'], data['blocked_screen'], data['blocked_net']) + if self.main.listview.isactive(): + self.main.listview.refresh_client_info(ip, data['image_blocked']) + + + +__extclass__=RestartXorg + + + + + + diff --git a/tcosmonitor/extensions/screenshot.py b/tcosmonitor/extensions/screenshot.py new file mode 100644 index 0000000..96dce48 --- /dev/null +++ b/tcosmonitor/extensions/screenshot.py @@ -0,0 +1,225 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +from gettext import gettext as _ + + +# needed for get_screenshot +from time import localtime +import gtk +import os +import sys + +from tcosmonitor import shared +from tcosmonitor.TcosExtensions import TcosExtension + + +def print_debug(txt): + if shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + + +class Screenshot(TcosExtension): + def register(self): + self.main.menus.register_simple( _("Screenshot"), "menu_screenshot.png", 2, self.take_screenshot, "screenshots") + self.main.menus.register_all( _("Capture All clients screens") , "menu_screenshot.png", 2, self.take_all_screenshots, "screenshots") + self.main.screenshots_action=None + self.__screenshot_counter=0 + self.__screenshot_data={} + + ########### SIMPLE HOST ############### + + def take_screenshot(self, widget, ip): + if not self.get_client(): + return + print_debug("take_screenshot() widget=%s ip=%s"%(widget, ip)) + + self.main.worker=shared.Workers(self.main, target=self.get_screenshot, args=(ip,) ) + self.main.worker.start() + + def get_screenshot(self, ip): + self.main.xmlrpc.newhost(ip) + if not self.main.xmlrpc.connected: + print_debug ( "get_screenshot(%s) NO CONNECTION" %(ip) ) + self.main.common.threads_enter("TcosActions::get_screenshot writing error msg") + self.main.write_into_statusbar( _("Can't make screenshot, error: %s") %"NO CONNECTION" ) + self.main.common.threads_leave("TcosActions::get_screenshot writing error msg") + return + + # get_size + print_debug ( "get_screenshot() scrot_size=%s" %(self.main.config.GetVar("scrot_size")) ) + + # write into statusbar + self.main.common.threads_enter("TcosActions::get_screenshot writing wait msg") + self.main.write_into_statusbar ( _("Trying to order terminal to do a screenshot...") ) + self.main.common.threads_leave("TcosActions::get_screenshot writing wait msg") + + # use Base64 screenshot + scrot=self.main.xmlrpc.getscreenshot( self.main.config.GetVar("scrot_size") ) + if scrot[0] != "ok": + #if not self.main.xmlrpc.screenshot( self.main.config.GetVar("scrot_size") ): + self.main.common.threads_enter("TcosActions::get_screenshot writing error msg") + self.main.write_into_statusbar( _("Can't make screenshot, error: %s") %scrot[1] ) + self.main.common.threads_leave("TcosActions::get_screenshot writing error msg") + return False + + slabel=_("Get another screenshot") + self.main.common.threads_enter("TcosActions::get_screenshot creating button") + self.main.another_screenshot_button=None + self.main.another_screenshot_button=gtk.Button(label=slabel ) + self.main.another_screenshot_button.connect("clicked", self.take_screenshot, ip) + self.main.another_screenshot_button.show() + self.main.common.threads_leave("TcosActions::get_screenshot creating button") + + + print_debug ( "get_screenshot() creating button..." ) + year, month, day, hour, minute, seconds ,wdy, yday, isdst= localtime() + datetxt="%02d/%02d/%4d %02d:%02d:%02d" %(day, month, year, hour, minute, seconds) + print_debug ( "get_screenshot() date=%s" %(datetxt) ) + + hostname=self.main.localdata.GetUsername(ip) + if hostname == shared.NO_LOGIN_MSG: + hostname=self.main.localdata.GetHostname(ip) + block_txt=_("Screenshot of <span style='font-style: italic'>%s</span>")%(hostname) + block_txt+="<span style='font-size: medium'> %s </span>" %(datetxt) + block_txt+="<span> </span><input type='button' name='self.main.another_screenshot_button' label='%s' />" %( slabel ) + + self.main.common.threads_enter("TcosActions::get_screenshot show capture") + #url="http://%s:%s/capture-thumb.jpg" %(ip, shared.httpd_port) + self.main.datatxt.clean() + self.main.datatxt.insert_block( block_txt ) + + #self.main.datatxt.insert_html( "<img src='%s' alt='%s'/>\n"\ + # %(url, _("Screenshot of %s" %(ip) )) ) + + # Use Base64 data + self.main.screenshots_action=self.on_screenshot_click + self.__screenshot_counter=0 + savedatetxt="%02d-%02d-%4d_%02d-%02d" %(day, month, year, hour, minute) + self.__screenshot_data["%s"%self.__screenshot_counter]={'hostname':hostname, 'ip':ip, 'date':savedatetxt} + self.main.datatxt.insert_html("""\n<img onclick="%s" base64="%s" />\n"""%(self.__screenshot_counter, scrot[1])) + + self.main.common.threads_leave("TcosActions::get_screenshot show capture") + + self.main.common.threads_enter("TcosActions::get_screenshot END") + self.main.datatxt.display() + self.main.write_into_statusbar ( _("Screenshot of %s, done.") %(ip) ) + self.main.common.threads_leave("TcosActions::get_screenshot END") + + return False + + def on_screenshot_click(self, eventbox, event, number, pixbuf): + if event.button == 3: + ip=self.__screenshot_data[number]['ip'] + self.main.force_selected_ip=ip + # right click show menu + self.main.menus.RightClickMenuOne( None , None, ip) + self.main.menu.popup( None, None, None, event.button, event.time) + return True + menu=gtk.Menu() + save_scrot = gtk.ImageMenuItem(_("Save Screenshot"), True) + icon = gtk.Image() + icon.set_from_stock (gtk.STOCK_SAVE, gtk.ICON_SIZE_BUTTON) + save_scrot.set_image(icon) + save_scrot.connect("activate", self.save_screenshot, number, pixbuf) + save_scrot.show() + menu.append(save_scrot) + menu.popup( None, None, None, event.button, event.time) + + def save_screenshot(self, image, number, pixbuf): + data=self.__screenshot_data[number] + + dialog = gtk.FileChooserDialog(title=_("Select file to save screenshot..."), + action=gtk.FILE_CHOOSER_ACTION_SAVE, + buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_SAVE,gtk.RESPONSE_OK)) + dialog.set_default_response(gtk.RESPONSE_OK) + dialog.set_current_name( _("screenshot_of_%(hostname)s_date_%(date)s.png") %{'hostname':data['hostname'], 'date':data['date']} ) + folder = _folder = os.environ['HOME'] + dialog.set_current_folder(folder) + _filter = gtk.FileFilter() + _filter.set_name( _("Image Files ( *.png, *.jpg)") ) + file_types=["*.png", "*.jpg"] + for elem in file_types: + _filter.add_pattern( elem ) + dialog.add_filter(_filter) + response = dialog.run() + if response == gtk.RESPONSE_OK: + filename=dialog.get_filename() + fext=filename.split('.')[-1] + if not fext in ['png', 'jpg']: + shared.error_msg( _("File must be png or jpg.") ) + dialog.destroy() + return + params={} +# if fext == "jpeg": +# {"quality":"100"} + pixbuf.save(filename, fext, params) + dialog.destroy() + + ########### MULTIPLE HOSTS ############### + + def take_all_screenshots(self, widget): + if not self.get_all_clients(): + return + self.main.screenshots_action=self.on_screenshot_click + self.main.worker=shared.Workers(self.main, None, None) + self.main.worker.set_for_all_action(self.action_for_clients, self.allclients, 'screenshot' ) + + + def start_action(self, *args): + self.__screenshot_counter=0 + self.__screenshot_data={} + self.main.datatxt.clean() + self.main.datatxt.insert_block( _("Screenshots of all hosts") ) + self.main.datatxt.insert_html("<br/>") + + def real_action(self, ip, action): + print_debug("real_action() ip=%s" %ip) + self.main.xmlrpc.newhost(ip) + scrot=self.main.xmlrpc.getscreenshot(self.main.config.GetVar("miniscrot_size")) + if scrot and scrot[0] == "ok": + self.__screenshot_counter+=1 + hostname=self.main.localdata.GetUsername(ip) + if hostname == shared.NO_LOGIN_MSG: + hostname=self.main.localdata.GetHostname(ip) + self.main.common.threads_enter("extensions/screenshot::real_action screenshot") + year, month, day, hour, minute, seconds ,wdy, yday, isdst= localtime() + savedatetxt="%02d-%02d-%4d_%02d-%02d" %(day, month, year, hour, minute) + self.__screenshot_data["%s"%self.__screenshot_counter]={'hostname':hostname, 'ip':ip, 'date':savedatetxt} + self.main.datatxt.insert_html( + "<span style='background-color:#f3d160'>" + + "\n\t<img onclick='%s' base64='%s' title='%s' title_rotate='90' /> " %(self.__screenshot_counter, scrot[1],_( "Screenshot of %s" ) %(hostname) ) + + "<span style='background-color:#f3d160; color:#f3d160'>__</span>\n</span>"+ + "") + self.main.common.threads_leave("extensions/screenshot::real_action screenshot") + + def finish_action(self, *args): + self.main.datatxt.display() + +__extclass__=Screenshot + + + + + + + + diff --git a/tcosmonitor/extensions/sendfiles.py b/tcosmonitor/extensions/sendfiles.py new file mode 100644 index 0000000..c43f10e --- /dev/null +++ b/tcosmonitor/extensions/sendfiles.py @@ -0,0 +1,275 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +""" template extension """ + +from gettext import gettext as _ + + +from tcosmonitor import shared +from tcosmonitor.TcosExtensions import TcosExtension +import netifaces + +from shutil import copy +import os +import gtk +import sys + +def print_debug(txt): + if shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + + +class SendFiles(TcosExtension): + def register(self): + self.main.actions.button_action_send=self.send_all + self.main.classview.class_external_send=self.send_external + + self.main.menus.register_simple( _("Send files") , "menu_send.png", 2, self.send_one, "send") + self.main.menus.register_all( _("Send files") , "menu_send.png", 2, self.send_all, "send") + + def get_ip_address(self, ifname): + print_debug("get_ip_address() ifname=%s" %(ifname) ) + if not ifname in netifaces.interfaces(): + return None + ip=netifaces.ifaddresses(ifname) + if ip.has_key(netifaces.AF_INET): + return ip[netifaces.AF_INET][0]['addr'] + return None + + def send_external(self, filenames): + if self.main.classview.ismultiple(): + if not self.get_all_clients(): + return + elif not self.get_client(): + return + # action sent by vidal_joshur at gva dot es + # send files + # search for connected users + if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: + shared.error_msg ( _("Can't send files, user is not logged") ) + return + + if not os.path.isdir("/tmp/tcos_share"): + shared.info_msg( _("TcosMonitor: FTP+TLS server is not running.") ) + return + + for filename in os.listdir("/tmp/tcos_share/"): + if os.path.isfile("/tmp/tcos_share/%s" %filename): + os.remove("/tmp/tcos_share/%s" %filename) + + open="True" + basenames = "" + for filename in filenames: + basenames += "%s\n" % ( os.path.basename(filename[7:]) ) + copy(filename[7:], "/tmp/tcos_share/") + os.chmod("/tmp/tcos_share/%s" %os.path.basename(filename[7:]), 0644) + self.main.write_into_statusbar( _("Waiting for send files...") ) + + newusernames=[] + + for user in self.connected_users: + if user.find(":") != -1: + usern, ip=user.split(":") + self.main.xmlrpc.newhost(ip) + server=self.main.xmlrpc.GetStandalone("get_server") + self.main.xmlrpc.DBus("sendfiles", "%s %s %s" %(_("Teacher"), server, open) ) + self.main.xmlrpc.DBus("mess", _("Teacher has sent some files to %(teacher)s folder:\n\n%(basenames)s") %{"teacher":_("Teacher"), "basenames":basenames}) + else: + newusernames.append(user) + + interface=self.main.config.GetVar("network_interface") + # maybe we the x remote display is other than tcosmonitor server + server=self.get_ip_address(interface) + result = self.main.dbus_action.do_sendfiles( newusernames , _("Teacher"), server, open) + + if not result: + shared.error_msg ( _("Error while exec remote app:\nReason:%s") %( self.main.dbus_action.get_error_msg() ) ) + self.main.write_into_statusbar( _("Error creating destination folder.") ) + else: + result = self.main.dbus_action.do_message(newusernames , + _("Teacher has sent some files to %(teacher)s folder:\n\n%(basenames)s") %{"teacher":_("Teacher"), "basenames":basenames} ) + + self.main.write_into_statusbar( _("Files sent.") ) + + + def send_one(self, widget, ip): + if not self.get_client(): + return + # action sent by vidal_joshur at gva dot es + # send files + # search for connected users + if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: + shared.error_msg ( _("Can't send files, user is not logged") ) + return + + str_scapes=[" ", "(", ")", "*", "!", "?", "\"", "`", "[", "]", "{", "}", ";", ":", ",", "=", "$"] + + dialog = gtk.FileChooserDialog( _("Select file or files..."), + None, + gtk.FILE_CHOOSER_ACTION_OPEN, + (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, + gtk.STOCK_OPEN, gtk.RESPONSE_OK)) + dialog.set_default_response(gtk.RESPONSE_OK) + #dialog.set_select_multiple(select_multiple) + dialog.set_select_multiple(True) + self.folder = self._folder = os.environ['HOME'] + dialog.set_current_folder(self.folder) + filter = gtk.FileFilter() + filter.set_name("All files") + filter.add_pattern("*") + dialog.add_filter(filter) + + + if not os.path.isdir("/tmp/tcos_share"): + shared.info_msg( _("TcosMonitor: FTP+TLS server is not running.") ) + return + + for filename in os.listdir("/tmp/tcos_share/"): + if os.path.isfile("/tmp/tcos_share/%s" %filename): + os.remove("/tmp/tcos_share/%s" %filename) + + response = dialog.run() + + if response == gtk.RESPONSE_OK: + + filenames = dialog.get_filenames() + + open="False" + basenames = "" + for filename in filenames: + basenames += "%s\n" % ( os.path.basename(filename) ) + copy(filename, "/tmp/tcos_share/") + os.chmod("/tmp/tcos_share/%s" %os.path.basename(filename), 0644) + self.main.write_into_statusbar( _("Waiting for send files...") ) + + msg=_( "Do you want open file(s) on client?" ) + if shared.ask_msg ( msg ): + open="True" + + newusernames=[] + + for user in self.connected_users: + if user.find(":") != -1: + #usern, ip=user.split(":") + #self.main.xmlrpc.newhost(ip) + server=self.main.xmlrpc.GetStandalone("get_server") + self.main.xmlrpc.DBus("sendfiles", "%s %s %s" %(_("Teacher"), server, open) ) + self.main.xmlrpc.DBus("mess", _("Teacher has sent some files to %(teacher)s folder:\n\n%(basenames)s") %{"teacher":_("Teacher"), "basenames":basenames}) + else: + newusernames.append(user) + + interface=self.main.config.GetVar("network_interface") + # maybe we the x remote display is other than tcosmonitor server + server=self.get_ip_address(interface) + result = self.main.dbus_action.do_sendfiles( newusernames , _("Teacher"), server, open) + + if not result: + shared.error_msg ( _("Error while exec remote app:\nReason:%s") %( self.main.dbus_action.get_error_msg() ) ) + self.main.write_into_statusbar( _("Error creating destination folder.") ) + else: + result = self.main.dbus_action.do_message(newusernames , + _("Teacher has sent some files to %(teacher)s folder:\n\n%(basenames)s") %{"teacher":_("Teacher"), "basenames":basenames} ) + self.main.write_into_statusbar( _("Files sent.") ) + dialog.destroy() + + def send_all(self, *args): + if not self.get_all_clients(): + return + # action sent by vidal_joshur at gva dot es + # send files + # search for connected users + if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: + shared.error_msg( _("No users logged.") ) + return + + str_scapes=[" ", "(", ")", "*", "!", "?", "\"", "`", "[", "]", "{", "}", ";", ":", ",", "=", "$"] + + dialog = gtk.FileChooserDialog( _("Select file or files..."), + None, + gtk.FILE_CHOOSER_ACTION_OPEN, + (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, + gtk.STOCK_OPEN, gtk.RESPONSE_OK)) + dialog.set_default_response(gtk.RESPONSE_OK) + #dialog.set_select_multiple(select_multiple) + dialog.set_select_multiple(True) + self.folder = self._folder = os.environ['HOME'] + dialog.set_current_folder(self.folder) + filter = gtk.FileFilter() + filter.set_name("All files") + filter.add_pattern("*") + dialog.add_filter(filter) + + + if not os.path.isdir("/tmp/tcos_share"): + shared.info_msg( _("TcosMonitor: FTP+TLS server is not running.") ) + return + + for filename in os.listdir("/tmp/tcos_share/"): + if os.path.isfile("/tmp/tcos_share/%s" %filename): + os.remove("/tmp/tcos_share/%s" %filename) + + response = dialog.run() + + if response == gtk.RESPONSE_OK: + + filenames = dialog.get_filenames() + + open="False" + basenames = "" + for filename in filenames: + basenames += "%s\n" % ( os.path.basename(filename) ) + copy(filename, "/tmp/tcos_share/") + os.chmod("/tmp/tcos_share/%s" %os.path.basename(filename), 0644) + self.main.write_into_statusbar( _("Waiting for send files...") ) + + msg=_( "Do you want open file(s) on client?" ) + if shared.ask_msg ( msg ): + open="True" + + newusernames=[] + + for user in self.connected_users: + if user.find(":") != -1: + usern, ip=user.split(":") + self.main.xmlrpc.newhost(ip) + server=self.main.xmlrpc.GetStandalone("get_server") + self.main.xmlrpc.DBus("sendfiles", "%s %s %s" %(_("Teacher"), server, open) ) + self.main.xmlrpc.DBus("mess", _("Teacher has sent some files to %(teacher)s folder:\n\n%(basenames)s") %{"teacher":_("Teacher"), "basenames":basenames}) + else: + newusernames.append(user) + + interface=self.main.config.GetVar("network_interface") + # maybe we the x remote display is other than tcosmonitor server + server=self.get_ip_address(interface) + result = self.main.dbus_action.do_sendfiles( newusernames , _("Teacher"), server, open) + + if not result: + shared.error_msg ( _("Error while exec remote app:\nReason:%s") %( self.main.dbus_action.get_error_msg() ) ) + self.main.write_into_statusbar( _("Error creating destination folder.") ) + else: + result = self.main.dbus_action.do_message(newusernames , + _("Teacher has sent some files to %(teacher)s folder:\n\n%(basenames)s") %{"teacher":_("Teacher"), "basenames":basenames} ) + + self.main.write_into_statusbar( _("Files sent.") ) + dialog.destroy() + + +__extclass__=SendFiles diff --git a/tcosmonitor/extensions/tcosnetcontroller.py b/tcosmonitor/extensions/tcosnetcontroller.py new file mode 100644 index 0000000..ff31be7 --- /dev/null +++ b/tcosmonitor/extensions/tcosnetcontroller.py @@ -0,0 +1,188 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +""" template extension """ +from gettext import gettext as _ +import sys + +from tcosmonitor import shared +from tcosmonitor.TcosExtensions import TcosExtension + +def print_debug(txt): + if shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + + +class TcosNetController(TcosExtension): + def register(self): + self.main.menus.register_simple( _("Lock internet"), "menu_locknet.png", 1, self.locknet_simple, "net") + self.main.menus.register_simple( _("Unlock internet"), "menu_unlocknet.png", 1, self.unlocknet_simple, "net") + + self.main.menus.register_all( _("Lock internet in all connected users"), "menu_locknet.png", 1, self.locknet_all, "net") + self.main.menus.register_all( _("Unlock internet in all connected users"), "menu_unlocknet.png", 1, self.unlocknet_all, "net") + + def locknet_simple(self, w, ip): + if not self.get_client(): + return + # lock net + eth=self.main.config.GetVar("network_interface") + ports="--ports=%s" %self.main.config.GetVar("ports_tnc") + remote_msg=_("Internet connection has been disabled") + act="disable-internet" + + if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: + shared.error_msg ( _("Can't disable internet, user is not logged") ) + return + + if self.client_type == "tcos": + if not self.main.localdata.user_in_group(None, 'tcos'): + msg=(_("In order to lock and unlock internet you need to be in 'tcos' group.\n\nExe by root: adduser %s tcos" ) %(self.main.localdata.get_username())) + shared.error_msg ( msg ) + return + result = self.main.localdata.BlockNet(act, self.connected_users[0], ports, eth) + if result == "disabled": + self.main.dbus_action.do_message( self.connected_users, remote_msg ) + else: + result = self.main.xmlrpc.tnc(act, self.connected_users[0].split(":")[0], ports) + if result == "disabled": + self.main.xmlrpc.DBus("mess", remote_msg) + + self.change_lockscreen(ip) + + + def unlocknet_simple(self, w, ip): + if not self.get_client(): + return + # unlock net + remote_msg=_("Internet connection has been enabled") + act="enable-internet" + + if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: + shared.error_msg ( _("Can't enable internet, user is not logged") ) + return + if self.client_type == "tcos": + if not self.main.localdata.user_in_group(None, 'tcos'): + msg=(_("In order to lock and unlock internet you need to be in 'tcos' group.\n\nExe by root: adduser %s tcos" ) %(self.main.localdata.get_username())) + shared.error_msg ( msg ) + return + result = self.main.localdata.BlockNet(act, self.connected_users[0]) + if result == "enabled": + self.main.dbus_action.do_message( self.connected_users, remote_msg ) + else: + result = self.main.xmlrpc.tnc(act, self.connected_users[0].split(":")[0]) + if result == "enabled": + self.main.xmlrpc.DBus("mess", remote_msg) + + self.change_lockscreen(ip) + + + def locknet_all(self, *args): + if not self.get_all_clients(): + return + if not self.main.localdata.user_in_group(None, 'tcos'): + msg=(_("In order to lock and unlock internet you need to be in 'tcos' group.\n\nExe by root: adduser %s tcos" ) %(self.main.localdata.get_username())) + shared.error_msg ( msg ) + return + # disable internet + eth=self.main.config.GetVar("network_interface") + ports="--ports=%s" %self.main.config.GetVar("ports_tnc") + remote_msg=_("Internet connection has been disabled") + act="disable-internet" + + if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: + shared.error_msg( _("No users logged.") ) + return + + msg=_( _("Do you want disable internet to following users: %s?" )%(self.connected_users_txt) ) + + if not shared.ask_msg ( msg ): + return + + newusernames=[] + + for user in self.connected_users: + if user.find(":") != -1: + usern, ip=user.split(":") + self.main.xmlrpc.newhost(ip) + result = self.main.xmlrpc.tnc(act, usern, ports) + if result == "disabled": + self.main.xmlrpc.DBus("mess", remote_msg) + else: + result = self.main.localdata.BlockNet(act, user, ports, eth) + if result == "disabled": + newusernames.append(user) + + result = self.main.dbus_action.do_message( newusernames, remote_msg ) + + for client in self.newallclients: + self.main.localdata.newhost(client) + self.main.xmlrpc.newhost(client) + self.change_lockscreen(client) + + + def unlocknet_all(self, *args): + if not self.get_all_clients(): + return + if not self.main.localdata.user_in_group(None, 'tcos'): + msg=(_("In order to lock and unlock internet you need to be in 'tcos' group.\n\nExe by root: adduser %s tcos" ) %(self.main.localdata.get_username())) + shared.error_msg ( msg ) + return + # enable internet + remote_msg=_("Internet connection has been enabled") + act="enable-internet" + + if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: + shared.error_msg( _("No users logged.") ) + return + + msg=_( _("Do you want enable internet to following users: %s?" )%(self.connected_users_txt) ) + + if not shared.ask_msg ( msg ): + return + + newusernames=[] + + for user in self.connected_users: + if user.find(":") != -1: + usern, ip=user.split(":") + self.main.xmlrpc.newhost(ip) + result = self.main.xmlrpc.tnc(act, usern) + if result == "enabled": + self.main.xmlrpc.DBus("mess", remote_msg) + else: + result = self.main.localdata.BlockNet(act, user) + if result == "enabled": + newusernames.append(user) + + result = self.main.dbus_action.do_message( newusernames, remote_msg ) + + for client in self.newallclients: + self.main.localdata.newhost(client) + self.main.xmlrpc.newhost(client) + self.change_lockscreen(client) + + +__extclass__=TcosNetController + + + + + + diff --git a/tcosmonitor/extensions/tcospersonalize.py b/tcosmonitor/extensions/tcospersonalize.py new file mode 100644 index 0000000..14b574f --- /dev/null +++ b/tcosmonitor/extensions/tcospersonalize.py @@ -0,0 +1,61 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +""" template extension """ + +from gettext import gettext as _ +import os +import sys + +from tcosmonitor import shared +from tcosmonitor.TcosExtensions import TcosExtension + +def print_debug(txt): + if shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + + +class TcosPersonalize(TcosExtension): + def register(self): + self.main.menus.register_simple( _("Configure this host"), "menu_configure.png", 0, self.launch_tcospersonalize, "personalize") + + + def launch_tcospersonalize(self, w, ip): + if not self.get_client(): + return + if self.client_type == "tcos": + if self.main.ingroup_tcos == False and os.getuid() != 0: + cmd="gksu \"tcospersonalize --host=%s\"" %(ip) + else: + cmd="tcospersonalize --host=%s" %(ip) + print_debug ( "launch_tcospersonalize() cmd=%s" %(cmd) ) + th=self.main.common.exe_cmd( cmd, verbose=0, background=True ) + else: + shared.info_msg( _("%s is not supported to personalize!") %(self.client_type) ) + + + +__extclass__=TcosPersonalize + + + + + + diff --git a/tcosmonitor/extensions/videolan.py b/tcosmonitor/extensions/videolan.py new file mode 100644 index 0000000..3824d1f --- /dev/null +++ b/tcosmonitor/extensions/videolan.py @@ -0,0 +1,648 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +""" template extension """ + +from gettext import gettext as _ +import sys + +from tcosmonitor import shared +from tcosmonitor.TcosExtensions import TcosExtension + +import os +import gtk +import subprocess +import signal + +def print_debug(txt): + if shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + + +class VideoOne(TcosExtension): + def register(self): + self.vlc_count={} + self.main.classview.class_external_video=self.video_external + self.main.actions.button_action_video=self.video_all + + self.main.menus.register_simple( _("Send Audio/Video broadcast") , "menu_broadcast.png", 2, self.video_one, "video") + self.main.menus.register_all( _("Send Audio/Video broadcast") , "menu_broadcast.png", 2, self.video_all, "video") + + + + def video_external(self, filename): + if self.main.classview.ismultiple(): + if not self.get_all_clients(): + return + elif not self.get_client(): + return + # action sent by vidal_joshur at gva dot es + # start video broadcast mode + # Stream to single client unicast + eth=self.main.config.GetVar("network_interface") + + if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: + shared.error_msg ( _("Can't send video broadcast, user is not logged") ) + return + + str_scapes=[" ", "(", ")", "*", "!", "?", "\"", "`", "[", "]", "{", "}", ";", ":", ",", "=", "$"] + lock="disable" + volume="85" + + if self.main.pref_vlc_method_send.get_active() == 0: + vcodec=shared.vcodecs[0] + venc=shared.vencs[0] + acodec=shared.acodecs[0] + aenc=shared.aencs[0] + access=shared.accesss[0] + mux=shared.muxs[0] + elif self.main.pref_vlc_method_send.get_active() == 1: + vcodec=shared.vcodecs[1] + venc=shared.vencs[0] + acodec=shared.acodecs[0] + aenc=shared.aencs[0] + access=shared.accesss[0] + mux=shared.muxs[0] + elif self.main.pref_vlc_method_send.get_active() == 2: + vcodec=shared.vcodecs[2] + venc=shared.vencs[1] + acodec=shared.acodecs[0] + aenc=shared.aencs[0] + access=shared.accesss[0] + mux=shared.muxs[0] + elif self.main.pref_vlc_method_send.get_active() == 3: + vcodec=shared.vcodecs[3] + venc=shared.vencs[2] + acodec=shared.acodecs[1] + aenc=shared.aencs[1] + access=shared.accesss[1] + mux=shared.muxs[1] + elif self.main.pref_vlc_method_send.get_active() == 4: + vcodec=shared.vcodecs[1] + venc=shared.vencs[0] + acodec=shared.acodecs[1] + aenc=shared.aencs[1] + access=shared.accesss[1] + mux=shared.muxs[1] + + if access == "udp": + max_uip=255 + uip=0 + while uip <= max_uip: + uip_cmd="239.254.%s.0" %(uip) + cmd=("LC_ALL=C LC_MESSAGES=C netstat -putan 2>/dev/null | grep -c %s" %(uip_cmd) ) + print_debug("Check broadcast ip %s." %(uip_cmd) ) + output=self.main.common.exe_cmd(cmd) + uip+=1 + if output == "0": + print_debug("Broadcast ip found: %s" %(uip_cmd)) + ip_broadcast="%s:1234" %uip_cmd + break + elif uip == max_uip: + print_debug("Not found an available broadcast ip") + return + else: + max_uip=50255 + uip=50000 + while uip <= max_uip: + uip_cmd=":%s" %(uip) + cmd=("LC_ALL=C LC_MESSAGES=C netstat -putan 2>/dev/null | grep -c %s" %(uip_cmd) ) + print_debug("Check broadcast ip %s." %(uip_cmd) ) + output=self.main.common.exe_cmd(cmd) + uip+=1 + if output == "0": + print_debug("Broadcast ip found: %s" %(uip_cmd)) + ip_broadcast=uip_cmd + uip_cmd="" + break + elif uip == max_uip: + print_debug("Not found an available broadcast ip") + return + + if uip_cmd != "": + result = self.main.localdata.Route("route-add", uip_cmd, "255.255.255.0", eth) + if result == "error": + print_debug("Add multicast-ip route failed") + return + + if filename.find(" ") != -1: + msg=_("Not allowed white spaces in \"%s\".\nPlease rename it." %os.path.basename(filename) ) + shared.info_msg( msg ) + return + + if access == "udp": + remote_cmd_standalone="vlc udp://@%s --udp-caching=1000 --aout=alsa --brightness=2.000000 --volume=300 --fullscreen --aspect-ratio=4:3 --loop" %(ip_broadcast) + remote_cmd_thin="vlc udp://@%s --udp-caching=1000 --aout=alsa --brightness=2.000000 --volume=300 --aspect-ratio=4:3 --loop" %(ip_broadcast) + + p=subprocess.Popen(["vlc", "file://%s" %filename, "--sout=#duplicate{dst=display{delay=1000},dst=\"transcode{vcodec=%s,venc=%s,acodec=%s,aenc=%s,vb=800,ab=112,channels=2,soverlay}:standard{access=%s,mux=%s,dst=%s}\"}" %(vcodec, venc, acodec, aenc, access, mux, ip_broadcast), "--miface=%s" %eth, "--ttl=12", "--brightness=2.000000"], shell=False, bufsize=0, close_fds=True) + + self.main.write_into_statusbar( _("Waiting for start video transmission...") ) + + #msg=_("First select the DVD chapter or play movie\nthen press enter to send client..." ) + #shared.info_msg( msg ) + + # check if vlc is running or fail like check ping in demo mode + running = p.poll() is None + if not running: + self.main.write_into_statusbar( _("Error while exec app")) + return + + #msg=_( "Lock keyboard and mouse on client?" ) + #if shared.ask_msg ( msg ): + # lock="enable" + + newusernames=[] + + for user in self.connected_users: + if user.find(":") != -1: + # we have a standalone user... + usern, ip = user.split(":") + self.main.xmlrpc.newhost(ip) + if access == "http": + server=self.main.xmlrpc.GetStandalone("get_server") + remote_cmd_standalone="vlc http://%s%s --aout=alsa --brightness=2.000000 --volume=300 --fullscreen --aspect-ratio=4:3 --http-reconnect --loop" %(server, ip_broadcast) + self.main.xmlrpc.DBus("exec", remote_cmd_standalone ) + else: + newusernames.append(user) + + if access == "http": + remote_cmd_thin="vlc http://localhost%s --aout=alsa --brightness=2.000000 --volume=300 --aspect-ratio=4:3 --http-reconnect --loop" % (ip_broadcast) + + result = self.main.dbus_action.do_exec( newusernames, remote_cmd_thin ) + + if not result: + shared.error_msg ( _("Error while exec remote app:\nReason:%s") %( self.main.dbus_action.get_error_msg() ) ) + + for client in self.newallclients: + self.main.xmlrpc.vlc( client, volume, lock ) + + self.main.write_into_statusbar( _("Running in broadcast video transmission.") ) + # new mode to Stop Button + if len(self.vlc_count.keys()) != 0: + count=len(self.vlc_count.keys())-1 + nextkey=self.vlc_count.keys()[count]+1 + self.vlc_count[nextkey]=uip_cmd + else: + nextkey=1 + self.vlc_count[nextkey]=uip_cmd + self.add_progressbox( {"target": "vlc", "pid":p.pid, "lock":lock, "allclients":self.newallclients, "ip":uip_cmd, "iface":eth, "key":nextkey}, _("Running in broadcast video transmission to user %(host)s. Broadcast Nº %(count)s") %{"host":self.connected_users_txt, "count":nextkey} ) + + def video_one(self, widget, ip): + if not self.get_client(): + return + # action sent by vidal_joshur at gva dot es + # start video broadcast mode + # Stream to single client unicast + eth=self.main.config.GetVar("network_interface") + + if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: + shared.error_msg ( _("Can't send video broadcast, user is not logged") ) + return + + str_scapes=[" ", "(", ")", "*", "!", "?", "\"", "`", "[", "]", "{", "}", ";", ":", ",", "=", "$"] + lock="disable" + volume="85" + + if self.main.pref_vlc_method_send.get_active() == 0: + vcodec=shared.vcodecs[0] + venc=shared.vencs[0] + acodec=shared.acodecs[0] + aenc=shared.aencs[0] + access=shared.accesss[0] + mux=shared.muxs[0] + elif self.main.pref_vlc_method_send.get_active() == 1: + vcodec=shared.vcodecs[1] + venc=shared.vencs[0] + acodec=shared.acodecs[0] + aenc=shared.aencs[0] + access=shared.accesss[0] + mux=shared.muxs[0] + elif self.main.pref_vlc_method_send.get_active() == 2: + vcodec=shared.vcodecs[2] + venc=shared.vencs[1] + acodec=shared.acodecs[0] + aenc=shared.aencs[0] + access=shared.accesss[0] + mux=shared.muxs[0] + elif self.main.pref_vlc_method_send.get_active() == 3: + vcodec=shared.vcodecs[3] + venc=shared.vencs[2] + acodec=shared.acodecs[1] + aenc=shared.aencs[1] + access=shared.accesss[1] + mux=shared.muxs[1] + elif self.main.pref_vlc_method_send.get_active() == 4: + vcodec=shared.vcodecs[1] + venc=shared.vencs[0] + acodec=shared.acodecs[1] + aenc=shared.aencs[1] + access=shared.accesss[1] + mux=shared.muxs[1] + + + if access == "udp": + if self.client_type == "tcos": + max_uip=255 + uip=0 + while uip <= max_uip: + uip_cmd="239.254.%s.0" %(uip) + cmd=("LC_ALL=C LC_MESSAGES=C netstat -putan 2>/dev/null | grep -c %s" %(uip_cmd) ) + print_debug("Check broadcast ip %s." %(uip_cmd) ) + output=self.main.common.exe_cmd(cmd) + uip+=1 + if output == "0": + print_debug("Broadcast ip found: %s" %(uip_cmd)) + ip_unicast="%s:1234" %uip_cmd + break + elif uip == max_uip: + print_debug("Not found an available broadcast ip") + return + remote_cmd="vlc udp://@%s --udp-caching=1000 --aout=alsa --brightness=2.000000 --volume=300 --aspect-ratio=4:3 --loop" %(ip_unicast) + else: + uip_cmd="" + ip_unicast="%s:1234" %self.main.selected_ip + remote_cmd="vlc udp://@:1234 --udp-caching=1000 --aout=alsa --brightness=2.000000 --volume=300 --fullscreen --aspect-ratio=4:3 --loop" + else: + max_uip=50255 + uip=50000 + while uip <= max_uip: + uip_cmd=":%s" %(uip) + cmd=("LC_ALL=C LC_MESSAGES=C netstat -putan 2>/dev/null | grep -c %s" %(uip_cmd) ) + print_debug("Check broadcast ip %s." %(uip_cmd) ) + output=self.main.common.exe_cmd(cmd) + uip+=1 + if output == "0": + print_debug("Broadcast ip found: %s" %(uip_cmd)) + ip_unicast=uip_cmd + uip_cmd="" + break + elif uip == max_uip: + print_debug("Not found an available broadcast ip") + return + if self.client_type == "tcos": + remote_cmd="vlc http://localhost%s --aout=alsa --brightness=2.000000 --volume=300 --aspect-ratio=4:3 --http-reconnect --loop" %(ip_unicast) + + if uip_cmd != "": + result = self.main.localdata.Route("route-add", uip_cmd, "255.255.255.0", eth) + if result == "error": + print_debug("Add multicast-ip route failed") + return + + dialog = gtk.FileChooserDialog(_("Select audio/video file.."), + None, + gtk.FILE_CHOOSER_ACTION_OPEN, + (_("Play DVD"), 1, + _("Play SVCD/VCD"), 2, + _("Play AudioCD"), 3, + gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, + gtk.STOCK_OPEN, gtk.RESPONSE_OK)) + dialog.set_default_response(gtk.RESPONSE_OK) + self.folder = self._folder = os.environ['HOME'] + dialog.set_current_folder(self.folder) + filter = gtk.FileFilter() + filter.set_name("Media Files ( *.avi, *.mpg, *.mpeg, *.mp3, *.wav, etc.. )") + file_types=["*.avi", "*.mpg", "*.mpeg", "*.ogg", "*.ogm", "*.asf", "*.divx", + "*.wmv", "*.vob", "*.m2v", "*.m4v", "*.mp2", "*.mp4", "*.ac3", + "*.ogg", "*.mp1", "*.mp2", "*.mp3", "*.wav", "*.wma"] + for elem in file_types: + filter.add_pattern( elem ) + + dialog.add_filter(filter) + + filter = gtk.FileFilter() + filter.set_name("All Files") + filter.add_pattern("*.*") + dialog.add_filter(filter) + response = dialog.run() + if response == gtk.RESPONSE_OK or response == 1 or response == 2 or response == 3: + + filename=dialog.get_filename() + dialog.destroy() + + #for scape in str_scapes: + # filename=filename.replace("%s" %scape, "\%s" %scape) + + if response == gtk.RESPONSE_OK: + if filename.find(" ") != -1: + msg=_("Not allowed white spaces in \"%s\".\nPlease rename it." %os.path.basename(filename) ) + shared.info_msg( msg ) + return + p=subprocess.Popen(["vlc", "file://%s" %filename, "--sout=#duplicate{dst=display{delay=1000},dst=\"transcode{vcodec=%s,venc=%s,acodec=%s,aenc=%s,vb=800,ab=112,channels=2,soverlay}:standard{access=%s,mux=%s,dst=%s}\"}" %(vcodec, venc, acodec, aenc, access, mux, ip_unicast), "--miface=%s" %eth, "--ttl=12", "--brightness=2.000000"], shell=False, bufsize=0, close_fds=True) + elif response == 1: + p=subprocess.Popen(["vlc", "dvdsimple:///dev/cdrom", "--sout=#duplicate{dst=display{delay=700},dst=\"transcode{vcodec=%s,venc=%s,acodec=%s,aenc=%s,vb=800,ab=112,channels=2,soverlay}:standard{access=%s,mux=%s,dst=%s}\"}" %(vcodec, venc, acodec, aenc, access, mux, ip_unicast), "--miface=%s" %eth, "--ttl=12", "--loop", "--brightness=2.000000"], shell=False, bufsize=0, close_fds=True) + elif response == 2: + p=subprocess.Popen(["vlc", "vcd:///dev/cdrom", "--sout=#duplicate{dst=display{delay=1000},dst=\"transcode{vcodec=%s,venc=%s,acodec=%s,aenc=%s,vb=800,ab=112,channels=2,soverlay}:standard{access=%s,mux=%s,dst=%s}\"}" %(vcodec, venc, acodec, aenc, access, mux, ip_unicast), "--miface=%s" %eth, "--ttl=12", "--brightness=2.000000"], shell=False, bufsize=0, close_fds=True) + elif response == 3: + p=subprocess.Popen(["vlc", "cdda:///dev/cdrom", "--sout=#duplicate{dst=display,dst=\"transcode{vcodec=%s,venc=%s,acodec=%s,aenc=%s,vb=200,ab=112,channels=2}:standard{access=%s,mux=%s,dst=%s}\"}" %(vcodec, venc, acodec, aenc, access, mux, ip_unicast), "--miface=%s" %eth, "--ttl=12"], shell=False, bufsize=0, close_fds=True) + # exec this app on client + + self.main.write_into_statusbar( _("Waiting for start video transmission...") ) + + msg=_("First select the DVD chapter or play movie\nthen press enter to send clients..." ) + shared.info_msg( msg ) + + # check if vlc is running or fail like check ping in demo mode + running = p.poll() is None + if not running: + self.main.write_into_statusbar( _("Error while exec app")) + return + + msg=_( "Lock keyboard and mouse on client?" ) + if shared.ask_msg ( msg ): + lock="enable" + + newusernames=[] + + for user in self.connected_users: + if user.find(":") != -1: + # we have a standalone user... + if access == "http": + server=self.main.xmlrpc.GetStandalone("get_server") + remote_cmd="vlc http://%s%s --aout=alsa --brightness=2.000000 --volume=300 --fullscreen --aspect-ratio=4:3 --http-reconnect --loop" %(server, ip_unicast) + self.main.xmlrpc.DBus("exec", remote_cmd ) + else: + newusernames.append(user) + + result = self.main.dbus_action.do_exec( newusernames, remote_cmd ) + + if not result: + shared.error_msg ( _("Error while exec remote app:\nReason:%s") %( self.main.dbus_action.get_error_msg() ) ) + + self.main.xmlrpc.vlc( self.main.selected_ip, volume, lock ) + + self.main.write_into_statusbar( _("Running in broadcast video transmission.") ) + # new mode to Stop Button + if len(self.vlc_count.keys()) != 0: + count=len(self.vlc_count.keys())-1 + nextkey=self.vlc_count.keys()[count]+1 + self.vlc_count[nextkey]=uip_cmd + else: + nextkey=1 + self.vlc_count[nextkey]=uip_cmd + self.add_progressbox( {"target": "vlc", "pid":p.pid, "lock":lock, "allclients":self.newallclients, "ip":uip_cmd, "iface":eth, "key":nextkey}, _("Running in broadcast video transmission to user %(host)s. Broadcast Nº %(count)s") %{"host":self.connected_users_txt, "count":nextkey} ) + else: + dialog.destroy() + + def on_progressbox_click(self, widget, args, box): + box.destroy() + print_debug("on_progressbox_click() widget=%s, args=%s, box=%s" %(widget, args, box) ) + + if not args['target']: + return + + self.main.stop_running_actions.remove(widget) + + if args['target'] == "vlc": + del self.vlc_count[args['key']] + if args['ip'] != "": + result = self.main.localdata.Route("route-del", args['ip'], "255.255.255.0", args['iface']) + if result == "error": + print_debug("Del multicast-ip route failed") + connected_users=[] + for client in args['allclients']: + self.main.localdata.newhost(client) + if self.main.localdata.IsLogged(client): + if args['lock'] == "enable": + self.main.xmlrpc.unlockcontroller("lockvlc", client) + connected_users.append(self.main.localdata.GetUsernameAndHost(client)) + + newusernames=[] + + for user in connected_users: + if user.find(":") != -1: + # we have a standalone user... in some cases or after much time need SIGKILL vlc + usern, ip = user.split(":") + self.main.xmlrpc.newhost(ip) + self.main.xmlrpc.DBus("killall", "-s KILL vlc" ) + else: + newusernames.append(user) + + result = self.main.dbus_action.do_killall( newusernames , "-s KILL vlc" ) + + if "pid" in args: + os.kill(args['pid'], signal.SIGKILL) + else: + self.main.common.exe_cmd("killall -s KILL vlc", verbose=0, background=True) + self.main.write_into_statusbar( _("Video broadcast stopped.") ) + + + def video_all(self, *args): + if not self.get_all_clients(): + return + # action sent by vidal_joshur at gva dot es + # start video broadcast mode + # search for connected users + # Stream to multiple clients + eth=self.main.config.GetVar("network_interface") + + if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: + shared.error_msg( _("No users logged.") ) + return + + str_scapes=[" ", "(", ")", "*", "!", "?", "\"", "`", "[", "]", "{", "}", ";", ":", ",", "=", "$"] + + if self.main.pref_vlc_method_send.get_active() == 0: + vcodec=shared.vcodecs[0] + venc=shared.vencs[0] + acodec=shared.acodecs[0] + aenc=shared.aencs[0] + access=shared.accesss[0] + mux=shared.muxs[0] + elif self.main.pref_vlc_method_send.get_active() == 1: + vcodec=shared.vcodecs[1] + venc=shared.vencs[0] + acodec=shared.acodecs[0] + aenc=shared.aencs[0] + access=shared.accesss[0] + mux=shared.muxs[0] + elif self.main.pref_vlc_method_send.get_active() == 2: + vcodec=shared.vcodecs[2] + venc=shared.vencs[1] + acodec=shared.acodecs[0] + aenc=shared.aencs[0] + access=shared.accesss[0] + mux=shared.muxs[0] + elif self.main.pref_vlc_method_send.get_active() == 3: + vcodec=shared.vcodecs[3] + venc=shared.vencs[2] + acodec=shared.acodecs[1] + aenc=shared.aencs[1] + access=shared.accesss[1] + mux=shared.muxs[1] + elif self.main.pref_vlc_method_send.get_active() == 4: + vcodec=shared.vcodecs[1] + venc=shared.vencs[0] + acodec=shared.acodecs[1] + aenc=shared.aencs[1] + access=shared.accesss[1] + mux=shared.muxs[1] + + if access == "udp": + max_uip=255 + uip=0 + while uip <= max_uip: + uip_cmd="239.254.%s.0" %(uip) + cmd=("LC_ALL=C LC_MESSAGES=C netstat -putan 2>/dev/null | grep -c %s" %(uip_cmd) ) + print_debug("Check broadcast ip %s." %(uip_cmd) ) + output=self.main.common.exe_cmd(cmd) + uip+=1 + if output == "0": + print_debug("Broadcast ip found: %s" %(uip_cmd)) + ip_broadcast="%s:1234" %uip_cmd + break + elif uip == max_uip: + print_debug("Not found an available broadcast ip") + return + else: + max_uip=50255 + uip=50000 + while uip <= max_uip: + uip_cmd=":%s" %(uip) + cmd=("LC_ALL=C LC_MESSAGES=C netstat -putan 2>/dev/null | grep -c %s" %(uip_cmd) ) + print_debug("Check broadcast ip %s." %(uip_cmd) ) + output=self.main.common.exe_cmd(cmd) + uip+=1 + if output == "0": + print_debug("Broadcast ip found: %s" %(uip_cmd)) + ip_broadcast=uip_cmd + uip_cmd="" + break + elif uip == max_uip: + print_debug("Not found an available broadcast ip") + return + + lock="disable" + volume="85" + + if uip_cmd != "": + result = self.main.localdata.Route("route-add", uip_cmd, "255.255.255.0", eth) + if result == "error": + print_debug("Add multicast-ip route failed") + return + + dialog = gtk.FileChooserDialog(_("Select audio/video file.."), + None, + gtk.FILE_CHOOSER_ACTION_OPEN, + (_("Play DVD"), 1, + _("Play SVCD/VCD"), 2, + _("Play AudioCD"), 3, + gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, + gtk.STOCK_OPEN, gtk.RESPONSE_OK)) + dialog.set_default_response(gtk.RESPONSE_OK) + self.folder = self._folder = os.environ['HOME'] + dialog.set_current_folder(self.folder) + filter = gtk.FileFilter() + filter.set_name("Media Files ( *.avi, *.mpg, *.mpeg, *.mp3, *.wav, etc.. )") + file_types=["*.avi", "*.mpg", "*.mpeg", "*.ogg", "*.ogm", "*.asf", "*.divx", + "*.wmv", "*.vob", "*.m2v", "*.m4v", "*.mp2", "*.mp4", "*.ac3", + "*.ogg", "*.mp1", "*.mp2", "*.mp3", "*.wav", "*.wma"] + for elem in file_types: + filter.add_pattern( elem ) + + dialog.add_filter(filter) + + filter = gtk.FileFilter() + filter.set_name("All Files") + filter.add_pattern("*.*") + dialog.add_filter(filter) + + response = dialog.run() + if response == gtk.RESPONSE_OK or response == 1 or response == 2 or response == 3: + + filename=dialog.get_filename() + dialog.destroy() + + #for scape in str_scapes: + # filename=filename.replace("%s" %scape, "\%s" %scape) + + if response == gtk.RESPONSE_OK: + if filename.find(" ") != -1: + msg=_("Not allowed white spaces in \"%s\".\nPlease rename it." %os.path.basename(filename) ) + shared.info_msg( msg ) + return + p=subprocess.Popen(["vlc", "file://%s" %filename, "--sout=#duplicate{dst=display{delay=1000},dst=\"transcode{vcodec=%s,venc=%s,acodec=%s,aenc=%s,vb=800,ab=112,channels=2,soverlay}:standard{access=%s,mux=%s,dst=%s}\"}" %(vcodec, venc, acodec, aenc, access, mux, ip_broadcast), "--miface=%s" %eth, "--ttl=12", "--brightness=2.000000"], shell=False, bufsize=0, close_fds=True) + elif response == 1: + p=subprocess.Popen(["vlc", "dvdsimple:///dev/cdrom", "--sout=#duplicate{dst=display{delay=700},dst=\"transcode{vcodec=%s,venc=%s,acodec=%s,aenc=%s,vb=800,ab=112,channels=2,soverlay}:standard{access=%s,mux=%s,dst=%s}\"}" %(vcodec, venc, acodec, aenc, access, mux, ip_broadcast), "--miface=%s" %eth, "--ttl=12", "--loop", "--brightness=2.000000"], shell=False, bufsize=0, close_fds=True) + elif response == 2: + p=subprocess.Popen(["vlc", "vcd:///dev/cdrom", "--sout=#duplicate{dst=display{delay=1000},dst=\"transcode{vcodec=%s,venc=%s,acodec=%s,aenc=%s,vb=800,ab=112,channels=2,soverlay}:standard{access=%s,mux=%s,dst=%s}\"}" %(vcodec, venc, acodec, aenc, access, mux, ip_broadcast), "--miface=%s" %eth, "--ttl=12", "--brightness=2.000000"], shell=False, bufsize=0, close_fds=True) + elif response == 3: + p=subprocess.Popen(["vlc", "cdda:///dev/cdrom", "--sout=#duplicate{dst=display,dst=\"transcode{vcodec=%s,venc=%s,acodec=%s,aenc=%s,vb=200,ab=112,channels=2}:standard{access=%s,mux=%s,dst=%s}\"}" %(vcodec, venc, acodec, aenc, access, mux, ip_broadcast), "--miface=%s" %eth, "--ttl=12"], shell=False, bufsize=0, close_fds=True) + # exec this app on client + + if access == "udp": + remote_cmd_standalone="vlc udp://@%s --udp-caching=1000 --aout=alsa --brightness=2.000000 --volume=300 --fullscreen --aspect-ratio=4:3 --loop" %(ip_broadcast) + remote_cmd_thin="vlc udp://@%s --udp-caching=1000 --aout=alsa --brightness=2.000000 --volume=300 --aspect-ratio=4:3 --loop" %(ip_broadcast) + + self.main.write_into_statusbar( _("Waiting for start video transmission...") ) + + msg=_("First select the DVD chapter or play movie\nthen press enter to send clients..." ) + shared.info_msg( msg ) + + # check if vlc is running or fail like check ping in demo mode + running = p.poll() is None + if not running: + self.main.write_into_statusbar( _("Error while exec app")) + return + + msg=_( "Lock keyboard and mouse on clients?" ) + if shared.ask_msg ( msg ): + lock="enable" + + newusernames=[] + + for user in self.connected_users: + if user.find(":") != -1: + # we have a standalone user... + usern, ip = user.split(":") + self.main.xmlrpc.newhost(ip) + if access == "http": + server=self.main.xmlrpc.GetStandalone("get_server") + remote_cmd_standalone="vlc http://%s%s --aout=alsa --brightness=2.000000 --volume=300 --fullscreen --aspect-ratio=4:3 --http-reconnect --loop" %(server, ip_broadcast) + self.main.xmlrpc.DBus("exec", remote_cmd_standalone ) + else: + newusernames.append(user) + + if access == "http": + remote_cmd_thin="vlc http://localhost%s --aout=alsa --brightness=2.000000 --volume=300 --aspect-ratio=4:3 --http-reconnect --loop" % (ip_broadcast) + + result = self.main.dbus_action.do_exec( newusernames, remote_cmd_thin ) + + if not result: + shared.error_msg ( _("Error while exec remote app:\nReason:%s") %( self.main.dbus_action.get_error_msg() ) ) + + for client in self.newallclients: + self.main.xmlrpc.vlc( client, volume, lock ) + + self.main.write_into_statusbar( _("Running in broadcast video transmission.") ) + # new mode Stop Button + if len(self.vlc_count.keys()) != 0: + count=len(self.vlc_count.keys())-1 + nextkey=self.vlc_count.keys()[count]+1 + self.vlc_count[nextkey]=uip_cmd + else: + nextkey=1 + self.vlc_count[nextkey]=uip_cmd + self.add_progressbox( {"target": "vlc", "pid":p.pid, "lock":lock, "allclients": self.newallclients, "ip":uip_cmd, "iface":eth, "key":nextkey}, _("Running in broadcast video transmission. Broadcast Nº %s") %(nextkey) ) + else: + dialog.destroy() + + + +__extclass__=VideoOne diff --git a/tcosmonitor/extensions/viewproc.py b/tcosmonitor/extensions/viewproc.py new file mode 100644 index 0000000..6d7923e --- /dev/null +++ b/tcosmonitor/extensions/viewproc.py @@ -0,0 +1,139 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +""" template extension """ + +from gettext import gettext as _ +import sys + +from tcosmonitor import shared +from tcosmonitor.TcosExtensions import TcosExtension + +import gtk + +def print_debug(txt): + if shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + + +class ViewProc(TcosExtension): + def register(self): + self.main.menus.register_simple( _("Show running apps of this client") , "menu_proc.png", 1, self.viewproc, "show") + + + def viewproc(self, widget, ip): + if not self.get_client(): + return + if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: + shared.error_msg ( _("Can't show runnings apps, user is not logged") ) + return + self.get_user_processes(ip) + + + def get_user_processes(self, ip): + """get user processes in session""" + print_debug( "get_user_processes(%s) __init__" %ip ) + #check user is connected + if not self.main.localdata.IsLogged(ip): + shared.info_msg( _("User not connected, no processes.") ) + return + + + if self.main.xmlrpc.IsStandalone(ip): + username=self.main.localdata.GetUsernameAndHost(ip) + tmp=self.main.xmlrpc.ReadInfo("get_process") + if tmp != "": + process=tmp.split('|')[0:-1] + else: + process=["PID COMMAND", "66000 can't read process list"] + else: + username=self.main.localdata.GetUsername(ip) + cmd="LANG=C ps U \"%s\" -o pid,command | /usr/lib/tcos/clean_string.sh " %(self.main.localdata.GetUserID(username)) + print_debug ( "get_user_processes(%s) cmd=%s " %(ip, cmd) ) + process=self.main.common.exe_cmd(cmd, verbose=0) + + self.main.datatxt.clean() + self.main.datatxt.insert_block( _("Running processes for user \"%s\": " ) %(username), image=shared.IMG_DIR + "info_proc.png" ) + + if self.main.config.GetVar("systemprocess") == "0": + self.main.datatxt.insert_block ( \ + _("ALERT: There are some system process hidden. Enable it in Preferences dialog.") \ + , image=shared.IMG_DIR + "icon_alert.png" ,\ + color="#f08196", size="medium" ) + + self.main.datatxt.insert_html ( """ + <br/><div style='margin-left: 135px; margin-right: 200px;background-color:#ead196;color:blue'>""" + _("Pid") + "\t" + + "\t" + _("Process command") +"</div>" ) + + counter=0 + self.main.kill_proc_buttons=None + self.main.kill_proc_buttons=[] + blabel=_("Kill this process") + + for proc in process: + is_hidden=False + if proc.split()[0]== "PID": + continue + pid=proc.split()[0] # not convert to int DBUS need string + name=" ".join(proc.split()[1:]) + name=name.replace('<','<').replace('>','>') + name=name.replace('&','&') + + if int(self.main.config.GetVar("systemprocess")) == 0: + for hidden in shared.system_process: + if hidden in name: + is_hidden=True + + if is_hidden: + continue + + kill_button=gtk.Button(label=blabel) + kill_button.connect("clicked", self.on_kill_button_click, pid, username) + kill_button.show() + self.main.kill_proc_buttons.append(kill_button) + + self.main.datatxt.insert_html(""" + <span style='background-color: red; margin-left: 5px; margin-right: 0px'> + <input type='button' name='self.main.kill_proc_buttons' index='%d' label='%s' /></span> + <span style='color: red; margin-left: 140px; margin-right: 0px'> %6s</span> + <span style='color: blue; margin-left: 350px; margin-right: 0px'> %s</span><br /> + """ %(counter, blabel, pid, name) ) + counter+=1 + + self.main.datatxt.display() + return + + def on_kill_button_click(self, widget, pid, username): + print_debug ( "on_kill_button_click() pid=%s username=%s" %(pid, username) ) + if shared.ask_msg ( _("Are you sure you want to stop this process?") ): + print_debug ( "KILL KILL KILL" ) + if username.find(":") != -1 : + usern, ip = username.split(":") + self.main.xmlrpc.newhost(ip) + self.main.xmlrpc.DBus("kill", str(pid) ) + else: + result = self.main.dbus_action.do_kill( [username] , str(pid) ) + if not result: + shared.error_msg ( _("Error while killing app:\nReason: %s") %( self.main.dbus_action.get_error_msg() ) ) + else: + print_debug ( "on_kill_button_click() KILLED ;)" ) + self.get_user_processes(self.main.selected_ip) + +__extclass__=ViewProc diff --git a/tcosmonitor/extensions/vnc.py b/tcosmonitor/extensions/vnc.py new file mode 100644 index 0000000..f8af01f --- /dev/null +++ b/tcosmonitor/extensions/vnc.py @@ -0,0 +1,513 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +""" template extension """ + +from gettext import gettext as _ + +from tcosmonitor import shared +from tcosmonitor.TcosExtensions import TcosExtension + +import os +from random import Random +from time import sleep +import string +import subprocess +import signal + +from tcosmonitor.ping import PingPort + +import gtkvnc +import gtk +import traceback +import sys + +def print_debug(txt): + if shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + + +class VNC(TcosExtension): + def register(self): + self.vnc_count={} + self.main.menus.register_simple( _("Connect to remote screen (VNC)"), "menu_remote.png", 1, self.vnc_simple, "vnc") + self.main.menus.register_simple( _("Demo mode (from this host)") , "menu_tiza.png", 1, self.vnc_demo_simple, "demo") + + self.main.menus.register_all( _("Enter demo mode, all connected users see my screen") , "menu_tiza.png", 1, self.vnc_demo_all, "demo") + self.vnc={} + self.vncwindow={} + self.is_fullscreen={} + + def vnc_demo_all(self, *args): + if not self.get_all_clients(): + return + # demo mode + #generate password vnc + if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: + shared.error_msg( _("No users logged.") ) + return + + msg=_( _("Do you want to start demo mode the following users: %s?" )%(self.connected_users_txt) ) + + if not shared.ask_msg ( msg ): + return + + passwd=''.join( Random().sample(string.letters+string.digits, 12) ) + self.main.common.exe_cmd("x11vnc -storepasswd %s %s >/dev/null 2>&1" \ + %(passwd, os.path.expanduser('~/.tcosvnc')), verbose=0, background=True ) + + # start x11vnc in local + p=subprocess.Popen(["x11vnc", "-shared", "-noshm", "-viewonly", "-forever", "-rfbauth", "%s" %( os.path.expanduser('~/.tcosvnc') ) ], shell=False, bufsize=0, close_fds=True) + + self.main.write_into_statusbar( _("Waiting for start demo mode...") ) + + # need to wait for start, PingPort loop + status = "CLOSED" + max_wait=10 + wait=0 + while status != "OPEN": + status=PingPort("127.0.0.1", 5900).get_status() + if status == "CLOSED": + sleep(1) + wait+=1 + if wait > max_wait: + break + + if status != "OPEN": + self.main.write_into_statusbar( _("Error while exec app")) + return + + total=0 + for client in self.newallclients: + self.main.xmlrpc.vnc("genpass", client, passwd ) + # get server ip + server_ip=self.main.xmlrpc.GetStandalone("get_server") + print_debug("menu_event_all() vnc server ip=%s" %(server_ip)) + # start vncviewer + self.main.xmlrpc.vnc("startclient", client, server_ip ) + total+=1 + + if total < 1: + self.main.write_into_statusbar( _("No users logged.") ) + # kill x11vnc + os.kill(p.pid, signal.SIGKILL) + else: + self.main.write_into_statusbar( _("Running in demo mode with %s clients.") %(total) ) + #server_ip=self.main.xmlrpc.GetStandalone("get_server") + #hostname=self.main.localdata.GetHostname(server_ip) + # new mode Stop Button + if len(self.vnc_count.keys()) != 0: + count=len(self.vnc_count.keys())-1 + nextkey=self.vnc_count.keys()[count]+1 + self.vnc_count[nextkey]=None + else: + nextkey=1 + self.vnc_count[nextkey]=None + self.add_progressbox( {"target": "vnc", "ip":"", "pid":p.pid, "allclients":self.newallclients, "key":nextkey}, _("Running in demo mode from server. Demo Nº %s") %(nextkey) ) + + + def vnc_simple(self, w, ip): + if not self.get_client(): + return + + if len(self.allclients_logged) == 0: + shared.error_msg( _("No user logged.") ) + return + + self.main.worker=shared.Workers(self.main, target=self.start_vnc, args=(self.allclients_logged) ) + self.main.worker.start() + + def start_vnc(self, ip): + # force kill x11vnc in client + self.main.xmlrpc.newhost(ip) + host=self.main.localdata.GetHostname(self.main.selected_ip) + + max_wait=5 + wait=0 + self.main.common.threads_enter("TcosActions:start_vnc print status msg") + self.main.write_into_statusbar( _("Connecting with %s to start VNC support") %(host) ) + self.main.common.threads_leave("TcosActions:start_vnc print status msg") + + status="OPEN" + while status != "CLOSED": + status=PingPort(ip, 5900).get_status() + self.main.xmlrpc.vnc("stopserver", ip ) + print_debug("start_vnc() waiting to kill x11vnc...") + sleep(1) + wait+=1 + if wait > max_wait: + print_debug("max_wait, returning") + # fixme show error message + return + + # gen password in thin client + passwd=''.join( Random().sample(string.letters+string.digits, 12) ) + + self.main.xmlrpc.vnc("genpass", ip, passwd) + os.system("x11vnc -storepasswd %s %s >/dev/null 2>&1" \ + %(passwd, os.path.expanduser('~/.tcosvnc')) ) + + try: + + # before starting server, vnc-controller.sh exec killall x11vnc, not needed to stop server + #self.main.xmlrpc.vnc("stopserver", ip ) + result=self.main.xmlrpc.vnc("startserver", ip) + if result.find("error") != -1: + self.main.common.threads_enter("TcosActions:start_vnc print error msg") + shared.error_msg ( _("Can't start VNC, error:\n%s") %(result) ) + self.main.common.threads_leave("TcosActions:start_vnc print error msg") + return + self.main.common.threads_enter("TcosActions:start_vnc print waiting msg") + self.main.write_into_statusbar( _("Waiting for start of VNC server...") ) + self.main.common.threads_leave("TcosActions:start_vnc print waiting msg") + + # need to wait for start, PingPort loop + + status = "CLOSED" + + wait=0 + while status != "OPEN": + status=PingPort(ip, 5900).get_status() + if status == "CLOSED": + sleep(1) + wait+=1 + if wait > max_wait: + break + if status == "OPEN": + #cmd=("LC_ALL=C LC_MESSAGES=C vncviewer --version 2>&1| grep built |grep -c \"4.1\"") + #output=self.main.common.exe_cmd(cmd) + #if output == "1": + # cmd = ("vncviewer " + ip + " -UseLocalCursor=0 -passwd %s" %os.path.expanduser('~/.tcosvnc') ) + #else: + # cmd = ("vncviewer " + ip + " -passwd %s" %os.path.expanduser('~/.tcosvnc') ) + #print_debug ( "start_process() threading \"%s\"" %(cmd) ) + #self.main.common.exe_cmd (cmd, verbose=0, background=True) + self.main.common.threads_enter("TcosActions:start_vnc print x11vnc support msg") + self.vncviewer(ip, passwd) + self.main.common.threads_leave("TcosActions:start_vnc print x11vnc support msg") + except Exception, err: + print_debug("start_vnc() Exception, error=%s"%err) + traceback.print_exc(file=sys.stderr) + self.main.common.threads_enter("TcosActions:start_vnc print x11vnc support msg") + shared.error_msg ( _("Can't start VNC, please add X11VNC support") ) + self.main.common.threads_leave("TcosActions:start_vnc print x11vnc support msg") + return + + self.main.common.threads_enter("TcosActions:start_vnc clean status msg") + self.main.write_into_statusbar( "" ) + self.main.common.threads_leave("TcosActions:start_vnc clean status msg") + + def vncviewer_destroy(self, window, ip): + try: + self.vncwindow[ip].hide() + self.vncwindow[ip].destroy() + except Exception, err: + print_debug("vncviewer_destroy() Cant hide/destroy vncviewer window, err=%s"%err) + print_debug("vncviewer_destroy() self.vnc=%s"%self.vnc) + if self.vnc.has_key(ip): + self.vnc[ip].close() + self.vnc.pop(ip) + if self.vncwindow.has_key(ip): + self.vncwindow.pop(ip) + + def vncviewer_fullcontrol(self, button, ip): + image=gtk.Image() + + if self.vnc[ip].get_read_only(): + self.vnc[ip].set_read_only(False) + button.set_label( _("Switch to view only") ) + image.set_from_stock('gtk-find', gtk.ICON_SIZE_BUTTON) + button.set_image(image) + else: + self.vnc[ip].set_read_only(True) + button.set_label( _("Switch to full control") ) + image.set_from_stock('gtk-find-and-replace', gtk.ICON_SIZE_BUTTON) + button.set_image(image) + + def vncviewer_force_resize(self, vnc, size, ip): + w, h = vnc.get_size_request() + if w == -1 or h == -1: + print_debug("_force_resize() returning w=%s h=%s ip=%s"%(w, h, ip)) + return + vnc.set_size_request(w/2, h/2) + + + def on_fullscreenbutton_click(self, button, ip): + image=gtk.Image() + if self.is_fullscreen[ip]: + self.vncwindow[ip].unfullscreen() + self.is_fullscreen[ip]=False + image.set_from_stock('gtk-fullscreen', gtk.ICON_SIZE_BUTTON) + else: + self.vncwindow[ip].fullscreen() + self.is_fullscreen[ip]=True + image.set_from_stock('gtk-leave-fullscreen', gtk.ICON_SIZE_BUTTON) + button.set_image(image) + + def vncviewer(self, ip, passwd, stoptarget=None, stopargs=None): + self.vncwindow[ip] = gtk.Window(gtk.WINDOW_TOPLEVEL) + self.vncwindow[ip].set_icon_from_file(shared.IMG_DIR + 'tcos-icon-32x32.png') + self.vncwindow[ip].set_title( _("VNC host %s") %(ip) ) + self.vncwindow[ip].connect("destroy", self.vncviewer_destroy, ip) + box1 = gtk.HBox(True, 10) + + button = gtk.Button( _("Switch to full control") ) + button.connect("clicked", self.vncviewer_fullcontrol, ip) + image=gtk.Image() + image.set_from_stock('gtk-find-and-replace', gtk.ICON_SIZE_BUTTON) + button.set_image(image) + box1.pack_start(button, False, False, 0) + button.show_all() + + fbutton = gtk.Button( _("Switch to fullscreen") ) + fbutton.connect("clicked", self.on_fullscreenbutton_click, ip) + image=gtk.Image() + image.set_from_stock('gtk-fullscreen', gtk.ICON_SIZE_BUTTON) + fbutton.set_image(image) + box1.pack_start(fbutton, False, False, 0) + fbutton.show_all() + + if stoptarget: + sbutton = gtk.Button( _("Stop") ) + sbutton.connect("clicked", stoptarget, stopargs, None) + image=gtk.Image() + image.set_from_stock('gtk-stop', gtk.ICON_SIZE_BUTTON) + sbutton.set_image(image) + box1.pack_start(sbutton, False, False, 0) + sbutton.show_all() + + lastbutton = gtk.Button( _("Quit") ) + image=gtk.Image() + image.set_from_stock('gtk-quit', gtk.ICON_SIZE_BUTTON) + lastbutton.set_image(image) + lastbutton.connect("clicked", self.vncviewer_destroy, ip) + box1.pack_start(lastbutton, False, False, 0) + lastbutton.show_all() + + self.vnc[ip]=gtkvnc.Display() + self.vnc[ip].set_credential(gtkvnc.CREDENTIAL_PASSWORD, passwd) + self.vnc[ip].set_credential(gtkvnc.CREDENTIAL_CLIENTNAME, self.main.name) + + #self.vnc[ip].connect("vnc-auth-credential", self._vnc_auth_cred, ip) + self.vnc[ip].connect("size-request", self.vncviewer_force_resize, ip) + #self.vnc[ip].connect("vnc-connected", self._vnc_connected, ip) + # this freeze GUI, search another way + #self.vnc[ip].set_tooltip_text("%s"%ip) + + self.vnc[ip].open_host(ip, '5900') + self.vnc[ip].set_scaling(True) + self.vnc[ip].set_read_only(True) + self.vnc[ip].show() + + # Show the box + box1.show() + + box2 = gtk.VBox(False, 0) + box2.pack_start(box1, False, False, 0) + box2.pack_start(self.vnc[ip], True, True, 0) + + + # Show the window + self.vncwindow[ip].add(box2) + self.vncwindow[ip].show_all() + self.is_fullscreen[ip]=False + + + def vnc_demo_simple(self, widget, ip): + if not self.get_client(): + return + + client_simple=self.connected_users_txt + + if len(self.connected_users) == 0 or self.connected_users[0] == shared.NO_LOGIN_MSG: + shared.error_msg ( _("Can't start demo mode, user is not logged") ) + return + + msg=_( _("Do you want demo mode from user %s?" ) %(client_simple) ) + if not shared.ask_msg ( msg ): + return + + if self.main.iconview.ismultiple(): + self.allclients=self.main.iconview.get_multiple() + + elif self.main.classview.ismultiple(): + self.allclients=self.main.classview.get_multiple() + + elif self.main.listview.isactive() and self.main.config.GetVar("selectedhosts") == 1: + self.allclients=self.main.listview.getmultiple() + if len(self.allclients) == 0: + self.allclients=self.main.localdata.allclients + else: + # get all clients connected + self.allclients=self.main.localdata.allclients + + # Allow one client + # if len(self.allclients) == 0: return + + # force kill x11vnc in client + self.main.xmlrpc.newhost(ip) + max_wait=5 + wait=0 + self.main.write_into_statusbar( _("Connecting with %s to start VNC support") %(client_simple) ) + + status="OPEN" + while status != "CLOSED": + status=PingPort(ip, 5900).get_status() + self.main.xmlrpc.vnc("stopserver", ip ) + print_debug("start_vnc() waiting to kill x11vnc...") + sleep(1) + wait+=1 + if wait > max_wait: + print_debug("max_wait, returning") + # fixme show error message + return + + #generate password vnc + passwd=''.join( Random().sample(string.letters+string.digits, 12) ) + self.main.common.exe_cmd("x11vnc -storepasswd %s %s >/dev/null 2>&1" \ + %(passwd, os.path.expanduser('~/.tcosvnc')), verbose=0, background=True ) + + # start x11vnc in remote host + self.main.xmlrpc.vnc("genpass", ip, passwd ) + self.main.xmlrpc.vnc("startserver", ip ) + + self.main.write_into_statusbar( _("Waiting for start demo mode from user %s...") %(client_simple) ) + + # need to wait for start, PingPort loop + status = "CLOSED" + max_wait=10 + wait=0 + while status != "OPEN": + status=PingPort(ip, 5900).get_status() + if status == "CLOSED": + sleep(1) + wait+=1 + if wait > max_wait: + break + + if status != "OPEN": + self.main.write_into_statusbar( _("Error while exec app")) + return + + # start in 1 (teacher) + newallclients=[] + total=1 + for client in self.allclients: + self.main.localdata.newhost(client) + if self.main.localdata.IsLogged(client) and client != ip: + self.main.xmlrpc.vnc("genpass", client, passwd ) + self.main.xmlrpc.vnc("startclient", client, ip ) + total+=1 + newallclients.append(client) + + if total < 1: + self.main.write_into_statusbar( _("No users logged.") ) + # kill x11vnc in host + self.main.xmlrpc.vnc("stopserver", ip ) + else: + self.main.write_into_statusbar( _("Running in demo mode with %s clients.") %(total) ) + #cmd=("LC_ALL=C LC_MESSAGES=C vncviewer --version 2>&1| grep built |grep -c \"4.1\"") + #output=self.main.common.exe_cmd(cmd) + #if output == "1": + # p=subprocess.Popen(["vncviewer", ip, "-UseLocalCursor=0", "-PasswordFile", "%s" %os.path.expanduser('~/.tcosvnc')], shell=False, bufsize=0, close_fds=True) + #else: + # p=subprocess.Popen(["vncviewer", ip, "-passwd", "%s" %os.path.expanduser('~/.tcosvnc')], shell=False, bufsize=0, close_fds=True) + + # new mode for stop button + if len(self.vnc_count.keys()) != 0: + count=len(self.vnc_count.keys())-1 + nextkey=self.vnc_count.keys()[count]+1 + self.vnc_count[nextkey]=None + else: + nextkey=1 + self.vnc_count[nextkey]=None + + stopargs={"target": "vnc", "ip": ip, "allclients":newallclients, "key":nextkey} + self.vncviewer(ip, passwd, stoptarget=self.on_progressbox_click, stopargs=stopargs) + #self.add_progressbox( {"target": "vnc", "pid":p.pid, "ip": ip, "allclients":newallclients, "key":nextkey}, _("Running in demo mode from user %(host)s. Demo Nº %(count)s") %{"host":client_simple, "count":nextkey} ) + self.add_progressbox( stopargs, _("Running in demo mode from user %(host)s. Demo Nº %(count)s") %{"host":client_simple, "count":nextkey} ) + + def on_progressbox_click(self, widget, args, box): + if box: + box.destroy() + else: + for table in self.main.progressbox.get_children(): + #[<gtk.Label>, <gtk.Button>] + # read key from label + tlabel=table.get_children()[0] + tbutton=table.get_children()[1] + key=int(tlabel.get_text().split('Nº ')[1]) + if args['key'] == key: + # we have found IP in label !!! destroy table + table.destroy() + widget=tbutton + print_debug("on_progressbox_click() widget=%s, args=%s, box=%s" %(widget, args, box) ) + + if not args['target']: + return + + try: + self.main.stop_running_actions.remove(widget) + except Exception, err: + print_debug("on_progressbox_click() can't remove widget=%s err=%s"%(widget, err)) + + if args['target'] == "vnc": + del self.vnc_count[args['key']] + if args['ip'] != "": + for client in args['allclients']: + self.main.localdata.newhost(client) + if self.main.localdata.IsLogged(client): + self.main.xmlrpc.newhost(client) + self.main.xmlrpc.vnc("stopclient", client) + # kill only in server one vncviewer + #if "pid" in args: + # os.kill(args['pid'], signal.SIGKILL) + #else: + # self.main.common.exe_cmd("killall -s KILL vncviewer", verbose=0, background=True) + + self.vncviewer_destroy(None, args['ip']) + + self.main.xmlrpc.newhost(args['ip']) + self.main.xmlrpc.vnc("stopserver", args['ip'] ) + else: + # get all users at this demo mode and not kill others demo modes, in some cases need SIGKILL + for client in args['allclients']: + self.main.localdata.newhost(client) + if self.main.localdata.IsLogged(client): + self.main.xmlrpc.newhost(client) + self.main.xmlrpc.vnc("stopclient", client) + if "pid" in args: + os.kill(args['pid'], signal.SIGKILL) + else: + self.main.common.exe_cmd("killall -s KILL x11vnc", verbose=0, background=True) + + self.main.write_into_statusbar( _("Demo mode off.") ) + + + + + +__extclass__=VNC + + + + + + diff --git a/tcosmonitor/extensions/wakeonlan.py b/tcosmonitor/extensions/wakeonlan.py new file mode 100644 index 0000000..0f827f8 --- /dev/null +++ b/tcosmonitor/extensions/wakeonlan.py @@ -0,0 +1,100 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +""" template extension """ + +from gettext import gettext as _ +import sys + +from tcosmonitor import shared +from tcosmonitor.TcosExtensions import TcosExtension + +from tcosmonitor.WakeOnLan import WakeOnLan + +def print_debug(txt): + if shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + + +class WOL(TcosExtension): + def register(self): + self.main.menus.register_simple( _("Boot client (WakeOnLan)") , "menu_wol.png", 0, self.wol_one, "wakeonlan") + self.main.menus.register_all( _("Boot All clients (WakeOnLan)") , "menu_wol.png", 0, self.wol_all, "wakeonlan") + + + def wol_one(self, widget, ip): + if not self.get_client(): + print_debug("wol_one() no client") + return + if self.main.config.GetVar("scan_network_method") != "static": + msg=(_("Wake On Lan only works with static list.\n\nEnable scan method \"static\" in Preferences\nand (wake on lan) support in bios of clients." )) + shared.info_msg ( msg ) + return + + msg=_( _("Do you want boot %s client?" %ip)) + if shared.ask_msg ( msg ): + data=[] + hostslist=self.main.config.GetVar("statichosts") + #eth=self.main.config.GetVar("network_interface") + if hostslist == "": + return + data=hostslist.split("#") + data=data[:-1] + for host in data: + mip, mac=host.split("|") + print_debug("wol_one() ip=%s mac=%s" %(mip, mac) ) + if mip == self.main.selected_ip: + if mac == "": + self.main.write_into_statusbar(_("No register MAC address for ip: \"%s\"")%ip) + continue + print_debug("Send magic packet to mac=%s" %mac) + if not WakeOnLan("%s"%mac): + self.main.write_into_statusbar(_("Not valid MAC address: \"%s\"")%mac) + + def wol_all(self, *args): + if self.main.config.GetVar("scan_network_method") != "static": + msg=(_("Wake On Lan only works with static list.\n\nEnable scan method \"static\" in Preferences\nand (wake on lan) support in bios of clients." )) + shared.info_msg ( msg ) + return + + msg=_( _("Do you want boot all clients?" )) + if shared.ask_msg ( msg ): + data=[] + hostslist=self.main.config.GetVar("statichosts") + #eth=self.main.config.GetVar("network_interface") + if hostslist == "": + return + data=hostslist.split("#") + data=data[:-1] + errors=[] + for host in data: + mac=host.split("|")[1] + if mac == "": + self.main.write_into_statusbar(_("No register MAC address for ip: \"%s\"")%host) + continue + print_debug("Send magic packet to mac=%s" %mac) + if not WakeOnLan("%s"%mac): + errors.append(mac) + if len(errors) >1: + print_debug("menu_event_all() errors=%s"%errors) + self.main.write_into_statusbar(_("Not valid MAC address: \"%s\"")%" ".join(errors)) + + +__extclass__=WOL diff --git a/tcosmonitor/ftps_server.py b/tcosmonitor/ftps_server.py new file mode 100644 index 0000000..866f9dc --- /dev/null +++ b/tcosmonitor/ftps_server.py @@ -0,0 +1,445 @@ +# -*- coding: UTF-8 -*- +# +# http://svn.osafoundation.org/m2crypto/trunk/demo/medusa/ftps_server.py +# """An FTP/TLS server built on Medusa's ftp_server. +# +# Source taken from python-M2Crypto demo/medusa +# +# Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.""" + +# Python +import socket, string, sys, time + +# Medusa + +import asynchat, asyncore +from tcosmonitor.counter import counter +from medusa import ftp_server, logger + +# M2Crypto +from M2Crypto import SSL + +VERSION_STRING='0.09' + +class ftp_tls_channel(ftp_server.ftp_channel): + + """FTP/TLS server channel for Medusa.""" + + def __init__(self, server, ssl_ctx, conn, addr): + """Initialise the channel.""" + self.ssl_ctx = ssl_ctx + self.server = server + self.current_mode = 'a' + self.addr = addr + asynchat.async_chat.__init__(self, conn) + self.set_terminator('\r\n') + self.client_addr = (addr[0], 21) + self.client_dc = None + self.in_buffer = '' + self.closing = 0 + self.passive_acceptor = None + self.passive_connection = None + self.filesystem = None + self.authorized = 0 + self._ssl_accepting = 0 + self._ssl_accepted = 0 + self._pbsz = None + self._prot = None + resp = '220 %s M2Crypto (Medusa) FTP/TLS server v%s ready.' + self.respond(resp % (self.server.hostname, VERSION_STRING)) + + def writable(self): + return self._ssl_accepting or self._ssl_accepted + + def handle_read(self): + """Handle a read event.""" + if self._ssl_accepting: + self._ssl_accepted = self.socket.accept_ssl() + if self._ssl_accepted: + self._ssl_accepting = 0 + else: + try: + ftp_server.ftp_channel.handle_read(self) + except SSL.SSLError, what: + if str(what) == 'unexpected eof': + self.close() + else: + raise + + def handle_write(self): + """Handle a write event.""" + if self._ssl_accepting: + self._ssl_accepted = self.socket.accept_ssl() + if self._ssl_accepted: + self._ssl_accepting = 0 + else: + try: + ftp_server.ftp_channel.handle_write(self) + except SSL.SSLError, what: + if str(what) == 'unexpected eof': + self.close() + else: + raise + + def send(self, data): + """Send data over SSL.""" + try: + result = self.socket.send(data) + if result <= 0: + return 0 + else: + return result + except SSL.SSLError, what: + self.close() + self.log_info('send: closing channel %s %s' % (repr(self), what)) + return 0 + + def recv(self, buffer_size): + """Receive data over SSL.""" + try: + result = self.socket.recv(buffer_size) + if not result: + return '' + else: + return result + except SSL.SSLError, what: + self.close() + self.log_info('recv: closing channel %s %s' % (repr(self), what)) + return '' + + def found_terminator(self): + """Dispatch the FTP command.""" + line = self.in_buffer + if not len(line): + return + + sp = string.find(line, ' ') + if sp != -1: + line = [line[:sp], line[sp+1:]] + else: + line = [line] + + command = string.lower(line[0]) + if string.find(command, 'stor') != -1: + while command and command[0] not in string.letters: + command = command[1:] + + func_name = 'cmd_%s' % command + if command != 'pass': + self.log('<== %s' % repr(self.in_buffer)[1:-1]) + else: + self.log('<== %s' % line[0]+' <password>') + + self.in_buffer = '' + if not hasattr(self, func_name): + self.command_not_understood(line[0]) + return + + func = getattr(self, func_name) + if not self.check_command_authorization(command): + self.command_not_authorized(command) + else: + try: + result = apply(func, (line,)) + except: + self.server.total_exceptions.increment() + (file, func, line), t, v, tbinfo = asyncore.compact_traceback() + if self.client_dc: + try: + self.client_dc_close() + except: + pass + resp = '451 Server error: %s, %s: file %s line: %s' + self.respond(resp % (t, v, file, line)) + + def make_xmit_channel(self): + """Create a connection for sending data.""" + pa = self.passive_acceptor + if pa: + if pa.ready: + conn, addr = pa.ready + if self._prot: + cdc = tls_xmit_channel(self, conn, self.ssl_ctx, addr) + else: + cdc = ftp_server.xmit_channel(self, addr) + cdc.set_socket(conn) + cdc.connected = 1 + self.passive_acceptor.close() + self.passive_acceptor = None + else: + if self._prot: + cdc = tls_xmit_channel(self, None, self.ssl_ctx, None) + else: + cdc = ftp_server.xmit_channel(self) + else: + if self._prot: + cdc = tls_xmit_channel(self, None, self.ssl_ctx, self.client_addr) + else: + cdc = ftp_server.xmit_channel(self, self.client_addr) + cdc.create_socket(socket.AF_INET, socket.SOCK_STREAM) + if self.bind_local_minus_one: + cdc.bind(('', self.server.port - 1)) + try: + cdc.connect(self.client_addr) + except socket.error, what: + self.respond('425 Cannot build data connection') + self.client_dc = cdc + + def make_recv_channel(self, fd): + """Create a connection for receiving data.""" + pa = self.passive_acceptor + if pa: + if pa.ready: + conn, addr = pa.ready + if self._prot: + cdc = tls_recv_channel(self, conn, self.ssl_ctx, addr, fd) + else: + cdc = ftp_server.recv_channel(self, addr, fd) + cdc.set_socket(conn) + cdc.connected = 1 + self.passive_acceptor.close() + self.passive_acceptor = None + else: + if self._prot: + cdc = tls_recv_channel(self, None, self.ssl_ctx, None, fd) + else: + cdc = ftp_server.recv_channel(self, None, fd) + else: + if self._prot: + cdc = tls_recv_channel(self, None, self.ssl_ctx, self._prot, self.client_addr, fd) + else: + cdc = ftp_server.recv_channel(self, self.client_addr, fd) + cdc.create_socket(socket.AF_INET, socket.SOCK_STREAM) + try: + cdc.connect(self.client_addr) + except socket.error, what: + self.respond('425 Cannot build data connection') + self.client_dc = cdc + + def cmd_auth(self, line): + """Prepare for TLS operation.""" + # XXX Handle variations. + if line[1] != 'TLS': + self.command_not_understood (string.join(line)) + else: + self.respond('234 AUTH TLS successful') + self._ssl_accepting = 1 + self.socket = SSL.Connection(self.ssl_ctx, self.socket) + self.socket.setup_addr(self.addr) + self.socket.setup_ssl() + self.socket.set_accept_state() + self._ssl_accepted = self.socket.accept_ssl() + if self._ssl_accepted: + self._ssl_accepting = 0 + + def cmd_pbsz(self, line): + """Negotiate size of buffer for secure data transfer. For + FTP/TLS the only valid value for the parameter is '0'; any + other value is accepted but ignored.""" + if not (self._ssl_accepting or self._ssl_accepted): + return self.respond('503 AUTH TLS must be issued prior to PBSZ') + self._pbsz = 1 + self.respond('200 PBSZ=0 successful.') + + def cmd_prot(self, line): + """Negotiate the security level of the data connection.""" + if self._pbsz is None: + return self.respond('503 PBSZ must be issued prior to PROT') + if line[1] == 'C': + self.respond('200 Protection set to Clear') + self._pbsz = None + self._prot = None + elif line[1] == 'P': + self.respond('200 Protection set to Private') + self._prot = 1 + elif line[1] in ('S', 'E'): + self.respond('536 PROT %s unsupported' % line[1]) + else: + self.respond('504 PROT %s unsupported' % line[1]) + + +class ftp_tls_server(ftp_server.ftp_server): + + """FTP/TLS server for Medusa.""" + + SERVER_IDENT = 'M2Crypto FTP/TLS Server (v%s)' % VERSION_STRING + + ftp_channel_class = ftp_tls_channel + + def __init__(self, authz, ssl_ctx, host=None, ip='', port=21, resolver=None, log_obj=None): + """Initialise the server.""" + self.ssl_ctx = ssl_ctx + self.ip = ip + self.port = port + self.authorizer = authz + + if host is None: + self.hostname = socket.gethostname() + else: + self.hostname = host + + self.total_sessions = counter() + self.closed_sessions = counter() + self.total_files_out = counter() + self.total_files_in = counter() + self.total_bytes_out = counter() + self.total_bytes_in = counter() + self.total_exceptions = counter() + + asyncore.dispatcher.__init__(self) + self.create_socket(socket.AF_INET, socket.SOCK_STREAM) + self.set_reuse_addr() + self.bind((self.ip, self.port)) + self.listen(5) + + if log_obj is None: + log_obj = sys.stdout + + if resolver: + self.logger = logger.resolving_logger(resolver, log_obj) + else: + self.logger = logger.unresolving_logger(logger.file_logger(sys.stdout)) + + l = 'M2Crypto (Medusa) FTP/TLS server started at %s\n\tAuthz: %s\n\tHostname: %s\n\tPort: %d' + self.log_info(l % (time.ctime(time.time()), repr(self.authorizer), self.hostname, self.port)) + + def handle_accept(self): + """Accept a socket and dispatch a channel to handle it.""" + conn, addr = self.accept() + self.total_sessions.increment() + self.log_info('Connection from %s:%d' % addr) + self.ftp_channel_class(self, self.ssl_ctx, conn, addr) + + +class nbio_ftp_tls_actor: + + """TLS protocol negotiation mixin for FTP/TLS.""" + + def tls_init(self, sock, ssl_ctx, client_addr): + """Perform TLS protocol negotiation.""" + self.ssl_ctx = ssl_ctx + self.client_addr = client_addr + self._ssl_handshaking = 1 + self._ssl_handshake_ok = 0 + if sock: + self.socket = SSL.Connection(self.ssl_ctx, sock) + self.socket.setup_addr(self.client_addr) + self.socket.setup_ssl() + self._ssl_handshake_ok = self.socket.accept_ssl() + if self._ssl_handshake_ok: + self._ssl_handshaking = 0 + self.add_channel() + # else the client hasn't connected yet; when that happens, + # handle_connect() will be triggered. + + def tls_neg_ok(self): + """Return status of TLS protocol negotiation.""" + if self._ssl_handshaking: + self._ssl_handshake_ok = self.socket.accept_ssl() + if self._ssl_handshake_ok: + self._ssl_handshaking = 0 + return self._ssl_handshake_ok + + def handle_connect(self): + """Handle a data connection that occurs after this instance came + into being. When this handler is triggered, self.socket has been + created and refers to the underlying connected socket.""" + self.socket = SSL.Connection(self.ssl_ctx, self.socket) + self.socket.setup_addr(self.client_addr) + self.socket.setup_ssl() + self._ssl_handshake_ok = self.socket.accept_ssl() + if self._ssl_handshake_ok: + self._ssl_handshaking = 0 + self.add_channel() + + def send(self, data): + """Send data over SSL.""" + try: + result = self.socket.send(data) + if result <= 0: + return 0 + else: + return result + except SSL.SSLError, what: + self.close() + self.log_info('send: closing channel %s %s' % (repr(self), what)) + return 0 + + def recv(self, buffer_size): + """Receive data over SSL.""" + try: + result = self.socket.recv(buffer_size) + if not result: + return '' + else: + return result + except SSL.SSLError, what: + self.close() + self.log_info('recv: closing channel %s %s' % (repr(self), what)) + return '' + + +class tls_xmit_channel(nbio_ftp_tls_actor, ftp_server.xmit_channel): + + """TLS driver for a send-only data connection.""" + + def __init__(self, channel, conn, ssl_ctx, client_addr=None): + """Initialise the driver.""" + ftp_server.xmit_channel.__init__(self, channel, client_addr) + self.tls_init(conn, ssl_ctx, client_addr) + + def readable(self): + """This channel is readable iff TLS negotiation is in progress. + (Which implies a connected channel, of course.)""" + if not self.connected: + return 0 + else: + return self._ssl_handshaking + + def writable(self): + """This channel is writable iff TLS negotiation is in progress + or the application has data to send.""" + if self._ssl_handshaking: + return 1 + else: + return ftp_server.xmit_channel.writable(self) + + def handle_read(self): + """Handle a read event: either continue with TLS negotiation + or let the application handle this event.""" + if self.tls_neg_ok(): + ftp_server.xmit_channel.handle_read(self) + + def handle_write(self): + """Handle a write event: either continue with TLS negotiation + or let the application handle this event.""" + if self.tls_neg_ok(): + ftp_server.xmit_channel.handle_write(self) + + +class tls_recv_channel(nbio_ftp_tls_actor, ftp_server.recv_channel): + + """TLS driver for a receive-only data connection.""" + + def __init__(self, channel, conn, ssl_ctx, client_addr, fd): + """Initialise the driver.""" + ftp_server.recv_channel.__init__(self, channel, client_addr, fd) + self.tls_init(conn, ssl_ctx, client_addr) + + def writable(self): + """This channel is writable iff TLS negotiation is in progress.""" + return self._ssl_handshaking + + def handle_read(self): + """Handle a read event: either continue with TLS negotiation + or let the application handle this event.""" + if self.tls_neg_ok(): + ftp_server.recv_channel.handle_read(self) + + def handle_write(self): + """Handle a write event: either continue with TLS negotiation + or let the application handle this event.""" + if self.tls_neg_ok(): + ftp_server.recv_channel.handle_write(self) + + diff --git a/tcosmonitor/htmltextview.py b/tcosmonitor/htmltextview.py new file mode 100644 index 0000000..dfe76f5 --- /dev/null +++ b/tcosmonitor/htmltextview.py @@ -0,0 +1,865 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +''' +A gtk.TextView-based renderer for XHTML-IM, as described in: + http://www.jabber.org/jeps/jep-0071.html +''' +import gobject +import pango +import gtk +import xml.sax, xml.sax.handler +import re +import warnings +from cStringIO import StringIO +import urllib2 +import operator + +import base64 +import gc + +__all__ = ['HtmlTextView'] + +whitespace_rx = re.compile("\\s+") +allwhitespace_rx = re.compile("^\\s*$") + +## pixels = points * display_resolution +display_resolution = 0.3514598*(gtk.gdk.screen_height() / + float(gtk.gdk.screen_height_mm())) + + +def _parse_css_color(color): + '''_parse_css_color(css_color) -> gtk.gdk.Color''' + if color.startswith("rgb(") and color.endswith(')'): + r, g, b = [int(c)*257 for c in color[4:-1].split(',')] + return gtk.gdk.Color(r, g, b) + else: + return gtk.gdk.color_parse(color) + + +class HtmlHandler(xml.sax.handler.ContentHandler): + + def __init__(self, textview, startiter, main=None): + self.main=main + xml.sax.handler.ContentHandler.__init__(self) + self.textbuf = textview.get_buffer() + self.textview = textview + self.iter = startiter + self.text = '' + self.styles = [] # a gtk.TextTag or None, for each span level + self.list_counters = [] # stack (top at head) of list + # counters, or None for unordered list + + def _parse_style_color(self, tag, value): + color = _parse_css_color(value) + tag.set_property("foreground-gdk", color) + + def _parse_style_background_color(self, tag, value): + color = _parse_css_color(value) + tag.set_property("background-gdk", color) + if gtk.gtk_version >= (2, 8): + tag.set_property("paragraph-background-gdk", color) + + + if gtk.gtk_version >= (2, 8, 5) or gobject.pygtk_version >= (2, 8, 1): + + def _get_current_attributes(self): + attrs = self.textview.get_default_attributes() + self.iter.backward_char() + self.iter.get_attributes(attrs) + self.iter.forward_char() + return attrs + + else: + + ## Workaround http://bugzilla.gnome.org/show_bug.cgi?id=317455 + def _get_current_style_attr(self, propname, comb_oper=None): + tags = [tag for tag in self.styles if tag is not None] + tags.reverse() + is_set_name = propname + "-set" + value = None + for tag in tags: + if tag.get_property(is_set_name): + if value is None: + value = tag.get_property(propname) + if comb_oper is None: + return value + else: + value = comb_oper(value, tag.get_property(propname)) + return value + + class _FakeAttrs(object): + __slots__ = ("font", "font_scale") + + def _get_current_attributes(self): + attrs = self._FakeAttrs() + attrs.font_scale = self._get_current_style_attr("scale", + operator.mul) + if attrs.font_scale is None: + attrs.font_scale = 1.0 + attrs.font = self._get_current_style_attr("font-desc") + if attrs.font is None: + attrs.font = self.textview.style.font_desc + return attrs + + + def __parse_length_frac_size_allocate(self, textview, allocation, + frac, callback, args): + callback(allocation.width*frac, *args) + + def _parse_length(self, value, font_relative, callback, *args): + '''Parse/calc length, converting to pixels, calls callback(length, *args) + when the length is first computed or changes''' + if value.endswith('%'): + frac = float(value[:-1])/100 + if font_relative: + attrs = self._get_current_attributes() + font_size = attrs.font.get_size() / pango.SCALE + callback(frac*display_resolution*font_size, *args) + else: + ## CSS says "Percentage values: refer to width of the closest + ## block-level ancestor" + ## This is difficult/impossible to implement, so we use + ## textview width instead; a reasonable approximation.. + alloc = self.textview.get_allocation() + self.__parse_length_frac_size_allocate(self.textview, alloc, + frac, callback, args) + self.textview.connect("size-allocate", + self.__parse_length_frac_size_allocate, + frac, callback, args) + + elif value.endswith('pt'): # points + callback(float(value[:-2])*display_resolution, *args) + + elif value.endswith('em'): # ems, the height of the element's font + attrs = self._get_current_attributes() + font_size = attrs.font.get_size() / pango.SCALE + callback(float(value[:-2])*display_resolution*font_size, *args) + + elif value.endswith('ex'): # x-height, ~ the height of the letter 'x' + ## FIXME: figure out how to calculate this correctly + ## for now 'em' size is used as approximation + attrs = self._get_current_attributes() + font_size = attrs.font.get_size() / pango.SCALE + callback(float(value[:-2])*display_resolution*font_size, *args) + + elif value.endswith('px'): # pixels + callback(int(value[:-2]), *args) + + else: + warnings.warn("Unable to parse length value '%s'" % value) + + def __parse_font_size_cb(length, tag): + tag.set_property("size-points", length/display_resolution) + __parse_font_size_cb = staticmethod(__parse_font_size_cb) + + def _parse_style_font_size(self, tag, value): + try: + scale = { + "xx-small": pango.SCALE_XX_SMALL, + "x-small": pango.SCALE_X_SMALL, + "small": pango.SCALE_SMALL, + "medium": pango.SCALE_MEDIUM, + "large": pango.SCALE_LARGE, + "x-large": pango.SCALE_X_LARGE, + "xx-large": pango.SCALE_XX_LARGE, + } [value] + except KeyError: + pass + else: + attrs = self._get_current_attributes() + tag.set_property("scale", scale / attrs.font_scale) + return + if value == 'smaller': + tag.set_property("scale", pango.SCALE_SMALL) + return + if value == 'larger': + tag.set_property("scale", pango.SCALE_LARGE) + return + self._parse_length(value, True, self.__parse_font_size_cb, tag) + + def _parse_style_font_style(self, tag, value): + try: + style = { + "normal": pango.STYLE_NORMAL, + "italic": pango.STYLE_ITALIC, + "oblique": pango.STYLE_OBLIQUE, + } [value] + except KeyError: + warnings.warn("unknown font-style %s" % value) + else: + tag.set_property("style", style) + + def __frac_length_tag_cb(length, tag, propname): + tag.set_property(propname, length) + __frac_length_tag_cb = staticmethod(__frac_length_tag_cb) + + def _parse_style_margin_left(self, tag, value): + #print ":::::_parse_style_margin_left::::: tag=%s value=%s" %(tag,value) + self._parse_length(value, False, self.__frac_length_tag_cb, + tag, "left-margin") + + def _parse_style_margin_right(self, tag, value): + #print ":::::_parse_style_margin_right::::: tag=%s value=%s" %(tag,value) + self._parse_length(value, False, self.__frac_length_tag_cb, + tag, "right-margin") + + def _parse_style_font_weight(self, tag, value): + ## TODO: missing 'bolder' and 'lighter' + try: + weight = { + '100': pango.WEIGHT_ULTRALIGHT, + '200': pango.WEIGHT_ULTRALIGHT, + '300': pango.WEIGHT_LIGHT, + '400': pango.WEIGHT_NORMAL, + '500': pango.WEIGHT_NORMAL, + '600': pango.WEIGHT_BOLD, + '700': pango.WEIGHT_BOLD, + '800': pango.WEIGHT_ULTRABOLD, + '900': pango.WEIGHT_HEAVY, + 'normal': pango.WEIGHT_NORMAL, + 'bold': pango.WEIGHT_BOLD, + } [value] + except KeyError: + warnings.warn("unknown font-style %s" % value) + else: + tag.set_property("weight", weight) + + def _parse_style_font_family(self, tag, value): + tag.set_property("family", value) + + def _parse_style_text_align(self, tag, value): + try: + align = { + 'left': gtk.JUSTIFY_LEFT, + 'right': gtk.JUSTIFY_RIGHT, + 'center': gtk.JUSTIFY_CENTER, + 'justify': gtk.JUSTIFY_FILL, + } [value] + except KeyError: + warnings.warn("Invalid text-align:%s requested" % value) + else: + tag.set_property("justification", align) + + def _parse_style_text_decoration(self, tag, value): + if value == "none": + tag.set_property("underline", pango.UNDERLINE_NONE) + tag.set_property("strikethrough", False) + elif value == "underline": + tag.set_property("underline", pango.UNDERLINE_SINGLE) + tag.set_property("strikethrough", False) + elif value == "overline": + warnings.warn("text-decoration:overline not implemented") + tag.set_property("underline", pango.UNDERLINE_NONE) + tag.set_property("strikethrough", False) + elif value == "line-through": + tag.set_property("underline", pango.UNDERLINE_NONE) + tag.set_property("strikethrough", True) + elif value == "blink": + warnings.warn("text-decoration:blink not implemented") + else: + warnings.warn("text-decoration:%s not implemented" % value) + + + ## build a dictionary mapping styles to methods, for greater speed + __style_methods = dict() + for style in ["background-color", "color", "font-family", "font-size", + "font-style", "font-weight", "margin-left", "margin-right", + "text-align", "text-decoration"]: + try: + method = locals()["_parse_style_%s" % style.replace('-', '_')] + except KeyError: + warnings.warn("Style attribute '%s' not yet implemented" % style) + else: + __style_methods[style] = method + del style + ## -- + + def _get_style_tags(self): + return [tag for tag in self.styles if tag is not None] + + + def _begin_span(self, style, tag=None): + if style is None: + self.styles.append(tag) + return None + if tag is None: + tag = self.textbuf.create_tag() + for attr, val in [item.split(':', 1) for item in style.split(';')]: + attr = attr.strip().lower() + val = val.strip() + try: + method = self.__style_methods[attr] + except KeyError: + warnings.warn("Style attribute '%s' requested " + "but not yet implemented" % attr) + else: + method(self, tag, val) + self.styles.append(tag) + + def _end_span(self): + self.styles.pop(-1) + + def _insert_text(self, text): + tags = self._get_style_tags() + if tags: + try: + self.textbuf.insert_with_tags(self.iter, text, *tags) + except: + pass + else: + try: + self.textbuf.insert(self.iter, text) + except: + pass + + def _flush_text(self): + if not self.text: return + self._insert_text(self.text.replace('\n', '')) + self.text = '' + + def _anchor_event(self, tag, textview, event, iter, href, type_): + if event.type == gtk.gdk.BUTTON_PRESS and event.button == 1: + self.textview.emit("url-clicked", href, type_) + return True + return False + + def characters(self, content): + if allwhitespace_rx.match(content) is not None: + return + if self.text: self.text += ' ' + self.text += whitespace_rx.sub(' ', content) + + def startElement(self, name, attrs): + self._flush_text() + try: + style = attrs['style'] + except KeyError: + style = None + + tag = None + if name == 'a': + tag = self.textbuf.create_tag() + tag.set_property('foreground', '#0000ff') + tag.set_property('underline', pango.UNDERLINE_SINGLE) + try: + type_ = attrs['type'] + except KeyError: + type_ = None + tag.connect('event', self._anchor_event, attrs['href'], type_) + tag.is_anchor = True + + self._begin_span(style, tag) + + if name == 'br': + pass # handled in endElement + elif name == 'p': + if not self.iter.starts_line(): + self._insert_text("\n") + elif name == 'div': + if not self.iter.starts_line(): + self._insert_text("\n") + elif name == 'span': + pass + elif name == 'ul': + if not self.iter.starts_line(): + self._insert_text("\n") + self.list_counters.insert(0, None) + elif name == 'ol': + if not self.iter.starts_line(): + self._insert_text("\n") + self.list_counters.insert(0, 0) + elif name == 'li': + if self.list_counters[0] is None: + li_head = unichr(0x2022) + else: + self.list_counters[0] += 1 + li_head = "%i." % self.list_counters[0] + self.text = ' '*len(self.list_counters)*4 + li_head + ' ' + elif name == 'img': + title=None + title_rotate=None + b64=None + pixbuf=None + + try: + imgfile = attrs['file'] + except KeyError: + imgfile = None + + try: + title=attrs['title'] + except KeyError: + title=None + + try: + b64=attrs['base64'] + except: + b64=None + + try: + onclick=attrs['onclick'] + except: + onclick=None + + try: + title_rotate=attrs['title_rotate'] + except KeyError: + title_rotate=None + + if imgfile: + #print "############" + #print attrs['file'] + #print "############" + import os + if os.path.isfile(imgfile): + #print "file exists" + pixbuf = gtk.gdk.pixbuf_new_from_file( imgfile ) + tags = self._get_style_tags() + if tags: + tmpmark = self.textbuf.create_mark(None, self.iter, True) + + self.textbuf.insert_pixbuf(self.iter, pixbuf) + + if tags: + start = self.textbuf.get_iter_at_mark(tmpmark) + for tag in tags: + self.textbuf.apply_tag(tag, start, self.iter) + self.textbuf.delete_mark(tmpmark) + else: + print "WARNING: HtmlTextView() img_parser, file %s don't exists" % (imgfile) + pixbuf=None + + else: + if b64: + try: + #print "loading image from base64" + loader = gtk.gdk.PixbufLoader() + loader.write(base64.decodestring(b64)) + loader.close() + pixbuf = loader.get_pixbuf() + del loader + gc.collect() + #print pixbuf + except Exception, err: + print "WARNING Exception loading base64 error: %s" % err + else: + try: + ## Max image size = 10 MB (to try to prevent DoS) + mem = urllib2.urlopen(attrs['src']).read(10*1024*1024) + ## Caveat: GdkPixbuf is known not to be safe to load + ## images from network... this program is now potentially + ## hackable ;) + loader = gtk.gdk.PixbufLoader() + loader.write(mem); loader.close() + pixbuf = loader.get_pixbuf() + except Exception, ex: + pixbuf = None + try: + alt = attrs['alt'] + except KeyError: + alt = "Broken image" + + if pixbuf is not None: + tags = self._get_style_tags() + if tags: + tmpmark = self.textbuf.create_mark(None, self.iter, True) + + if title: + label=gtk.Label(title) + if title_rotate: + try: + title_rotate=int(title_rotate) + label.set_property("angle", title_rotate) + except: + pass + label.show() + anchor_widget = self.textbuf.create_child_anchor(self.iter) + try: + self.textview.add_child_at_anchor (label, anchor_widget) + except: + pass + + if onclick is not None: + # Connect to button events to call pixbuf action, save for example... + evbox=gtk.EventBox() + evbox.connect("button_press_event", self.main.screenshots_action, onclick, pixbuf) + _img=gtk.Image() + _img.set_from_pixbuf(pixbuf) + _img.show() + evbox.add(_img) + evbox.show() + anchor_widget = self.textbuf.create_child_anchor(self.iter) + self.textview.add_child_at_anchor (evbox, anchor_widget) + else: + self.textbuf.insert_pixbuf(self.iter, pixbuf) + + if tags: + start = self.textbuf.get_iter_at_mark(tmpmark) + for tag in tags: + self.textbuf.apply_tag(tag, start, self.iter) + self.textbuf.delete_mark(tmpmark) + else: + self._insert_text("[IMG: %s]" % alt) + elif name == 'body': + pass + elif name == 'a': + pass + elif name == 'input': + itype=None + iname=None + ilabel=None + iindex=None + widget=None + try: + itype = attrs['type'] + except KeyError: + print "WARNING: Unknow input type" + try: + ilabel = attrs['label'] + except KeyError: + pass + try: + iname = attrs['name'] + except KeyError: + print "WARNING: Unknow input name" + try: + iindex = int(attrs['index']) + except KeyError: + pass + ########################### add widget ############################# + if itype == "checkbox" or itype == "button" or itype == "slider": + if iname != None: + if iindex != None: + widget_array=eval( iname ) + widget=widget_array[iindex] + else: + widget=eval(iname) + else: + widget=None + + # add a widget + if self.main != None: + # based on http://njhurst.org/programming/python-toys/textview.txt + anchor_widget = self.textbuf.create_child_anchor(self.iter) + try: + self.textview.add_child_at_anchor (widget, anchor_widget) + except: + pass + else: + print "WARNING: not add widget, something wrong added" + ######################### end add widget ############################ + + elif name == "livevnc": + #print "htmltextview: name=%s ip=%s objdict=%s"%(name, attrs['ip'], attrs['objdict']) + vnc=getattr(self.main, attrs['objdict'])[attrs['ip']] + # set tittle + label=gtk.Label(attrs['title']) + title_rotate=int(attrs['title_rotate']) + label.set_property("angle", title_rotate) + label.show() + anchor_widget = self.textbuf.create_child_anchor(self.iter) + try: + self.textview.add_child_at_anchor (label, anchor_widget) + except: + pass + # insert vnc widget + anchor_widget = self.textbuf.create_child_anchor(self.iter) + try: + self.textview.add_child_at_anchor(vnc, anchor_widget) + except Exception, err: + print "htmltextview Exception, error=%s" % err + else: + warnings.warn("Unhandled element '%s'" % name) + + def endElement(self, name): + self._flush_text() + if name == 'p': + if not self.iter.starts_line(): + self._insert_text("\n") + elif name == 'div': + if not self.iter.starts_line(): + self._insert_text("\n") + elif name == 'span': + pass + elif name == 'br': + self._insert_text("\n") + elif name == 'ul': + self.list_counters.pop() + elif name == 'ol': + self.list_counters.pop() + elif name == 'li': + self._insert_text("\n") + elif name == 'img': + pass + elif name == 'body': + pass + elif name == 'a': + pass + elif name == 'input': + pass + elif name == 'livevnc': + pass + else: + warnings.warn("Unhandled element '%s'" % name) + self._end_span() + + +class HtmlTextView(gtk.TextView): + __gtype_name__ = 'HtmlTextView' + __gsignals__ = { + 'url-clicked': (gobject.SIGNAL_RUN_LAST, None, (str, str)), # href, type + } + + def __init__(self, main=None): + self.main=main + gtk.TextView.__init__(self) + self.set_wrap_mode(gtk.WRAP_CHAR) + self.set_editable(False) + self._changed_cursor = False + self.connect("motion-notify-event", self.__motion_notify_event) + self.connect("leave-notify-event", self.__leave_event) + self.connect("enter-notify-event", self.__motion_notify_event) + self.set_pixels_above_lines(6) + self.set_pixels_below_lines(6) + self.set_left_margin(10) + self.set_right_margin(10) + self.set_accepts_tab(True) + #self.set_tabs(pango.TabArray(20, True)) + self.myhtml="" + self.is_clean=True + + def __leave_event(self, widget, event): + if self._changed_cursor: + window = widget.get_window(gtk.TEXT_WINDOW_TEXT) + window.set_cursor(gtk.gdk.Cursor(gtk.gdk.XTERM)) + self._changed_cursor = False + + def __motion_notify_event(self, widget, event): + x, y, _ = widget.window.get_pointer() + x, y = widget.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT, x, y) + tags = widget.get_iter_at_location(x, y).get_tags() + for tag in tags: + if getattr(tag, 'is_anchor', False): + is_over_anchor = True + break + else: + is_over_anchor = False + if not self._changed_cursor and is_over_anchor: + window = widget.get_window(gtk.TEXT_WINDOW_TEXT) + window.set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND2)) + self._changed_cursor = True + elif self._changed_cursor and not is_over_anchor: + window = widget.get_window(gtk.TEXT_WINDOW_TEXT) + window.set_cursor(gtk.gdk.Cursor(gtk.gdk.XTERM)) + self._changed_cursor = False + return False + + def display_html(self, html): + #print ":::::::::::::::::::::HtmlTextView display_html():::::::::::::::::::::" + #print html + #print ":::::::::::::::::::::HtmlTextView display_html():::::::::::::::::::::" + #print "HtmlViewText::display_html() html=%s" %(html) + + buffer = self.get_buffer() + eob = buffer.get_end_iter() + ## this works too if libxml2 is not available + parser = xml.sax.make_parser(['drv_libxml2']) + # parser.setFeature(xml.sax.handler.feature_validation, True) + parser.setContentHandler(HtmlHandler(self, eob, main=self.main)) + + parser.parse(StringIO(html)) + """ + try: + parser.parse(StringIO(html)) + except: + print "Found exception in HtmlParser" + print html + """ + if not eob.starts_line(): + try: + buffer.insert(eob, "\n") + except: + pass + + def insert_html(self, html): + # FIXME need a BLOCK to avoid inserting from 2 threads.... + #print "::::::::::::::::HtmlTextView insert_html():::::::::::::::" + self.myhtml+=html + self.myhtml+='\n' + + def clean(self): + #print "CLEAN_HTML !!!!" + self.is_clean=True + buffer = self.get_buffer() + + #gtk.gdk.threads_enter() + buffer.set_text("") + #gtk.gdk.threads_leave() + if self.main.triggers.has_key('clean.datatxt'): + self.main.triggers['clean.datatxt']() + + self.myhtml="\n<body xmlns='http://www.w3.org/1999/xhtml'>\n" + + def display(self): + #print ":::::::::::::::::::::HtmlTextView display():::::::::::::::::::::" + if self.myhtml.find("</body>") == -1: + self.insert_html("</body>") + self.display_html(self.myhtml) + + def insert_block(self, txt, image=None, color="#96aeea", size="xx-large"): + self.insert_html(""" + <br /> + <div style='background-color:%s'>""" %(color) ) + if image != None: + self.insert_html(""" + <img file="%s" /> + """ %(image) ) + self.insert_html(""" + <span style='font-size:%s'> %s</span> + </div>\n\n""" %(size, txt) ) + + def insert_alert(self, txt, image=None, color="#f08196", size="medium"): + self.insert_html(""" + <br /> + <div style='background-color:#f08196'>""") + if image != None: + self.insert_html(""" + <img file="%s" /> + """ %(image) ) + self.insert_html(""" + <span style='font-size:medium'> %s</span> + </div>\n\n""" %(txt) ) + + def insert_list(self, mylist): + #print mylist + self.insert_html("\n\t<ul>\n") + for key, value in mylist: + #print "%s=%s" %(key, value) + self.insert_html(""" + <li> + <span style='font-size:large'> + <span style='font-weight:bold'>%s</span> + <span style='color:#508d5e'>%s</span> + </span> + </li>""" %(key, value) ) + self.insert_html("\n\t</ul>\n") + + def insert_proc(self, txt): + self.insert_html("<div>\n") + for line in txt: + if line == "": + continue + data=line.split() + #print "data=%s len=%s"%(data, len(data) ) + if len(data) < 2: + continue + PID = data[0] + Uid = data[1] + #VmSize = data[2] + #Stat = data[3] + Command = " ".join(data[2:]).replace('<', '<').replace('>','>,') + if PID == "PID": + self.insert_html("\n<div style='background-color:#CCAA66;color:blue'>%8s %6s %s</div>\n" \ + %(PID, Uid, Command) ) + continue + #PID, Uid, VmSize, Stat, Command = line.split(' ', 5) + if not Command == "": + #print "%8s %6s %5s %5s %s" %(PID, Uid, VmSize, Stat, Command) + self.insert_html("\n%8s %6s %s<br />" %(PID, Uid, Command) ) + self.insert_html("\n</div>\n") + +if gobject.pygtk_version < (2, 8): + gobject.type_register(HtmlTextView) + + +if __name__ == '__main__': + htmlview = HtmlTextView() + def url_cb(view, url, type_): + print "url-clicked", url, type_ + htmlview.connect("url-clicked", url_cb) + htmlview.display_html('<div><span style="color: red; text-decoration:underline">Hello</span><br/>\n' + ' <img src="http://images.slashdot.org/topics/topicsoftware.gif"/><br/>\n' + ' <span style="font-size: 500%; font-family: serif">World</span>\n' + '</div>\n') + htmlview.display_html("<br/>") + htmlview.display_html(""" + <p style='font-size:large'> + <span style='font-style: italic'>O<span style='font-size:larger'>M</span>G</span>, + I'm <span style='color:green'>green</span> + with <span style='font-weight: bold'>envy</span>! + </p> + """) + htmlview.display_html("<br/>") + htmlview.display_html(""" + <body xmlns='http://www.w3.org/1999/xhtml'> + <p>As Emerson said in his essay <span style='font-style: italic; background-color:cyan'>Self-Reliance</span>:</p> + <p style='margin-left: 5px; margin-right: 2%'> + "A foolish consistency is the hobgoblin of little minds." + </p> + </body> + """) + htmlview.display_html("<br/>") + htmlview.display_html(""" + <body xmlns='http://www.w3.org/1999/xhtml'> + <p style='text-align:center'>Hey, are you licensed to <a href='http://www.jabber.org/'>Jabber</a>?</p> + <p style='text-align:right'><img src='http://www.jabber.org/images/psa-license.jpg' + alt='A License to Jabber' + height='261' + width='537'/></p> + </body> + """) + + htmlview.display_html(""" + <body xmlns='http://www.w3.org/1999/xhtml'> + <ul style='background-color:rgb(120,140,100)'> + <li> One </li> + <li> Two </li> + <li> Three </li> + </ul> + </body> + """) + htmlview.display_html(""" + <body xmlns='http://www.w3.org/1999/xhtml'> + <ol> + <li> One </li> + <li> Two </li> + <li> Three </li> + </ol> + </body> + """) + htmlview.show() + sw = gtk.ScrolledWindow() + sw.set_property("hscrollbar-policy", gtk.POLICY_AUTOMATIC) + sw.set_property("vscrollbar-policy", gtk.POLICY_AUTOMATIC) + sw.set_property("border-width", 0) + sw.add(htmlview) + sw.show() + frame = gtk.Frame() + frame.set_shadow_type(gtk.SHADOW_IN) + frame.show() + frame.add(sw) + w = gtk.Window() + w.add(frame) + w.set_default_size(400, 300) + w.show_all() + w.connect("destroy", lambda w: gtk.main_quit()) + gtk.main() diff --git a/tcosmonitor/ping.py b/tcosmonitor/ping.py new file mode 100644 index 0000000..102c2b9 --- /dev/null +++ b/tcosmonitor/ping.py @@ -0,0 +1,467 @@ +# -*- coding: UTF-8 -*- +# +# pingip based on +# Filename: ping.py +# Discripion: +# Author(s): yetist +# Version: +# URL: http://www.osprg.org/modules/newbb/viewtopic.php?forum=3&post_id=487 +# +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + + +import sys +import os +import re +from threading import Thread +import socket +from gettext import gettext as _ +from subprocess import Popen, PIPE, STDOUT + +import netifaces +import IPy +import tcosmonitor.shared + +import xml.dom.minidom + +def print_debug(txt): + if tcosmonitor.shared.debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + +class pingip(Thread): + def __init__ (self, ip): + Thread.__init__(self) + self.ip = ip + self.status = -1 + self.lifeline = re.compile(r"(\d) received") + def run(self): + #print_debug("ping to '%s'" %self.ip) + pingalingout = Popen(["ping", "-q", "-W1", "-c2", "%s" %self.ip], \ + shell=False, stdout=PIPE, stderr=STDOUT, close_fds=True) + try: + pingalingout.wait() + except Exception, err: + print_debug("pingip() Exception in wait() error: %s"%err) + pingaling = pingalingout.stdout + while 1: + line = pingaling.readline() + if not line: + break + igot = re.findall(self.lifeline, line) + if igot: + self.status = int(igot[0]) + +class Ping: + def __init__(self, main): + print_debug ( "__init__()" ) + self.main=main + self.reachip=[] + + def ping_iprange_nmap(self, selfip): + print_debug("ping_iprange_nmap() ip=%s"%selfip) + pinglist=[] + reachip=[] + + server_ips=self.get_server_ips() + self.main.common.threads_enter("Nmap:only show tcos") + self.main.write_into_statusbar( _("Testing if found clients have 8998 or 8999 port open...")) + self.main.common.threads_leave("Nmap:only show tcos") + + if self.main.config.GetVar("onlyshowtcos") == 1: + print_debug("cmd='nmap -sS -p%s -n --open -oX - %s'"%(tcosmonitor.shared.xmlremote_port, selfip)) + cmd="nmap -sS -p%s -n --open -oX - %s" %(tcosmonitor.shared.xmlremote_port, selfip) + else: + print_debug("cmd='nmap -sP -n -oX - %s'"%selfip) + cmd="nmap -sP -n -oX - %s" %selfip + + try: + p = Popen(cmd, shell=True, bufsize=100000, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True) + except Exception, e: + print_debug("Exception in subprocess cmd(%s), error='%s'"%(cmd, e)) + return None + + # Use dom to parse output, idea taken from python-nmap source + # wait until finished + # get output + (nmap_last_output, nmap_err) = p.communicate() + # If there was something on stderr, there was a problem so abort... + if len(nmap_err) > 0: + print_debug("Error in nmap cmd(%s), error='%s'"%(cmd, nmap_err)) + return [] + + dom = xml.dom.minidom.parseString(nmap_last_output) + + for dhost in dom.getElementsByTagName('host'): + ipnmap = dhost.getElementsByTagName('address')[0].getAttributeNode('addr').value + for dstatus in dhost.getElementsByTagName('status'): + # is up? + up = dstatus.getAttributeNode('state').value + reason = dstatus.getAttributeNode('reason').value + if up != "up" or reason != "arp-response": + continue + if self.main.config.GetVar("onlyshowtcos") == 1: + for dport in dhost.getElementsByTagName('port'): + proto = dport.getAttributeNode('protocol').value + port = int(dport.getAttributeNode('portid').value) + state = dport.getElementsByTagName('state')[0].getAttributeNode('state').value + if port == tcosmonitor.shared.xmlremote_port and state == "open": + pinglist.append(ipnmap) + else: + pinglist.append(ipnmap) + + print_debug(pinglist) + try: + inhosttcos=str(tcosmonitor.shared.parseIPAddress(os.environ["DISPLAY"])) + # running tcosmonitor on thin client ? + except Exception, err: + print_debug("ping_iprange_nmap() can't read DISPLAY, %s"%err) + + i=0 + for ipnmap in pinglist: + i=i+1 + if ipnmap in server_ips: + print_debug("Nmap:: ip (%s) is in server_ips(%s)" % (ipnmap, server_ips) ) + continue + #print "ping to %s" %(ip) + if self.main.worker.is_stoped(): + print_debug("ping_iprange_nmap() WORKER is stoped") + # this is a stop thread var + break + ########## + self.main.common.threads_enter("Ping:ping_iprange_nmap show progress") + self.main.progressbar.show() + self.main.progressbutton.show() + self.main.actions.set_progressbar( _("Checking %s...")%(ipnmap), float(i)/len(pinglist) ) + #print_debug("ping_iprange() ip=%s"%(ip)) + self.main.common.threads_leave("Ping:ping_iprange_nmap show progress") + ############ + + # check for notshowwhentcosmonitor + if self.main.config.GetVar("notshowwhentcosmonitor") == 1: + # if $DISPLAY = xx.xx.xx.xx:0 remove from allclients + if inhosttcos == ipnmap: + # running tcosmonitor on thin client + continue + + # only show in list hosts running tcosxmlrpc in 8998 or 8999 port + if self.main.config.GetVar("onlyshowtcos") == 1: + self.main.common.threads_enter("Ping:only show tcos") + self.main.write_into_statusbar( _("Testing if found clients have 8998 or 8999 port open...")) + self.main.common.threads_leave("Ping:only show tcos") + # view status of port 8998 or 8999 + if self.main.xmlrpc.newhost(ipnmap): + if self.main.xmlrpc.GetVersion(): + print_debug("ping_iprange() host=%s ports 8998 or 8999 OPEN" %(ipnmap)) + reachip.append(ipnmap) + else: + print_debug("ping_iprange() host=%s ports 8998 or 8999 OPEN but not tcosxmlrpc" %(ipnmap)) + else: + print_debug("ping_iprange() host=%s ports 8998 or 8999 closed" %(ipnmap)) + else: + reachip.append(ipnmap) + + print_debug("ping_iprange_nmap() discovered host finished" ) + self.main.worker.set_finished() + + if len(reachip) == 0: + self.main.common.threads_enter("Ping:ping_iprange_nmap print no hosts") + self.main.write_into_statusbar ( _("Not connected hosts found.") ) + self.main.progressbar.hide() + self.main.progressbutton.hide() + self.main.common.threads_leave("Ping:ping_iprange_nmap print no hosts") + + if len(reachip) > 0: + self.main.common.threads_enter("Ping:ping_iprange_nmap print num hosts") + self.main.actions.lenclients=len(reachip) + self.main.write_into_statusbar ( _("Found %d hosts" ) %len(reachip) ) + self.main.common.threads_leave("Ping:ping_iprange_nmap print num hosts") + + self.main.localdata.allclients=reachip + + self.main.worker=tcosmonitor.shared.Workers( self.main,\ + target=self.main.actions.populate_hostlist, \ + args=([reachip]) ) + self.main.worker.start() + + return reachip + + def ping_iprange(self, selfip): + print_debug("ping_iprange() ip=%s"%selfip) + pinglist=[] + reachip=[] + server_ips=self.get_server_ips() + + for i in range(1, 255): + iprange=selfip.split(".")[:-1] + ip=".".join(iprange)+"."+str(i) + # don't show server in list + if ip in server_ips: + print_debug("Ping:: ip (%s) is in server_ips(%s)" % (ip, server_ips) ) + continue + #print "ping to %s" %(ip) + if self.main.worker.is_stoped(): + print_debug("ping_iprange() WORKER is stoped") + # this is a stop thread var + break + ########## + self.main.common.threads_enter("Ping:ping_iprange show progress") + self.main.progressbar.show() + self.main.progressbutton.show() + self.main.actions.set_progressbar( _("Ping to %s...")%(ip), float(i)/float(254) ) + #print_debug("ping_iprange() ip=%s"%(ip)) + self.main.common.threads_leave("Ping:ping_iprange show progress") + ############ + current = pingip(ip) + try: + # in some situations ( I can reproduce ) thread can't be started + # don't fail and only wait if thread start ok + current.start() + pinglist.append(current) + except Exception, err: + print_debug("ping thread Exception ip=%s err=%s"%(ip, err)) + + self.main.common.threads_enter("Ping:ping_iprange print waiting") + self.main.actions.set_progressbar( _("Waiting for pings...") , float(1) ) + self.main.common.threads_leave("Ping:ping_iprange print waiting") + + try: + inhosttcos=str(tcosmonitor.shared.parseIPAddress(os.environ["DISPLAY"])) + # running tcosmonitor on thin client ? + except Exception, err: + print_debug("ping_iprange_nmap() can't read DISPLAY, %s"%err) + + for pingle in pinglist: + pingle.join() + if pingle.status == 2: + # check for notshowwhentcosmonitor + if self.main.config.GetVar("notshowwhentcosmonitor") == 1: + # if $DISPLAY = xx.xx.xx.xx:0 remove from allclients + if inhosttcos == pingle.ip: + # running tcosmonitor on thin client + continue + + # only show in list hosts running tcosxmlrpc in 8998 or 8999 port + if self.main.config.GetVar("onlyshowtcos") == 1: + self.main.common.threads_enter("Ping:only show tcos") + self.main.write_into_statusbar( _("Testing if found clients have 8998 or 8999 port open...")) + self.main.common.threads_leave("Ping:only show tcos") + # view status of port 8998 or 8999 + if self.main.xmlrpc.newhost(pingle.ip): + if self.main.xmlrpc.GetVersion(): + print_debug("ping_iprange() host=%s ports 8998 or 8999 OPEN" %(pingle.ip)) + reachip.append(pingle.ip) + else: + print_debug("ping_iprange() host=%s ports 8998 or 8999 OPEN but not tcosxmlrpc" %(pingle.ip)) + else: + print_debug("ping_iprange() host=%s ports 8998 or 8999 closed" %(pingle.ip)) + else: + reachip.append(pingle.ip) + + print_debug("ping_iprange() discovered host finished" ) + self.main.worker.set_finished() + + if len(reachip) == 0: + self.main.common.threads_enter("Ping:ping_iprange print no hosts") + self.main.write_into_statusbar ( _("Not connected hosts found.") ) + self.main.progressbar.hide() + self.main.progressbutton.hide() + self.main.common.threads_leave("Ping:ping_iprange print no hosts") + + if len(reachip) > 0: + self.main.common.threads_enter("Ping:ping_iprange print num hosts") + self.main.actions.lenclients=len(reachip) + self.main.write_into_statusbar ( _("Found %d hosts" ) %len(reachip) ) + self.main.common.threads_leave("Ping:ping_iprange print num hosts") + + self.main.localdata.allclients=reachip + + self.main.worker=tcosmonitor.shared.Workers( self.main,\ + target=self.main.actions.populate_hostlist, \ + args=([reachip]) ) + self.main.worker.start() + + return reachip + + + def ping_iprange_static(self, allclients): + print_debug("ping_iprange_static() ip=%s"%allclients) + pinglist=[] + reachip=[] + + for ip in allclients: + #print "ping to %s" %(ip) + if self.main.worker.is_stoped(): + print_debug("ping_iprange() WORKER is stoped") + # this is a stop thread var + break + current = pingip(ip) + pinglist.append(current) + current.start() + + for pingle in pinglist: + pingle.join() + if pingle.status == 2: + # only show in list hosts running tcosxmlrpc in 8998 or 8999 port + if self.main.config.GetVar("onlyshowtcos") == 1: + self.main.common.threads_enter("Ping:only show tcos") + self.main.write_into_statusbar( _("Testing if found clients have 8998 or 8999 port open...")) + self.main.common.threads_leave("Ping:only show tcos") + # view status of port 8998 or 8999 + if self.main.xmlrpc.newhost(pingle.ip): + if self.main.xmlrpc.GetVersion(): + print_debug("ping_iprange() host=%s ports 8998 or 8999 OPEN" %(pingle.ip)) + reachip.append(pingle.ip) + else: + print_debug("ping_iprange() host=%s ports 8998 or 8999 OPEN but not tcosxmlrpc" %(pingle.ip)) + else: + print_debug("ping_iprange() host=%s ports 8998 or 8999 closed" %(pingle.ip)) + else: + reachip.append(pingle.ip) + + print_debug("ping_iprange_static() discovered host finished" ) + self.main.worker.set_finished() + + self.main.localdata.allclients=reachip + + if len(reachip) == 0: + self.main.common.threads_enter("Ping:ping_iprange_static print no hosts") + self.main.write_into_statusbar ( _("Not connected hosts found.") ) + self.main.common.threads_leave("Ping:ping_iprange_static print no hosts") + + if len(reachip) > 0: + self.main.common.threads_enter("Ping:ping_iprange_static print num hosts") + self.main.write_into_statusbar ( _("Found %d hosts" ) %len(reachip) ) + self.main.common.threads_leave("Ping:ping_iprange_static print num hosts") + + self.main.worker=tcosmonitor.shared.Workers( self.main,\ + target=self.main.actions.populate_hostlist, \ + args=([reachip]) ) + self.main.worker.start() + + return reachip + + def get_ip_address(self, ifname): + print_debug("get_ip_address() ifname=%s" %(ifname) ) + if not ifname in netifaces.interfaces(): + return None + ip=netifaces.ifaddresses(ifname) + if ip.has_key(netifaces.AF_INET): + return ip[netifaces.AF_INET][0]['addr'] + return None + + def get_net_address(self, ifname): + print_debug("get_net_address() ifname=%s" %(ifname) ) + if not ifname in netifaces.interfaces(): + return None + ip=netifaces.ifaddresses(ifname) + if ip.has_key(netifaces.AF_INET): + address="%s" %ip[netifaces.AF_INET][0]['addr'] + mask="%s" %ip[netifaces.AF_INET][0]['netmask'] + net="%s" %IPy.IP(address).make_net(mask) + print_debug("net=%s" %net) + return net + return None + + def get_server_ips(self): + IPS=[] + for dev in netifaces.interfaces(): + if not dev in tcosmonitor.shared.hidden_network_ifaces: + print_debug("get_server_ips() add interface %s"%dev) + ip=netifaces.ifaddresses(dev) + if ip.has_key(netifaces.AF_INET): + ip[netifaces.AF_INET][0]['gateway']=self.get_gateway(dev) + print_debug("get_server_ips() iface=%s data=%s"%(dev, ip[netifaces.AF_INET] )) + IPS.append(ip[netifaces.AF_INET][0]['addr']) + return IPS + + def get_gateway(self, iface): + data=[] + f=open("/proc/net/route", 'r') + for l in f.readlines(): + if l.startswith(iface): + tmp=l.strip().split() + if tmp[1] == "00000000": + data.append(self.__hex2dec__(tmp[2])) + f.close() + if len(data) < 1: + #print ("WARNING: no gateway") + return None + else: + return data[0] + + def __hex2dec__(self, s): + out=[] + for i in range(len(s)/2): + out.append( str(int(s[i*2:(i*2)+2], 16)) ) + # data in /proc/net/route is reversed + out.reverse() + return ".".join(out) + + +class PingPort: + """ try to open a socket to host:ip """ + def __init__(self, host, port, timeout=1): + self.host=host + self.port=int(port) + print_debug("PingPort() host=%s port=%d" %(host, self.port) ) + if self.host == "": + print_debug ( "PingPort() need host to connect" ) + self.status = "CLOSED" + return + + self.status=None + socket.setdefaulttimeout(timeout) + self.sd = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + print_debug( "PingPort()::__init__(host=%s, port=%d timeout=%f)" %(self.host, self.port, timeout) ) + try: + # connect to the given host:port + self.sd.connect((self.host, self.port)) + except socket.error: + # set the CLOSED flag + self.status = "CLOSED" + else: + self.status = "OPEN" + self.sd.close() + + socket.setdefaulttimeout(timeout) + + def get_status(self): + """ return socket status + values: OPEN CLOSED + """ + print_debug ( "%s:%s port is \"%s\"" %(self.host, self.port, self.status) ) + socket.setdefaulttimeout(tcosmonitor.shared.socket_default_timeout) + return self.status + + +if __name__ == '__main__': + tcosmonitor.shared.debug=True + #for i in range(20): + # PingPort("192.168.0.3", i+100).get_status() + #PingPort("192.168.0.5", 6000, 0.5).get_status() + #PingPort("192.168.0.1", 6000, 0.5).get_status() + #PingPort(sys.argv[1], sys.argv[2], 0.5).get_status() + app=Ping(None) + print ( app.get_server_ips() ) + print ( app.get_ip_address('eth0') ) + print ( app.get_ip_address('br0') ) + diff --git a/tcosmonitor/shared.py b/tcosmonitor/shared.py new file mode 100644 index 0000000..84aca80 --- /dev/null +++ b/tcosmonitor/shared.py @@ -0,0 +1,830 @@ +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# Defaults values of TcosMonitor + + +import os +import sys +from gettext import gettext as _ +from gettext import bindtextdomain, textdomain +from locale import setlocale, LC_ALL + +have_display=False +allow_local_display=False + +# import if DISPLAY is defined +if "DISPLAY" in os.environ: + if os.environ["DISPLAY"] != "": + have_display=True + import pygtk + pygtk.require('2.0') + import gtk + +# program name to use in gettext .mo +PACKAGE = "tcosmonitor" + + + +# version +version="__VERSION__" +website="http://www.tcosproject.org" +LICENSE_FILE="/usr/share/common-licenses/GPL-2" + +# default debug value (overwrite with --debug or -d) +debug=False + +# default TCOS config file (default in this path, if installed use global) +tcos_config_file="./tcos.conf" + +# if exec from svn or sources dir +if os.path.isdir('./debian') and os.path.isdir('./po'): + LOCALE_DIR = "./po/" + GLADE_DIR = "./ui/" + IMG_DIR = "./images/" + tcos_config_file="./tcos.conf" + GLOBAL_CONF='./tcosmonitor.conf' +else: + tcos_config_file="/etc/tcos/tcos.conf" + GLADE_DIR = "/usr/share/tcosmonitor/ui/" + IMG_DIR = "/usr/share/tcosmonitor/images/" + LOCALE_DIR = "/usr/share/locale" + GLOBAL_CONF='/etc/tcos/tcosmonitor.conf' + + +# gettext support +setlocale( LC_ALL ) +bindtextdomain( PACKAGE, LOCALE_DIR ) +textdomain( PACKAGE ) + +# config file +config_file=os.path.expanduser('~/.tcosmonitor.conf') +config_file_secrets=('/etc/tcos/secrets/tcosmonitor-secret') + + +scan_methods=[ +"netstat", +"ping", +"nmap", +"static", +"consolekit", +"avahi", +] + +vcodecs=["mp4v", "mp1v", "h264", "theo"] +vencs=["ffmpeg", "x264", "theora"] +acodecs=["mpga", "vorb"] +aencs=["ffmpeg", "vorbis"] +accesss=["udp", "http"] +muxs=["ts", "ogg"] + +vlc_methods_send=[ +"ffmpeg-MPEG4", +"ffmpeg-MPEG1", +"x264-MPEG4", +"http-Theora", +"http-MPEG1" +] + +list_modes=[ +['list', _("Traditional list only") ], +['icons', _("Icons only") ], +['class', _("Simulate classroom") ], +['both', _("Lists, icons and classroom with tabs") ], + ] + +DefaultConfig=[ +["populate_list_at_startup", 0, "int"], +#["work_as_cyber_mode", 0, "int"], +["refresh_interval", 0, "int"], +["cache_timeout", 0, "int"], +["actions_timeout", 0, "int"], +["scan_network_method", "netstat", "str"], +["scrot_size", 65, "int"], # % of screenshot +["miniscrot_size", 25, "int"], # % of screenshot +["xmlrpc_username", "user", "str"], +["xmlrpc_password","", "str"], +["network_interface","eth0", "str"], +["tcosinfo", 1, "int"], +["cpuinfo", 0, "int"], +["kernelmodulesinfo", 0, "int"], +["pcibusinfo", 0, "int"], +["ramswapinfo", 0, "int"], +["processinfo", 0, "int"], +["networkinfo", 0, "int"], +["xorginfo", 0, "int"], +["soundserverinfo", 0, "int"], +["systemprocess", 0, "int"], +["threadscontrol", 1, "int"], +["tcosmonitorversion", version, "str"], +["blockactioninthishost", 1, "int"], +["notshowwhentcosmonitor", 0, "int"], +["onlyshowtcos", 1, "int"], +["selectedhosts", 0, "int"], +["statichosts", "", "str"], +["ssh_remote_username", "root", "str"], +["vlc_method_send", "ffmpeg-MPEG4", "str"], +["show_donate", 1, "int"], +["visible_menus", "", "str"], +["visible_buttons_menus", "", "str"], +["enable_sslxmlrpc", 0, "int"], +["ports_tnc", "", "str"], +["listmode", "list", "str"], +["menugroups", 1, "int"], +["positions", "", "str"], +["show_about", 1, "int"], +["consolekit", 0, "int"], +] + +# +# IMPORTANT NOTE +# PLEASE DON'T SET "show__donate" TO "0" by default if you don't have a good reason +# tcosmonitor need to show this message when loads first time to get some +# users colaboration. +# +# Please contact with developers if you are not agree with this. +# + + +# method ping is list 0 of combo_scan_method + + + +# text file enabling or disabling tcos-devices-ng or tcos-volume-manager +module_conf_file="/etc/tcos/tcosmonitor.conf" + +httpd_port=8081 + +xmlremote_port=8998 +xmlremote_sslport=8999 +xmlremote_url="/RPC2" + +pulseaudio_soundserver_port=4713 +# +#char *dev_name[SOUND_MIXER_NRDEVICES] = { \ +# "Master", \ +# "Bass", \ +# "Treble", \ +# "Synth", \ +# "PCM", \ +# "Speaker", \ +# "Line", \ +# "Mic", \ +# "CD", \ +# "Mix", \ +# "PCM2", \ +# "Record", \ +# "Input", \ +# "Output", \ +# "Line 1", \ +# "Line 2", \ +# "Line 3", \ +# "Digital1", \ +# "Digital2", \ +# "Digital3", \ +# "Phone In", \ +# "PhoneOut", \ +# "Video", \ +# "Radio", \ +# "Monitor" }; +# +sound_only_channels=["Front", "Master", "Master Front", "PCM", "Line", "CD", + "Mic", "Front Mic", "Aux", "Headphone", "Speaker" , "PC Speaker", + "vol", "pcm", "line", "cd", "mic", + "Mix", "PCM2", "Capture"] + +hidden_network_ifaces=["lo", "sit0", "pan0", "wmaster0", "vmnet0", "vmnet1", "vmnet8", "vbox0", "vbox1", "vbox2", "vboxnet0", "vboxnet1"] + +# for enable exclude users, change to "tcosmonitor-exclude" +dont_show_users_in_group="tcosmonitor-exclude" + +check_tcosmonitor_user_group=False + +tnc_only_ports="no" + +cache_timeout=20 + +wait_between_many_host=0.1 +socket_default_timeout=15 + +dbus_disabled=False + +disable_textview_on_update=True + +icon_image_thin="client.png" +icon_image_standalone="client.png" +icon_image_no_logged="host_tcos.png" + + +NO_LOGIN_MSG="---" + +## +## entry completion example apps +## + +appslist=[ +'xterm', +'firefox', +'iceweasel', +'gimp', +'oowriter', +'oocalc', +'oodraw' , +'gnumeric', +'abiword' , +'gedit', +'jclic', +'amsn', +'gftp', +'gcalctool', +'nautilus', +'konqueror', +'beep-media-player', +'audacious', +'tcos-volume-manager', +'tcos-devices-ng' +] + +# main one host menus +### +### [ TEXT, ICON (in images dir), [submenus index] ] +### +onehost_mainmenus = [ + [ _("Terminal actions") , "active.png", [0,2,3,4,5,22,23,9,10,12,19,1] ], + [ _("User actions") , "logged.png", [11,13,14,15,20,21,6,7] ], + [ _("Audio, video and files"), "multimedia.png", [8,17,16,18,24]], +] + +### +### [ TEXT, ICON (in images dir), EXTENSION (or None) ] +### +onehost_menuitems=[ + [ _("Refresh terminal info"), "menu_refresh.png", "extensions.info" , 0] , #action=0 + [ _("Clean info about terminal"), "menu_clear.png"] , #action=1 + [ _("Reboot"), "menu_reboot.png"] , #action=2 + [ _("Poweroff"), "menu_poweroff.png"] , #action=3 + [ _("Lock screen"), "menu_lock.png" ] , #action=4 + [ _("Unlock screen"), "menu_unlock.png" ] , #action=5 + [ _("Connect to remote screen (iTALC)"), "menu_remote.png" ],#action=6 + [ _("Connect to remote screen (VNC)"), "menu_remote.png" ] , #action=7 + [ _("Screenshot"), "menu_screenshot.png" ] , #action=8 + [ _("Give a remote xterm"), "menu_xterm.png" ] , #action=9 + [ _("Configure this host"), "menu_configure.png" ] , #action=10 + [ _("Logout client"), "menu_restartx.png" ] , #action=11 + [ _("Restart X session with new settings"), "menu_newconf.png" ] , #action=12 + [ _("Exec app on user display") , "menu_exec.png" ] , #action=13 + [ _("Send a text message to user") , "menu_msg.png" ] , #action=14 + [ _("Show running apps of this client") , "menu_proc.png" ], #action=15 + [ _("Audio/Video broadcast") , "menu_broadcast.png" ], #action=16 + [ _("Send files") , "menu_send.png" ], #action=17 + [ _("Demo mode (from this host)") , "menu_tiza.png" ], #action=18 + [ _("Boot client (WakeOnLan)") , "menu_wol.png" ], #action=19 + [ _("Lock internet"), "menu_locknet.png" ] , #action=20 + [ _("Unlock internet"), "menu_unlocknet.png" ], #action=21 + [ _("DPMS Power off monitor"), "menu_dpms_off.png" ] , #action=22 + [ _("DPMS Power on monitor"), "menu_dpms_on.png" ], #action=23 + [ _("Send MIC audio (from this host)"), "menu_rtp.png" ], #action=24 + ] + + +# main one host menus +### +### [ TEXT, ICON (in images dir), [submenus index] ] +### +allhost_mainmenus = [ + [ _("Terminal actions") , "active.png", [0,1,2,3,4,5,13,16,17] ], + [ _("User actions") , "logged.png", [6,7,8,14,15,19] ], + [ _("Audio, video and files"), "multimedia.png", [10,12,11,9,18]], +] + +### +### [ TEXT, ICON (in images dir) ] +### +allhost_menuitems=[ + [ _("Reboot all clients"), "menu_reboot.png"] , #action=0 + [ _("Poweroff all clients"), "menu_poweroff.png"] , #action=1 + [ _("Lock all screens"), "menu_lock.png" ] , #action=2 + [ _("Unlock all screens"), "menu_unlock.png" ] , #action=3 + [ _("Logout clients"), "menu_restartx.png" ] , #action=4 + [ _("Restart X session of all clients"), "menu_newconf.png" ] ,#action=5 + [ _("Exec same app in all connected users") , "menu_exec.png" ] ,#action=6 + [ _("Send a text message to all connected users") , "menu_msg.png" ], #action=7 + [ _("Enter demo mode, all connected users see my screen") , "menu_tiza.png" ], #action=8 + [ _("Enter conference mode, all connected users can hear me") , "menu_rtp.png" ], #action=9 + [ _("Capture All clients screens") , "menu_screenshot.png" ], #action=10 + [ _("Audio/Video broadcast") , "menu_broadcast.png" ], #action=11 + [ _("Send files") , "menu_send.png" ], #action=12 + [ _("Boot All clients (WakeOnLan)") , "menu_wol.png" ], #action=13 + [ _("Lock internet in all connected users"), "menu_locknet.png" ] , #action=14 + [ _("Unlock internet in all connected users"), "menu_unlocknet.png" ], #action=15 + [ _("DPMS Power off monitors"), "menu_dpms_off.png" ] , #action=16 + [ _("DPMS Power on monitors"), "menu_dpms_on.png" ], #action=17 + [ _("Chat audio conference"), "menu_rtp.png" ], #action=18 + [ _("Live view screens with VNC"), "menu_remote.png" ], #action=19 + ] + +preferences_menus_always_show={"menuone":[0,1], "menuall":[4]} + +# format +#ui_widget, [default_enabled, menuone , menuall] +preferences_menus={ +"ck_menu_lock":[ True, [4,5], [2,3] ], +"ck_menu_italc":[ False, [6], [] ], +"ck_menu_vnc":[ True, [7], [] ], +"ck_menu_reboot":[ True, [2,3], [0,1] ], +"ck_menu_screenshots":[ True, [8], [10]], +"ck_menu_shell":[ False, [9], []], +"ck_menu_xorg":[ True, [10,11], [] ], +"ck_menu_restartx":[ True, [12], [5] ], +"ck_menu_exe":[ True, [13], [6] ], +"ck_menu_text":[ True, [14], [7] ], +"ck_menu_show":[ True, [15], [] ], +"ck_menu_video":[ True, [16], [11] ], +"ck_menu_send":[ True, [17], [12] ], +"ck_menu_demo":[ True, [18], [8] ], +"ck_menu_wakeonlan":[ False, [19], [13] ], +"ck_menu_conference":[ True, [24], [9,18] ], +"ck_menu_net":[ True, [20,21],[14,15] ], +"ck_menu_dpms":[ True, [22,23],[16,17] ], +"ck_menu_personalize":[ False, [10], [] ], +"ck_menu_livevnc":[ True, [], [19] ], +} + +button_preferences_menus={ +"ck_button_menu_chat":[ False ], +"ck_button_menu_list":[ False ], +"ck_button_menu_exe":[ False ], +"ck_button_menu_text":[ False ], +"ck_button_menu_video":[ False ], +"ck_button_menu_send":[ False ], +"ck_button_menu_audio":[ False ], +} + + +# this list contains all process to not show in user processes +system_process=[ + "dbus-daemon", + "tcos-dbus-client", + "scp-client", + "ssh-agent", + "dbus-launch", + "gam_server", + "gconfd", + "gnome-keyring-daemon", + "gnome-applets", + "gnome-pty-helper", + "gnome-settings-daemon", + "-applet", + "gnome-vfs", + "panel-plugins", + "dcop", + "bonobo", + "xauth", + "faucet", + "trackerd", + "metacity", + "gnome-panel", + "nautilus", + "gnome-power-manager", + "gnome-cups-icon", + "evolution-alarm-notify", + "update-notifier", + "system-config-printer", + "gnome-volume-manager", + "seahorse-agent", + "smart-notifier", + "[python]", + "[sh]", + "tcos-volume-manager", + "notification-daemon", + "bash", + "gvfsd", + "gconf-helper", + "gdu-notification-daemon", + "gvfs-gdu-volume", + "gvfs-afc-volume-monitor", + "gvfs-gphoto2-volume-monitor", + "indicator-messages-service", + "indicator-application-service", + "indicator-sound-service", + "notify-osd", + "polkit-gnome-authentication-agent-1", + "gvfs-fuse-daemon", +] + + + +# TcosPersonalize stuff + +remotehost=None + +xsession_values=[ +"XDMCP", +"local", +"sshX", +"FreeNX", +"rDesktop" +] +xsession_default="XDMCP" + +# FIXME need to support other drivers +xdriver_values=[ +"auto" +] +xdriver_default="auto" + + +# obtained from configure xorg +# grep "@" bin/configurexorg | \ +# grep Hz | awk -F ")" '{print $1}' | awk '{print $1", "}' +xres_values=[ +"640x480 @ 60Hz", +"640x480 @ 72Hz", +"800x600 @ 60Hz", +"800x600 @ 72Hz", +"800x600 @ 85Hz", +"832x624 @ 75Hz", +"1024x768 @ 60Hz", # <= default +"1024x768 @ 70Hz", +"1024x768 @ 75Hz", +"1152x768 @ 54.8Hz", +"1152x864 @ 60Hz", +"1152x864 @ 75Hz", +"1280x768 @ 60Hz", +"1280x800 @ 60Hz", +"1280x960 @ 60Hz", +"1280x960 @ 85Hz", +"1280x1024 @ 60Hz", +"1400x1050 @ 60Hz", +"1400x1050 @ 75Hz", +"1440x900 @ 60Hz", +"1440x900 @ 75Hz", +"1600x1024 @ 85Hz", +"1600x1200 @ 60Hz", +"1600x1200 @ 75Hz", +"1600x1200 @ 85Hz", +"1680x1050 @ 60Hz", +"1792x1344 @ 75Hz", +"1792x1344 @ 60Hz", +"1856x1392 @ 60Hz", +"1856x1392 @ 75Hz", +"1920x1200 @ 60Hz", +"1920x1440 @ 60Hz", +"1920x1440 @ 75Hz", +"1920x1440 @ 85Hz", +"2048x1536 @ 60Hz", +"2048x1536 @ 75Hz", +"2048x1536 @ 85Hz", +] +xres_default="1024x768 @ 60Hz" + + +xdepth_values=[ +"24", +"16", +"15", +"8", +"4", +"1" +] +xdepth_default="16" + + + +PersonalizeConfig=[ +["xdriver", xdriver_default, "str"], +["xres", xres_default, "str"], +["xdepth", xdepth_default, "str"], +["xmousewheel",1, "int"], +["xdontzap",0, "int"], +["xdpms",1, "int"], +["xsession", xsession_default, "str"], +["xhorizsync", "", "str"], +["xvertsync", "", "str"], +["tcospersonalizeversion", version, "str"] +] + + + +# shared functions + +def print_debug(txt): + if debug: + print >> sys.stderr, "%s::%s" % (__name__, txt) + #print("%s::%s" % (__name__, txt), file=sys.stderr) + + +if have_display: + def ask_msg(txt): + response="yes" + d = gtk.MessageDialog(None, + gtk.DIALOG_MODAL | + gtk.DIALOG_DESTROY_WITH_PARENT, + gtk.MESSAGE_QUESTION, + gtk.BUTTONS_YES_NO, + txt) + if d.run() == gtk.RESPONSE_YES: + response=True + else: + response=False + d.destroy() + print_debug( _("QUESTION: %(txt)s, RESPONSE %(response)s") %{"txt":txt, "response":response} ) + return response + + def info_msg(txt, urgency=False): + if urgency: + d = gtk.MessageDialog(None, + gtk.DIALOG_MODAL | + gtk.DIALOG_DESTROY_WITH_PARENT, + gtk.MESSAGE_INFO, + gtk.BUTTONS_OK_CANCEL, + None) + d.set_markup(txt) + if d.run() == gtk.RESPONSE_OK: + response=True + else: + response=False + d.destroy() + print_debug ( _("INFO: %s") % txt ) + return response + else: + d = gtk.MessageDialog(None, + gtk.DIALOG_MODAL | + gtk.DIALOG_DESTROY_WITH_PARENT, + gtk.MESSAGE_INFO, + gtk.BUTTONS_OK, + txt) + d.run() + d.destroy() + print_debug ( _("INFO: %s") % txt ) + + def error_msg(txt): + d = gtk.MessageDialog(None, + gtk.DIALOG_MODAL | + gtk.DIALOG_DESTROY_WITH_PARENT, + gtk.MESSAGE_WARNING, + gtk.BUTTONS_OK, + txt) + d.run() + d.destroy() + print_debug ( _("ERROR: %s") % txt ) + + + def test_start(module): + """ + read conf file and test if module is active + """ + f=open(module_conf_file, "r") + conf=f.readlines() + f.close() + + for line in conf: + if line == '\n': + continue + if line.find('#') == 0: + continue + line=line.replace('\n', '') + if "=" in line: + if line.split('=')[0] == module: + if line.split('=')[1] == "0": + return False + else: + return True + +import binascii +import IPy +import ipaddr +import re + +def isIPAddr(ip_str): + pattern = r"\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b" + if re.match(pattern, ip_str): + return True + else: + return False + +def is_bin(txt): + if txt in ['3a', '2e', '61', '62', '63', '64', '65', '66']: + # txt is ':' or '.' or a letter between a-f + return False + try: + txt=int(txt) + except ValueError: + # can't convert txt to int, txt is hexadecimal aka binary + return True + + if txt >= 30 and txt <= 39: + # txt is between 0(0x30) and 9(0x39) + return False + # return binary by default + return True + +def parseIPAddress(ipstr, return_ipv4=True): + """ + pass an string or binary IP and return IPV4 + """ + newip=[] + isBin=False + + if ipstr == "::1": + # localhost in IPV6 + return "127.0.0.1" + + # GDM when change username use a $DISPLAY like this "::12" + if re.match("::([0-9]{1,9})$", ipstr): + return "" + + # XEPHYR NAME ':20.0' + if re.match(":([0-9]{1,9}|[0-9]{1,9}.[0-9]{1,9})$", ipstr): + return "" + + # match x.x.x.x:0 or x.x.x.x:0.0 + if re.match(".*:([0-9]{1,9}|[0-9{1-9}].[0-9{1-9}])$", ipstr): + #print_debug("delete display from IP\n\n") + ipstr=ipstr.rsplit(":", 1)[0] + + # match "localhost:10" + if re.match("[a-zA-Z].*:([0-9]{1,9})", ipstr): + ipstr=ipstr.rsplit(":", 1)[0] + return ipstr + + # match "127.0.0.1:10.0" + if re.match(".*:([0-9{1-9}][0-9{1-9}].[0-9{1-9}])$", ipstr): + ipstr=ipstr.rsplit(":", 1)[0] + return ipstr + + # hostname must start with letter and contain letters numbers and '-' or '.' + if re.match("^[a-zA-Z][a-zA-Z0-9.-]+$", ipstr): + # ipstr is a hostname + return ipstr + + for it in ipstr: + eol=is_bin(binascii.hexlify(it)) + if eol: + isBin=True + #print_debug("%s => %s string=%s"%(it, binascii.hexlify(it), eol) ) + newip.append(binascii.hexlify(it)) + + if ipstr == '': + return '' + + if isBin: + try: + ip=ipaddr.IPAddress(IPy.parseAddress("0x" + "".join(newip) )[0]) + except: + return ipstr + else: + try: + ip=ipaddr.IPAddress(ipstr) + #except Exception: + except Exception, err: + print_debug(" parseIPAddress() Exception, error=%s"%err) + return ipstr + + ipv4=ip + if return_ipv4 and ip.version == 6 and ip.ipv4_mapped: + #print_debug(" IPV6 found %s"%ip) + ipv4=ip.ipv4_mapped.exploded + + return ipv4 + +if __name__ == "__main__": + debug=True + + if len(sys.argv) > 1: + value=parseIPAddress(sys.argv[1]) + print >> sys.stderr, "shared.py sys.argv[1]='%s' => '%s'"%(sys.argv[1],value) + print value + sys.exit(0) + + # test IPV6 + print " IPV6 '::ffff:10.0.2.22' => ", parseIPAddress('::ffff:10.0.2.22') + + # test binary IP + import Xlib.xauth + a=Xlib.xauth.Xauthority().entries[-1][1] + #print Xlib.xauth.Xauthority().entries + print " Xlib '%s' => '%s'" %(a, parseIPAddress(a)) + + # try with $DISPLAY + print " DISPLAY '192.168.0.10:0.0' => '%s'" %parseIPAddress('192.168.0.10:0.0') + print " DISPLAY 'thinkpad:0.0' => '%s'" %parseIPAddress('thinkpad:0.0') + + # try with hostname + print " NAME 'tcos10:0.0' => '%s'" %parseIPAddress('tcos10:0.0') + + # try with Xephyr hostname + print " XEPHYR NAME ':20.0' => '%s'" %parseIPAddress(':20.0') + + print " GDM change username '::2' => '%s'" %parseIPAddress('::2') + + + print " Hostname 'tcos-01:0' => '%s'" %parseIPAddress('tcos-01:0') + print " Hostname 'tcos.01:0' => '%s'" %parseIPAddress('tcos.01:0') + print " Hostname 'localhost:10.0' => '%s'" %parseIPAddress('localhost:10.0') + print " Hostname '127.0.0.1:10.0' => '%s'" %parseIPAddress('127.0.0.1:10.0') + + + # try with IPV6 $DISPLAY + print " IPV6 DISPLAY '::ffff:192.168.0.1:0.0' => '%s'" %parseIPAddress('::ffff:192.168.0.1:0.0') + print " IPV6 DISPLAY '::ffff:192.168.0.1:12' => '%s'" %parseIPAddress('::ffff:192.168.0.1:12') + print " IPV6 DISPLAY '::ffff:172.16.10.200:12' => '%s'" %parseIPAddress('::ffff:172.16.10.200:12') + + + print " isIPAddr(127.0.0.1) =%s"%isIPAddr('127.0.0.1') + print " isIPAddr(pc22) =%s"%isIPAddr('pc22') + print " isIPAddr(localhost) =%s"%isIPAddr('localhost') + +from threading import Thread + + +class Workers: + def __init__(self, main, target, args, dog=True): + self.dog=dog + self.main=main + self.target=target + self.args=args + + if not self.dog: + #print_debug ( "worker() no other jobs job=%s args=%s" %(self.target, self.args) ) + self.th=Thread(target=self.target, args=(self.args) ) + self.__stop=True + return + + if self.main.worker_running == True: + #print_debug ( "worker() other jobs pending NO START job=%s args=%s" %(self.target, self.args) ) + pass + else: + #print_debug ( "worker() no other jobs job=%s args=%s" %(self.target, self.args) ) + self.th=Thread(target=self.target, args=(self.args) ) + self.__stop=True + + def start_watch_dog(self, dog_thread): + if not self.dog: + #print_debug ( "start_watch_dog() dog DISABLED" ) + return + print_debug ( "start_watch_dog() starting watch dog..." ) + watch_dog=Thread(target=self.watch_dog, args=([dog_thread]) ) + watch_dog.start() + + def watch_dog(self, dog_thread): + print_debug ( "watch_dog() __init__ " ) + dog_thread.join() + self.set_finished() + print_debug ( "watch_dog() FINISHED" ) + + def start(self): + if hasattr(self.main, "progressbutton"): + self.main.progressbutton.set_sensitive(True) + + if self.main.worker_running == False: + self.set_started() # config var as started + self.th.start() # start thread + self.start_watch_dog(self.th) # start watch_dog + else: + print_debug ( "worker() other work pending... not starting" ) + + def stop(self): + self.__stop=True + self.__finished=True + #self.main.worker_running=False + + def set_finished(self): + print_debug("worker set_finished() *****") + self.__finished = True + self.__stop=False + self.main.worker_running=False + + def set_started(self): + print_debug("worker set_started() *****") + self.__finished=False + self.__stop=False + self.main.worker_running=True + + def is_stoped(self): + return self.__stop + + def get_finished(self): + return self.__finished + + def set_for_all_action(self, function, allhost, action): + Thread( target=function, args=([allhost, action]) ).start() + + diff --git a/tcospersonalize.desktop b/tcospersonalize.desktop new file mode 100644 index 0000000..fc90e12 --- /dev/null +++ b/tcospersonalize.desktop @@ -0,0 +1,15 @@ +[Desktop Entry] +Version=1.0 +Name=TcosPersonalize +Name[en_GB]=TcosPersonalize +Name[es]=TcosPersonalize +Comment=Configure a simple TCOS thin client +Comment[en_GB]=Configure a simple TCOS thin client +Comment[es]=Configurar un terminal TCOS +Exec=/usr/bin/tcospersonalize $@ +Terminal=false +Type=Application +Icon=/usr/share/pixmaps/tcos-icon-32x32.png +GenericName[es_ES]=TcosPersonalize +NoDisplay=true +NotShowIn=GNOME,KDE,XFCE; diff --git a/tcospersonalize.py b/tcospersonalize.py new file mode 100644 index 0000000..eaa489d --- /dev/null +++ b/tcospersonalize.py @@ -0,0 +1,571 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- +# TcosMonitor version __VERSION__ +# +# Copyright (c) 2006-2011 Mario Izquierdo <mariodebian@gmail.com> +# +# This package is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# +# This package is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +import sys +import os +import glob + +import pygtk +pygtk.require('2.0') +import gtk + +from tcosmonitor import shared + + +from time import time +import getopt +from gettext import gettext as _ + +import gobject +import grp + + +debug_name="tcospersonalize" + +PXELINUX_CFG=[ + "default __TCOS_METHOD__", + "prompt 0", + "timeout 50", + "label default", + " kernel vmlinuz-__TCOS_KERNEL__", + " append ramdisk_size=65536 boot=tcos root=/dev/ram0 initrd=initramfs-__TCOS_KERNEL__ __TCOS_CMDLINE__", + "label nfs", + " kernel vmlinuz-__TCOS_KERNEL__", + " append ramdisk_size=32768 boot=tcos root=/dev/ram0 initrd=initramfs-__TCOS_KERNEL__-nfs forcenfs __TCOS_CMDLINE__", + "", + "#kernel=__TCOS_KERNEL__", + "#method=__TCOS_METHOD__", + "#cmdline='__TCOS_CMDLINE__'", +] + +PXE_METHODS=[ +"default", +"nfs" +] + +PXELINUX_CMDLINE="quiet splash" + +def print_debug(txt): + if shared.debug: + print >> sys.stderr, "%s::%s" % (debug_name, txt) + #print("%s::%s" % (debug_name, txt), file=sys.stderr) + + return + +def crono(start, txt): + print_debug ("crono(), %s get %f seconds" %(txt, (time() - float(start))) ) + return + +def usage(): + print ("TcosPersonalize help:") + print ("") + print (" tcospersonalize [--host=XXX.XXX.XXX.XXX] (host to personalize)") + print (" tcospersonalize -d [--debug] (write debug data to stdout)") + print (" tcospersonalize -h [--help] (this help)") + + +try: + opts, args = getopt.getopt(sys.argv[1:], ":hd", ["help", "debug", "host="]) +except getopt.error, msg: + print (msg) + print ("for command line options use tcosconfig --help") + sys.exit(2) + +# process options +for o, a in opts: + if o in ("-d", "--debug"): + print ("DEBUG ACTIVE") + shared.debug = True + if o == "--host": + print ("HOST %s" % a) + shared.remotehost = a + if o in ("-h", "--help"): + usage() + sys.exit() + + +class TcosPersonalize: + def __init__(self): + print_debug ( "__init__()" ) + self.name="TcosPersonalize" + # exit if no host + if shared.remotehost == None: + usage() + shared.error_msg ( _("Need a host to configure!!!\nTry exec:\n tcospersonalize --host=XXX.XXX.XXX.XXX") ) + sys.exit(1) + + nogroup=True + for group in os.getgroups(): + if grp.getgrgid(group)[0] == "tcos": + nogroup=False + + if nogroup and os.getuid() != 0: + shared.error_msg( "You must be root to exec tcospersonalize." ) + sys.exit(1) + + self.remotehost_config = os.path.join ("/var/lib/tcos/tftp/conf/", shared.remotehost + ".conf" ) + + # Widgets + import gettext + gettext.bindtextdomain(shared.PACKAGE, shared.LOCALE_DIR) + gettext.textdomain(shared.PACKAGE) + + print_debug("loading %s" %(shared.GLADE_DIR + 'tcospersonalize.ui')) + + self.ui = gtk.Builder() + self.ui.set_translation_domain(shared.PACKAGE) + + self.ui.add_from_file(shared.GLADE_DIR + 'tcospersonalize.ui') + + + self.main = self.ui.get_object('mainwindow') + + # close windows signals + self.main.connect('destroy', self.quitapp ) + + # buttons + self.buttonok=self.ui.get_object('ok_button') + self.buttoncancel=self.ui.get_object('cancel_button') + self.buttondelete=self.ui.get_object('delete_button') + self.buttongetavalaible=self.ui.get_object('getavalaible_button') + + # signals on buttons + self.buttonok.connect('clicked', self.on_buttonok_click ) + self.buttoncancel.connect('clicked', self.on_buttoncancel_click ) + self.buttondelete.connect('clicked', self.on_buttondelete_click ) + self.buttongetavalaible.connect('clicked', self.on_buttongetavalaible_click ) + + # get combos + self.combo_xsession=self.ui.get_object('combo_xsession') + self.combo_xdriver=self.ui.get_object('combo_xdriver') + self.combo_xres=self.ui.get_object('combo_xres') + self.combo_xdepth=self.ui.get_object('combo_xdepth') + + # get checkboxes + self.ck_xmousewheel=self.ui.get_object('ck_xmousewheel') + self.ck_xdontzap=self.ui.get_object('ck_xdontzap') + self.ck_xdpms=self.ui.get_object('ck_xdpms') + + # get textboxes + #self.text_extramodules=self.ui.get_object('txt_extramodules') + self.text_xhorizsync=self.ui.get_object('txt_xhorizsync') + self.text_xvertsync=self.ui.get_object('txt_xvertsync') + + # boot options + self.combo_kernel=self.ui.get_object('combo_kernel') + self.combo_method=self.ui.get_object('combo_method') + self.text_cmdline=self.ui.get_object('txt_cmdline') + self.buttonapply=self.ui.get_object('apply_button') + self.buttonapply.connect('clicked', self.on_buttonapply_click ) + + self.deleteboot=self.ui.get_object('delete_boot_button') + self.deleteboot.connect('clicked', self.on_deleteboot_click ) + + # host label + self.hostlabel=self.ui.get_object('label_host') + self.hostlabel.set_markup ( "<b>" + _("host: ") + shared.remotehost + "</b>" ) + + # get conf file + self.vars=[] + self.OpenFile() + + found=False + for var in self.vars: + if var[0] == "xdisablesync": + found=True + if not found: + print_debug("adding xdisablesync....") + self.vars.append(["xdisablesync", ""]) + + # populate combos + self.populate_select(self.combo_xsession, shared.xsession_values ) + self.set_active_in_select(self.combo_xsession, self.GetVar("xsession") ) + + self.populate_select(self.combo_xdriver, shared.xdriver_values ) + self.set_active_in_select(self.combo_xdriver, self.GetVar("xdriver") ) + + #self.populate_select(self.combo_xdriver, ['auto'] ) + #self.set_active_in_select(self.combo_xdriver, "\"auto\"" ) + + self.populate_select(self.combo_xres, shared.xres_values ) + self.set_active_in_select(self.combo_xres, self.GetVar("xres") ) + + self.populate_select(self.combo_xdepth, shared.xdepth_values ) + self.set_active_in_select(self.combo_xdepth, self.GetVar("xdepth") ) + + # populate checkbox + #self.populate_checkboxes( self.ck_xmousewheel, 1) + #self.populate_checkboxes( self.ck_xdontzap, 1) + #self.populate_checkboxes( self.ck_xdpms, 1) + + self.populate_checkboxes( self.ck_xmousewheel, self.GetVar("xmousewheel") ) + self.populate_checkboxes( self.ck_xdontzap, self.GetVar("xdontzap") ) + self.populate_checkboxes( self.ck_xdpms, self.GetVar("xdpms") ) + + self.populate_textboxes( self.text_xhorizsync, self.GetVar("xhorizsync") ) + self.populate_textboxes( self.text_xvertsync, self.GetVar("xvertsync") ) + + kernels=self.getkernels() + + self.bootfilename=self.get_hexfilename(shared.remotehost) + self.bootparams={'kernel':'', 'method':'default', 'cmdline':'quiet splash'} + + if os.path.isfile(self.bootfilename): + f=open(self.bootfilename, 'r') + for line in f.readlines(): + if line.startswith("#kernel"): + self.bootparams['kernel']=line.split('=')[1].strip() + if line.startswith("#method"): + self.bootparams['method']=line.split('=')[1].strip() + if line.startswith("#cmeline"): + self.bootparams['cmdline']=line.split('=')[1].strip() + f.close() + self.deleteboot.set_sensitive(True) + else: + if len(kernels) == 1: + self.bootparams['kernel']=kernels[0] + else: + self.buttonapply.set_sensitive(False) + self.combo_kernel.connect('changed', self.on_combo_kernel_change) + self.deleteboot.set_sensitive(False) + + self.populate_select(self.combo_kernel, kernels ) + self.set_active_in_select(self.combo_kernel, self.bootparams['kernel'] ) + + + self.populate_select(self.combo_method, PXE_METHODS ) + self.set_active_in_select(self.combo_method, self.bootparams['method'] ) + self.text_cmdline.set_text(PXELINUX_CMDLINE) + + # populate textboxes + # NOTHING + + self.issaved=False + # end init process + + def CheckConfFile(self): + self.isnew=False + if not os.path.isfile(self.remotehost_config): + print_debug ( "CheckConfFile() %s not exists" %(self.remotehost_config) ) + self.isnew=True + self.CreateConfFile() + + def CreateConfFile(self): + print_debug ( "CreateConfFile()" ) + # save this into file + fd=file(self.remotehost_config, 'w') + for item in shared.PersonalizeConfig: + key=item[0] + value=item[1] + print_debug ("key=%s value=%s" %(key, value)) + fd.write("%s=\"%s\"\n" %(key, value) ) + fd.close() + self.FirstRunning=True + + def OpenFile(self): + self.CheckConfFile() + conf=None + conf=[] + print_debug("open_file() reading data from \"%s\"..."\ + %(self.remotehost_config) ) + fd=file(self.remotehost_config, 'r') + self.data=fd.readlines() + fd.close() + for line in self.data: + if line != '\n': + line=line.replace('\n', '') + conf.append(line) + print_debug ( "OpenFile() Found %d vars" %( len(conf)) ) + if len(conf) <1: + print_debug ( "OpenFile() FILE IS EMPTY!!!" ) + return + for i in range( len(conf) ): + if conf[i].find("#") != 0: + #print_debug ( "OpenFile() conf=" + conf[i] ) + (var, value)=conf[i].split("=", 1) + self.vars.append([var, value]) + + def GetVar(self, varname): + for i in range( len(self.vars) ): + if self.vars[i][0].find(varname) == 0: + print_debug ( "GetVar() found, %s=%s" \ + %(self.vars[i][0], self.vars[i][1]) ) + return self.vars[i][1] + print_debug ( "GetVar() not found, %s, returning \"\"" %(varname) ) + return "" + + def SetVar(self, varname, value): + print_debug ( "SetVar(%s)=\"%s\"" %(varname, value) ) + for i in range(len(self.vars)): + if varname == self.vars[i][0]: + print_debug ( "changing %s value %s to \"%s\" of %s"\ + %(self.vars[i][0], self.vars[i][1], value, varname) ) + self.vars[i][1]="\"%s\"" %(value) + + def SaveToFile(self): + self.issaved=True + print_debug ( "SaveToFile() len(self.vars)=%d" %( len(self.vars) ) ) + if len(self.vars) < 1: + print_debug ( "SaveToFile() self.vars is empty" ) + return + + try: + fd=file(self.remotehost_config, 'w') + except IOError: + shared.error_msg( "Can't write into %s file.\n\nRun as root?" %(self.remotehost_config) ) + return + for i in range(len(self.vars)): + fd.write("%s=%s\n" %(self.vars[i][0], self.vars[i][1])) + fd.close() + print_debug ( "SaveToFile() new settings SAVED!!!") + return + + def SaveSettings(self): + """ + save settings + """ + print_debug ( "SaveSettings() INIT" ) + + # read combos + self.SetVar("xsession", self.read_select_value(self.combo_xsession, "xsession") ) + self.SetVar("xdriver", self.read_select_value(self.combo_xdriver, "xdriver") ) + self.SetVar("xres", self.read_select_value(self.combo_xres, "xres") ) + self.SetVar("xdepth", self.read_select_value(self.combo_xdepth, "xdepth") ) + + self.SetVar("xhorizsync", self.read_textbox(self.text_xhorizsync, "xhorizsync")) + self.SetVar("xvertsync", self.read_textbox(self.text_xvertsync, "xvertsync") ) + + if self.GetVar("xhorizsync") == "\"disable\"" or self.GetVar("xvertsync") == "\"disable\"": + self.SetVar("xdisablesync", "disable") + else: + self.SetVar("xdisablesync", "") + + # read checkboxes + self.read_checkbox(self.ck_xmousewheel, "xmousewheel") + self.read_checkbox(self.ck_xdontzap, "xdontzap") + self.read_checkbox(self.ck_xdpms, "xdpms") + + # save to file + self.SaveToFile() + + def populate_select(self, widget, values, set_text_column=True): + valuelist = gtk.ListStore(str) + for value in values: + #print_debug ( "populate_select() appending %s" %([value.split('_')[0]]) ) + valuelist.append( [value.split('_')[0]] ) + widget.set_model(valuelist) + if set_text_column: + widget.set_text_column(0) + model=widget.get_model() + return + + def set_active_in_select(self, widget, default): + model=widget.get_model() + for i in range(len(model)): + #print (model[i][0] + default) + if "\"%s\"" % (model[i][0]) == default or model[i][0] == default: + print_debug ("set_active_in_select(%s) default is %s, index %d"\ + %(widget.name, model[i][0] , i ) ) + widget.set_active(i) + return + print_debug ( "set_active_in_select(%s) NOT HAVE DEFAULT" %(widget.name) ) + + def populate_checkboxes(self, widget, value): + if value == "\"1\"" or value == "1": + value=1 + elif value== "\"0\"" or value == "0": + value=0 + else: + print_debug ( "populate_checkboxes() unknow value=\"%s\"" %(value) ) + return + checked=int(value) + if checked == 1: + widget.set_active(1) + else: + widget.set_active(0) + return + + def populate_textboxes(self, widget, value): + if value: + widget.set_text(value.replace('"','') ) + + def read_select_value(self, widget, varname): + selected=-1 + try: + selected=widget.get_active() + except Exception, err: + print_debug ( "read_select() ERROR reading %s, error=%s" %(varname, err) ) + model=widget.get_model() + value=model[selected][0] + print_debug ( "read_select() reading %s=%s" %(varname, value) ) + return value + + def read_checkbox(self, widget, varname): + if widget.get_active() == 1: + print_debug ( "read_checkbox(%s) CHECKED" %(widget.name) ) + self.SetVar(varname, 1) + else: + print_debug ( "read_checkbox(%s) UNCHECKED" %(widget.name) ) + self.SetVar(varname, 0) + + def read_textbox(self, widget, varname): + if widget.get_text(): + print_debug ( "read_textbox(%s) value=%s" %(widget.name, widget.get_text() ) ) + return widget.get_text() + else: + print_debug ( "read_textbox(%s) can't read textbox" %(widget.name) ) + return "" + + def on_buttongetavalaible_click(self, widget): + print_debug( "on_button_getavalaible_click()" ) + import tcosmonitor.TcosXauth + self.xauth=tcosmonitor.TcosXauth.TcosXauth(self) + import tcosmonitor.TcosConf + self.config=tcosmonitor.TcosConf.TcosConf(self) + import tcosmonitor.TcosXmlRpc + self.xmlrpc=tcosmonitor.TcosXmlRpc.TcosXmlRpc(self) + self.xmlrpc.newhost(shared.remotehost) + if not self.xmlrpc.connected: + shared.error_msg ( _("Host down, can't connect to tcosxmlrpc.") ) + print_debug ( "on_buttongetavalaible_click() host down!!" ) + return + #alldrivers=self.xmlrpc.GetDevicesInfo("", "--getxdrivers").split('|')[0:-1] + alldrivers=self.xmlrpc.GetDevicesInfo("", "--getxdrivers") + print_debug ( "on_buttongetavalaible_click() alldrivers=%s" %(alldrivers) ) + alldrivers=alldrivers.split('|')[0:-1] + self.populate_select(self.combo_xdriver, shared.xdriver_values + alldrivers, set_text_column=False) + shared.info_msg ( _("New %d drivers loaded from terminal.") %(len(alldrivers)) ) + + def on_buttonok_click(self, widget): + print_debug ( "on_buttonok_click()" ) + self.SaveSettings() + self.quitapp() + + def on_combo_kernel_change(self, widget): + if self.read_select_value(widget, 'kernel') != '': + self.buttonapply.set_sensitive(True) + + def get_hexfilename(self, ip): + name="" + for a in ip.split('.'): + hexn="%X" %int(a) + if len(hexn) == 1: + hexn="0%s"%hexn + name="%s%s"%(name, hexn ) + return os.path.join("/var/lib/tcos/tftp/pxelinux.cfg" , name ) + + def on_buttonapply_click(self, widget): + print_debug("on_buttonapply_click()") + kernel=self.read_select_value(self.combo_kernel, 'kernel') + method=self.read_select_value(self.combo_method, 'method') + cmdline=self.text_cmdline.get_text() + + try: + f=open(self.bootfilename, 'w') + except Exception, err: + print_debug("Error opening %s, error=%s"%(self.bootfilename, err) ) + return + + for line in PXELINUX_CFG: + out=line.replace('__TCOS_KERNEL__', kernel) + out=out.replace('__TCOS_METHOD__', method) + out=out.replace('__TCOS_CMDLINE__', cmdline) + f.write(out + '\n') + f.close() + self.deleteboot.set_sensitive(True) + + def on_deleteboot_click(self, widget): + print_debug("on_deleteboot_click() ") + try: + os.unlink(self.bootfilename) + self.deleteboot.set_sensitive(False) + except Exception, err: + print_debug("on_deleteboot_click() Exception deleting: %s"%err) + + def on_buttoncancel_click(self, widget): + print_debug ( "on_buttoncancel_click()" ) + if not self.issaved and self.isnew: + # delete file + print_debug ( "on_buttoncancel_click() deleting file" ) + os.remove(self.remotehost_config) + self.quitapp() + + def on_buttondelete_click(self, widget): + print_debug ( "on_buttondelete_click()" ) + # ask for delete + if shared.ask_msg ( _("Really delete config of %s?") %(shared.remotehost) ): + print_debug ( "on_buttondelete_click() deleting file" ) + os.remove(self.remotehost_config) + shared.info_msg ( _("Deleted!") ) + self.quitapp() + + def getkernels(self): + # valid kernel >= 2.6.12 + # perpahps we can try to build initrd image instead of initramfs + # in kernel < 2.6.12, this require a lot of work in gentcos and init scripts + kernels=[] + #print_debug ("getkernels() read all vmlinuz in /boot/") + #for _file in os.listdir(shared.chroot + '/boot'): + # FIXME need to detect chroot kernels + #for _file in os.listdir('/var/lib/tcos/tftp'): + for _file in glob.glob('/var/lib/tcos/tftp/vmlinuz*'): + try: + os.stat(_file) + except Exception, err: + print_debug("getkernels() link %s broken, error=%s" %(_file, err) ) + continue + kernel=os.path.basename(_file).replace('vmlinuz-','') + print_debug("getkernels() found %s"%kernel) + # split only 3 times + try: + (kmay, kmed, kmin) = kernel.split('.', 2) + except Exception, err: + print_debug("getkernels() exception spliting kernel '%s' version, %s"%(kernel, err)) + continue + import re + pattern = re.compile ('[-_.+]') + (kmin, kextra) = pattern.split(kmin, 1) + # need kernel >= 2.6.12 + if int(kmay)==2 and int(kmed)==6 and int(kmin)>=12: + #print_debug( "getkernels() VALID kernel %s" %(kernel) ) + kernels.append(kernel) + else: + print_debug( "getkernels() INVALID OLD kernel %s" %(kernel) ) + return kernels + + def quitapp(self, *args): + print_debug ( _("Exiting") ) + gtk.main_quit() + + def run (self): + try: + gtk.main() + except KeyboardInterrupt: + self.quitapp() + + +if __name__ == '__main__': + #gtk.gdk.threads_init() + gobject.threads_init() + app = TcosPersonalize () + # Run app + app.run () diff --git a/ui/tcos-volume-manager.ui b/ui/tcos-volume-manager.ui new file mode 100644 index 0000000..764199b --- /dev/null +++ b/ui/tcos-volume-manager.ui @@ -0,0 +1,138 @@ +<?xml version="1.0"?> +<interface> + <!-- interface-requires gtk+ 2.12 --> + <!-- interface-naming-policy toplevel-contextual --> + <object class="GtkWindow" id="mainwindow"> + <property name="width_request">500</property> + <property name="height_request">320</property> + <property name="title" translatable="yes">Tcos Volume Manager</property> + <child> + <object class="GtkVBox" id="vbox1"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkToolbar" id="toolbar1"> + <property name="visible">True</property> + <property name="toolbar_style">both</property> + <child> + <object class="GtkToolButton" id="quitbutton"> + <property name="visible">True</property> + <property name="stock_id">gtk-quit</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="refreshbutton"> + <property name="visible">True</property> + <property name="stock_id">gtk-refresh</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="restartbutton"> + <property name="label" translatable="yes">Restart sound</property> + <property name="use_underline">True</property> + <property name="stock_id">gtk-go-forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolItem" id="toolitem3"> + <property name="visible">True</property> + <child> + <object class="GtkLabel" id="mainlabel"> + <property name="visible">True</property> + <property name="label" translatable="yes">Sound levels</property> + <property name="use_markup">True</property> + <property name="justify">center</property> + <property name="wrap">True</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkNotebook" id="notebook1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkScrolledWindow" id="scrolledwindow"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">automatic</property> + <property name="vscrollbar_policy">never</property> + <child> + <placeholder/> + </child> + </object> + </child> + <child type="tab"> + <object class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="label" translatable="yes">Main Channels</property> + </object> + <packing> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow" id="scrolledwindow2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">automatic</property> + <property name="vscrollbar_policy">never</property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="label" translatable="yes">Secondary Channels</property> + </object> + <packing> + <property name="position">1</property> + <property name="tab_fill">False</property> + </packing> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkStatusbar" id="statusbar"> + <property name="visible">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + </object> + </child> + </object> +</interface> diff --git a/ui/tcosmonitor-abouttcos.ui b/ui/tcosmonitor-abouttcos.ui new file mode 100644 index 0000000..35bc697 --- /dev/null +++ b/ui/tcosmonitor-abouttcos.ui @@ -0,0 +1,433 @@ +<?xml version="1.0"?> +<interface> + <!-- interface-requires gtk+ 2.12 --> + <!-- interface-naming-policy toplevel-contextual --> + <object class="GtkWindow" id="abouttcos"> + <property name="title" translatable="yes">About TCOS</property> + <property name="modal">True</property> + <property name="window_position">center</property> + <property name="type_hint">dialog</property> + <child> + <object class="GtkVBox" id="vbox17"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkLabel" id="label149"> + <property name="visible">True</property> + <property name="xpad">5</property> + <property name="ypad">10</property> + <property name="label" translatable="yes"><span size="xx-large">TcosMonitor</span></property> + <property name="use_markup">True</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkNotebook" id="abouttabs"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="border_width">10</property> + <child> + <object class="GtkHBox" id="hbox36"> + <property name="visible">True</property> + <property name="homogeneous">True</property> + <child> + <object class="GtkImage" id="abouttcos_logo"> + <property name="visible">True</property> + </object> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkVBox" id="vbox21"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <property name="homogeneous">True</property> + <child> + <placeholder/> + </child> + <child> + <object class="GtkHBox" id="hbox37"> + <property name="visible">True</property> + <property name="homogeneous">True</property> + <child> + <object class="GtkLabel" id="label119"> + <property name="visible">True</property> + <property name="xpad">2</property> + <property name="label" translatable="yes"><b>Version:</b></property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="abouttcos_version"> + <property name="visible">True</property> + <property name="xpad">5</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label123"> + <property name="visible">True</property> + <property name="label" translatable="yes">Thin client and standalone +monitoring tool.</property> + <property name="use_underline">True</property> + <property name="wrap">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="abouttcos_webbutton"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="focus_on_click">False</property> + <child> + <object class="GtkAlignment" id="alignment16"> + <property name="visible">True</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <child> + <object class="GtkHBox" id="hbox38"> + <property name="visible">True</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image15"> + <property name="visible">True</property> + <property name="stock">gtk-go-forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label124"> + <property name="visible">True</property> + <property name="label" translatable="yes">Project web site</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">3</property> + </packing> + </child> + <child> + <placeholder/> + </child> + <child> + <object class="GtkLabel" id="label122"> + <property name="visible">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">5</property> + </packing> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="tab_fill">False</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="label108"> + <property name="visible">True</property> + <property name="xpad">5</property> + <property name="label" translatable="yes">About</property> + </object> + <packing> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow" id="scrolledwindow5"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">never</property> + <property name="vscrollbar_policy">automatic</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkTextView" id="abouttcos_license"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="pixels_above_lines">2</property> + <property name="pixels_below_lines">2</property> + <property name="editable">False</property> + <property name="left_margin">2</property> + <property name="right_margin">2</property> + <property name="cursor_visible">False</property> + </object> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="label109"> + <property name="visible">True</property> + <property name="xpad">5</property> + <property name="label" translatable="yes">License</property> + </object> + <packing> + <property name="position">1</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="GtkVBox" id="vbox19"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <placeholder/> + </child> + <child> + <object class="GtkLabel" id="label115"> + <property name="visible">True</property> + <property name="ypad">10</property> + <property name="label" translatable="yes">Main developers: + * Mario Izquierdo <mariodebian at gmail.com> + * Ignacio Vidal <vidal_joshur at gva.es> + +Contributors: + * Andrés Jimenez + * Quirón + +Special thanks to: + Comunidad de Madrid, MaX group (Spain)</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="label111"> + <property name="visible">True</property> + <property name="xpad">5</property> + <property name="label" translatable="yes">Authors</property> + </object> + <packing> + <property name="position">2</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="GtkVBox" id="vbox20"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <property name="homogeneous">True</property> + <child> + <object class="GtkLabel" id="label116"> + <property name="visible">True</property> + <property name="ypad">20</property> + <property name="label" translatable="yes">Translated to your language by:</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label117"> + <property name="visible">True</property> + <property name="ypad">10</property> + <property name="label" translatable="yes" comments="put your name and mail">Mario Izquierdo <mariodebian@gmail.com></property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">3</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="label112"> + <property name="visible">True</property> + <property name="xpad">5</property> + <property name="label" translatable="yes">Translators</property> + </object> + <packing> + <property name="position">3</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="GtkVBox" id="vbox18"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkLabel" id="label113"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">10</property> + <property name="ypad">10</property> + <property name="label" translatable="yes">TCOS is a free software project that need a lot of work to be the best thin client plataform. + +We work every day a lot of hours to make changes and support more devices and features. + +We want to continue developing this software but need your help, if you use, sell or hack TCOS pehaps you could donate some money to project. + +Click on next url to get some info.</property> + <property name="use_underline">True</property> + <property name="wrap">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="abouttcos_donatebutton"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <property name="focus_on_click">False</property> + <child> + <object class="GtkAlignment" id="alignment15"> + <property name="visible">True</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <child> + <object class="GtkHBox" id="hbox34"> + <property name="visible">True</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image14"> + <property name="visible">True</property> + <property name="stock">gtk-go-forward</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="donateurllabel"> + <property name="visible">True</property> + <property name="label" translatable="yes" comments="see wiki if translation is avalaible, ex in spanish: TcosProject:Site_support/es"><u>http://wiki.tcosproject.org/TcosProject:Site_support</u></property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="abouttcos_donatecheck"> + <property name="label" translatable="yes">Don't show donations message on start.</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="border_width">8</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">4</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="label107"> + <property name="visible">True</property> + <property name="xpad">5</property> + <property name="label" translatable="yes">Donate</property> + </object> + <packing> + <property name="position">4</property> + <property name="tab_fill">False</property> + </packing> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child> + <placeholder/> + </child> + </object> + </child> + </object> +</interface> diff --git a/ui/tcosmonitor-askwindow.ui b/ui/tcosmonitor-askwindow.ui new file mode 100644 index 0000000..8985216 --- /dev/null +++ b/ui/tcosmonitor-askwindow.ui @@ -0,0 +1,124 @@ +<?xml version="1.0"?> +<interface> + <!-- interface-requires gtk+ 2.12 --> + <!-- interface-naming-policy toplevel-contextual --> + <object class="GtkWindow" id="askwindow"> + <property name="width_request">430</property> + <property name="height_request">300</property> + <property name="title" translatable="yes">Question</property> + <property name="window_position">center</property> + <child> + <object class="GtkVBox" id="vbox11"> + <property name="visible">True</property> + <property name="border_width">10</property> + <property name="orientation">vertical</property> + <property name="spacing">5</property> + <child> + <object class="GtkFixed" id="ask_fixed"> + <property name="height_request">43</property> + <property name="visible">True</property> + <child> + <object class="GtkFrame" id="frame1"> + <property name="width_request">90</property> + <property name="height_request">90</property> + <property name="visible">True</property> + <property name="label_xalign">0.5</property> + <child> + <object class="GtkAlignment" id="alignment13"> + <property name="visible">True</property> + <child> + <object class="GtkImage" id="image_askentry"> + <property name="visible">True</property> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="x">167</property> + <property name="y">4</property> + </packing> + </child> + </object> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label99"> + <property name="visible">True</property> + <property name="label" translatable="yes">You can drag and drop launcher file to this box</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="txt_asklabel"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Run app in unknow host</b></property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="txt_askentry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="has_focus">True</property> + <property name="activates_default">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkHBox" id="hbox18"> + <property name="height_request">40</property> + <property name="visible">True</property> + <property name="homogeneous">True</property> + <child> + <object class="GtkButton" id="ask_cancelbutton"> + <property name="label">gtk-cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="ask_exebutton"> + <property name="label">gtk-ok</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">4</property> + </packing> + </child> + </object> + </child> + </object> +</interface> diff --git a/ui/tcosmonitor-chatwindow.ui b/ui/tcosmonitor-chatwindow.ui new file mode 100644 index 0000000..9077f99 --- /dev/null +++ b/ui/tcosmonitor-chatwindow.ui @@ -0,0 +1,210 @@ +<?xml version="1.0"?> +<interface> + <!-- interface-requires gtk+ 2.12 --> + <!-- interface-naming-policy toplevel-contextual --> + <object class="GtkWindow" id="chatwindow"> + <property name="width_request">400</property> + <property name="height_request">218</property> + <property name="title" translatable="yes">Chat emission list</property> + <property name="window_position">center</property> + <child> + <object class="GtkVBox" id="vbox32"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkLabel" id="label180"> + <property name="visible">True</property> + <property name="label" translatable="yes"><span size="x-large">Chat emission list</span></property> + <property name="use_markup">True</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkHBox" id="hbox54"> + <property name="visible">True</property> + <child> + <object class="GtkScrolledWindow" id="scrolledwindow8"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">automatic</property> + <property name="vscrollbar_policy">automatic</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkTreeView" id="chatlist"> + <property name="visible">True</property> + <property name="can_focus">True</property> + </object> + </child> + </object> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkVBox" id="vbox33"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkButton" id="button_chat_connect"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <child> + <object class="GtkAlignment" id="alignment26"> + <property name="visible">True</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <child> + <object class="GtkHBox" id="hbox62"> + <property name="visible">True</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image35"> + <property name="visible">True</property> + <property name="stock">gtk-redo</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label187"> + <property name="visible">True</property> + <property name="label" translatable="yes">Connect</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="button_chat_disconnect"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <child> + <object class="GtkAlignment" id="alignment27"> + <property name="visible">True</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <child> + <object class="GtkHBox" id="hbox63"> + <property name="visible">True</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image36"> + <property name="visible">True</property> + <property name="stock">gtk-stop</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label188"> + <property name="visible">True</property> + <property name="label" translatable="yes">Disconnect</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="button_exit"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <child> + <object class="GtkAlignment" id="alignment28"> + <property name="visible">True</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <child> + <object class="GtkHBox" id="hbox64"> + <property name="visible">True</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image37"> + <property name="visible">True</property> + <property name="stock">gtk-undo</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label189"> + <property name="visible">True</property> + <property name="label" translatable="yes">Exit</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> +</interface> diff --git a/ui/tcosmonitor-mainwindow.ui b/ui/tcosmonitor-mainwindow.ui new file mode 100644 index 0000000..f1ea4fc --- /dev/null +++ b/ui/tcosmonitor-mainwindow.ui @@ -0,0 +1,825 @@ +<?xml version="1.0"?> +<interface> + <!-- interface-requires gtk+ 2.12 --> + <!-- interface-naming-policy toplevel-contextual --> + <object class="GtkWindow" id="mainwindow"> + <property name="width_request">950</property> + <property name="height_request">660</property> + <property name="title" translatable="yes">TcosMonitor</property> + <property name="gravity">center</property> + <child> + <object class="GtkVBox" id="vbox1"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <property name="spacing">3</property> + <child> + <object class="GtkToolbar" id="toolbar1"> + <property name="visible">True</property> + <property name="toolbar_style">both</property> + <child> + <object class="GtkToolButton" id="quitbutton"> + <property name="visible">True</property> + <property name="tooltip_text" translatable="yes">Exit TcosMonitor</property> + <property name="label" translatable="yes">Quit</property> + <property name="use_underline">True</property> + <property name="stock_id">gtk-quit</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="preferencesbutton"> + <property name="visible">True</property> + <property name="tooltip_text" translatable="yes">Open preferences dialog</property> + <property name="label" translatable="yes">Preferences</property> + <property name="use_underline">True</property> + <property name="stock_id">gtk-preferences</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="refreshbutton"> + <property name="visible">True</property> + <property name="tooltip_text" translatable="yes">Update host list</property> + <property name="label" translatable="yes">Refresh</property> + <property name="use_underline">True</property> + <property name="stock_id">gtk-refresh</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="fullscreenbutton"> + <property name="visible">True</property> + <property name="stock_id">gtk-fullscreen</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="allhostbutton"> + <property name="visible">True</property> + <property name="label" translatable="yes">All Hosts</property> + <property name="use_underline">True</property> + <property name="stock_id">gtk-go-down</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolItem" id="toolitem1"> + <property name="visible">True</property> + <child> + <object class="GtkEntry" id="searchtxt"> + <property name="width_request">130</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">●</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="searchbutton"> + <property name="visible">True</property> + <property name="label" translatable="yes">Find</property> + <property name="use_underline">True</property> + <property name="stock_id">gtk-find</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + <child> + <object class="GtkToolButton" id="aboutbutton"> + <property name="visible">True</property> + <property name="tooltip_text" translatable="yes">About this app</property> + <property name="stock_id">gtk-about</property> + </object> + <packing> + <property name="expand">False</property> + <property name="homogeneous">True</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkToolbar" id="toolbar2"> + <property name="toolbar_style">both</property> + <child> + <object class="GtkToolItem" id="toolitem2"> + <property name="visible">True</property> + <child> + <object class="GtkHandleBox" id="handlebox_audio"> + <property name="visible">True</property> + <child> + <object class="GtkButton" id="button_audio"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <child> + <object class="GtkAlignment" id="alignment31"> + <property name="visible">True</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <child> + <object class="GtkHBox" id="hbox68"> + <property name="visible">True</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image_audio"> + <property name="visible">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label194"> + <property name="visible">True</property> + <property name="label" translatable="yes">Send audio conference</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <object class="GtkToolItem" id="toolitem4"> + <property name="visible">True</property> + <child> + <object class="GtkHandleBox" id="handlebox_chat"> + <property name="visible">True</property> + <child> + <object class="GtkButton" id="button_chat"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <child> + <object class="GtkAlignment" id="alignment29"> + <property name="visible">True</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <child> + <object class="GtkHBox" id="hbox66"> + <property name="visible">True</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image_chat"> + <property name="visible">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label192"> + <property name="visible">True</property> + <property name="label" translatable="yes">Start audio chat</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <object class="GtkToolItem" id="toolitem3"> + <property name="visible">True</property> + <child> + <object class="GtkHandleBox" id="handlebox_list"> + <property name="visible">True</property> + <child> + <object class="GtkButton" id="button_list"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <child> + <object class="GtkAlignment" id="alignment32"> + <property name="visible">True</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <child> + <object class="GtkHBox" id="hbox69"> + <property name="visible">True</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image_list"> + <property name="visible">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label195"> + <property name="visible">True</property> + <property name="label" translatable="yes">Audio chat list</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <object class="GtkToolItem" id="toolitem5"> + <property name="visible">True</property> + <child> + <object class="GtkHandleBox" id="handlebox_video"> + <property name="visible">True</property> + <child> + <object class="GtkButton" id="button_video"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <child> + <object class="GtkAlignment" id="alignment30"> + <property name="visible">True</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <child> + <object class="GtkHBox" id="hbox67"> + <property name="visible">True</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image_video"> + <property name="visible">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label193"> + <property name="visible">True</property> + <property name="label" translatable="yes">Send audio/video</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <object class="GtkToolItem" id="toolitem6"> + <property name="visible">True</property> + <child> + <object class="GtkHandleBox" id="handlebox_send"> + <property name="visible">True</property> + <child> + <object class="GtkButton" id="button_send"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <child> + <object class="GtkAlignment" id="alignment33"> + <property name="visible">True</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <child> + <object class="GtkHBox" id="hbox70"> + <property name="visible">True</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image_send"> + <property name="visible">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label196"> + <property name="visible">True</property> + <property name="label" translatable="yes">Send files</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <object class="GtkToolItem" id="toolitem7"> + <property name="visible">True</property> + <child> + <object class="GtkHandleBox" id="handlebox_exe"> + <property name="visible">True</property> + <child> + <object class="GtkButton" id="button_exe"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <child> + <object class="GtkAlignment" id="alignment34"> + <property name="visible">True</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <child> + <object class="GtkHBox" id="hbox71"> + <property name="visible">True</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image_exe"> + <property name="visible">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label197"> + <property name="visible">True</property> + <property name="label" translatable="yes">Exe app</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <object class="GtkToolItem" id="toolitem8"> + <property name="visible">True</property> + <child> + <object class="GtkHandleBox" id="handlebox_text"> + <property name="visible">True</property> + <child> + <object class="GtkButton" id="button_text"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="relief">none</property> + <child> + <object class="GtkAlignment" id="alignment35"> + <property name="visible">True</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <child> + <object class="GtkHBox" id="hbox72"> + <property name="visible">True</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image_text"> + <property name="visible">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label198"> + <property name="visible">True</property> + <property name="label" translatable="yes">Send message</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <object class="GtkToolItem" id="toolitem9"> + <property name="visible">True</property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkVPaned" id="vpaned1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="border_width">2</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkNotebook" id="viewtabs"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="show_border">False</property> + <child> + <object class="GtkScrolledWindow" id="scrolledwindow3"> + <property name="height_request">100</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">automatic</property> + <property name="vscrollbar_policy">automatic</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkTreeView" id="hostlist"> + <property name="visible">True</property> + <property name="can_focus">True</property> + </object> + </child> + </object> + </child> + <child type="tab"> + <object class="GtkHBox" id="hbox44"> + <property name="visible">True</property> + <child> + <object class="GtkImage" id="image21"> + <property name="visible">True</property> + <property name="icon_name">gtk-justify-fill</property> + </object> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label146"> + <property name="visible">True</property> + <property name="label" translatable="yes">List view</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow" id="scrolledwindow6"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">automatic</property> + <property name="vscrollbar_policy">automatic</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkIconView" id="iconview"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="selection_mode">multiple</property> + <property name="reorderable">True</property> + </object> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child type="tab"> + <object class="GtkHBox" id="hbox45"> + <property name="visible">True</property> + <child> + <object class="GtkImage" id="image22"> + <property name="visible">True</property> + <property name="icon_name">gtk-select-color</property> + </object> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label147"> + <property name="visible">True</property> + <property name="label" translatable="yes">Icon view</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="position">1</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="GtkEventBox" id="classeventbox"> + <property name="visible">True</property> + <child> + <object class="GtkScrolledWindow" id="classviewscrolledwindow"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">automatic</property> + <property name="vscrollbar_policy">automatic</property> + <child> + <object class="GtkViewport" id="viewport1"> + <property name="visible">True</property> + <child> + <object class="GtkEventBox" id="classeventbox1"> + <property name="visible">True</property> + <child> + <object class="GtkFixed" id="classview"> + <property name="visible">True</property> + </object> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child type="tab"> + <object class="GtkHBox" id="hbox46"> + <property name="visible">True</property> + <child> + <object class="GtkImage" id="image23"> + <property name="visible">True</property> + <property name="stock">gtk-dnd-multiple</property> + </object> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label148"> + <property name="visible">True</property> + <property name="label" translatable="yes">Simulate my classroom</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="position">2</property> + <property name="tab_fill">False</property> + </packing> + </child> + </object> + <packing> + <property name="resize">True</property> + <property name="shrink">True</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow" id="scrolledtextview"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">automatic</property> + <property name="vscrollbar_policy">automatic</property> + <property name="shadow_type">in</property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="resize">True</property> + <property name="shrink">True</property> + </packing> + </child> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkStatusbar" id="statusbar"> + <property name="visible">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkTable" id="table4"> + <property name="visible">True</property> + <property name="n_columns">2</property> + <child> + <object class="GtkButton" id="progressbutton"> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <child> + <object class="GtkAlignment" id="alignment12"> + <property name="visible">True</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <child> + <object class="GtkHBox" id="hbox32"> + <property name="visible">True</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image12"> + <property name="visible">True</property> + <property name="stock">gtk-cancel</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label98"> + <property name="visible">True</property> + <property name="label" translatable="yes">Cancel</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkProgressBar" id="progressbar"> + <property name="pulse_step">0.10000000149</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="x_options">GTK_EXPAND | GTK_SHRINK | GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="GtkVBox" id="progressbox"> + <property name="orientation">vertical</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="position">5</property> + </packing> + </child> + </object> + </child> + </object> +</interface> diff --git a/ui/tcosmonitor-prefwindow.ui b/ui/tcosmonitor-prefwindow.ui new file mode 100644 index 0000000..83b0591 --- /dev/null +++ b/ui/tcosmonitor-prefwindow.ui @@ -0,0 +1,1647 @@ +<?xml version="1.0"?> +<interface> + <!-- interface-requires gtk+ 2.12 --> + <!-- interface-naming-policy toplevel-contextual --> + <object class="GtkAdjustment" id="adjustment1"> + <property name="value">1</property> + <property name="upper">100</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkAdjustment" id="adjustment2"> + <property name="value">1</property> + <property name="upper">100</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkAdjustment" id="adjustment3"> + <property name="value">65</property> + <property name="upper">100</property> + <property name="step_increment">5</property> + <property name="page_increment">10</property> + </object> + <object class="GtkAdjustment" id="adjustment4"> + <property name="value">20</property> + <property name="upper">100</property> + <property name="step_increment">1</property> + <property name="page_increment">5</property> + </object> + <object class="GtkAdjustment" id="adjustment5"> + <property name="upper">30</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkWindow" id="prefwindow"> + <property name="title" translatable="yes">Preferences</property> + <property name="resizable">False</property> + <property name="modal">True</property> + <property name="window_position">center</property> + <property name="destroy_with_parent">True</property> + <property name="type_hint">dialog</property> + <property name="urgency_hint">True</property> + <child> + <object class="GtkVBox" id="vbox9"> + <property name="visible">True</property> + <property name="border_width">10</property> + <property name="orientation">vertical</property> + <property name="spacing">10</property> + <child> + <object class="GtkNotebook" id="notebook1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkTable" id="table2"> + <property name="visible">True</property> + <property name="border_width">10</property> + <property name="n_rows">13</property> + <property name="n_columns">2</property> + <property name="column_spacing">10</property> + <property name="row_spacing">10</property> + <child> + <object class="GtkCheckButton" id="ck_showliststartup"> + <property name="label" translatable="yes">Show host list on startup</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="right_attach">2</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label71"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Scan network method</property> + </object> + <packing> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label72"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Network interface +(thin client)</property> + </object> + <packing> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkComboBoxEntry" id="combo_networkinterface"> + <property name="visible">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkComboBoxEntry" id="combo_scanmethod"> + <property name="visible">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_systemprocess"> + <property name="label" translatable="yes">Show system process</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="right_attach">2</property> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_blockactioninthishost"> + <property name="label" translatable="yes">Don't do actions when running TcosMonitor in thin client</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="right_attach">2</property> + <property name="top_attach">8</property> + <property name="bottom_attach">9</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label80"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">List of hosts</property> + </object> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkButton" id="button_open_static"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <child> + <object class="GtkAlignment" id="alignment2"> + <property name="visible">True</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <child> + <object class="GtkHBox" id="hbox19"> + <property name="visible">True</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image2"> + <property name="visible">True</property> + <property name="stock">gtk-edit</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label81"> + <property name="visible">True</property> + <property name="label" translatable="yes">Open static host list</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_onlyshowtcos"> + <property name="label" translatable="yes">Only show hosts running tcosxmlrpc (8998 port)</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="right_attach">2</property> + <property name="top_attach">10</property> + <property name="bottom_attach">11</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_selectedhosts"> + <property name="label" translatable="yes">Only do all actions on selected hosts (requires restart TcosMonitor)</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="right_attach">2</property> + <property name="top_attach">7</property> + <property name="bottom_attach">8</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_enable_sslxmlrpc"> + <property name="label" translatable="yes">Enable SSL connections to XMLRPC clients</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="right_attach">2</property> + <property name="top_attach">11</property> + <property name="bottom_attach">12</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label145"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Host list mode</property> + </object> + <packing> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkComboBoxEntry" id="combo_listmode"> + <property name="visible">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_menugroups"> + <property name="label" translatable="yes">Show right menu with groups (NEW)</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="right_attach">2</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_notshowwhentcosmonitor"> + <property name="label" translatable="yes">Don't show thin client if TcosMonitor is running there</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="right_attach">2</property> + <property name="top_attach">9</property> + <property name="bottom_attach">10</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_consolekit"> + <property name="label" translatable="yes">Enable ConsoleKit to search users and times (experimental)</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="right_attach">2</property> + <property name="top_attach">12</property> + <property name="bottom_attach">13</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + </object> + </child> + <child type="tab"> + <object class="GtkHBox" id="hbox39"> + <property name="visible">True</property> + <child> + <object class="GtkImage" id="image16"> + <property name="visible">True</property> + <property name="stock">gtk-execute</property> + </object> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label140"> + <property name="visible">True</property> + <property name="label" translatable="yes">Settings</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="GtkTable" id="table6"> + <property name="visible">True</property> + <property name="border_width">20</property> + <property name="n_rows">9</property> + <property name="n_columns">2</property> + <property name="column_spacing">10</property> + <property name="row_spacing">10</property> + <child> + <object class="GtkLabel" id="label126"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Update host list every (seg)</property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + <property name="x_padding">2</property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="spin_update"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Update host list every selected seconds. + +Value=0 disable update.</property> + <property name="adjustment">adjustment1</property> + <property name="climb_rate">1</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label129"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Cache timeout (seg)</property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="spin_cache_timeout"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Cache some data and connection status during selected seconds. + +Value=0 disable cache.</property> + <property name="adjustment">adjustment2</property> + <property name="climb_rate">1</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label130"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Screenshot size:</property> + </object> + <packing> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="spin_scrotsize"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">% Size of screnshot.</property> + <property name="adjustment">adjustment3</property> + <property name="climb_rate">5</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label131"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Mini screenshot size:</property> + </object> + <packing> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="spin_miniscrotsize"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">% Size of screnshot.</property> + <property name="adjustment">adjustment4</property> + <property name="climb_rate">1</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label134"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Timeout actions (seg)</property> + </object> + <packing> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="spin_actions_timeout"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Timeout in seg for actions + +Value=0 default</property> + <property name="adjustment">adjustment5</property> + <property name="climb_rate">1</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label135"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">SSH remote username</property> + </object> + <packing> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkEntry" id="ssh_remote_username"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="text">root</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label136"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">VLC method to send</property> + </object> + <packing> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkComboBoxEntry" id="vlc_method_send"> + <property name="visible">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label137"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><b>Experimental: Thread Controller</b> +( if you have problems, disable it )</property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="top_attach">8</property> + <property name="bottom_attach">9</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_threadscontrol"> + <property name="label" translatable="yes">Actions controlled</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">8</property> + <property name="bottom_attach">9</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label142"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Block ports: (80,8080... etc)</property> + </object> + <packing> + <property name="top_attach">7</property> + <property name="bottom_attach">8</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkEntry" id="ports_net_controller"> + <property name="visible">True</property> + <property name="can_focus">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">7</property> + <property name="bottom_attach">8</property> + <property name="y_options"></property> + </packing> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child type="tab"> + <object class="GtkHBox" id="hbox40"> + <property name="visible">True</property> + <child> + <object class="GtkImage" id="image17"> + <property name="visible">True</property> + <property name="icon_name">gtk-index</property> + </object> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label141"> + <property name="visible">True</property> + <property name="label" translatable="yes">Advanced</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="position">1</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="GtkTable" id="table3"> + <property name="visible">True</property> + <property name="border_width">10</property> + <property name="n_rows">3</property> + <property name="n_columns">2</property> + <property name="column_spacing">10</property> + <property name="row_spacing">10</property> + <child> + <object class="GtkLabel" id="label68"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">2</property> + <property name="label" translatable="yes">TcosXmlRpc username</property> + <property name="use_markup">True</property> + <property name="justify">right</property> + <property name="single_line_mode">True</property> + </object> + <packing> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkEntry" id="xmlrpc_username"> + <property name="visible">True</property> + <property name="can_focus">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label67"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">2</property> + <property name="label" translatable="yes">TcosXmlRpc password</property> + <property name="use_markup">True</property> + <property name="justify">right</property> + </object> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkEntry" id="xmlrpc_password"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="visibility">False</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label78"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><b>NOTE:</b> +Default user is <b>root</b> and default password is <b>root</b>. + +For <u>thin clients</u> change TCOS_ROOT_PASSWD or use TcosConfig and regenerate boot images again. + +For <u>standalone</u> users you can use a system account (root) but this is not recomended. Install tcos-standalone and start it by root. Set user and password, this will create a <b>/etc/tcospasswd</b> file only used by TCOS and your root acount will be secure.</property> + <property name="use_markup">True</property> + <property name="wrap">True</property> + </object> + <packing> + <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child type="tab"> + <object class="GtkHBox" id="hbox41"> + <property name="visible">True</property> + <child> + <object class="GtkImage" id="image18"> + <property name="visible">True</property> + <property name="icon_name">gtk-dialog-authentication</property> + </object> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label64"> + <property name="visible">True</property> + <property name="label" translatable="yes">Authentication </property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="position">2</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="GtkVBox" id="vbox10"> + <property name="visible">True</property> + <property name="border_width">10</property> + <property name="orientation">vertical</property> + <property name="spacing">10</property> + <child> + <object class="GtkLabel" id="label73"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Info avalaible from tcosxmlrpc</b></property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_tcosinfo"> + <property name="label" translatable="yes">Tcos general info</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_cpuinfo"> + <property name="label" translatable="yes">Cpu info</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_kernelmodulesinfo"> + <property name="label" translatable="yes">Kernel and modules info</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_pcibusinfo"> + <property name="label" translatable="yes">PCI bus info</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_ramswapinfo"> + <property name="label" translatable="yes">Ram and swap info</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_processinfo"> + <property name="label" translatable="yes">Process info</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_networkinfo"> + <property name="label" translatable="yes">Network info</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_xorginfo"> + <property name="label" translatable="yes">Xorg info</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_soundserverinfo"> + <property name="label" translatable="yes">Sound server info</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">9</property> + </packing> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">3</property> + </packing> + </child> + <child type="tab"> + <object class="GtkHBox" id="hbox42"> + <property name="visible">True</property> + <child> + <object class="GtkImage" id="image19"> + <property name="visible">True</property> + <property name="stock">gtk-dialog-question</property> + </object> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label70"> + <property name="visible">True</property> + <property name="label" translatable="yes">Avalaible info</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="position">3</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="GtkVBox" id="vbox22"> + <property name="visible">True</property> + <property name="border_width">10</property> + <property name="orientation">vertical</property> + <property name="spacing">10</property> + <child> + <object class="GtkLabel" id="label139"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Show / hide menu items</b></property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkTable" id="table7"> + <property name="visible">True</property> + <property name="n_rows">12</property> + <property name="n_columns">2</property> + <property name="row_spacing">5</property> + <property name="homogeneous">True</property> + <child> + <object class="GtkCheckButton" id="ck_menu_lock"> + <property name="label" translatable="yes">Lock and unlock screen</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_menu_shell"> + <property name="label" translatable="yes">Remote SSH shell</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_menu_xorg"> + <property name="label" translatable="yes">Configure Xorg settings</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkHSeparator" id="hseparator1"> + <property name="visible">True</property> + </object> + <packing> + <property name="right_attach">2</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + <property name="x_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_menu_exe"> + <property name="label" translatable="yes">Exe app on user display</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_menu_text"> + <property name="label" translatable="yes">Send a text message</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_menu_show"> + <property name="label" translatable="yes">Show running apps</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_menu_video"> + <property name="label" translatable="yes">Send video broadcast</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_menu_send"> + <property name="label" translatable="yes">Send files</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="top_attach">7</property> + <property name="bottom_attach">8</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_menu_demo"> + <property name="label" translatable="yes">Demo mode</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">7</property> + <property name="bottom_attach">8</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkHSeparator" id="hseparator2"> + <property name="visible">True</property> + </object> + <packing> + <property name="right_attach">2</property> + <property name="top_attach">8</property> + <property name="bottom_attach">9</property> + <property name="x_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_menu_wakeonlan"> + <property name="label" translatable="yes">Wake on LAN</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="top_attach">9</property> + <property name="bottom_attach">10</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_menu_conference"> + <property name="label" translatable="yes">Audio conference mode</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">9</property> + <property name="bottom_attach">10</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_menu_screenshots"> + <property name="label" translatable="yes">Screenshots</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_menu_reboot"> + <property name="label" translatable="yes">Reboot and poweroff</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_menu_net"> + <property name="label" translatable="yes">Lock and unlock internet</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="top_attach">10</property> + <property name="bottom_attach">11</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_menu_dpms"> + <property name="label" translatable="yes">DPMS monitor on/off</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">10</property> + <property name="bottom_attach">11</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_menu_vnc"> + <property name="label" translatable="yes">Connect using VNC</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_menu_italc"> + <property name="label" translatable="yes">Connect using iTALC</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="top_attach">11</property> + <property name="bottom_attach">12</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_menu_restartx"> + <property name="label" translatable="yes">Restart session with new settings</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_menu_personalize"> + <property name="label" translatable="yes">Configure this host</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_menu_livevnc"> + <property name="label" translatable="yes">Live view screens with VNC</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">11</property> + <property name="bottom_attach">12</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="position">4</property> + </packing> + </child> + <child type="tab"> + <object class="GtkHBox" id="hbox43"> + <property name="visible">True</property> + <child> + <object class="GtkImage" id="image20"> + <property name="visible">True</property> + <property name="stock">gtk-sort-descending</property> + </object> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label138"> + <property name="visible">True</property> + <property name="label" translatable="yes">Menus</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="position">4</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="GtkVBox" id="vbox34"> + <property name="visible">True</property> + <property name="border_width">10</property> + <property name="orientation">vertical</property> + <property name="spacing">10</property> + <child> + <object class="GtkLabel" id="label191"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Show / hide menu buttons</b></property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkTable" id="table8"> + <property name="visible">True</property> + <property name="n_rows">4</property> + <property name="n_columns">2</property> + <property name="column_spacing">30</property> + <property name="row_spacing">5</property> + <property name="homogeneous">True</property> + <child> + <object class="GtkCheckButton" id="ck_button_menu_exe"> + <property name="label" translatable="yes">Exe app on user display</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_button_menu_text"> + <property name="label" translatable="yes">Send a text message</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_button_menu_video"> + <property name="label" translatable="yes">Send video broadcast</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_button_menu_send"> + <property name="label" translatable="yes">Send files</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_button_menu_audio"> + <property name="label" translatable="yes">Audio conference</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_button_menu_chat"> + <property name="label" translatable="yes">Audio chat conference</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_button_menu_list"> + <property name="label" translatable="yes">Audio Chat control</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="position">5</property> + </packing> + </child> + <child type="tab"> + <object class="GtkHBox" id="hbox65"> + <property name="visible">True</property> + <child> + <object class="GtkImage" id="image38"> + <property name="visible">True</property> + <property name="stock">gtk-index</property> + </object> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label190"> + <property name="visible">True</property> + <property name="label" translatable="yes">Menu buttons</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="position">5</property> + <property name="tab_fill">False</property> + </packing> + </child> + </object> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkHBox" id="hbox17"> + <property name="visible">True</property> + <property name="spacing">10</property> + <child> + <object class="GtkButton" id="pref_cancel_button"> + <property name="label">gtk-cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="pref_ok_button"> + <property name="label">gtk-ok</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> +</interface> diff --git a/ui/tcosmonitor-staticwindow.ui b/ui/tcosmonitor-staticwindow.ui new file mode 100644 index 0000000..a3a5664 --- /dev/null +++ b/ui/tcosmonitor-staticwindow.ui @@ -0,0 +1,369 @@ +<?xml version="1.0"?> +<interface> + <!-- interface-requires gtk+ 2.12 --> + <!-- interface-naming-policy toplevel-contextual --> + <object class="GtkWindow" id="staticwindow"> + <property name="width_request">500</property> + <property name="height_request">300</property> + <property name="title" translatable="yes">Static hosts list</property> + <property name="window_position">center</property> + <child> + <object class="GtkVBox" id="vbox12"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkLabel" id="label82"> + <property name="visible">True</property> + <property name="label" translatable="yes"><span size="x-large">Static Hosts list</span></property> + <property name="use_markup">True</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkHBox" id="hbox21"> + <property name="visible">True</property> + <child> + <object class="GtkScrolledWindow" id="scrolledwindow4"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">automatic</property> + <property name="vscrollbar_policy">automatic</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkTreeView" id="staticlist"> + <property name="visible">True</property> + <property name="can_focus">True</property> + </object> + </child> + </object> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkVBox" id="vbox13"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkButton" id="button_static_add"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <child> + <object class="GtkAlignment" id="alignment3"> + <property name="visible">True</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <child> + <object class="GtkHBox" id="hbox22"> + <property name="visible">True</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image3"> + <property name="visible">True</property> + <property name="stock">gtk-add</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label83"> + <property name="visible">True</property> + <property name="label" translatable="yes">Add</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="button_static_modify"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <child> + <object class="GtkAlignment" id="alignment4"> + <property name="visible">True</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <child> + <object class="GtkHBox" id="hbox23"> + <property name="visible">True</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image4"> + <property name="visible">True</property> + <property name="stock">gtk-edit</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label84"> + <property name="visible">True</property> + <property name="label" translatable="yes">Modify</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="button_static_delete"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <child> + <object class="GtkAlignment" id="alignment5"> + <property name="visible">True</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <child> + <object class="GtkHBox" id="hbox24"> + <property name="visible">True</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image5"> + <property name="visible">True</property> + <property name="stock">gtk-remove</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label85"> + <property name="visible">True</property> + <property name="label" translatable="yes">Delete</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="button_static_get"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <child> + <object class="GtkAlignment" id="alignment6"> + <property name="visible">True</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <child> + <object class="GtkHBox" id="hbox25"> + <property name="visible">True</property> + <property name="border_width">2</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image6"> + <property name="visible">True</property> + <property name="stock">gtk-network</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label86"> + <property name="visible">True</property> + <property name="label" translatable="yes">Get from connected</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkHBox" id="hbox20"> + <property name="height_request">30</property> + <property name="visible">True</property> + <property name="homogeneous">True</property> + <child> + <placeholder/> + </child> + <child> + <object class="GtkButton" id="button_static_cancel"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <child> + <object class="GtkAlignment" id="alignment8"> + <property name="visible">True</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <child> + <object class="GtkHBox" id="hbox27"> + <property name="visible">True</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image8"> + <property name="visible">True</property> + <property name="stock">gtk-cancel</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label88"> + <property name="visible">True</property> + <property name="label" translatable="yes">Cancel</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="button_static_save"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <child> + <object class="GtkAlignment" id="alignment7"> + <property name="visible">True</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <child> + <object class="GtkHBox" id="hbox26"> + <property name="visible">True</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image7"> + <property name="visible">True</property> + <property name="stock">gtk-apply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label87"> + <property name="visible">True</property> + <property name="label" translatable="yes">Save</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="position">2</property> + </packing> + </child> + </object> + </child> + </object> +</interface> diff --git a/ui/tcosmonitor-staticwindownew.ui b/ui/tcosmonitor-staticwindownew.ui new file mode 100644 index 0000000..9f79a1a --- /dev/null +++ b/ui/tcosmonitor-staticwindownew.ui @@ -0,0 +1,227 @@ +<?xml version="1.0"?> +<interface> + <!-- interface-requires gtk+ 2.12 --> + <!-- interface-naming-policy toplevel-contextual --> + <object class="GtkWindow" id="staticwindownew"> + <property name="width_request">400</property> + <property name="height_request">250</property> + <property name="title" translatable="yes">New or edit hosts</property> + <property name="window_position">center</property> + <child> + <object class="GtkVBox" id="vbox14"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkLabel" id="label96"> + <property name="visible">True</property> + <property name="ypad">5</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkVBox" id="vbox15"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkLabel" id="label92"> + <property name="visible">True</property> + <property name="label" translatable="yes">You can add a simple host, + example: <b>192.168.0.100</b> + +or range of hosts, + example: <b>192.168.0.100-120</b> + +MAC address is optional</property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkTable" id="table5"> + <property name="visible">True</property> + <property name="border_width">10</property> + <property name="n_rows">2</property> + <property name="n_columns">2</property> + <child> + <object class="GtkLabel" id="label94"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">IP address *</property> + </object> + <packing> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label95"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">MAC address</property> + </object> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkEntry" id="static_new_ip"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">●</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkEntry" id="static_new_mac"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">●</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="y_options"></property> + </packing> + </child> + </object> + <packing> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkHBox" id="hbox28"> + <property name="visible">True</property> + <property name="spacing">10</property> + <property name="homogeneous">True</property> + <child> + <placeholder/> + </child> + <child> + <object class="GtkButton" id="button_static_line_cancel"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <child> + <object class="GtkAlignment" id="alignment10"> + <property name="visible">True</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <child> + <object class="GtkHBox" id="hbox30"> + <property name="visible">True</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image10"> + <property name="visible">True</property> + <property name="stock">gtk-cancel</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label91"> + <property name="visible">True</property> + <property name="label" translatable="yes">Cancel</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="button_static_line_save"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <child> + <object class="GtkAlignment" id="alignment9"> + <property name="visible">True</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <child> + <object class="GtkHBox" id="hbox29"> + <property name="visible">True</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image9"> + <property name="visible">True</property> + <property name="stock">gtk-apply</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label90"> + <property name="visible">True</property> + <property name="label" translatable="yes">Save</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="position">2</property> + </packing> + </child> + </object> + </child> + </object> +</interface> diff --git a/ui/tcospersonalize.ui b/ui/tcospersonalize.ui new file mode 100644 index 0000000..47e1ea0 --- /dev/null +++ b/ui/tcospersonalize.ui @@ -0,0 +1,610 @@ +<?xml version="1.0"?> +<interface> + <!-- interface-requires gtk+ 2.12 --> + <!-- interface-naming-policy toplevel-contextual --> + <object class="GtkWindow" id="mainwindow"> + <property name="visible">True</property> + <property name="title" translatable="yes">Preferences</property> + <property name="resizable">False</property> + <property name="window_position">center</property> + <property name="destroy_with_parent">True</property> + <property name="type_hint">dialog</property> + <property name="urgency_hint">True</property> + <child> + <object class="GtkVBox" id="vbox9"> + <property name="visible">True</property> + <property name="border_width">10</property> + <property name="orientation">vertical</property> + <property name="spacing">10</property> + <child> + <object class="GtkLabel" id="label74"> + <property name="visible">True</property> + <property name="label"><span size="x-large"><b>TcosPersonalize</b></span></property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label_host"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>unknow host</b></property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkNotebook" id="notebook1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkTable" id="table2"> + <property name="visible">True</property> + <property name="border_width">10</property> + <property name="n_rows">9</property> + <property name="n_columns">2</property> + <property name="column_spacing">10</property> + <property name="row_spacing">10</property> + <child> + <object class="GtkCheckButton" id="ck_xmousewheel"> + <property name="label" translatable="yes">Enable mouse wheel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="right_attach">2</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_xdontzap"> + <property name="label" translatable="yes">Disable Ctrl + Alt + Backspace (for kill Xorg)</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="right_attach">2</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label71"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Xorg Resolution</property> + </object> + <packing> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkComboBoxEntry" id="combo_xres"> + <property name="visible">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkComboBoxEntry" id="combo_xdriver"> + <property name="visible">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label76"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Xorg Color depth</property> + </object> + <packing> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkComboBoxEntry" id="combo_xdepth"> + <property name="visible">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label80"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">X Session Type</property> + </object> + <packing> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkComboBoxEntry" id="combo_xsession"> + <property name="visible">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="ck_xdpms"> + <property name="label" translatable="yes">DPMS energy monitor control</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="right_attach">2</property> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkHBox" id="hbox19"> + <property name="visible">True</property> + <child> + <object class="GtkLabel" id="label82"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Xorg Driver</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="getavalaible_button"> + <property name="label" translatable="yes">Get avalaible drivers</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + </child> + <child type="tab"> + <object class="GtkLabel" id="label63"> + <property name="visible">True</property> + <property name="label" translatable="yes">Display Settings</property> + </object> + <packing> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="GtkVBox" id="vbox11"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <placeholder/> + </child> + <child> + <object class="GtkTable" id="table4"> + <property name="visible">True</property> + <property name="border_width">10</property> + <property name="n_rows">2</property> + <property name="n_columns">2</property> + <property name="column_spacing">10</property> + <property name="row_spacing">10</property> + <child> + <object class="GtkLabel" id="label78"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">X Horiz sync</property> + </object> + <packing> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label79"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">X Vert sync</property> + </object> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkEntry" id="txt_xhorizsync"> + <property name="visible">True</property> + <property name="can_focus">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkEntry" id="txt_xvertsync"> + <property name="visible">True</property> + <property name="can_focus">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="y_options"></property> + </packing> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="label77"> + <property name="visible">True</property> + <property name="label" translatable="yes">Advanced</property> + </object> + <packing> + <property name="position">1</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="GtkTable" id="table5"> + <property name="visible">True</property> + <property name="n_rows">6</property> + <property name="n_columns">2</property> + <child> + <object class="GtkLabel" id="label84"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">15</property> + <property name="ypad">15</property> + <property name="label" translatable="yes">Default boot kernel</property> + </object> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkComboBoxEntry" id="combo_kernel"> + <property name="visible">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label85"> + <property name="visible">True</property> + <property name="ypad">10</property> + <property name="label" translatable="yes"><b>PXE Boot options</b></property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="right_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label86"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">15</property> + <property name="ypad">15</property> + <property name="label" translatable="yes">Default boot method</property> + </object> + <packing> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkComboBoxEntry" id="combo_method"> + <property name="visible">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label87"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">15</property> + <property name="ypad">15</property> + <property name="label" translatable="yes">Command line</property> + </object> + <packing> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkEntry" id="txt_cmdline"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">●</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <object class="GtkHBox" id="hbox20"> + <property name="visible">True</property> + <property name="spacing">10</property> + <child> + <placeholder/> + </child> + <child> + <object class="GtkButton" id="apply_button"> + <property name="label">gtk-apply</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <placeholder/> + </child> + <child> + <object class="GtkButton" id="delete_boot_button"> + <property name="label">gtk-delete</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + <property name="x_options"></property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="label83"> + <property name="visible">True</property> + <property name="label" translatable="yes">Boot options</property> + </object> + <packing> + <property name="position">2</property> + <property name="tab_fill">False</property> + </packing> + </child> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkHBox" id="hbox17"> + <property name="visible">True</property> + <property name="spacing">10</property> + <child> + <object class="GtkButton" id="delete_button"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <child> + <object class="GtkAlignment" id="alignment1"> + <property name="visible">True</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <child> + <object class="GtkHBox" id="hbox18"> + <property name="visible">True</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="stock">gtk-delete</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label81"> + <property name="visible">True</property> + <property name="label" translatable="yes">Delete Config</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cancel_button"> + <property name="label">gtk-cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="ok_button"> + <property name="label">gtk-ok</property> + <property name="width_request">90</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="pack_type">end</property> + <property name="position">3</property> + </packing> + </child> + </object> + </child> + </object> +</interface> diff --git a/ui/tray.ui b/ui/tray.ui new file mode 100644 index 0000000..562bd27 --- /dev/null +++ b/ui/tray.ui @@ -0,0 +1,106 @@ +<?xml version="1.0"?> +<interface> + <!-- interface-requires gtk+ 2.12 --> + <!-- interface-naming-policy toplevel-contextual --> + <object class="GtkWindow" id="popup"> + <property name="border_width">5</property> + <property name="type">popup</property> + <property name="icon_name">gtk-harddisk</property> + <child> + <object class="GtkVBox" id="vbox2"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkHBox" id="hbox1"> + <property name="visible">True</property> + <property name="spacing">30</property> + <child> + <object class="GtkLabel" id="title"> + <property name="visible">True</property> + <property name="label" translatable="yes"><big><b>TCOS devices</b></big></property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="hide_button"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <child> + <object class="GtkAlignment" id="alignment1"> + <property name="visible">True</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <child> + <object class="GtkHBox" id="hbox2"> + <property name="visible">True</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="stock">gtk-go-down</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="label" translatable="yes">Hide</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkHSeparator" id="hseparator1"> + <property name="visible">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkVBox" id="devbox"> + <property name="visible">True</property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + </object> + </child> + </object> +</interface> |