summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMario Izquierdo (mariodebian) <mariodebian@gmail.com>2012-06-22 12:33:28 +0100
committerMario Izquierdo (mariodebian) <mariodebian@gmail.com>2012-06-22 12:33:28 +0100
commit41070ffaa9adacc4ed450aeec9c0b61d4a9aa8eb (patch)
tree57011a8f797ee1a04d0eaaeec06791b19159b926
tcosmonitor (0.2.48) unstable; urgency=low
* Add French translation (closes: #678235) Thanks to Julien Patriarca <patriarcaj@gmail.com> # imported from the archive
-rw-r--r--AUTHORS18
-rw-r--r--COPYING340
-rw-r--r--INSTALL36
-rw-r--r--README41
-rw-r--r--README.server-utils62
-rw-r--r--README.standalone62
-rw-r--r--TODO9
-rw-r--r--conf/tcos.conf199
-rw-r--r--dbus/81tcos-utils30
-rw-r--r--dbus/Makefile16
-rwxr-xr-xdbus/client.py49
-rwxr-xr-xdbus/server.py63
-rwxr-xr-xdbus/tcos-dbus-client.py73
-rw-r--r--debian/changelog2357
-rw-r--r--debian/compat1
-rw-r--r--debian/control56
-rw-r--r--debian/copyright83
-rwxr-xr-xdebian/rules27
-rw-r--r--debian/source/format1
-rw-r--r--debian/tcosmonitor-common.dirs3
-rw-r--r--debian/tcosmonitor-common.docs5
-rw-r--r--debian/tcosmonitor-common.install17
-rw-r--r--debian/tcosmonitor-common.manpages1
-rw-r--r--debian/tcosmonitor.dirs4
-rw-r--r--debian/tcosmonitor.install33
-rw-r--r--debian/tcosmonitor.manpages5
-rw-r--r--images/active.pngbin0 -> 408 bytes
-rw-r--r--images/active_ssl.pngbin0 -> 594 bytes
-rw-r--r--images/button_all.pngbin0 -> 1154 bytes
-rw-r--r--images/button_audio.pngbin0 -> 1141 bytes
-rw-r--r--images/button_broadcast.pngbin0 -> 882 bytes
-rw-r--r--images/button_chat.pngbin0 -> 915 bytes
-rw-r--r--images/button_exe.pngbin0 -> 1030 bytes
-rw-r--r--images/button_exec.pngbin0 -> 1030 bytes
-rw-r--r--images/button_exit.pngbin0 -> 1274 bytes
-rw-r--r--images/button_list.pngbin0 -> 797 bytes
-rw-r--r--images/button_msg.pngbin0 -> 1192 bytes
-rw-r--r--images/button_pref.pngbin0 -> 1674 bytes
-rw-r--r--images/button_refresh.pngbin0 -> 1569 bytes
-rw-r--r--images/button_reload.pngbin0 -> 1058 bytes
-rw-r--r--images/button_rtp.pngbin0 -> 1141 bytes
-rw-r--r--images/button_search.pngbin0 -> 799 bytes
-rw-r--r--images/button_send.pngbin0 -> 946 bytes
-rw-r--r--images/button_text.pngbin0 -> 1192 bytes
-rw-r--r--images/button_video.pngbin0 -> 882 bytes
-rw-r--r--images/cdrom.pngbin0 -> 1189 bytes
-rw-r--r--images/cdrom_mount.pngbin0 -> 1243 bytes
-rw-r--r--images/cdrom_umount.pngbin0 -> 1251 bytes
-rw-r--r--images/client.pngbin0 -> 4859 bytes
-rw-r--r--images/client_no_logged.pngbin0 -> 5690 bytes
-rw-r--r--images/eject.pngbin0 -> 653 bytes
-rw-r--r--images/floppy1.pngbin0 -> 792 bytes
-rw-r--r--images/floppy2.pngbin0 -> 1136 bytes
-rw-r--r--images/floppy_mount.pngbin0 -> 770 bytes
-rw-r--r--images/floppy_umount.pngbin0 -> 453 bytes
-rw-r--r--images/hdd_mount.pngbin0 -> 1000 bytes
-rw-r--r--images/hdd_umount.pngbin0 -> 592 bytes
-rw-r--r--images/host_standalone.pngbin0 -> 6278 bytes
-rw-r--r--images/host_tcos.pngbin0 -> 5795 bytes
-rw-r--r--images/icon_alert.pngbin0 -> 1391 bytes
-rw-r--r--images/icon_mixer.pngbin0 -> 1116 bytes
-rw-r--r--images/idiomas.pngbin0 -> 6469 bytes
-rw-r--r--images/idiomas2.pngbin0 -> 5998 bytes
-rw-r--r--images/inactive.pngbin0 -> 646 bytes
-rw-r--r--images/info_cpu.pngbin0 -> 2753 bytes
-rw-r--r--images/info_kernel.pngbin0 -> 1680 bytes
-rw-r--r--images/info_net.pngbin0 -> 2038 bytes
-rw-r--r--images/info_pci.pngbin0 -> 1319 bytes
-rw-r--r--images/info_proc.pngbin0 -> 1282 bytes
-rw-r--r--images/info_ram.pngbin0 -> 1986 bytes
-rw-r--r--images/info_sound_ko.pngbin0 -> 1789 bytes
-rw-r--r--images/info_sound_ok.pngbin0 -> 2041 bytes
-rw-r--r--images/info_swap.pngbin0 -> 2081 bytes
-rw-r--r--images/info_xorg.pngbin0 -> 1758 bytes
-rw-r--r--images/locked.pngbin0 -> 732 bytes
-rw-r--r--images/locked_net.pngbin0 -> 534 bytes
-rw-r--r--images/locked_net_screen.pngbin0 -> 739 bytes
-rw-r--r--images/logged.pngbin0 -> 911 bytes
-rw-r--r--images/ltsp_logo.pngbin0 -> 1852 bytes
-rw-r--r--images/menu_broadcast.pngbin0 -> 943 bytes
-rw-r--r--images/menu_chat.pngbin0 -> 971 bytes
-rw-r--r--images/menu_clear.pngbin0 -> 773 bytes
-rw-r--r--images/menu_configure.pngbin0 -> 611 bytes
-rw-r--r--images/menu_dpms_off.pngbin0 -> 872 bytes
-rw-r--r--images/menu_dpms_on.pngbin0 -> 515 bytes
-rw-r--r--images/menu_exec.pngbin0 -> 874 bytes
-rw-r--r--images/menu_kill.pngbin0 -> 1272 bytes
-rw-r--r--images/menu_list.pngbin0 -> 803 bytes
-rw-r--r--images/menu_lock.pngbin0 -> 764 bytes
-rw-r--r--images/menu_locknet.pngbin0 -> 534 bytes
-rw-r--r--images/menu_msg.pngbin0 -> 763 bytes
-rw-r--r--images/menu_newconf.pngbin0 -> 950 bytes
-rw-r--r--images/menu_poweroff.pngbin0 -> 993 bytes
-rw-r--r--images/menu_proc.pngbin0 -> 826 bytes
-rw-r--r--images/menu_reboot.pngbin0 -> 1073 bytes
-rw-r--r--images/menu_refresh.pngbin0 -> 912 bytes
-rw-r--r--images/menu_remote.pngbin0 -> 699 bytes
-rw-r--r--images/menu_restartx.pngbin0 -> 650 bytes
-rw-r--r--images/menu_rtp.pngbin0 -> 936 bytes
-rw-r--r--images/menu_screenshot.pngbin0 -> 744 bytes
-rw-r--r--images/menu_send.pngbin0 -> 768 bytes
-rw-r--r--images/menu_tiza.pngbin0 -> 894 bytes
-rw-r--r--images/menu_unlock.pngbin0 -> 741 bytes
-rw-r--r--images/menu_unlocknet.pngbin0 -> 522 bytes
-rw-r--r--images/menu_wol.pngbin0 -> 871 bytes
-rw-r--r--images/menu_xterm.pngbin0 -> 668 bytes
-rw-r--r--images/multimedia.pngbin0 -> 911 bytes
-rw-r--r--images/no.pngbin0 -> 757 bytes
-rw-r--r--images/ok.pngbin0 -> 839 bytes
-rw-r--r--images/pendrive_mount.pngbin0 -> 1224 bytes
-rw-r--r--images/pendrive_umount.pngbin0 -> 747 bytes
-rw-r--r--images/share.pngbin0 -> 1283 bytes
-rw-r--r--images/standalone.pngbin0 -> 1771 bytes
-rw-r--r--images/tcos-devices-32x32.pngbin0 -> 2713 bytes
-rw-r--r--images/tcos-icon-32x32.pngbin0 -> 1671 bytes
-rw-r--r--images/tcos-icon.pngbin0 -> 27303 bytes
-rw-r--r--images/tcos-logo.pngbin0 -> 12971 bytes
-rw-r--r--images/tcos-volume-32x32.pngbin0 -> 2728 bytes
-rw-r--r--images/unlocked.pngbin0 -> 677 bytes
-rw-r--r--images/unlogged.pngbin0 -> 824 bytes
-rw-r--r--images/usb1.pngbin0 -> 1385 bytes
-rw-r--r--images/usb2.pngbin0 -> 1312 bytes
-rw-r--r--images/usb_mount.pngbin0 -> 1249 bytes
-rw-r--r--images/usb_umount.pngbin0 -> 682 bytes
-rw-r--r--man/tcos-dbus-client.142
-rw-r--r--man/tcos-devices-ng.173
-rw-r--r--man/tcos-server-utils.144
-rw-r--r--man/tcos-volume-manager.147
-rw-r--r--man/tcosmonitor.137
-rw-r--r--man/tcospersonalize.135
-rw-r--r--pixmaps/tcos-icon.pngbin0 -> 27303 bytes
-rw-r--r--po/FILES63
-rw-r--r--po/Makefile53
-rw-r--r--po/ca.po2902
-rw-r--r--po/ca@valencia.po2904
-rw-r--r--po/es.po3097
-rw-r--r--po/fr.po2858
-rw-r--r--po/gl.po3068
-rw-r--r--po/pt_BR.po2901
-rw-r--r--po/qcv.po2882
-rw-r--r--po/tcosmonitor.pot2613
-rw-r--r--pylint.rc318
-rwxr-xr-xserver-utils/tcos-server-utils.py196
-rwxr-xr-xsetup.py125
-rw-r--r--tcos-devices-ng.conf35
-rwxr-xr-xtcos-devices-ng.py1464
-rw-r--r--tcos-volume-manager.desktop9
-rwxr-xr-xtcos-volume-manager.py387
-rw-r--r--tcosmonitor.conf22
-rw-r--r--tcosmonitor.desktop14
-rw-r--r--tcosmonitor.py374
-rw-r--r--tcosmonitor/Avahi.py179
-rw-r--r--tcosmonitor/Initialize.py228
-rw-r--r--tcosmonitor/LocalData.py812
-rw-r--r--tcosmonitor/Sessions.py302
-rw-r--r--tcosmonitor/TcosActions.py459
-rw-r--r--tcosmonitor/TcosClassView.py489
-rw-r--r--tcosmonitor/TcosCommon.py342
-rw-r--r--tcosmonitor/TcosConf.py211
-rw-r--r--tcosmonitor/TcosDBus.py483
-rw-r--r--tcosmonitor/TcosExtensions.py401
-rw-r--r--tcosmonitor/TcosIconView.py226
-rw-r--r--tcosmonitor/TcosListView.py277
-rw-r--r--tcosmonitor/TcosMenus.py263
-rw-r--r--tcosmonitor/TcosMonitorDaemon.py32
-rw-r--r--tcosmonitor/TcosPAM.py62
-rw-r--r--tcosmonitor/TcosPreferences.py556
-rw-r--r--tcosmonitor/TcosStaticHosts.py281
-rw-r--r--tcosmonitor/TcosTrayIcon.py248
-rw-r--r--tcosmonitor/TcosTrayIcon2.py377
-rw-r--r--tcosmonitor/TcosXauth.py128
-rw-r--r--tcosmonitor/TcosXmlRpc.py928
-rw-r--r--tcosmonitor/WakeOnLan.py68
-rw-r--r--tcosmonitor/__init__.py54
-rw-r--r--tcosmonitor/counter.py51
-rw-r--r--tcosmonitor/extensions/Makefile15
-rw-r--r--tcosmonitor/extensions/__init__.py47
-rw-r--r--tcosmonitor/extensions/appsmsg.py373
-rw-r--r--tcosmonitor/extensions/audiortp.py542
-rw-r--r--tcosmonitor/extensions/clean.py58
-rw-r--r--tcosmonitor/extensions/dpms.py98
-rw-r--r--tcosmonitor/extensions/info.py616
-rw-r--r--tcosmonitor/extensions/italc.py88
-rw-r--r--tcosmonitor/extensions/livevnc.py220
-rw-r--r--tcosmonitor/extensions/lockscreen.py100
-rw-r--r--tcosmonitor/extensions/logout.py94
-rw-r--r--tcosmonitor/extensions/reboot.py120
-rw-r--r--tcosmonitor/extensions/remotessh.py57
-rw-r--r--tcosmonitor/extensions/restartxorg.py194
-rw-r--r--tcosmonitor/extensions/screenshot.py225
-rw-r--r--tcosmonitor/extensions/sendfiles.py275
-rw-r--r--tcosmonitor/extensions/tcosnetcontroller.py188
-rw-r--r--tcosmonitor/extensions/tcospersonalize.py61
-rw-r--r--tcosmonitor/extensions/videolan.py648
-rw-r--r--tcosmonitor/extensions/viewproc.py139
-rw-r--r--tcosmonitor/extensions/vnc.py513
-rw-r--r--tcosmonitor/extensions/wakeonlan.py100
-rw-r--r--tcosmonitor/ftps_server.py445
-rw-r--r--tcosmonitor/htmltextview.py865
-rw-r--r--tcosmonitor/ping.py467
-rw-r--r--tcosmonitor/shared.py830
-rw-r--r--tcospersonalize.desktop15
-rw-r--r--tcospersonalize.py571
-rw-r--r--ui/tcos-volume-manager.ui138
-rw-r--r--ui/tcosmonitor-abouttcos.ui433
-rw-r--r--ui/tcosmonitor-askwindow.ui124
-rw-r--r--ui/tcosmonitor-chatwindow.ui210
-rw-r--r--ui/tcosmonitor-mainwindow.ui825
-rw-r--r--ui/tcosmonitor-prefwindow.ui1647
-rw-r--r--ui/tcosmonitor-staticwindow.ui369
-rw-r--r--ui/tcosmonitor-staticwindownew.ui227
-rw-r--r--ui/tcospersonalize.ui610
-rw-r--r--ui/tray.ui106
213 files changed, 50264 insertions, 0 deletions
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..c0ad542
--- /dev/null
+++ b/AUTHORS
@@ -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
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..4ac225f
--- /dev/null
+++ b/COPYING
@@ -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.
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..a13cade
--- /dev/null
+++ b/INSTALL
@@ -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.
diff --git a/README b/README
new file mode 100644
index 0000000..24c581e
--- /dev/null
+++ b/README
@@ -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.
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..829f02c
--- /dev/null
+++ b/TODO
@@ -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 & => &amp;
+ * 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
new file mode 100644
index 0000000..271d37d
--- /dev/null
+++ b/images/active.png
Binary files differ
diff --git a/images/active_ssl.png b/images/active_ssl.png
new file mode 100644
index 0000000..ba4b5bc
--- /dev/null
+++ b/images/active_ssl.png
Binary files differ
diff --git a/images/button_all.png b/images/button_all.png
new file mode 100644
index 0000000..e40e803
--- /dev/null
+++ b/images/button_all.png
Binary files differ
diff --git a/images/button_audio.png b/images/button_audio.png
new file mode 100644
index 0000000..ef73875
--- /dev/null
+++ b/images/button_audio.png
Binary files differ
diff --git a/images/button_broadcast.png b/images/button_broadcast.png
new file mode 100644
index 0000000..a64c332
--- /dev/null
+++ b/images/button_broadcast.png
Binary files differ
diff --git a/images/button_chat.png b/images/button_chat.png
new file mode 100644
index 0000000..f50f472
--- /dev/null
+++ b/images/button_chat.png
Binary files differ
diff --git a/images/button_exe.png b/images/button_exe.png
new file mode 100644
index 0000000..6267435
--- /dev/null
+++ b/images/button_exe.png
Binary files differ
diff --git a/images/button_exec.png b/images/button_exec.png
new file mode 100644
index 0000000..6267435
--- /dev/null
+++ b/images/button_exec.png
Binary files differ
diff --git a/images/button_exit.png b/images/button_exit.png
new file mode 100644
index 0000000..780000a
--- /dev/null
+++ b/images/button_exit.png
Binary files differ
diff --git a/images/button_list.png b/images/button_list.png
new file mode 100644
index 0000000..a6c2619
--- /dev/null
+++ b/images/button_list.png
Binary files differ
diff --git a/images/button_msg.png b/images/button_msg.png
new file mode 100644
index 0000000..f5b898d
--- /dev/null
+++ b/images/button_msg.png
Binary files differ
diff --git a/images/button_pref.png b/images/button_pref.png
new file mode 100644
index 0000000..98e7054
--- /dev/null
+++ b/images/button_pref.png
Binary files differ
diff --git a/images/button_refresh.png b/images/button_refresh.png
new file mode 100644
index 0000000..d506587
--- /dev/null
+++ b/images/button_refresh.png
Binary files differ
diff --git a/images/button_reload.png b/images/button_reload.png
new file mode 100644
index 0000000..cb0d190
--- /dev/null
+++ b/images/button_reload.png
Binary files differ
diff --git a/images/button_rtp.png b/images/button_rtp.png
new file mode 100644
index 0000000..ef73875
--- /dev/null
+++ b/images/button_rtp.png
Binary files differ
diff --git a/images/button_search.png b/images/button_search.png
new file mode 100644
index 0000000..147bc82
--- /dev/null
+++ b/images/button_search.png
Binary files differ
diff --git a/images/button_send.png b/images/button_send.png
new file mode 100644
index 0000000..71fd26c
--- /dev/null
+++ b/images/button_send.png
Binary files differ
diff --git a/images/button_text.png b/images/button_text.png
new file mode 100644
index 0000000..f5b898d
--- /dev/null
+++ b/images/button_text.png
Binary files differ
diff --git a/images/button_video.png b/images/button_video.png
new file mode 100644
index 0000000..a64c332
--- /dev/null
+++ b/images/button_video.png
Binary files differ
diff --git a/images/cdrom.png b/images/cdrom.png
new file mode 100644
index 0000000..c4a3721
--- /dev/null
+++ b/images/cdrom.png
Binary files differ
diff --git a/images/cdrom_mount.png b/images/cdrom_mount.png
new file mode 100644
index 0000000..bee56a7
--- /dev/null
+++ b/images/cdrom_mount.png
Binary files differ
diff --git a/images/cdrom_umount.png b/images/cdrom_umount.png
new file mode 100644
index 0000000..6b35c15
--- /dev/null
+++ b/images/cdrom_umount.png
Binary files differ
diff --git a/images/client.png b/images/client.png
new file mode 100644
index 0000000..b46b09e
--- /dev/null
+++ b/images/client.png
Binary files differ
diff --git a/images/client_no_logged.png b/images/client_no_logged.png
new file mode 100644
index 0000000..4003da5
--- /dev/null
+++ b/images/client_no_logged.png
Binary files differ
diff --git a/images/eject.png b/images/eject.png
new file mode 100644
index 0000000..1f5e89d
--- /dev/null
+++ b/images/eject.png
Binary files differ
diff --git a/images/floppy1.png b/images/floppy1.png
new file mode 100644
index 0000000..ad03079
--- /dev/null
+++ b/images/floppy1.png
Binary files differ
diff --git a/images/floppy2.png b/images/floppy2.png
new file mode 100644
index 0000000..a892bba
--- /dev/null
+++ b/images/floppy2.png
Binary files differ
diff --git a/images/floppy_mount.png b/images/floppy_mount.png
new file mode 100644
index 0000000..ba04188
--- /dev/null
+++ b/images/floppy_mount.png
Binary files differ
diff --git a/images/floppy_umount.png b/images/floppy_umount.png
new file mode 100644
index 0000000..31fe22d
--- /dev/null
+++ b/images/floppy_umount.png
Binary files differ
diff --git a/images/hdd_mount.png b/images/hdd_mount.png
new file mode 100644
index 0000000..76bc01e
--- /dev/null
+++ b/images/hdd_mount.png
Binary files differ
diff --git a/images/hdd_umount.png b/images/hdd_umount.png
new file mode 100644
index 0000000..9500ee1
--- /dev/null
+++ b/images/hdd_umount.png
Binary files differ
diff --git a/images/host_standalone.png b/images/host_standalone.png
new file mode 100644
index 0000000..fa9f6fe
--- /dev/null
+++ b/images/host_standalone.png
Binary files differ
diff --git a/images/host_tcos.png b/images/host_tcos.png
new file mode 100644
index 0000000..bfdef6b
--- /dev/null
+++ b/images/host_tcos.png
Binary files differ
diff --git a/images/icon_alert.png b/images/icon_alert.png
new file mode 100644
index 0000000..7233d45
--- /dev/null
+++ b/images/icon_alert.png
Binary files differ
diff --git a/images/icon_mixer.png b/images/icon_mixer.png
new file mode 100644
index 0000000..0e68ace
--- /dev/null
+++ b/images/icon_mixer.png
Binary files differ
diff --git a/images/idiomas.png b/images/idiomas.png
new file mode 100644
index 0000000..59873ce
--- /dev/null
+++ b/images/idiomas.png
Binary files differ
diff --git a/images/idiomas2.png b/images/idiomas2.png
new file mode 100644
index 0000000..4cac2e5
--- /dev/null
+++ b/images/idiomas2.png
Binary files differ
diff --git a/images/inactive.png b/images/inactive.png
new file mode 100644
index 0000000..3f18ed0
--- /dev/null
+++ b/images/inactive.png
Binary files differ
diff --git a/images/info_cpu.png b/images/info_cpu.png
new file mode 100644
index 0000000..da4f71d
--- /dev/null
+++ b/images/info_cpu.png
Binary files differ
diff --git a/images/info_kernel.png b/images/info_kernel.png
new file mode 100644
index 0000000..bbd7cef
--- /dev/null
+++ b/images/info_kernel.png
Binary files differ
diff --git a/images/info_net.png b/images/info_net.png
new file mode 100644
index 0000000..934973e
--- /dev/null
+++ b/images/info_net.png
Binary files differ
diff --git a/images/info_pci.png b/images/info_pci.png
new file mode 100644
index 0000000..fbde5bd
--- /dev/null
+++ b/images/info_pci.png
Binary files differ
diff --git a/images/info_proc.png b/images/info_proc.png
new file mode 100644
index 0000000..c6068e3
--- /dev/null
+++ b/images/info_proc.png
Binary files differ
diff --git a/images/info_ram.png b/images/info_ram.png
new file mode 100644
index 0000000..3db3506
--- /dev/null
+++ b/images/info_ram.png
Binary files differ
diff --git a/images/info_sound_ko.png b/images/info_sound_ko.png
new file mode 100644
index 0000000..a602c85
--- /dev/null
+++ b/images/info_sound_ko.png
Binary files differ
diff --git a/images/info_sound_ok.png b/images/info_sound_ok.png
new file mode 100644
index 0000000..70ae43a
--- /dev/null
+++ b/images/info_sound_ok.png
Binary files differ
diff --git a/images/info_swap.png b/images/info_swap.png
new file mode 100644
index 0000000..6553907
--- /dev/null
+++ b/images/info_swap.png
Binary files differ
diff --git a/images/info_xorg.png b/images/info_xorg.png
new file mode 100644
index 0000000..e25a556
--- /dev/null
+++ b/images/info_xorg.png
Binary files differ
diff --git a/images/locked.png b/images/locked.png
new file mode 100644
index 0000000..9c6e264
--- /dev/null
+++ b/images/locked.png
Binary files differ
diff --git a/images/locked_net.png b/images/locked_net.png
new file mode 100644
index 0000000..ddfc96c
--- /dev/null
+++ b/images/locked_net.png
Binary files differ
diff --git a/images/locked_net_screen.png b/images/locked_net_screen.png
new file mode 100644
index 0000000..cdd10bc
--- /dev/null
+++ b/images/locked_net_screen.png
Binary files differ
diff --git a/images/logged.png b/images/logged.png
new file mode 100644
index 0000000..9d2d500
--- /dev/null
+++ b/images/logged.png
Binary files differ
diff --git a/images/ltsp_logo.png b/images/ltsp_logo.png
new file mode 100644
index 0000000..8b8e26c
--- /dev/null
+++ b/images/ltsp_logo.png
Binary files differ
diff --git a/images/menu_broadcast.png b/images/menu_broadcast.png
new file mode 100644
index 0000000..62fadfb
--- /dev/null
+++ b/images/menu_broadcast.png
Binary files differ
diff --git a/images/menu_chat.png b/images/menu_chat.png
new file mode 100644
index 0000000..8f8849c
--- /dev/null
+++ b/images/menu_chat.png
Binary files differ
diff --git a/images/menu_clear.png b/images/menu_clear.png
new file mode 100644
index 0000000..e6c8e8b
--- /dev/null
+++ b/images/menu_clear.png
Binary files differ
diff --git a/images/menu_configure.png b/images/menu_configure.png
new file mode 100644
index 0000000..9460dfc
--- /dev/null
+++ b/images/menu_configure.png
Binary files differ
diff --git a/images/menu_dpms_off.png b/images/menu_dpms_off.png
new file mode 100644
index 0000000..a3a32cb
--- /dev/null
+++ b/images/menu_dpms_off.png
Binary files differ
diff --git a/images/menu_dpms_on.png b/images/menu_dpms_on.png
new file mode 100644
index 0000000..b272892
--- /dev/null
+++ b/images/menu_dpms_on.png
Binary files differ
diff --git a/images/menu_exec.png b/images/menu_exec.png
new file mode 100644
index 0000000..07760c4
--- /dev/null
+++ b/images/menu_exec.png
Binary files differ
diff --git a/images/menu_kill.png b/images/menu_kill.png
new file mode 100644
index 0000000..b68290b
--- /dev/null
+++ b/images/menu_kill.png
Binary files differ
diff --git a/images/menu_list.png b/images/menu_list.png
new file mode 100644
index 0000000..ba9a630
--- /dev/null
+++ b/images/menu_list.png
Binary files differ
diff --git a/images/menu_lock.png b/images/menu_lock.png
new file mode 100644
index 0000000..f7ea0cd
--- /dev/null
+++ b/images/menu_lock.png
Binary files differ
diff --git a/images/menu_locknet.png b/images/menu_locknet.png
new file mode 100644
index 0000000..ddfc96c
--- /dev/null
+++ b/images/menu_locknet.png
Binary files differ
diff --git a/images/menu_msg.png b/images/menu_msg.png
new file mode 100644
index 0000000..ec70e04
--- /dev/null
+++ b/images/menu_msg.png
Binary files differ
diff --git a/images/menu_newconf.png b/images/menu_newconf.png
new file mode 100644
index 0000000..01bc566
--- /dev/null
+++ b/images/menu_newconf.png
Binary files differ
diff --git a/images/menu_poweroff.png b/images/menu_poweroff.png
new file mode 100644
index 0000000..07c1794
--- /dev/null
+++ b/images/menu_poweroff.png
Binary files differ
diff --git a/images/menu_proc.png b/images/menu_proc.png
new file mode 100644
index 0000000..58d8329
--- /dev/null
+++ b/images/menu_proc.png
Binary files differ
diff --git a/images/menu_reboot.png b/images/menu_reboot.png
new file mode 100644
index 0000000..bc9ae66
--- /dev/null
+++ b/images/menu_reboot.png
Binary files differ
diff --git a/images/menu_refresh.png b/images/menu_refresh.png
new file mode 100644
index 0000000..3fd71d6
--- /dev/null
+++ b/images/menu_refresh.png
Binary files differ
diff --git a/images/menu_remote.png b/images/menu_remote.png
new file mode 100644
index 0000000..a6447fb
--- /dev/null
+++ b/images/menu_remote.png
Binary files differ
diff --git a/images/menu_restartx.png b/images/menu_restartx.png
new file mode 100644
index 0000000..34fe6a9
--- /dev/null
+++ b/images/menu_restartx.png
Binary files differ
diff --git a/images/menu_rtp.png b/images/menu_rtp.png
new file mode 100644
index 0000000..95a9a4a
--- /dev/null
+++ b/images/menu_rtp.png
Binary files differ
diff --git a/images/menu_screenshot.png b/images/menu_screenshot.png
new file mode 100644
index 0000000..ab87f63
--- /dev/null
+++ b/images/menu_screenshot.png
Binary files differ
diff --git a/images/menu_send.png b/images/menu_send.png
new file mode 100644
index 0000000..71b3d52
--- /dev/null
+++ b/images/menu_send.png
Binary files differ
diff --git a/images/menu_tiza.png b/images/menu_tiza.png
new file mode 100644
index 0000000..9ba3f9b
--- /dev/null
+++ b/images/menu_tiza.png
Binary files differ
diff --git a/images/menu_unlock.png b/images/menu_unlock.png
new file mode 100644
index 0000000..d046300
--- /dev/null
+++ b/images/menu_unlock.png
Binary files differ
diff --git a/images/menu_unlocknet.png b/images/menu_unlocknet.png
new file mode 100644
index 0000000..0c0ebd3
--- /dev/null
+++ b/images/menu_unlocknet.png
Binary files differ
diff --git a/images/menu_wol.png b/images/menu_wol.png
new file mode 100644
index 0000000..27f2ab5
--- /dev/null
+++ b/images/menu_wol.png
Binary files differ
diff --git a/images/menu_xterm.png b/images/menu_xterm.png
new file mode 100644
index 0000000..c5b797a
--- /dev/null
+++ b/images/menu_xterm.png
Binary files differ
diff --git a/images/multimedia.png b/images/multimedia.png
new file mode 100644
index 0000000..ef64896
--- /dev/null
+++ b/images/multimedia.png
Binary files differ
diff --git a/images/no.png b/images/no.png
new file mode 100644
index 0000000..9bb8a09
--- /dev/null
+++ b/images/no.png
Binary files differ
diff --git a/images/ok.png b/images/ok.png
new file mode 100644
index 0000000..4915ea5
--- /dev/null
+++ b/images/ok.png
Binary files differ
diff --git a/images/pendrive_mount.png b/images/pendrive_mount.png
new file mode 100644
index 0000000..1fa0367
--- /dev/null
+++ b/images/pendrive_mount.png
Binary files differ
diff --git a/images/pendrive_umount.png b/images/pendrive_umount.png
new file mode 100644
index 0000000..395f5e9
--- /dev/null
+++ b/images/pendrive_umount.png
Binary files differ
diff --git a/images/share.png b/images/share.png
new file mode 100644
index 0000000..043cc69
--- /dev/null
+++ b/images/share.png
Binary files differ
diff --git a/images/standalone.png b/images/standalone.png
new file mode 100644
index 0000000..975cf35
--- /dev/null
+++ b/images/standalone.png
Binary files differ
diff --git a/images/tcos-devices-32x32.png b/images/tcos-devices-32x32.png
new file mode 100644
index 0000000..cef0e86
--- /dev/null
+++ b/images/tcos-devices-32x32.png
Binary files differ
diff --git a/images/tcos-icon-32x32.png b/images/tcos-icon-32x32.png
new file mode 100644
index 0000000..907035b
--- /dev/null
+++ b/images/tcos-icon-32x32.png
Binary files differ
diff --git a/images/tcos-icon.png b/images/tcos-icon.png
new file mode 100644
index 0000000..6ce6c60
--- /dev/null
+++ b/images/tcos-icon.png
Binary files differ
diff --git a/images/tcos-logo.png b/images/tcos-logo.png
new file mode 100644
index 0000000..f88e029
--- /dev/null
+++ b/images/tcos-logo.png
Binary files differ
diff --git a/images/tcos-volume-32x32.png b/images/tcos-volume-32x32.png
new file mode 100644
index 0000000..9bfcda8
--- /dev/null
+++ b/images/tcos-volume-32x32.png
Binary files differ
diff --git a/images/unlocked.png b/images/unlocked.png
new file mode 100644
index 0000000..a98652c
--- /dev/null
+++ b/images/unlocked.png
Binary files differ
diff --git a/images/unlogged.png b/images/unlogged.png
new file mode 100644
index 0000000..9a824cf
--- /dev/null
+++ b/images/unlogged.png
Binary files differ
diff --git a/images/usb1.png b/images/usb1.png
new file mode 100644
index 0000000..78b856c
--- /dev/null
+++ b/images/usb1.png
Binary files differ
diff --git a/images/usb2.png b/images/usb2.png
new file mode 100644
index 0000000..61ea434
--- /dev/null
+++ b/images/usb2.png
Binary files differ
diff --git a/images/usb_mount.png b/images/usb_mount.png
new file mode 100644
index 0000000..faf69e3
--- /dev/null
+++ b/images/usb_mount.png
Binary files differ
diff --git a/images/usb_umount.png b/images/usb_umount.png
new file mode 100644
index 0000000..375811d
--- /dev/null
+++ b/images/usb_umount.png
Binary files differ
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
new file mode 100644
index 0000000..6ce6c60
--- /dev/null
+++ b/pixmaps/tcos-icon.png
Binary files differ
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__= {
+ '\"' : '&quot;',
+ '\'' : '&apos;'
+ }
+
+
+ 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('<','&lt;').replace('>','&gt;')
+ name=name.replace('&','&amp;')
+
+ 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('<', '&lt;').replace('>','&gt,')
+ 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&apos;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%'>
+ &quot;A foolish consistency is the hobgoblin of little minds.&quot;
+ </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">&lt;span size="xx-large"&gt;TcosMonitor&lt;/span&gt;</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">&lt;b&gt;Version:&lt;/b&gt;</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 &lt;mariodebian at gmail.com&gt;
+ * Ignacio Vidal &lt;vidal_joshur at gva.es&gt;
+
+Contributors:
+ * Andr&#xE9;s Jimenez
+ * Quir&#xF3;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 &lt;mariodebian@gmail.com&gt;</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">&lt;u&gt;http://wiki.tcosproject.org/TcosProject:Site_support&lt;/u&gt;</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">&lt;b&gt;Run app in unknow host&lt;/b&gt;</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">&lt;span size="x-large"&gt;Chat emission list&lt;/span&gt;</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">&#x25CF;</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">&lt;b&gt;Experimental: Thread Controller&lt;/b&gt;
+( 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">&lt;b&gt;NOTE:&lt;/b&gt;
+Default user is &lt;b&gt;root&lt;/b&gt; and default password is &lt;b&gt;root&lt;/b&gt;.
+
+For &lt;u&gt;thin clients&lt;/u&gt; change TCOS_ROOT_PASSWD or use TcosConfig and regenerate boot images again.
+
+For &lt;u&gt;standalone&lt;/u&gt; 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 &lt;b&gt;/etc/tcospasswd&lt;/b&gt; 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">&lt;b&gt;Info avalaible from tcosxmlrpc&lt;/b&gt;</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">&lt;b&gt;Show / hide menu items&lt;/b&gt;</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">&lt;b&gt;Show / hide menu buttons&lt;/b&gt;</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">&lt;span size="x-large"&gt;Static Hosts list&lt;/span&gt;</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: &lt;b&gt;192.168.0.100&lt;/b&gt;
+
+or range of hosts,
+ example: &lt;b&gt;192.168.0.100-120&lt;/b&gt;
+
+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">&#x25CF;</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">&#x25CF;</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">&lt;span size="x-large"&gt;&lt;b&gt;TcosPersonalize&lt;/b&gt;&lt;/span&gt;</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">&lt;b&gt;unknow host&lt;/b&gt;</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">&lt;b&gt;PXE Boot options&lt;/b&gt;</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">&#x25CF;</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">&lt;big&gt;&lt;b&gt;TCOS devices&lt;/b&gt;&lt;/big&gt;</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>